More value heuristics
More value heuristics

--- /dev/null
+++ b/admin/UNSPSC_ECCMA_V13.2_UNDP_V7.csv
@@ -1,1 +1,20795 @@
+"Cp1252",,,
+"Domain","UniqueName","Name",
+"unspsc","All","All commodities",
+"unspsc",10000000,"Live Plant and Animal Material and Accessories and Supplies",
+"unspsc",10100000,"Live animals",
+"unspsc",10101500,"Livestock",
+"unspsc",10101501,"Cats",
+"unspsc",10101502,"Dogs",
+"unspsc",10101504,"Mink",
+"unspsc",10101505,"Rats",
+"unspsc",10101506,"Horses",
+"unspsc",10101507,"Sheep",
+"unspsc",10101508,"Goats",
+"unspsc",10101509,"Asses",
+"unspsc",10101510,"Mice",
+"unspsc",10101511,"Swine",
+"unspsc",10101512,"Rabbits",
+"unspsc",10101513,"Guinea pigs",
+"unspsc",10101514,"Primates",
+"unspsc",10101515,"Armadillos",
+"unspsc",10101516,"Cattle",
+"unspsc",10101517,"Camels",
+"unspsc",10101600,"Birds and fowl",
+"unspsc",10101601,"Live chickens",
+"unspsc",10101602,"Live ducks",
+"unspsc",10101603,"Live turkeys",
+"unspsc",10101604,"Live geese",
+"unspsc",10101605,"Live pheasants",
+"unspsc",10101700,"Live fish",
+"unspsc",10101701,"Live salmon",
+"unspsc",10101702,"Live trout",
+"unspsc",10101703,"Live talapia",
+"unspsc",10101704,"Live carp",
+"unspsc",10101705,"Live eels",
+"unspsc",10101800,"Shellfish and aquatic invertebrates",
+"unspsc",10101801,"Live shrimp",
+"unspsc",10101802,"Live clams",
+"unspsc",10101803,"Live mussels",
+"unspsc",10101804,"Live oysters",
+"unspsc",10101805,"Live crabs",
+"unspsc",10101806,"Live abalone",
+"unspsc",10101807,"Live octopi",
+"unspsc",10101808,"Live squid",
+"unspsc",10101900,"Insects",
+"unspsc",10101901,"Butterflies",
+"unspsc",10101902,"Beetles",
+"unspsc",10101903,"Bees",
+"unspsc",10101904,"Silkworms",
+"unspsc",10102000,"Wild animals",
+"unspsc",10102001,"Elephants",
+"unspsc",10102002,"Live foxes",
+"unspsc",10110000,"Domestic pet products",
+"unspsc",10111300,"Domestic pet treatments and accessories and equipment",
+"unspsc",10111301,"Pet toys",
+"unspsc",10111302,"Pet grooming products",
+"unspsc",10111303,"Pet litter or equipment for pet waste management",
+"unspsc",10111304,"Pet food bowls or equipment",
+"unspsc",10111305,"Medicated pet treatments",
+"unspsc",10111306,"Domestic pet training kits",
+"unspsc",10111307,"Pet blankets",
+"unspsc",10120000,"Animal feed",
+"unspsc",10121500,"Livestock feed",
+"unspsc",10121501,"Pure wheat bran",
+"unspsc",10121502,"Feed oats",
+"unspsc",10121503,"Feed corn",
+"unspsc",10121504,"Feed sorghum",
+"unspsc",10121505,"Hay",
+"unspsc",10121506,"Oil cake",
+"unspsc",10121600,"Bird and fowl food",
+"unspsc",10121601,"Live food for birds",
+"unspsc",10121602,"Bird seed",
+"unspsc",10121603,"Bird treats or snacks",
+"unspsc",10121604,"Poultry food",
+"unspsc",10121700,"Fish food",
+"unspsc",10121701,"Fresh or frozen brine",
+"unspsc",10121702,"Fish food pellets",
+"unspsc",10121703,"Fish food flakes",
+"unspsc",10121800,"Dog and cat food",
+"unspsc",10121801,"Dry food for dogs",
+"unspsc",10121802,"Moist food for dogs",
+"unspsc",10121803,"Milk for dogs or cats",
+"unspsc",10121804,"Dry food for cats",
+"unspsc",10121805,"Moist food for cats",
+"unspsc",10121806,"Treats or snacks for cats or dogs",
+"unspsc",10121900,"Rodent food",
+"unspsc",10121901,"Pelletized food for rodents",
+"unspsc",10122000,"Reptile food",
+"unspsc",10122001,"Pelletized food for reptiles",
+"unspsc",10122002,"Moist food for reptiles",
+"unspsc",10122003,"Live food for reptiles",
+"unspsc",10122100,"Miscellaneous animal food",
+"unspsc",10122101,"Pig food",
+"unspsc",10122102,"Mink food",
+"unspsc",10122103,"Monkey food",
+"unspsc",10130000,"Animal containment and habitats",
+"unspsc",10131500,"Animal shelters",
+"unspsc",10131506,"Livestock stables",
+"unspsc",10131507,"Domesticized pet houses",
+"unspsc",10131508,"Pet beds",
+"unspsc",10131600,"Animal containment",
+"unspsc",10131601,"Cages or its accessories",
+"unspsc",10131602,"Kennels",
+"unspsc",10131603,"Animal carrying cases",
+"unspsc",10131604,"Dog runs",
+"unspsc",10131700,"Animal habitats",
+"unspsc",10131701,"Terrariums",
+"unspsc",10131702,"Aquariums",
+"unspsc",10140000,"Saddlery and harness goods",
+"unspsc",10141500,"Saddlery",
+"unspsc",10141501,"Saddles",
+"unspsc",10141502,"Whips",
+"unspsc",10141503,"Horseshoes",
+"unspsc",10141504,"Muleshoes",
+"unspsc",10141600,"Harness goods",
+"unspsc",10141601,"Bridles",
+"unspsc",10141602,"Yokes",
+"unspsc",10141603,"Horse bits",
+"unspsc",10141604,"Reins",
+"unspsc",10141605,"Stirrups",
+"unspsc",10141606,"Leashes or leads",
+"unspsc",10141607,"Animal collars",
+"unspsc",10141608,"Harnesses or its accessories",
+"unspsc",10141609,"Restraints",
+"unspsc",10141610,"Muzzles",
+"unspsc",10141611,"Leash holders",
+"unspsc",10150000,"Seeds and bulbs and seedlings and cuttings",
+"unspsc",10151500,"Vegetable seeds and seedlings",
+"unspsc",10151501,"Bean seeds or seedlings",
+"unspsc",10151502,"Carrot seeds or seedlings",
+"unspsc",10151503,"Celery seeds or seedlings",
+"unspsc",10151504,"Chili seeds or seedlings",
+"unspsc",10151505,"Courgette seeds or seedlings",
+"unspsc",10151506,"Pea seeds or seedlings",
+"unspsc",10151507,"Cucumber seeds or seedlings",
+"unspsc",10151508,"Eggplant seeds or seedlings",
+"unspsc",10151509,"Endive seeds or seedlings",
+"unspsc",10151510,"Garlic seeds or seedlings",
+"unspsc",10151511,"Leek seeds or seedlings",
+"unspsc",10151512,"Lettuce seeds or seedlings",
+"unspsc",10151513,"Corn seeds or seedlings",
+"unspsc",10151514,"Melon seeds or seedlings",
+"unspsc",10151515,"Onion seeds or seedlings",
+"unspsc",10151516,"Soya seeds or seedlings",
+"unspsc",10151517,"Spinach seeds or seedlings",
+"unspsc",10151518,"Tomato seeds or seedlings",
+"unspsc",10151519,"Turnip seeds or seedlings",
+"unspsc",10151520,"Chard seeds or seedlings",
+"unspsc",10151521,"Sweet pepper seeds or seedlings",
+"unspsc",10151522,"Beet seeds or seedlings",
+"unspsc",10151523,"Cauliflower seeds or seedlings",
+"unspsc",10151524,"Parsley seeds or seedlings",
+"unspsc",10151525,"Broccoli seeds or seedlings",
+"unspsc",10151526,"Cabbage seeds or seedlings",
+"unspsc",10151527,"Potato seeds or seedlings",
+"unspsc",10151528,"Sweet potato seeds or seedlings",
+"unspsc",10151529,"Pumpkin seeds or seedlings",
+"unspsc",10151530,"Radish seeds or seedlings",
+"unspsc",10151531,"Brussel sprout seeds or seedlings",
+"unspsc",10151532,"Squash seeds or seedlings",
+"unspsc",10151533,"Okra seeds or seedlings",
+"unspsc",10151534,"Cantaloupe seeds or seedlings",
+"unspsc",10151535,"Peanut seeds or seedlings",
+"unspsc",10151600,"Cereal seeds",
+"unspsc",10151601,"Wheat seeds",
+"unspsc",10151602,"Colza seeds",
+"unspsc",10151603,"Barley seeds",
+"unspsc",10151604,"Millet seeds",
+"unspsc",10151605,"Oat seeds",
+"unspsc",10151606,"Sesame seeds",
+"unspsc",10151607,"Linseed seeds",
+"unspsc",10151608,"Castor oil seeds",
+"unspsc",10151609,"Maize seeds",
+"unspsc",10151610,"Rye seeds",
+"unspsc",10151611,"Sorghum seeds",
+"unspsc",10151700,"Grass and forage seeds and seedlings",
+"unspsc",10151701,"Rice seeds or seedlings",
+"unspsc",10151702,"Clover seeds or seedling",
+"unspsc",10151703,"Alfalfa seeds or seedlings",
+"unspsc",10151704,"Grass seeds or seedlings",
+"unspsc",10151705,"Crown vetch seeds or seedlings",
+"unspsc",10151706,"Guar seeds or seedlings",
+"unspsc",10151800,"Spice crop seeds and seedlings",
+"unspsc",10151801,"Pepper seeds or seedlings",
+"unspsc",10151802,"Vanilla seeds or seedlings",
+"unspsc",10151803,"Cinnamon seeds or seedlings",
+"unspsc",10151804,"Clove seeds or seedlings",
+"unspsc",10151805,"Coriander seeds or seedlings",
+"unspsc",10151806,"Ginger seeds or seedlings",
+"unspsc",10151807,"Saffron seeds or seedlings",
+"unspsc",10151808,"Thyme seeds or seedlings",
+"unspsc",10151809,"Curry seeds or seedlings",
+"unspsc",10151810,"Mustard seeds or seedlings",
+"unspsc",10151811,"Ginseng roots or seedlings",
+"unspsc",10151900,"Flower seeds and bulbs and seedlings and cuttings",
+"unspsc",10151901,"Tulip seeds or bulbs or seedlings or cuttings",
+"unspsc",10151902,"Rose seeds or seedlings or cuttings",
+"unspsc",10151903,"Daffodil seeds or bulbs or seedlings or cuttings",
+"unspsc",10151904,"Sunflower seeds",
+"unspsc",10151905,"Hyacinth bulbs or shoots",
+"unspsc",10151906,"Lily Bulbs",
+"unspsc",10151907,"Vetch seeds or seedlings",
+"unspsc",10152000,"Tree and shrub seeds and cuttings",
+"unspsc",10152001,"Fruit tree seeds or cuttings",
+"unspsc",10152002,"Conifer tree seeds or cuttings",
+"unspsc",10152003,"Nut tree seeds or cuttings",
+"unspsc",10152100,"Residues other than animal feed",
+"unspsc",10152101,"Residues babool seed extraction",
+"unspsc",10152102,"Residues of rape seeds",
+"unspsc",10152103,"Residue of linseed",
+"unspsc",10152104,"Oil cake of neem",
+"unspsc",10152200,"Fibrous crop seeds and seedlings",
+"unspsc",10152201,"Cotton seeds or seedlings",
+"unspsc",10152202,"Flax seeds or seedlings",
+"unspsc",10160000,"Floriculture and silviculture products",
+"unspsc",10161500,"Trees and shrubs",
+"unspsc",10161501,"Olive trees",
+"unspsc",10161502,"Coffee shrubs",
+"unspsc",10161503,"Cocoa trees",
+"unspsc",10161504,"Apple trees",
+"unspsc",10161505,"Peach trees",
+"unspsc",10161506,"Orange trees",
+"unspsc",10161507,"Rhododendron shrubs",
+"unspsc",10161508,"Tea shrubs",
+"unspsc",10161509,"Conifer trees",
+"unspsc",10161510,"Spruce trees",
+"unspsc",10161511,"Pine trees",
+"unspsc",10161512,"Fir trees",
+"unspsc",10161513,"Palm trees",
+"unspsc",10161600,"Floral plants",
+"unspsc",10161601,"Rose plants",
+"unspsc",10161602,"Poinsettias plants",
+"unspsc",10161603,"Orchids plants",
+"unspsc",10161604,"Azaleas plants",
+"unspsc",10161605,"Cactus plants",
+"unspsc",10161700,"Cut flowers",
+"unspsc",10161701,"Cut gladiolus",
+"unspsc",10161702,"Cut lilies",
+"unspsc",10161703,"Cut carnations",
+"unspsc",10161704,"Cut tulips",
+"unspsc",10161705,"Cut roses",
+"unspsc",10161707,"Cut flower arrangement",
+"unspsc",10161800,"Non flowering plants",
+"unspsc",10161801,"Ferns",
+"unspsc",10161802,"Ivies",
+"unspsc",10161803,"Philodendrons",
+"unspsc",10161804,"Lichens",
+"unspsc",10161900,"Dried floral products",
+"unspsc",10161901,"Dried pods",
+"unspsc",10161902,"Dried leafy greenery",
+"unspsc",10161903,"Dried fern greenery",
+"unspsc",10161904,"Dried full flowers",
+"unspsc",10161905,"Dried twigs or sticks",
+"unspsc",10161906,"Dried grass plumes",
+"unspsc",10161907,"Dried pressed flowers",
+"unspsc",10161908,"Dried flower petals",
+"unspsc",10170000,"Fertilizers and plant nutrients and herbicides",
+"unspsc",10171500,"Organic fertilizers and plant nutrients",
+"unspsc",10171501,"Manure or guano",
+"unspsc",10171502,"Plant hormones",
+"unspsc",10171503,"Fish meal",
+"unspsc",10171504,"Compost",
+"unspsc",10171600,"Chemical fertilizers and plant nutrients",
+"unspsc",10171601,"Nitrogenous fertilizer",
+"unspsc",10171602,"Potassic fertilizer",
+"unspsc",10171603,"Phosphatic fertilizer",
+"unspsc",10171604,"Sulphuric fertilizer",
+"unspsc",10171605,"Nitrogen Phosphorous Potassium Mixtures NPK",
+"unspsc",10171700,"Herbicides",
+"unspsc",10171701,"Weed killer",
+"unspsc",10171702,"Fungicides",
+"unspsc",10190000,"Pest control products",
+"unspsc",10191500,"Pesticides or pest repellents",
+"unspsc",10191506,"Rodenticides",
+"unspsc",10191507,"Bird repellents",
+"unspsc",10191508,"Termite shields",
+"unspsc",10191509,"Insecticides",
+"unspsc",10191700,"Pest control devices",
+"unspsc",10191701,"Animal control traps",
+"unspsc",10191703,"Flying insect control traps",
+"unspsc",10191704,"Fly swatters",
+"unspsc",10191705,"Lariats",
+"unspsc",10191706,"Leghold traps",
+"unspsc",11000000,"Mineral and Textile and Inedible Plant and Animal Materials",
+"unspsc",11100000,"Minerals and ores and metals",
+"unspsc",11101500,"Minerals",
+"unspsc",11101501,"Mica",
+"unspsc",11101502,"Emery",
+"unspsc",11101503,"Quartz",
+"unspsc",11101504,"Pyrite",
+"unspsc",11101505,"Sulphur",
+"unspsc",11101506,"Chalk",
+"unspsc",11101507,"Graphite",
+"unspsc",11101508,"Dolomite",
+"unspsc",11101509,"Magnesite",
+"unspsc",11101510,"Asbestos",
+"unspsc",11101511,"Calcium",
+"unspsc",11101512,"Borate",
+"unspsc",11101513,"Cryolite",
+"unspsc",11101514,"Feldspar",
+"unspsc",11101515,"Leucite",
+"unspsc",11101516,"Nephelite",
+"unspsc",11101517,"Steatite",
+"unspsc",11101518,"Talc",
+"unspsc",11101519,"Diamonds",
+"unspsc",11101520,"Garnets",
+"unspsc",11101521,"Silicon carbide",
+"unspsc",11101522,"Activated carbon",
+"unspsc",11101523,"Mulite",
+"unspsc",11101524,"Fluorspar",
+"unspsc",11101525,"Kieserite",
+"unspsc",11101526,"Carnallite",
+"unspsc",11101527,"Diatomaceous silica",
+"unspsc",11101600,"Ores",
+"unspsc",11101601,"Iron ore",
+"unspsc",11101602,"Titanium ore",
+"unspsc",11101603,"Uranium ore",
+"unspsc",11101604,"Copper ore",
+"unspsc",11101605,"Aluminum ore",
+"unspsc",11101606,"Nickel ore",
+"unspsc",11101607,"Silver ore",
+"unspsc",11101608,"Lead ore",
+"unspsc",11101609,"Zinc ore",
+"unspsc",11101610,"Tin ore",
+"unspsc",11101611,"Manganese ore",
+"unspsc",11101612,"Chromium ore",
+"unspsc",11101613,"Tungsten or wolfram ore",
+"unspsc",11101614,"Molybdenum ore",
+"unspsc",11101615,"Cobalt ore",
+"unspsc",11101616,"Gold ore",
+"unspsc",11101617,"Tantalum ore",
+"unspsc",11101618,"Platinum ore",
+"unspsc",11101619,"Vermiculite ore",
+"unspsc",11101620,"Thorium ore",
+"unspsc",11101621,"Kyanite ore",
+"unspsc",11101622,"Antimony ores",
+"unspsc",11101623,"Zirconium ores",
+"unspsc",11101700,"Base Metals",
+"unspsc",11101701,"Slag or ash",
+"unspsc",11101702,"Natural graphite",
+"unspsc",11101703,"Titanium",
+"unspsc",11101704,"Steel",
+"unspsc",11101705,"Aluminum",
+"unspsc",11101706,"Nickel",
+"unspsc",11101707,"Magnesium",
+"unspsc",11101708,"Bismuth",
+"unspsc",11101709,"Antimony",
+"unspsc",11101710,"Cadmium",
+"unspsc",11101711,"Non ferrous alloy",
+"unspsc",11101712,"Ferrous alloy",
+"unspsc",11101713,"Iron",
+"unspsc",11101714,"Lead",
+"unspsc",11101715,"Copper",
+"unspsc",11101716,"Tin",
+"unspsc",11101717,"Indium",
+"unspsc",11101718,"Palladium",
+"unspsc",11101719,"Zinc",
+"unspsc",11101800,"Precious metals",
+"unspsc",11101801,"Gold",
+"unspsc",11101802,"Silver",
+"unspsc",11101803,"Platinum",
+"unspsc",11110000,"Earth and stone",
+"unspsc",11111500,"Dirt and soil",
+"unspsc",11111501,"Soil",
+"unspsc",11111502,"Fill dirt",
+"unspsc",11111503,"Topsoil",
+"unspsc",11111600,"Stone",
+"unspsc",11111601,"Gypsum",
+"unspsc",11111602,"Travertine",
+"unspsc",11111603,"Ecaussine or alabaster",
+"unspsc",11111604,"Granite",
+"unspsc",11111605,"Marble",
+"unspsc",11111606,"Slate",
+"unspsc",11111607,"Sandstone",
+"unspsc",11111608,"Limestone",
+"unspsc",11111609,"Basalt",
+"unspsc",11111610,"Pumice stone",
+"unspsc",11111611,"Gravel",
+"unspsc",11111700,"Sand",
+"unspsc",11111701,"Silica sand",
+"unspsc",11111800,"Clays",
+"unspsc",11111801,"Terra cotta",
+"unspsc",11111802,"Fireclay",
+"unspsc",11111803,"Kaolin or other kaolinic clays",
+"unspsc",11111804,"Bentonite",
+"unspsc",11111805,"Andalusite",
+"unspsc",11111806,"Mullite",
+"unspsc",11111807,"Chamotte",
+"unspsc",11111808,"Common clay",
+"unspsc",11111809,"Ball clay",
+"unspsc",11111810,"Fullers earth",
+"unspsc",11120000,"Non edible plant and forestry products",
+"unspsc",11121500,"Sap",
+"unspsc",11121502,"Rosin",
+"unspsc",11121503,"Lac",
+"unspsc",11121600,"Wood",
+"unspsc",11121603,"Logs",
+"unspsc",11121604,"Soft timber",
+"unspsc",11121605,"Rattan",
+"unspsc",11121606,"Cork",
+"unspsc",11121607,"Wood pulp",
+"unspsc",11121608,"Bamboo",
+"unspsc",11121609,"Plywood",
+"unspsc",11121610,"Hardwoods",
+"unspsc",11121611,"Particleboard",
+"unspsc",11121612,"Wood pith",
+"unspsc",11121700,"Forestry byproducts",
+"unspsc",11121701,"Saw dust",
+"unspsc",11121702,"Wood chips",
+"unspsc",11121703,"Peat moss",
+"unspsc",11121705,"Bark",
+"unspsc",11121706,"Mulch",
+"unspsc",11121707,"Wood wool",
+"unspsc",11121708,"Wood flour",
+"unspsc",11121709,"Balsams",
+"unspsc",11121710,"Wood tar",
+"unspsc",11121800,"Plant fibers",
+"unspsc",11121801,"Hemp",
+"unspsc",11121802,"Cotton",
+"unspsc",11121803,"Flax",
+"unspsc",11121804,"Jute",
+"unspsc",11121805,"Sisal",
+"unspsc",11121806,"Coconut fibres or coir",
+"unspsc",11121807,"Abaca fibers",
+"unspsc",11121808,"Ramie",
+"unspsc",11121809,"Straw",
+"unspsc",11121810,"Broom corn or istle or piassava",
+"unspsc",11121900,"Perfumery products",
+"unspsc",11121901,"Licorice roots",
+"unspsc",11130000,"Non edible animal products",
+"unspsc",11131500,"Animal hides and skins and animal textile materials",
+"unspsc",11131501,"Feathers",
+"unspsc",11131502,"Furs",
+"unspsc",11131503,"Animal hair",
+"unspsc",11131504,"Hides",
+"unspsc",11131505,"Unprocessed mohair",
+"unspsc",11131506,"Unprocessed wool",
+"unspsc",11131507,"Suede",
+"unspsc",11131508,"Full grain leather",
+"unspsc",11131600,"Other animal products",
+"unspsc",11131601,"Ivory",
+"unspsc",11131602,"Semen",
+"unspsc",11131603,"Excretions",
+"unspsc",11131604,"Fish eggs",
+"unspsc",11131605,"Bones",
+"unspsc",11131606,"Animal horns",
+"unspsc",11131607,"Embryos",
+"unspsc",11131608,"Shell articles",
+"unspsc",11140000,"Scrap and waste materials",
+"unspsc",11141600,"Non metallic waste and scrap",
+"unspsc",11141601,"Textile waste or scrap",
+"unspsc",11141602,"Plastic waste or scrap",
+"unspsc",11141603,"Oil wastes",
+"unspsc",11141604,"Paper wastes",
+"unspsc",11141605,"Glass waste or scrap",
+"unspsc",11141606,"Wood waste or scrap",
+"unspsc",11141607,"Rubber waste or scrap",
+"unspsc",11141608,"Hazardous waste or scrap",
+"unspsc",11141609,"Composition leather",
+"unspsc",11141610,"Leather waste or scrap",
+"unspsc",11141700,"Food and tobacco waste and scrap",
+"unspsc",11141701,"Food waste or scrap",
+"unspsc",11141702,"Tobacco waste or scrap",
+"unspsc",11150000,"Fibers and threads and yarns",
+"unspsc",11151500,"Fibers",
+"unspsc",11151501,"Acetate fibers",
+"unspsc",11151502,"Nylon fibers",
+"unspsc",11151503,"Polyester fibers",
+"unspsc",11151504,"Acrylic fibers",
+"unspsc",11151505,"Viscose fibers",
+"unspsc",11151506,"Rayon fibers",
+"unspsc",11151507,"Cotton fibers",
+"unspsc",11151508,"Wool fibers",
+"unspsc",11151509,"Silk fibers",
+"unspsc",11151510,"Vegetable fibers",
+"unspsc",11151511,"Polypropylene fibers",
+"unspsc",11151512,"Glass fibers",
+"unspsc",11151513,"Ceramic fibers",
+"unspsc",11151514,"Polymer aramid fibers",
+"unspsc",11151515,"Asbestos fibers",
+"unspsc",11151600,"Threads",
+"unspsc",11151601,"Cotton thread",
+"unspsc",11151602,"Silk thread",
+"unspsc",11151603,"Polyester thread",
+"unspsc",11151604,"Polyamide thread",
+"unspsc",11151605,"Bismalemide thread",
+"unspsc",11151606,"Fiberglass thread",
+"unspsc",11151607,"Graphite thread",
+"unspsc",11151608,"Nylon thread",
+"unspsc",11151609,"Resin impregnated thread",
+"unspsc",11151610,"Rubber or latex thread",
+"unspsc",11151611,"Spandex thread",
+"unspsc",11151612,"Asbestos thread",
+"unspsc",11151700,"Yarns",
+"unspsc",11151701,"Wool yarn",
+"unspsc",11151702,"Cotton yarn",
+"unspsc",11151703,"Polyester yarn",
+"unspsc",11151704,"Acrylic yarn",
+"unspsc",11151705,"Silk yarn",
+"unspsc",11151706,"Ramie yarn",
+"unspsc",11151708,"Animal hair yarn",
+"unspsc",11151709,"Synthetic yarn",
+"unspsc",11151710,"Jute yarn",
+"unspsc",11151711,"Coir yarn",
+"unspsc",11151712,"Paper yarn",
+"unspsc",11151713,"Hemp yarn",
+"unspsc",11151714,"Glass yarn",
+"unspsc",11151715,"Flax yarn",
+"unspsc",11160000,"Fabrics and leather materials",
+"unspsc",11161500,"Silk fabrics",
+"unspsc",11161501,"Plain weave silk fabrics",
+"unspsc",11161502,"Jacquard weave silk fabrics",
+"unspsc",11161503,"Knit silk fabrics",
+"unspsc",11161504,"Silk velvets fabrics",
+"unspsc",11161600,"Wool fabrics",
+"unspsc",11161601,"Plain weave wool fabrics",
+"unspsc",11161602,"Jacquard weave wool fabrics",
+"unspsc",11161603,"Knit wool fabrics",
+"unspsc",11161604,"Twill weave wool fabrics",
+"unspsc",11161700,"Cotton fabrics",
+"unspsc",11161701,"Plain weave cotton fabrics",
+"unspsc",11161702,"Twill weave cotton fabrics",
+"unspsc",11161703,"Cotton oxford cloths",
+"unspsc",11161704,"Knit cotton fabrics",
+"unspsc",11161705,"Cotton velvet fabrics",
+"unspsc",11161800,"Synthetic fabrics",
+"unspsc",11161801,"Plain weave synthetic fabrics",
+"unspsc",11161802,"Jacquard weave synthetic fabrics",
+"unspsc",11161803,"Dobby weave synthetic fabrics",
+"unspsc",11161804,"Knit synthetic fabrics",
+"unspsc",11161805,"Synthetic velvet fabrics",
+"unspsc",11162000,"Fabrics of vegetable material other than cotton",
+"unspsc",11162001,"Plain weave non cotton vegetable fiber fabrics",
+"unspsc",11162002,"Knit non cotton vegetable fiber fabrics",
+"unspsc",11162003,"Hessian or hemp or jute cloth",
+"unspsc",11162100,"Specialty fabrics or cloth",
+"unspsc",11162101,"Cheese cloth or fabric",
+"unspsc",11162102,"Bismalemide fabric or cloth",
+"unspsc",11162104,"Graphite fabric or cloth",
+"unspsc",11162105,"Glass fabric or cloth",
+"unspsc",11162107,"Resin impregnated fabric or cloth",
+"unspsc",11162108,"Wire mesh fabric or cloth",
+"unspsc",11162109,"Lace",
+"unspsc",11162110,"Netting",
+"unspsc",11162111,"Mesh",
+"unspsc",11162112,"Coated fabrics",
+"unspsc",11162113,"Upholstery fabrics",
+"unspsc",11162114,"Hook and loop fabrics or tapes",
+"unspsc",11162115,"Elastic braid",
+"unspsc",11162116,"Burlap cloth",
+"unspsc",11162117,"Rubber fabrics",
+"unspsc",11162118,"Paper yarn fabric",
+"unspsc",11162119,"Tracing cloth",
+"unspsc",11162120,"Bolting cloth",
+"unspsc",11162121,"Ornamental trimmings",
+"unspsc",11162122,"Binding fabrics",
+"unspsc",11162123,"Tape fabrics",
+"unspsc",11162124,"Felt fabrics",
+"unspsc",11162125,"Webbing fabrics",
+"unspsc",11162126,"Quilted cloth",
+"unspsc",11162127,"Camouflage cloth",
+"unspsc",11162128,"Parachute cloth",
+"unspsc",11162129,"Marquisette cloth",
+"unspsc",11162130,"Dossal",
+"unspsc",11162131,"Welting fabrics",
+"unspsc",11162200,"Nonwoven fabrics",
+"unspsc",11162201,"Spunbonded nonwovens",
+"unspsc",11162202,"Spunlaced nonwovens",
+"unspsc",11162300,"Leathers",
+"unspsc",11162301,"Chamois leather",
+"unspsc",11162302,"Goat leather",
+"unspsc",11162303,"Sheep leather",
+"unspsc",11162304,"Patent leather",
+"unspsc",11162305,"Cow leather",
+"unspsc",11162306,"Pig leather",
+"unspsc",11162307,"Synthetic or imitation leather",
+"unspsc",11162308,"Buffalo leather",
+"unspsc",11162309,"Reptile leather",
+"unspsc",11162310,"Horsehide leather",
+"unspsc",11162311,"Calfskin leather",
+"unspsc",11170000,"Alloys",
+"unspsc",11171500,"Basic steels",
+"unspsc",11171501,"E24-2 or A37-2 steel",
+"unspsc",11171600,"Stainless steel alloys",
+"unspsc",11171601,"X5CrNi18-10 or 304 stainless steel alloy",
+"unspsc",11171602,"X2CrNi19-11or 304L stainless steel alloy",
+"unspsc",11171603,"X5CrNiMo17-12-2 or 316 stainless steel alloy",
+"unspsc",11171700,"High speed steels",
+"unspsc",11171701,"Z90WDCV.6.5.4.2 or M2 high speed steel",
+"unspsc",11171702,"Z90WDKCV6.5.5.4.2 or M35 high speed steel",
+"unspsc",11171800,"Nickel based super alloys",
+"unspsc",11171801,"Inconel 600 super alloy",
+"unspsc",11171900,"Titanium based super alloys",
+"unspsc",11171901,"TA6V super alloy",
+"unspsc",11172000,"Aluminum based alloys",
+"unspsc",11172001,"7178 alloy",
+"unspsc",11172100,"Cobalt based super alloys",
+"unspsc",11172101,"Pygmalion or 846 alloy",
+"unspsc",11180000,"Metal oxide",
+"unspsc",11181500,"Non ferrous metal oxides",
+"unspsc",11181501,"Molybdenum oxide",
+"unspsc",11190000,"Metal waste and scrap",
+"unspsc",11191500,"Metal solids",
+"unspsc",11191501,"Nickel solids",
+"unspsc",11191502,"Basic steel solids",
+"unspsc",11191503,"Ferrous alloy solids",
+"unspsc",11191504,"Non ferrous alloy solids",
+"unspsc",11191505,"Super alloy solids",
+"unspsc",11191600,"Metal scrap",
+"unspsc",11191601,"Nickel scrap",
+"unspsc",11191602,"Basic steel scrap",
+"unspsc",11191603,"Ferrous alloy scrap",
+"unspsc",11191604,"Non ferrous alloy scrap",
+"unspsc",11191605,"Super alloy scrap",
+"unspsc",11191606,"Automotive wrecking for waste or scrap",
+"unspsc",11191700,"Turnings",
+"unspsc",11191701,"Nickel turnings",
+"unspsc",11191702,"Bronze turnings",
+"unspsc",12000000,"Chemicals including Bio Chemicals and Gas Materials",
+"unspsc",12130000,"Explosive materials",
+"unspsc",12131500,"Explosives",
+"unspsc",12131501,"Dynamite",
+"unspsc",12131502,"Explosive cartridges",
+"unspsc",12131503,"Propellant explosives",
+"unspsc",12131504,"Explosive charges",
+"unspsc",12131505,"Plastic explosives",
+"unspsc",12131506,"Aluminized explosives",
+"unspsc",12131507,"Ammonium nitrate explosives",
+"unspsc",12131508,"Nitroglycerin powder explosives",
+"unspsc",12131600,"Pyrotechnics",
+"unspsc",12131601,"Fireworks",
+"unspsc",12131602,"Fog signals",
+"unspsc",12131603,"Rain rockets",
+"unspsc",12131604,"Flares",
+"unspsc",12131605,"Pyrotechnic materials for theater or television",
+"unspsc",12131700,"Igniters",
+"unspsc",12131701,"Blasting caps",
+"unspsc",12131702,"Detonators",
+"unspsc",12131703,"Explosives fuses",
+"unspsc",12131704,"Explosive initiators",
+"unspsc",12131705,"Explosive primers",
+"unspsc",12131706,"Matches",
+"unspsc",12131707,"Lighters",
+"unspsc",12131708,"Detonator box",
+"unspsc",12131800,"Propellants",
+"unspsc",12131801,"Powder propellants",
+"unspsc",12131802,"Solid propellants",
+"unspsc",12131803,"Gun propellants",
+"unspsc",12131804,"High energy propellants",
+"unspsc",12131805,"Gelled propellants",
+"unspsc",12131806,"Hybrid propellants",
+"unspsc",12140000,"Elements and gases",
+"unspsc",12141500,"Earth metals",
+"unspsc",12141501,"Beryllium Be",
+"unspsc",12141502,"Magnesium Mg",
+"unspsc",12141503,"Calcium Ca",
+"unspsc",12141504,"Strontium Sr",
+"unspsc",12141505,"Barium Ba",
+"unspsc",12141506,"Radium Ra",
+"unspsc",12141600,"Rare earth metals",
+"unspsc",12141601,"Cerium Ce",
+"unspsc",12141602,"Dysprosium Dy",
+"unspsc",12141603,"Erbium Er",
+"unspsc",12141604,"Europium Eu",
+"unspsc",12141605,"Gadolinium Gd",
+"unspsc",12141606,"Holmium Ho",
+"unspsc",12141607,"Lanthanum La",
+"unspsc",12141608,"Lutetium Lu",
+"unspsc",12141609,"Neodymium Nd",
+"unspsc",12141610,"Praseodymium Pr",
+"unspsc",12141611,"Promethium Pm",
+"unspsc",12141612,"Samarium Sm",
+"unspsc",12141613,"Scandium Sc",
+"unspsc",12141614,"Terbium Tb",
+"unspsc",12141615,"Thulium Tm",
+"unspsc",12141616,"Ytterbium Yb",
+"unspsc",12141617,"Yttrium Y",
+"unspsc",12141700,"Transition metals",
+"unspsc",12141701,"Actinium Ac",
+"unspsc",12141702,"Aluminum Al",
+"unspsc",12141703,"Americium Am",
+"unspsc",12141704,"Antimony Sb",
+"unspsc",12141705,"Berkelium Bk",
+"unspsc",12141706,"Bismuth Bi",
+"unspsc",12141707,"Cadmium Ca",
+"unspsc",12141708,"Californium Cf",
+"unspsc",12141709,"Chromium Cr",
+"unspsc",12141710,"Cobalt Co",
+"unspsc",12141711,"Copper Cu",
+"unspsc",12141712,"Curium Cm",
+"unspsc",12141713,"Einsteinium Es",
+"unspsc",12141714,"Fermium Fm",
+"unspsc",12141715,"Gallium Ga",
+"unspsc",12141716,"Germanium Ge",
+"unspsc",12141717,"Gold Au",
+"unspsc",12141718,"Hafnium Hf",
+"unspsc",12141719,"Indium In",
+"unspsc",12141720,"Iridium Ir",
+"unspsc",12141721,"Iron Fe",
+"unspsc",12141722,"Lawrencium Lr",
+"unspsc",12141723,"Lead Pb",
+"unspsc",12141724,"Manganese Mn",
+"unspsc",12141725,"Mendelevium Md",
+"unspsc",12141726,"Mercury Hg",
+"unspsc",12141727,"Molybdenum Mo",
+"unspsc",12141728,"Neptunium Np",
+"unspsc",12141729,"Nickel Ni",
+"unspsc",12141730,"Niobium Nb",
+"unspsc",12141731,"Nobelium No",
+"unspsc",12141732,"Osmium Os",
+"unspsc",12141733,"Palladium Pd",
+"unspsc",12141734,"Platinum Pt",
+"unspsc",12141735,"Plutonium Pu",
+"unspsc",12141736,"Protactinium Pa",
+"unspsc",12141737,"Rhenium Re",
+"unspsc",12141738,"Rhodium Rh",
+"unspsc",12141739,"Ruthenium Ru",
+"unspsc",12141740,"Silver Ag",
+"unspsc",12141741,"Tantalum Ta",
+"unspsc",12141742,"Technetium Te",
+"unspsc",12141743,"Thallium Tl",
+"unspsc",12141744,"Thorium Th",
+"unspsc",12141745,"Tin Sn",
+"unspsc",12141746,"Titanium Ti",
+"unspsc",12141747,"Tungsten W",
+"unspsc",12141748,"Uranium U",
+"unspsc",12141749,"Vanadium V",
+"unspsc",12141750,"Zinc Zn",
+"unspsc",12141751,"Zirconium Zr",
+"unspsc",12141752,"Bohrium Bh",
+"unspsc",12141753,"Dubnium Db",
+"unspsc",12141754,"Hassium Hs",
+"unspsc",12141755,"Rutherfordium Rf",
+"unspsc",12141756,"Seaborgium Sg",
+"unspsc",12141757,"Ununnilium Uum",
+"unspsc",12141758,"Unununium Uuu",
+"unspsc",12141759,"Ununbium Uub",
+"unspsc",12141760,"Polonium Po",
+"unspsc",12141800,"Alkali metals",
+"unspsc",12141801,"Cesium Cs",
+"unspsc",12141802,"Francium Fm",
+"unspsc",12141803,"Lithium Li",
+"unspsc",12141804,"Potassium K",
+"unspsc",12141805,"Rubidium Rb",
+"unspsc",12141806,"Sodium Na",
+"unspsc",12141900,"Non metals and pure and elemental gases",
+"unspsc",12141901,"Chlorine  Cl",
+"unspsc",12141902,"Hydrogen H",
+"unspsc",12141903,"Nitrogen N",
+"unspsc",12141904,"Oxygen O",
+"unspsc",12141905,"Fluorine F",
+"unspsc",12141906,"Arsenic As",
+"unspsc",12141907,"Boron B",
+"unspsc",12141908,"Carbon C",
+"unspsc",12141909,"Phosphorus P",
+"unspsc",12141910,"Selenium Se",
+"unspsc",12141911,"Silicon Si",
+"unspsc",12141912,"Sulfur S",
+"unspsc",12141913,"Tellurium Te",
+"unspsc",12141914,"Astatine At",
+"unspsc",12141915,"Bromine Br",
+"unspsc",12141916,"Iodine I",
+"unspsc",12142000,"Noble gases",
+"unspsc",12142001,"Xenon gas  Xe",
+"unspsc",12142002,"Radon gas Rn",
+"unspsc",12142003,"Krypton gas Kr",
+"unspsc",12142004,"Argon gas Ar",
+"unspsc",12142005,"Helium gas He",
+"unspsc",12142006,"Neon gas Ne",
+"unspsc",12142100,"Industrial use gases",
+"unspsc",12142101,"Hydrogen compound gases",
+"unspsc",12142102,"Chlorinated mixed gases",
+"unspsc",12142103,"Ammonia",
+"unspsc",12142104,"Carbon dioxide gas CO2",
+"unspsc",12142105,"Industrial air",
+"unspsc",12142106,"Inert gas mixtures",
+"unspsc",12142200,"Isotopes",
+"unspsc",12142201,"Deuterated solvents",
+"unspsc",12142202,"Heavy water",
+"unspsc",12142203,"Alpha sources",
+"unspsc",12142204,"Beta sources",
+"unspsc",12142205,"Cobalt sources",
+"unspsc",12142206,"Gamma sources",
+"unspsc",12142207,"Radioisotope sources",
+"unspsc",12142208,"Calibration sources",
+"unspsc",12160000,"Additives",
+"unspsc",12161500,"Indicators and Reagents",
+"unspsc",12161501,"Affinity labels",
+"unspsc",12161502,"Cross linking agents",
+"unspsc",12161503,"Reagent kits",
+"unspsc",12161504,"Sulfhydryl reagents",
+"unspsc",12161505,"Intercalating agents",
+"unspsc",12161506,"Diverting agents",
+"unspsc",12161507,"Cupferron reagent",
+"unspsc",12161600,"Catalysts",
+"unspsc",12161601,"Acid catalysts",
+"unspsc",12161602,"Combustion catalysts",
+"unspsc",12161603,"Custom catalysts",
+"unspsc",12161604,"Cracking catalysts",
+"unspsc",12161700,"Buffers",
+"unspsc",12161701,"Ampholyte mixtures",
+"unspsc",12161702,"Bicarbonate buffers",
+"unspsc",12161703,"Other buffers",
+"unspsc",12161704,"Acid buffers",
+"unspsc",12161705,"Basic buffers",
+"unspsc",12161706,"Neutral buffers",
+"unspsc",12161800,"Colloids",
+"unspsc",12161801,"Gels",
+"unspsc",12161802,"Suspensions",
+"unspsc",12161803,"Aerosols",
+"unspsc",12161804,"Emulsions",
+"unspsc",12161805,"Natural gelling agents",
+"unspsc",12161806,"Synthetic gelling agents",
+"unspsc",12161807,"Gel stabilizers",
+"unspsc",12161808,"Suspending agents",
+"unspsc",12161900,"Surfactants",
+"unspsc",12161901,"Anti foaming agents",
+"unspsc",12161902,"Detergent surfactants",
+"unspsc",12161903,"Foaming agents",
+"unspsc",12161904,"Dispersing agents",
+"unspsc",12161905,"Flushes",
+"unspsc",12161906,"Wetting agents",
+"unspsc",12161907,"Water flood additives",
+"unspsc",12162000,"Plasticizers",
+"unspsc",12162002,"Polymerics",
+"unspsc",12162003,"Agricultural oils",
+"unspsc",12162004,"Sulfonamides",
+"unspsc",12162005,"Glutarates",
+"unspsc",12162100,"Flame retardants",
+"unspsc",12162101,"Brominated retardants",
+"unspsc",12162200,"Anti oxidants",
+"unspsc",12162201,"Ascorbic acid",
+"unspsc",12162202,"Beta carotene",
+"unspsc",12162203,"Butylated hydroxyanisole",
+"unspsc",12162204,"Butylated hydroxytoluene",
+"unspsc",12162205,"Calcium citrate",
+"unspsc",12162206,"Canthaxanthin",
+"unspsc",12162207,"Melatonin",
+"unspsc",12162208,"Nordihydroguaiaretic acid",
+"unspsc",12162209,"Propyl gallate",
+"unspsc",12162210,"Silymarin",
+"unspsc",12162211,"Sulfur dioxide",
+"unspsc",12162212,"Ubiquinone or coenzyme Q10",
+"unspsc",12162300,"Curing agents",
+"unspsc",12162301,"Waterborne curing agents",
+"unspsc",12162302,"Cement accelerators",
+"unspsc",12162303,"Cement retarders",
+"unspsc",12162400,"Polymer breakers",
+"unspsc",12162401,"Acidic polymer breakers",
+"unspsc",12162402,"Organic polymer breakers",
+"unspsc",12162500,"Emulsion breakers",
+"unspsc",12162501,"Water in oil emulsion breakers",
+"unspsc",12162502,"Oil in water emulsion breakers",
+"unspsc",12162503,"Flotation aids",
+"unspsc",12162600,"Clay stabilizers",
+"unspsc",12162601,"Inorganic clay stabilizers",
+"unspsc",12162602,"Organic clay stabilizers",
+"unspsc",12162700,"Fluid loss additives",
+"unspsc",12162701,"Natural polymer fluid loss additives",
+"unspsc",12162702,"Modified polymer fluid loss additives",
+"unspsc",12162800,"Friction reducers",
+"unspsc",12162801,"Anionic friction reducers",
+"unspsc",12162802,"Cationic friction reducers",
+"unspsc",12162900,"Paraffin asphaltene control agents",
+"unspsc",12162901,"Solvent type paraffin asphaltene control agents",
+"unspsc",12162902,"Crystal modified paraffin asphaltene control agents",
+"unspsc",12162903,"Dispersant type paraffin asphaltene control agents",
+"unspsc",12163000,"Mud removal mixtures",
+"unspsc",12163001,"Mud cleanout agents",
+"unspsc",12163100,"Anti sludgers",
+"unspsc",12163101,"Anti sludge additives",
+"unspsc",12163200,"Anti gas migration agents",
+"unspsc",12163201,"Anti gas migration additives",
+"unspsc",12163300,"Expanding agents",
+"unspsc",12163301,"Cement expanding agents",
+"unspsc",12163400,"Extenders",
+"unspsc",12163401,"Cement extenders",
+"unspsc",12163500,"Oil well sealants",
+"unspsc",12163501,"Cementing sealants",
+"unspsc",12163600,"Corrosion inhibitors",
+"unspsc",12163601,"Oil production corrosion inhibitors",
+"unspsc",12163602,"Gas production corrosion inhibitors",
+"unspsc",12163700,"Gas hydrate controllers",
+"unspsc",12163701,"Kinetic hydrate controllers",
+"unspsc",12163800,"Chemical scavengers",
+"unspsc",12163801,"Hydrogen sulfide scavengers",
+"unspsc",12163802,"Oxygen scavengers",
+"unspsc",12163900,"Scale controllers",
+"unspsc",12163901,"Scale inhibitor",
+"unspsc",12163902,"Scale removers or converters",
+"unspsc",12164000,"Bactericides",
+"unspsc",12164001,"Registered microbiocides",
+"unspsc",12164100,"In situ",
+"unspsc",12164101,"In situ additives",
+"unspsc",12164102,"Acid additives",
+"unspsc",12164200,"Retarders",
+"unspsc",12164201,"Acid corrosion inhibitors",
+"unspsc",12164300,"Iron controllers",
+"unspsc",12164301,"Iron control additives",
+"unspsc",12164400,"Non emulsifiers",
+"unspsc",12164401,"Non emulsifying additives",
+"unspsc",12164500,"Food or drug additives",
+"unspsc",12164501,"Preservatives",
+"unspsc",12164502,"Flavours or extracts",
+"unspsc",12164503,"Fragrance additives",
+"unspsc",12164504,"Sweeteners",
+"unspsc",12170000,"Colorants",
+"unspsc",12171500,"Dyes",
+"unspsc",12171501,"Fluorescent dyes",
+"unspsc",12171502,"Phthalein dyes",
+"unspsc",12171503,"Rosaniline dyes",
+"unspsc",12171504,"Food or drug or cosmetic safe FDC dyes",
+"unspsc",12171505,"Laked",
+"unspsc",12171506,"Natural dyes",
+"unspsc",12171600,"Pigments",
+"unspsc",12171602,"Inorganic metal oxides",
+"unspsc",12171603,"Carbon black",
+"unspsc",12171604,"Titanium dioxide",
+"unspsc",12171605,"Organic pigments",
+"unspsc",12171700,"Color compounds and dispersions",
+"unspsc",12171701,"Polymer masterbatches",
+"unspsc",12171702,"Pigment dispersions",
+"unspsc",12171703,"Inks",
+"unspsc",12180000,"Waxes and oils",
+"unspsc",12181500,"Waxes",
+"unspsc",12181501,"Synthetic waxes",
+"unspsc",12181502,"Natural waxes",
+"unspsc",12181503,"Paraffins",
+"unspsc",12181504,"Petrolatums",
+"unspsc",12181600,"Oils",
+"unspsc",12181601,"Synthetic oils",
+"unspsc",12181602,"Natural oils",
+"unspsc",12190000,"Solvents",
+"unspsc",12191500,"Hydrocarbonated solvents",
+"unspsc",12191501,"Aromatic solvents",
+"unspsc",12191502,"Aliphatic solvents",
+"unspsc",12191503,"Phenols or its substitutes or derivatives",
+"unspsc",12191504,"Cyclic alkanes",
+"unspsc",12191600,"Oxygenated solvents",
+"unspsc",12191601,"Alcohol solvents",
+"unspsc",12191602,"Active solvents",
+"unspsc",12350000,"Compounds and mixtures",
+"unspsc",12352000,"Aliphatic and aromatic compounds",
+"unspsc",12352001,"Alkanes",
+"unspsc",12352002,"Alkenes",
+"unspsc",12352003,"Alkynes",
+"unspsc",12352005,"Aromatic or heterocyclic compounds",
+"unspsc",12352100,"Organic derivatives and substituted compounds",
+"unspsc",12352101,"Organic halogenated compounds",
+"unspsc",12352102,"Organic nitro or nitroso compounds",
+"unspsc",12352103,"Organo metallic compounds",
+"unspsc",12352104,"Alcohols or its substitutes",
+"unspsc",12352105,"Thio alcohols",
+"unspsc",12352106,"Organic acids or its substitutes",
+"unspsc",12352107,"Organic salts or its substitutes",
+"unspsc",12352108,"Esters or its substitutes",
+"unspsc",12352111,"Amides or imides",
+"unspsc",12352112,"Ethers or its substitutes",
+"unspsc",12352113,"Thioethers",
+"unspsc",12352114,"Aldehydes or its substitutes",
+"unspsc",12352115,"Ketones or quinones or its substitutes",
+"unspsc",12352116,"Amines or imines or its substitutes",
+"unspsc",12352117,"Cyanides or isocyanides",
+"unspsc",12352118,"Cyanates or isocyanates or thiocyantes or isothiocyanates",
+"unspsc",12352119,"Organic oxides",
+"unspsc",12352120,"Organic peroxides",
+"unspsc",12352121,"Organic hydroxides",
+"unspsc",12352123,"Ureides or purines or their derivatives",
+"unspsc",12352124,"Azo compounds or its substitutes",
+"unspsc",12352125,"Azides or azines",
+"unspsc",12352126,"Oximes",
+"unspsc",12352127,"Hydrazines or hydrazides or its substitiutes",
+"unspsc",12352128,"Phosphines",
+"unspsc",12352129,"Amidines or imidines",
+"unspsc",12352130,"Acrylate or methacrylate intermediates",
+"unspsc",12352200,"Biochemicals",
+"unspsc",12352201,"Carbohydrates or its derivatives",
+"unspsc",12352202,"Proteins",
+"unspsc",12352203,"Antibodies",
+"unspsc",12352204,"Enzymes",
+"unspsc",12352205,"Nutrients",
+"unspsc",12352206,"Tissues",
+"unspsc",12352207,"Cultures and fluids",
+"unspsc",12352208,"Nucleic acids",
+"unspsc",12352209,"Amino acids or its derivatives",
+"unspsc",12352210,"Alkaloids",
+"unspsc",12352211,"Fats or lipids",
+"unspsc",12352212,"Terpenoids",
+"unspsc",12352300,"Inorganic compounds",
+"unspsc",12352301,"Inorganic acids",
+"unspsc",12352302,"Inorganic metal salts",
+"unspsc",12352303,"Inorganic oxides",
+"unspsc",12352304,"Inorganic peroxides",
+"unspsc",12352305,"Inorganic hydroxides",
+"unspsc",12352306,"Inorganic hydrides",
+"unspsc",12352307,"Acid halides or its substitutes",
+"unspsc",12352308,"Silicates",
+"unspsc",12352309,"Silica",
+"unspsc",12352310,"Silicones",
+"unspsc",12352311,"Alumina and other aluminum compounds",
+"unspsc",12352312,"Potassium permanganate",
+"unspsc",12352400,"Mixtures",
+"unspsc",12352401,"Organic chemical mixtures",
+"unspsc",12352402,"Inorganic chemical mixtures",
+"unspsc",12352500,"Fixatives",
+"unspsc",12352501,"Formaldehydes",
+"unspsc",12352502,"Glutarals",
+"unspsc",12352503,"Tannins",
+"unspsc",13000000,"Resin and Rosin and Rubber and Foam and Film and Elastomeric Materials",
+"unspsc",13100000,"Rubber and elastomers",
+"unspsc",13101500,"Natural rubber",
+"unspsc",13101501,"Latex rubber",
+"unspsc",13101502,"Crepe rubber",
+"unspsc",13101503,"Smoked sheet rubber",
+"unspsc",13101504,"Natural foam rubber",
+"unspsc",13101505,"Block or crumb rubber",
+"unspsc",13101600,"Processed and synthetic rubber",
+"unspsc",13101601,"Vulcanized rubber",
+"unspsc",13101602,"Chlorinated rubber",
+"unspsc",13101603,"Hydrochloride rubber",
+"unspsc",13101604,"Cyclized rubber",
+"unspsc",13101605,"Isomerized rubber",
+"unspsc",13101606,"Thermplastic rubber",
+"unspsc",13101607,"Rubber compound",
+"unspsc",13101700,"Elastomers",
+"unspsc",13101701,"Acrylonitrile butadiene NBR",
+"unspsc",13101702,"Highly saturated nitrile HNBR",
+"unspsc",13101703,"Fluorocarbon FKM",
+"unspsc",13101704,"Ethylene propylene EP",
+"unspsc",13101705,"Styrene butadiene SBR",
+"unspsc",13101706,"Chloroprene CR",
+"unspsc",13101707,"Isobutylene isoprene IIR/XIIR",
+"unspsc",13101708,"Silicone VMQ and PMQ and PVMQ",
+"unspsc",13101709,"Fluorosilicone FVMQ",
+"unspsc",13101710,"Polyacrylate ACM",
+"unspsc",13101711,"Ethylene acrylic AEM",
+"unspsc",13101712,"Chlorosulfonated polyethylene CSM",
+"unspsc",13101713,"Chloropolyethylene CM",
+"unspsc",13101714,"Epichlorohydrin ECO",
+"unspsc",13101715,"Natural polyisoprene NR",
+"unspsc",13101716,"Synthetic polyisoprene IR",
+"unspsc",13101717,"Polyester urethane AU",
+"unspsc",13101718,"Polyether urethane EU",
+"unspsc",13101719,"Polybutadiene BR",
+"unspsc",13101720,"Polyether block amide PEBA",
+"unspsc",13101721,"Styrene block coploymer TES",
+"unspsc",13101722,"Copolyester",
+"unspsc",13101723,"Thermoplastic",
+"unspsc",13101724,"Polyolenfinic",
+"unspsc",13101900,"Thermoset plastics",
+"unspsc",13101902,"Phenolic PF",
+"unspsc",13101903,"Unsaturate Polyester UP",
+"unspsc",13101904,"Urea UF",
+"unspsc",13101905,"Melamine MF",
+"unspsc",13101906,"Thermoset Polyurethane PUR",
+"unspsc",13102000,"Thermoplastic plastics",
+"unspsc",13102001,"Acrylonitrile butadiene styrene ABS",
+"unspsc",13102002,"Acrylonitrile butadiene styrene ABS alloys",
+"unspsc",13102003,"Acetal polymer",
+"unspsc",13102005,"Acrylonitrile Styrene Acrylic ASA",
+"unspsc",13102006,"Acrylonitrile Styrene Acrylic ASA alloys",
+"unspsc",13102008,"Fluoropolymers PTFE",
+"unspsc",13102009,"Ethylene Vinyl Acetate EVA",
+"unspsc",13102010,"Liquid Crystal Polymer LCP",
+"unspsc",13102011,"Polyamide Nylons PA",
+"unspsc",13102012,"Polybutylene Terepthalate PBT",
+"unspsc",13102013,"Polycarbonate PC",
+"unspsc",13102014,"Polyetheretherketone PEEK",
+"unspsc",13102015,"Polyetherimid PEI",
+"unspsc",13102016,"Polyethersulfone PES",
+"unspsc",13102017,"High Density Polyethylene HDPE",
+"unspsc",13102018,"Low Density Polyethylene LDPE",
+"unspsc",13102019,"Medium Density Polyethylene MDPE",
+"unspsc",13102020,"Polyethylene Terepthalate PET",
+"unspsc",13102021,"Polyimide PI",
+"unspsc",13102022,"Polypropylene PP",
+"unspsc",13102023,"Polyphthalamide PPA",
+"unspsc",13102024,"Polyphenylene oxide PPO",
+"unspsc",13102025,"Polyphenylene Sulfide PPS",
+"unspsc",13102026,"Polystyrene PS",
+"unspsc",13102027,"High Impact Polystyrene HIPS",
+"unspsc",13102028,"Polysulfone PSU",
+"unspsc",13102029,"Rigid Thermoplastic Polyurethane RPTU",
+"unspsc",13102030,"Polyvinyl Chloride PVC",
+"unspsc",13102031,"Styrene Acrylonitrile SAN",
+"unspsc",13110000,"Resins and rosins and other resin derived materials",
+"unspsc",13111000,"Resins",
+"unspsc",13111001,"Epoxy",
+"unspsc",13111002,"Phenolic resin",
+"unspsc",13111003,"Unsaturated polyester resin",
+"unspsc",13111004,"Acrylonitrile butadiene styrene resin",
+"unspsc",13111005,"Acrylonitrile styrene acrylic resin",
+"unspsc",13111006,"Acrylonitrile styrene acrylic alloy resin",
+"unspsc",13111007,"Fluoropolymer resin",
+"unspsc",13111008,"Ethylene vinyl acetate resin",
+"unspsc",13111009,"Liquid crystal polymer resin",
+"unspsc",13111010,"Nylon",
+"unspsc",13111011,"Polybutylene terepthatlate",
+"unspsc",13111012,"Polycarbonate resin",
+"unspsc",13111013,"Polyetheretherketone resin",
+"unspsc",13111014,"Polyetherimide resin",
+"unspsc",13111015,"Polyethersulfone resin",
+"unspsc",13111016,"Polyethylene",
+"unspsc",13111017,"Polyethylene terpthalate resin",
+"unspsc",13111018,"Polyimide resin",
+"unspsc",13111019,"Polypropylene resin",
+"unspsc",13111020,"Polyphthalamide resin",
+"unspsc",13111021,"Polyethylene oxide",
+"unspsc",13111022,"Polyphenylene sulfide resin",
+"unspsc",13111023,"Polystyrene resin",
+"unspsc",13111024,"Polysulfone resin",
+"unspsc",13111025,"Polyvinyl chloride resin",
+"unspsc",13111026,"Styrene acrylonitrile resin",
+"unspsc",13111027,"Urea formaldehyde",
+"unspsc",13111028,"Alkyd",
+"unspsc",13111029,"Melamine formaldehyde",
+"unspsc",13111030,"Polyacetal",
+"unspsc",13111031,"Polyamide",
+"unspsc",13111032,"Allyl",
+"unspsc",13111033,"Ethylene acrylic acid",
+"unspsc",13111034,"Polyvinyl chloride compound",
+"unspsc",13111035,"Solution vinyl",
+"unspsc",13111036,"Phenoxy",
+"unspsc",13111037,"Compounded resin",
+"unspsc",13111038,"Polyvinyl pyrolidine",
+"unspsc",13111039,"Polyethylene terephthalate or glycol modified",
+"unspsc",13111040,"Hydrocarbon tackifier",
+"unspsc",13111041,"Polycarbonate blends",
+"unspsc",13111042,"Polyvinyl alcohol",
+"unspsc",13111043,"Polyvinyl butyral",
+"unspsc",13111044,"Polyester molding compound",
+"unspsc",13111045,"Polyvinyl acetate",
+"unspsc",13111046,"Polyvinyl ether",
+"unspsc",13111047,"Polyvinyl formal",
+"unspsc",13111048,"Styrene acrylic",
+"unspsc",13111049,"Ethylene propylene polymers",
+"unspsc",13111050,"Polypropylene oxide",
+"unspsc",13111051,"Polypropylene ether",
+"unspsc",13111052,"Polypropylene sulfone",
+"unspsc",13111053,"Polymethylacrylate",
+"unspsc",13111054,"Styrene maleic anhydride",
+"unspsc",13111055,"Syndiotatic polystyrene",
+"unspsc",13111056,"Chlorinated polyvinyl chloride",
+"unspsc",13111057,"Thermoplastic polyester",
+"unspsc",13111058,"Indene resins",
+"unspsc",13111059,"Plastic resins",
+"unspsc",13111060,"Petroleum resins",
+"unspsc",13111061,"Polyurethane resins",
+"unspsc",13111062,"Polyether resins",
+"unspsc",13111063,"Recycled resins",
+"unspsc",13111064,"Acrylic resins",
+"unspsc",13111065,"Cellulosic resins",
+"unspsc",13111066,"Polyterpene resins",
+"unspsc",13111100,"Rosins",
+"unspsc",13111101,"Wood rosin",
+"unspsc",13111102,"Gum rosin",
+"unspsc",13111103,"Tall oil rosin",
+"unspsc",13111200,"Films",
+"unspsc",13111201,"Polyethylene films",
+"unspsc",13111202,"Polyurethane films",
+"unspsc",13111203,"Acetate films",
+"unspsc",13111204,"Acrylic films",
+"unspsc",13111205,"Coextruded films",
+"unspsc",13111206,"Flouropolymer films",
+"unspsc",13111207,"Metalized films",
+"unspsc",13111208,"Nylon films",
+"unspsc",13111209,"Polycarbonate films",
+"unspsc",13111210,"Polyester films",
+"unspsc",13111211,"Polypropylene films",
+"unspsc",13111212,"Biaxially orientated polypropylene",
+"unspsc",13111213,"Polymide films",
+"unspsc",13111214,"Polystyrene films",
+"unspsc",13111215,"Flexible polyvinyl chloride film",
+"unspsc",13111216,"Rigid polyvinyl chloride film",
+"unspsc",13111217,"Ethylene vinyl alcohol film",
+"unspsc",13111218,"Polyvinylidene chloride",
+"unspsc",13111219,"Polyvinyl alcohol films",
+"unspsc",13111220,"Silicone coated films",
+"unspsc",13111300,"Foams",
+"unspsc",13111301,"Polyolefin foam",
+"unspsc",13111302,"Polyether foam",
+"unspsc",13111303,"Silicone foam",
+"unspsc",13111304,"Ethylene propylene terpolymer foam",
+"unspsc",13111305,"Neoprene foam",
+"unspsc",13111306,"Polyvinyl chloride foam",
+"unspsc",13111307,"Rubber foam",
+"unspsc",13111308,"Polystyrene foam",
+"unspsc",14000000,"Paper Materials and Products",
+"unspsc",14100000,"Paper materials",
+"unspsc",14101500,"Raw materials",
+"unspsc",14101501,"Paper pulp",
+"unspsc",14110000,"Paper products",
+"unspsc",14111500,"Printing and writing paper",
+"unspsc",14111501,"Onion skin paper",
+"unspsc",14111502,"Vellum paper",
+"unspsc",14111503,"Parchment paper",
+"unspsc",14111504,"Tractor feed paper",
+"unspsc",14111505,"Mimeograph paper",
+"unspsc",14111506,"Computer printout paper",
+"unspsc",14111507,"Printer or copier paper",
+"unspsc",14111508,"Facsimile paper",
+"unspsc",14111509,"Stationery",
+"unspsc",14111510,"Plotter paper",
+"unspsc",14111511,"Writing paper",
+"unspsc",14111512,"Graph paper",
+"unspsc",14111513,"Ledger paper",
+"unspsc",14111514,"Paper pads or notebooks",
+"unspsc",14111515,"Calculator or cash register paper",
+"unspsc",14111516,"Notebook filler paper",
+"unspsc",14111518,"Index cards",
+"unspsc",14111519,"Cardstock papers",
+"unspsc",14111520,"Blotter paper",
+"unspsc",14111523,"Tracing paper",
+"unspsc",14111524,"Foolscap sheets",
+"unspsc",14111525,"Multipurpose paper",
+"unspsc",14111526,"Telephone message pads or books",
+"unspsc",14111527,"Carbonless paper",
+"unspsc",14111528,"Magnet paper",
+"unspsc",14111529,"Telex rolls",
+"unspsc",14111530,"Self adhesive note paper",
+"unspsc",14111531,"Log books or pads",
+"unspsc",14111532,"Assorted paper kits",
+"unspsc",14111533,"Examination booklets or forms",
+"unspsc",14111534,"Music score or manuscript papers",
+"unspsc",14111535,"Telegraph papers",
+"unspsc",14111536,"Library book or borrowers cards",
+"unspsc",14111537,"Label papers",
+"unspsc",14111600,"Novelty paper",
+"unspsc",14111601,"Gift wrapping paper or bags or boxes",
+"unspsc",14111604,"Business cards",
+"unspsc",14111605,"Greeting or note or post cards",
+"unspsc",14111606,"Art or craft paper",
+"unspsc",14111607,"Poster boards",
+"unspsc",14111608,"Gift certificate",
+"unspsc",14111609,"Cover paper",
+"unspsc",14111610,"Construction paper",
+"unspsc",14111611,"Invitation or announcement cards",
+"unspsc",14111613,"Banner paper",
+"unspsc",14111614,"Album papers or tissues",
+"unspsc",14111615,"Poster papers",
+"unspsc",14111616,"Lining papers",
+"unspsc",14111700,"Personal paper products",
+"unspsc",14111701,"Facial tissues",
+"unspsc",14111702,"Toilet seat covers",
+"unspsc",14111703,"Paper towels",
+"unspsc",14111704,"Toilet tissue",
+"unspsc",14111705,"Paper napkins or serviettes",
+"unspsc",14111706,"Paper table cloth",
+"unspsc",14111800,"Business use papers",
+"unspsc",14111801,"Tickets or ticket rolls",
+"unspsc",14111802,"Receipts or receipt books",
+"unspsc",14111803,"Vouchers",
+"unspsc",14111804,"Bills or bill books",
+"unspsc",14111805,"Checks or check books",
+"unspsc",14111806,"Business forms or questionnaires",
+"unspsc",14111807,"Multipurpose business book",
+"unspsc",14111808,"Accounting forms or accounting books",
+"unspsc",14111809,"Bill of lading forms or bill of lading books",
+"unspsc",14111810,"Personnel forms or personnel books",
+"unspsc",14111811,"Sales forms or sales books",
+"unspsc",14111812,"Inventory forms or inventory books",
+"unspsc",14111813,"Correspondence forms or correspondence books",
+"unspsc",14111814,"Tax forms or tax books",
+"unspsc",14111815,"Tent cards",
+"unspsc",14111816,"Applicant fingerprint cards",
+"unspsc",14111817,"Deposit verification form",
+"unspsc",14111818,"Thermal paper",
+"unspsc",14120000,"Industrial use papers",
+"unspsc",14121500,"Paperboard and packaging papers",
+"unspsc",14121501,"Bleached paperboard",
+"unspsc",14121502,"Unbleached paperboard",
+"unspsc",14121503,"Cardboard",
+"unspsc",14121504,"Packaging paper",
+"unspsc",14121505,"Fiberboards",
+"unspsc",14121600,"Tissue papers",
+"unspsc",14121601,"Unbleached crepe papers",
+"unspsc",14121602,"Semi bleached crepe papers",
+"unspsc",14121603,"Wet strength tissue papers",
+"unspsc",14121604,"Acid free tissue papers",
+"unspsc",14121605,"Kraft tissue paper",
+"unspsc",14121700,"Laminated papers",
+"unspsc",14121701,"Papers bonded with film",
+"unspsc",14121702,"Cylinder papers or multi layer heavyweight paper",
+"unspsc",14121800,"Coated papers",
+"unspsc",14121801,"Clay coated papers",
+"unspsc",14121802,"Polyethylene coated papers",
+"unspsc",14121803,"Polyester coated papers",
+"unspsc",14121804,"Silicone coated papers",
+"unspsc",14121805,"Latex treated coated paper",
+"unspsc",14121806,"Waxed paper",
+"unspsc",14121807,"Butcher papers",
+"unspsc",14121808,"Freezer paper",
+"unspsc",14121809,"Masking paper",
+"unspsc",14121810,"Carbon papers",
+"unspsc",14121811,"Sensitized copying papers",
+"unspsc",14121812,"Photography paper",
+"unspsc",14121900,"Newsprint and offset papers",
+"unspsc",14121901,"Standard newsprint",
+"unspsc",14121902,"Colored newsprint",
+"unspsc",14121903,"High brightness newsprint",
+"unspsc",14121904,"Offset paper",
+"unspsc",14121905,"Tympan papers",
+"unspsc",14122100,"Uncoated base papers",
+"unspsc",14122101,"Super calendared kraft paper",
+"unspsc",14122102,"Machine finished or glazed kraft paper",
+"unspsc",14122103,"Non treated uncoated paper",
+"unspsc",14122104,"Non treated crepe paper",
+"unspsc",14122105,"Latex treated crepe paper",
+"unspsc",14122106,"Latex treated uncoated paper",
+"unspsc",14122200,"Specialty industrial use papers",
+"unspsc",14122201,"Seed germinating papers",
+"unspsc",15000000,"Fuels and Fuel Additives and Lubricants and Anti corrosive Materials",
+"unspsc",15100000,"Fuels",
+"unspsc",15101500,"Petroleum and distillates",
+"unspsc",15101502,"Kerosene",
+"unspsc",15101503,"Naphtha",
+"unspsc",15101504,"Aviation fuel",
+"unspsc",15101505,"Diesel fuel",
+"unspsc",15101506,"Gasoline or Petrol",
+"unspsc",15101507,"Benzene",
+"unspsc",15101508,"Crude oil",
+"unspsc",15101509,"Marine fuel",
+"unspsc",15101510,"Condensate",
+"unspsc",15101600,"Solid and gel fuels",
+"unspsc",15101601,"Coal",
+"unspsc",15101602,"Lignite",
+"unspsc",15101603,"Peat",
+"unspsc",15101604,"Coke",
+"unspsc",15101605,"Charcoal",
+"unspsc",15101606,"Jellied alcohol fuels",
+"unspsc",15101607,"Hexamines",
+"unspsc",15101608,"Trioxanes",
+"unspsc",15101700,"Fuel Oils",
+"unspsc",15101701,"#2 Heating fuel  oil",
+"unspsc",15101702,"#4 or #6 Residual heavy fuel oils ",
+"unspsc",15110000,"Gaseous fuels and additives",
+"unspsc",15111500,"Gaseous fuels",
+"unspsc",15111501,"Propane",
+"unspsc",15111502,"Methane",
+"unspsc",15111503,"Propylene",
+"unspsc",15111504,"Ethylene",
+"unspsc",15111505,"Butane",
+"unspsc",15111506,"Acetylene",
+"unspsc",15111507,"Water gas or producer gas",
+"unspsc",15111508,"Coal gas",
+"unspsc",15111509,"Methylacetylene propadiene MAPP gas",
+"unspsc",15111510,"Liquified petroleum gas",
+"unspsc",15111700,"Fuel additives",
+"unspsc",15111701,"Fuel thickeners",
+"unspsc",15111702,"Icing inhibitors for fuel systems",
+"unspsc",15120000,"Lubricants and oils and greases and anti corrosives",
+"unspsc",15121500,"Lubricating preparations",
+"unspsc",15121501,"Engine oil",
+"unspsc",15121502,"Cutting oil",
+"unspsc",15121503,"Gear oil",
+"unspsc",15121504,"Hydraulic oil",
+"unspsc",15121505,"Transformer oil",
+"unspsc",15121508,"Transmission oil",
+"unspsc",15121509,"Brake oil",
+"unspsc",15121510,"Antigalling",
+"unspsc",15121511,"Assembly pastes",
+"unspsc",15121512,"Anti adhesives",
+"unspsc",15121513,"Graphite lubricants",
+"unspsc",15121514,"Spray lubricants",
+"unspsc",15121515,"Anti seize or anti stain compounds",
+"unspsc",15121516,"Leak stop",
+"unspsc",15121517,"Lubricating soaps",
+"unspsc",15121518,"Damping fluids",
+"unspsc",15121519,"Watch lubricating oils",
+"unspsc",15121520,"General purpose lubricants",
+"unspsc",15121521,"Pump lubricating oils",
+"unspsc",15121522,"Weapon lubricating oils",
+"unspsc",15121523,"Lens preparation fluids",
+"unspsc",15121524,"Tempering oils",
+"unspsc",15121525,"Quenching oils",
+"unspsc",15121526,"Lubricants for food processing equipment",
+"unspsc",15121527,"Turbine oil",
+"unspsc",15121800,"Anti corrosives",
+"unspsc",15121801,"Moisture repellent",
+"unspsc",15121802,"Anti corrosion lubricant",
+"unspsc",15121803,"Rust remover",
+"unspsc",15121804,"Rust proofing preparation",
+"unspsc",15121805,"Anti weld pastes",
+"unspsc",15121806,"Penetrating oils",
+"unspsc",15121900,"Greases",
+"unspsc",15121901,"Silicone grease",
+"unspsc",15121902,"Grease",
+"unspsc",15121903,"Fluoropolymer grease",
+"unspsc",15121904,"Wool grease",
+"unspsc",15130000,"Fuel for nuclear reactors",
+"unspsc",15131500,"Nuclear fuel",
+"unspsc",15131502,"Depleted uranium",
+"unspsc",15131503,"Enriched uranium",
+"unspsc",15131504,"Iridium",
+"unspsc",15131505,"Enriched plutonium",
+"unspsc",15131506,"Depleted plutonium",
+"unspsc",15131600,"Fission fuel assemblies",
+"unspsc",15131601,"Nuclear fuel rod",
+"unspsc",20000000,"Mining and Well Drilling Machinery and Accessories",
+"unspsc",20100000,"Mining and quarrying machinery and equipment",
+"unspsc",20101500,"Cutting equipment",
+"unspsc",20101501,"Continuous mining equipment",
+"unspsc",20101502,"Longwall shears",
+"unspsc",20101503,"Coal cutters",
+"unspsc",20101504,"Rock cutters",
+"unspsc",20101600,"Screens and feeding equipment",
+"unspsc",20101601,"Screens",
+"unspsc",20101602,"Feeders",
+"unspsc",20101603,"Drain hole screen",
+"unspsc",20101700,"Crushers and breakers and grinders",
+"unspsc",20101701,"Rock crushers",
+"unspsc",20101702,"Roll crushers",
+"unspsc",20101703,"Cone crushers",
+"unspsc",20101704,"Gyratory crushers",
+"unspsc",20101705,"Impact crushers",
+"unspsc",20101706,"Jaw crushers",
+"unspsc",20101707,"Crushing plants",
+"unspsc",20101708,"Rod mills",
+"unspsc",20101709,"Ball mills",
+"unspsc",20101710,"Pulverizing machinery",
+"unspsc",20101711,"Rock breakers",
+"unspsc",20101712,"Earth grinders",
+"unspsc",20101713,"Cyclone or vortex grinders",
+"unspsc",20101714,"Jaw plates",
+"unspsc",20101800,"Mechanized ground support systems",
+"unspsc",20101801,"Cable bolters",
+"unspsc",20101802,"Scissor bolters",
+"unspsc",20101803,"Boom bolters",
+"unspsc",20101804,"Shotcrete spraying equipment",
+"unspsc",20101805,"Mechanized ground support system spare parts or accessories",
+"unspsc",20101900,"Secondary rock breaking systems",
+"unspsc",20101901,"Blockholer or drill and load systems",
+"unspsc",20101902,"Repetitive impact systems",
+"unspsc",20101903,"Secondary rock breaking system spare parts or accessories",
+"unspsc",20102000,"Exploration and development systems",
+"unspsc",20102001,"In the hole drills ITH or down the hole DTH long hole drills",
+"unspsc",20102002,"Top hammer long hole drills",
+"unspsc",20102003,"Pneumatic shaft sinking jumbos",
+"unspsc",20102004,"Hydraulic shaft sinking jumbos",
+"unspsc",20102005,"Pneumatic horizontal development jumbos",
+"unspsc",20102006,"Hydraulic horizontal development jumbos",
+"unspsc",20102007,"Core drills",
+"unspsc",20102008,"Exploration or development system spare parts or accessories",
+"unspsc",20102100,"Rock drills",
+"unspsc",20102101,"Pneumatic rock drills",
+"unspsc",20102102,"Hydraulic rock drills",
+"unspsc",20102103,"Hand held rock drills",
+"unspsc",20102104,"Rock drill spare parts or accessories",
+"unspsc",20102200,"Explosive loading machinery",
+"unspsc",20102201,"Ammonium nitrate and fuel oil ANFO loading machinery",
+"unspsc",20102202,"Emulsion loading machinery",
+"unspsc",20102203,"Explosive loading machinery spare parts or accessories",
+"unspsc",20102300,"Underground mining service vehicles",
+"unspsc",20102301,"Personnel carriers",
+"unspsc",20102302,"Crane vehicles",
+"unspsc",20102303,"Flat deck material carriers",
+"unspsc",20102304,"Bulk material carriers",
+"unspsc",20102305,"Utility service vehicles",
+"unspsc",20102306,"Elevating platform vehicles or scissor lifts",
+"unspsc",20102307,"Underground mining service vehicle spare parts or accessories",
+"unspsc",20110000,"Well drilling and operation equipment",
+"unspsc",20111500,"Drilling and exploration equipment",
+"unspsc",20111504,"Water well drilling equipment",
+"unspsc",20111505,"Uranium exploration equipment",
+"unspsc",20111600,"Drilling and operation machinery",
+"unspsc",20111601,"Boring or sinking machinery",
+"unspsc",20111602,"Downhole assembly machinery",
+"unspsc",20111603,"Hammer drills",
+"unspsc",20111604,"Crawler drills",
+"unspsc",20111606,"Pneumatic vibrators",
+"unspsc",20111607,"Tunneling machinery",
+"unspsc",20111608,"Striking hammers",
+"unspsc",20111609,"Sinker drills",
+"unspsc",20111610,"Sewer inspection machinery",
+"unspsc",20111611,"Rotary drills",
+"unspsc",20111612,"Drilling rigs",
+"unspsc",20111613,"Long hole drills",
+"unspsc",20111614,"Industrial drill bits",
+"unspsc",20111615,"Drifters",
+"unspsc",20111616,"Derricks",
+"unspsc",20111617,"Drilling carriages",
+"unspsc",20111618,"Downhole fishing poles",
+"unspsc",20111619,"Well drilling bit cones",
+"unspsc",20111700,"Drilling and operation accessories",
+"unspsc",20111701,"Audio visual instruments for well inspection",
+"unspsc",20111702,"Packers or tubing anchors",
+"unspsc",20111703,"Drilling casings",
+"unspsc",20111704,"Drilling screens",
+"unspsc",20111705,"Well points",
+"unspsc",20111706,"Drilling wedges",
+"unspsc",20111707,"Drilling tool adapters",
+"unspsc",20111708,"Drill stems",
+"unspsc",20111709,"Well drilling tool or accessory kits",
+"unspsc",20120000,"Oil and gas drilling and exploration equipment",
+"unspsc",20121000,"Acidizing equipment",
+"unspsc",20121001,"Acidizing blending units",
+"unspsc",20121002,"Acidizing density sensors",
+"unspsc",20121003,"Acidizing pumping units",
+"unspsc",20121004,"Acidizing units",
+"unspsc",20121005,"Acidizing air piping",
+"unspsc",20121006,"Acidizing ball injectors",
+"unspsc",20121007,"Bulk liquid acid equipment",
+"unspsc",20121008,"Acidizing drop boxes",
+"unspsc",20121009,"Acidizing flow meters",
+"unspsc",20121010,"Acidizing junction boxes",
+"unspsc",20121011,"Acidizing pressure sensors",
+"unspsc",20121012,"Acidizing process piping",
+"unspsc",20121013,"Acidizing straight joints",
+"unspsc",20121014,"Acidizing swivels",
+"unspsc",20121015,"Acidizing treating irons",
+"unspsc",20121016,"Acidizing tree savers",
+"unspsc",20121100,"Cementing equipment",
+"unspsc",20121101,"Blending units",
+"unspsc",20121102,"Bridge plugs",
+"unspsc",20121103,"Bulk liquid cement equipment",
+"unspsc",20121104,"Cement bulk material equipment",
+"unspsc",20121105,"Cement density sensors",
+"unspsc",20121106,"Cement floating bulk units",
+"unspsc",20121107,"Cement floating equipment stage tools",
+"unspsc",20121108,"Cement floating equipment wiper plugs",
+"unspsc",20121109,"Cement pumping units",
+"unspsc",20121110,"Cement retainers",
+"unspsc",20121111,"Centralizers",
+"unspsc",20121112,"Express latch couplers",
+"unspsc",20121113,"Float collars",
+"unspsc",20121114,"Float shoes",
+"unspsc",20121115,"Oilfield cementing tools",
+"unspsc",20121116,"Retrievable cementing packers",
+"unspsc",20121117,"Safety slings",
+"unspsc",20121118,"Subsea cement heads",
+"unspsc",20121119,"Surface cement heads",
+"unspsc",20121200,"Fracturing equipment",
+"unspsc",20121201,"Bulk liquid fracturing equipment",
+"unspsc",20121202,"Fracturing bulk proppant equipment",
+"unspsc",20121203,"Fracturing control units",
+"unspsc",20121204,"Fracturing density sensors",
+"unspsc",20121205,"Fracturing manifold units",
+"unspsc",20121206,"Fracturing proppant conveying equipment",
+"unspsc",20121207,"Fracturing pumping units",
+"unspsc",20121208,"Fracturing slurry blending units",
+"unspsc",20121209,"Gel blending units",
+"unspsc",20121210,"Fracturing missiles",
+"unspsc",20121211,"Pump integrity monitors",
+"unspsc",20121212,"Fracturing service packers",
+"unspsc",20121213,"Stimulation pumping units",
+"unspsc",20121300,"Sand control equipment",
+"unspsc",20121301,"Blanking plugs",
+"unspsc",20121302,"Floaters",
+"unspsc",20121303,"Frac pack systems",
+"unspsc",20121304,"Gravel pack systems",
+"unspsc",20121305,"Guide shoes",
+"unspsc",20121306,"Hook up nipples",
+"unspsc",20121307,"Make up subs",
+"unspsc",20121308,"Production tubing overshots",
+"unspsc",20121309,"Sand control blanks",
+"unspsc",20121310,"Sand control bulk liquid equipment",
+"unspsc",20121311,"Sand control bulk proppant equipment",
+"unspsc",20121312,"Sand control density sensors",
+"unspsc",20121313,"Sand control manifold units",
+"unspsc",20121314,"Sand control proppant conveying equipment",
+"unspsc",20121315,"Sand control pumping units",
+"unspsc",20121316,"Sand control screens",
+"unspsc",20121317,"Sand control slurry blending units",
+"unspsc",20121318,"Sand detectors",
+"unspsc",20121319,"Seal assembly locators",
+"unspsc",20121320,"Shear joints",
+"unspsc",20121321,"Sleeve shifting tools",
+"unspsc",20121322,"Sliding sleeves",
+"unspsc",20121323,"Velocity strings",
+"unspsc",20121400,"Completion tools and equipment",
+"unspsc",20121401,"Ball catcher subs",
+"unspsc",20121402,"Blast joints",
+"unspsc",20121403,"Blast nipples",
+"unspsc",20121404,"Completion bull plugs",
+"unspsc",20121405,"Circulation production devices",
+"unspsc",20121406,"Completion test equipment",
+"unspsc",20121407,"Control line protectors",
+"unspsc",20121408,"Deflection tools",
+"unspsc",20121409,"Completion expansion joints",
+"unspsc",20121410,"Flow couplings",
+"unspsc",20121411,"Gas lift equipment",
+"unspsc",20121412,"Hanger landing tools",
+"unspsc",20121413,"Completion hydraulic pumps",
+"unspsc",20121414,"Hydraulic setting tools",
+"unspsc",20121415,"Injection systems",
+"unspsc",20121416,"Landing nipples",
+"unspsc",20121417,"Liner hangers",
+"unspsc",20121418,"Packer pulling tools",
+"unspsc",20121419,"Packer running tools",
+"unspsc",20121420,"Production packers",
+"unspsc",20121421,"Pump down through flow line equipment",
+"unspsc",20121422,"Completion safety joints",
+"unspsc",20121423,"Completion seal assemblies",
+"unspsc",20121424,"Seal bores or polished bores",
+"unspsc",20121425,"Side pocket mandrels",
+"unspsc",20121427,"Subsurface safety valves",
+"unspsc",20121428,"Travel joints",
+"unspsc",20121429,"Tubing anchors",
+"unspsc",20121430,"Twin flow assemblies",
+"unspsc",20121500,"Conventional drilling tools",
+"unspsc",20121501,"Blowout preventers",
+"unspsc",20121502,"Blowout preventer controls",
+"unspsc",20121503,"Casing scrapers",
+"unspsc",20121504,"Drill collars",
+"unspsc",20121505,"Coring equipment",
+"unspsc",20121506,"Drill pipe thread protectors",
+"unspsc",20121507,"Drill pipe tool joints",
+"unspsc",20121508,"Drill pipe",
+"unspsc",20121509,"Gauge rings",
+"unspsc",20121510,"Hole openers",
+"unspsc",20121511,"Hole reamers",
+"unspsc",20121512,"Fishing jars",
+"unspsc",20121513,"Downhole shock absorbers",
+"unspsc",20121514,"Downhole stabilizers",
+"unspsc",20121515,"Drilling subs",
+"unspsc",20121516,"Thrusters",
+"unspsc",20121600,"Drilling bits",
+"unspsc",20121601,"Fixed cutter drill bits",
+"unspsc",20121602,"Natural diamond drill bits",
+"unspsc",20121603,"Nozzle drill bits",
+"unspsc",20121604,"PDC bits",
+"unspsc",20121605,"Roller cone button insert drill bits",
+"unspsc",20121606,"Roller steel tooth drill bits",
+"unspsc",20121607,"Core bits",
+"unspsc",20121700,"Fishing tools",
+"unspsc",20121701,"Bumper subs",
+"unspsc",20121702,"Casing patches",
+"unspsc",20121703,"Jar boosters",
+"unspsc",20121704,"Junk subs",
+"unspsc",20121705,"Mills or burning shoes",
+"unspsc",20121706,"Overshots",
+"unspsc",20121707,"Oilfield fishing spears",
+"unspsc",20121708,"Unspecified fishing tools",
+"unspsc",20121800,"Directional drilling equipment",
+"unspsc",20121801,"Geosteering tools",
+"unspsc",20121802,"Mud motors",
+"unspsc",20121803,"Rotary steerable tools",
+"unspsc",20121804,"Directional drilling surface control systems",
+"unspsc",20121805,"Straight hole directional drilling tools",
+"unspsc",20121900,"Well measurement and logging equipment",
+"unspsc",20121901,"Acoustic tools",
+"unspsc",20121902,"Drilling or mud control instruments",
+"unspsc",20121903,"Drilling performance measurement tools",
+"unspsc",20121904,"Flow measurement equipment",
+"unspsc",20121905,"Nuclear magnetic resonance tools",
+"unspsc",20121906,"Nuclear tools",
+"unspsc",20121907,"Production logging equipment",
+"unspsc",20121908,"Resistivity tools",
+"unspsc",20121909,"Surveying systems",
+"unspsc",20121910,"Telemetry systems",
+"unspsc",20121911,"Ultrasonic tools",
+"unspsc",20121912,"Well logging bottom hole pressure equipment",
+"unspsc",20121913,"Well logging downhole test equipment",
+"unspsc",20121914,"Well logging units",
+"unspsc",20122000,"Fixturing and test equipment",
+"unspsc",20122001,"Drift bars",
+"unspsc",20122002,"Drift sleeves",
+"unspsc",20122003,"Drift rabbits",
+"unspsc",20122004,"Test fixtures",
+"unspsc",20122005,"Test nipples",
+"unspsc",20122006,"Test plugs",
+"unspsc",20122100,"Perforating equipment",
+"unspsc",20122101,"Capsule guns",
+"unspsc",20122102,"Casing guns",
+"unspsc",20122103,"Deployment heads",
+"unspsc",20122104,"Perforating explosives",
+"unspsc",20122105,"Firing heads",
+"unspsc",20122106,"Gun adapters",
+"unspsc",20122107,"High shot density guns",
+"unspsc",20122108,"Perforating bull plugs",
+"unspsc",20122109,"Plug setting tools",
+"unspsc",20122110,"Perforating positioning equipment",
+"unspsc",20122111,"Scalloped guns",
+"unspsc",20122112,"Tandem subs",
+"unspsc",20122113,"Through tubing perforation gun accessories",
+"unspsc",20122114,"Through tubing perforation guns",
+"unspsc",20122115,"Under balance vent subs",
+"unspsc",20122200,"Well testing equipment",
+"unspsc",20122201,"Flare booms",
+"unspsc",20122202,"Flare burners",
+"unspsc",20122203,"Cased hole test tools",
+"unspsc",20122204,"Choke manifolds",
+"unspsc",20122205,"Diverting manifolds",
+"unspsc",20122206,"Flowhead baskets",
+"unspsc",20122207,"Flowhead swivels",
+"unspsc",20122208,"Flowheads",
+"unspsc",20122209,"Formation shut in tools",
+"unspsc",20122210,"Gas flares",
+"unspsc",20122211,"Mud gas analyzers",
+"unspsc",20122212,"Oil samplers",
+"unspsc",20122213,"Well testing separators",
+"unspsc",20122214,"Well testing surface piping",
+"unspsc",20122215,"Surge tanks",
+"unspsc",20122216,"Well testing downhole tools",
+"unspsc",20122300,"Slickline equipment",
+"unspsc",20122301,"Slickline adapter heads",
+"unspsc",20122302,"Slickline backoffs",
+"unspsc",20122303,"Slickline bell guides",
+"unspsc",20122304,"Slickline blind boxes",
+"unspsc",20122305,"Slickline bottom hole pressure equipment",
+"unspsc",20122306,"Slickline caliper tools",
+"unspsc",20122307,"Slickline cement dump bailing equipment",
+"unspsc",20122308,"Slickline chemical cutters",
+"unspsc",20122309,"Slickline clamp on tool string centralizers",
+"unspsc",20122310,"Slickline clamp on wireline centralizers",
+"unspsc",20122311,"Slickline collar locators",
+"unspsc",20122312,"Slickline collectors",
+"unspsc",20122313,"Slickline colliding tools",
+"unspsc",20122314,"Slickline crossovers",
+"unspsc",20122315,"Slickline depth measurement equipment",
+"unspsc",20122316,"Slickline dewar flasks",
+"unspsc",20122317,"Slickline dipmeter tools",
+"unspsc",20122318,"Slickline directional tools",
+"unspsc",20122319,"Slickline go devil tools",
+"unspsc",20122320,"Slickline hole punchers",
+"unspsc",20122321,"Slickline jet cutters",
+"unspsc",20122322,"Slickline junk shots",
+"unspsc",20122323,"Slickline kickover tools",
+"unspsc",20122324,"Slickline knuckle joints",
+"unspsc",20122325,"Slickline lead impression blocks",
+"unspsc",20122326,"Slickline locator mandrels",
+"unspsc",20122327,"Slickline lock mandrels",
+"unspsc",20122328,"Slickline lubricators",
+"unspsc",20122329,"Slickline mechanical bailers",
+"unspsc",20122330,"Slickline mechanical plugbacks",
+"unspsc",20122331,"Other Slickline Tools",
+"unspsc",20122332,"Slickline paraffin scrappers",
+"unspsc",20122333,"Slickline rope sockets",
+"unspsc",20122334,"Slickline running or pulling prongs",
+"unspsc",20122335,"Slickline severing tools",
+"unspsc",20122336,"Slickline sheaves or floor blocks",
+"unspsc",20122338,"Slickline pulling tool accessories",
+"unspsc",20122339,"Slickline pulling tools",
+"unspsc",20122340,"Slickline running tools",
+"unspsc",20122341,"Slickline units",
+"unspsc",20122342,"Slickline wire",
+"unspsc",20122343,"Slickline sonic tools",
+"unspsc",20122344,"Slickline spacer bars",
+"unspsc",20122345,"Slickline swages",
+"unspsc",20122346,"Slickline tension devices",
+"unspsc",20122347,"Slickline tubing plugs",
+"unspsc",20122348,"Slickline ultrasonic tools",
+"unspsc",20122349,"Wireline grabs",
+"unspsc",20122350,"Wireline jars",
+"unspsc",20122351,"Wireline scrapers",
+"unspsc",20122352,"Wireline spear",
+"unspsc",20122353,"Wireline stems",
+"unspsc",20122354,"Wireline valves",
+"unspsc",20122356,"Wireline preventers",
+"unspsc",20122357,"Wireline jar accelerators",
+"unspsc",20122400,"Production systems equipment",
+"unspsc",20122401,"Cable thumpers",
+"unspsc",20122402,"Oilfield production evaporators",
+"unspsc",20122403,"Hipot testers",
+"unspsc",20122404,"Oilfield lapping machines",
+"unspsc",20122405,"Motor end lifts",
+"unspsc",20122406,"Oil dielectric testers",
+"unspsc",20122407,"Oil vacuum filling units",
+"unspsc",20122408,"Oilfield production shaft straighteners",
+"unspsc",20122409,"Oilfield production spoolers",
+"unspsc",20122410,"Vibration analyzers",
+"unspsc",20122500,"Coiled tubing equipment",
+"unspsc",20122501,"Blaster tools",
+"unspsc",20122502,"Coiled tubing truck crane units",
+"unspsc",20122503,"Coiled tubing units",
+"unspsc",20122504,"Coiled tubing hose packages",
+"unspsc",20122505,"Coiled tubing inflatable systems",
+"unspsc",20122506,"Coiled tubing injector heads",
+"unspsc",20122507,"Coiled tubing lifting equipment",
+"unspsc",20122508,"Operator houses",
+"unspsc",20122509,"Coiled tubing power packs",
+"unspsc",20122510,"Coiled tubing reels",
+"unspsc",20122511,"Coiled tubing spooling reels",
+"unspsc",20122512,"Tubing guides",
+"unspsc",20122513,"Wellhead hookups",
+"unspsc",20122514,"Wellhead support structures",
+"unspsc",20122515,"Oilfield coiled tubing",
+"unspsc",20122600,"Seismic equipment",
+"unspsc",20122601,"Seismic analog sensors",
+"unspsc",20122602,"Seismic arrays",
+"unspsc",20122603,"Seismic streamer cable birds",
+"unspsc",20122604,"Seismic drill tankers",
+"unspsc",20122605,"Seismic geophones",
+"unspsc",20122606,"Seismic gravity systems",
+"unspsc",20122607,"Seismic gun winch systems",
+"unspsc",20122608,"Seismic hydrophones",
+"unspsc",20122609,"Seismic impulse sources",
+"unspsc",20122610,"Seismic marine streamer cables",
+"unspsc",20122611,"Seismic ocean bottom cables",
+"unspsc",20122612,"Seismic magnetic systems",
+"unspsc",20122613,"Seismic positioning equipment",
+"unspsc",20122614,"Seismic rams",
+"unspsc",20122615,"Seismic receivers",
+"unspsc",20122616,"Seismic refraction systems",
+"unspsc",20122617,"Seismic source controllers",
+"unspsc",20122618,"Seismic spooling devices",
+"unspsc",20122619,"Seismic tow blocks",
+"unspsc",20122620,"Seismic tow points",
+"unspsc",20122621,"Seismic vibrators",
+"unspsc",20122622,"Seismic recording systems",
+"unspsc",20122623,"Seismic data processing systems",
+"unspsc",20122700,"Oil country tubular goods",
+"unspsc",20122701,"Oil country casing",
+"unspsc",20122702,"Oil country couplings",
+"unspsc",20122703,"Oil country pup joints",
+"unspsc",20122704,"Oil country tubing",
+"unspsc",20122705,"Oil country pipe coatings",
+"unspsc",20122706,"Conductor casing",
+"unspsc",20122707,"Conductor casing running equipment",
+"unspsc",20122708,"Drill pipe crossovers",
+"unspsc",20122709,"Oil country thread protectors",
+"unspsc",20122800,"Drilling and workover rigs and equipment",
+"unspsc",20122801,"Mud agitators",
+"unspsc",20122802,"Mud tanks",
+"unspsc",20122803,"Air drilling equipment",
+"unspsc",20122804,"Barge rigs",
+"unspsc",20122806,"Fluid diverters",
+"unspsc",20122807,"Drawworks",
+"unspsc",20122808,"Drill floor equipment",
+"unspsc",20122809,"Drill swivels",
+"unspsc",20122810,"Drilling rig ships",
+"unspsc",20122811,"Drill rig elevators",
+"unspsc",20122812,"Drill rig bails",
+"unspsc",20122813,"Hydraulic workover units",
+"unspsc",20122814,"Drill rig jacking systems",
+"unspsc",20122815,"Jackup marine drilling rigs",
+"unspsc",20122816,"Kelly bushings",
+"unspsc",20122817,"Kelly valves",
+"unspsc",20122818,"Kelly wipers",
+"unspsc",20122819,"Kellys",
+"unspsc",20122820,"Land drilling rigs",
+"unspsc",20122821,"Mud cleaning equipment",
+"unspsc",20122822,"Mud manifolds",
+"unspsc",20122823,"Mud mixers",
+"unspsc",20122824,"Pipe handling equipment",
+"unspsc",20122825,"Platform drilling rigs",
+"unspsc",20122826,"Power swivel or top drives",
+"unspsc",20122827,"Rig skids",
+"unspsc",20122828,"Drill rig risers",
+"unspsc",20122829,"Drill rig rotary tables",
+"unspsc",20122830,"Self elevating workover platforms",
+"unspsc",20122831,"Semi submersible drilling rigs",
+"unspsc",20122832,"Drill floor slips",
+"unspsc",20122833,"Makeup tongs",
+"unspsc",20122834,"Iron roughnecks",
+"unspsc",20122835,"Traveling equipment",
+"unspsc",20122836,"Workover boats",
+"unspsc",20122837,"Workover rigs",
+"unspsc",20122838,"Shale shakers",
+"unspsc",20122839,"Mud degassers",
+"unspsc",20122840,"Crown blocks",
+"unspsc",20122841,"Traveling blocks",
+"unspsc",20122842,"Mud desanders",
+"unspsc",20122843,"Mud dessilters",
+"unspsc",20122900,"Surface data logging equipment",
+"unspsc",20122901,"Surface data logging conduits",
+"unspsc",20122902,"Surface data logging sensors",
+"unspsc",20122903,"Surface data logging units",
+"unspsc",20123000,"Multilateral equipment",
+"unspsc",20123001,"Multilateral casing",
+"unspsc",20123002,"Multilateral junctions",
+"unspsc",20123003,"Multilateral packers",
+"unspsc",20130000,"Oil and gas drilling and operation materials",
+"unspsc",20131000,"Drilling mud and materials",
+"unspsc",20131001,"Filtration control agents",
+"unspsc",20131002,"Fluid spacers",
+"unspsc",20131003,"Lost circulation agents",
+"unspsc",20131004,"Oil based muds",
+"unspsc",20131005,"Rate of penetration enhancers",
+"unspsc",20131006,"Spotting fluids",
+"unspsc",20131007,"Synthetic based muds",
+"unspsc",20131008,"Mud thinning agents",
+"unspsc",20131009,"Water based muds",
+"unspsc",20131010,"Mud weighting agents",
+"unspsc",20131100,"Well fracturing proppants",
+"unspsc",20131101,"Ceramic proppants",
+"unspsc",20131102,"Fracturing sands",
+"unspsc",20131103,"Resin coated ceramic proppants",
+"unspsc",20131104,"Resin coated fracturing sands",
+"unspsc",20131105,"Resin coated sintered bauxites",
+"unspsc",20131106,"Sintered bauxites",
+"unspsc",20131200,"Completion fluids",
+"unspsc",20131201,"Divalent brines",
+"unspsc",20131202,"Monovalent brines",
+"unspsc",20131300,"Oil well cement",
+"unspsc",20131301,"Oil well bulk cement",
+"unspsc",20131302,"Oil well class a type I cement",
+"unspsc",20131303,"Oil well class b type II cement",
+"unspsc",20131304,"Oil well class c cement",
+"unspsc",20131305,"Oil well class g cement",
+"unspsc",20131306,"Oil well class h cement",
+"unspsc",20131307,"Oil well lightweight cement",
+"unspsc",20131308,"Oil well standard fine type III cement",
+"unspsc",20140000,"Oil and gas operating and production equipment",
+"unspsc",20141000,"Wellhead equipment",
+"unspsc",20141001,"Wellhead actuators",
+"unspsc",20141002,"Wellhead beam pumps",
+"unspsc",20141003,"Wellhead flow lines",
+"unspsc",20141004,"Wellhead gate valves",
+"unspsc",20141005,"Wellhead production chokes",
+"unspsc",20141006,"Wellhead sub surface flow or christmas trees",
+"unspsc",20141007,"Wellhead surface flow or christmas trees",
+"unspsc",20141008,"Wellhead surface safety valves",
+"unspsc",20141011,"Tubing head adapter",
+"unspsc",20141012,"Casing head housing",
+"unspsc",20141013,"Tubing head spool",
+"unspsc",20141014,"Casing head spool",
+"unspsc",20141015,"Wellhead tees or crosses",
+"unspsc",20141100,"Chemical injection systems",
+"unspsc",20141101,"Paraffin injection systems",
+"unspsc",20141200,"Desanding equipment",
+"unspsc",20141201,"Production desanding equipment",
+"unspsc",20141300,"Downhole jet pumps and anchors",
+"unspsc",20141301,"Downhole jet pumps",
+"unspsc",20141400,"Downhole production accessories",
+"unspsc",20141401,"Tubing stops",
+"unspsc",20141500,"Downhole pumps",
+"unspsc",20141501,"Electric downhole pumps",
+"unspsc",20141600,"Export pumps",
+"unspsc",20141601,"Pneumatic export pumps",
+"unspsc",20141700,"Offshore production and storage platforms",
+"unspsc",20141701,"Fixed offshore production platforms",
+"unspsc",20141702,"Floating offshore production platforms",
+"unspsc",20141703,"Floating offshore storage platforms",
+"unspsc",20141704,"Floating offshore tension leg  production platforms",
+"unspsc",20141705,"Floating offshore tension leg storage platforms",
+"unspsc",20141800,"Well production flow measurement meters",
+"unspsc",20141801,"Well production gas turbine meters",
+"unspsc",20141900,"Gas treating equipment",
+"unspsc",20141901,"Oil well production gas treating equipment",
+"unspsc",20142000,"Glycol regenerators",
+"unspsc",20142001,"Oil well glycol regenerators",
+"unspsc",20142100,"Heater treaters",
+"unspsc",20142101,"Oil well heater treaters",
+"unspsc",20142200,"Line heaters",
+"unspsc",20142201,"Electrical line heaters",
+"unspsc",20142300,"Production injection skids",
+"unspsc",20142301,"Pneumatic methanol injections skids",
+"unspsc",20142400,"Ocean floor equipment",
+"unspsc",20142401,"Subsea production wellhead equipment",
+"unspsc",20142402,"Subsea umbilicals or flexible pipes",
+"unspsc",20142403,"Subsea production manifold system",
+"unspsc",20142404,"Vertical annular separation and pumping system",
+"unspsc",20142405,"Subsea christmas tree and component",
+"unspsc",20142500,"Produced water treating equipment",
+"unspsc",20142501,"Oil field water oil centrifuges",
+"unspsc",20142600,"Production control system instrumentation",
+"unspsc",20142601,"Wireless production control systems",
+"unspsc",20142700,"Pumping units",
+"unspsc",20142701,"Sucker rod pump jacks",
+"unspsc",20142702,"Rod pumps",
+"unspsc",20142703,"Mechanical rod pumps",
+"unspsc",20142800,"Production separators",
+"unspsc",20142801,"Oil water separators",
+"unspsc",20142900,"Storage vessels and tanks",
+"unspsc",20142901,"Oil storage tanks",
+"unspsc",20143000,"Sucker rods",
+"unspsc",20143001,"Alloy steel sucker rods",
+"unspsc",20143002,"Pony rods",
+"unspsc",21000000,"Farming and Fishing and Forestry and Wildlife Machinery and Accessories",
+"unspsc",21100000,"Agricultural and forestry and landscape machinery and equipment",
+"unspsc",21101500,"Agricultural machinery for soil preparation",
+"unspsc",21101501,"Ploughs",
+"unspsc",21101502,"Harrows",
+"unspsc",21101503,"Cultivators",
+"unspsc",21101504,"Weeders",
+"unspsc",21101505,"Hoeing machines",
+"unspsc",21101506,"Graders or land levelers",
+"unspsc",21101507,"Agricultural rollers",
+"unspsc",21101508,"Rollers for lawn or sports grounds",
+"unspsc",21101509,"Trencher drainage machine",
+"unspsc",21101510,"Irrigation pipes or tubes",
+"unspsc",21101511,"Irrigation trickles",
+"unspsc",21101512,"Irrigation overheads",
+"unspsc",21101513,"Disks",
+"unspsc",21101514,"Subsoilers",
+"unspsc",21101516,"Dibblers",
+"unspsc",21101600,"Agricultural machinery for planting and seeding",
+"unspsc",21101601,"Planters",
+"unspsc",21101602,"Transplanters",
+"unspsc",21101603,"Grain drills",
+"unspsc",21101604,"Seed drills",
+"unspsc",21101605,"Seed treating equipment",
+"unspsc",21101606,"Hole diggers",
+"unspsc",21101607,"Seeder attachment",
+"unspsc",21101700,"Agricultural machinery for harvesting",
+"unspsc",21101701,"Mowers",
+"unspsc",21101702,"Haymaking machinery",
+"unspsc",21101703,"Harvesters",
+"unspsc",21101704,"Combine harvesters",
+"unspsc",21101705,"Threshing machines",
+"unspsc",21101706,"Crop dividers",
+"unspsc",21101707,"Harvester parts or accessories",
+"unspsc",21101708,"Mower parts or accessories",
+"unspsc",21101800,"Dispersing and spraying appliances for agriculture",
+"unspsc",21101801,"Sprayers",
+"unspsc",21101802,"Dusters",
+"unspsc",21101803,"Water sprinklers",
+"unspsc",21101804,"Fertilizer spreaders or distributors",
+"unspsc",21101805,"Fog or mist generators",
+"unspsc",21101806,"Composter",
+"unspsc",21101807,"Pollination equipment or supplies",
+"unspsc",21101808,"Frost protection equipment",
+"unspsc",21101900,"Poultry and livestock equipment",
+"unspsc",21101901,"Milking machines",
+"unspsc",21101902,"Animal husbandry equipment",
+"unspsc",21101903,"Incubators or brooders for poultry",
+"unspsc",21101904,"Feed mixers",
+"unspsc",21101905,"Livestock identification equipment",
+"unspsc",21101906,"Egg inspection or collecting equipment",
+"unspsc",21101907,"Animal watering machines",
+"unspsc",21101908,"Milk cooling tanks",
+"unspsc",21101909,"Animal shearing or clipping equipment",
+"unspsc",21102000,"Agricultural machinery for cleaning and sorting and grading",
+"unspsc",21102001,"Cleaning machines for seed or grain or dried leguminous vegetables",
+"unspsc",21102002,"Sorting machines for seed or grain or dried leguminous vegetables",
+"unspsc",21102003,"Grading machines for seed or grain or dried leguminous vegetables",
+"unspsc",21102004,"Rice cleaning or hulling equipment",
+"unspsc",21102005,"Grinding mills",
+"unspsc",21102006,"Hammer mills",
+"unspsc",21102100,"Agricultural processing machinery and equipment",
+"unspsc",21102101,"Agricultural briquetting or pelting machines",
+"unspsc",21102200,"Forestry machinery and equipment",
+"unspsc",21102201,"Decorticators",
+"unspsc",21102202,"Lumbering equipment",
+"unspsc",21102203,"Reforestation equipment",
+"unspsc",21102204,"Forestry saws",
+"unspsc",21102205,"Forestry skidders",
+"unspsc",21102206,"Forestry increment borers",
+"unspsc",21102207,"Forestry ipsometer",
+"unspsc",21102300,"Greenhouse equipment",
+"unspsc",21102301,"Greenhouse irrigation equipment",
+"unspsc",21102302,"Greenhouse pots",
+"unspsc",21102303,"Greenhouse ventilation equipment",
+"unspsc",21102304,"Greenhouse isolation equipment",
+"unspsc",21102400,"Insect equipment",
+"unspsc",21102401,"Beekeeping equipment",
+"unspsc",21102402,"Silkworm equipment",
+"unspsc",21102403,"Butterfly breeding equipment",
+"unspsc",21102404,"Beetle breeding equipment",
+"unspsc",21110000,"Fishing and aquaculture equipment",
+"unspsc",21111500,"Commercial fishing equipment",
+"unspsc",21111501,"Commercial fish hooks",
+"unspsc",21111502,"Commercial fishing reels",
+"unspsc",21111503,"Commercial fishing line tackle",
+"unspsc",21111504,"Commercial fishing nets",
+"unspsc",21111506,"Commercial fishing floats",
+"unspsc",21111507,"Commercial sinkers or weights",
+"unspsc",21111508,"Fishing net haulers",
+"unspsc",21111600,"Aquaculture equipment",
+"unspsc",21111601,"Marine hatchery equipment",
+"unspsc",21111602,"Pisciculture supplies",
+"unspsc",22000000,"Building and Construction Machinery and Accessories",
+"unspsc",22100000,"Heavy construction machinery and equipment",
+"unspsc",22101500,"Earth moving machinery",
+"unspsc",22101501,"Front end loaders",
+"unspsc",22101502,"Graders",
+"unspsc",22101504,"Pile drivers",
+"unspsc",22101505,"Rollers",
+"unspsc",22101507,"Tampers",
+"unspsc",22101508,"Trenching machines",
+"unspsc",22101509,"Backhoes",
+"unspsc",22101511,"Compactors",
+"unspsc",22101513,"Draglines",
+"unspsc",22101514,"Dredgers",
+"unspsc",22101516,"Ditchers",
+"unspsc",22101518,"Elevating scrapers",
+"unspsc",22101519,"Twin engine open bowl scrapers",
+"unspsc",22101520,"Twin engine elevating scrapers",
+"unspsc",22101521,"Pulled scrapers",
+"unspsc",22101522,"Track bulldozers",
+"unspsc",22101523,"Wheel bulldozers",
+"unspsc",22101524,"Mobile excavators",
+"unspsc",22101525,"Wheel excavators",
+"unspsc",22101526,"Track excavators",
+"unspsc",22101527,"Integrated tool carriers",
+"unspsc",22101528,"Wheel loaders",
+"unspsc",22101529,"Skid steer loaders",
+"unspsc",22101530,"Open bowl scrapers",
+"unspsc",22101531,"Snow blowers",
+"unspsc",22101532,"Track loaders",
+"unspsc",22101533,"Treedozers",
+"unspsc",22101534,"Combat earthmovers",
+"unspsc",22101600,"Paving equipment",
+"unspsc",22101602,"Ramming equipment",
+"unspsc",22101603,"Road wideners",
+"unspsc",22101604,"Vibratory plates",
+"unspsc",22101605,"Asphalt finishers",
+"unspsc",22101606,"Chip Spreaders",
+"unspsc",22101607,"Road pavers",
+"unspsc",22101608,"Cold planers",
+"unspsc",22101609,"Paving material mixers",
+"unspsc",22101610,"Aggregate spreaders",
+"unspsc",22101611,"Bituminous material distributors",
+"unspsc",22101612,"Road rooters",
+"unspsc",22101613,"Road surface heater planers",
+"unspsc",22101614,"Concrete paving strike offs",
+"unspsc",22101615,"Paving breakers",
+"unspsc",22101616,"Curbing machines",
+"unspsc",22101617,"Grouting machines",
+"unspsc",22101618,"Trackway surfacing outfits or its laying mechanisms",
+"unspsc",22101619,"Scrubbing machines",
+"unspsc",22101620,"Joint cleaning or refacing machines",
+"unspsc",22101700,"Heavy equipment components",
+"unspsc",22101701,"Earthmoving shovels",
+"unspsc",22101702,"Earthmoving buckets or its parts or accessories",
+"unspsc",22101703,"Blades or tooth or other cutting edges",
+"unspsc",22101704,"Scarifiers",
+"unspsc",22101705,"Track links or track shoes or its parts",
+"unspsc",22101706,"Dippers",
+"unspsc",22101707,"Taglines",
+"unspsc",22101708,"Rippers",
+"unspsc",22101709,"Grapples",
+"unspsc",22101710,"Snowplow attachments",
+"unspsc",22101711,"Paving breaker tools or accessories",
+"unspsc",22101712,"Pile driver tools or its parts or accessories",
+"unspsc",22101713,"Backhoe boom or boom sections",
+"unspsc",22101714,"Tamper parts or repair kits",
+"unspsc",22101715,"Batching plants or feeders",
+"unspsc",22101716,"Construction machinery conversion kits",
+"unspsc",22101717,"Earth moving moldboards",
+"unspsc",22101718,"Grader control systems",
+"unspsc",22101719,"Grader frame saddles",
+"unspsc",22101720,"Trencher crumber shoes",
+"unspsc",22101800,"Aerial lifts",
+"unspsc",22101801,"Manlift or personnel lift",
+"unspsc",22101802,"Platform lift",
+"unspsc",22101803,"Articulating boom lift",
+"unspsc",22101804,"Telescoping boom lift",
+"unspsc",22101900,"Building construction machinery and accessories",
+"unspsc",22101901,"Concrete mixers or plants",
+"unspsc",22101902,"Plaster or mortar mixers",
+"unspsc",22101903,"Rotary tiller mixers",
+"unspsc",22101904,"Curing machines",
+"unspsc",22101905,"Concrete spreaders",
+"unspsc",22101906,"Shoring equipment",
+"unspsc",22101907,"Trench braces",
+"unspsc",22102000,"Building demolition machinery and equipment",
+"unspsc",22102001,"Demolition equipment kits",
+"unspsc",23000000,"Industrial Manufacturing and Processing Machinery and Accessories",
+"unspsc",23100000,"Raw materials processing machinery",
+"unspsc",23101500,"Machinery for working wood and stone and ceramic and the like",
+"unspsc",23101501,"Coping machines",
+"unspsc",23101502,"Drilling machines",
+"unspsc",23101503,"Broaching machines",
+"unspsc",23101504,"Bending machines",
+"unspsc",23101505,"Boring machines",
+"unspsc",23101506,"Grinding machines",
+"unspsc",23101507,"Molding machines",
+"unspsc",23101508,"Cutting machines",
+"unspsc",23101509,"Sanding machines",
+"unspsc",23101510,"Polishing machines",
+"unspsc",23101511,"Turning machines",
+"unspsc",23101512,"Sawing machines",
+"unspsc",23101513,"Milling machines",
+"unspsc",23101514,"Planing machines",
+"unspsc",23101515,"Engraving machines",
+"unspsc",23101516,"Glass bead peener machines",
+"unspsc",23101517,"Grit blast machines",
+"unspsc",23101518,"Shot peen machine",
+"unspsc",23101519,"Robot machines",
+"unspsc",23101520,"Ram electro discharge machines",
+"unspsc",23101521,"Wire cathode electrode discharge machine",
+"unspsc",23101522,"Chip breaker",
+"unspsc",23110000,"Petroleum processing machinery",
+"unspsc",23111500,"Petroleum distilling and processing machinery and equipment",
+"unspsc",23111501,"Distillate hydroprocessing equipment",
+"unspsc",23111502,"Crude distilling machinery",
+"unspsc",23111503,"Catalytic cracking equipment",
+"unspsc",23111504,"Hydrocracking equipment",
+"unspsc",23111505,"Isomerization machinery",
+"unspsc",23111506,"Coking machinery",
+"unspsc",23111507,"Gas recovery machinery",
+"unspsc",23111600,"Hydrotreating machinery",
+"unspsc",23111601,"Naptha hydrotreater",
+"unspsc",23111602,"Distillate hydrotreater",
+"unspsc",23111603,"Catalytic feed hydrotreater",
+"unspsc",23111604,"Lube hydrotreater",
+"unspsc",23111605,"Gasoline hydrotreater",
+"unspsc",23111606,"Resid hydrotreater",
+"unspsc",23120000,"Textile and fabric machinery and accessories",
+"unspsc",23121500,"Textile processing machinery and accessories",
+"unspsc",23121501,"Embroidery making machines",
+"unspsc",23121502,"Felting machines",
+"unspsc",23121503,"Winding or reeling or spooling machines",
+"unspsc",23121504,"Twisting machines",
+"unspsc",23121505,"Stitch bonding machines",
+"unspsc",23121506,"Knitting machines",
+"unspsc",23121507,"Weaving machines",
+"unspsc",23121508,"Finishing machines",
+"unspsc",23121509,"Spinning machines",
+"unspsc",23121510,"Lace making machines",
+"unspsc",23121600,"Textile working machinery and equipment and accessories",
+"unspsc",23121601,"Button covering machines",
+"unspsc",23121602,"Button sewing machines",
+"unspsc",23121603,"Buttonhole machines",
+"unspsc",23121604,"Cloth cutting machines",
+"unspsc",23121605,"Cushion filling machines",
+"unspsc",23121606,"Folding or rewinding machines",
+"unspsc",23121607,"Bleaching machines",
+"unspsc",23121608,"Fabric or cloth folding machines",
+"unspsc",23121609,"Reeling or unreeling machines",
+"unspsc",23121610,"Dyeing machines",
+"unspsc",23121611,"Cutting or pinking machines",
+"unspsc",23121612,"Sewing machine needles",
+"unspsc",23121613,"Silk processing machines",
+"unspsc",23121614,"Sewing machines",
+"unspsc",23121615,"Fabric cutting tables",
+"unspsc",23130000,"Lapidary machinery and equipment",
+"unspsc",23131500,"Grinding and sanding and polishing equipment and supplies",
+"unspsc",23131501,"Abrasive compounds",
+"unspsc",23131502,"Felt wheels",
+"unspsc",23131503,"Grinding wheels",
+"unspsc",23131504,"Polishing compounds",
+"unspsc",23131505,"Polishing heads",
+"unspsc",23131506,"Polishing wheels",
+"unspsc",23131507,"Sanding cloths",
+"unspsc",23131508,"Sanding drums",
+"unspsc",23131509,"Tumblers or polishers",
+"unspsc",23131510,"Tumbling supplies or media",
+"unspsc",23131511,"Water swivels",
+"unspsc",23131512,"Water trays",
+"unspsc",23131513,"Sanding blocks",
+"unspsc",23131514,"Mounted stones",
+"unspsc",23131515,"Grinding wheel dressers",
+"unspsc",23131600,"Faceting equipment and accessories",
+"unspsc",23131601,"Faceting accessories",
+"unspsc",23131602,"Faceting machines",
+"unspsc",23131603,"Faceting laps",
+"unspsc",23131604,"Faceting saws",
+"unspsc",23131700,"Cabbing equipment",
+"unspsc",23131701,"Cabbing accessories",
+"unspsc",23131702,"Cabbing belts",
+"unspsc",23131703,"Cabbing discs",
+"unspsc",23131704,"Cabochon machines",
+"unspsc",23140000,"Leatherworking repairing machinery and equipment",
+"unspsc",23141600,"Leather preparing machinery and accessories",
+"unspsc",23141601,"Leather fleshing machines",
+"unspsc",23141602,"Leather tanning machines",
+"unspsc",23141603,"Leather dyeing machines",
+"unspsc",23141604,"Leather degreasing machines",
+"unspsc",23141605,"Leather presses",
+"unspsc",23141700,"Leather working and repairing machinery and accessories",
+"unspsc",23141701,"Leather cutting machines",
+"unspsc",23141702,"Leather riveting machines",
+"unspsc",23141703,"Leather nailing machines",
+"unspsc",23141704,"Leatherworking workshop equipment",
+"unspsc",23150000,"Industrial process machinery and equipment and supplies",
+"unspsc",23151500,"Rubber and plastic processing machinery and equipment and supplies",
+"unspsc",23151501,"Blow molding machines",
+"unspsc",23151502,"Coating machines",
+"unspsc",23151503,"Extruders",
+"unspsc",23151504,"Injection molding machines",
+"unspsc",23151506,"Rubber or plastic presses",
+"unspsc",23151507,"Thermo forming machines",
+"unspsc",23151508,"Vacuum molding machines",
+"unspsc",23151509,"Vulcanizing machines",
+"unspsc",23151510,"Plastic cutting machinery",
+"unspsc",23151511,"Plastic grinding machinery",
+"unspsc",23151512,"Rubber or plastic mills",
+"unspsc",23151513,"Rubber or plastic extrusion dies",
+"unspsc",23151514,"Plastic injection molds",
+"unspsc",23151515,"Thermoforming molds",
+"unspsc",23151516,"Ejector pins",
+"unspsc",23151600,"Cement and ceramics and glass industry machinery and equipment and supplies",
+"unspsc",23151601,"Blowers or dryers",
+"unspsc",23151602,"Crushers",
+"unspsc",23151603,"Fusion welding or glass drawing machines",
+"unspsc",23151604,"Grinding or polishing machines",
+"unspsc",23151606,"Cement or ceramic or glass or similar material molding machines",
+"unspsc",23151607,"Presses",
+"unspsc",23151608,"Sifters",
+"unspsc",23151700,"Optical industry machinery and equipment and supplies",
+"unspsc",23151701,"Lens grinding machines",
+"unspsc",23151702,"Lens measuring equipment",
+"unspsc",23151703,"Lens polishing equipment",
+"unspsc",23151704,"Lens testing equipment",
+"unspsc",23151705,"Optical vacuum coating equipment",
+"unspsc",23151800,"Pharmaceutical industry machinery and equipment and supplies",
+"unspsc",23151801,"Ampoule filling equipment",
+"unspsc",23151802,"Bottle cappers or cotton inserters or safety seal applicators",
+"unspsc",23151803,"Capsulating machines",
+"unspsc",23151804,"Reactors or fermenters or digesters",
+"unspsc",23151805,"Filling or sealing auger dose machines",
+"unspsc",23151806,"Pharmaceutical filters or ultra filters",
+"unspsc",23151807,"Freezedryers or lyophilzers",
+"unspsc",23151808,"Granulators",
+"unspsc",23151809,"Pharmaceutical sieve or screening machines",
+"unspsc",23151810,"Sterile or aseptic processing or filling machines",
+"unspsc",23151811,"Tablet or capsule testing machines",
+"unspsc",23151812,"Tablet counters",
+"unspsc",23151813,"Tabletting machines",
+"unspsc",23151814,"Vaccine production equipment",
+"unspsc",23151816,"Chromatography columns",
+"unspsc",23151817,"Chromatography media",
+"unspsc",23151818,"Sterility test devices",
+"unspsc",23151819,"Filter integrity testers",
+"unspsc",23151820,"Pressure gauge",
+"unspsc",23151821,"Filter cartridge adapter",
+"unspsc",23151822,"Adapters or connectors or fittings for pharmaceutical filter housings",
+"unspsc",23151823,"Diagnostic radiopharmaceutical",
+"unspsc",23151900,"Paper making and paper processing machinery and equipment and supplies",
+"unspsc",23151901,"Cutters",
+"unspsc",23151902,"Slitters",
+"unspsc",23151903,"Washing or dewatering machines",
+"unspsc",23151904,"Winders",
+"unspsc",23151905,"Wood pulp or dissolver machines",
+"unspsc",23151906,"Calenders for paper or cardboard making",
+"unspsc",23152000,"Web handling and control machinery and equipment and supplies",
+"unspsc",23152001,"Corona treaters",
+"unspsc",23152002,"Flame treaters",
+"unspsc",23152100,"Separation machinery and equipment",
+"unspsc",23152101,"Vibratory separation equipment or parts or screens",
+"unspsc",23152102,"Stationary separation equipment or parts or screens",
+"unspsc",23152103,"Air classification equipment or parts or screens",
+"unspsc",23152104,"Centrifugal separation equipment or parts or screens",
+"unspsc",23152200,"Manufacturing tables and stands",
+"unspsc",23152201,"Rotary tables",
+"unspsc",23152202,"Stack stands",
+"unspsc",23152203,"Engine or component test stands",
+"unspsc",23152204,"Machine guarding",
+"unspsc",23152205,"Band saw tables",
+"unspsc",23152206,"Barrier guarding",
+"unspsc",23152900,"Packaging machinery",
+"unspsc",23152901,"Wrapping machinery",
+"unspsc",23152902,"Form or fill or seal machinery",
+"unspsc",23152903,"Packaging vacuum",
+"unspsc",23152904,"Packaging hoppers",
+"unspsc",23152905,"Carton forming machines",
+"unspsc",23152906,"Taping machines",
+"unspsc",23153000,"Holding and positioning and guiding systems and devices",
+"unspsc",23153001,"Calibration jig",
+"unspsc",23153002,"Guide jig",
+"unspsc",23153003,"Master jig",
+"unspsc",23153004,"Needle jig",
+"unspsc",23153005,"Shaft jig",
+"unspsc",23153006,"Checking jig",
+"unspsc",23153007,"Setting jig",
+"unspsc",23153008,"Camera jig",
+"unspsc",23153009,"Pickup jig",
+"unspsc",23153010,"Removal jig",
+"unspsc",23153011,"Nozzle jig",
+"unspsc",23153012,"Sliding jig",
+"unspsc",23153013,"Centering jig",
+"unspsc",23153014,"Inspecting jig",
+"unspsc",23153015,"Feeder jig",
+"unspsc",23153016,"Clutch jig",
+"unspsc",23153017,"Alignment jig",
+"unspsc",23153018,"Positioning jig",
+"unspsc",23153019,"Lifter plate",
+"unspsc",23153020,"Tape guide",
+"unspsc",23153021,"Tape feed jaw",
+"unspsc",23153022,"Power feeder",
+"unspsc",23153023,"Feeder harness",
+"unspsc",23153024,"Feed jaw",
+"unspsc",23153025,"Mechanical gripper",
+"unspsc",23153026,"Holder jaw",
+"unspsc",23153027,"Jaw assembly",
+"unspsc",23153028,"Stationary jaw",
+"unspsc",23153029,"Jig block",
+"unspsc",23153030,"Linear motion guides",
+"unspsc",23153031,"Measuring jigs",
+"unspsc",23153032,"Ring jigs",
+"unspsc",23153033,"Throat plate",
+"unspsc",23153034,"Machine rails",
+"unspsc",23153035,"Finger plates",
+"unspsc",23153036,"Keeper plates",
+"unspsc",23153037,"Feed roll assembly",
+"unspsc",23153100,"Industrial machinery components and accessories",
+"unspsc",23153101,"Pitch stopper",
+"unspsc",23153102,"Paper stopper",
+"unspsc",23153103,"Stopper pad",
+"unspsc",23153129,"Machine way wipers",
+"unspsc",23153130,"Machine mounts or vibration isolators",
+"unspsc",23153131,"Wear plates or bars or strips",
+"unspsc",23153132,"Dust deflectors",
+"unspsc",23153133,"Sprocket hubs",
+"unspsc",23153134,"Feed or drive rollers",
+"unspsc",23153135,"Feed roller covers",
+"unspsc",23153136,"Saw dust chutes",
+"unspsc",23153137,"Machinery dust covers",
+"unspsc",23153138,"Cutting or chipping heads",
+"unspsc",23153139,"Guide beds",
+"unspsc",23153140,"Link arms",
+"unspsc",23153200,"Robotics",
+"unspsc",23153201,"Paint robots",
+"unspsc",23153202,"Pick or place robots",
+"unspsc",23153203,"Sealant adhesive robots",
+"unspsc",23153204,"Welding robots",
+"unspsc",23153300,"Cutting tools",
+"unspsc",23153301,"Drills",
+"unspsc",23153302,"Reamer cutting tool",
+"unspsc",23153303,"Form tools or toolbits",
+"unspsc",23153305,"Taps or dies",
+"unspsc",23153306,"Broach cutting tool",
+"unspsc",23153307,"Gear cutting tools",
+"unspsc",23153308,"Indexable tool bodies or holders",
+"unspsc",23153309,"Indexable inserts for cutting tools",
+"unspsc",23153310,"Rotary burrs",
+"unspsc",23153311,"Regrind or reclaim or coating services for cutting tools",
+"unspsc",23153312,"Countesink tool or counterbore tool",
+"unspsc",23153313,"Machinery cutting knives or knife assemblies",
+"unspsc",23153400,"Assembly machines",
+"unspsc",23153401,"Adhesive or glue application systems",
+"unspsc",23153402,"Assembly fixtures",
+"unspsc",23153403,"Specialty assembly",
+"unspsc",23153404,"Assembly systems for chassis vehicle operation VO",
+"unspsc",23153405,"Unlimited component assembly",
+"unspsc",23153406,"Powertrain complete lines",
+"unspsc",23153407,"Surface mount device",
+"unspsc",23153408,"Fill test",
+"unspsc",23153409,"Non portable nutrunner multispindle",
+"unspsc",23153410,"Body skids",
+"unspsc",23153411,"Tire mounting inflating",
+"unspsc",23153412,"Gullotine Shears",
+"unspsc",23153413,"Glass insertion pick up PU application",
+"unspsc",23153414,"Articulating lazy arms",
+"unspsc",23153415,"Automatic chassis decking",
+"unspsc",23153416,"Flexible componets",
+"unspsc",23153417,"Miscellaneous assembly machines",
+"unspsc",23153500,"Paint systems",
+"unspsc",23153501,"Paint application system",
+"unspsc",23153502,"Paint booth repair",
+"unspsc",23153503,"Paint systems ovens",
+"unspsc",23153504,"Paint plant layout or engineering",
+"unspsc",23153505,"Turn key paint system",
+"unspsc",23153506,"Phosphate or e coat paint system",
+"unspsc",23153507,"Miscellaneous or miscellaneous paint shop",
+"unspsc",23153508,"Miscellaneous paint systems",
+"unspsc",23160000,"Foundry  machines and equipment and supplies",
+"unspsc",23161500,"Foundry machines and equipment",
+"unspsc",23161501,"Foundry blowers",
+"unspsc",23161502,"Foundry burners",
+"unspsc",23161503,"Core drying ovens",
+"unspsc",23161504,"Forging presses",
+"unspsc",23161506,"Foundry crucibles",
+"unspsc",23161507,"Foundry converters",
+"unspsc",23161508,"Open die forging press",
+"unspsc",23161509,"Forging stamping machines",
+"unspsc",23161510,"Casting machines",
+"unspsc",23161511,"Forging rolls",
+"unspsc",23161512,"Radial forging machines",
+"unspsc",23161513,"Cold forming presses",
+"unspsc",23161514,"Sizing or embossing presses",
+"unspsc",23161515,"End forging machines",
+"unspsc",23161600,"Foundry supplies",
+"unspsc",23161601,"Foundry bellows",
+"unspsc",23161602,"Foundry clays",
+"unspsc",23161603,"Foundry flasks",
+"unspsc",23161605,"Foundry ladles",
+"unspsc",23161606,"Foundry molds",
+"unspsc",23161607,"Foundry sand",
+"unspsc",23161608,"Foundry shovels",
+"unspsc",23170000,"Workshop machinery and equipment and supplies",
+"unspsc",23171500,"Soldering and brazing and welding machinery and supplies",
+"unspsc",23171501,"Anti spatter sprays",
+"unspsc",23171502,"Gas welding or brazing rods",
+"unspsc",23171504,"Blow pipes",
+"unspsc",23171505,"Iron powder",
+"unspsc",23171506,"Soldering fluid",
+"unspsc",23171507,"Soldering irons or guns",
+"unspsc",23171508,"Welders",
+"unspsc",23171509,"Solder",
+"unspsc",23171510,"Welding wire",
+"unspsc",23171511,"Welding tools",
+"unspsc",23171512,"Welding rods",
+"unspsc",23171513,"Welding rectifiers",
+"unspsc",23171514,"Welding generators",
+"unspsc",23171515,"Welding electrodes",
+"unspsc",23171517,"Blow torches",
+"unspsc",23171518,"Plasma welding machinery",
+"unspsc",23171519,"Tungsten inert gas TIG welding machinery",
+"unspsc",23171520,"Ultrasound welding machinery",
+"unspsc",23171521,"Laser welding machinery",
+"unspsc",23171522,"Soldering fluxes",
+"unspsc",23171523,"Temperature indicating sticks",
+"unspsc",23171524,"Braze rings",
+"unspsc",23171525,"Soldering tips",
+"unspsc",23171526,"Desoldering tips",
+"unspsc",23171527,"Desoldering braid",
+"unspsc",23171528,"Welding screens or curtains",
+"unspsc",23171529,"Welding or soldering kit",
+"unspsc",23171530,"Soldering or desoldering or combined stations",
+"unspsc",23171531,"Desoldering Gun",
+"unspsc",23171532,"Desoldering pump",
+"unspsc",23171533,"Welding fluxes",
+"unspsc",23171534,"Brazing fluxes",
+"unspsc",23171535,"Welding or cutting tips",
+"unspsc",23171536,"Electrode holders",
+"unspsc",23171537,"Welding or brazing tip cleaner files",
+"unspsc",23171538,"Welding tip dressers or accessories",
+"unspsc",23171539,"Welding tip dresser blades",
+"unspsc",23171540,"Metal inert gas MIG welding machinery",
+"unspsc",23171541,"Gas welding or brazing or cutting apparatus",
+"unspsc",23171600,"Machine tools",
+"unspsc",23171602,"Bar or rod cutters",
+"unspsc",23171603,"Pipe or tube cutters",
+"unspsc",23171604,"Wire or cable cutters",
+"unspsc",23171605,"Deburring equipment",
+"unspsc",23171606,"Lathes",
+"unspsc",23171607,"Lathe tools or dies",
+"unspsc",23171608,"Laser cutting tools",
+"unspsc",23171609,"Twist drills",
+"unspsc",23171610,"Reamers",
+"unspsc",23171611,"Counterbores",
+"unspsc",23171612,"Milling cutters",
+"unspsc",23171613,"Hobs",
+"unspsc",23171614,"Gear shapers",
+"unspsc",23171615,"Shaving cutters",
+"unspsc",23171616,"Abrasive jet machining equipment",
+"unspsc",23171617,"Broaching tools",
+"unspsc",23171618,"Indexable inserts",
+"unspsc",23171619,"Boring tools",
+"unspsc",23171620,"Broaches",
+"unspsc",23171621,"Insertion tools",
+"unspsc",23171622,"Workshop presses",
+"unspsc",23171623,"Resurfacers",
+"unspsc",23171700,"Metal bending and forming machinery",
+"unspsc",23171701,"Tangent benders",
+"unspsc",23171702,"Wing benders",
+"unspsc",23171703,"Tube bending machinery",
+"unspsc",23171704,"Pipe bending mandrels",
+"unspsc",23171705,"Die bends",
+"unspsc",23171706,"Sequential forming machines",
+"unspsc",23171707,"Tube end finishers",
+"unspsc",23171708,"Threading machines",
+"unspsc",23171800,"Metal fabricating dies",
+"unspsc",23171801,"Stamping or forming dies",
+"unspsc",23171802,"Die casting dies",
+"unspsc",23171803,"Metal extrusion dies",
+"unspsc",23171804,"Cutting dies or tooling",
+"unspsc",23171805,"Rotary dies",
+"unspsc",23171806,"Steel rule dies",
+"unspsc",23171900,"Special tooling fixtures",
+"unspsc",23171901,"Holding fixtures",
+"unspsc",23171902,"Gauges or inspection fixtures",
+"unspsc",23171903,"Fabricated tooling fixtures",
+"unspsc",23171904,"Casting tooling",
+"unspsc",23171905,"Forging tooling",
+"unspsc",23171906,"Assembly or disassembly tooling",
+"unspsc",23171907,"Electroplating racks",
+"unspsc",23171908,"Physical vapor deposition PVD Racks",
+"unspsc",23172000,"Metal working machinery attachments",
+"unspsc",23172001,"Burrs",
+"unspsc",23172002,"Form relief",
+"unspsc",23172003,"Machine threading taps",
+"unspsc",23172005,"Machine end mills",
+"unspsc",23172006,"Metal stamps or punches",
+"unspsc",23172007,"Metal cutting band saw blades",
+"unspsc",23172008,"Metal cutting circular saw blades",
+"unspsc",23172009,"Carbide inserts",
+"unspsc",23172010,"Ceramic inserts",
+"unspsc",23172011,"Steel inserts",
+"unspsc",23172012,"Diamond inserts",
+"unspsc",23172013,"Threading mills",
+"unspsc",23172014,"Tap machines or tapping machines",
+"unspsc",23172015,"Threading machine attachments",
+"unspsc",23180000,"Industrial food and beverage equipment",
+"unspsc",23181500,"Food preparation machinery",
+"unspsc",23181501,"Filling machinery",
+"unspsc",23181502,"Milling machinery",
+"unspsc",23181504,"Sifting machinery",
+"unspsc",23181505,"Dehydrating machinery",
+"unspsc",23181506,"Washing machinery",
+"unspsc",23181507,"Crushing machinery",
+"unspsc",23181508,"Blanching machinery",
+"unspsc",23181509,"Sorting machinery",
+"unspsc",23181510,"Meat tyers",
+"unspsc",23181511,"Forming machine",
+"unspsc",23181512,"Cooling machine",
+"unspsc",23181513,"Preduster",
+"unspsc",23181600,"Food cutting machinery",
+"unspsc",23181601,"Dicing machinery",
+"unspsc",23181602,"Slicing machinery",
+"unspsc",23181603,"Chopping machinery",
+"unspsc",23181604,"Cutting machinery",
+"unspsc",23181605,"Grating machinery",
+"unspsc",23181606,"Peeling machinery",
+"unspsc",23181700,"Food cooking and smoking machinery",
+"unspsc",23181701,"Smoking machinery",
+"unspsc",23181702,"Roasting machinery",
+"unspsc",23181703,"Cooking machinery",
+"unspsc",23181704,"Steaming machinery",
+"unspsc",23181800,"Industrial beverage processing machinery",
+"unspsc",23181801,"Coffee brewing equipment or supplies",
+"unspsc",23181802,"Juicing machinery",
+"unspsc",23181803,"Ice making machines",
+"unspsc",23181804,"Ice cream machines",
+"unspsc",23190000,"Mixers and their parts and accessories",
+"unspsc",23191000,"Batch mixers",
+"unspsc",23191001,"Change can mixers",
+"unspsc",23191002,"Helical blade mixer",
+"unspsc",23191003,"Double arm kneading mixers",
+"unspsc",23191004,"Intensive mixers",
+"unspsc",23191005,"Roll mixers",
+"unspsc",23191100,"Continuous mixers",
+"unspsc",23191101,"Single screw mixers",
+"unspsc",23191102,"Twin screw extruder",
+"unspsc",23191200,"Mixer parts and accessories",
+"unspsc",23191201,"Mixer plows",
+"unspsc",23191202,"Mixer blades",
+"unspsc",23200000,"Mass transfer equipment",
+"unspsc",23201000,"Gas liquid contacting systems",
+"unspsc",23201001,"Plate columns",
+"unspsc",23201002,"Packed columns",
+"unspsc",23201003,"Liquid dispersed contactor",
+"unspsc",23201004,"Wetted wall column",
+"unspsc",23201005,"Bubble columns",
+"unspsc",23201100,"Adsorption and ion exchange",
+"unspsc",23201101,"Adsorber vessel",
+"unspsc",23201102,"Ambient pressure adsorber vessel",
+"unspsc",23201200,"Industrial drying equipment",
+"unspsc",23201201,"Spray dryers",
+"unspsc",23201202,"Air dryers",
+"unspsc",23201203,"Fluidbed dryers",
+"unspsc",23210000,"Electronic manufacturing machinery and equipment and accessories",
+"unspsc",23211000,"Electronic assembly machinery and support equipment",
+"unspsc",23211001,"Chip placers",
+"unspsc",23211002,"Glue dispensing machinery",
+"unspsc",23211100,"Electronic manufacturing and processing machinery",
+"unspsc",23211101,"Semiconductor process systems",
+"unspsc",23220000,"Chicken processing machinery and equipment",
+"unspsc",23221000,"Arrival department machinery and equipment",
+"unspsc",23221001,"Crate unloading system",
+"unspsc",23221002,"Crate washer",
+"unspsc",23221100,"Killing and defeathering department machinery and equipment",
+"unspsc",23221101,"Stunner",
+"unspsc",23221200,"Evisceration department machinery and equipment",
+"unspsc",23221201,"Vent cutter",
+"unspsc",23230000,"Sawmilling and lumber processing machinery and equipment",
+"unspsc",23231000,"Log debarkers and accessories",
+"unspsc",23231001,"Tool holder",
+"unspsc",23231002,"Carbide tool tip",
+"unspsc",23231100,"Bandsaws and accessories",
+"unspsc",23231101,"Bandsaw wheel",
+"unspsc",23231102,"Saw guide",
+"unspsc",23231200,"Circular saws and accessories",
+"unspsc",23231201,"Saw spacer",
+"unspsc",23231202,"Saw arbor",
+"unspsc",23231300,"Lumber edgers",
+"unspsc",23231301,"Infeed roller",
+"unspsc",23231302,"Hold down roll",
+"unspsc",23231400,"Trimsaws and accessories",
+"unspsc",23231401,"Lumber alignment guide",
+"unspsc",23231402,"Zero saw",
+"unspsc",23231500,"Lumber sorters and accessories",
+"unspsc",23231501,"J bars",
+"unspsc",23231502,"Bin sling",
+"unspsc",23231600,"Lumber stackers and accessories",
+"unspsc",23231601,"Fillet holder",
+"unspsc",23231602,"Ending roll",
+"unspsc",23231700,"Lumber kilns and equipment and accessories",
+"unspsc",23231701,"Baffle",
+"unspsc",23231800,"Lumber chippers and accessories",
+"unspsc",23231801,"Knife clamp",
+"unspsc",23231900,"Planers and accessories",
+"unspsc",23231901,"Base bed",
+"unspsc",23231902,"Rear shoe",
+"unspsc",23231903,"Water cooled guide",
+"unspsc",23232000,"Lumber surfacers and accessories",
+"unspsc",23232001,"Knife holder",
+"unspsc",23232100,"Docking saws and accessories",
+"unspsc",23232101,"Adjustable fence",
+"unspsc",23232200,"Finger jointers and accessories",
+"unspsc",23232201,"Glue nozzle",
+"unspsc",24000000,"Material Handling and Conditioning and Storage Machinery and their Accessories and Supplies",
+"unspsc",24100000,"Material handling machinery and equipment",
+"unspsc",24101500,"Industrial trucks",
+"unspsc",24101501,"Carts",
+"unspsc",24101502,"Bulk transporters",
+"unspsc",24101503,"Dollies",
+"unspsc",24101504,"Hand trucks or accessories",
+"unspsc",24101505,"Pallet trucks",
+"unspsc",24101506,"Pushcarts",
+"unspsc",24101507,"Wheelbarrows",
+"unspsc",24101508,"Creepers",
+"unspsc",24101509,"Wagons",
+"unspsc",24101510,"Tilt trucks",
+"unspsc",24101511,"Shelf trolleys",
+"unspsc",24101512,"Power buggies",
+"unspsc",24101600,"Lifting equipment and accessories",
+"unspsc",24101601,"Elevators",
+"unspsc",24101602,"Hoists",
+"unspsc",24101603,"Forklifts",
+"unspsc",24101604,"Lifts",
+"unspsc",24101605,"Loading equipment",
+"unspsc",24101606,"Stackers",
+"unspsc",24101608,"Winches",
+"unspsc",24101609,"Tilts",
+"unspsc",24101610,"Manipulators",
+"unspsc",24101611,"Slings",
+"unspsc",24101612,"Jacks",
+"unspsc",24101613,"Blocks or pulleys",
+"unspsc",24101614,"Air bags for loading",
+"unspsc",24101615,"Loading ramps",
+"unspsc",24101616,"Below the hook device",
+"unspsc",24101617,"Scissor lift",
+"unspsc",24101618,"Pipe layer",
+"unspsc",24101619,"Bridge cranes",
+"unspsc",24101620,"Track cranes",
+"unspsc",24101621,"All terrain cranes",
+"unspsc",24101622,"Rough terrain cranes",
+"unspsc",24101623,"Tower cranes",
+"unspsc",24101624,"Hydraulic truck cranes",
+"unspsc",24101625,"Conventional truck cranes",
+"unspsc",24101626,"Escalator or walkways",
+"unspsc",24101627,"Girder trolleys",
+"unspsc",24101628,"Adjustable forks",
+"unspsc",24101629,"Forklift or elevator accessories or supplies",
+"unspsc",24101630,"Workshop cranes",
+"unspsc",24101631,"Suction cups",
+"unspsc",24101632,"Side shifts",
+"unspsc",24101633,"Hoist drums",
+"unspsc",24101634,"Chain bags",
+"unspsc",24101700,"Conveyors and accessories",
+"unspsc",24101701,"Conveyor roller",
+"unspsc",24101702,"Ball transfer tables",
+"unspsc",24101703,"Rock bins",
+"unspsc",24101704,"Conveyor feeders",
+"unspsc",24101705,"Conveyor screw",
+"unspsc",24101706,"Trolleys or accessories",
+"unspsc",24101707,"Conveyor rails",
+"unspsc",24101708,"Extendable conveyors",
+"unspsc",24101709,"Roller conveyors",
+"unspsc",24101710,"Package stops",
+"unspsc",24101711,"Turntables",
+"unspsc",24101712,"Belt conveyors",
+"unspsc",24101713,"Bucket conveyors",
+"unspsc",24101714,"Air conveyors",
+"unspsc",24101715,"Conveyor belting",
+"unspsc",24101716,"Conveyor pulleys",
+"unspsc",24101717,"Conveyor idlers",
+"unspsc",24101718,"Conveyor belt lacing or fasteners",
+"unspsc",24101719,"Conveyor belt brushes",
+"unspsc",24101721,"Trolley lid",
+"unspsc",24101722,"Chain conveyors",
+"unspsc",24101723,"Motorized rollers or drums",
+"unspsc",24101724,"Conveyor frames",
+"unspsc",24101725,"Conveyor flights or links",
+"unspsc",24101726,"Conveyor liner",
+"unspsc",24101727,"Vibrating conveyors",
+"unspsc",24101728,"Conveyor mounts",
+"unspsc",24101800,"Dock equipment",
+"unspsc",24101801,"Dock levelers",
+"unspsc",24101802,"Dock seals",
+"unspsc",24101803,"Dock ramps",
+"unspsc",24101804,"Strip doors",
+"unspsc",24101805,"Dock bumpers",
+"unspsc",24101806,"Dock ladders",
+"unspsc",24101807,"Dock plates",
+"unspsc",24101808,"Wheel chocks",
+"unspsc",24101809,"Dock rails or accessories",
+"unspsc",24101900,"Drum handling equipment",
+"unspsc",24101901,"Drum openers",
+"unspsc",24101902,"Drum grabs",
+"unspsc",24101903,"Drum lifters",
+"unspsc",24101904,"Drum cradles",
+"unspsc",24101905,"Spill deck",
+"unspsc",24101906,"Drum recuperators",
+"unspsc",24101907,"Spill containment supports",
+"unspsc",24102000,"Shelving and storage",
+"unspsc",24102001,"Rack systems for rack mount electronic equipment",
+"unspsc",24102002,"Bin handlers",
+"unspsc",24102004,"Storage racks or shelves",
+"unspsc",24102005,"Automated storage or retrieval systems",
+"unspsc",24102006,"Work benches",
+"unspsc",24102007,"Reel storage shelves",
+"unspsc",24102008,"Portable reel holders",
+"unspsc",24102100,"Warehousing equipment and supplies",
+"unspsc",24102101,"Cargo handling equipment",
+"unspsc",24102102,"Warehouse carousels",
+"unspsc",24102103,"Warehouse casers",
+"unspsc",24102104,"Depalletizers",
+"unspsc",24102105,"Palletizers",
+"unspsc",24102106,"Industrial shrink wrap equipment",
+"unspsc",24102107,"Cartoning machinery",
+"unspsc",24102108,"Packaging compactors",
+"unspsc",24102109,"Sack holders",
+"unspsc",24102200,"Packing tools",
+"unspsc",24102201,"Stretch film dispensers",
+"unspsc",24102202,"Box sealing tape dispensers",
+"unspsc",24102203,"Bag sealing tools or equipment",
+"unspsc",24102204,"Strapping dispenser",
+"unspsc",24102208,"Air inflators",
+"unspsc",24110000,"Containers and storage",
+"unspsc",24111500,"Bags",
+"unspsc",24111501,"Canvas bags",
+"unspsc",24111502,"Paper bags",
+"unspsc",24111503,"Plastic bags",
+"unspsc",24111505,"Flexible intermediate bulk containers",
+"unspsc",24111506,"Laundry nets or bags",
+"unspsc",24111507,"Tool bags",
+"unspsc",24111508,"Tent bag",
+"unspsc",24111509,"Water bags",
+"unspsc",24111800,"Tanks and cylinders and their accessories",
+"unspsc",24111801,"Reservoirs",
+"unspsc",24111802,"Air or gas tanks or cylinders",
+"unspsc",24111803,"Storage tanks",
+"unspsc",24111804,"Calibrating tanks",
+"unspsc",24111805,"Chemical tanks",
+"unspsc",24111806,"Dip tanks",
+"unspsc",24111807,"Expansion tanks",
+"unspsc",24111808,"Fuel storage tanks",
+"unspsc",24111809,"Processing tanks",
+"unspsc",24111810,"Water storage tanks",
+"unspsc",24111811,"Carboys",
+"unspsc",24111812,"Containment basin",
+"unspsc",24111813,"Rinse tanks",
+"unspsc",24112000,"Bins and baskets",
+"unspsc",24112003,"Non metallic bins",
+"unspsc",24112004,"Metallic bins",
+"unspsc",24112005,"Metallic baskets",
+"unspsc",24112006,"Non metallic baskets",
+"unspsc",24112100,"Casks and barrels and drums",
+"unspsc",24112101,"Casks",
+"unspsc",24112102,"Barrels",
+"unspsc",24112108,"Metallic drums",
+"unspsc",24112109,"Non metallic drums",
+"unspsc",24112110,"Intermediate bulk containers",
+"unspsc",24112111,"Stabilizer",
+"unspsc",24112112,"Drum lid",
+"unspsc",24112200,"Cans and pails",
+"unspsc",24112204,"Metallic pails",
+"unspsc",24112205,"Non metallic pails",
+"unspsc",24112206,"Metallic flammable liquid cans",
+"unspsc",24112207,"Non metallic flammable liquid cans",
+"unspsc",24112208,"Spray kit",
+"unspsc",24112209,"Jerrycans",
+"unspsc",24112400,"Storage chests and cabinets and trunks",
+"unspsc",24112401,"Tool chests or boxes or cabinets",
+"unspsc",24112402,"Hazardous materials cabinets",
+"unspsc",24112403,"Tool belts",
+"unspsc",24112404,"Box",
+"unspsc",24112405,"Drawers",
+"unspsc",24112406,"Box or shelf partitions",
+"unspsc",24112407,"Mailboxes",
+"unspsc",24112408,"Antistatic boxes",
+"unspsc",24112409,"Box lids",
+"unspsc",24112500,"Corrugated and other supplies for distribution",
+"unspsc",24112501,"Slotted corrugated cartons",
+"unspsc",24112502,"One piece die cut shipping cartons",
+"unspsc",24112503,"Die cut corrugated shipping cartons with separate lids",
+"unspsc",24112504,"Molded boxes",
+"unspsc",24112505,"Pallets",
+"unspsc",24112600,"Liquid containers",
+"unspsc",24112601,"Jugs",
+"unspsc",24112602,"Jars",
+"unspsc",24120000,"Packaging materials",
+"unspsc",24121500,"Packaging boxes and bags and pouches",
+"unspsc",24121502,"Packaging pouches or bags",
+"unspsc",24121503,"Packaging boxes",
+"unspsc",24121504,"Carded packaging",
+"unspsc",24121506,"Conductive boxes",
+"unspsc",24121507,"Rigid set up boxes",
+"unspsc",24121508,"Egg trays",
+"unspsc",24121509,"Packaging trays",
+"unspsc",24121800,"Packaging cans",
+"unspsc",24121801,"Aerosol cans",
+"unspsc",24121802,"Paint or varnish cans",
+"unspsc",24121803,"Beverage cans",
+"unspsc",24121804,"Food cans",
+"unspsc",24121805,"Steel cans",
+"unspsc",24121806,"Aluminum cans",
+"unspsc",24121807,"Plastic cans",
+"unspsc",24122000,"Bottles",
+"unspsc",24122001,"Squeeze bottles",
+"unspsc",24122002,"Plastic bottles",
+"unspsc",24122003,"Glass bottles",
+"unspsc",24122004,"Caps or tops",
+"unspsc",24122005,"Applicator bottles",
+"unspsc",24122006,"Applicators",
+"unspsc",24130000,"Industrial refrigeration",
+"unspsc",24131500,"Industrial refrigerators",
+"unspsc",24131501,"Combined refrigerator freezers",
+"unspsc",24131502,"Liquid nitrogen refrigerators",
+"unspsc",24131503,"Walk in refrigerators",
+"unspsc",24131504,"Refrigerated containers",
+"unspsc",24131505,"Refrigerated vessels",
+"unspsc",24131506,"Refrigerated tanks",
+"unspsc",24131600,"Industrial freezers",
+"unspsc",24131601,"Chest freezers",
+"unspsc",24131602,"Upright freezers",
+"unspsc",24131603,"Low temperature freezers",
+"unspsc",24131604,"Freeze drying equipment",
+"unspsc",24131605,"Walk in freezers",
+"unspsc",24131606,"Plate freezers",
+"unspsc",24131607,"Blast freezers",
+"unspsc",24131900,"Ice makers",
+"unspsc",24131901,"Ice cube makers",
+"unspsc",24131902,"Ice block makers",
+"unspsc",24140000,"Packing supplies",
+"unspsc",24141500,"Securing and protecting supplies",
+"unspsc",24141501,"Stretch wrap films",
+"unspsc",24141502,"Shrink wrap films",
+"unspsc",24141504,"Tamper proof or security seals",
+"unspsc",24141506,"Tarpaulins",
+"unspsc",24141507,"Anti static packaging films",
+"unspsc",24141508,"Carton corner support",
+"unspsc",24141509,"Rubber cord",
+"unspsc",24141510,"Cable protectors",
+"unspsc",24141511,"Load binders",
+"unspsc",24141512,"Packing absorbents",
+"unspsc",24141513,"Blister packs",
+"unspsc",24141514,"Packaging films",
+"unspsc",24141515,"Protective netting",
+"unspsc",24141600,"Cushioning supplies",
+"unspsc",24141601,"Bubble wrap",
+"unspsc",24141602,"Thermoforming materials",
+"unspsc",24141603,"Cushioning",
+"unspsc",24141604,"Wadding materials",
+"unspsc",24141605,"Air filled packing materials",
+"unspsc",24141606,"Packing peanuts",
+"unspsc",24141607,"Cardboard inserts",
+"unspsc",24141608,"Protective ends",
+"unspsc",24141700,"Packaging tubes and cores and labels and accessories",
+"unspsc",24141701,"Paper tubes or cores",
+"unspsc",24141702,"Tube or core end plugs",
+"unspsc",24141703,"Paper pieces",
+"unspsc",24141704,"Printed inserts or instructions",
+"unspsc",24141705,"Collapsible tubes",
+"unspsc",24141706,"Spool",
+"unspsc",24141707,"Reel",
+"unspsc",24141708,"Parcel handles",
+"unspsc",24141709,"Capsule tubes or caps",
+"unspsc",25000000,"Commercial and Military and Private Vehicles and their Accessories and Components",
+"unspsc",25100000,"Motor vehicles",
+"unspsc",25101500,"Passenger motor vehicles",
+"unspsc",25101501,"Minibuses",
+"unspsc",25101502,"Busses",
+"unspsc",25101503,"Automobiles or cars",
+"unspsc",25101504,"Station wagons",
+"unspsc",25101505,"Minivans or vans",
+"unspsc",25101506,"Limousines",
+"unspsc",25101507,"Light trucks or sport utility vehicles",
+"unspsc",25101508,"Sports car",
+"unspsc",25101600,"Product and material transport vehicles",
+"unspsc",25101601,"Dump trucks",
+"unspsc",25101602,"Tow trucks",
+"unspsc",25101604,"Delivery trucks",
+"unspsc",25101609,"Sludge or sewage handling trucks",
+"unspsc",25101610,"Water trucks",
+"unspsc",25101611,"Cargo trucks",
+"unspsc",25101700,"Safety and rescue vehicles",
+"unspsc",25101701,"Fire or rescue trucks",
+"unspsc",25101702,"Police vehicles",
+"unspsc",25101703,"Ambulances",
+"unspsc",25101800,"Motorized cycles",
+"unspsc",25101801,"Motorcycles",
+"unspsc",25101802,"Scooters",
+"unspsc",25101803,"Mopeds",
+"unspsc",25101900,"Specialized and recreational vehicles",
+"unspsc",25101901,"Agricultural tractors",
+"unspsc",25101902,"Motor homes",
+"unspsc",25101903,"Snowmobiles or snow scooter",
+"unspsc",25101904,"Golf carts",
+"unspsc",25101905,"All terrain vehicles tracked or wheeled",
+"unspsc",25101906,"Go cart",
+"unspsc",25101907,"Caravans or camper trailers",
+"unspsc",25101908,"Quads",
+"unspsc",25102000,"War vehicles",
+"unspsc",25102001,"Tanks",
+"unspsc",25102002,"Armored fighting vehicles",
+"unspsc",25102003,"Self propelled artillery",
+"unspsc",25102100,"Truck tractors",
+"unspsc",25102101,"Low cab forward tractors",
+"unspsc",25102102,"Long nose tractors with sleeper",
+"unspsc",25102103,"Long nose tractors without sleeper",
+"unspsc",25102104,"Cab over engine tractors with sleeper",
+"unspsc",25102105,"Cab over engine tractors without sleeper",
+"unspsc",25102106,"Tractor head",
+"unspsc",25110000,"Marine transport",
+"unspsc",25111500,"Commercial marine craft",
+"unspsc",25111501,"Trawlers",
+"unspsc",25111502,"Fishing boats",
+"unspsc",25111503,"Cargo or container ships",
+"unspsc",25111504,"Dredging craft",
+"unspsc",25111505,"Tankers",
+"unspsc",25111506,"Tug boats",
+"unspsc",25111507,"Barges",
+"unspsc",25111508,"Passenger or automobile ferries",
+"unspsc",25111509,"Cruise ships",
+"unspsc",25111510,"Salvage ships",
+"unspsc",25111511,"Oil or gas crew boat",
+"unspsc",25111512,"Oil or gas workboat",
+"unspsc",25111513,"Seismic vessel",
+"unspsc",25111600,"Safety and rescue water craft",
+"unspsc",25111601,"Lifeboats or liferafts",
+"unspsc",25111602,"Fire fighting watercraft",
+"unspsc",25111603,"Rescue ships or boats",
+"unspsc",25111700,"Military watercraft",
+"unspsc",25111701,"Submarines",
+"unspsc",25111702,"Aircraft carriers",
+"unspsc",25111703,"Ammunition ships",
+"unspsc",25111704,"Amphibious assault ships",
+"unspsc",25111705,"Amphibious transport docks",
+"unspsc",25111706,"Amphibious command ships",
+"unspsc",25111707,"Command ships",
+"unspsc",25111708,"Cruisers",
+"unspsc",25111709,"Destroyers",
+"unspsc",25111710,"Dock landing ships",
+"unspsc",25111711,"Fast combat support ships",
+"unspsc",25111712,"Frigates",
+"unspsc",25111713,"Fleet oilers",
+"unspsc",25111714,"Utility landing watercraft",
+"unspsc",25111715,"Mechanized or utility watercraft",
+"unspsc",25111716,"Mine hunting ships",
+"unspsc",25111717,"Mine countermeasures ships",
+"unspsc",25111718,"Coastal patrol watercraft",
+"unspsc",25111719,"Submarine tenders",
+"unspsc",25111720,"Tank landing ships",
+"unspsc",25111721,"Air cushioned landing watercraft",
+"unspsc",25111800,"Recreational watercraft",
+"unspsc",25111801,"Recreational sailboats",
+"unspsc",25111802,"Recreational motorboats",
+"unspsc",25111803,"Recreational rowboats",
+"unspsc",25111804,"Canoes or kayaks",
+"unspsc",25111805,"Personal motorized watercraft",
+"unspsc",25111806,"Rafts",
+"unspsc",25111807,"Dinghies",
+"unspsc",25111808,"Yachts",
+"unspsc",25111900,"Marine craft systems and subassemblies",
+"unspsc",25111901,"Marine craft communications systems",
+"unspsc",25111902,"Marine propellers",
+"unspsc",25111903,"Sails",
+"unspsc",25111904,"Paddles",
+"unspsc",25111905,"Marine ballast systems",
+"unspsc",25111906,"Anchor chocks",
+"unspsc",25111907,"Anchor lines",
+"unspsc",25111908,"Anchor retrievers",
+"unspsc",25111909,"Anchor rollers",
+"unspsc",25111910,"Boat ramps",
+"unspsc",25111911,"Boathooks",
+"unspsc",25111912,"Boom vangs",
+"unspsc",25111913,"Deck hatches",
+"unspsc",25111914,"Dock rings",
+"unspsc",25111915,"Dock steps",
+"unspsc",25111916,"Emergency dye signals",
+"unspsc",25111917,"Fairleaders",
+"unspsc",25111918,"Furler systems",
+"unspsc",25111919,"Keel protectors",
+"unspsc",25111920,"Marine fenders",
+"unspsc",25111921,"Marine goosenecks",
+"unspsc",25111922,"Mooring whips",
+"unspsc",25111923,"Oarlocks",
+"unspsc",25111924,"Radar reflectors",
+"unspsc",25111925,"Marine rudders",
+"unspsc",25111926,"Sail battens",
+"unspsc",25111927,"Sail booms",
+"unspsc",25111928,"Sail covers",
+"unspsc",25111929,"Sheet bags",
+"unspsc",25111930,"Spinnaker poles",
+"unspsc",25111931,"Stern platforms",
+"unspsc",25111932,"Tell tales",
+"unspsc",25111933,"Tide clocks",
+"unspsc",25111934,"Tillers",
+"unspsc",25111935,"Whisker poles",
+"unspsc",25120000,"Railway and tramway machinery and equipment",
+"unspsc",25121500,"Locomotives and electric trolleys",
+"unspsc",25121501,"Diesel freight locomotives",
+"unspsc",25121502,"Electric freight locomotives",
+"unspsc",25121503,"Diesel passenger locomotives",
+"unspsc",25121504,"Electric passenger locomotives",
+"unspsc",25121600,"Railway and tramway cars",
+"unspsc",25121601,"Freight rail cars",
+"unspsc",25121602,"Tanker rail cars",
+"unspsc",25121603,"Passenger rail cars",
+"unspsc",25121604,"Hopper rail cars",
+"unspsc",25121605,"Streetcars or tramway cars",
+"unspsc",25121700,"Railroad support equipment and systems",
+"unspsc",25121701,"Rail switching systems",
+"unspsc",25121702,"Railway sleepers",
+"unspsc",25121703,"Railway tracks",
+"unspsc",25121704,"Railway frogs or fish plates",
+"unspsc",25121705,"Rail couplers",
+"unspsc",25121706,"Draft gears",
+"unspsc",25121707,"Bogie assemblies",
+"unspsc",25130000,"Aircraft",
+"unspsc",25131500,"Powered fixed wing aircraft",
+"unspsc",25131501,"Fixed wing agricultural aircraft",
+"unspsc",25131502,"Cargo propeller aircraft",
+"unspsc",25131503,"Seaplanes",
+"unspsc",25131504,"Commercial passenger propeller aircraft",
+"unspsc",25131505,"Cargo jet aircraft",
+"unspsc",25131506,"Commercial passenger jet aircraft",
+"unspsc",25131507,"Private or business propeller aircraft",
+"unspsc",25131508,"Private or business jet aircraft",
+"unspsc",25131600,"Civilian and commercial rotary wing aircraft",
+"unspsc",25131601,"Passenger transport helicopters",
+"unspsc",25131602,"Cargo transport helicopters",
+"unspsc",25131603,"Agricultural helicopters",
+"unspsc",25131604,"Medical or rescue helicopters",
+"unspsc",25131700,"Military fixed wing aircraft",
+"unspsc",25131701,"Bomber aircraft",
+"unspsc",25131702,"Fighter bomber aircraft",
+"unspsc",25131703,"Fighter aircraft",
+"unspsc",25131704,"Attack aircraft",
+"unspsc",25131705,"Target or reconnaissance drones",
+"unspsc",25131706,"Military seaplanes",
+"unspsc",25131707,"Reconnaissance or surveillance aircraft",
+"unspsc",25131708,"Anti submarine aircraft",
+"unspsc",25131709,"Military transport aircraft",
+"unspsc",25131800,"Specialty aircraft",
+"unspsc",25131801,"Airships",
+"unspsc",25131900,"Military rotary wing aircraft",
+"unspsc",25131902,"Military transport helicopters",
+"unspsc",25131903,"Attack helicopters",
+"unspsc",25131904,"Reconnaissance helicopters",
+"unspsc",25131905,"Anti submarine helicopters",
+"unspsc",25131906,"Tilt rotor wing aircraft",
+"unspsc",25132000,"Recreational aircraft",
+"unspsc",25132001,"Hang gliders",
+"unspsc",25132002,"Hot air balloons",
+"unspsc",25132003,"Gliders",
+"unspsc",25132004,"Paragliders",
+"unspsc",25132005,"Ultra light aircraft",
+"unspsc",25150000,"Spacecraft",
+"unspsc",25151500,"Spaceships",
+"unspsc",25151501,"Manned spacecraft",
+"unspsc",25151502,"Spacecraft structures",
+"unspsc",25151700,"Satellites",
+"unspsc",25151701,"Communication satellites",
+"unspsc",25151702,"Weather satellites",
+"unspsc",25151703,"Military satellites",
+"unspsc",25151704,"Scientific or research satellites",
+"unspsc",25151705,"Navigation satellites",
+"unspsc",25151706,"Geostationary satellites",
+"unspsc",25151707,"Low earth orbit satellites",
+"unspsc",25151708,"Sun synchronous orbit satellites",
+"unspsc",25151709,"Geosynchronous satellites",
+"unspsc",25160000,"Non motorized cycles",
+"unspsc",25161500,"Pedal powered vehicles",
+"unspsc",25161501,"Touring bicycles",
+"unspsc",25161502,"Unicycles",
+"unspsc",25161503,"Tricycles",
+"unspsc",25161504,"Tandem bicycles",
+"unspsc",25161505,"Mountain bicycles",
+"unspsc",25161506,"Racing bicycles",
+"unspsc",25161507,"Bicycles",
+"unspsc",25161508,"Recumbent bicycles",
+"unspsc",25161509,"Childrens bicycles",
+"unspsc",25170000,"Transportation components and systems",
+"unspsc",25171500,"Windshield wipers",
+"unspsc",25171502,"Automotive windshield wipers",
+"unspsc",25171503,"Locomotive windshield wipers",
+"unspsc",25171504,"Marine windshield wipers",
+"unspsc",25171505,"Truck windshield wipers",
+"unspsc",25171506,"Windshield wiper pump",
+"unspsc",25171507,"Wiper blades",
+"unspsc",25171600,"Defrosting and defogging systems",
+"unspsc",25171602,"Automotive defrosting or defogging systems",
+"unspsc",25171603,"Train defrosting or defogging systems",
+"unspsc",25171700,"Braking systems and components",
+"unspsc",25171702,"Automotive braking systems",
+"unspsc",25171703,"Train braking systems",
+"unspsc",25171704,"Drag chutes",
+"unspsc",25171705,"Rotors",
+"unspsc",25171706,"Brake calipers",
+"unspsc",25171707,"Drum brake",
+"unspsc",25171708,"Disc brake",
+"unspsc",25171709,"Liquid cooled brake",
+"unspsc",25171710,"Master cylinders",
+"unspsc",25171711,"Slave cylinders",
+"unspsc",25171712,"Drum brake shoes",
+"unspsc",25171713,"Disc brake pads",
+"unspsc",25171714,"Brake drum",
+"unspsc",25171715,"Disc brake rotors",
+"unspsc",25171716,"Brake lines",
+"unspsc",25171717,"Brake pistons",
+"unspsc",25171718,"Brake repair kits",
+"unspsc",25171719,"Brake booster",
+"unspsc",25171900,"Wheels and wheel trims",
+"unspsc",25171901,"Automobile rims or wheels",
+"unspsc",25171902,"Train wheels",
+"unspsc",25171903,"Truck rims or wheels",
+"unspsc",25171905,"Tire valves",
+"unspsc",25172000,"Suspension system components",
+"unspsc",25172001,"Automobile suspension systems",
+"unspsc",25172002,"Truck suspension systems",
+"unspsc",25172003,"Truck shock absorbers",
+"unspsc",25172004,"Automobile shock absorbers",
+"unspsc",25172005,"Train suspension systems",
+"unspsc",25172007,"Struts",
+"unspsc",25172009,"Automotive bushings",
+"unspsc",25172010,"Sway bars",
+"unspsc",25172011,"Shock absorber",
+"unspsc",25172100,"Vehicle safety and security systems and components",
+"unspsc",25172101,"Airbags",
+"unspsc",25172104,"Seatbelts",
+"unspsc",25172105,"Collision avoidance systems",
+"unspsc",25172106,"Impact sensing systems",
+"unspsc",25172108,"Head restraints",
+"unspsc",25172109,"Air bag propellant canisters",
+"unspsc",25172110,"Vehicle horns",
+"unspsc",25172111,"Remote locking system",
+"unspsc",25172112,"Vehicle stability control systems",
+"unspsc",25172113,"Vehicle traction control systems",
+"unspsc",25172114,"Wheel clamps",
+"unspsc",25172200,"Vehicle doors",
+"unspsc",25172201,"Removable automotive doors",
+"unspsc",25172203,"Automotive doors",
+"unspsc",25172204,"Roll up truck doors",
+"unspsc",25172205,"Tailgates or liftgates",
+"unspsc",25172300,"Vehicle windows and windshields",
+"unspsc",25172301,"Automotive windshields",
+"unspsc",25172303,"Automotive windows",
+"unspsc",25172400,"Fuel tanks and systems",
+"unspsc",25172404,"Hybrid fuel storage systems",
+"unspsc",25172405,"Fuel injection systems",
+"unspsc",25172406,"Fuel tanks",
+"unspsc",25172407,"Breather elements",
+"unspsc",25172408,"Fuel or oil caps",
+"unspsc",25172500,"Tires and tire tubes",
+"unspsc",25172502,"Automobile tire tubes",
+"unspsc",25172503,"Heavy truck tires",
+"unspsc",25172504,"Automobile or light truck tires",
+"unspsc",25172505,"Bicycle tubes",
+"unspsc",25172506,"Bicycle tires",
+"unspsc",25172507,"Tire cord",
+"unspsc",25172508,"Tire treads",
+"unspsc",25172600,"Vehicle trim and exterior covering",
+"unspsc",25172601,"Automotive trim",
+"unspsc",25172602,"Automotive fenders",
+"unspsc",25172603,"Vehicle bumpers",
+"unspsc",25172604,"Vehicle mirrors",
+"unspsc",25172605,"Vehicle grilles",
+"unspsc",25172606,"Vehicle hoods",
+"unspsc",25172607,"Vehicle side panels",
+"unspsc",25172608,"Fascias",
+"unspsc",25172700,"Environmental control systems",
+"unspsc",25172702,"Space environmental control systems",
+"unspsc",25172703,"Marine environmental control systems",
+"unspsc",25172704,"Vehicle climate control systems",
+"unspsc",25172800,"Hydraulic systems and components",
+"unspsc",25172802,"Automotive hydraulic systems",
+"unspsc",25172803,"Marine hydraulic systems",
+"unspsc",25172900,"Exterior vehicle lighting",
+"unspsc",25172901,"Exterior automobile lighting",
+"unspsc",25172903,"Exterior railcar lighting",
+"unspsc",25172904,"Exterior ship or boat lighting",
+"unspsc",25172905,"Headlamp wiper or washer systems",
+"unspsc",25172906,"Reflectors",
+"unspsc",25172907,"Vehicle headlight",
+"unspsc",25173000,"Interior vehicle lighting",
+"unspsc",25173001,"Interior automobile lighting",
+"unspsc",25173003,"Interior railcar lighting",
+"unspsc",25173004,"Interior ship or boat lighting",
+"unspsc",25173005,"Light plate assemblies",
+"unspsc",25173100,"Location and navigation systems and components",
+"unspsc",25173107,"Vehicular global positioning systems",
+"unspsc",25173108,"Vehicle navigation systems",
+"unspsc",25173300,"Master control systems",
+"unspsc",25173303,"Automotive computer systems",
+"unspsc",25173304,"Electronic ignition systems",
+"unspsc",25173700,"Exhaust and emission controls",
+"unspsc",25173701,"Catalytic converters",
+"unspsc",25173702,"Mufflers or resonators",
+"unspsc",25173703,"Exhaust manifolds",
+"unspsc",25173704,"Muffler adapters",
+"unspsc",25173705,"Spark arresters",
+"unspsc",25173800,"Drivetrain systems",
+"unspsc",25173801,"Driving axles",
+"unspsc",25173802,"Non driving axles",
+"unspsc",25173803,"Axle housings",
+"unspsc",25173804,"Axle spindles",
+"unspsc",25173805,"Differentials",
+"unspsc",25173806,"Constant velocity joints",
+"unspsc",25173807,"Axle shafts",
+"unspsc",25173808,"Axle repair kits",
+"unspsc",25173809,"Axle hubs",
+"unspsc",25173810,"Universal joints",
+"unspsc",25173811,"Drive shafts",
+"unspsc",25173812,"Manual transmissions",
+"unspsc",25173813,"Automatic transmissions",
+"unspsc",25173815,"Clutch cables",
+"unspsc",25173816,"Hydraulic clutch parts",
+"unspsc",25173817,"Drivetrain chains",
+"unspsc",25173900,"Electrical components",
+"unspsc",25173901,"Ignition",
+"unspsc",25174000,"Engine coolant system",
+"unspsc",25174001,"Fan",
+"unspsc",25174002,"Engine radiators",
+"unspsc",25174003,"Radiator caps",
+"unspsc",25174004,"Engine coolant",
+"unspsc",25174100,"Roof systems",
+"unspsc",25174101,"Emergency vehicle exits",
+"unspsc",25174102,"Permanent convertible roof tops",
+"unspsc",25174103,"Removable hard roof tops",
+"unspsc",25174104,"Removable soft roof tops",
+"unspsc",25174105,"Roof rack systems",
+"unspsc",25174106,"Sunroofs or moonroofs",
+"unspsc",25174107,"Wind deflectors",
+"unspsc",25174200,"Steering system",
+"unspsc",25174201,"Steering sacks",
+"unspsc",25174202,"Steering suspension",
+"unspsc",25174203,"Ball joint",
+"unspsc",25174204,"Power steering system",
+"unspsc",25174205,"Tie Rods",
+"unspsc",25174206,"Drag link",
+"unspsc",25174207,"Steering linkage",
+"unspsc",25174208,"Hublock",
+"unspsc",25174209,"Pinions",
+"unspsc",25174210,"Power steering tuning cable",
+"unspsc",25174211,"Steering wheels",
+"unspsc",25174212,"Steering column assemblies",
+"unspsc",25174213,"Steering cylinder assemblies",
+"unspsc",25174400,"Vehicle interior systems",
+"unspsc",25174401,"Bezels",
+"unspsc",25174402,"Consoles",
+"unspsc",25174403,"Door panels",
+"unspsc",25174404,"Headliners",
+"unspsc",25174405,"Instrument clusters",
+"unspsc",25174406,"Instrument panels",
+"unspsc",25174407,"Pedals",
+"unspsc",25174408,"Power ports or lighters",
+"unspsc",25174409,"Sun visors",
+"unspsc",25174410,"Vehicle sound systems and components",
+"unspsc",25174600,"Vehicle seating systems",
+"unspsc",25174601,"Seat covers",
+"unspsc",25174602,"Seat cushions or bolsters",
+"unspsc",25174603,"Seat frames",
+"unspsc",25174700,"Non motorized cycle components and accessories",
+"unspsc",25174701,"Cycle pedals",
+"unspsc",25180000,"Vehicle bodies and trailers",
+"unspsc",25181600,"Automotive chassis",
+"unspsc",25181601,"Automobile chassis",
+"unspsc",25181602,"Truck chassis",
+"unspsc",25181603,"Motorcycle frames",
+"unspsc",25181700,"Product and material trailers",
+"unspsc",25181701,"Container trailers",
+"unspsc",25181702,"Flatbed trailers",
+"unspsc",25181703,"Livestock trailers",
+"unspsc",25181704,"Non temperature controlled tanker trailers",
+"unspsc",25181705,"Temperature controlled tanker trailers",
+"unspsc",25181706,"Temperature controlled container trailers",
+"unspsc",25181707,"Automobile carrier trailers",
+"unspsc",25181708,"Trailer hitches",
+"unspsc",25181709,"Skip loader",
+"unspsc",25181710,"Trailer end plates",
+"unspsc",25181711,"Snowmobile trailer",
+"unspsc",25181712,"Motorcycle trailer",
+"unspsc",25181713,"Boat Trailer",
+"unspsc",25190000,"Transportation services equipment",
+"unspsc",25191500,"Air transportation support systems and equipment",
+"unspsc",25191501,"Ground support training systems",
+"unspsc",25191502,"Ground support test or maintenance systems",
+"unspsc",25191503,"Integrated maintenance information systems",
+"unspsc",25191504,"Aircraft flight simulators or trainers",
+"unspsc",25191505,"Aircraft cargo handling equipment",
+"unspsc",25191506,"Aircraft refueling equipment",
+"unspsc",25191507,"Aircraft deicing equipment",
+"unspsc",25191508,"Jetways",
+"unspsc",25191509,"Aircraft pushback or tow tractors",
+"unspsc",25191510,"Ground power units for aircraft",
+"unspsc",25191511,"Lavatory service equipment for aircraft",
+"unspsc",25191512,"Airstairs or stair trucks",
+"unspsc",25191513,"Ground support vehicle maintenance kit",
+"unspsc",25191514,"Aircraft towbar",
+"unspsc",25191600,"Space transportation support systems and equipment",
+"unspsc",25191601,"Spacecraft flight simulators",
+"unspsc",25191602,"Payload delivery systems for spacecraft",
+"unspsc",25191603,"Liquid launch vehicles",
+"unspsc",25191604,"Solid launch vehicles",
+"unspsc",25191605,"Spacecraft service modules",
+"unspsc",25191700,"Vehicle servicing equipment",
+"unspsc",25191701,"Wheel balancing equipment",
+"unspsc",25191702,"Wheel alignment equipment",
+"unspsc",25191703,"Tire changing machines",
+"unspsc",25191704,"Engine or vehicle stands",
+"unspsc",25200000,"Aerospace systems and components and equipment",
+"unspsc",25201500,"Aircraft fuselage and components",
+"unspsc",25201501,"Aircraft spoilers",
+"unspsc",25201502,"Aircraft fins",
+"unspsc",25201503,"Aircraft horizontal stabilizers",
+"unspsc",25201504,"Aircraft canards",
+"unspsc",25201505,"Aircraft slats",
+"unspsc",25201506,"Aircraft flaps or flap drives",
+"unspsc",25201507,"Aircraft rudders",
+"unspsc",25201508,"Aircraft elevators",
+"unspsc",25201509,"Aircraft ailerons",
+"unspsc",25201510,"Aircraft propellers",
+"unspsc",25201511,"Aircraft wings",
+"unspsc",25201512,"Aircraft fuselages",
+"unspsc",25201513,"Aircraft radomes",
+"unspsc",25201514,"Aircraft rotors",
+"unspsc",25201515,"Aircraft lift fans",
+"unspsc",25201516,"Aircraft canopies",
+"unspsc",25201517,"Aircraft furnishings",
+"unspsc",25201518,"Aircraft doublers",
+"unspsc",25201519,"Aircraft ribs",
+"unspsc",25201520,"Aircraft spars",
+"unspsc",25201600,"Aerospace location and navigation systems and components",
+"unspsc",25201601,"Aircraft digital altitude control systems",
+"unspsc",25201602,"Aircraft navigation beacons",
+"unspsc",25201603,"Air to ground terrain following systems",
+"unspsc",25201604,"Aircraft guidance systems",
+"unspsc",25201605,"Aircraft steering controls",
+"unspsc",25201606,"Spacecraft altitude control systems",
+"unspsc",25201700,"Flight communications related systems",
+"unspsc",25201701,"Aircraft communication systems",
+"unspsc",25201702,"Flight data recorders",
+"unspsc",25201703,"Aircraft countermeasures",
+"unspsc",25201704,"Encryption or decryption systems",
+"unspsc",25201705,"Aircraft telemetry systems",
+"unspsc",25201706,"Aircraft interface electronics",
+"unspsc",25201707,"Aircraft gyros",
+"unspsc",25201708,"Aircraft cameras",
+"unspsc",25201709,"Aircraft probes or sensors",
+"unspsc",25201710,"Aircraft waveguides",
+"unspsc",25201800,"Aircraft master control systems",
+"unspsc",25201801,"Flight computer systems",
+"unspsc",25201802,"Spacecraft command modules",
+"unspsc",25201900,"Aircraft emergency systems",
+"unspsc",25201901,"Aircraft fire control or extinguishing systems",
+"unspsc",25201902,"Aircraft escape or ejection systems",
+"unspsc",25201903,"Aircraft warning systems",
+"unspsc",25201904,"Parachutes",
+"unspsc",25202000,"Aircraft power systems",
+"unspsc",25202001,"Spacecraft solar cells",
+"unspsc",25202002,"Spacecraft solar arrays",
+"unspsc",25202003,"Aircraft power supply units",
+"unspsc",25202004,"Auxiliary power unit systems APUs",
+"unspsc",25202100,"Flight instrumentation",
+"unspsc",25202101,"Aerospace cockpit indicators",
+"unspsc",25202102,"Aerospace cockpit gauges",
+"unspsc",25202103,"Aerospace cockpit display panels",
+"unspsc",25202104,"Aerospace cockpit switch panels",
+"unspsc",25202105,"Aerospace head up display HUDs",
+"unspsc",25202200,"Aircraft landing and braking systems",
+"unspsc",25202201,"Aircraft braking systems",
+"unspsc",25202202,"Aircraft drag chutes",
+"unspsc",25202203,"Aircraft wheels",
+"unspsc",25202204,"Landing gear assemblies",
+"unspsc",25202205,"Aircraft tires",
+"unspsc",25202206,"Aircraft anti skid controls",
+"unspsc",25202300,"Aircraft passenger restraints",
+"unspsc",25202301,"Aircraft lapbelts",
+"unspsc",25202302,"Aircraft harness restraints",
+"unspsc",25202400,"Aircraft fuel tanks and systems",
+"unspsc",25202401,"Aircraft internal fuel tanks",
+"unspsc",25202402,"Aircraft fuel drop tanks",
+"unspsc",25202403,"Aircraft propellant tanks",
+"unspsc",25202404,"Aircraft hybrid fuel storage systems",
+"unspsc",25202405,"Aircraft fuel management systems",
+"unspsc",25202406,"Postboosters",
+"unspsc",25202500,"Aircraft equipment",
+"unspsc",25202501,"Aircraft hydraulic systems",
+"unspsc",25202502,"Exterior aircraft lighting",
+"unspsc",25202503,"Interior aircraft lighting",
+"unspsc",25202504,"Aircraft windshield wipers",
+"unspsc",25202505,"Aircraft onboard defrosting or defogging systems",
+"unspsc",25202506,"Aircraft doors",
+"unspsc",25202507,"Aircraft windows",
+"unspsc",25202508,"Aircraft windshields",
+"unspsc",25202509,"Aircraft shock mounts",
+"unspsc",25202510,"Aircraft slip ring assemblies",
+"unspsc",25202600,"Aircraft environmental control systems and components",
+"unspsc",25202601,"Aircraft environment controllers",
+"unspsc",25202602,"Aircraft environment regulators",
+"unspsc",25202603,"Aircraft cooling turbines",
+"unspsc",25202604,"Aircraft cooling fans",
+"unspsc",25202605,"Aircraft heat exchangers",
+"unspsc",25202606,"Aircraft water separators",
+"unspsc",25202607,"Aircraft oxygen equipment",
+"unspsc",25202700,"Aircraft accumulators",
+"unspsc",25202701,"Hydraulic aircraft accumulators",
+"unspsc",25202702,"Pneumatic aircraft accumulators",
+"unspsc",26000000,"Power Generation and Distribution Machinery and Accessories",
+"unspsc",26100000,"Power sources",
+"unspsc",26101500,"Engines",
+"unspsc",26101501,"Hydraulic engines",
+"unspsc",26101502,"Pneumatic engines",
+"unspsc",26101503,"Gas engines",
+"unspsc",26101504,"Diesel engines",
+"unspsc",26101505,"Steam engines",
+"unspsc",26101506,"Turbine engines",
+"unspsc",26101507,"Turbofan engines",
+"unspsc",26101508,"Thermal engines",
+"unspsc",26101509,"Hydroelectric engines",
+"unspsc",26101510,"Rotary engines",
+"unspsc",26101511,"Hydraulic turbine engines",
+"unspsc",26101512,"Turboprop engines",
+"unspsc",26101513,"Engine Repair Kit",
+"unspsc",26101600,"Motors",
+"unspsc",26101601,"Induction motors",
+"unspsc",26101602,"Alternating current AC motors",
+"unspsc",26101603,"Direct current DC motors",
+"unspsc",26101604,"Alternating current or direct current AC DC motors",
+"unspsc",26101605,"Dynamotors",
+"unspsc",26101606,"Servomotors",
+"unspsc",26101607,"Torque motors",
+"unspsc",26101608,"Liquid rocket motors",
+"unspsc",26101609,"Synchronous motors",
+"unspsc",26101610,"Solid rocket motors",
+"unspsc",26101611,"Single phase motors",
+"unspsc",26101612,"Multi phase motors",
+"unspsc",26101613,"Hydraulic motors",
+"unspsc",26101614,"Step motors",
+"unspsc",26101615,"Alternators",
+"unspsc",26101616,"Air motor",
+"unspsc",26101700,"Engine components and accessories",
+"unspsc",26101701,"Aircraft burners",
+"unspsc",26101702,"Aircraft engine compressors",
+"unspsc",26101703,"Aircraft engine diffusers",
+"unspsc",26101704,"Engine mounts",
+"unspsc",26101705,"Aircraft drive shafts power take offs or screw jacks",
+"unspsc",26101706,"Aircraft transmission units",
+"unspsc",26101707,"Balance shafts",
+"unspsc",26101708,"Cam followers",
+"unspsc",26101709,"Camshaft lifters",
+"unspsc",26101710,"Carburetors",
+"unspsc",26101711,"Connecting rods",
+"unspsc",26101712,"Crankcase ventilation valves",
+"unspsc",26101713,"Cylinder heads",
+"unspsc",26101715,"Engine covers or pans",
+"unspsc",26101716,"Engine forgings",
+"unspsc",26101717,"Engine heaters",
+"unspsc",26101718,"Engine ignition systems",
+"unspsc",26101719,"Supercharger",
+"unspsc",26101720,"Turbocharger",
+"unspsc",26101721,"Engine pulleys",
+"unspsc",26101723,"Fuel vapor canister",
+"unspsc",26101724,"Glow plugs",
+"unspsc",26101725,"Oil dip sticks or tubes",
+"unspsc",26101726,"Oil strainers",
+"unspsc",26101727,"Piston rings",
+"unspsc",26101728,"Push rod tubes",
+"unspsc",26101729,"Rocker arm balls",
+"unspsc",26101730,"Rocker arm shafts",
+"unspsc",26101731,"Rocker arms",
+"unspsc",26101732,"Spark plugs",
+"unspsc",26101733,"Carburetor jet",
+"unspsc",26101734,"Carburetor diaphragms",
+"unspsc",26101735,"Oil pan",
+"unspsc",26101736,"Pistons",
+"unspsc",26101737,"Timing chain",
+"unspsc",26101738,"Intake manifolds",
+"unspsc",26101740,"Fuel injectors",
+"unspsc",26101741,"Engine sleeves",
+"unspsc",26101742,"Fuel injection manifolds",
+"unspsc",26101743,"Engine valves",
+"unspsc",26101747,"Push rods",
+"unspsc",26101748,"Engine flywheel",
+"unspsc",26101749,"Crankshaft",
+"unspsc",26101750,"Throttle",
+"unspsc",26101751,"Electronic engine controls",
+"unspsc",26101754,"Engine valve seat",
+"unspsc",26101755,"Valve guide",
+"unspsc",26101756,"Carburetor adapters",
+"unspsc",26101757,"Spark plug fittings",
+"unspsc",26101758,"Rocker arm adjusters",
+"unspsc",26101759,"Starter adapters",
+"unspsc",26101760,"Choke rods",
+"unspsc",26101761,"Camshaft plugs",
+"unspsc",26101762,"Engine component linkages",
+"unspsc",26101763,"Freeze plugs",
+"unspsc",26101764,"Cylinder liners",
+"unspsc",26101765,"Vibration dampers",
+"unspsc",26101766,"Governors",
+"unspsc",26101800,"Motor or generator components",
+"unspsc",26101801,"Motor brushes",
+"unspsc",26101802,"Armatures",
+"unspsc",26101803,"Rotors or stators",
+"unspsc",26101805,"Motor repair kits",
+"unspsc",26101806,"Motor base adapters",
+"unspsc",26101807,"Motor coils",
+"unspsc",26101808,"Motor mounts or bases",
+"unspsc",26101809,"Motor brake",
+"unspsc",26101900,"Internal combustion engine components",
+"unspsc",26101903,"Camshaft",
+"unspsc",26101904,"Fuel injection nozzle",
+"unspsc",26101905,"Cylinder block",
+"unspsc",26110000,"Batteries and generators and kinetic power transmission",
+"unspsc",26111500,"Kinetic power transmission",
+"unspsc",26111501,"Commutators",
+"unspsc",26111503,"Adjustable speed drives",
+"unspsc",26111504,"Belt drives",
+"unspsc",26111505,"Chain drives",
+"unspsc",26111506,"Linear motion devices",
+"unspsc",26111508,"Power take offs",
+"unspsc",26111509,"Transmission yokes",
+"unspsc",26111510,"Transmission shafts",
+"unspsc",26111512,"Axles",
+"unspsc",26111513,"Power transmission chains",
+"unspsc",26111514,"Knuckle joints",
+"unspsc",26111515,"Servo controller",
+"unspsc",26111516,"Step drive or stepper drive or step indexer",
+"unspsc",26111517,"Planet carrier",
+"unspsc",26111518,"Tension strut",
+"unspsc",26111519,"Torque converters",
+"unspsc",26111520,"Trunnions",
+"unspsc",26111521,"Pusher head",
+"unspsc",26111522,"Pusher assembly",
+"unspsc",26111523,"Backstops",
+"unspsc",26111524,"Gear units",
+"unspsc",26111525,"Drum motor drives",
+"unspsc",26111526,"Gearmotors",
+"unspsc",26111527,"Integrated motion control systems",
+"unspsc",26111528,"Hydrostatic drives",
+"unspsc",26111529,"Hydrokinetic drives",
+"unspsc",26111530,"Transmission cam",
+"unspsc",26111531,"Transmission sleeves",
+"unspsc",26111532,"Shaft supports or assemblies",
+"unspsc",26111533,"Chain tensioners",
+"unspsc",26111534,"Transmission hubs",
+"unspsc",26111535,"Ballscrews or ballscrew assemblies",
+"unspsc",26111600,"Power generators",
+"unspsc",26111601,"Diesel generators",
+"unspsc",26111602,"Hydro electric generators",
+"unspsc",26111603,"Wind generators",
+"unspsc",26111604,"Gas generators",
+"unspsc",26111605,"Thermal generators",
+"unspsc",26111606,"Hydraulic generators",
+"unspsc",26111607,"Solar generators",
+"unspsc",26111608,"Steam generators",
+"unspsc",26111700,"Batteries and cells and accessories",
+"unspsc",26111701,"Rechargeable batteries",
+"unspsc",26111702,"Alkaline batteries",
+"unspsc",26111703,"Vehicle batteries",
+"unspsc",26111704,"Battery chargers",
+"unspsc",26111705,"Dry cell batteries",
+"unspsc",26111706,"Electronic batteries",
+"unspsc",26111707,"Lead acid batteries",
+"unspsc",26111708,"Nickel iron batteries",
+"unspsc",26111709,"Nickel cadmium batteries",
+"unspsc",26111710,"Product specific battery packs",
+"unspsc",26111711,"Lithium batteries",
+"unspsc",26111712,"Nickel hydrogen batteries",
+"unspsc",26111713,"Thermal batteries",
+"unspsc",26111714,"Zinc air",
+"unspsc",26111715,"Zinc coal battery",
+"unspsc",26111716,"Mercury oxide battery",
+"unspsc",26111717,"Manganese batteries",
+"unspsc",26111718,"Silver oxide batteries",
+"unspsc",26111719,"Battery testers",
+"unspsc",26111720,"Battery holders",
+"unspsc",26111721,"Nickel metal hydride batteries",
+"unspsc",26111722,"Battery adapter or accessories",
+"unspsc",26111723,"Battery cabinets or covers or doors",
+"unspsc",26111724,"Tool kits for batteries",
+"unspsc",26111725,"Nickel sodium chloride batteries",
+"unspsc",26111800,"Drive components",
+"unspsc",26111801,"V belts",
+"unspsc",26111802,"Geared timing belts",
+"unspsc",26111803,"Round belts",
+"unspsc",26111804,"Flat belts",
+"unspsc",26111805,"Belt tensioners",
+"unspsc",26111806,"Transmission pulleys",
+"unspsc",26111807,"Timing pulley",
+"unspsc",26111808,"Trantorque",
+"unspsc",26111809,"Belt guards",
+"unspsc",26111810,"Timing pulley flanges",
+"unspsc",26111900,"Clutches",
+"unspsc",26111901,"Plate clutches",
+"unspsc",26111902,"Diaphragm clutch",
+"unspsc",26111903,"Centrifugal clutch",
+"unspsc",26111904,"Semi centrifugal clutch",
+"unspsc",26111905,"Free wheel clutch",
+"unspsc",26111907,"Fluid coupling",
+"unspsc",26111908,"Cam clutches",
+"unspsc",26111909,"Electrical clutches",
+"unspsc",26111910,"Hydraulic clutches",
+"unspsc",26112000,"Clutch parts and accessories",
+"unspsc",26112001,"Pressure plate",
+"unspsc",26112002,"Driven plate",
+"unspsc",26112003,"Clutch plates",
+"unspsc",26112004,"Clutch repair kits",
+"unspsc",26112100,"Industrial braking systems",
+"unspsc",26112101,"Air or pneumatic braking systems",
+"unspsc",26112102,"Hydraulic braking systems",
+"unspsc",26112103,"Mechanical braking systems",
+"unspsc",26112104,"Braking clutch assemblies",
+"unspsc",26112105,"Electrical braking systems",
+"unspsc",26120000,"Electrical wire and cable and harness",
+"unspsc",26121500,"Electrical wire",
+"unspsc",26121501,"Heating wire",
+"unspsc",26121505,"Fixture wire",
+"unspsc",26121507,"Radio or television wire",
+"unspsc",26121508,"Automotive or aircraft wire",
+"unspsc",26121509,"Magnet wire",
+"unspsc",26121510,"Trolley wire",
+"unspsc",26121514,"Underground wire",
+"unspsc",26121515,"Silicon asbestos SA wire",
+"unspsc",26121517,"Copper wire",
+"unspsc",26121519,"Copper clad aluminum wire",
+"unspsc",26121520,"Copper steel wire",
+"unspsc",26121521,"Bronze wire",
+"unspsc",26121522,"Bare wire",
+"unspsc",26121523,"Covered but not insulated wire",
+"unspsc",26121524,"Insulated or covered wire",
+"unspsc",26121532,"Inter connect wire",
+"unspsc",26121533,"Kaptan wire",
+"unspsc",26121534,"Polymide wire",
+"unspsc",26121536,"Extension cord",
+"unspsc",26121538,"Wire assembly",
+"unspsc",26121539,"Hook up wires",
+"unspsc",26121540,"Galvanized wire",
+"unspsc",26121541,"Bus conductors",
+"unspsc",26121542,"Installation wire",
+"unspsc",26121543,"Heat resistant wire",
+"unspsc",26121600,"Electrical cable and accessories",
+"unspsc",26121601,"Heating cable",
+"unspsc",26121602,"Submarine cable",
+"unspsc",26121603,"Control cable",
+"unspsc",26121604,"Signal cable",
+"unspsc",26121605,"Automotive or aircraft cable",
+"unspsc",26121606,"Coaxial cable",
+"unspsc",26121607,"Fiber optic cable",
+"unspsc",26121608,"Aerial cable",
+"unspsc",26121609,"Network cable",
+"unspsc",26121610,"Bronze cable",
+"unspsc",26121611,"Bare cable",
+"unspsc",26121612,"Covered but not insulated cable",
+"unspsc",26121613,"Insulated or covered cable",
+"unspsc",26121614,"Building cable",
+"unspsc",26121615,"Power cable for direct burial",
+"unspsc",26121616,"Telecommunications cable",
+"unspsc",26121617,"Triaxial cable",
+"unspsc",26121618,"Crosslinked polykaene cable",
+"unspsc",26121619,"Floropolymer cable",
+"unspsc",26121620,"Inter connect cable",
+"unspsc",26121621,"Kaptan cable",
+"unspsc",26121622,"Polymide cable",
+"unspsc",26121623,"Radio frequency RF cable",
+"unspsc",26121624,"Ribbon or flat cable",
+"unspsc",26121628,"Screened cables",
+"unspsc",26121629,"Power cable",
+"unspsc",26121630,"Cable accessories",
+"unspsc",26121631,"Outside plant coaxial cable",
+"unspsc",26121632,"Outside plant communications cable",
+"unspsc",26121633,"Outside plant telecommunications cable",
+"unspsc",26121634,"Copper cable",
+"unspsc",26121635,"Cable reels",
+"unspsc",26121636,"Power cord",
+"unspsc",26121637,"Outdoor fiber optics cable",
+"unspsc",26121638,"Crimping materials",
+"unspsc",26121639,"Combined or customized multi cables",
+"unspsc",26121640,"Heat resistant cables",
+"unspsc",26121641,"Installation cables",
+"unspsc",26121700,"Wiring harness",
+"unspsc",26121701,"Panel wiring harness",
+"unspsc",26121702,"Trunk wiring harness",
+"unspsc",26121703,"Communication wiring harness",
+"unspsc",26121704,"Specialty wiring harness",
+"unspsc",26121705,"Fiber optic cable assembly",
+"unspsc",26130000,"Power generation",
+"unspsc",26131500,"Power plants",
+"unspsc",26131501,"Diesel power plants",
+"unspsc",26131502,"Geothermal power plants",
+"unspsc",26131503,"Hydro power plants",
+"unspsc",26131504,"Gas power plants",
+"unspsc",26131505,"Marine power plants",
+"unspsc",26131506,"Petrol power plants",
+"unspsc",26131507,"Solar power plants",
+"unspsc",26131508,"Steam power plants",
+"unspsc",26131509,"Wind power plants",
+"unspsc",26131510,"Thermal power plants",
+"unspsc",26131600,"Exhaust structures or screening equipment",
+"unspsc",26131601,"Traveling water screens",
+"unspsc",26131602,"Stop logs",
+"unspsc",26131603,"Water trash racks",
+"unspsc",26131604,"Fixed screens",
+"unspsc",26131605,"Intake structures",
+"unspsc",26131606,"Steel exhaust stack",
+"unspsc",26131607,"Concrete exhaust stacks",
+"unspsc",26131608,"Flare or vent stacks",
+"unspsc",26131609,"Exhaust inlet stacks",
+"unspsc",26131610,"Bypass stacks",
+"unspsc",26131611,"Silencer sections",
+"unspsc",26131612,"Exhaust outlet ducts",
+"unspsc",26131613,"Exhaust duct expansion joints",
+"unspsc",26131614,"Stack closure dampers",
+"unspsc",26131615,"Exhaust diversion dampers",
+"unspsc",26131616,"Exhaust isolation dampers",
+"unspsc",26131700,"Power generation monitoring or detecting equipment",
+"unspsc",26131701,"Combustible or hazardous gas detectors for power generators",
+"unspsc",26131702,"Gas turbine combustion system flame detectors",
+"unspsc",26131800,"Power generation control equipment",
+"unspsc",26131801,"Electrical control panels for generators",
+"unspsc",26131802,"Compressor control panels",
+"unspsc",26131803,"Generator control or protection panels",
+"unspsc",26131804,"Gas turbine control panels",
+"unspsc",26131805,"Low voltage motor control centers",
+"unspsc",26131806,"Low voltage alternating and direct current AC DC panelboards",
+"unspsc",26131807,"Steam turbines control panels",
+"unspsc",26131808,"Substation load control switchgears",
+"unspsc",26131809,"Small voltage switchgears",
+"unspsc",26131810,"Medium voltage switchgears",
+"unspsc",26131811,"Current limiting reactors",
+"unspsc",26131812,"Gas insulated switchgears",
+"unspsc",26131813,"Switchyard disconnect switches",
+"unspsc",26131814,"Switchyard surge arrestors",
+"unspsc",26140000,"Atomic and nuclear energy machinery and equipment",
+"unspsc",26141600,"Subcritical assembly equipment",
+"unspsc",26141601,"Subcritical assembly fuel",
+"unspsc",26141602,"Subcritical assembly components",
+"unspsc",26141603,"Subcritical assembly moderator",
+"unspsc",26141700,"Dosimetry equipment",
+"unspsc",26141701,"Ionization chamber dosimeters",
+"unspsc",26141702,"Dosimeters",
+"unspsc",26141703,"Secondary standard dosimetry systems",
+"unspsc",26141704,"Phantom dosimeters",
+"unspsc",26141800,"Hot cell devices",
+"unspsc",26141801,"Hot cell remote handling equipment",
+"unspsc",26141802,"Hot cell remote viewing device",
+"unspsc",26141803,"Hot cell shielding doors",
+"unspsc",26141804,"Hot cell samplers",
+"unspsc",26141805,"Hot cell sample processing equipment",
+"unspsc",26141806,"Hot cell special tools",
+"unspsc",26141807,"Hot cell lead glass windows",
+"unspsc",26141808,"Hot cell decontamination systems",
+"unspsc",26141809,"Hot cell penetration devices",
+"unspsc",26141900,"Industrial nucleonic instruments",
+"unspsc",26141901,"Industrial nucleonic airborne dust measuring systems",
+"unspsc",26141902,"Beta gauge measuring systems",
+"unspsc",26141904,"Industrial nucleonic liquid level gauges",
+"unspsc",26141905,"Industrial nucleonic mass per unit ore measuring systems",
+"unspsc",26141906,"Industrial nucleonic moisture measuring systems",
+"unspsc",26141907,"Industrial nucleonic thickness measuring systems",
+"unspsc",26141908,"Industrial nucleonic flow measuring systems",
+"unspsc",26141909,"Isotope separators",
+"unspsc",26141910,"Isotope production facilities",
+"unspsc",26141911,"Isotope calibrator activity meters",
+"unspsc",26142000,"Irradiation equipment",
+"unspsc",26142001,"Irradiation gamma sources",
+"unspsc",26142002,"Magnet systems",
+"unspsc",26142003,"NIM nuclear electronic units",
+"unspsc",26142004,"Neutron irradiators",
+"unspsc",26142005,"Irradiation testing capsules",
+"unspsc",26142006,"Irradiation sample transfer system",
+"unspsc",26142007,"Neutron generators",
+"unspsc",26142100,"Nuclear reactor equipment",
+"unspsc",26142101,"Nuclear reactor specimen irradiation containers",
+"unspsc",26142106,"Nuclear reactor control rod systems",
+"unspsc",26142108,"Nuclear reactor in core neutron flux instrumentation",
+"unspsc",26142117,"Nuclear reactor earthquake instrumentation",
+"unspsc",26142200,"Nuclear fuel equipment",
+"unspsc",26142201,"Nuclear fuel cladding tubes",
+"unspsc",26142202,"Nuclear fuel element failure detection systems",
+"unspsc",26142300,"Radiation shielding equipment",
+"unspsc",26142302,"Lead screens",
+"unspsc",26142303,"Film badges",
+"unspsc",26142304,"Radiographic equipment",
+"unspsc",26142306,"Shielded containers for radiation protection",
+"unspsc",26142307,"Lead chambers or safes for radiation protection",
+"unspsc",26142308,"Lead bricks for radiation protection",
+"unspsc",26142310,"Glove boxes for radiation protection",
+"unspsc",26142311,"Radiation shielding windows",
+"unspsc",26142312,"Lead for radiation shielding",
+"unspsc",26142400,"Radioactive waste equipment",
+"unspsc",26142401,"Radioactive waste treatment compactors or incinerators",
+"unspsc",26142402,"Nuclear radiation absorbers",
+"unspsc",26142403,"Atomic energy evaporators or concentrators or dryers",
+"unspsc",26142404,"Door interlocking systems",
+"unspsc",26142405,"Radioactive waste dosage systems",
+"unspsc",26142406,"Radioactive waste solidification systems",
+"unspsc",26142407,"Radioactive waste disposal systems",
+"unspsc",26142408,"Radioactive waste treatment facilities",
+"unspsc",27000000,"Tools and General Machinery",
+"unspsc",27110000,"Hand tools",
+"unspsc",27111500,"Cutting and crimping and punching tools",
+"unspsc",27111501,"Knife blades",
+"unspsc",27111502,"Razor knives",
+"unspsc",27111503,"Utility knives",
+"unspsc",27111504,"Pocket knives",
+"unspsc",27111505,"Punches or nail sets or drifts",
+"unspsc",27111506,"Shears",
+"unspsc",27111507,"Metal cutters",
+"unspsc",27111508,"Saws",
+"unspsc",27111509,"Augers",
+"unspsc",27111510,"Stripping tools",
+"unspsc",27111511,"Wire cutters",
+"unspsc",27111512,"Bolt cutters",
+"unspsc",27111513,"Hose cutter",
+"unspsc",27111514,"Glass cutters",
+"unspsc",27111515,"Hand or push drill",
+"unspsc",27111516,"Punching pliers",
+"unspsc",27111517,"Knife blade sets or dispensers",
+"unspsc",27111518,"Wire lug crimping tool",
+"unspsc",27111519,"Tinners snips",
+"unspsc",27111520,"Nut splitters",
+"unspsc",27111521,"Nibblers",
+"unspsc",27111600,"Forming tools",
+"unspsc",27111601,"Mallets",
+"unspsc",27111602,"Hammers",
+"unspsc",27111603,"Anvils",
+"unspsc",27111604,"Hatchets",
+"unspsc",27111605,"Picks",
+"unspsc",27111607,"Swaging tools",
+"unspsc",27111608,"Manual wire straighteners",
+"unspsc",27111609,"Electric wire straighteners",
+"unspsc",27111700,"Wrenches and drivers",
+"unspsc",27111701,"Screwdrivers",
+"unspsc",27111702,"Nut drivers",
+"unspsc",27111703,"Socket sets",
+"unspsc",27111704,"Sockets",
+"unspsc",27111705,"Box end wrenches",
+"unspsc",27111706,"Open end wrenches",
+"unspsc",27111707,"Adjustable wrenches",
+"unspsc",27111708,"Pipe wrenches",
+"unspsc",27111709,"Screw extractors",
+"unspsc",27111710,"Hex keys",
+"unspsc",27111711,"Ratchets",
+"unspsc",27111712,"Pullers",
+"unspsc",27111713,"Combination wrenches",
+"unspsc",27111714,"Specialty wrenches",
+"unspsc",27111715,"Torque wrenches",
+"unspsc",27111716,"Torx keys",
+"unspsc",27111717,"Pipe extractors",
+"unspsc",27111718,"Tap extractors",
+"unspsc",27111720,"T handle tap wrenches",
+"unspsc",27111721,"Cranks",
+"unspsc",27111722,"Die stocks",
+"unspsc",27111723,"Tube wrenches",
+"unspsc",27111724,"Hook wrenches",
+"unspsc",27111725,"Offset socket wrenches",
+"unspsc",27111726,"Spanner wrenches",
+"unspsc",27111727,"Chuck keys",
+"unspsc",27111800,"Measuring and layout tools",
+"unspsc",27111801,"Tape measures",
+"unspsc",27111802,"Levels",
+"unspsc",27111803,"Squares",
+"unspsc",27111804,"Plumb bobs",
+"unspsc",27111806,"Nail or router gauges",
+"unspsc",27111807,"Straight edges",
+"unspsc",27111809,"Bevels",
+"unspsc",27111810,"Stud finders",
+"unspsc",27111900,"Rough and finishing tools",
+"unspsc",27111901,"Cold chisels",
+"unspsc",27111902,"Files",
+"unspsc",27111903,"Planes",
+"unspsc",27111904,"Rasps",
+"unspsc",27111905,"Grinders",
+"unspsc",27111906,"Wood chisels",
+"unspsc",27111907,"Wire brushes",
+"unspsc",27111908,"Sharpening stones or tools or kits",
+"unspsc",27111909,"Spatulas",
+"unspsc",27111910,"Burins",
+"unspsc",27111911,"Cross cut chisels",
+"unspsc",27112000,"Garden tools",
+"unspsc",27112001,"Machetes",
+"unspsc",27112002,"Spades",
+"unspsc",27112003,"Rakes",
+"unspsc",27112004,"Shovels",
+"unspsc",27112005,"Axes",
+"unspsc",27112006,"Scythes",
+"unspsc",27112007,"Secateurs or pruning shears",
+"unspsc",27112008,"Hoes",
+"unspsc",27112009,"Scrapers",
+"unspsc",27112010,"Garden forks",
+"unspsc",27112011,"Tool handles",
+"unspsc",27112012,"Garden riddles",
+"unspsc",27112013,"Post hole digger",
+"unspsc",27112014,"Lawnmowers",
+"unspsc",27112015,"Lawn scarifiers",
+"unspsc",27112016,"Hedge clippers",
+"unspsc",27112017,"Digging bars",
+"unspsc",27112100,"Holding and clamping tools",
+"unspsc",27112101,"Pipe vises",
+"unspsc",27112102,"Bench vises",
+"unspsc",27112103,"Hand clamps",
+"unspsc",27112104,"Tongs",
+"unspsc",27112105,"Tweezers",
+"unspsc",27112106,"Linemans pliers",
+"unspsc",27112107,"Adjustable widemouth pliers",
+"unspsc",27112108,"Needlenose pliers",
+"unspsc",27112109,"Magnetic tools",
+"unspsc",27112110,"Retaining ring pliers",
+"unspsc",27112111,"Alligator pliers",
+"unspsc",27112112,"Tongue and groove pliers",
+"unspsc",27112113,"Slip or groove joint pliers",
+"unspsc",27112114,"Diagonal cut pliers",
+"unspsc",27112115,"Locking pliers",
+"unspsc",27112116,"Fence pliers",
+"unspsc",27112117,"End cut pliers",
+"unspsc",27112119,"Light bulb changer",
+"unspsc",27112120,"C clamps",
+"unspsc",27112121,"Corner clamps",
+"unspsc",27112122,"Sheet metal pliers",
+"unspsc",27112123,"Bench dog",
+"unspsc",27112124,"Tensioners",
+"unspsc",27112125,"Round nose pliers",
+"unspsc",27112126,"Flat nose pliers",
+"unspsc",27112127,"Strap wrenches",
+"unspsc",27112128,"Curved nose pliers",
+"unspsc",27112129,"Round handle clamps",
+"unspsc",27112130,"Three jaw clamps",
+"unspsc",27112131,"Deep throat jaw opening clamps",
+"unspsc",27112132,"Hold down clamps",
+"unspsc",27112133,"T handle clamps",
+"unspsc",27112134,"Longnose pliers",
+"unspsc",27112200,"Masonry and concrete tools",
+"unspsc",27112201,"Trowels",
+"unspsc",27112202,"Floats",
+"unspsc",27112203,"Edgers",
+"unspsc",27112205,"Concrete vibrators",
+"unspsc",27112300,"Marking tools",
+"unspsc",27112301,"Branders",
+"unspsc",27112302,"Awls",
+"unspsc",27112303,"Scribers",
+"unspsc",27112304,"Chalk lines",
+"unspsc",27112305,"Metal markers or holders",
+"unspsc",27112306,"Metal stamps",
+"unspsc",27112400,"Fastener setting tools",
+"unspsc",27112401,"Staple guns",
+"unspsc",27112402,"Rivet tools",
+"unspsc",27112403,"Banders",
+"unspsc",27112404,"Anchor setting tools",
+"unspsc",27112405,"Bolt heaters",
+"unspsc",27112406,"Tag guns",
+"unspsc",27112407,"Security tag detacher",
+"unspsc",27112500,"Prying and bending tools",
+"unspsc",27112501,"Pipe bending tools",
+"unspsc",27112502,"Pry bars",
+"unspsc",27112503,"Conduit benders",
+"unspsc",27112504,"Wedges",
+"unspsc",27112505,"Packing hooks",
+"unspsc",27112506,"Hickeys",
+"unspsc",27112600,"Sealing tools",
+"unspsc",27112601,"Putty knives",
+"unspsc",27112602,"Caulking tools",
+"unspsc",27112700,"Power tools",
+"unspsc",27112701,"Power blowers",
+"unspsc",27112702,"Power buffers",
+"unspsc",27112703,"Power drills",
+"unspsc",27112704,"Power grinders",
+"unspsc",27112705,"Demolition hammers",
+"unspsc",27112706,"Power planes",
+"unspsc",27112707,"Power routers",
+"unspsc",27112708,"Power sanders",
+"unspsc",27112709,"Power saws",
+"unspsc",27112710,"Power screwguns",
+"unspsc",27112711,"Power staple guns",
+"unspsc",27112712,"Power trimmers",
+"unspsc",27112713,"Impact wrenches",
+"unspsc",27112714,"Power caulking guns",
+"unspsc",27112715,"Power chippers",
+"unspsc",27112716,"Power nail guns",
+"unspsc",27112717,"Heat guns",
+"unspsc",27112718,"Engravers",
+"unspsc",27112719,"Glue guns",
+"unspsc",27112720,"Torque tools",
+"unspsc",27112721,"Biscuit jointers",
+"unspsc",27112800,"Tool attachments and accessories",
+"unspsc",27112801,"Drill bits",
+"unspsc",27112802,"Saw blades",
+"unspsc",27112803,"End mills",
+"unspsc",27112804,"Stamping dies or punches",
+"unspsc",27112805,"Threading dies",
+"unspsc",27112806,"Threading taps",
+"unspsc",27112807,"Chucks",
+"unspsc",27112808,"Collets",
+"unspsc",27112809,"Tool holders",
+"unspsc",27112810,"Thread repair kits",
+"unspsc",27112811,"Arbors",
+"unspsc",27112812,"Countersinks",
+"unspsc",27112813,"Extension pole",
+"unspsc",27112814,"Screwdriver bits",
+"unspsc",27112815,"Nut driver bits",
+"unspsc",27112818,"Vise jaw liners or caps",
+"unspsc",27112819,"Skiving tool cutter blades",
+"unspsc",27112820,"Lug crimping tool dies",
+"unspsc",27112821,"Router bits",
+"unspsc",27112822,"Hub adapters",
+"unspsc",27112823,"Cutting chains",
+"unspsc",27112824,"Chuck sleeves",
+"unspsc",27112825,"Tool template sets",
+"unspsc",27112826,"Hole saws",
+"unspsc",27112900,"Dispensing tools",
+"unspsc",27112901,"Grease guns",
+"unspsc",27112902,"Industrial funnels",
+"unspsc",27112903,"Hand sprayers",
+"unspsc",27112904,"Resin guns",
+"unspsc",27112905,"Oil can",
+"unspsc",27112906,"Caulking guns",
+"unspsc",27112907,"Broadcast spreaders",
+"unspsc",27112908,"Oil gun",
+"unspsc",27113000,"Brushes",
+"unspsc",27113001,"Scratch brushes",
+"unspsc",27113002,"Tube brushes",
+"unspsc",27113003,"Applicator brushes",
+"unspsc",27113004,"Stretcher brushes",
+"unspsc",27113100,"Pulling tools",
+"unspsc",27113101,"Fish tape",
+"unspsc",27113102,"Fuse pullers",
+"unspsc",27113103,"Fids",
+"unspsc",27113200,"Tool kits",
+"unspsc",27113201,"General tool kits",
+"unspsc",27113202,"Bearing fitting tool kits",
+"unspsc",27113203,"Computer tool kits",
+"unspsc",27113204,"Electrician kits",
+"unspsc",27120000,"Hydraulic machinery and equipment",
+"unspsc",27121500,"Hydraulic presses",
+"unspsc",27121501,"Press return springs",
+"unspsc",27121502,"Hydraulic press frames",
+"unspsc",27121503,"Hydraulic press columns",
+"unspsc",27121600,"Hydraulic cylinders and pistons",
+"unspsc",27121601,"Cylinder pistons",
+"unspsc",27121602,"Hydraulic cylinders",
+"unspsc",27121603,"Hydraulic cylinder piston rods",
+"unspsc",27121604,"Hydraulic cylinder or component repair kits",
+"unspsc",27121605,"Hydraulic cylinder barrels",
+"unspsc",27121606,"Mounting bases for hydraulic cylinders",
+"unspsc",27121700,"Hydraulic hose and tube fittings",
+"unspsc",27121701,"Hydraulic quick connectors",
+"unspsc",27121702,"Hydraulic tees or crosses",
+"unspsc",27121703,"Ferrules",
+"unspsc",27121704,"Hydraulic unions",
+"unspsc",27121705,"Hydraulic or compression elbows",
+"unspsc",27121706,"Ferrule nuts",
+"unspsc",27121707,"Crimp connectors",
+"unspsc",27126100,"Hydraulic tools",
+"unspsc",27126101,"Manhole cover lifters",
+"unspsc",27126102,"Hydraulic accumulators",
+"unspsc",27130000,"Pneumatic machinery and equipment",
+"unspsc",27131500,"Pneumatic tools",
+"unspsc",27131501,"Pneumatic impact wrenches",
+"unspsc",27131502,"Compressed air gun",
+"unspsc",27131504,"Pneumatic hammer",
+"unspsc",27131505,"Pneumatic drill",
+"unspsc",27131506,"Pneumatic nail drivers",
+"unspsc",27131507,"Pneumatic sanding machines",
+"unspsc",27131508,"Air motors",
+"unspsc",27131509,"Pneumatic accumulators",
+"unspsc",27131510,"Accumulator bladders or bags",
+"unspsc",27131511,"Pneumatic grinders",
+"unspsc",27131512,"Pneumatic screwdriver",
+"unspsc",27131600,"Air fittings and connectors",
+"unspsc",27131601,"Air manifolds",
+"unspsc",27131603,"Air regulators",
+"unspsc",27131604,"Pneumatic lubricators",
+"unspsc",27131605,"Air curtain",
+"unspsc",27131608,"Vacuum cups or pads",
+"unspsc",27131609,"Pneumatic silencers",
+"unspsc",27131610,"Lubricator or regulator repair kits",
+"unspsc",27131613,"Air coupling",
+"unspsc",27131614,"Pneumatic adapters",
+"unspsc",27131700,"Pneumatic cylinders and components",
+"unspsc",27131701,"Pneumatic cylinders",
+"unspsc",27131702,"Pneumatic cylinder rod accessories",
+"unspsc",27131703,"Pneumatic cylinder pistons",
+"unspsc",27131704,"Pneumatic cylinder piston rods",
+"unspsc",27131705,"Pneumatic cylinder barrel",
+"unspsc",27131706,"Pneumatic cylinder end caps",
+"unspsc",27131707,"Pneumatic cylinder or component repair kits",
+"unspsc",27131708,"Mounting bases for pneumatic cylinder",
+"unspsc",27131709,"Pneumatic cylinder cushion rings",
+"unspsc",27140000,"Automotive specialty tools",
+"unspsc",27141000,"Body tools",
+"unspsc",27141001,"Trim or molding tools",
+"unspsc",27141100,"Suspension tools",
+"unspsc",27141101,"Steering wheel puller",
+"unspsc",30000000,"Structures and Building and Construction and Manufacturing Components and Supplies",
+"unspsc",30100000,"Structural materials and basic shapes",
+"unspsc",30101500,"Angles",
+"unspsc",30101501,"Ferrous alloy angles",
+"unspsc",30101502,"Non ferrous alloy angles",
+"unspsc",30101503,"Iron angles",
+"unspsc",30101504,"Steel angles",
+"unspsc",30101505,"Stainless steel angles",
+"unspsc",30101506,"Aluminum angles",
+"unspsc",30101507,"Magnesium angles",
+"unspsc",30101508,"Titanium angles",
+"unspsc",30101509,"Copper angles",
+"unspsc",30101510,"Brass angles",
+"unspsc",30101511,"Bronze angles",
+"unspsc",30101512,"Zinc angles",
+"unspsc",30101513,"Tin angles",
+"unspsc",30101514,"Lead angles",
+"unspsc",30101515,"Plastic angles",
+"unspsc",30101516,"Rubber angles",
+"unspsc",30101517,"Precious metal angles",
+"unspsc",30101600,"Bar",
+"unspsc",30101601,"Ferrous alloy bars",
+"unspsc",30101602,"Non ferrous alloy bars",
+"unspsc",30101603,"Iron bars",
+"unspsc",30101604,"Steel bars",
+"unspsc",30101605,"Stainless steel bars",
+"unspsc",30101606,"Aluminum bars",
+"unspsc",30101607,"Magnesium bars",
+"unspsc",30101608,"Titanium bars",
+"unspsc",30101609,"Copper bars",
+"unspsc",30101610,"Brass bars",
+"unspsc",30101611,"Bronze bars",
+"unspsc",30101612,"Zinc bars",
+"unspsc",30101613,"Tin bars",
+"unspsc",30101614,"Lead bars",
+"unspsc",30101615,"Plastic bars",
+"unspsc",30101616,"Precious metal bars",
+"unspsc",30101617,"Wooden bars",
+"unspsc",30101618,"Rubber bars",
+"unspsc",30101700,"Beams",
+"unspsc",30101701,"Ferrous alloy beams",
+"unspsc",30101702,"Non ferrous alloy beams",
+"unspsc",30101703,"Iron beams",
+"unspsc",30101704,"Steel beams",
+"unspsc",30101705,"Stainless steel beams",
+"unspsc",30101706,"Aluminum beams",
+"unspsc",30101707,"Magnesium beams",
+"unspsc",30101708,"Titanium beams",
+"unspsc",30101709,"Copper beams",
+"unspsc",30101710,"Brass beams",
+"unspsc",30101711,"Bronze beams",
+"unspsc",30101712,"Zinc beams",
+"unspsc",30101713,"Tin beams",
+"unspsc",30101714,"Lead beams",
+"unspsc",30101715,"Plastic beams",
+"unspsc",30101716,"Rubber beams",
+"unspsc",30101717,"Concrete beams",
+"unspsc",30101718,"Precious metal beams",
+"unspsc",30101800,"Channels",
+"unspsc",30101801,"Ferrous alloy channels",
+"unspsc",30101802,"Non ferrous alloy channels",
+"unspsc",30101803,"Iron channels",
+"unspsc",30101804,"Steel channels",
+"unspsc",30101805,"Stainless steel channels",
+"unspsc",30101806,"Aluminum channels",
+"unspsc",30101807,"Magnesium channels",
+"unspsc",30101808,"Titanium channels",
+"unspsc",30101809,"Copper channels",
+"unspsc",30101810,"Brass channels",
+"unspsc",30101811,"Bronze channels",
+"unspsc",30101812,"Zinc channels",
+"unspsc",30101813,"Tin channels",
+"unspsc",30101814,"Lead channels",
+"unspsc",30101815,"Plastic channels",
+"unspsc",30101816,"Rubber channels",
+"unspsc",30101817,"Precious metal channels",
+"unspsc",30101900,"Coil",
+"unspsc",30101901,"Ferrous alloy coil",
+"unspsc",30101902,"Non ferrous alloy coil",
+"unspsc",30101903,"Iron coil",
+"unspsc",30101904,"Steel coil",
+"unspsc",30101905,"Stainless steel coil",
+"unspsc",30101906,"Aluminum coil",
+"unspsc",30101907,"Magnesium coil",
+"unspsc",30101908,"Titanium coil",
+"unspsc",30101909,"Copper coil",
+"unspsc",30101910,"Brass coil",
+"unspsc",30101911,"Bronze coil",
+"unspsc",30101912,"Zinc coil",
+"unspsc",30101913,"Tin coil",
+"unspsc",30101914,"Lead coil",
+"unspsc",30101915,"Plastic coil",
+"unspsc",30101916,"Precious metal coils",
+"unspsc",30101918,"Perforated steel",
+"unspsc",30101919,"Embossed steel",
+"unspsc",30101920,"Compressed fiber coil",
+"unspsc",30101921,"Fiber and rubber coil",
+"unspsc",30101922,"Graphite coil",
+"unspsc",30101923,"Aluminized steel coil",
+"unspsc",30102000,"Foil",
+"unspsc",30102001,"Ferrous alloy foil",
+"unspsc",30102002,"Non ferrous alloy foil",
+"unspsc",30102003,"Iron foil",
+"unspsc",30102004,"Steel foil",
+"unspsc",30102005,"Stainless steel foil",
+"unspsc",30102006,"Aluminum foil",
+"unspsc",30102007,"Magnesium foil",
+"unspsc",30102008,"Titanium foil",
+"unspsc",30102009,"Copper foil",
+"unspsc",30102010,"Brass foil",
+"unspsc",30102011,"Bronze foil",
+"unspsc",30102012,"Zinc foil",
+"unspsc",30102013,"Tin foil",
+"unspsc",30102014,"Lead foil",
+"unspsc",30102015,"Plastic foil",
+"unspsc",30102200,"Plate",
+"unspsc",30102201,"Ferrous alloy plate",
+"unspsc",30102202,"Non ferrous plate",
+"unspsc",30102203,"Iron plate",
+"unspsc",30102204,"Steel plate",
+"unspsc",30102205,"Stainless steel plate",
+"unspsc",30102206,"Aluminum plate",
+"unspsc",30102207,"Magnesium plate",
+"unspsc",30102208,"Titanium plate",
+"unspsc",30102209,"Copper plate",
+"unspsc",30102210,"Brass plate",
+"unspsc",30102211,"Bronze plate",
+"unspsc",30102212,"Zinc plate",
+"unspsc",30102213,"Tin plate",
+"unspsc",30102214,"Lead plate",
+"unspsc",30102215,"Plastic plate",
+"unspsc",30102216,"Rubber plate",
+"unspsc",30102217,"Concrete plate",
+"unspsc",30102218,"Precious metal plate",
+"unspsc",30102220,"Nickel plate",
+"unspsc",30102300,"Profiles",
+"unspsc",30102301,"Ferrous alloy profiles",
+"unspsc",30102302,"Non ferrous alloy profiles",
+"unspsc",30102303,"Iron profiles",
+"unspsc",30102304,"Steel profiles",
+"unspsc",30102305,"Stainless steel profiles",
+"unspsc",30102306,"Aluminum profiles",
+"unspsc",30102307,"Magnesium profiles",
+"unspsc",30102308,"Titanium profiles",
+"unspsc",30102309,"Copper profiles",
+"unspsc",30102310,"Brass profiles",
+"unspsc",30102311,"Bronze profiles",
+"unspsc",30102312,"Zinc profiles",
+"unspsc",30102313,"Tin profiles",
+"unspsc",30102314,"Lead profiles",
+"unspsc",30102315,"Plastic profiles",
+"unspsc",30102316,"Rubber profiles",
+"unspsc",30102400,"Rod",
+"unspsc",30102401,"Ferrous alloy rods",
+"unspsc",30102402,"Non ferrous alloy rods",
+"unspsc",30102403,"Iron rods",
+"unspsc",30102404,"Steel rods",
+"unspsc",30102405,"Stainless steel rods",
+"unspsc",30102406,"Aluminum rods",
+"unspsc",30102407,"Magnesium rods",
+"unspsc",30102408,"Titanium rods",
+"unspsc",30102409,"Copper rods",
+"unspsc",30102410,"Brass rods",
+"unspsc",30102411,"Bronze rods",
+"unspsc",30102412,"Zinc rods",
+"unspsc",30102413,"Tin rods",
+"unspsc",30102414,"Lead rods",
+"unspsc",30102415,"Plastic rods",
+"unspsc",30102416,"Rubber rods",
+"unspsc",30102417,"Nickel rod",
+"unspsc",30102500,"Sheet",
+"unspsc",30102501,"Ferrous alloy sheet",
+"unspsc",30102502,"Non ferrous alloy sheet",
+"unspsc",30102503,"Iron sheet",
+"unspsc",30102504,"Steel sheet",
+"unspsc",30102505,"Stainless steel sheet",
+"unspsc",30102506,"Aluminum sheet",
+"unspsc",30102507,"Magnesium sheet",
+"unspsc",30102508,"Titanium sheet",
+"unspsc",30102509,"Copper sheet",
+"unspsc",30102510,"Brass sheet",
+"unspsc",30102511,"Bronze sheet",
+"unspsc",30102512,"Zinc sheet",
+"unspsc",30102513,"Tin sheet",
+"unspsc",30102514,"Lead sheet",
+"unspsc",30102515,"Plastic sheet",
+"unspsc",30102516,"Rubber sheet",
+"unspsc",30102517,"Armor sheet",
+"unspsc",30102518,"Beryllium alloy sheet",
+"unspsc",30102519,"Composite metal sheet",
+"unspsc",30102520,"Nickel sheet",
+"unspsc",30102521,"Foam Rubber Sheet",
+"unspsc",30102522,"Cork and rubber sheet",
+"unspsc",30102523,"Compressed fiber sheet",
+"unspsc",30102524,"Metal inserted compressed fiber sheet",
+"unspsc",30102525,"Fiber and rubber sheet",
+"unspsc",30102526,"Asbestos sheets",
+"unspsc",30102600,"Strip",
+"unspsc",30102601,"Ferrous alloy strip",
+"unspsc",30102602,"Non ferrous alloy strip",
+"unspsc",30102603,"Iron strip",
+"unspsc",30102604,"Steel strip",
+"unspsc",30102605,"Stainless steel strip",
+"unspsc",30102606,"Aluminum strip",
+"unspsc",30102607,"Magnesium strip",
+"unspsc",30102608,"Titanium strip",
+"unspsc",30102609,"Copper strip",
+"unspsc",30102610,"Brass strip",
+"unspsc",30102611,"Bronze strip",
+"unspsc",30102612,"Zinc strip",
+"unspsc",30102613,"Tin strip",
+"unspsc",30102614,"Lead strip",
+"unspsc",30102615,"Plastic strip",
+"unspsc",30102616,"Rubber strip",
+"unspsc",30102800,"Piling",
+"unspsc",30102801,"Aluminum pilings",
+"unspsc",30102802,"Concrete pilings",
+"unspsc",30102803,"Steel pilings",
+"unspsc",30102900,"Post",
+"unspsc",30102901,"Cement or concrete posts",
+"unspsc",30102903,"Metal posts",
+"unspsc",30102904,"Wooden posts",
+"unspsc",30102905,"Plastic posts",
+"unspsc",30102906,"Fiberglass posts",
+"unspsc",30103000,"Shafting",
+"unspsc",30103001,"Steel shafting",
+"unspsc",30103002,"Stainless steel shafting",
+"unspsc",30103100,"Rails",
+"unspsc",30103101,"Steel rail",
+"unspsc",30103102,"Aluminum rail",
+"unspsc",30103103,"Metal rail",
+"unspsc",30103200,"Grating",
+"unspsc",30103201,"Steel grating",
+"unspsc",30103202,"Stainless steel grating",
+"unspsc",30103203,"Aluminum grating",
+"unspsc",30103204,"Fiberglass grating",
+"unspsc",30103205,"Iron grating",
+"unspsc",30103206,"Plastic grating",
+"unspsc",30103300,"Billets",
+"unspsc",30103301,"Aluminum billet",
+"unspsc",30103302,"Brass billet",
+"unspsc",30103303,"Bronze billets",
+"unspsc",30103304,"Copper billets",
+"unspsc",30103305,"Lead billets",
+"unspsc",30103306,"Zinc billets",
+"unspsc",30103307,"Steel billets",
+"unspsc",30103308,"Titanium billets",
+"unspsc",30103309,"Magnesium billets",
+"unspsc",30103310,"Precious metal billets",
+"unspsc",30103311,"Non ferrous metal billets",
+"unspsc",30103312,"Ferrous metal billets",
+"unspsc",30103313,"Non metallic billets",
+"unspsc",30103400,"Ingots",
+"unspsc",30103401,"Aluminum ingots",
+"unspsc",30103402,"Brass ingots",
+"unspsc",30103403,"Lead ingots",
+"unspsc",30103404,"Zinc ingots",
+"unspsc",30103405,"Steel ingots",
+"unspsc",30103406,"Magnesium ingots",
+"unspsc",30103407,"Bronze ingots",
+"unspsc",30103408,"Copper ingots",
+"unspsc",30103409,"Titanium ingots",
+"unspsc",30103410,"Precious metal ingots",
+"unspsc",30103411,"Ferrous alloy extrusion ingots",
+"unspsc",30103412,"Non ferrous alloy extrusion ingots",
+"unspsc",30103413,"Non metallic ingots",
+"unspsc",30103500,"Honeycomb core",
+"unspsc",30103501,"Aluminum honeycomb core",
+"unspsc",30103502,"Magnesium honeycomb core",
+"unspsc",30103503,"Foam honeycomb core",
+"unspsc",30103504,"Plastic honeycomb core",
+"unspsc",30103505,"Wooden honeycomb core",
+"unspsc",30103506,"Ferrous metal honeycomb core",
+"unspsc",30103507,"Bronze honeycomb core",
+"unspsc",30103508,"Copper honeycomb core",
+"unspsc",30103509,"Steel honeycomb core",
+"unspsc",30103510,"Lead honeycomb core",
+"unspsc",30103511,"Zinc honeycomb core",
+"unspsc",30103512,"Titanium honeycomb core",
+"unspsc",30103513,"Brass honeycomb core",
+"unspsc",30103514,"Non ferrous metal honeycomb core",
+"unspsc",30103515,"Precious metal honeycomb core",
+"unspsc",30103600,"Structural products",
+"unspsc",30103601,"Wood beams",
+"unspsc",30103602,"Wood composite beams",
+"unspsc",30103603,"Framing lumber",
+"unspsc",30103604,"Wood sheathing or sheets",
+"unspsc",30103605,"Wood planks",
+"unspsc",30103606,"Wood trusses",
+"unspsc",30103607,"Wood joists",
+"unspsc",30103608,"Wooden poles or telephone poles",
+"unspsc",30103700,"Braid",
+"unspsc",30103701,"Stainless steel braid",
+"unspsc",30110000,"Concrete and cement and plaster",
+"unspsc",30111500,"Concrete and mortars",
+"unspsc",30111501,"Foamed concrete",
+"unspsc",30111502,"Conductive concrete",
+"unspsc",30111503,"Insulating concrete",
+"unspsc",30111504,"Mortars",
+"unspsc",30111600,"Cement and lime",
+"unspsc",30111601,"Cement",
+"unspsc",30111602,"Chlorinated lime",
+"unspsc",30111603,"Hydraulic lime",
+"unspsc",30111604,"Hydrated lime",
+"unspsc",30111605,"Lean lime",
+"unspsc",30111606,"Grout",
+"unspsc",30111607,"Unslaked lime",
+"unspsc",30111700,"Plasters",
+"unspsc",30111701,"Gypsum plaster",
+"unspsc",30120000,"Roads and landscape",
+"unspsc",30121500,"Bituminous derivatives",
+"unspsc",30121501,"Coal tar",
+"unspsc",30121503,"Creosote",
+"unspsc",30121600,"Asphalts",
+"unspsc",30121601,"Asphalt",
+"unspsc",30121602,"Pitch",
+"unspsc",30121603,"Gilsonite",
+"unspsc",30121604,"Cutback products",
+"unspsc",30121605,"Manhole frames with covers",
+"unspsc",30130000,"Structural building products",
+"unspsc",30131500,"Blocks",
+"unspsc",30131501,"Cement blocks",
+"unspsc",30131502,"Concrete blocks",
+"unspsc",30131503,"Stone blocks",
+"unspsc",30131504,"Ceramic blocks",
+"unspsc",30131600,"Bricks",
+"unspsc",30131601,"Cement bricks",
+"unspsc",30131602,"Ceramic bricks",
+"unspsc",30131603,"Concrete bricks",
+"unspsc",30131604,"Stone bricks",
+"unspsc",30131700,"Tiles and flagstones",
+"unspsc",30131701,"Cement tiles or flagstones",
+"unspsc",30131702,"Stone tiles or flagstones",
+"unspsc",30131703,"Concrete tiles or flagstones",
+"unspsc",30131704,"Ceramic tiles or flagstones",
+"unspsc",30131705,"Head stones",
+"unspsc",30140000,"Insulation",
+"unspsc",30141500,"Thermal insulation",
+"unspsc",30141501,"Weather stripping",
+"unspsc",30141502,"Insulation blankets",
+"unspsc",30141503,"Foam insulation",
+"unspsc",30141504,"Insulation batts",
+"unspsc",30141505,"Thermal insulation sleeving",
+"unspsc",30141506,"Loose fill insulation",
+"unspsc",30141507,"Rigid board insulation",
+"unspsc",30141508,"Fiber insulation",
+"unspsc",30141510,"Door sweep",
+"unspsc",30141511,"Window film",
+"unspsc",30141512,"Thermal insulation kits",
+"unspsc",30141513,"Thermal Insulating bricks",
+"unspsc",30141600,"Specialty insulation",
+"unspsc",30141601,"Acoustical insulation",
+"unspsc",30141602,"Non thermal insulation sleeving",
+"unspsc",30141603,"Heat Shields",
+"unspsc",30150000,"Exterior finishing materials",
+"unspsc",30151500,"Roofing materials",
+"unspsc",30151501,"Roll roofing",
+"unspsc",30151502,"Roof valleys",
+"unspsc",30151503,"Roofing fabrics",
+"unspsc",30151504,"Roofing felts",
+"unspsc",30151505,"Roofing membranes",
+"unspsc",30151506,"Roofing tiles",
+"unspsc",30151507,"Shakes",
+"unspsc",30151508,"Shingles",
+"unspsc",30151509,"Trusses",
+"unspsc",30151510,"Slate roofing",
+"unspsc",30151600,"Roofing accessories",
+"unspsc",30151601,"Roof fascias",
+"unspsc",30151602,"Flashings",
+"unspsc",30151603,"Gravel stops",
+"unspsc",30151604,"Roofing brushes",
+"unspsc",30151605,"Roofing drains",
+"unspsc",30151606,"Roofing mops",
+"unspsc",30151607,"Roofing vents",
+"unspsc",30151608,"Soffits",
+"unspsc",30151609,"Roof curbs",
+"unspsc",30151610,"Roof rippers",
+"unspsc",30151700,"Rain gutters and accessories",
+"unspsc",30151701,"Downspouts",
+"unspsc",30151702,"Drip caps",
+"unspsc",30151703,"Gutters",
+"unspsc",30151704,"Splashblocks",
+"unspsc",30151800,"Siding and exterior wall materials",
+"unspsc",30151801,"Shutters",
+"unspsc",30151802,"Siding",
+"unspsc",30151803,"Siding butt joints",
+"unspsc",30151804,"Siding corners",
+"unspsc",30151805,"Stucco",
+"unspsc",30151806,"Glass curtainwalling",
+"unspsc",30151900,"Finishing materials and products",
+"unspsc",30151901,"Awnings",
+"unspsc",30151902,"Exterior trim materials",
+"unspsc",30152000,"Fencing",
+"unspsc",30152001,"Metal fencing",
+"unspsc",30152002,"Wood fencing",
+"unspsc",30152003,"Fibrocement fencing",
+"unspsc",30152100,"Surface",
+"unspsc",30152101,"Shot steel",
+"unspsc",30160000,"Interior finishing materials",
+"unspsc",30161500,"Wall finishing materials",
+"unspsc",30161501,"Wallboard",
+"unspsc",30161502,"Wallpapers",
+"unspsc",30161503,"Drywall",
+"unspsc",30161504,"Corner guards",
+"unspsc",30161505,"Panels or panelling",
+"unspsc",30161507,"Drywall joint compounds",
+"unspsc",30161508,"Wallpaper roller",
+"unspsc",30161509,"Gypsum board",
+"unspsc",30161600,"Ceiling materials",
+"unspsc",30161601,"Acoustic ceiling tiles",
+"unspsc",30161602,"Ceiling panels",
+"unspsc",30161603,"Coffers",
+"unspsc",30161604,"Suspended ceiling systems",
+"unspsc",30161700,"Flooring",
+"unspsc",30161701,"Carpeting",
+"unspsc",30161702,"Wood flooring",
+"unspsc",30161703,"Linoleum",
+"unspsc",30161705,"Rubber flooring",
+"unspsc",30161706,"Stone or tile flooring",
+"unspsc",30161707,"Vinyl flooring",
+"unspsc",30161708,"Knotted carpeting",
+"unspsc",30161709,"Tufted carpeting",
+"unspsc",30161710,"Laminate flooring",
+"unspsc",30161711,"Outdoor carpeting",
+"unspsc",30161712,"Flooring joists",
+"unspsc",30161713,"Carpet pads",
+"unspsc",30161714,"Cork flooring",
+"unspsc",30161715,"Duckboards",
+"unspsc",30161716,"Tile spacers",
+"unspsc",30161717,"Access flooring",
+"unspsc",30161718,"Non skid steel flooring",
+"unspsc",30161719,"Carpet or rug underlays",
+"unspsc",30161800,"Cabinetry",
+"unspsc",30161801,"Cabinets",
+"unspsc",30161802,"Countertops",
+"unspsc",30161900,"Molding and millwork",
+"unspsc",30161901,"Louvers",
+"unspsc",30161902,"Columns",
+"unspsc",30161903,"Wainscoting",
+"unspsc",30161904,"Cornices",
+"unspsc",30161905,"Door surrounds",
+"unspsc",30161906,"Molding",
+"unspsc",30161907,"Stairs",
+"unspsc",30161908,"Stair parts",
+"unspsc",30170000,"Doors and windows and glass",
+"unspsc",30171500,"Doors",
+"unspsc",30171501,"Glass doors",
+"unspsc",30171502,"Screen doors",
+"unspsc",30171503,"Rolling doors",
+"unspsc",30171504,"Wooden doors",
+"unspsc",30171505,"Metal doors",
+"unspsc",30171506,"Storm doors",
+"unspsc",30171507,"Door frames",
+"unspsc",30171508,"Pocket doors",
+"unspsc",30171509,"Revolving doors",
+"unspsc",30171510,"Automatic doors",
+"unspsc",30171511,"Swing door",
+"unspsc",30171512,"Door openers",
+"unspsc",30171513,"Kick plates",
+"unspsc",30171514,"Door closers",
+"unspsc",30171600,"Windows",
+"unspsc",30171604,"Double hung windows",
+"unspsc",30171605,"Single hung windows",
+"unspsc",30171606,"Casement windows",
+"unspsc",30171607,"Horizontal slider windows",
+"unspsc",30171608,"Tilt or transom windows",
+"unspsc",30171609,"Fixed windows",
+"unspsc",30171610,"Bay windows",
+"unspsc",30171611,"Bow windows",
+"unspsc",30171612,"Projected windows",
+"unspsc",30171613,"Window walls",
+"unspsc",30171614,"Window screens",
+"unspsc",30171615,"French windows",
+"unspsc",30171700,"Glass products",
+"unspsc",30171701,"Paving blocks",
+"unspsc",30171703,"Beveled glass",
+"unspsc",30171704,"Leaded glass",
+"unspsc",30171705,"Laminated glass",
+"unspsc",30171706,"Tempered glass",
+"unspsc",30171707,"Safety glass",
+"unspsc",30171708,"Float glass",
+"unspsc",30171709,"Wired glass",
+"unspsc",30171800,"Skylights",
+"unspsc",30171801,"Fixed skylights",
+"unspsc",30171802,"Vented skylights",
+"unspsc",30171803,"Tube skylights",
+"unspsc",30171900,"Window frames",
+"unspsc",30171901,"Double hung window frames",
+"unspsc",30171902,"Single hung window frames",
+"unspsc",30171903,"Casement window frames",
+"unspsc",30171904,"Horizontal slider window frames",
+"unspsc",30171905,"Tilt or transom window frames",
+"unspsc",30171906,"Fixed window frames",
+"unspsc",30172000,"Gates",
+"unspsc",30172001,"Single bar gate",
+"unspsc",30172002,"Double bar gate",
+"unspsc",30180000,"Plumbing fixtures",
+"unspsc",30181500,"Sanitary ware",
+"unspsc",30181501,"Bathtubs",
+"unspsc",30181502,"Bidets",
+"unspsc",30181503,"Showers",
+"unspsc",30181504,"Sinks",
+"unspsc",30181505,"Toilets",
+"unspsc",30181506,"Urinals",
+"unspsc",30181507,"Bathtub or shower enclosures",
+"unspsc",30181508,"Restroom partitions",
+"unspsc",30181509,"Soap dishes",
+"unspsc",30181510,"Napkin rings",
+"unspsc",30181511,"Toilet bowls",
+"unspsc",30181512,"Toilet seats",
+"unspsc",30181513,"Toilet seat lids",
+"unspsc",30181514,"Toilet tank covers",
+"unspsc",30181515,"Toilet tanks",
+"unspsc",30190000,"Construction and maintenance support equipment",
+"unspsc",30191500,"Ladders and scaffolding",
+"unspsc",30191501,"Ladders",
+"unspsc",30191502,"Scaffolding",
+"unspsc",30191505,"Step stool",
+"unspsc",30191600,"Ladders and scaffolding accessories",
+"unspsc",30191601,"Handrails",
+"unspsc",30191602,"Scaffolding stabilizers",
+"unspsc",30191603,"Scaffolding flooring",
+"unspsc",30200000,"Prefabricated structures",
+"unspsc",30201500,"Prefabricated farm structures",
+"unspsc",30201501,"Silos",
+"unspsc",30201502,"Greenhouses",
+"unspsc",30201600,"Prefabricated residential structures",
+"unspsc",30201601,"Houses",
+"unspsc",30201602,"Mobile homes",
+"unspsc",30201603,"Cabins",
+"unspsc",30201604,"Garages",
+"unspsc",30201605,"Gazebo",
+"unspsc",30201606,"Home kitchens",
+"unspsc",30201700,"Prefabricated commercial and industrial structures",
+"unspsc",30201701,"In plant offices",
+"unspsc",30201702,"Spray booths",
+"unspsc",30201703,"Storage sheds",
+"unspsc",30201704,"Clean rooms",
+"unspsc",30201705,"Guardhouses",
+"unspsc",30201706,"Portable toilettes",
+"unspsc",30201707,"Warehouses",
+"unspsc",30201708,"Auditorium",
+"unspsc",30201710,"Office kitchens",
+"unspsc",30201711,"Conservatory",
+"unspsc",30201712,"Phone box or phone booth",
+"unspsc",30201800,"Prefabricated emergency relief structures",
+"unspsc",30201801,"Shelters",
+"unspsc",30201802,"Emergency tent halls",
+"unspsc",30201803,"Container units",
+"unspsc",30201900,"Prefabricated medical structures",
+"unspsc",30201901,"Medical units",
+"unspsc",30201902,"Laboratory units",
+"unspsc",30201903,"Dental units",
+"unspsc",30201904,"Surgical units",
+"unspsc",30220000,"Permanent structures",
+"unspsc",30221000,"Commercial and entertainment structures",
+"unspsc",30221001,"Shopping malls",
+"unspsc",30221002,"Parking structures",
+"unspsc",30221003,"Cafeteria",
+"unspsc",30221004,"Shop buildings",
+"unspsc",30221005,"Shopping center",
+"unspsc",30221006,"Canteen",
+"unspsc",30221007,"Theater",
+"unspsc",30221009,"Market",
+"unspsc",30221010,"Childrens play area",
+"unspsc",30221011,"Zoo",
+"unspsc",30221012,"Gardens",
+"unspsc",30221013,"Parks",
+"unspsc",30221014,"Waterside leisure facilities",
+"unspsc",30222000,"Transport structures",
+"unspsc",30222001,"Steel bridges",
+"unspsc",30222002,"Dry dock",
+"unspsc",30222003,"Bus station",
+"unspsc",30222004,"Bus garage",
+"unspsc",30222005,"Service area building",
+"unspsc",30222006,"Railway station",
+"unspsc",30222007,"Railway depot",
+"unspsc",30222008,"Underground railway station",
+"unspsc",30222009,"Rail terminal building",
+"unspsc",30222010,"Tramway depot",
+"unspsc",30222011,"Tramway platforms",
+"unspsc",30222012,"Airport buildings",
+"unspsc",30222013,"Airport control tower",
+"unspsc",30222014,"Airfield",
+"unspsc",30222015,"Runway",
+"unspsc",30222016,"Quay",
+"unspsc",30222017,"Pier",
+"unspsc",30222018,"Dock",
+"unspsc",30222019,"Wharf",
+"unspsc",30222020,"Marina",
+"unspsc",30222021,"Yacht harbor",
+"unspsc",30222022,"Breakwater",
+"unspsc",30222023,"Seawall",
+"unspsc",30222024,"Ferry terminal building",
+"unspsc",30222025,"Ro ro terminal",
+"unspsc",30222026,"Lighthouse",
+"unspsc",30222027,"Road bridge",
+"unspsc",30222028,"Railway bridge",
+"unspsc",30222029,"Footbridge",
+"unspsc",30222030,"Road viaduct",
+"unspsc",30222031,"Railway viaduct",
+"unspsc",30222032,"Underpass",
+"unspsc",30222033,"Overpass",
+"unspsc",30222034,"Subway",
+"unspsc",30222035,"Culverts",
+"unspsc",30222036,"Road tunnel",
+"unspsc",30222037,"Railway tunnel",
+"unspsc",30222038,"Pedestrian tunnel",
+"unspsc",30222039,"Canal tunnel",
+"unspsc",30222040,"Under river tunnel",
+"unspsc",30222041,"Undersea tunnel",
+"unspsc",30222042,"Highways",
+"unspsc",30222043,"Crossroad",
+"unspsc",30222044,"Ring road",
+"unspsc",30222045,"Trunk road",
+"unspsc",30222046,"Secondary road",
+"unspsc",30222047,"Access road",
+"unspsc",30222048,"Slip road",
+"unspsc",30222049,"Dual carriageway",
+"unspsc",30222050,"Single carriageway",
+"unspsc",30222051,"Road junction",
+"unspsc",30222052,"Pedestrian ways",
+"unspsc",30222053,"Pedestrian overpass",
+"unspsc",30222054,"Footpath",
+"unspsc",30222055,"Cycle path",
+"unspsc",30222056,"Pipeline carrying bridge",
+"unspsc",30222057,"Pipelines",
+"unspsc",30222058,"Pumping station",
+"unspsc",30222059,"Sewage pumping stations",
+"unspsc",30222060,"Sewage outfall",
+"unspsc",30222061,"Parking lot",
+"unspsc",30222063,"Motorway service area",
+"unspsc",30222100,"Public structures",
+"unspsc",30222101,"Post office",
+"unspsc",30222102,"Bank",
+"unspsc",30222103,"Police station",
+"unspsc",30222104,"Court building",
+"unspsc",30222105,"Prison building",
+"unspsc",30222106,"Fire station",
+"unspsc",30222107,"Ambulance station",
+"unspsc",30222108,"Mountain rescue building",
+"unspsc",30222109,"Lifeboat station",
+"unspsc",30222110,"Coastguard building",
+"unspsc",30222111,"Rescue service station",
+"unspsc",30222112,"Civic center",
+"unspsc",30222113,"Crematorium",
+"unspsc",30222114,"Art gallery",
+"unspsc",30222115,"Prehistoric monument",
+"unspsc",30222116,"Ticket offices",
+"unspsc",30222200,"Utilities structures",
+"unspsc",30222201,"Radar station",
+"unspsc",30222202,"Substation",
+"unspsc",30222203,"Nuclear power station",
+"unspsc",30222204,"Water tower",
+"unspsc",30222205,"Wells",
+"unspsc",30222206,"Mobile telephone base stations",
+"unspsc",30222207,"Dam",
+"unspsc",30222208,"Oil or gas platforms",
+"unspsc",30222300,"Educational and research structures",
+"unspsc",30222301,"Schools",
+"unspsc",30222302,"Polytechnic",
+"unspsc",30222303,"Vocational college",
+"unspsc",30222304,"Lecture theater",
+"unspsc",30222305,"Library",
+"unspsc",30222306,"Language laboratory",
+"unspsc",30222307,"Laboratory building",
+"unspsc",30222308,"Meteorological stations",
+"unspsc",30222309,"Research or testing facilities",
+"unspsc",30222400,"Hospital structures",
+"unspsc",30222401,"Clinic",
+"unspsc",30222402,"Nursing home",
+"unspsc",30222403,"Operating theater",
+"unspsc",30222404,"Intensive care unit",
+"unspsc",30222405,"Diagnostic screening room",
+"unspsc",30222406,"Screening rooms",
+"unspsc",30222407,"Fluoroscopy room",
+"unspsc",30222408,"Pathology room",
+"unspsc",30222409,"Catheter room",
+"unspsc",30222500,"Accommodation structures",
+"unspsc",30222501,"Residential homes",
+"unspsc",30222502,"Flats",
+"unspsc",30222503,"Childrens home",
+"unspsc",30222504,"Daycare center",
+"unspsc",30222505,"Retirement home",
+"unspsc",30222506,"Old peoples home",
+"unspsc",30222507,"Hostel",
+"unspsc",30222600,"Sports and health structures",
+"unspsc",30222601,"Stadium",
+"unspsc",30222602,"Sports ground",
+"unspsc",30222603,"Running track",
+"unspsc",30222604,"Sports hall",
+"unspsc",30222605,"Spa",
+"unspsc",30222606,"Gymnasium",
+"unspsc",30222607,"Swimming pool",
+"unspsc",30222608,"Water sports facilities",
+"unspsc",30222700,"Industrial structures",
+"unspsc",30222701,"Workshops",
+"unspsc",30222702,"Cold storage installations",
+"unspsc",30222703,"Warehouse stores",
+"unspsc",30222800,"Agricultural and farming and fishing structures",
+"unspsc",30222801,"Barn",
+"unspsc",30222802,"Cowsheds",
+"unspsc",30222803,"Irrigation channel",
+"unspsc",30222900,"Defense structures",
+"unspsc",30222901,"Military bunker",
+"unspsc",30222902,"Military shelter",
+"unspsc",30222903,"Barracks",
+"unspsc",30222904,"Military mess",
+"unspsc",30223000,"Religious structures",
+"unspsc",30223001,"Churches",
+"unspsc",30223002,"Temples",
+"unspsc",30223003,"Mosques",
+"unspsc",31000000,"Manufacturing Components and Supplies",
+"unspsc",31100000,"Castings",
+"unspsc",31101500,"Die castings",
+"unspsc",31101501,"Aluminum die castings",
+"unspsc",31101502,"Ferrous alloy die castings",
+"unspsc",31101503,"Iron die castings",
+"unspsc",31101504,"Non ferrous alloy die castings",
+"unspsc",31101505,"Stainless steel die castings",
+"unspsc",31101506,"Steel die castings",
+"unspsc",31101507,"Magnesium die castings",
+"unspsc",31101508,"Zinc die castings",
+"unspsc",31101509,"Tin die castings",
+"unspsc",31101510,"Titanium die castings",
+"unspsc",31101511,"Beryllium die castings",
+"unspsc",31101512,"Precious metal die castings",
+"unspsc",31101513,"Copper die castings",
+"unspsc",31101514,"Lead die castings",
+"unspsc",31101515,"Brass die castings",
+"unspsc",31101516,"Bronze die castings",
+"unspsc",31101600,"Sand castings",
+"unspsc",31101601,"Non ferrous alloy sand castings",
+"unspsc",31101602,"Ferrous alloy sand castings",
+"unspsc",31101603,"Steel sand castings",
+"unspsc",31101604,"Stainless steel sand castings",
+"unspsc",31101605,"Iron sand castings",
+"unspsc",31101606,"Aluminum sand castings",
+"unspsc",31101607,"Magnesium sand castings",
+"unspsc",31101608,"Titanium sand castings",
+"unspsc",31101609,"Beryllium sand castings",
+"unspsc",31101610,"Copper sand castings",
+"unspsc",31101611,"Brass sand castings",
+"unspsc",31101612,"Bronze sand castings",
+"unspsc",31101613,"Zinc sand castings",
+"unspsc",31101614,"Tin sand castings",
+"unspsc",31101615,"Lead sand castings",
+"unspsc",31101616,"Precious metal sand castings",
+"unspsc",31101700,"Permanent mold castings",
+"unspsc",31101701,"Non ferrous alloy permanent mold castings",
+"unspsc",31101702,"Ferrous alloy permanent mold castings",
+"unspsc",31101703,"Steel permanent mold castings",
+"unspsc",31101704,"Stainless steel permanent mold castings",
+"unspsc",31101705,"Iron permanent mold castings",
+"unspsc",31101706,"Aluminum permanent mold castings",
+"unspsc",31101707,"Magnesium permanent mold castings",
+"unspsc",31101708,"Titanium permanent mold castings",
+"unspsc",31101709,"Beryllium permanent mold castings",
+"unspsc",31101710,"Copper permanent mold castings",
+"unspsc",31101711,"Brass permanent mold castings",
+"unspsc",31101712,"Bronze permanent mold castings",
+"unspsc",31101713,"Zinc permanent mold castings",
+"unspsc",31101714,"Tin permanent mold castings",
+"unspsc",31101715,"Lead permanent mold castings",
+"unspsc",31101716,"Precious metal permanent mold castings",
+"unspsc",31101800,"Shell mold castings",
+"unspsc",31101801,"Non ferrous alloy shell mold castings",
+"unspsc",31101802,"Ferrous alloy shell mold castings",
+"unspsc",31101803,"Steel shell mold castings",
+"unspsc",31101804,"Stainless steel shell mold castings",
+"unspsc",31101805,"Iron shell mold castings",
+"unspsc",31101806,"Aluminum shell mold castings",
+"unspsc",31101807,"Magnesium shell mold castings",
+"unspsc",31101808,"Titanium shell mold castings",
+"unspsc",31101809,"Beryllium shell mold castings",
+"unspsc",31101810,"Copper shell mold castings",
+"unspsc",31101811,"Brass shell mold castings",
+"unspsc",31101812,"Bronze shell mold castings",
+"unspsc",31101813,"Zinc shell mold castings",
+"unspsc",31101814,"Tin shell mold castings",
+"unspsc",31101815,"Lead shell mold castings",
+"unspsc",31101816,"Precious shell mold castings",
+"unspsc",31101900,"Investment castings",
+"unspsc",31101901,"Non ferrous alloy investment castings",
+"unspsc",31101902,"Ferrous alloy investment castings",
+"unspsc",31101903,"Steel investment castings",
+"unspsc",31101904,"Stainless steel investment castings",
+"unspsc",31101905,"Iron investment castings",
+"unspsc",31101906,"Aluminum investment castings",
+"unspsc",31101907,"Magnesium investment castings",
+"unspsc",31101908,"Zinc investment castings",
+"unspsc",31101909,"Tin investment castings",
+"unspsc",31101910,"Lead investment castings",
+"unspsc",31101911,"Precious metal investment castings",
+"unspsc",31101912,"Titanium investment castings",
+"unspsc",31102000,"Centrifugal castings",
+"unspsc",31102001,"Non ferrous alloy centrifugal castings",
+"unspsc",31102002,"Ferrous alloy centrifugal castings",
+"unspsc",31102003,"Steel centrifugal castings",
+"unspsc",31102004,"Stainless steel centrifugal castings",
+"unspsc",31102005,"Iron centrifugal castings",
+"unspsc",31102006,"Aluminum centrifugal castings",
+"unspsc",31102007,"Magnesium centrifugal castings",
+"unspsc",31102008,"Titanium centrifugal castings",
+"unspsc",31102009,"Beryllium centrifugal castings",
+"unspsc",31102010,"Copper centrifugal castings",
+"unspsc",31102011,"Brass centrifugal castings",
+"unspsc",31102012,"Bronze centrifugal castings",
+"unspsc",31102013,"Zinc centrifugal castings",
+"unspsc",31102014,"Tin centrifugal castings",
+"unspsc",31102015,"Lead centrifugal castings",
+"unspsc",31102016,"Precious metal centrifugal castings",
+"unspsc",31102100,"Ceramic mold castings",
+"unspsc",31102101,"Non ferrous alloy ceramic mold castings",
+"unspsc",31102102,"Ferrous alloy ceramic mold castings",
+"unspsc",31102103,"Steel ceramic mold castings",
+"unspsc",31102104,"Stainless steel ceramic mold castings",
+"unspsc",31102105,"Iron ceramic mold castings",
+"unspsc",31102106,"Aluminum ceramic mold castings",
+"unspsc",31102107,"Magnesium ceramic mold castings",
+"unspsc",31102108,"Titanium ceramic mold castings",
+"unspsc",31102109,"Beryllium ceramic mold castings",
+"unspsc",31102110,"Copper ceramic mold castings",
+"unspsc",31102111,"Brass ceramic mold castings",
+"unspsc",31102112,"Bronze ceramic mold castings",
+"unspsc",31102113,"Zinc ceramic mold castings",
+"unspsc",31102114,"Tin ceramic mold castings",
+"unspsc",31102115,"Lead ceramic mold castings",
+"unspsc",31102116,"Precious metal ceramic mold castings",
+"unspsc",31102200,"Graphite mold castings",
+"unspsc",31102201,"Non ferrous alloy graphite mold castings",
+"unspsc",31102202,"Ferrous alloy graphite mold castings",
+"unspsc",31102203,"Steel graphite mold castings",
+"unspsc",31102204,"Stainless steel graphite mold castings",
+"unspsc",31102205,"Iron graphite mold castings",
+"unspsc",31102206,"Aluminum graphite mold castings",
+"unspsc",31102207,"Magnesium graphite mold castings",
+"unspsc",31102208,"Titanium graphite mold castings",
+"unspsc",31102209,"Beryllium graphite mold castings",
+"unspsc",31102210,"Copper graphite mold castings",
+"unspsc",31102211,"Brass graphite mold castings",
+"unspsc",31102212,"Bronze graphite mold castings",
+"unspsc",31102213,"Zinc graphite mold castings",
+"unspsc",31102214,"Tin graphite mold castings",
+"unspsc",31102215,"Lead graphite mold castings",
+"unspsc",31102216,"Precious metal graphite mold castings",
+"unspsc",31102300,"Plaster mold castings",
+"unspsc",31102301,"Non ferrous alloy plaster mold castings",
+"unspsc",31102302,"Ferrous alloy plaster mold castings",
+"unspsc",31102303,"Steel plaster mold castings",
+"unspsc",31102304,"Stainless steel plaster mold castings",
+"unspsc",31102305,"Iron plaster mold castings",
+"unspsc",31102306,"Aluminum plaster mold castings",
+"unspsc",31102307,"Magnesium plaster mold castings",
+"unspsc",31102308,"Titanium plaster mold castings",
+"unspsc",31102309,"Beryllium plaster mold castings",
+"unspsc",31102310,"Copper plaster mold castings",
+"unspsc",31102311,"Brass plaster mold castings",
+"unspsc",31102312,"Bronze plaster mold castings",
+"unspsc",31102313,"Zinc plaster mold castings",
+"unspsc",31102314,"Tin plaster mold castings",
+"unspsc",31102315,"Lead plaster mold castings",
+"unspsc",31102316,"Precious metal plaster mold castings",
+"unspsc",31102400,"V process castings",
+"unspsc",31102401,"Non ferrous alloy v process castings",
+"unspsc",31102402,"Ferrous alloy v process castings",
+"unspsc",31102403,"Steel v process castings",
+"unspsc",31102404,"Stainless steel v process castings",
+"unspsc",31102405,"Iron v process castings",
+"unspsc",31102406,"Aluminum v process castings",
+"unspsc",31102407,"Magnesium v process castings",
+"unspsc",31102408,"Titanium v process castings",
+"unspsc",31102409,"Beryllium v process castings",
+"unspsc",31102410,"Copper v process castings",
+"unspsc",31102411,"Brass v process castings",
+"unspsc",31102412,"Bronze v process castings",
+"unspsc",31102413,"Zinc v process castings",
+"unspsc",31102414,"Tin v process castings",
+"unspsc",31102415,"Lead v process castings",
+"unspsc",31102416,"Precious metal v process castings",
+"unspsc",31110000,"Extrusions",
+"unspsc",31111500,"Profile extrusions",
+"unspsc",31111501,"Aluminum profile extrusions",
+"unspsc",31111502,"Beryllium profile extrusions",
+"unspsc",31111503,"Brass profile extrusions",
+"unspsc",31111504,"Bronze profile extrusions",
+"unspsc",31111505,"Copper profile extrusions",
+"unspsc",31111506,"Ferrous alloy profile extrusions",
+"unspsc",31111507,"Lead profile extrusions",
+"unspsc",31111508,"Magnesium profile extrusions",
+"unspsc",31111509,"Non ferrous alloy profile extrusions",
+"unspsc",31111510,"Plastic profile extrusions",
+"unspsc",31111511,"Precious metal profile extrusions",
+"unspsc",31111512,"Rubber profile extrusions",
+"unspsc",31111513,"Stainless steel profile extrusions",
+"unspsc",31111514,"Steel profile extrusions",
+"unspsc",31111515,"Tin profile extrusions",
+"unspsc",31111516,"Titanium profile extrusions",
+"unspsc",31111517,"Zinc profile extrusions",
+"unspsc",31111600,"Impact extrusions",
+"unspsc",31111601,"Aluminum impact extrusions",
+"unspsc",31111602,"Beryllium impact extrusions",
+"unspsc",31111603,"Brass impact extrusions",
+"unspsc",31111604,"Bronze impact extrusions",
+"unspsc",31111605,"Copper impact extrusions",
+"unspsc",31111606,"Ferrous alloy impact extrusions",
+"unspsc",31111607,"Lead impact extrusions",
+"unspsc",31111608,"Magnesium impact extrusions",
+"unspsc",31111609,"Non ferrous alloy impact extrusions",
+"unspsc",31111610,"Plastic impact extrusions",
+"unspsc",31111611,"Precious metal impact extrusions",
+"unspsc",31111612,"Rubber impact extrusions",
+"unspsc",31111613,"Stainless steel impact extrusions",
+"unspsc",31111614,"Steel impact extrusions",
+"unspsc",31111615,"Tin impact extrusions",
+"unspsc",31111616,"Titanium impact extrusions",
+"unspsc",31111617,"Zinc impact extrusions",
+"unspsc",31111700,"Cold extrusions",
+"unspsc",31111701,"Aluminum cold extrusions",
+"unspsc",31111702,"Beryllium cold extrusions",
+"unspsc",31111703,"Brass cold extrusions",
+"unspsc",31111704,"Bronze cold extrusions",
+"unspsc",31111705,"Copper cold extrusions",
+"unspsc",31111706,"Ferrous alloy cold extrusions",
+"unspsc",31111707,"Lead cold extrusions",
+"unspsc",31111708,"Magnesium cold extrusions",
+"unspsc",31111709,"Non ferrous alloy cold extrusions",
+"unspsc",31111710,"Plastic cold extrusions",
+"unspsc",31111711,"Precious metal cold extrusions",
+"unspsc",31111712,"Rubber cold extrusions",
+"unspsc",31111713,"Stainless steel cold extrusions",
+"unspsc",31111714,"Steel cold extrusions",
+"unspsc",31111715,"Tin cold extrusions",
+"unspsc",31111716,"Titanium cold extrusions",
+"unspsc",31111717,"Zinc cold extrusions",
+"unspsc",31120000,"Machined castings",
+"unspsc",31121000,"Machined v process castings",
+"unspsc",31121001,"Non ferrous alloy v process machined castings",
+"unspsc",31121002,"Ferrous alloy v process machined castings",
+"unspsc",31121003,"Steel v process machined castings",
+"unspsc",31121004,"Stainless steel v process machined castings",
+"unspsc",31121005,"Iron v process machined castings",
+"unspsc",31121006,"Aluminum v process machined castings",
+"unspsc",31121007,"Magnesium v process machined castings",
+"unspsc",31121008,"Titanium v process machined castings",
+"unspsc",31121009,"Beryllium v process machined castings",
+"unspsc",31121010,"Copper v process machined castings",
+"unspsc",31121011,"Brass v process machined castings",
+"unspsc",31121012,"Bronze v process machined castings",
+"unspsc",31121013,"Zinc v process machined castings",
+"unspsc",31121014,"Tin v process machined castings",
+"unspsc",31121015,"Lead v process machined castings",
+"unspsc",31121016,"Precious metal v process machined castings",
+"unspsc",31121017,"Composite v process machined castings",
+"unspsc",31121018,"Nickel alloy v process machined castings",
+"unspsc",31121019,"Non metallic v process machined castings",
+"unspsc",31121100,"Machined die castings",
+"unspsc",31121101,"Aluminum die machined castings",
+"unspsc",31121102,"Ferrous alloy die machined castings",
+"unspsc",31121103,"Iron die machined castings",
+"unspsc",31121104,"Non ferrous alloy die machined castings",
+"unspsc",31121105,"Stainless steel die machined castings",
+"unspsc",31121106,"Steel die machined castings",
+"unspsc",31121107,"Magnesium die machined castings",
+"unspsc",31121108,"Zinc die machined castings",
+"unspsc",31121109,"Tin die machined castings",
+"unspsc",31121110,"Titanium die machined castings",
+"unspsc",31121111,"Beryllium die machined castings",
+"unspsc",31121112,"Precious metal die machined castings",
+"unspsc",31121113,"Copper die machined castings",
+"unspsc",31121114,"Lead die machined castings",
+"unspsc",31121115,"Brass die machined castings",
+"unspsc",31121116,"Bronze die machined castings",
+"unspsc",31121117,"Composite die machined castings",
+"unspsc",31121118,"Nickel alloy die machined castings",
+"unspsc",31121119,"Non metallic die machined castings",
+"unspsc",31121200,"Machined sand castings",
+"unspsc",31121201,"Non ferrous alloy sand machined castings",
+"unspsc",31121202,"Ferrous alloy sand machined castings",
+"unspsc",31121203,"Steel sand machined castings",
+"unspsc",31121204,"Stainless steel sand machined castings",
+"unspsc",31121205,"Iron sand machined castings",
+"unspsc",31121206,"Aluminum sand machined castings",
+"unspsc",31121207,"Magnesium sand machined castings",
+"unspsc",31121208,"Titanium sand machined castings",
+"unspsc",31121209,"Beryllium sand machined castings",
+"unspsc",31121210,"Copper sand machined castings",
+"unspsc",31121211,"Brass sand machined castings",
+"unspsc",31121212,"Bronze sand machined castings",
+"unspsc",31121213,"Zinc sand machined castings",
+"unspsc",31121214,"Tin sand machined castings",
+"unspsc",31121215,"Lead sand machined castings",
+"unspsc",31121216,"Precious metal sand machined castings",
+"unspsc",31121217,"Composite sand machined castings",
+"unspsc",31121218,"Nickel Alloy sand machined castings",
+"unspsc",31121219,"Non metallic sand machined castings",
+"unspsc",31121300,"Machined permanent mold castings",
+"unspsc",31121301,"Non ferrous alloy permanent mold machined castings",
+"unspsc",31121302,"Ferrous alloy permanent mold machined castings",
+"unspsc",31121303,"Steel permanent mold machined castings",
+"unspsc",31121304,"Stainless steel permanent mold machined castings",
+"unspsc",31121305,"Iron permanent mold machined castings",
+"unspsc",31121306,"Aluminum permanent mold machined castings",
+"unspsc",31121307,"Magnesium permanent mold machined castings",
+"unspsc",31121308,"Titanium permanent mold machined castings",
+"unspsc",31121309,"Beryllium permanent mold machined castings",
+"unspsc",31121310,"Copper permanent mold machined castings",
+"unspsc",31121311,"Brass permanent mold machined castings",
+"unspsc",31121312,"Bronze permanent mold machined castings",
+"unspsc",31121313,"Zinc permanent mold machined castings",
+"unspsc",31121314,"Tin permanent mold machined castings",
+"unspsc",31121315,"Lead permanent mold machined castings",
+"unspsc",31121316,"Precious metal permanent mold machined castings",
+"unspsc",31121317,"Composite permanent mold machined castings",
+"unspsc",31121318,"Nickel alloy permanent mold machined castings",
+"unspsc",31121319,"Non metallic permanent mold machined castings",
+"unspsc",31121400,"Machined plaster mold castings",
+"unspsc",31121401,"Non ferrous alloy plaster mold machined castings",
+"unspsc",31121402,"Ferrous alloy plaster mold machined castings",
+"unspsc",31121403,"Steel plaster mold machined castings",
+"unspsc",31121404,"Stainless steel plaster mold machined castings",
+"unspsc",31121405,"Iron plaster mold machined castings",
+"unspsc",31121406,"Aluminum plaster mold machined castings",
+"unspsc",31121407,"Magnesium plaster mold machined castings",
+"unspsc",31121408,"Titanium plaster mold machined castings",
+"unspsc",31121409,"Beryllium plaster mold machined castings",
+"unspsc",31121410,"Copper plaster mold machined castings",
+"unspsc",31121411,"Brass plaster mold machined castings",
+"unspsc",31121412,"Bronze plaster mold machined castings",
+"unspsc",31121413,"Zinc plaster mold machined castings",
+"unspsc",31121414,"Tin plaster mold machined castings",
+"unspsc",31121415,"Lead plaster mold machined castings",
+"unspsc",31121416,"Precious metal plaster mold machined castings",
+"unspsc",31121417,"Composite plaster mold machined castings",
+"unspsc",31121418,"Nickel alloy plaster mold machined castings",
+"unspsc",31121419,"Non metallic plaster mold machined castings",
+"unspsc",31121500,"Machined shell mold castings",
+"unspsc",31121501,"Non ferrous alloy shell mold machined castings",
+"unspsc",31121502,"Ferrous alloy shell mold machined castings",
+"unspsc",31121503,"Steel shell mold machined castings",
+"unspsc",31121504,"Stainless steel shell mold machined castings",
+"unspsc",31121505,"Iron shell mold machined castings",
+"unspsc",31121506,"Aluminum shell mold machined castings",
+"unspsc",31121507,"Magnesium shell mold machined castings",
+"unspsc",31121508,"Titanium shell mold machined castings",
+"unspsc",31121509,"Beryllium shell mold machined castings",
+"unspsc",31121510,"Copper shell mold machined castings",
+"unspsc",31121511,"Brass shell mold machined castings",
+"unspsc",31121512,"Bronze shell mold machined castings",
+"unspsc",31121513,"Zinc shell mold machined castings",
+"unspsc",31121514,"Tin shell mold machined castings",
+"unspsc",31121515,"Lead shell mold machined castings",
+"unspsc",31121516,"Precious shell mold machined castings",
+"unspsc",31121517,"Composite shell mold machined castings",
+"unspsc",31121518,"Nickel alloy shell mold machined castings",
+"unspsc",31121519,"Non metallic shell mold machined castings",
+"unspsc",31121600,"Machined investment castings",
+"unspsc",31121601,"Non ferrous alloy investment machined castings",
+"unspsc",31121602,"Ferrous alloy investment machined castings",
+"unspsc",31121603,"Steel investment machined castings",
+"unspsc",31121604,"Stainless steel investment machined castings",
+"unspsc",31121605,"Iron investment machined castings",
+"unspsc",31121606,"Aluminum investment machined castings",
+"unspsc",31121607,"Magnesium investment machined castings",
+"unspsc",31121608,"Zinc investment machined castings",
+"unspsc",31121609,"Tin investment machined castings",
+"unspsc",31121610,"Lead investment machined castings",
+"unspsc",31121611,"Precious metal investment machined castings",
+"unspsc",31121612,"Titanium investment machined castings",
+"unspsc",31121613,"Composite investment machined castings",
+"unspsc",31121614,"Nickel alloy investment machined castings",
+"unspsc",31121615,"Non metallic investment machined castings",
+"unspsc",31121700,"Machined centrifugal castings",
+"unspsc",31121701,"Non ferrous alloy centrifugal machined castings",
+"unspsc",31121702,"Ferrous alloy centrifugal machined castings",
+"unspsc",31121703,"Steel centrifugal machined castings",
+"unspsc",31121704,"Stainless steel centrifugal machined castings",
+"unspsc",31121705,"Iron centrifugal machined castings",
+"unspsc",31121706,"Aluminum centrifugal machined castings",
+"unspsc",31121707,"Magnesium centrifugal machined castings",
+"unspsc",31121708,"Titanium centrifugal machined castings",
+"unspsc",31121709,"Beryllium centrifugal machined castings",
+"unspsc",31121710,"Copper centrifugal machined castings",
+"unspsc",31121711,"Brass centrifugal machined castings",
+"unspsc",31121712,"Bronze centrifugal machined castings",
+"unspsc",31121713,"Zinc centrifugal machined castings",
+"unspsc",31121714,"Tin centrifugal machined castings",
+"unspsc",31121715,"Lead centrifugal machined castings",
+"unspsc",31121716,"Precious metal centrifugal machined castings",
+"unspsc",31121717,"Composite centrifugal machined castings",
+"unspsc",31121718,"Nickel alloy centrifugal machined castings",
+"unspsc",31121719,"Non metallic centrifugal machined castings",
+"unspsc",31121800,"Machined ceramic mold castings",
+"unspsc",31121801,"Non ferrous alloy ceramic mold machined castings",
+"unspsc",31121802,"Ferrous alloy ceramic mold machined castings",
+"unspsc",31121803,"Steel ceramic mold machined castings",
+"unspsc",31121804,"Stainless steel ceramic mold machined castings",
+"unspsc",31121805,"Iron ceramic mold machined castings",
+"unspsc",31121806,"Aluminum ceramic mold machined castings",
+"unspsc",31121807,"Magnesium ceramic mold machined castings",
+"unspsc",31121808,"Titanium ceramic mold machined castings",
+"unspsc",31121809,"Beryllium ceramic mold machined castings",
+"unspsc",31121810,"Copper ceramic mold machined castings",
+"unspsc",31121811,"Brass ceramic mold machined castings",
+"unspsc",31121812,"Bronze ceramic mold machined castings",
+"unspsc",31121813,"Zinc ceramic mold machined castings",
+"unspsc",31121814,"Tin ceramic mold machined castings",
+"unspsc",31121815,"Lead ceramic mold machined castings",
+"unspsc",31121816,"Precious metal ceramic mold machined castings",
+"unspsc",31121817,"Composite ceramic mold machined castings",
+"unspsc",31121818,"Nickel alloy ceramic mold machined castings",
+"unspsc",31121819,"Non metallic ceramic mold machined castings",
+"unspsc",31121900,"Machined graphite mold castings",
+"unspsc",31121901,"Non ferrous alloy graphite mold machined castings",
+"unspsc",31121902,"Ferrous alloy graphite mold machined castings",
+"unspsc",31121903,"Steel graphite mold machined castings",
+"unspsc",31121904,"Stainless steel graphite mold machined castings",
+"unspsc",31121905,"Iron graphite mold machined castings",
+"unspsc",31121906,"Aluminum graphite mold machined castings",
+"unspsc",31121907,"Magnesium graphite mold machined castings",
+"unspsc",31121908,"Titanium graphite mold machined castings",
+"unspsc",31121909,"Beryllium graphite mold machined castings",
+"unspsc",31121910,"Copper graphite mold machined castings",
+"unspsc",31121911,"Brass graphite mold machined castings",
+"unspsc",31121912,"Bronze graphite mold machined castings",
+"unspsc",31121913,"Zinc graphite mold machined castings",
+"unspsc",31121914,"Tin graphite mold machined castings",
+"unspsc",31121915,"Lead graphite mold machined castings",
+"unspsc",31121916,"Precious metal graphite mold machined castings",
+"unspsc",31121917,"Composite graphite mold machined castings",
+"unspsc",31121918,"Nickel alloy metal graphite mold machined castings",
+"unspsc",31121919,"Non metallic graphite mold machined castings",
+"unspsc",31130000,"Forgings",
+"unspsc",31131500,"Open die forgings",
+"unspsc",31131501,"Non ferrous alloy open die forgings",
+"unspsc",31131502,"Ferrous alloy open die forgings",
+"unspsc",31131503,"Steel open die forgings",
+"unspsc",31131504,"Stainless steel open die forgings",
+"unspsc",31131505,"Iron open die forgings",
+"unspsc",31131506,"Aluminum open die forgings",
+"unspsc",31131507,"Magnesium open die forgings",
+"unspsc",31131508,"Titanium open die forgings",
+"unspsc",31131509,"Beryllium open die forgings",
+"unspsc",31131510,"Copper open die forgings",
+"unspsc",31131511,"Brass open die forgings",
+"unspsc",31131512,"Bronze open die forgings",
+"unspsc",31131513,"Zinc open die forgings",
+"unspsc",31131514,"Tin open die forgings",
+"unspsc",31131515,"Lead open die forgings",
+"unspsc",31131516,"Precious metal open die forgings",
+"unspsc",31131600,"Closed die forgings",
+"unspsc",31131601,"Non ferrous alloy closed die forgings",
+"unspsc",31131602,"Ferrous alloy closed die forgings",
+"unspsc",31131603,"Steel closed die forgings",
+"unspsc",31131604,"Stainless steel closed die forgings",
+"unspsc",31131605,"Iron closed die forgings",
+"unspsc",31131606,"Aluminum closed die forgings",
+"unspsc",31131607,"Magnesium closed die forgings",
+"unspsc",31131608,"Titanium closed die forgings",
+"unspsc",31131609,"Beryllium closed die forgings",
+"unspsc",31131610,"Copper closed die forgings",
+"unspsc",31131611,"Brass closed die forgings",
+"unspsc",31131612,"Bronze closed die forgings",
+"unspsc",31131613,"Zinc closed die forgings",
+"unspsc",31131614,"Tin closed die forgings",
+"unspsc",31131615,"Lead closed die forgings",
+"unspsc",31131616,"Precious metal closed die forgings",
+"unspsc",31131700,"Impression die forgings",
+"unspsc",31131701,"Non ferrous alloy impression die forgings",
+"unspsc",31131702,"Ferrous alloy impression die forgings",
+"unspsc",31131703,"Steel impression die forgings",
+"unspsc",31131704,"Stainless steel impression die forgings",
+"unspsc",31131705,"Iron impression die forgings",
+"unspsc",31131706,"Aluminum impression die forgings",
+"unspsc",31131707,"Magnesium impression die forgings",
+"unspsc",31131708,"Titanium impression die forgings",
+"unspsc",31131709,"Beryllium impression die forgings",
+"unspsc",31131710,"Copper impression die forgings",
+"unspsc",31131711,"Brass impression die forgings",
+"unspsc",31131712,"Bronze impression die forgings",
+"unspsc",31131713,"Zinc impression die forgings",
+"unspsc",31131714,"Tin impression die forgings",
+"unspsc",31131715,"Lead impression die forgings",
+"unspsc",31131716,"Precious metal impression die forgings",
+"unspsc",31131800,"Drop forgings",
+"unspsc",31131801,"Non ferrous alloy drop forgings",
+"unspsc",31131802,"Zinc drop forgings",
+"unspsc",31131803,"Ferrous alloy drop forgings",
+"unspsc",31131804,"Tin drop forgings",
+"unspsc",31131805,"Lead drop forgings",
+"unspsc",31131806,"Steel drop forgings",
+"unspsc",31131807,"Precious metal drop forgings",
+"unspsc",31131808,"Stainless steel drop forgings",
+"unspsc",31131809,"Iron drop forgings",
+"unspsc",31131810,"Aluminum drop forgings",
+"unspsc",31131811,"Magnesium drop forgings",
+"unspsc",31131812,"Titanium drop forgings",
+"unspsc",31131813,"Beryllium drop forgings",
+"unspsc",31131814,"Copper drop forgings",
+"unspsc",31131815,"Brass drop forgings",
+"unspsc",31131816,"Bronze drop forgings",
+"unspsc",31131817,"Cold steel drop forgings",
+"unspsc",31131818,"Semi finished drop forgings",
+"unspsc",31131900,"Rolled ring forgings",
+"unspsc",31131901,"Aluminum rolled ring forgings",
+"unspsc",31131902,"Beryllium rolled ring forgings",
+"unspsc",31131903,"Brass rolled ring forgings",
+"unspsc",31131904,"Bronze rolled ring forgings",
+"unspsc",31131905,"Copper rolled ring forgings",
+"unspsc",31131906,"Iron rolled ring forgings",
+"unspsc",31131907,"Lead rolled ring forgings",
+"unspsc",31131908,"Magnesium rolled ring forgings",
+"unspsc",31131909,"Precious metal rolled ring forgings",
+"unspsc",31131910,"Stainless steel rolled ring forgings",
+"unspsc",31131911,"Tin rolled ring forgings",
+"unspsc",31131912,"Titanium rolled ring forgings",
+"unspsc",31131913,"Zinc rolled ring forgings",
+"unspsc",31131914,"Non ferrous alloy rolled ring forgings",
+"unspsc",31131915,"Ferrous alloy rolled ring forgings",
+"unspsc",31131916,"Steel rolled ring forgings",
+"unspsc",31132000,"Powdered metal components",
+"unspsc",31132001,"Ferrous powdered metal components",
+"unspsc",31132002,"Non ferrous powdered metal parts",
+"unspsc",31140000,"Moldings",
+"unspsc",31141500,"Injection moldings",
+"unspsc",31141501,"Plastic injection moldings",
+"unspsc",31141502,"Rubber injection moldings",
+"unspsc",31141503,"Glass injection moldings",
+"unspsc",31141600,"Vacuum moldings",
+"unspsc",31141601,"Plastic vacuum moldings",
+"unspsc",31141602,"Rubber vacuum moldings",
+"unspsc",31141603,"Glass vacuum moldings",
+"unspsc",31141700,"Blow moldings",
+"unspsc",31141701,"Plastic blow moldings",
+"unspsc",31141702,"Rubber blow moldings",
+"unspsc",31141800,"Reaction injection moldings RIM",
+"unspsc",31141801,"Plastic reaction injection moldings",
+"unspsc",31141802,"Rubber reaction injection moldings",
+"unspsc",31150000,"Rope and chain and cable and wire and strap",
+"unspsc",31151500,"Ropes",
+"unspsc",31151501,"Cotton rope",
+"unspsc",31151502,"Polyester rope",
+"unspsc",31151503,"Polypropylene rope",
+"unspsc",31151504,"Nylon rope",
+"unspsc",31151505,"Wire rope",
+"unspsc",31151506,"Hemp rope",
+"unspsc",31151507,"String or twine",
+"unspsc",31151508,"Sisal rope",
+"unspsc",31151509,"Rubber rope",
+"unspsc",31151600,"Chains",
+"unspsc",31151601,"Safety chains",
+"unspsc",31151603,"Roller chains",
+"unspsc",31151604,"Proof coil chains",
+"unspsc",31151605,"Sash chain",
+"unspsc",31151606,"Jack chains",
+"unspsc",31151607,"Coil chains",
+"unspsc",31151608,"Ball chains",
+"unspsc",31151609,"Chain links",
+"unspsc",31151700,"Mechanical cable",
+"unspsc",31151702,"Non electric control cables",
+"unspsc",31151703,"Lifting cables",
+"unspsc",31151704,"Track cables",
+"unspsc",31151705,"Non electrical steel cables",
+"unspsc",31151706,"Non electrical copper cables",
+"unspsc",31151707,"Non electrical aluminum cables",
+"unspsc",31151800,"Mechanical wire",
+"unspsc",31151803,"Piano steel wire",
+"unspsc",31151804,"Staple wire",
+"unspsc",31151900,"Straps",
+"unspsc",31151901,"Metal straps",
+"unspsc",31151902,"Leather straps",
+"unspsc",31151903,"Fiber straps",
+"unspsc",31151904,"Plastic straps",
+"unspsc",31151905,"Rubber straps",
+"unspsc",31152000,"Security wire",
+"unspsc",31152001,"Razor wire",
+"unspsc",31152002,"Barbed wire",
+"unspsc",31160000,"Hardware",
+"unspsc",31161500,"Screws",
+"unspsc",31161501,"Cap screws",
+"unspsc",31161502,"Anchor screws",
+"unspsc",31161503,"Drive screws",
+"unspsc",31161504,"Machine screws",
+"unspsc",31161505,"Set screws",
+"unspsc",31161506,"Sheet metal screws",
+"unspsc",31161507,"Tapping screws",
+"unspsc",31161508,"Wood screws",
+"unspsc",31161509,"Drywall screws",
+"unspsc",31161510,"Captive screw",
+"unspsc",31161511,"Locking screws",
+"unspsc",31161512,"Thread rolling screws",
+"unspsc",31161513,"Flathead screws",
+"unspsc",31161514,"Weld screws",
+"unspsc",31161516,"Thumb screws",
+"unspsc",31161517,"Shoulder screws",
+"unspsc",31161518,"Socket screw",
+"unspsc",31161600,"Bolts",
+"unspsc",31161601,"Anchor bolts",
+"unspsc",31161602,"Blind bolts",
+"unspsc",31161603,"Carriage bolts",
+"unspsc",31161604,"Clevis bolts",
+"unspsc",31161605,"Cylinder bolts",
+"unspsc",31161606,"Door bolts",
+"unspsc",31161607,"Expansion bolts",
+"unspsc",31161608,"Lag bolts",
+"unspsc",31161609,"Toggle bolts",
+"unspsc",31161610,"Eye bolts",
+"unspsc",31161611,"Locking bolts",
+"unspsc",31161612,"Pin or collar bolts",
+"unspsc",31161613,"Tension bolts",
+"unspsc",31161614,"Structural bolts",
+"unspsc",31161616,"U bolts",
+"unspsc",31161617,"Wing bolts",
+"unspsc",31161618,"Threaded rod",
+"unspsc",31161619,"Stud bolts",
+"unspsc",31161620,"Hexagonal bolts",
+"unspsc",31161621,"Elevator bolts",
+"unspsc",31161700,"Nuts",
+"unspsc",31161701,"Anchor nuts",
+"unspsc",31161702,"Bearing nuts",
+"unspsc",31161703,"Blind nuts",
+"unspsc",31161704,"Barrel nuts",
+"unspsc",31161705,"Cap nuts",
+"unspsc",31161706,"Captive nuts",
+"unspsc",31161707,"Castle nuts",
+"unspsc",31161708,"Channel nuts",
+"unspsc",31161709,"Clamping nuts",
+"unspsc",31161710,"Expansion nuts",
+"unspsc",31161711,"Eye nuts",
+"unspsc",31161712,"Flange nuts",
+"unspsc",31161713,"Hose nuts",
+"unspsc",31161714,"Insert nuts",
+"unspsc",31161716,"Locknuts",
+"unspsc",31161717,"Wing nuts",
+"unspsc",31161718,"Toggle nuts",
+"unspsc",31161719,"Swivel nuts",
+"unspsc",31161720,"Stop nuts",
+"unspsc",31161721,"Spring nuts",
+"unspsc",31161722,"Union nuts",
+"unspsc",31161723,"Nutplate nuts",
+"unspsc",31161724,"Press nuts",
+"unspsc",31161725,"Clip nuts",
+"unspsc",31161726,"Dome nuts",
+"unspsc",31161727,"Hexagonal nuts",
+"unspsc",31161728,"Coupling nuts",
+"unspsc",31161729,"Knurled nuts",
+"unspsc",31161730,"Square nuts",
+"unspsc",31161731,"Weld nuts",
+"unspsc",31161800,"Washers",
+"unspsc",31161801,"Locking washers",
+"unspsc",31161802,"Bevel washers",
+"unspsc",31161803,"Binding washers",
+"unspsc",31161804,"Curved washers",
+"unspsc",31161805,"Electrical insulating washers",
+"unspsc",31161806,"Finishing washers",
+"unspsc",31161807,"Flat washers",
+"unspsc",31161808,"Open washers",
+"unspsc",31161809,"Reducing washers",
+"unspsc",31161810,"Shim washers",
+"unspsc",31161811,"Spring washers",
+"unspsc",31161812,"Square washers",
+"unspsc",31161813,"Swivel washers",
+"unspsc",31161814,"Thrust washers",
+"unspsc",31161815,"Shoulder washers",
+"unspsc",31161816,"Spacers or standoffs",
+"unspsc",31161817,"Conical washers",
+"unspsc",31161818,"Seal washers",
+"unspsc",31161819,"Washer kits",
+"unspsc",31161820,"Spherical or domed washers",
+"unspsc",31161900,"Springs",
+"unspsc",31161901,"Helical springs",
+"unspsc",31161902,"Leaf springs",
+"unspsc",31161903,"Spiral springs",
+"unspsc",31161904,"Compression springs",
+"unspsc",31161905,"Die springs",
+"unspsc",31161906,"Disk springs",
+"unspsc",31161907,"Extension springs",
+"unspsc",31161908,"Torsion springs",
+"unspsc",31162000,"Nails",
+"unspsc",31162001,"Brads",
+"unspsc",31162002,"Cap nails",
+"unspsc",31162003,"Finishing nails",
+"unspsc",31162004,"Masonry nails",
+"unspsc",31162005,"Roofing nails",
+"unspsc",31162006,"Wire nails",
+"unspsc",31162007,"Upholstery nails",
+"unspsc",31162008,"Drive pins",
+"unspsc",31162100,"Anchors",
+"unspsc",31162101,"Concrete anchors",
+"unspsc",31162102,"Wedge anchors",
+"unspsc",31162103,"Wall anchors",
+"unspsc",31162104,"Screw anchors",
+"unspsc",31162105,"Resin anchors",
+"unspsc",31162106,"Pipe anchors",
+"unspsc",31162107,"Nail expansion anchors",
+"unspsc",31162108,"Tie down anchors",
+"unspsc",31162200,"Rivets",
+"unspsc",31162201,"Blind rivets",
+"unspsc",31162202,"Crownhead rivets",
+"unspsc",31162203,"Flat head rivets",
+"unspsc",31162204,"Full rivets",
+"unspsc",31162205,"Ratchet rivets",
+"unspsc",31162206,"Tinners rivets",
+"unspsc",31162207,"Compression rivets",
+"unspsc",31162208,"Coopers rivets",
+"unspsc",31162209,"Button head rivets",
+"unspsc",31162210,"Hinged or self setting  rivets",
+"unspsc",31162300,"Mounting hardware",
+"unspsc",31162301,"Mounting profiles",
+"unspsc",31162303,"Mounting bars",
+"unspsc",31162304,"Mounting strips",
+"unspsc",31162305,"Mounting clips",
+"unspsc",31162306,"Mounting hangers",
+"unspsc",31162307,"Mounting plates",
+"unspsc",31162308,"Mounting panels",
+"unspsc",31162309,"Mounting racks",
+"unspsc",31162310,"Mounting straps",
+"unspsc",31162311,"Wall bushings",
+"unspsc",31162312,"Mounting pins",
+"unspsc",31162313,"Mounting kits",
+"unspsc",31162400,"Miscellaneous fasteners",
+"unspsc",31162401,"Grommets",
+"unspsc",31162402,"Hasps",
+"unspsc",31162403,"Hinges",
+"unspsc",31162404,"Hardware staples",
+"unspsc",31162405,"Turnbuckles",
+"unspsc",31162406,"Strapping or banding buckles",
+"unspsc",31162407,"Latch",
+"unspsc",31162409,"Clevis pin",
+"unspsc",31162410,"Knurled pins",
+"unspsc",31162411,"Snap rings",
+"unspsc",31162412,"Clevis",
+"unspsc",31162413,"Snap fastener",
+"unspsc",31162414,"Cleat",
+"unspsc",31162415,"Pawls",
+"unspsc",31162416,"Connecting or coupling pins",
+"unspsc",31162417,"Aligning pins",
+"unspsc",31162418,"Twist ties",
+"unspsc",31162500,"Brackets and braces",
+"unspsc",31162501,"Shelf brackets",
+"unspsc",31162502,"Angle brackets",
+"unspsc",31162503,"Braces",
+"unspsc",31162504,"Electrical fixture brackets",
+"unspsc",31162505,"Magnetic mounting brackets",
+"unspsc",31162506,"Wall mount bracket",
+"unspsc",31162507,"Pinion brackets",
+"unspsc",31162600,"Hooks",
+"unspsc",31162601,"Swivel hooks",
+"unspsc",31162602,"Spring hooks",
+"unspsc",31162603,"S hooks",
+"unspsc",31162604,"Safety hooks",
+"unspsc",31162605,"Lifting hooks",
+"unspsc",31162606,"J hooks",
+"unspsc",31162607,"Guy wire hooks",
+"unspsc",31162608,"Grab hooks",
+"unspsc",31162609,"Screw hooks",
+"unspsc",31162610,"Peg board hooks",
+"unspsc",31162611,"Slip hooks",
+"unspsc",31162700,"Rolling hardware",
+"unspsc",31162701,"Casters",
+"unspsc",31162702,"Wheels",
+"unspsc",31162703,"Sliders",
+"unspsc",31162704,"Roller spikes",
+"unspsc",31162800,"Miscellaneous hardware",
+"unspsc",31162801,"Handles or knobs",
+"unspsc",31162802,"Inserts",
+"unspsc",31162803,"Shackles",
+"unspsc",31162804,"Door stops",
+"unspsc",31162805,"Cable thimble",
+"unspsc",31162806,"Screw covers",
+"unspsc",31162807,"Levers",
+"unspsc",31162808,"Panic bars",
+"unspsc",31162809,"Locating pins",
+"unspsc",31162810,"Splices or splice plates",
+"unspsc",31162811,"Shaft collar",
+"unspsc",31162900,"Clamps",
+"unspsc",31162901,"Ear clamps",
+"unspsc",31162902,"Spring clamps",
+"unspsc",31162903,"Screw clamps",
+"unspsc",31162904,"Wire rope clamps",
+"unspsc",31162905,"Beam clamps",
+"unspsc",31162906,"Hose or pipe clamps",
+"unspsc",31163000,"Couplings",
+"unspsc",31163001,"Elastomeric couplings",
+"unspsc",31163002,"Gear couplings",
+"unspsc",31163003,"Metallic couplings",
+"unspsc",31163004,"Miniature couplings",
+"unspsc",31163005,"Coupling sleeves",
+"unspsc",31163100,"Connectors",
+"unspsc",31163101,"Quick disconnects",
+"unspsc",31163102,"Ferrule",
+"unspsc",31163103,"Trailer Connector",
+"unspsc",31163200,"Retaining hardware",
+"unspsc",31163201,"Spring pins",
+"unspsc",31163202,"Retaining rings",
+"unspsc",31163203,"Dowel pin",
+"unspsc",31163204,"Cotter pin",
+"unspsc",31163205,"Taper pins",
+"unspsc",31163207,"Shaft or woodruff keys",
+"unspsc",31163208,"Keystock",
+"unspsc",31163209,"Bearing holders or retainers",
+"unspsc",31163210,"Retaining collars",
+"unspsc",31163211,"Retaining clips",
+"unspsc",31163212,"Threaded pins",
+"unspsc",31163213,"Pivot pins",
+"unspsc",31163214,"Shear pins",
+"unspsc",31163215,"Grooved pins",
+"unspsc",31163300,"Spacer",
+"unspsc",31163301,"Shim",
+"unspsc",31170000,"Bearings and bushings and wheels and gears",
+"unspsc",31171500,"Bearings",
+"unspsc",31171501,"Flanged bearings",
+"unspsc",31171502,"Radial bearings",
+"unspsc",31171503,"Wheel bearings",
+"unspsc",31171504,"Ball bearings",
+"unspsc",31171505,"Roller bearings",
+"unspsc",31171506,"Linear bearings",
+"unspsc",31171507,"Thrust bearings",
+"unspsc",31171508,"Rod end bearings",
+"unspsc",31171509,"Sleeve bearings",
+"unspsc",31171510,"Spherical bearings",
+"unspsc",31171511,"Pillow block bearings",
+"unspsc",31171512,"Needle bearings",
+"unspsc",31171513,"Hanger bearings",
+"unspsc",31171515,"Plain bearings",
+"unspsc",31171516,"Tapered bearings",
+"unspsc",31171518,"Bearing cage",
+"unspsc",31171519,"Bearing blocks or housings",
+"unspsc",31171520,"Bearing journals",
+"unspsc",31171521,"Bearing rollers or balls",
+"unspsc",31171522,"Magnetic bearings",
+"unspsc",31171523,"Air bearings",
+"unspsc",31171524,"Bearing caps",
+"unspsc",31171525,"Bearing liners",
+"unspsc",31171526,"Bearing pads",
+"unspsc",31171527,"Bearing cones",
+"unspsc",31171528,"Split bearing",
+"unspsc",31171529,"Bearing cups",
+"unspsc",31171600,"Bushings",
+"unspsc",31171603,"Drill bushings",
+"unspsc",31171604,"Pilot bushings",
+"unspsc",31171605,"Shaft bushings",
+"unspsc",31171606,"Flange bushings",
+"unspsc",31171700,"Gears",
+"unspsc",31171704,"Friction gears",
+"unspsc",31171706,"Conical gears",
+"unspsc",31171707,"Spur gears",
+"unspsc",31171708,"Bevel gears",
+"unspsc",31171709,"Rack gears",
+"unspsc",31171710,"Pinion gears",
+"unspsc",31171711,"Ring gears",
+"unspsc",31171712,"Worm gears",
+"unspsc",31171713,"Side Gears",
+"unspsc",31171714,"Helical gears",
+"unspsc",31171800,"Industrial wheels",
+"unspsc",31171801,"Cog wheels",
+"unspsc",31171802,"Impeller wheels",
+"unspsc",31171803,"Flywheels",
+"unspsc",31171804,"Sheaves or pulleys",
+"unspsc",31171805,"Wheel brushes",
+"unspsc",31171806,"Idler wheels",
+"unspsc",31171900,"Sprockets",
+"unspsc",31171901,"Roller chain sprockets",
+"unspsc",31180000,"Gaskets and seals",
+"unspsc",31181500,"Gaskets",
+"unspsc",31181501,"Plastic gaskets",
+"unspsc",31181502,"Rubber gaskets",
+"unspsc",31181503,"Metal gaskets",
+"unspsc",31181504,"Textile gaskets",
+"unspsc",31181505,"Cork gaskets",
+"unspsc",31181506,"O ring gaskets",
+"unspsc",31181507,"Electromagnetic interference EMI gaskets",
+"unspsc",31181508,"Bolted gaskets",
+"unspsc",31181509,"Gasket kits",
+"unspsc",31181510,"Silicone gaskets",
+"unspsc",31181511,"Liquid gaskets",
+"unspsc",31181512,"Compressed fiber gaskets",
+"unspsc",31181600,"Seals",
+"unspsc",31181601,"Plastic seals",
+"unspsc",31181602,"Rubber seals",
+"unspsc",31181603,"Metallic seals",
+"unspsc",31181604,"Seal mechanical",
+"unspsc",31181605,"Diaphragm seals",
+"unspsc",31181606,"Seal kits",
+"unspsc",31181607,"Mast boots",
+"unspsc",31181700,"Packings and glands",
+"unspsc",31181701,"Packings",
+"unspsc",31181702,"Glands",
+"unspsc",31181703,"Oil slingers",
+"unspsc",31190000,"Grinding and polishing and smoothing materials",
+"unspsc",31191500,"Abrasives and abrasive media",
+"unspsc",31191501,"Abrasive papers",
+"unspsc",31191502,"Buffs",
+"unspsc",31191504,"Abrasive cloth",
+"unspsc",31191505,"Abrasive pads",
+"unspsc",31191506,"Abrasive discs",
+"unspsc",31191507,"Abrasive belts",
+"unspsc",31191508,"Bort",
+"unspsc",31191509,"Abrasive polishers",
+"unspsc",31191510,"Abrasive stones",
+"unspsc",31191511,"Steel wool",
+"unspsc",31191512,"Shot blast",
+"unspsc",31191513,"Glass bead",
+"unspsc",31191514,"Tumble media",
+"unspsc",31191515,"Abrasive mesh",
+"unspsc",31191516,"Abrasive cartridge rolls",
+"unspsc",31191517,"Emery boards",
+"unspsc",31191518,"Tungsten carbide",
+"unspsc",31191519,"Abrasive drums",
+"unspsc",31191600,"Abrasive wheels",
+"unspsc",31191601,"Abrasive cubic borozon nitrate wheels",
+"unspsc",31191602,"Abrasive diamond wheels",
+"unspsc",31191603,"Tungsten carbide abrasive wheels",
+"unspsc",31200000,"Adhesives and sealants",
+"unspsc",31201500,"Tape",
+"unspsc",31201501,"Duct tape",
+"unspsc",31201502,"Electrical insulating tape",
+"unspsc",31201503,"Masking tape",
+"unspsc",31201504,"Carpet tape",
+"unspsc",31201505,"Double sided tape",
+"unspsc",31201506,"Bismalemide tape",
+"unspsc",31201507,"Fiberglass tape",
+"unspsc",31201508,"Graphite tape",
+"unspsc",31201509,"Nylon tape",
+"unspsc",31201510,"Resin impregnated tape",
+"unspsc",31201511,"Wire mesh tape",
+"unspsc",31201512,"Transparent tape",
+"unspsc",31201513,"Non skid safety tapes",
+"unspsc",31201514,"Polytetrafluoroethylene PTFE thread sealing tape",
+"unspsc",31201515,"Paper tapes",
+"unspsc",31201516,"Reflective tape",
+"unspsc",31201517,"Packaging tape",
+"unspsc",31201518,"Electrically conductive tape",
+"unspsc",31201519,"Pipe or hose repair tape",
+"unspsc",31201520,"Aisle marking tape",
+"unspsc",31201521,"Foil tape",
+"unspsc",31201522,"Adhesive transfer tape",
+"unspsc",31201523,"Cloth tape",
+"unspsc",31201524,"Color coding tape",
+"unspsc",31201525,"Vinyl tape",
+"unspsc",31201526,"Magnetic tape",
+"unspsc",31201527,"Foam tapes",
+"unspsc",31201528,"Rigging tape",
+"unspsc",31201600,"Other adhesives and sealants",
+"unspsc",31201601,"Chemical adhesives",
+"unspsc",31201602,"Pastes",
+"unspsc",31201603,"Gums",
+"unspsc",31201604,"Rubber cements",
+"unspsc",31201605,"Putties",
+"unspsc",31201606,"Caulks",
+"unspsc",31201607,"Epoxy bond",
+"unspsc",31201608,"Foam adhesives",
+"unspsc",31201609,"Hot melt adhesives",
+"unspsc",31201610,"Glues",
+"unspsc",31201611,"Film adhesives",
+"unspsc",31201612,"Thread sealants",
+"unspsc",31201613,"Re usable adhesive",
+"unspsc",31201614,"Sealing waxes",
+"unspsc",31201615,"Adhesive activators",
+"unspsc",31201616,"Liquid adhesives",
+"unspsc",31201617,"Solvent cements",
+"unspsc",31210000,"Paints and primers and finishes",
+"unspsc",31211500,"Paints and primers",
+"unspsc",31211501,"Enamel paints",
+"unspsc",31211502,"Water based paints",
+"unspsc",31211503,"Pigment paints",
+"unspsc",31211504,"Coating paints",
+"unspsc",31211505,"Oil based paints",
+"unspsc",31211506,"Latex paints",
+"unspsc",31211507,"Spray paints",
+"unspsc",31211508,"Acrylic paints",
+"unspsc",31211509,"Enamel primers",
+"unspsc",31211510,"Polyurethane primers",
+"unspsc",31211511,"Urethane primers",
+"unspsc",31211512,"Latex primers",
+"unspsc",31211600,"Paint additives",
+"unspsc",31211601,"Calcimines",
+"unspsc",31211602,"Texturing materials",
+"unspsc",31211603,"Paint driers",
+"unspsc",31211604,"Paint extenders",
+"unspsc",31211605,"Anti slip agents",
+"unspsc",31211606,"Leveling agents",
+"unspsc",31211700,"Miscellaneous finishes",
+"unspsc",31211701,"Glazes",
+"unspsc",31211702,"Lusters",
+"unspsc",31211703,"Lacquers",
+"unspsc",31211704,"Sealers",
+"unspsc",31211705,"Shellacs",
+"unspsc",31211706,"Stains",
+"unspsc",31211707,"Varnishes",
+"unspsc",31211708,"Powder coat",
+"unspsc",31211800,"Paint solvents and thinners",
+"unspsc",31211801,"Paint or varnish removers",
+"unspsc",31211802,"Paint or varnish strippers",
+"unspsc",31211803,"Paint or varnish thinners",
+"unspsc",31211900,"Paint applicators and painting accessories",
+"unspsc",31211901,"Drop cloths",
+"unspsc",31211902,"Edging tools",
+"unspsc",31211903,"Masking equipment",
+"unspsc",31211904,"Paint brushes",
+"unspsc",31211905,"Paint mixers",
+"unspsc",31211906,"Paint rollers",
+"unspsc",31211908,"Paint sprayers",
+"unspsc",31211909,"Paint trays",
+"unspsc",31211910,"Paint mitts",
+"unspsc",31211912,"Telescoping poles",
+"unspsc",31211913,"Paint nozzles",
+"unspsc",31211914,"Air brushes",
+"unspsc",31211915,"Paint strainers",
+"unspsc",31211916,"Paint tray liners",
+"unspsc",31211917,"Paint roller covers",
+"unspsc",31220000,"Dyeing and tanning extracts",
+"unspsc",31221600,"Tanning products",
+"unspsc",31221601,"Inorganic tanning extracts",
+"unspsc",31221602,"Organic tanning extracts of animal origin",
+"unspsc",31221603,"Organic tanning extracts of vegetable origin",
+"unspsc",31230000,"Machined raw stock",
+"unspsc",31231100,"Machined bar stock",
+"unspsc",31231101,"Aluminum machined bar stock",
+"unspsc",31231102,"Beryllium machined bar stock",
+"unspsc",31231103,"Brass machined bar stock",
+"unspsc",31231104,"Bronze machined bar stock",
+"unspsc",31231105,"Copper machined bar stock",
+"unspsc",31231106,"Iron machined bar stock",
+"unspsc",31231107,"Lead machined bar stock",
+"unspsc",31231108,"Magnesium machined bar stock",
+"unspsc",31231109,"Precious metal machined bar stock",
+"unspsc",31231110,"Stainless steel machined bar stock",
+"unspsc",31231111,"Tin machined bar stock",
+"unspsc",31231112,"Titanium machined bar stock",
+"unspsc",31231113,"Zinc machined bar stock",
+"unspsc",31231114,"Non ferrous alloy machined bar stock",
+"unspsc",31231115,"Ferrous alloy machined bar stock",
+"unspsc",31231116,"Steel machined bar stock",
+"unspsc",31231117,"Composite machined bar stock",
+"unspsc",31231118,"Nickel alloy machined bar stock",
+"unspsc",31231119,"Non metallic machined bar stock",
+"unspsc",31231200,"Machined plate stock",
+"unspsc",31231201,"Aluminum machined plate stock",
+"unspsc",31231202,"Beryllium machined plate stock",
+"unspsc",31231203,"Brass machined plate stock",
+"unspsc",31231204,"Bronze machined plate stock",
+"unspsc",31231205,"Copper machined plate stock",
+"unspsc",31231206,"Iron machined plate stock",
+"unspsc",31231207,"Lead machined plate stock",
+"unspsc",31231208,"Magnesium machined plate stock",
+"unspsc",31231209,"Precious metal machined plate stock",
+"unspsc",31231210,"Stainless steel machined plate stock",
+"unspsc",31231211,"Tin machined plate stock",
+"unspsc",31231212,"Titanium machined plate stock",
+"unspsc",31231213,"Zinc machined plate stock",
+"unspsc",31231214,"Non ferrous alloy machined plate stock",
+"unspsc",31231215,"Ferrous alloy machined plate stock",
+"unspsc",31231216,"Steel machined plate stock",
+"unspsc",31231217,"Composite machined plate stock",
+"unspsc",31231218,"Nickel alloy machined plate stock",
+"unspsc",31231219,"Non metallic machined plate stock",
+"unspsc",31231300,"Tube and tubing",
+"unspsc",31231301,"Ferrous alloy tubing",
+"unspsc",31231302,"Copper tubing",
+"unspsc",31231303,"Titanium tubing",
+"unspsc",31231304,"Magnesium tubing",
+"unspsc",31231305,"Tin tubing",
+"unspsc",31231306,"Brass tubing",
+"unspsc",31231307,"Lead tubing",
+"unspsc",31231308,"Bronze tubing",
+"unspsc",31231309,"Zinc tubing",
+"unspsc",31231310,"Steel tubing",
+"unspsc",31231311,"Iron tubing",
+"unspsc",31231312,"Cement tubing",
+"unspsc",31231313,"Plastic tubing",
+"unspsc",31231314,"Rubber tubing",
+"unspsc",31231315,"Glass tubing",
+"unspsc",31231316,"Stone tubing",
+"unspsc",31231317,"Non ferrous alloy tubing",
+"unspsc",31231318,"Aluminum tubing",
+"unspsc",31231319,"Stainless steel tubing",
+"unspsc",31231320,"Precious metal tubing",
+"unspsc",31231321,"Nylon tubing",
+"unspsc",31231400,"Shim stock",
+"unspsc",31231401,"Brass shim stock",
+"unspsc",31231402,"Steel shim stock",
+"unspsc",31231403,"Stainless steel shim stock",
+"unspsc",31231404,"Aluminum shim stock",
+"unspsc",31231405,"Copper shim stock",
+"unspsc",31240000,"Industrial optics",
+"unspsc",31241500,"Lenses and prisms",
+"unspsc",31241501,"Lenses",
+"unspsc",31241502,"Prisms",
+"unspsc",31241600,"Optical blanks",
+"unspsc",31241601,"Filter blanks",
+"unspsc",31241602,"Glass disks",
+"unspsc",31241603,"Molded glass",
+"unspsc",31241604,"Prism blanks",
+"unspsc",31241605,"Silicon blanks",
+"unspsc",31241606,"Germanium blanks",
+"unspsc",31241607,"Round bar stock",
+"unspsc",31241608,"Square bar stock",
+"unspsc",31241609,"Witness sample blanks",
+"unspsc",31241610,"Infrared optical material blanks",
+"unspsc",31241700,"Mirrors",
+"unspsc",31241701,"Diamond turned mirrors",
+"unspsc",31241702,"Metallic mirrors",
+"unspsc",31241703,"Parabolic mirrors",
+"unspsc",31241704,"Uncoated mirrors",
+"unspsc",31241705,"Laser mirrors",
+"unspsc",31241800,"Optical filters",
+"unspsc",31241801,"Broad band filters",
+"unspsc",31241802,"Gradient filters",
+"unspsc",31241803,"Infrared filters",
+"unspsc",31241804,"Laser filters",
+"unspsc",31241805,"Narrow band filters",
+"unspsc",31241806,"Pelicle filters",
+"unspsc",31241807,"Visual filters",
+"unspsc",31241900,"Optical domes",
+"unspsc",31241901,"Specialty domes",
+"unspsc",31241902,"Diamond turned domes",
+"unspsc",31241903,"Metallic domes",
+"unspsc",31241904,"Molded glass domes",
+"unspsc",31241905,"Molded polycarbonate domes",
+"unspsc",31241906,"Replicated domes",
+"unspsc",31241907,"Shaped domes",
+"unspsc",31241908,"Frangible domes",
+"unspsc",31242000,"Lens and laser windows",
+"unspsc",31242001,"External lens or laser windows",
+"unspsc",31242002,"Infrared lens or laser windows",
+"unspsc",31242003,"Visual lens or laser windows",
+"unspsc",31242100,"Optical device accessories",
+"unspsc",31242101,"Optical mounts",
+"unspsc",31242103,"Optical slits or apertures",
+"unspsc",31242104,"Optical rails or bases",
+"unspsc",31242105,"Optical fiber identifiers",
+"unspsc",31242106,"Optical coatings",
+"unspsc",31242200,"Miscellaneous optical components",
+"unspsc",31242201,"Optical beamsplitters",
+"unspsc",31242202,"Polarizers",
+"unspsc",31242203,"Depolarizers",
+"unspsc",31242204,"Optical diffusers",
+"unspsc",31242205,"Optical retarders",
+"unspsc",31242206,"Optical flats",
+"unspsc",31242207,"Optical breadboards",
+"unspsc",31242208,"Optical choppers",
+"unspsc",31250000,"Pneumatic and hydraulic and electric control systems",
+"unspsc",31251500,"Actuators",
+"unspsc",31251501,"Electric actuators",
+"unspsc",31251502,"Electronic actuators",
+"unspsc",31251503,"Hydraulic actuators",
+"unspsc",31251504,"Pneumatic actuators",
+"unspsc",31251505,"Valve actuators",
+"unspsc",31251506,"Gear actuators",
+"unspsc",31251507,"Rotary actuators",
+"unspsc",31251508,"Photoelectric actuators",
+"unspsc",31251509,"Electromagnetic actuators",
+"unspsc",31251510,"Solenoids",
+"unspsc",31251511,"Linear actuators",
+"unspsc",31251600,"Robot components",
+"unspsc",31251601,"Robotic end effectors",
+"unspsc",31260000,"Housings and cabinets and casings",
+"unspsc",31261500,"Housings and cabinets",
+"unspsc",31261501,"Plastic housings or cabinets",
+"unspsc",31261502,"Metal housings or cabinets",
+"unspsc",31261503,"Steel housings or cabinets",
+"unspsc",31261504,"Gear box housings",
+"unspsc",31261505,"Clutch housing",
+"unspsc",31261600,"Shells and casings",
+"unspsc",31261601,"Plastic shells or casings",
+"unspsc",31261602,"Metal shells or casings",
+"unspsc",31261603,"Steel shells or casings",
+"unspsc",31261700,"Acoustical or noise control housings or enclosures",
+"unspsc",31261701,"Machine noise control housing",
+"unspsc",31261702,"Mounted generator set noise control enclosure",
+"unspsc",31261703,"Pump noise control housing",
+"unspsc",31261704,"Air intake noise control enclosure",
+"unspsc",31270000,"Machine made parts",
+"unspsc",31271600,"Screw machine made parts",
+"unspsc",31271601,"Metal screw machine made parts",
+"unspsc",31271602,"Non metal screw machine made parts",
+"unspsc",31280000,"Stampings and sheet components",
+"unspsc",31281500,"Stamped components",
+"unspsc",31281502,"Aluminum stamped components",
+"unspsc",31281503,"Ferrous alloy stamped components",
+"unspsc",31281504,"Iron stamped components",
+"unspsc",31281505,"Non ferrous alloy stamped components",
+"unspsc",31281506,"Stainless steel stamped components",
+"unspsc",31281507,"Carbon steel stamped components",
+"unspsc",31281508,"Magnesium stamped components",
+"unspsc",31281509,"Zinc stamped components",
+"unspsc",31281510,"Tin stamped components",
+"unspsc",31281511,"Titanium stamped components",
+"unspsc",31281512,"Beryllium stamped components",
+"unspsc",31281513,"Precious metal stamped components",
+"unspsc",31281514,"Copper stamped components",
+"unspsc",31281515,"Lead stamped components",
+"unspsc",31281516,"Brass stamped components",
+"unspsc",31281517,"Bronze stamped components",
+"unspsc",31281518,"Composite stamped components",
+"unspsc",31281519,"Nickel alloy stamped components",
+"unspsc",31281520,"Non metallic stamped components",
+"unspsc",31281521,"Coated stampings",
+"unspsc",31281700,"Welded components",
+"unspsc",31281701,"Welded metal components",
+"unspsc",31281800,"Punched components",
+"unspsc",31281801,"Aluminum punched components",
+"unspsc",31281802,"Ferrous alloy punched components",
+"unspsc",31281803,"Iron punched components",
+"unspsc",31281804,"Non ferrous alloy punched components",
+"unspsc",31281805,"Stainless steel punched components",
+"unspsc",31281806,"Carbon steel punched components",
+"unspsc",31281807,"Composite punched components",
+"unspsc",31281808,"Nickel alloy punched components",
+"unspsc",31281809,"Non metallic punched components",
+"unspsc",31281810,"Titanium punched components",
+"unspsc",31281811,"Beryllium punched components",
+"unspsc",31281812,"Precious metal punched components",
+"unspsc",31281813,"Copper punched components",
+"unspsc",31281814,"Lead punched components",
+"unspsc",31281815,"Brass punched components",
+"unspsc",31281816,"Bronze punched components",
+"unspsc",31281817,"Magnesium punched components",
+"unspsc",31281818,"Zinc punched components",
+"unspsc",31281819,"Tin punched components",
+"unspsc",31281900,"Draw formed components",
+"unspsc",31281901,"Aluminum draw formed components",
+"unspsc",31281902,"Beryllium draw formed components",
+"unspsc",31281903,"Brass draw formed components",
+"unspsc",31281904,"Bronze draw formed components",
+"unspsc",31281905,"Composite draw formed components",
+"unspsc",31281906,"Copper draw formed components",
+"unspsc",31281907,"Ferrous alloy draw formed components",
+"unspsc",31281908,"Iron draw formed components",
+"unspsc",31281909,"Lead draw formed components",
+"unspsc",31281910,"Magnesium draw formed components",
+"unspsc",31281911,"Nickel alloy draw formed components",
+"unspsc",31281912,"Non ferrous alloy draw formed components",
+"unspsc",31281913,"Non metallic draw formed components",
+"unspsc",31281914,"Precious metal draw formed components",
+"unspsc",31281915,"Stainless steel draw formed components",
+"unspsc",31281916,"Steel draw formed components",
+"unspsc",31281917,"Tin draw formed components",
+"unspsc",31281918,"Titanium draw formed components",
+"unspsc",31281919,"Zinc draw formed components",
+"unspsc",31282000,"Hydro formed components",
+"unspsc",31282001,"Aluminum hydro formed components",
+"unspsc",31282002,"Beryllium hydro formed components",
+"unspsc",31282003,"Brass hydro formed components",
+"unspsc",31282004,"Bronze hydro formed components",
+"unspsc",31282005,"Composite hydro formed components",
+"unspsc",31282006,"Copper hydro formed components",
+"unspsc",31282007,"Ferrous alloy hydro formed components",
+"unspsc",31282008,"Iron hydro formed components",
+"unspsc",31282009,"Lead hydro formed components",
+"unspsc",31282010,"Magnesium hydro formed components",
+"unspsc",31282011,"Nickel alloy hydro formed components",
+"unspsc",31282012,"Non ferrous alloy hydro formed components",
+"unspsc",31282013,"Non metallic hydro formed components",
+"unspsc",31282014,"Precious metal hydro formed components",
+"unspsc",31282015,"Stainless steel hydro formed components",
+"unspsc",31282016,"Steel hydro formed components",
+"unspsc",31282017,"Tin hydro formed components",
+"unspsc",31282018,"Titanium hydro formed components",
+"unspsc",31282019,"Zinc hydro formed components",
+"unspsc",31282100,"Spin formed components",
+"unspsc",31282101,"Aluminum spin formed components",
+"unspsc",31282102,"Beryllium spin formed components",
+"unspsc",31282103,"Brass spin formed components",
+"unspsc",31282104,"Bronze spin formed components",
+"unspsc",31282105,"Composite spin formed components",
+"unspsc",31282106,"Copper spin formed components",
+"unspsc",31282107,"Ferrous alloy spin formed components",
+"unspsc",31282108,"Iron spin formed components",
+"unspsc",31282109,"Lead spin formed components",
+"unspsc",31282110,"Magnesium spin formed components",
+"unspsc",31282111,"Nickel alloy spin formed components",
+"unspsc",31282112,"Non ferrous alloy spin formed components",
+"unspsc",31282113,"Non metallic spin formed components",
+"unspsc",31282114,"Precious metal spin formed components",
+"unspsc",31282115,"Stainless steel spin formed components",
+"unspsc",31282116,"Steel spin formed components",
+"unspsc",31282117,"Tin spin formed components",
+"unspsc",31282118,"Titanium spin formed components",
+"unspsc",31282119,"Zinc spin formed components",
+"unspsc",31282200,"Roll formed components",
+"unspsc",31282201,"Aluminum roll formed components",
+"unspsc",31282202,"Beryllium roll formed components",
+"unspsc",31282203,"Brass roll formed components",
+"unspsc",31282204,"Bronze roll formed components",
+"unspsc",31282205,"Composite roll formed components",
+"unspsc",31282206,"Copper roll formed components",
+"unspsc",31282207,"Ferrous alloy roll formed components",
+"unspsc",31282208,"Iron roll formed components",
+"unspsc",31282209,"Lead roll formed components",
+"unspsc",31282210,"Magnesium roll formed components",
+"unspsc",31282211,"Nickel alloy roll formed components",
+"unspsc",31282212,"Non ferrous alloy roll formed components",
+"unspsc",31282213,"Non metallic roll formed components",
+"unspsc",31282214,"Precious metal roll formed components",
+"unspsc",31282215,"Stainless steel roll formed components",
+"unspsc",31282216,"Steel roll formed components",
+"unspsc",31282217,"Tin roll formed components",
+"unspsc",31282218,"Titanium roll formed components",
+"unspsc",31282219,"Zinc roll formed components",
+"unspsc",31282300,"Stretch formed components",
+"unspsc",31282301,"Aluminum stretch formed components",
+"unspsc",31282302,"Beryllium stretch formed components",
+"unspsc",31282303,"Brass stretch formed components",
+"unspsc",31282304,"Bronze stretch formed components",
+"unspsc",31282305,"Composite stretch formed components",
+"unspsc",31282306,"Copper stretch formed components",
+"unspsc",31282307,"Ferrous alloy stretch formed components",
+"unspsc",31282308,"Iron stretch formed components",
+"unspsc",31282309,"Lead stretch formed components",
+"unspsc",31282310,"Magnesium stretch formed components",
+"unspsc",31282311,"Nickel alloy stretch formed components",
+"unspsc",31282312,"Non ferrous alloy stretch formed components",
+"unspsc",31282313,"Non metallic stretch formed components",
+"unspsc",31282314,"Precious metal stretch formed components",
+"unspsc",31282315,"Stainless steel stretch formed components",
+"unspsc",31282316,"Steel stretch formed components",
+"unspsc",31282317,"Tin stretch formed components",
+"unspsc",31282318,"Titanium stretch formed components",
+"unspsc",31282319,"Zinc stretch formed components",
+"unspsc",31282400,"Explosive formed components",
+"unspsc",31282401,"Aluminum explosive formed components",
+"unspsc",31282402,"Beryllium explosive formed components",
+"unspsc",31282403,"Brass explosive formed components",
+"unspsc",31282404,"Bronze explosive formed components",
+"unspsc",31282405,"Composite explosive formed components",
+"unspsc",31282406,"Copper explosive formed components",
+"unspsc",31282407,"Ferrous alloy explosive formed components",
+"unspsc",31282408,"Iron explosive formed components",
+"unspsc",31282409,"Lead explosive formed components",
+"unspsc",31282410,"Magnesium explosive formed components",
+"unspsc",31282411,"Nickel alloy explosive formed components",
+"unspsc",31282412,"Non ferrous alloy explosive formed components",
+"unspsc",31282413,"Non metallic explosive formed components",
+"unspsc",31282414,"Precious metal explosive formed components",
+"unspsc",31282415,"Stainless steel explosive formed components",
+"unspsc",31282416,"Steel explosive formed components",
+"unspsc",31282417,"Tin explosive formed components",
+"unspsc",31282418,"Titanium explosive formed components",
+"unspsc",31282419,"Zinc explosive formed components",
+"unspsc",31290000,"Machined extrusions",
+"unspsc",31291100,"Machined hydro static extrusions",
+"unspsc",31291101,"Aluminum machined hydro static extrusions",
+"unspsc",31291102,"Beryllium machined hydro static extrusions",
+"unspsc",31291103,"Brass machined hydro static extrusions",
+"unspsc",31291104,"Bronze machined hydro static extrusions",
+"unspsc",31291105,"Copper machined hydro static extrusions",
+"unspsc",31291106,"Ferrous alloy machined hydro static extrusions",
+"unspsc",31291107,"Lead machined hydro static extrusions",
+"unspsc",31291108,"Magnesium machined hydro static extrusions",
+"unspsc",31291109,"Non ferrous alloy machined hydro static extrusions",
+"unspsc",31291110,"Plastic machined hydro static extrusions",
+"unspsc",31291111,"Precious metal machined hydro static extrusions",
+"unspsc",31291112,"Rubber machined hydro static extrusions",
+"unspsc",31291113,"Stainless steel machined hydro static extrusions",
+"unspsc",31291114,"Steel machined hydro static extrusions",
+"unspsc",31291115,"Tin machined hydro static extrusions",
+"unspsc",31291116,"Titanium machined hydro static extrusions",
+"unspsc",31291117,"Zinc machined hydro static extrusions",
+"unspsc",31291118,"Composite machined hydro static extrusions",
+"unspsc",31291119,"Nickel alloy machined hydro static extrusions",
+"unspsc",31291120,"Non metallic machined hydro static extrusions",
+"unspsc",31291200,"Machined impact extrusions",
+"unspsc",31291201,"Aluminum machined impact extrusions",
+"unspsc",31291202,"Beryllium machined impact extrusions",
+"unspsc",31291203,"Brass machined impact extrusions",
+"unspsc",31291204,"Bronze machined impact extrusions",
+"unspsc",31291205,"Copper machined impact extrusions",
+"unspsc",31291206,"Ferrous alloy machined impact extrusions",
+"unspsc",31291207,"Lead machined impact extrusions",
+"unspsc",31291208,"Magnesium machined impact extrusions",
+"unspsc",31291209,"Non ferrous alloy machined impact extrusions",
+"unspsc",31291210,"Plastic machined impact extrusions",
+"unspsc",31291211,"Precious metal machined impact extrusions",
+"unspsc",31291212,"Rubber machined impact extrusions",
+"unspsc",31291213,"Stainless steel machined impact extrusions",
+"unspsc",31291214,"Steel machined impact extrusions",
+"unspsc",31291215,"Tin machined impact extrusions",
+"unspsc",31291216,"Titanium machined impact extrusions",
+"unspsc",31291217,"Zinc machined impact extrusions",
+"unspsc",31291218,"Composite machined impact extrusions",
+"unspsc",31291219,"Nickel alloy machined impact extrusions",
+"unspsc",31291220,"Non metallic machined impact extrusions",
+"unspsc",31291300,"Machined cold extrusions",
+"unspsc",31291301,"Aluminum machined cold extrusions",
+"unspsc",31291302,"Beryllium machined cold extrusions",
+"unspsc",31291303,"Brass machined cold extrusions",
+"unspsc",31291304,"Bronze machined cold extrusions",
+"unspsc",31291305,"Copper machined cold extrusions",
+"unspsc",31291306,"Ferrous alloy machined cold extrusions",
+"unspsc",31291307,"Lead machined cold extrusions",
+"unspsc",31291308,"Magnesium machined cold extrusions",
+"unspsc",31291309,"Non ferrous alloy machined cold extrusions",
+"unspsc",31291310,"Plastic machined cold extrusions",
+"unspsc",31291311,"Precious metal machined cold extrusions",
+"unspsc",31291312,"Rubber machined cold extrusions",
+"unspsc",31291313,"Stainless steel machined cold extrusions",
+"unspsc",31291314,"Steel machined cold extrusions",
+"unspsc",31291315,"Tin machined cold extrusions",
+"unspsc",31291316,"Titanium machined cold extrusions",
+"unspsc",31291317,"Zinc machined cold extrusions",
+"unspsc",31291318,"Composite machined cold extrusions",
+"unspsc",31291319,"Nickel alloy machined cold extrusions",
+"unspsc",31291320,"Non metallic machined cold extrusions",
+"unspsc",31291400,"Machined hot extrusions",
+"unspsc",31291401,"Aluminum machined hot extrusions",
+"unspsc",31291402,"Beryllium machined hot extrusions",
+"unspsc",31291403,"Brass machined hot extrusions",
+"unspsc",31291404,"Bronze machined hot extrusions",
+"unspsc",31291405,"Copper machined hot extrusions",
+"unspsc",31291406,"Ferrous alloy machined hot extrusions",
+"unspsc",31291407,"Lead machined hot extrusions",
+"unspsc",31291408,"Magnesium machined hot extrusions",
+"unspsc",31291409,"Non ferrous alloy machined hot extrusions",
+"unspsc",31291410,"Plastic machined hot extrusions",
+"unspsc",31291411,"Precious metal machined hot extrusions",
+"unspsc",31291412,"Rubber machined hot extrusions",
+"unspsc",31291413,"Stainless steel machined hot extrusions",
+"unspsc",31291414,"Steel machined hot extrusions",
+"unspsc",31291415,"Tin machined hot extrusions",
+"unspsc",31291416,"Titanium machined hot extrusions",
+"unspsc",31291417,"Zinc machined hot extrusions",
+"unspsc",31291418,"Composite machined hot extrusions",
+"unspsc",31291419,"Nickel alloy machined hot extrusions",
+"unspsc",31291420,"Non   metallic machined hot extrusions",
+"unspsc",31300000,"Machined forgings",
+"unspsc",31301100,"Machined open die forgings",
+"unspsc",31301101,"Non ferrous alloy open die machined forgings",
+"unspsc",31301102,"Ferrous alloy open die machined forgings",
+"unspsc",31301103,"Steel open die machined forgings",
+"unspsc",31301104,"Stainless steel open die machined forgings",
+"unspsc",31301105,"Iron open die machined forgings",
+"unspsc",31301106,"Aluminum open die machined forgings",
+"unspsc",31301107,"Magnesium open die machined forgings",
+"unspsc",31301108,"Titanium open die machined forgings",
+"unspsc",31301109,"Beryllium open die machined forgings",
+"unspsc",31301110,"Copper open die machined forgings",
+"unspsc",31301111,"Brass open die machined forgings",
+"unspsc",31301112,"Bronze open die machined forgings",
+"unspsc",31301113,"Zinc open die machined forgings",
+"unspsc",31301114,"Tin open die machined forgings",
+"unspsc",31301115,"Lead open die machined forgings",
+"unspsc",31301116,"Precious metal open die machined forgings",
+"unspsc",31301117,"Composite open die machined forgings",
+"unspsc",31301118,"Nickel alloy open die machined forgings",
+"unspsc",31301119,"Non metallic open die machined forgings",
+"unspsc",31301200,"Machined closed die forgings",
+"unspsc",31301201,"Non ferrous alloy closed die machined forgings",
+"unspsc",31301202,"Ferrous alloy closed die machined forgings",
+"unspsc",31301203,"Steel closed die machined forgings",
+"unspsc",31301204,"Stainless steel closed die machined forgings",
+"unspsc",31301205,"Iron closed die machined forgings",
+"unspsc",31301206,"Aluminum closed die machined forgings",
+"unspsc",31301207,"Magnesium closed die machined forgings",
+"unspsc",31301208,"Titanium closed die machined forgings",
+"unspsc",31301209,"Beryllium closed die machined forgings",
+"unspsc",31301210,"Copper closed die machined forgings",
+"unspsc",31301211,"Brass closed die machined forgings",
+"unspsc",31301212,"Bronze closed die machined forgings",
+"unspsc",31301213,"Zinc closed die machined forgings",
+"unspsc",31301214,"Tin closed die machined forgings",
+"unspsc",31301215,"Lead closed die machined forgings",
+"unspsc",31301216,"Precious metal closed die machined forgings",
+"unspsc",31301217,"Composite closed die machined forgings",
+"unspsc",31301218,"Nickel alloy closed die machined forgings",
+"unspsc",31301219,"Non metallic closed die machined forgings",
+"unspsc",31301300,"Machined impression die forgings",
+"unspsc",31301301,"Non ferrous alloy impression die machined forgings",
+"unspsc",31301302,"Ferrous alloy impression die machined forgings",
+"unspsc",31301303,"Steel impression die machined forgings",
+"unspsc",31301304,"Stainless steel impression die machined forgings",
+"unspsc",31301305,"Iron impression die machined forgings",
+"unspsc",31301306,"Aluminum impression die machined forgings",
+"unspsc",31301307,"Magnesium impression die machined forgings",
+"unspsc",31301308,"Titanium impression die machined forgings",
+"unspsc",31301309,"Beryllium impression die machined forgings",
+"unspsc",31301310,"Copper impression die machined forgings",
+"unspsc",31301311,"Brass impression die machined forgings",
+"unspsc",31301312,"Bronze impression die machined forgings",
+"unspsc",31301313,"Zinc impression die machined forgings",
+"unspsc",31301314,"Tin impression die machined forgings",
+"unspsc",31301315,"Lead impression die machined forgings",
+"unspsc",31301316,"Precious metal impression die machined forgings",
+"unspsc",31301317,"Composite impression die machined forgings",
+"unspsc",31301318,"Nickel alloy impression die machined forgings",
+"unspsc",31301319,"Non metallic impression die machined forgings",
+"unspsc",31301400,"Machined drop forgings",
+"unspsc",31301401,"Non ferrous alloy drop machined forgings",
+"unspsc",31301402,"Zinc drop machined forgings",
+"unspsc",31301403,"Ferrous alloy drop machined forgings",
+"unspsc",31301404,"Tin drop machined forgings",
+"unspsc",31301405,"Lead drop machined forgings",
+"unspsc",31301406,"Steel drop machined forgings",
+"unspsc",31301407,"Precious metal drop machined forgings",
+"unspsc",31301408,"Stainless steel drop machined forgings",
+"unspsc",31301409,"Iron drop machined forgings",
+"unspsc",31301410,"Aluminum drop machined forgings",
+"unspsc",31301411,"Magnesium drop machined forgings",
+"unspsc",31301412,"Titanium drop machined forgings",
+"unspsc",31301413,"Beryllium drop machined forgings",
+"unspsc",31301414,"Copper drop machined forgings",
+"unspsc",31301415,"Brass drop machined forgings",
+"unspsc",31301416,"Bronze drop machined forgings",
+"unspsc",31301417,"Composite drop machined forgings",
+"unspsc",31301418,"Nickel alloy drop machined forgings",
+"unspsc",31301419,"Non metallic drop machined forgings",
+"unspsc",31301500,"Machined rolled ring forgings",
+"unspsc",31301501,"Aluminum rolled ring machined forgings",
+"unspsc",31301502,"Beryllium rolled ring machined forgings",
+"unspsc",31301503,"Brass rolled ring machined forgings",
+"unspsc",31301504,"Bronze rolled ring machined forgings",
+"unspsc",31301505,"Copper rolled ring machined forgings",
+"unspsc",31301506,"Iron rolled ring machined forgings",
+"unspsc",31301507,"Lead rolled ring machined forgings",
+"unspsc",31301508,"Magnesium rolled ring machined forgings",
+"unspsc",31301509,"Precious metal rolled ring machined forgings",
+"unspsc",31301510,"Stainless steel rolled ring machined forgings",
+"unspsc",31301511,"Tin rolled ring machined forgings",
+"unspsc",31301512,"Titanium rolled ring machined forgings",
+"unspsc",31301513,"Zinc rolled ring machined forgings",
+"unspsc",31301514,"Non ferrous alloy rolled ring machined forgings",
+"unspsc",31301515,"Ferrous alloy rolled ring machined forgings",
+"unspsc",31301516,"Steel rolled ring machined forgings",
+"unspsc",31301517,"Composite rolled ring machined forgings",
+"unspsc",31301518,"Nickel alloy rolled ring machined forgings",
+"unspsc",31301519,"Non metallic rolled ring machined forgings",
+"unspsc",31310000,"Fabricated pipe assemblies",
+"unspsc",31311100,"Solvent welded pipe assemblies",
+"unspsc",31311101,"Aluminum solvent welded pipe assemblies",
+"unspsc",31311102,"Carbon steel solvent welded pipe assemblies",
+"unspsc",31311103,"Hastalloy X solvent welded pipe assemblies",
+"unspsc",31311104,"Inconel solvent welded pipe assemblies",
+"unspsc",31311105,"Low alloy steel solvent welded pipe assemblies",
+"unspsc",31311106,"Non metallic solvent welded pipe assemblies",
+"unspsc",31311109,"Stainless steel solvent welded pipe assemblies",
+"unspsc",31311110,"Titanium solvent welded pipe assemblies",
+"unspsc",31311111,"Waspalloy solvent welded pipe assemblies",
+"unspsc",31311112,"Copper solvent welded pipe assemblies",
+"unspsc",31311113,"Brass solvent welded pipe assemblies",
+"unspsc",31311200,"Riveted pipe assemblies",
+"unspsc",31311201,"Aluminum riveted pipe assemblies",
+"unspsc",31311202,"Carbon steel riveted pipe assemblies",
+"unspsc",31311203,"Hastalloy X riveted pipe assemblies",
+"unspsc",31311204,"Inconel riveted pipe assemblies",
+"unspsc",31311205,"Low alloy steel riveted pipe assemblies",
+"unspsc",31311206,"Non metallic riveted pipe assemblies",
+"unspsc",31311209,"Stainless steel riveted pipe assemblies",
+"unspsc",31311210,"Titanium riveted pipe assemblies",
+"unspsc",31311211,"Waspalloy riveted pipe assemblies",
+"unspsc",31311212,"Copper riveted pipe assemblies",
+"unspsc",31311213,"Brass riveted pipe assemblies",
+"unspsc",31311300,"Bolted pipe assemblies",
+"unspsc",31311301,"Aluminum bolted pipe assemblies",
+"unspsc",31311302,"Carbon steel bolted pipe assemblies",
+"unspsc",31311303,"Hastalloy X bolted pipe assemblies",
+"unspsc",31311304,"Inconel bolted pipe assemblies",
+"unspsc",31311305,"Low alloy steel bolted pipe assemblies",
+"unspsc",31311306,"Non metallic bolted pipe assemblies",
+"unspsc",31311309,"Stainless steel bolted pipe assemblies",
+"unspsc",31311310,"Titanium bolted pipe assemblies",
+"unspsc",31311311,"Waspalloy bolted pipe assemblies",
+"unspsc",31311312,"Copper bolted pipe assemblies",
+"unspsc",31311313,"Brass bolted pipe assemblies",
+"unspsc",31311400,"Ultra violet welded UV pipe assemblies",
+"unspsc",31311401,"Aluminum ultra violet welded pipe assemblies",
+"unspsc",31311402,"Carbon steel ultra violet welded pipe assemblies",
+"unspsc",31311403,"Hastalloy X ultra violet welded pipe assemblies",
+"unspsc",31311404,"Inconel ultra violet welded pipe assemblies",
+"unspsc",31311405,"Low alloy steel ultra violet welded pipe assemblies",
+"unspsc",31311406,"Non metallic ultra violet welded pipe assemblies",
+"unspsc",31311409,"Stainless steel ultra violet welded pipe assemblies",
+"unspsc",31311410,"Titanium ultra violet welded pipe assemblies",
+"unspsc",31311411,"Waspalloy ultra violet welded pipe assemblies",
+"unspsc",31311412,"Copper ultra violet welded pipe assemblies",
+"unspsc",31311413,"Brass ultra violet welded pipe assemblies",
+"unspsc",31311500,"Welded or brazed pipe assemblies",
+"unspsc",31311501,"Aluminum welded or brazed pipe assemblies",
+"unspsc",31311502,"Carbon steel welded or brazed pipe assemblies",
+"unspsc",31311503,"Hastalloy X welded or brazed pipe assemblies",
+"unspsc",31311504,"Inconel welded or brazed pipe assemblies",
+"unspsc",31311505,"Low alloy steel welded or brazed pipe assemblies",
+"unspsc",31311506,"Non metallic welded or brazed pipe assemblies",
+"unspsc",31311509,"Stainless steel welded or brazed pipe assemblies",
+"unspsc",31311510,"Titanium welded or brazed pipe assemblies",
+"unspsc",31311511,"Waspalloy welded or brazed pipe assemblies",
+"unspsc",31311512,"Copper welded or brazed pipe assemblies",
+"unspsc",31311513,"Brass welded or brazed pipe assemblies",
+"unspsc",31311600,"Sonic welded pipe assemblies",
+"unspsc",31311601,"Aluminum sonic welded pipe assemblies",
+"unspsc",31311602,"Carbon steel sonic welded pipe assemblies",
+"unspsc",31311603,"Hastalloy X sonic welded pipe assemblies",
+"unspsc",31311604,"Inconel sonic welded pipe assemblies",
+"unspsc",31311605,"Low alloy steel sonic welded pipe assemblies",
+"unspsc",31311606,"Non metallic sonic welded pipe assemblies",
+"unspsc",31311609,"Stainless steel sonic welded pipe assemblies",
+"unspsc",31311610,"Titanium sonic welded pipe assemblies",
+"unspsc",31311611,"Waspalloy sonic welded pipe assemblies",
+"unspsc",31311612,"Copper sonic welded pipe assemblies",
+"unspsc",31311613,"Brass sonic welded pipe assemblies",
+"unspsc",31311700,"Bonded pipe assemblies",
+"unspsc",31311701,"Aluminum bonded pipe assemblies",
+"unspsc",31311702,"Carbon steel bonded pipe assemblies",
+"unspsc",31311703,"Hastalloy X bonded pipe assemblies",
+"unspsc",31311704,"Inconel bonded pipe assemblies",
+"unspsc",31311705,"Low alloy steel bonded pipe assemblies",
+"unspsc",31311706,"Non metallic bonded pipe assemblies",
+"unspsc",31311709,"Stainless steel bonded pipe assemblies",
+"unspsc",31311710,"Titanium bonded pipe assemblies",
+"unspsc",31311711,"Waspalloy bonded pipe assemblies",
+"unspsc",31311712,"Copper bonded pipe assemblies",
+"unspsc",31311713,"Brass bonded pipe assemblies",
+"unspsc",31320000,"Fabricated bar stock assemblies",
+"unspsc",31321100,"Bonded bar stock assemblies",
+"unspsc",31321101,"Aluminum bonded bar stock assemblies",
+"unspsc",31321102,"Carbon steel bonded bar stock assemblies",
+"unspsc",31321103,"Hastalloy X bonded bar stock assemblies",
+"unspsc",31321104,"Inconel bonded bar stock assemblies",
+"unspsc",31321105,"Low alloy steel bonded bar stock assemblies",
+"unspsc",31321106,"Non metallic bonded bar stock assemblies",
+"unspsc",31321109,"Stainless steel bonded bar stock assemblies",
+"unspsc",31321110,"Titanium bonded bar stock assemblies",
+"unspsc",31321111,"Waspalloy bonded bar stock assemblies",
+"unspsc",31321112,"Copper bonded bar stock assemblies",
+"unspsc",31321113,"Brass bonded bar stock assemblies",
+"unspsc",31321200,"Solvent welded bar stock assemblies",
+"unspsc",31321201,"Aluminum solvent welded bar stock assemblies",
+"unspsc",31321202,"Carbon steel solvent welded bar stock assemblies",
+"unspsc",31321203,"Hastalloy X solvent welded bar stock assemblies",
+"unspsc",31321204,"Inconel solvent welded bar stock assemblies",
+"unspsc",31321205,"Low alloy steel solvent welded bar stock assemblies",
+"unspsc",31321206,"Non metallic solvent welded bar stock assemblies",
+"unspsc",31321209,"Stainless steel solvent welded bar stock assemblies",
+"unspsc",31321210,"Titanium solvent welded bar stock assemblies",
+"unspsc",31321211,"Waspalloy solvent welded bar stock assemblies",
+"unspsc",31321212,"Copper solvent welded bar stock assemblies",
+"unspsc",31321213,"Brass solvent welded bar stock assemblies",
+"unspsc",31321300,"Riveted bar stock assemblies",
+"unspsc",31321301,"Aluminum riveted bar stock assemblies",
+"unspsc",31321302,"Carbon steel riveted bar stock assemblies",
+"unspsc",31321303,"Hastalloy X riveted bar stock assemblies",
+"unspsc",31321304,"Inconel riveted bar stock assemblies",
+"unspsc",31321305,"Low alloy steel riveted bar stock assemblies",
+"unspsc",31321306,"Non metallic riveted bar stock assemblies",
+"unspsc",31321309,"Stainless steel riveted bar stock assemblies",
+"unspsc",31321310,"Titanium riveted bar stock assemblies",
+"unspsc",31321311,"Waspalloy riveted bar stock assemblies",
+"unspsc",31321312,"Copper riveted bar stock assemblies",
+"unspsc",31321313,"Brass riveted bar stock assemblies",
+"unspsc",31321400,"Welded or brazed bar stock assemblies",
+"unspsc",31321401,"Aluminum welded or brazed bar stock assemblies",
+"unspsc",31321402,"Carbon steel welded or brazed bar stock assemblies",
+"unspsc",31321403,"Hastalloy X welded or brazed bar stock assemblies",
+"unspsc",31321404,"Inconel welded or brazed bar stock assemblies",
+"unspsc",31321405,"Low alloy steel welded or brazed bar stock assemblies",
+"unspsc",31321406,"Non metallic welded or brazed bar stock assemblies",
+"unspsc",31321409,"Stainless steel welded or brazed bar stock assemblies",
+"unspsc",31321410,"Titanium welded or brazed bar stock assemblies",
+"unspsc",31321411,"Waspalloy welded or brazed bar stock assemblies",
+"unspsc",31321412,"Copper welded or brazed bar stock assemblies",
+"unspsc",31321413,"Brass welded or brazed bar stock assemblies",
+"unspsc",31321500,"Ultra violet welded UV bar stock assemblies",
+"unspsc",31321501,"Aluminum ultra violet welded bar stock assemblies",
+"unspsc",31321502,"Carbon steel ultra violet welded bar stock assemblies",
+"unspsc",31321503,"Hastalloy X ultra violet welded bar stock assemblies",
+"unspsc",31321504,"Inconel ultra violet welded bar stock assemblies",
+"unspsc",31321505,"Low alloy steel ultra violet welded bar stock assemblies",
+"unspsc",31321506,"Non metallic ultra violet welded bar stock assemblies",
+"unspsc",31321509,"Stainless steel ultra violet welded bar stock assemblies",
+"unspsc",31321510,"Titanium ultra violet welded bar stock assemblies",
+"unspsc",31321511,"Waspalloy ultra violet welded bar stock assemblies",
+"unspsc",31321512,"Copper ultra violet welded bar stock assemblies",
+"unspsc",31321513,"Brass ultra violet welded bar stock assemblies",
+"unspsc",31321600,"Sonic welded bar stock assemblies",
+"unspsc",31321601,"Aluminum sonic welded bar stock assemblies",
+"unspsc",31321602,"Carbon steel sonic welded bar stock assemblies",
+"unspsc",31321603,"Hastalloy X sonic welded bar stock assemblies",
+"unspsc",31321604,"Inconel sonic welded bar stock assemblies",
+"unspsc",31321605,"Low alloy steel sonic welded bar stock assemblies",
+"unspsc",31321606,"Non metallic sonic welded bar stock assemblies",
+"unspsc",31321609,"Stainless steel sonic welded bar stock assemblies",
+"unspsc",31321610,"Titanium sonic welded bar stock assemblies",
+"unspsc",31321611,"Waspalloy sonic welded bar stock assemblies",
+"unspsc",31321612,"Copper sonic welded bar stock assemblies",
+"unspsc",31321613,"Brass sonic welded bar stock assemblies",
+"unspsc",31321700,"Bolted bar stock assemblies",
+"unspsc",31321701,"Aluminum bolted bar stock assemblies",
+"unspsc",31321702,"Carbon steel bolted bar stock assemblies",
+"unspsc",31321703,"Hastalloy X bolted bar stock assemblies",
+"unspsc",31321704,"Inconel bolted bar stock assemblies",
+"unspsc",31321705,"Low alloy steel bolted bar stock assemblies",
+"unspsc",31321706,"Non metallic bolted bar stock assemblies",
+"unspsc",31321709,"Stainless steel bolted bar stock assemblies",
+"unspsc",31321710,"Titanium bolted bar stock assemblies",
+"unspsc",31321711,"Waspalloy bolted bar stock assemblies",
+"unspsc",31321712,"Copper bolted bar stock assemblies",
+"unspsc",31321713,"Brass bolted bar stock assemblies",
+"unspsc",31330000,"Fabricated structural assemblies",
+"unspsc",31331100,"Bonded structural assemblies",
+"unspsc",31331101,"Aluminum bonded structural assemblies",
+"unspsc",31331102,"Carbon steel bonded structural assemblies",
+"unspsc",31331103,"Hastalloy X bonded structural assemblies",
+"unspsc",31331104,"Inconel bonded structural assemblies",
+"unspsc",31331105,"Low alloy steel bonded structural assemblies",
+"unspsc",31331106,"Non metallic bonded structural assemblies",
+"unspsc",31331109,"Stainless steel bonded structural assemblies",
+"unspsc",31331110,"Titanium bonded structural assemblies",
+"unspsc",31331111,"Waspalloy bonded structural assemblies",
+"unspsc",31331112,"Copper bonded structural assemblies",
+"unspsc",31331113,"Brass bonded structural assemblies",
+"unspsc",31331200,"Bolted structural assemblies",
+"unspsc",31331201,"Aluminum bolted structural assemblies",
+"unspsc",31331202,"Carbon steel bolted structural assemblies",
+"unspsc",31331203,"Hastalloy X bolted structural assemblies",
+"unspsc",31331204,"Inconel bolted structural assemblies",
+"unspsc",31331205,"Low alloy steel bolted structural assemblies",
+"unspsc",31331206,"Non metallic bolted structural assemblies",
+"unspsc",31331209,"Stainless steel bolted structural assemblies",
+"unspsc",31331210,"Titanium bolted structural assemblies",
+"unspsc",31331211,"Waspalloy bolted structural assemblies",
+"unspsc",31331212,"Copper bolted structural assemblies",
+"unspsc",31331213,"Brass bolted structural assemblies",
+"unspsc",31331300,"Sonic welded structural assemblies",
+"unspsc",31331301,"Aluminum sonic welded structural assemblies",
+"unspsc",31331302,"Carbon steel sonic welded structural assemblies",
+"unspsc",31331303,"Hastalloy X sonic welded structural assemblies",
+"unspsc",31331304,"Inconel sonic welded structural assemblies",
+"unspsc",31331305,"Low alloy steel sonic welded structural assemblies",
+"unspsc",31331306,"Non metallic sonic welded structural assemblies",
+"unspsc",31331309,"Stainless steel sonic welded structural assemblies",
+"unspsc",31331310,"Titanium sonic welded structural assemblies",
+"unspsc",31331311,"Waspalloy sonic welded structural assemblies",
+"unspsc",31331312,"Copper sonic welded structural assemblies",
+"unspsc",31331313,"Brass sonic welded structural assemblies",
+"unspsc",31331400,"Ultra violet welded UV structural assemblies",
+"unspsc",31331401,"Aluminum ultra violet welded structural assemblies",
+"unspsc",31331402,"Carbon steel ultra violet welded structural assemblies",
+"unspsc",31331403,"Hastalloy X ultra violet welded structural assemblies",
+"unspsc",31331404,"Inconel ultra violet welded structural assemblies",
+"unspsc",31331405,"Low alloy steel ultra violet welded structural assemblies",
+"unspsc",31331406,"Non metallic ultra violet welded structural assemblies",
+"unspsc",31331409,"Stainless steel ultra violet welded structural assemblies",
+"unspsc",31331410,"Titanium ultra violet welded structural assemblies",
+"unspsc",31331411,"Waspalloy ultra violet welded structural assemblies",
+"unspsc",31331412,"Copper ultra violet welded structural assemblies",
+"unspsc",31331413,"Brass ultra violet welded structural assemblies",
+"unspsc",31331500,"Solvent welded structural assemblies",
+"unspsc",31331501,"Aluminum solvent welded structural assemblies",
+"unspsc",31331502,"Carbon steel solvent welded structural assemblies",
+"unspsc",31331503,"Hastalloy X solvent welded structural assemblies",
+"unspsc",31331504,"Inconel solvent welded structural assemblies",
+"unspsc",31331505,"Low alloy steel solvent welded structural assemblies",
+"unspsc",31331506,"Non metallic solvent welded structural assemblies",
+"unspsc",31331509,"Stainless steel solvent welded structural assemblies",
+"unspsc",31331510,"Titanium solvent welded structural assemblies",
+"unspsc",31331511,"Waspalloy solvent welded structural assemblies",
+"unspsc",31331512,"Copper solvent welded structural assemblies",
+"unspsc",31331513,"Brass solvent welded structural assemblies",
+"unspsc",31331600,"Welded or brazed structural assemblies",
+"unspsc",31331601,"Aluminum welded or brazed structural assemblies",
+"unspsc",31331602,"Carbon steel welded or brazed structural assemblies",
+"unspsc",31331603,"Hastalloy X welded or brazed structural assemblies",
+"unspsc",31331604,"Inconel welded or brazed structural assemblies",
+"unspsc",31331605,"Low alloy steel welded or brazed structural assemblies",
+"unspsc",31331606,"Non metallic welded or brazed structural assemblies",
+"unspsc",31331609,"Stainless steel welded or brazed structural assemblies",
+"unspsc",31331610,"Titanium welded or brazed structural assemblies",
+"unspsc",31331611,"Waspalloy welded or brazed structural assemblies",
+"unspsc",31331612,"Copper welded or brazed structural assemblies",
+"unspsc",31331613,"Brass welded or brazed structural assemblies",
+"unspsc",31331700,"Riveted structural assemblies",
+"unspsc",31331701,"Aluminum riveted structural assemblies",
+"unspsc",31331702,"Carbon steel riveted structural assemblies",
+"unspsc",31331703,"Hastalloy X riveted structural assemblies",
+"unspsc",31331704,"Inconel riveted structural assemblies",
+"unspsc",31331705,"Low alloy steel riveted structural assemblies",
+"unspsc",31331706,"Non metallic riveted structural assemblies",
+"unspsc",31331709,"Stainless steel riveted structural assemblies",
+"unspsc",31331710,"Titanium riveted structural assemblies",
+"unspsc",31331711,"Waspalloy riveted structural assemblies",
+"unspsc",31331712,"Copper riveted structural assemblies",
+"unspsc",31331713,"Brass riveted structural assemblies",
+"unspsc",31340000,"Fabricated sheet assemblies",
+"unspsc",31341100,"Welded or brazed sheet assemblies",
+"unspsc",31341101,"Aluminum welded or brazed sheet assemblies",
+"unspsc",31341102,"Carbon steel welded or brazed sheet assemblies",
+"unspsc",31341103,"Hastalloy X welded or brazed sheet assemblies",
+"unspsc",31341104,"Inconel welded or brazed sheet assemblies",
+"unspsc",31341105,"Low alloy steel welded or brazed sheet assemblies",
+"unspsc",31341106,"Non metallic welded or brazed sheet assemblies",
+"unspsc",31341109,"Stainless steel welded or brazed sheet assemblies",
+"unspsc",31341110,"Titanium welded or brazed sheet assemblies",
+"unspsc",31341111,"Waspalloy welded or brazed sheet assemblies",
+"unspsc",31341112,"Copper welded or brazed sheet assemblies",
+"unspsc",31341113,"Brass welded or brazed sheet assemblies",
+"unspsc",31341200,"Riveted sheet assemblies",
+"unspsc",31341201,"Aluminum riveted sheet assemblies",
+"unspsc",31341202,"Carbon steel riveted sheet assemblies",
+"unspsc",31341203,"Hastalloy X riveted sheet assemblies",
+"unspsc",31341204,"Inconel riveted sheet assemblies",
+"unspsc",31341205,"Low alloy steel riveted sheet assemblies",
+"unspsc",31341206,"Non metallic riveted sheet assemblies",
+"unspsc",31341209,"Stainless steel riveted sheet assemblies",
+"unspsc",31341210,"Titanium riveted sheet assemblies",
+"unspsc",31341211,"Waspalloy riveted sheet assemblies",
+"unspsc",31341212,"Copper riveted sheet assemblies",
+"unspsc",31341213,"Brass riveted sheet assemblies",
+"unspsc",31341300,"Ultra violet welded UV sheet assemblies",
+"unspsc",31341301,"Aluminum ultra violet welded sheet assemblies",
+"unspsc",31341302,"Carbon steel ultra violet welded sheet assemblies",
+"unspsc",31341303,"Hastalloy X ultra violet welded sheet assemblies",
+"unspsc",31341304,"Inconel ultra violet welded sheet assemblies",
+"unspsc",31341305,"Low alloy steel ultra violet welded sheet assemblies",
+"unspsc",31341306,"Non metallic ultra violet welded sheet assemblies",
+"unspsc",31341309,"Stainless steel ultra violet welded sheet assemblies",
+"unspsc",31341310,"Titanium ultra violet welded sheet assemblies",
+"unspsc",31341311,"Waspalloy ultra violet welded sheet assemblies",
+"unspsc",31341312,"Copper ultra violet welded sheet assemblies",
+"unspsc",31341313,"Brass ultra violet welded sheet assemblies",
+"unspsc",31341400,"Sonic welded sheet assemblies",
+"unspsc",31341401,"Aluminum sonic welded sheet assemblies",
+"unspsc",31341402,"Carbon steel sonic welded sheet assemblies",
+"unspsc",31341403,"Hastalloy X sonic welded sheet assemblies",
+"unspsc",31341404,"Inconel sonic welded sheet assemblies",
+"unspsc",31341405,"Low alloy steel sonic welded sheet assemblies",
+"unspsc",31341406,"Non metallic sonic welded sheet assemblies",
+"unspsc",31341409,"Stainless steel sonic welded sheet assemblies",
+"unspsc",31341410,"Titanium sonic welded sheet assemblies",
+"unspsc",31341411,"Waspalloy sonic welded sheet assemblies",
+"unspsc",31341412,"Copper sonic welded sheet assemblies",
+"unspsc",31341413,"Brass sonic welded sheet assemblies",
+"unspsc",31341500,"Solvent welded sheet assemblies",
+"unspsc",31341501,"Aluminum solvent welded sheet assemblies",
+"unspsc",31341502,"Carbon steel solvent welded sheet assemblies",
+"unspsc",31341503,"Hastalloy X solvent welded sheet assemblies",
+"unspsc",31341504,"Inconel solvent welded sheet assemblies",
+"unspsc",31341505,"Low alloy steel solvent welded sheet assemblies",
+"unspsc",31341506,"Non metallic solvent welded sheet assemblies",
+"unspsc",31341509,"Stainless steel solvent welded sheet assemblies",
+"unspsc",31341510,"Titanium solvent welded sheet assemblies",
+"unspsc",31341511,"Waspalloy solvent welded sheet assemblies",
+"unspsc",31341512,"Copper solvent welded sheet assemblies",
+"unspsc",31341513,"Brass solvent welded sheet assemblies",
+"unspsc",31341600,"Bonded sheet assemblies",
+"unspsc",31341601,"Aluminum bonded sheet assemblies",
+"unspsc",31341602,"Carbon steel bonded sheet assemblies",
+"unspsc",31341603,"Hastalloy X bonded sheet assemblies",
+"unspsc",31341604,"Inconel bonded sheet assemblies",
+"unspsc",31341605,"Low alloy steel bonded sheet assemblies",
+"unspsc",31341606,"Non metallic bonded sheet assemblies",
+"unspsc",31341609,"Stainless steel bonded sheet assemblies",
+"unspsc",31341610,"Titanium bonded sheet assemblies",
+"unspsc",31341611,"Waspalloy bonded sheet assemblies",
+"unspsc",31341612,"Copper bonded sheet assemblies",
+"unspsc",31341613,"Brass bonded sheet assemblies",
+"unspsc",31341700,"Bolted sheet assemblies",
+"unspsc",31341701,"Aluminum bolted sheet assemblies",
+"unspsc",31341702,"Carbon steel bolted sheet assemblies",
+"unspsc",31341703,"Hastalloy X bolted sheet assemblies",
+"unspsc",31341704,"Inconel bolted sheet assemblies",
+"unspsc",31341705,"Low alloy steel bolted sheet assemblies",
+"unspsc",31341706,"Non metallic bolted sheet assemblies",
+"unspsc",31341709,"Stainless steel bolted sheet assemblies",
+"unspsc",31341710,"Titanium bolted sheet assemblies",
+"unspsc",31341711,"Waspalloy bolted sheet assemblies",
+"unspsc",31341712,"Copper bolted sheet assemblies",
+"unspsc",31341713,"Brass bolted sheet assemblies",
+"unspsc",31350000,"Fabricated tube assemblies",
+"unspsc",31351100,"Ultra violet welded UV tube assemblies",
+"unspsc",31351101,"Aluminum ultra violet welded tube assemblies",
+"unspsc",31351102,"Carbon steel ultra violet welded tube assemblies",
+"unspsc",31351103,"Hastalloy X ultra violet welded tube assemblies",
+"unspsc",31351104,"Inconel ultra violet welded tube assemblies",
+"unspsc",31351105,"Low alloy steel ultra violet welded tube assemblies",
+"unspsc",31351106,"Non metallic ultra violet welded tube assemblies",
+"unspsc",31351109,"Stainless steel ultra violet welded tube assemblies",
+"unspsc",31351110,"Titanium ultra violet welded tube assemblies",
+"unspsc",31351111,"Waspalloy ultra violet welded tube assemblies",
+"unspsc",31351112,"Copper ultra violet welded tube assemblies",
+"unspsc",31351113,"Brass ultra violet welded tube assemblies",
+"unspsc",31351200,"Welded or brazed tube assemblies",
+"unspsc",31351201,"Aluminum welded or brazed tube assemblies",
+"unspsc",31351202,"Carbon steel welded or brazed tube assemblies",
+"unspsc",31351203,"Hastalloy X welded or brazed tube assemblies",
+"unspsc",31351204,"Inconel welded or brazed tube assemblies",
+"unspsc",31351205,"Low alloy steel welded or brazed tube assemblies",
+"unspsc",31351206,"Non metallic welded or brazed tube assemblies",
+"unspsc",31351209,"Stainless steel welded or brazed tube assemblies",
+"unspsc",31351210,"Titanium welded or brazed tube assemblies",
+"unspsc",31351211,"Waspalloy welded or brazed tube assemblies",
+"unspsc",31351212,"Copper welded or brazed tube assemblies",
+"unspsc",31351213,"Brass welded or brazed tube assemblies",
+"unspsc",31351300,"Riveted tube assemblies",
+"unspsc",31351301,"Aluminum riveted tube assemblies",
+"unspsc",31351302,"Carbon steel riveted tube assemblies",
+"unspsc",31351303,"Hastalloy X riveted tube assemblies",
+"unspsc",31351304,"Inconel riveted tube assemblies",
+"unspsc",31351305,"Low alloy steel riveted tube assemblies",
+"unspsc",31351306,"Non metallic riveted tube assemblies",
+"unspsc",31351309,"Stainless steel riveted tube assemblies",
+"unspsc",31351310,"Titanium riveted tube assemblies",
+"unspsc",31351311,"Waspalloy riveted tube assemblies",
+"unspsc",31351312,"Copper riveted tube assemblies",
+"unspsc",31351313,"Brass riveted tube assemblies",
+"unspsc",31351400,"Bonded tube assemblies",
+"unspsc",31351401,"Aluminum bonded tube assemblies",
+"unspsc",31351402,"Carbon steel bonded tube assemblies",
+"unspsc",31351403,"Hastalloy X bonded tube assemblies",
+"unspsc",31351404,"Inconel bonded tube assemblies",
+"unspsc",31351405,"Low alloy steel bonded tube assemblies",
+"unspsc",31351406,"Non metallic bonded tube assemblies",
+"unspsc",31351409,"Stainless steel bonded tube assemblies",
+"unspsc",31351410,"Titanium bonded tube assemblies",
+"unspsc",31351411,"Waspalloy bonded tube assemblies",
+"unspsc",31351412,"Copper bonded tube assemblies",
+"unspsc",31351413,"Brass bonded tube assemblies",
+"unspsc",31351500,"Bolted tube assemblies",
+"unspsc",31351501,"Aluminum bolted tube assemblies",
+"unspsc",31351502,"Carbon steel bolted tube assemblies",
+"unspsc",31351503,"Hastalloy X bolted tube assemblies",
+"unspsc",31351504,"Inconel bolted tube assemblies",
+"unspsc",31351505,"Low alloy steel bolted tube assemblies",
+"unspsc",31351506,"Non metallic bolted tube assemblies",
+"unspsc",31351509,"Stainless steel bolted tube assemblies",
+"unspsc",31351510,"Titanium bolted tube assemblies",
+"unspsc",31351511,"Waspalloy bolted tube assemblies",
+"unspsc",31351512,"Copper bolted tube assemblies",
+"unspsc",31351513,"Brass bolted tube assemblies",
+"unspsc",31351600,"Solvent welded tube assemblies",
+"unspsc",31351601,"Aluminum solvent welded tube assemblies",
+"unspsc",31351602,"Carbon steel solvent welded tube assemblies",
+"unspsc",31351603,"Hastalloy X solvent welded tube assemblies",
+"unspsc",31351604,"Inconel solvent welded tube assemblies",
+"unspsc",31351605,"Low alloy steel solvent welded tube assemblies",
+"unspsc",31351606,"Non metallic solvent welded tube assemblies",
+"unspsc",31351609,"Stainless steel solvent welded tube assemblies",
+"unspsc",31351610,"Titanium solvent welded tube assemblies",
+"unspsc",31351611,"Waspalloy solvent welded tube assemblies",
+"unspsc",31351612,"Copper solvent welded tube assemblies",
+"unspsc",31351613,"Brass solvent welded tube assemblies",
+"unspsc",31351700,"Sonic welded tube assemblies",
+"unspsc",31351701,"Aluminum sonic welded tube assemblies",
+"unspsc",31351702,"Carbon steel sonic welded tube assemblies",
+"unspsc",31351703,"Hastalloy X sonic welded tube assemblies",
+"unspsc",31351704,"Inconel sonic welded tube assemblies",
+"unspsc",31351705,"Low alloy steel sonic welded tube assemblies",
+"unspsc",31351706,"Non metallic sonic welded tube assemblies",
+"unspsc",31351709,"Stainless steel sonic welded tube assemblies",
+"unspsc",31351710,"Titanium sonic welded tube assemblies",
+"unspsc",31351711,"Waspalloy sonic welded tube assemblies",
+"unspsc",31351712,"Copper sonic welded tube assemblies",
+"unspsc",31351713,"Brass sonic welded tube assemblies",
+"unspsc",31360000,"Fabricated plate assemblies",
+"unspsc",31361100,"Bonded plate assemblies",
+"unspsc",31361101,"Aluminum bonded plate assemblies",
+"unspsc",31361102,"Carbon steel bonded plate assemblies",
+"unspsc",31361103,"Hastalloy X bonded plate assemblies",
+"unspsc",31361104,"Inconel bonded plate assemblies",
+"unspsc",31361105,"Low alloy steel bonded plate assemblies",
+"unspsc",31361106,"Non metallic bonded plate assemblies",
+"unspsc",31361109,"Stainless steel bonded plate assemblies",
+"unspsc",31361110,"Titanium bonded plate assemblies",
+"unspsc",31361111,"Waspalloy bonded plate assemblies",
+"unspsc",31361112,"Copper bonded plate assemblies",
+"unspsc",31361113,"Brass bonded plate assemblies",
+"unspsc",31361200,"Bolted plate assemblies",
+"unspsc",31361201,"Aluminum bolted plate assemblies",
+"unspsc",31361202,"Carbon steel bolted plate assemblies",
+"unspsc",31361203,"Hastalloy X bolted plate assemblies",
+"unspsc",31361204,"Inconel bolted plate assemblies",
+"unspsc",31361205,"Low alloy steel bolted plate assemblies",
+"unspsc",31361206,"Non metallic bolted plate assemblies",
+"unspsc",31361209,"Stainless steel bolted plate assemblies",
+"unspsc",31361210,"Titanium bolted plate assemblies",
+"unspsc",31361211,"Waspalloy bolted plate assemblies",
+"unspsc",31361212,"Copper bolted plate assemblies",
+"unspsc",31361213,"Brass bolted plate assemblies",
+"unspsc",31361300,"Solvent welded plate assemblies",
+"unspsc",31361301,"Aluminum solvent welded plate assemblies",
+"unspsc",31361302,"Carbon steel solvent welded plate assemblies",
+"unspsc",31361303,"Hastalloy X solvent welded plate assemblies",
+"unspsc",31361304,"Inconel solvent welded plate assemblies",
+"unspsc",31361305,"Low alloy steel solvent welded plate assemblies",
+"unspsc",31361306,"Non metallic solvent welded plate assemblies",
+"unspsc",31361309,"Stainless steel solvent welded plate assemblies",
+"unspsc",31361310,"Titanium solvent welded plate assemblies",
+"unspsc",31361311,"Waspalloy solvent welded plate assemblies",
+"unspsc",31361312,"Copper solvent welded plate assemblies",
+"unspsc",31361313,"Brass solvent welded plate assemblies",
+"unspsc",31361400,"Welded or brazed plate assemblies",
+"unspsc",31361401,"Aluminum welded or brazed plate assemblies",
+"unspsc",31361402,"Carbon steel welded or brazed plate assemblies",
+"unspsc",31361403,"Hastalloy X welded or brazed plate assemblies",
+"unspsc",31361404,"Inconel welded or brazed plate assemblies",
+"unspsc",31361405,"Low alloy steel welded or brazed plate assemblies",
+"unspsc",31361406,"Non metallic welded or brazed plate assemblies",
+"unspsc",31361409,"Stainless steel welded or brazed plate assemblies",
+"unspsc",31361410,"Titanium welded or brazed plate assemblies",
+"unspsc",31361411,"Waspalloy welded or brazed plate assemblies",
+"unspsc",31361412,"Copper welded or brazed plate assemblies",
+"unspsc",31361413,"Brass welded or brazed plate assemblies",
+"unspsc",31361500,"Ultra violet welded UV plate assemblies",
+"unspsc",31361501,"Aluminum ultra violet welded plate assemblies",
+"unspsc",31361502,"Carbon steel ultra violet welded plate assemblies",
+"unspsc",31361503,"Hastalloy X ultra violet welded plate assemblies",
+"unspsc",31361504,"Inconel ultra violet welded plate assemblies",
+"unspsc",31361505,"Low alloy steel ultra violet welded plate assemblies",
+"unspsc",31361506,"Non metallic ultra violet welded plate assemblies",
+"unspsc",31361509,"Stainless steel ultra violet welded plate assemblies",
+"unspsc",31361510,"Titanium ultra violet welded plate assemblies",
+"unspsc",31361511,"Waspalloy ultra violet welded plate assemblies",
+"unspsc",31361512,"Copper ultra violet welded plate assemblies",
+"unspsc",31361513,"Brass ultra violet welded plate assemblies",
+"unspsc",31361600,"Sonic welded plate assemblies",
+"unspsc",31361601,"Aluminum sonic welded plate assemblies",
+"unspsc",31361602,"Carbon steel sonic welded plate assemblies",
+"unspsc",31361603,"Hastalloy X sonic welded plate assemblies",
+"unspsc",31361604,"Inconel sonic welded plate assemblies",
+"unspsc",31361605,"Low alloy steel sonic welded plate assemblies",
+"unspsc",31361606,"Non metallic sonic welded plate assemblies",
+"unspsc",31361609,"Stainless steel sonic welded plate assemblies",
+"unspsc",31361610,"Titanium sonic welded plate assemblies",
+"unspsc",31361611,"Waspalloy sonic welded plate assemblies",
+"unspsc",31361612,"Copper sonic welded plate assemblies",
+"unspsc",31361613,"Brass sonic welded plate assemblies",
+"unspsc",31361700,"Riveted plate assemblies",
+"unspsc",31361701,"Aluminum riveted plate assemblies",
+"unspsc",31361702,"Carbon steel riveted plate assemblies",
+"unspsc",31361703,"Hastalloy X riveted plate assemblies",
+"unspsc",31361704,"Inconel riveted plate assemblies",
+"unspsc",31361705,"Low alloy steel riveted plate assemblies",
+"unspsc",31361706,"Non metallic riveted plate assemblies",
+"unspsc",31361709,"Stainless steel riveted plate assemblies",
+"unspsc",31361710,"Titanium riveted plate assemblies",
+"unspsc",31361711,"Waspalloy riveted plate assemblies",
+"unspsc",31361712,"Copper riveted plate assemblies",
+"unspsc",31361713,"Brass riveted plate assemblies",
+"unspsc",31370000,"Refractories",
+"unspsc",31371000,"Ceramic fibre products",
+"unspsc",31371001,"Insulation boards",
+"unspsc",31371002,"Insulating wool",
+"unspsc",31371003,"Refractory blankets",
+"unspsc",31371100,"Refractory bricks",
+"unspsc",31371101,"Mullite bricks",
+"unspsc",31371102,"Sillimanite bricks",
+"unspsc",31371103,"Acid resistant bricks",
+"unspsc",31371104,"Silica bricks",
+"unspsc",31371105,"High alumina bricks",
+"unspsc",31371106,"Calcium silicate blocks",
+"unspsc",31371107,"Shaped bricks",
+"unspsc",31371200,"Castables",
+"unspsc",31371201,"Dense castables",
+"unspsc",31371202,"Insulating castables",
+"unspsc",31371203,"Low cement castables",
+"unspsc",31371204,"Acid or alkali resistant castable",
+"unspsc",31371205,"Abrasion resistant castable",
+"unspsc",31371206,"Sic castable",
+"unspsc",31371207,"Self flow castable",
+"unspsc",31371208,"Tabular alumina castable",
+"unspsc",31371209,"Erosion resistant castable",
+"unspsc",31371300,"Shaped refractories",
+"unspsc",31371301,"Porous blocks",
+"unspsc",31371302,"Zircon nozzles",
+"unspsc",31371400,"Refractory tiles",
+"unspsc",31371401,"Silica tiles",
+"unspsc",31380000,"Magnets and magnetic materials",
+"unspsc",31381000,"Permanent magnets",
+"unspsc",31381001,"Lode stone",
+"unspsc",31381002,"Alnico magnets",
+"unspsc",31381003,"Ferrite magnets",
+"unspsc",31381004,"Neodynium magnets",
+"unspsc",31381005,"Samarium cobalt magnets",
+"unspsc",32000000,"Electronic Components and Supplies",
+"unspsc",32100000,"Printed circuits and integrated circuits and microassemblies",
+"unspsc",32101500,"Circuit assemblies and radio frequency RF components",
+"unspsc",32101502,"Printed circuit assemblies PCAs",
+"unspsc",32101503,"Mixed circuit assemblies",
+"unspsc",32101504,"Surface mount circuit assemblies",
+"unspsc",32101505,"Plated through circuit assemblies",
+"unspsc",32101506,"Double sided circuit cards",
+"unspsc",32101507,"Backplane circuit cards",
+"unspsc",32101508,"Multilayer circuit cards",
+"unspsc",32101509,"Single sided circuit cards",
+"unspsc",32101510,"Printed wire boards",
+"unspsc",32101512,"Demodulators",
+"unspsc",32101513,"Application specific circuit assemblies",
+"unspsc",32101514,"Amplifiers",
+"unspsc",32101515,"Attenuators",
+"unspsc",32101516,"Circulators",
+"unspsc",32101517,"Couplers",
+"unspsc",32101518,"Delay lines",
+"unspsc",32101519,"Detectors",
+"unspsc",32101520,"Dummy loads",
+"unspsc",32101521,"Radio frequency RF filters",
+"unspsc",32101522,"Isolators",
+"unspsc",32101523,"Mixers",
+"unspsc",32101524,"Phase shifters",
+"unspsc",32101525,"Power dividers",
+"unspsc",32101526,"Wave tube amplifiers",
+"unspsc",32101527,"Terminations",
+"unspsc",32101528,"Modulators",
+"unspsc",32101600,"Integrated circuits",
+"unspsc",32101601,"Random access memory RAM",
+"unspsc",32101602,"Dynamic random access memory DRAM",
+"unspsc",32101603,"Static random access memory SRAM",
+"unspsc",32101604,"Programmable read only memory PROM",
+"unspsc",32101605,"Eraseable programmable read only memory EPROM",
+"unspsc",32101606,"Electronically erasable programmable read only memory EEPROM",
+"unspsc",32101607,"Monolithic memory integrated circuits MMIC",
+"unspsc",32101608,"Read only memory ROM",
+"unspsc",32101609,"Application specific integrated circuits ASIC",
+"unspsc",32101611,"Programmable array logic PAL",
+"unspsc",32101612,"Gate array logic GAL",
+"unspsc",32101613,"Transistor transistor logic TTL",
+"unspsc",32101614,"Emitter coupled logic ECL",
+"unspsc",32101615,"Bipolar or metal oxide semiconductor technology BIMOS",
+"unspsc",32101616,"Bipolar complementary metal oxide semiconductor technology BICMOS",
+"unspsc",32101617,"Smart cards",
+"unspsc",32101618,"Unscreened integrated circuits",
+"unspsc",32101619,"Linear integrated circuits",
+"unspsc",32101620,"Digital integrated circuits",
+"unspsc",32101621,"Synchronous dynamic random access memory SDRAM",
+"unspsc",32101622,"Flash memory",
+"unspsc",32101623,"Rambus dynamic random access memory RDRAM",
+"unspsc",32101624,"Synchronous graphic random access memory SGRAM",
+"unspsc",32101625,"Motor drive or control integrated circuits",
+"unspsc",32101626,"Microprocessors",
+"unspsc",32101627,"Clock oscillators",
+"unspsc",32101628,"Microcontrollers",
+"unspsc",32101629,"Operational amplifiers",
+"unspsc",32101630,"Voltage regulator integrated circuits",
+"unspsc",32101631,"Voltage comparator integrated circuits",
+"unspsc",32101632,"Timer integrated circuits",
+"unspsc",32101633,"Logic gates",
+"unspsc",32101634,"Flip flops",
+"unspsc",32101635,"Shift registers",
+"unspsc",32101636,"Digital Signal Processor DSP",
+"unspsc",32101637,"Network Processors",
+"unspsc",32110000,"Discrete semiconductor devices",
+"unspsc",32111500,"Diodes",
+"unspsc",32111501,"Microwave diodes",
+"unspsc",32111502,"Zener diodes",
+"unspsc",32111503,"Light emitting diodes LEDs",
+"unspsc",32111504,"Schottky diodes",
+"unspsc",32111505,"Tunnel diodes",
+"unspsc",32111506,"Photosensitive diodes",
+"unspsc",32111507,"Variable capacitance diodes",
+"unspsc",32111508,"Solar diodes",
+"unspsc",32111509,"Power diodes",
+"unspsc",32111510,"Radio frequency RF diodes",
+"unspsc",32111511,"Small signal diodes",
+"unspsc",32111512,"Laser diodes",
+"unspsc",32111600,"Transistors",
+"unspsc",32111601,"Photo sensitive transistors",
+"unspsc",32111602,"Field effect transistors FET",
+"unspsc",32111603,"Metal oxide silicone field effect transistors MOSFET",
+"unspsc",32111604,"Transistor chips",
+"unspsc",32111607,"Bipolar darlington or radio frequency RF transistors",
+"unspsc",32111608,"Unijunction transistors",
+"unspsc",32111609,"Insulated gate bipolar transistors IGBT",
+"unspsc",32111610,"Junction field effect transistors JFET",
+"unspsc",32111611,"Bipolar junction transistors BJT",
+"unspsc",32111700,"Semiconductor devices",
+"unspsc",32111701,"Photovoltaic cells",
+"unspsc",32111702,"Thyristors",
+"unspsc",32111703,"Diacs",
+"unspsc",32111704,"Triacs",
+"unspsc",32111705,"Optical coupled isolators",
+"unspsc",32111706,"Crystal oscillators",
+"unspsc",32120000,"Passive discrete components",
+"unspsc",32121500,"Capacitors",
+"unspsc",32121501,"Fixed capacitors",
+"unspsc",32121502,"Variable capacitors or varactors",
+"unspsc",32121503,"Adjustable pre set capacitors",
+"unspsc",32121504,"Capacitor networks",
+"unspsc",32121600,"Resistors",
+"unspsc",32121602,"Fusistors",
+"unspsc",32121603,"Variable resistors or varistors",
+"unspsc",32121607,"Resistor networks",
+"unspsc",32121609,"Fixed resistors",
+"unspsc",32121700,"Discrete components",
+"unspsc",32121701,"Rectifiers",
+"unspsc",32121702,"Inductors",
+"unspsc",32121703,"Ferrites",
+"unspsc",32121704,"Static converters",
+"unspsc",32121705,"Inverters",
+"unspsc",32121706,"Resistor or capacitor R/C networks",
+"unspsc",32130000,"Electronic hardware and component parts and accessories",
+"unspsc",32131000,"Electronic component parts and raw materials and accessories",
+"unspsc",32131001,"Heat sinks",
+"unspsc",32131002,"Semiconductor dies",
+"unspsc",32131003,"Semiconductor wafers",
+"unspsc",32131005,"Integrated circuit packages",
+"unspsc",32131006,"Integrated circuit sockets or mounts",
+"unspsc",32131007,"Discrete component mounts",
+"unspsc",32131008,"Heat sink compounds",
+"unspsc",32131009,"Insulators for heat sinks",
+"unspsc",32131010,"Bare printed circuit boards",
+"unspsc",32131011,"Integrated circuit lids",
+"unspsc",32131012,"Sputtering targets",
+"unspsc",32140000,"Electron tube devices and accessories",
+"unspsc",32141000,"Electron Tubes",
+"unspsc",32141001,"Cathode ray tubes",
+"unspsc",32141002,"Klystrons",
+"unspsc",32141003,"Magnetrons",
+"unspsc",32141004,"Traveling wave tubes",
+"unspsc",32141005,"Disk seal tubes",
+"unspsc",32141006,"Resnatrons",
+"unspsc",32141007,"Thyratrons",
+"unspsc",32141008,"Ignitrons",
+"unspsc",32141009,"Photo tubes",
+"unspsc",32141010,"Photo multiplier tubes",
+"unspsc",32141011,"Camera or television pickup tubes",
+"unspsc",32141012,"Diode tubes",
+"unspsc",32141013,"Triode tubes",
+"unspsc",32141014,"Tetrode tubes",
+"unspsc",32141015,"Pentode tubes",
+"unspsc",32141016,"Multiple valve tubes",
+"unspsc",32141100,"Electron tube parts and accessories",
+"unspsc",32141101,"Cathodes or emitters",
+"unspsc",32141102,"Anode devices",
+"unspsc",32141103,"Grid devices",
+"unspsc",32141104,"Deflecting devices",
+"unspsc",32141105,"Tube envelopes or blanks",
+"unspsc",32141106,"Tube bases",
+"unspsc",32141107,"Tube sockets",
+"unspsc",32141108,"Electrode pins",
+"unspsc",32141109,"Electrode carriers",
+"unspsc",39000000,"Electrical Systems and Lighting and Components and Accessories and Supplies",
+"unspsc",39100000,"Lamps and lightbulbs and lamp components",
+"unspsc",39101600,"Lamps",
+"unspsc",39101601,"Halogen lamps",
+"unspsc",39101602,"Medical lamps",
+"unspsc",39101603,"Solar lamps",
+"unspsc",39101604,"Alcohol lamps",
+"unspsc",39101605,"Fluorescent lamps",
+"unspsc",39101606,"Arc lamps",
+"unspsc",39101608,"Shadowless or scialytic operation light",
+"unspsc",39101609,"Stage or studio lamps",
+"unspsc",39101610,"Filament lamps",
+"unspsc",39101612,"Incandescent lamps",
+"unspsc",39101613,"Infrared lamps",
+"unspsc",39101614,"Metal halide lamps",
+"unspsc",39101615,"Mercury vapor lamps",
+"unspsc",39101616,"Ultraviolet UV lamps",
+"unspsc",39101617,"High pressure sodium lamps",
+"unspsc",39101618,"Neon lamps",
+"unspsc",39101619,"Compact fluorescent CFL lamps",
+"unspsc",39101700,"Glass light bulbs",
+"unspsc",39101701,"Fluorescent tubes",
+"unspsc",39101800,"Lamp components",
+"unspsc",39101801,"Lamp filament",
+"unspsc",39110000,"Lighting and fixtures and accessories",
+"unspsc",39111500,"Interior lighting and fixtures",
+"unspsc",39111501,"Fluorescent fixtures",
+"unspsc",39111503,"Wall fixtures",
+"unspsc",39111504,"Stage or studio lighting systems",
+"unspsc",39111505,"Recessed lighting",
+"unspsc",39111506,"Chandeliers",
+"unspsc",39111507,"Desk fixtures",
+"unspsc",39111508,"Track lighting",
+"unspsc",39111509,"Floor lamps",
+"unspsc",39111510,"Table lamps",
+"unspsc",39111512,"Laboratory bench lights",
+"unspsc",39111513,"Interior solar lighting",
+"unspsc",39111514,"Tree lights",
+"unspsc",39111515,"Downlighting fixtures",
+"unspsc",39111516,"Task lighting fixtures",
+"unspsc",39111517,"Wax candles",
+"unspsc",39111518,"Hand or extension light",
+"unspsc",39111519,"Candle holders",
+"unspsc",39111520,"Halogen lighting fixtures",
+"unspsc",39111521,"Ceiling fixtures",
+"unspsc",39111522,"Pendant lighting",
+"unspsc",39111600,"Exterior lighting and fixtures",
+"unspsc",39111603,"Roadway or highway lighting",
+"unspsc",39111605,"Landscape or area lighting",
+"unspsc",39111606,"Underwater lighting",
+"unspsc",39111608,"Residential street lights",
+"unspsc",39111609,"Kerosene or propane or butane lanterns",
+"unspsc",39111700,"Emergency lighting",
+"unspsc",39111702,"Flashlights",
+"unspsc",39111703,"Storm lights",
+"unspsc",39111704,"Flood lights",
+"unspsc",39111705,"Light sticks",
+"unspsc",39111706,"Strobe or warning lights",
+"unspsc",39111800,"Lighting accessories",
+"unspsc",39111801,"Lamp ballasts",
+"unspsc",39111802,"Lamp housings",
+"unspsc",39111803,"Lamp sockets",
+"unspsc",39111804,"Lamp bases",
+"unspsc",39111806,"Light boxes",
+"unspsc",39111808,"Grilles",
+"unspsc",39111809,"Light conditioner filters",
+"unspsc",39111810,"Lamp starter",
+"unspsc",39111811,"Electrified tracks",
+"unspsc",39111812,"Lamp covers",
+"unspsc",39111813,"Lamp arms",
+"unspsc",39111900,"Hazardous location lighting and fixtures",
+"unspsc",39111901,"Hazardous location fluorescent fixtures",
+"unspsc",39111902,"Hazardous location incandescent fixtures",
+"unspsc",39112000,"Mobile and fixed floodlighting",
+"unspsc",39112001,"Light tower",
+"unspsc",39112002,"Light cart",
+"unspsc",39112003,"Light stand",
+"unspsc",39112100,"Optical lighting",
+"unspsc",39112101,"Fiber optic lighting",
+"unspsc",39112102,"Light emitting diode LED optic lighting",
+"unspsc",39120000,"Electrical equipment and components and supplies",
+"unspsc",39121000,"Power conditioning equipment",
+"unspsc",39121001,"Distribution power transformers",
+"unspsc",39121002,"Power supply transformers",
+"unspsc",39121003,"Instrument transformers",
+"unspsc",39121004,"Power supply units",
+"unspsc",39121006,"Power adapters or inverters",
+"unspsc",39121007,"Frequency converters",
+"unspsc",39121008,"Signal converters",
+"unspsc",39121009,"Electrical or power regulators",
+"unspsc",39121010,"Magnetic coils",
+"unspsc",39121011,"Uninterruptible power supplies",
+"unspsc",39121012,"Chokes",
+"unspsc",39121013,"Electric rotary converters",
+"unspsc",39121014,"Capacitor banks",
+"unspsc",39121015,"Reactors",
+"unspsc",39121016,"Slip rings",
+"unspsc",39121017,"Power distribution units PDUs",
+"unspsc",39121018,"Intrinsic safety barriers",
+"unspsc",39121019,"Inductive coupling devices",
+"unspsc",39121020,"Signal conditioners",
+"unspsc",39121021,"Servo drives",
+"unspsc",39121022,"Electronic transformers",
+"unspsc",39121100,"Distribution and control centers and accessories",
+"unspsc",39121101,"Load centers",
+"unspsc",39121102,"Meter centers or sockets",
+"unspsc",39121103,"Panelboards",
+"unspsc",39121104,"Motor control centers",
+"unspsc",39121105,"Switchgear systems",
+"unspsc",39121106,"Power monitoring or control systems",
+"unspsc",39121107,"Lighting control systems",
+"unspsc",39121108,"Distribution or control board fixtures",
+"unspsc",39121109,"Transmission transformers",
+"unspsc",39121200,"Wire management components and busways",
+"unspsc",39121201,"Cable trays",
+"unspsc",39121202,"Electrical conduit",
+"unspsc",39121203,"Electrical raceways",
+"unspsc",39121204,"Wireways",
+"unspsc",39121205,"Wiring troughs",
+"unspsc",39121206,"Busways",
+"unspsc",39121207,"Wiring ducts",
+"unspsc",39121208,"Cable ladders",
+"unspsc",39121300,"Electrical boxes and enclosures and fittings",
+"unspsc",39121301,"Distribution or control board enclosures",
+"unspsc",39121302,"Enclosure plates or covers",
+"unspsc",39121303,"Electrical boxes",
+"unspsc",39121304,"Electrical box covers",
+"unspsc",39121305,"Weatherproof boxes",
+"unspsc",39121306,"Switch boxes",
+"unspsc",39121307,"Floor boxes",
+"unspsc",39121308,"Outlet boxes",
+"unspsc",39121309,"Specialty electrical boxes",
+"unspsc",39121310,"Utility boxes",
+"unspsc",39121311,"Electrical fittings",
+"unspsc",39121312,"Electrical bushings",
+"unspsc",39121313,"Ceiling flanges",
+"unspsc",39121400,"Lugs connectors and terminals",
+"unspsc",39121402,"Electrical plugs",
+"unspsc",39121403,"Twist lock plugs",
+"unspsc",39121404,"Electrical sleeves",
+"unspsc",39121405,"Cable or wire lugs",
+"unspsc",39121406,"Electrical receptacles",
+"unspsc",39121407,"Terminal strips",
+"unspsc",39121408,"Mechanical connectors",
+"unspsc",39121409,"Wire connectors",
+"unspsc",39121410,"Terminal blocks",
+"unspsc",39121411,"Fuse blocks",
+"unspsc",39121412,"Backshell connectors",
+"unspsc",39121413,"Circular connectors",
+"unspsc",39121414,"Coaxial connectors",
+"unspsc",39121415,"Flat connectors",
+"unspsc",39121416,"Electronic connector caps",
+"unspsc",39121419,"Flex connectors",
+"unspsc",39121420,"Liquid tight connectors",
+"unspsc",39121421,"Connector assemblies",
+"unspsc",39121422,"Mechanical couplings",
+"unspsc",39121423,"Spring jaw connectors",
+"unspsc",39121424,"Terminal block covers",
+"unspsc",39121425,"Terminal block separator",
+"unspsc",39121426,"Jumper bar",
+"unspsc",39121427,"Wiring taps",
+"unspsc",39121428,"Electrical taps",
+"unspsc",39121429,"Fiber optic connector",
+"unspsc",39121430,"Fuse clips",
+"unspsc",39121431,"Cable gland connectors",
+"unspsc",39121432,"Electrical terminals",
+"unspsc",39121433,"Radio frequency RF connectors",
+"unspsc",39121434,"Electrical metallic tubing EMT connectors",
+"unspsc",39121435,"Connecting leads or wires",
+"unspsc",39121436,"Electrodes",
+"unspsc",39121437,"Current collector shoes",
+"unspsc",39121500,"Switches and controls and relays and accessories",
+"unspsc",39121501,"Safety switches",
+"unspsc",39121502,"Dimmer switches",
+"unspsc",39121503,"Drum switches",
+"unspsc",39121504,"Time switches",
+"unspsc",39121505,"Snap switches",
+"unspsc",39121506,"Pressure switches",
+"unspsc",39121507,"Toggle switches",
+"unspsc",39121508,"Slide switches",
+"unspsc",39121509,"Limit switches",
+"unspsc",39121510,"Controller switches",
+"unspsc",39121511,"Variable switches",
+"unspsc",39121512,"Push button switches",
+"unspsc",39121513,"Rotary switches",
+"unspsc",39121514,"Power relays",
+"unspsc",39121515,"General purpose relays",
+"unspsc",39121516,"Socket relays",
+"unspsc",39121517,"Alternating voltage relays",
+"unspsc",39121518,"Mercury relays",
+"unspsc",39121519,"Time relays",
+"unspsc",39121520,"Overload relays",
+"unspsc",39121521,"Motor starter controls",
+"unspsc",39121522,"Electrical contacts",
+"unspsc",39121523,"Timer controls",
+"unspsc",39121524,"Photocontrols",
+"unspsc",39121525,"Non fusible switches",
+"unspsc",39121527,"Encoders",
+"unspsc",39121528,"Photoelectric sensors",
+"unspsc",39121529,"Contactors",
+"unspsc",39121531,"Level or float switches",
+"unspsc",39121532,"Radio frequency RF switches",
+"unspsc",39121533,"Switch parts or accessories",
+"unspsc",39121534,"Indicator or pilot lights",
+"unspsc",39121535,"Control relays",
+"unspsc",39121536,"Phase failure relays",
+"unspsc",39121537,"Foot switches",
+"unspsc",39121538,"Flow switches",
+"unspsc",39121539,"Keylock switches",
+"unspsc",39121540,"Mercury switches",
+"unspsc",39121541,"Rocker switches",
+"unspsc",39121542,"Solid state relays",
+"unspsc",39121543,"Relay boards or multiple relay modules",
+"unspsc",39121544,"Indicator light parts or accessories",
+"unspsc",39121545,"Emergency stops",
+"unspsc",39121546,"Joystick switches or controls",
+"unspsc",39121547,"Relay sockets or bases",
+"unspsc",39121548,"Vacuum switches",
+"unspsc",39121549,"Temperature switch",
+"unspsc",39121550,"Proximity switches",
+"unspsc",39121551,"Reflector parts",
+"unspsc",39121600,"Circuit protection devices and accessories",
+"unspsc",39121601,"Circuit breakers",
+"unspsc",39121602,"Magnetic circuit breakers",
+"unspsc",39121603,"Miniature circuit breakers",
+"unspsc",39121604,"Time delay fuses",
+"unspsc",39121605,"Plug fuses",
+"unspsc",39121606,"Cartridge fuses",
+"unspsc",39121607,"Glass body fuses",
+"unspsc",39121608,"Class type fuses",
+"unspsc",39121609,"Midget fuses",
+"unspsc",39121610,"Surge suppressers",
+"unspsc",39121611,"Ceramic fuses",
+"unspsc",39121612,"Blade fuses",
+"unspsc",39121613,"Grounding devices or assemblies",
+"unspsc",39121614,"Earth leakage circuit breakers",
+"unspsc",39121615,"Air circuit breakers",
+"unspsc",39121616,"Molded case circuit breakers",
+"unspsc",39121617,"Fuse parts or accessories",
+"unspsc",39121618,"Fuse wire",
+"unspsc",39121619,"Diazed or bottle fuses",
+"unspsc",39121620,"Transient protection materials",
+"unspsc",39121700,"Electrical hardware and supplies",
+"unspsc",39121701,"Electrical hangers",
+"unspsc",39121702,"Cable clips",
+"unspsc",39121703,"Cable ties",
+"unspsc",39121704,"Wallplates",
+"unspsc",39121705,"Cable clamps",
+"unspsc",39121706,"Transformer bushings",
+"unspsc",39121707,"Harness board nails",
+"unspsc",39121708,"Din Rail",
+"unspsc",39121709,"Handle tie",
+"unspsc",39121710,"Electrical receptacle multipliers",
+"unspsc",39121711,"Tubings",
+"unspsc",39121712,"End caps",
+"unspsc",39121713,"Spiral wrapping",
+"unspsc",39121714,"Grommet edging",
+"unspsc",39121715,"Corrugated loom tubes",
+"unspsc",39121716,"Expandable braided sleeve",
+"unspsc",39121717,"Cable tie mounts",
+"unspsc",39121718,"Cable splicing kits",
+"unspsc",39121719,"Strain reliefs",
+"unspsc",39121720,"Transformer handles",
+"unspsc",39121721,"Electrical insulators",
+"unspsc",39121800,"Intelligent Building Installations IBI",
+"unspsc",39121801,"Controlling units or devices",
+"unspsc",39121802,"Inactive units or devices",
+"unspsc",40000000,"Distribution and Conditioning Systems and Equipment and Components",
+"unspsc",40100000,"Heating and ventilation and air circulation",
+"unspsc",40101500,"Ventilation",
+"unspsc",40101501,"Air collectors",
+"unspsc",40101502,"Air exhausters",
+"unspsc",40101503,"Vents",
+"unspsc",40101504,"Ventilation dampers",
+"unspsc",40101505,"Air diffusers",
+"unspsc",40101506,"Ventilation pipes",
+"unspsc",40101600,"Air circulation and parts and accessories",
+"unspsc",40101601,"Blowers",
+"unspsc",40101602,"Air circulators",
+"unspsc",40101603,"Impellers",
+"unspsc",40101604,"Fans",
+"unspsc",40101605,"Fan guards or  accessories",
+"unspsc",40101700,"Cooling",
+"unspsc",40101701,"Air conditioners",
+"unspsc",40101702,"Cooling exchangers",
+"unspsc",40101703,"Evaporative coolers",
+"unspsc",40101704,"Condensing units",
+"unspsc",40101705,"Capillary tube assemblies",
+"unspsc",40101706,"Air conditioner shutters",
+"unspsc",40101707,"Cooling tower accessories",
+"unspsc",40101800,"Heating equipment and parts and accessories",
+"unspsc",40101801,"Radiators",
+"unspsc",40101802,"Heat exchangers",
+"unspsc",40101803,"Fireplaces",
+"unspsc",40101805,"Furnaces",
+"unspsc",40101806,"Heat pumps",
+"unspsc",40101807,"Solar heating units",
+"unspsc",40101808,"Heating stoves",
+"unspsc",40101809,"Circulation heaters",
+"unspsc",40101810,"Coil duct heaters",
+"unspsc",40101811,"Convection heaters",
+"unspsc",40101812,"Divided exchangers",
+"unspsc",40101813,"Double split exchangers",
+"unspsc",40101814,"Finned tubular heaters",
+"unspsc",40101815,"Immersion heaters",
+"unspsc",40101816,"Kettle exchangers",
+"unspsc",40101817,"One pass exchangers",
+"unspsc",40101818,"Process air heaters",
+"unspsc",40101819,"Space heaters",
+"unspsc",40101820,"Split exchangers",
+"unspsc",40101821,"Strip heaters",
+"unspsc",40101822,"Tubular heaters",
+"unspsc",40101823,"Two pass exchangers",
+"unspsc",40101824,"Quartz heater",
+"unspsc",40101825,"Domestic water heaters",
+"unspsc",40101826,"Commercial water heaters",
+"unspsc",40101827,"Ceramic fiber heaters",
+"unspsc",40101828,"Cartridge heaters",
+"unspsc",40101829,"Band heaters",
+"unspsc",40101830,"Heater elements",
+"unspsc",40101831,"Induction heaters",
+"unspsc",40101832,"Doors for heating equipment",
+"unspsc",40101833,"Boiler or heater ignitor",
+"unspsc",40101834,"Burners",
+"unspsc",40101900,"Humidity control",
+"unspsc",40101901,"Vaporizers",
+"unspsc",40101902,"Dehumidifiers",
+"unspsc",40101903,"Humidifiers",
+"unspsc",40102000,"Boilers",
+"unspsc",40102001,"Fire tube boilers",
+"unspsc",40102002,"Water tube boiler",
+"unspsc",40102003,"Electric boilers",
+"unspsc",40102004,"Natural gas powered boilers",
+"unspsc",40102005,"Propane gas powered boilers",
+"unspsc",40140000,"Fluid and gas distribution",
+"unspsc",40141600,"Valves",
+"unspsc",40141602,"Needle valves",
+"unspsc",40141603,"Pneumatic valves",
+"unspsc",40141604,"Safety valves",
+"unspsc",40141605,"Solenoid valves",
+"unspsc",40141606,"Relief valves",
+"unspsc",40141607,"Ball valves",
+"unspsc",40141608,"Hydraulic valves",
+"unspsc",40141609,"Control valves",
+"unspsc",40141610,"Float valves",
+"unspsc",40141611,"Globe valves",
+"unspsc",40141612,"Expansion valves",
+"unspsc",40141613,"Gate valves",
+"unspsc",40141615,"Flap valves",
+"unspsc",40141616,"Valve parts or accessories",
+"unspsc",40141617,"Angle globe valves",
+"unspsc",40141618,"Ball check valves",
+"unspsc",40141619,"Butterfly lug pattern valves",
+"unspsc",40141620,"Butterfly wafer pattern valves",
+"unspsc",40141621,"Diaphragm valves",
+"unspsc",40141622,"Inline check valves",
+"unspsc",40141623,"Knife gate valves",
+"unspsc",40141624,"Lubricated plug valves",
+"unspsc",40141625,"Mud or slush valves",
+"unspsc",40141626,"Nonlubricated plug valves",
+"unspsc",40141627,"Orifice valves",
+"unspsc",40141628,"Pilot valves",
+"unspsc",40141629,"Pinch valves",
+"unspsc",40141630,"Piston check valves",
+"unspsc",40141631,"Pump valves",
+"unspsc",40141632,"Sentinel valves",
+"unspsc",40141633,"Slider valves",
+"unspsc",40141634,"Swing check valves",
+"unspsc",40141635,"Turbine valves",
+"unspsc",40141636,"Valve kits",
+"unspsc",40141637,"Wafer check valves",
+"unspsc",40141638,"Toggle valves",
+"unspsc",40141700,"Hardware and fittings",
+"unspsc",40141701,"Drains",
+"unspsc",40141702,"Faucets",
+"unspsc",40141703,"Shower heads",
+"unspsc",40141704,"Spigots",
+"unspsc",40141705,"Spouts",
+"unspsc",40141716,"P traps",
+"unspsc",40141719,"Plumbing adapters",
+"unspsc",40141720,"Plumbing connectors",
+"unspsc",40141725,"Plumbing hangers",
+"unspsc",40141726,"Hydrants",
+"unspsc",40141727,"Plumbing vents",
+"unspsc",40141731,"Nozzles",
+"unspsc",40141732,"Plumbing spiders",
+"unspsc",40141734,"Hose fitting",
+"unspsc",40141735,"Funnels",
+"unspsc",40141736,"Grease fitting",
+"unspsc",40141737,"Diaphragms",
+"unspsc",40141738,"Drain plugs",
+"unspsc",40141739,"Drain covers",
+"unspsc",40141740,"Fuel cocks",
+"unspsc",40141741,"Orifice fittings",
+"unspsc",40141742,"Atomizers",
+"unspsc",40141743,"Nozzle tips or caps",
+"unspsc",40141744,"Drain bowls",
+"unspsc",40141745,"Fusible plugs",
+"unspsc",40141746,"Sight glass",
+"unspsc",40141900,"Ducts",
+"unspsc",40141901,"Flexible ducts",
+"unspsc",40141902,"Rigid ducts",
+"unspsc",40141903,"Magnesium ducts or ductwork",
+"unspsc",40141904,"Ferrous alloy ducts or ductwork",
+"unspsc",40141905,"Titanium ducts or ductwork",
+"unspsc",40141906,"Tin ducts or ductwork",
+"unspsc",40141907,"Brass ducts or ductwork",
+"unspsc",40141908,"Lead ducts or ductwork",
+"unspsc",40141909,"Bronze ducts or ductwork",
+"unspsc",40141910,"Zinc ducts or ductwork",
+"unspsc",40141911,"Steel ducts or ductwork",
+"unspsc",40141912,"Iron ducts or ductwork",
+"unspsc",40141913,"Cement ducts or ductwork",
+"unspsc",40141914,"Plastics duct or ductwork",
+"unspsc",40141915,"Rubber duct or ductwork",
+"unspsc",40141916,"Glass ducts or ductwork",
+"unspsc",40141917,"Stone ducts or ductwork",
+"unspsc",40141918,"Non ferrous alloy ducts or ductwork",
+"unspsc",40141919,"Aluminum ducts or ductwork",
+"unspsc",40141920,"Stainless steel ducts or ductwork",
+"unspsc",40141921,"Precious metal ducts or ductwork",
+"unspsc",40141922,"Copper ducts or ductwork",
+"unspsc",40142000,"Hoses",
+"unspsc",40142001,"Acid hoses",
+"unspsc",40142002,"Air hoses",
+"unspsc",40142003,"Drill hoses",
+"unspsc",40142004,"Marine hoses",
+"unspsc",40142005,"Material handling hoses",
+"unspsc",40142006,"Oil hoses",
+"unspsc",40142007,"Special hoses",
+"unspsc",40142008,"Water hoses",
+"unspsc",40142009,"Air water gas multipurpose hoses",
+"unspsc",40142010,"Fluoropolymer lined hoses",
+"unspsc",40142100,"Pipe",
+"unspsc",40142101,"Carbon steel pipe",
+"unspsc",40142102,"Ductile iron pipe",
+"unspsc",40142103,"High nickel alloy pipe",
+"unspsc",40142104,"High yield steel pipe",
+"unspsc",40142105,"Ferrous alloy pipe",
+"unspsc",40142106,"Aluminum pipe",
+"unspsc",40142107,"Brass pipe",
+"unspsc",40142108,"Bronze pipe",
+"unspsc",40142109,"Concrete pipe",
+"unspsc",40142110,"Copper pipe",
+"unspsc",40142111,"Cast iron pipe",
+"unspsc",40142112,"Lead pipe",
+"unspsc",40142113,"Magnesium pipe",
+"unspsc",40142114,"Non ferrous pipe",
+"unspsc",40142115,"Plastic pipe",
+"unspsc",40142116,"Rubber pipe",
+"unspsc",40142117,"Stainless steel pipe",
+"unspsc",40142118,"Tin pipe",
+"unspsc",40142119,"Titanium pipe",
+"unspsc",40142120,"Zinc pipe",
+"unspsc",40142121,"Hose reels",
+"unspsc",40142122,"Glass pipe",
+"unspsc",40142200,"Fluid and gas regulators",
+"unspsc",40142201,"Gas regulators",
+"unspsc",40142202,"Fluid regulators",
+"unspsc",40142203,"Fluid regulator repair kits",
+"unspsc",40142300,"Pipe fittings",
+"unspsc",40142301,"Pipe angle face rings",
+"unspsc",40142302,"Pipe branch outlets",
+"unspsc",40142303,"Pipe laterals",
+"unspsc",40142304,"Pipe inserts",
+"unspsc",40142305,"Pipe reducers",
+"unspsc",40142306,"Pipe saddles",
+"unspsc",40142307,"Pipe stubends",
+"unspsc",40142308,"Pipe wyes",
+"unspsc",40142309,"Pipe bends",
+"unspsc",40142310,"Pipe caps",
+"unspsc",40142311,"Pipe half couplings",
+"unspsc",40142312,"Pipe expansion joints",
+"unspsc",40142313,"Pipe plugs",
+"unspsc",40142314,"Pipe bushings",
+"unspsc",40142315,"Pipe couplings",
+"unspsc",40142316,"Pipe crosses",
+"unspsc",40142317,"Pipe elbows",
+"unspsc",40142318,"Pipe nipples",
+"unspsc",40142319,"Pipe tees",
+"unspsc",40142320,"Pipe unions",
+"unspsc",40142321,"Pipe reducing couplings",
+"unspsc",40142322,"Pipe repair clamps",
+"unspsc",40142323,"Rupture disk",
+"unspsc",40142324,"Pipe connection boxes",
+"unspsc",40142325,"Pipe baffles",
+"unspsc",40142326,"Pipe spacers",
+"unspsc",40142327,"Pipe swivel or rotating joints",
+"unspsc",40142400,"Pipe flanges",
+"unspsc",40142401,"Ammonia flanges",
+"unspsc",40142402,"Backup flanges",
+"unspsc",40142403,"Blind flanges",
+"unspsc",40142404,"Lapjoint flanges",
+"unspsc",40142405,"Long weldneck flanges",
+"unspsc",40142406,"Orifice flanges",
+"unspsc",40142407,"Plate flanges",
+"unspsc",40142408,"Slipon flanges",
+"unspsc",40142409,"Socketweld flanges",
+"unspsc",40142410,"Spectacle blind flanges",
+"unspsc",40142411,"Threaded flanges",
+"unspsc",40142412,"Weldneck flanges",
+"unspsc",40142413,"Puddle flanges",
+"unspsc",40142414,"Reducing flanges",
+"unspsc",40142500,"Traps and strainers",
+"unspsc",40142501,"Liquid strainers",
+"unspsc",40142502,"Liquid traps",
+"unspsc",40142503,"Steam traps",
+"unspsc",40142504,"Steam strainers",
+"unspsc",40142600,"Tube fittings",
+"unspsc",40142604,"Tube elbows",
+"unspsc",40142605,"Tube tees",
+"unspsc",40142606,"Tube unions",
+"unspsc",40142607,"Tube caps",
+"unspsc",40142608,"Tube nipples",
+"unspsc",40142609,"Tube plugs",
+"unspsc",40142610,"Tube couplings",
+"unspsc",40142611,"Tube bushings",
+"unspsc",40142612,"Tube adapters",
+"unspsc",40142613,"Tube connectors",
+"unspsc",40142614,"Tube crosses",
+"unspsc",40142615,"Tube reducers",
+"unspsc",40150000,"Industrial pumps and compressors",
+"unspsc",40151500,"Pumps",
+"unspsc",40151501,"Air pumps",
+"unspsc",40151502,"Vacuum pumps",
+"unspsc",40151503,"Centrifugal pumps",
+"unspsc",40151504,"Circulating pumps",
+"unspsc",40151505,"Dosing pumps",
+"unspsc",40151506,"Hand pumps",
+"unspsc",40151507,"Irrigation pumps",
+"unspsc",40151508,"Mud pumps",
+"unspsc",40151509,"Reciprocating pumps",
+"unspsc",40151510,"Water pumps",
+"unspsc",40151511,"Well pumps",
+"unspsc",40151512,"Sump pumps",
+"unspsc",40151513,"Submersible pumps",
+"unspsc",40151514,"Steam pumps",
+"unspsc",40151515,"Solenoid pumps",
+"unspsc",40151516,"Shear pumps",
+"unspsc",40151517,"Sewage pumps",
+"unspsc",40151518,"Sealless pumps",
+"unspsc",40151519,"Sanitary pumps",
+"unspsc",40151520,"Sampling pumps",
+"unspsc",40151521,"Rotary pumps",
+"unspsc",40151522,"Reverse osmosis pumps",
+"unspsc",40151523,"Positive displacement pumps",
+"unspsc",40151524,"Oil pumps",
+"unspsc",40151525,"Sludge pumps",
+"unspsc",40151526,"Turbine pumps",
+"unspsc",40151527,"Plunger pumps",
+"unspsc",40151528,"Oscillating pumps",
+"unspsc",40151529,"Drum pumps",
+"unspsc",40151530,"Dredge pumps",
+"unspsc",40151531,"Dewatering pumps",
+"unspsc",40151532,"Fuel pumps",
+"unspsc",40151533,"Hydraulic pumps",
+"unspsc",40151534,"Cryogenic pumps",
+"unspsc",40151546,"Axial split pumps",
+"unspsc",40151547,"Deepwell pumps",
+"unspsc",40151548,"Diaphragm pumps",
+"unspsc",40151549,"Double diaphragm pumps",
+"unspsc",40151550,"Duplex pumps",
+"unspsc",40151551,"Gear pumps",
+"unspsc",40151552,"Metering or injection or proportioning pumps",
+"unspsc",40151553,"Progressive cavity pumps",
+"unspsc",40151554,"Ram pumps",
+"unspsc",40151555,"Rotary cam pumps",
+"unspsc",40151556,"Rotary lobe pumps",
+"unspsc",40151557,"Rotating piston pumps",
+"unspsc",40151558,"Screw Pumps",
+"unspsc",40151559,"Simplex pumps",
+"unspsc",40151560,"Sliding vane pumps",
+"unspsc",40151561,"Triplex pumps",
+"unspsc",40151562,"Worm pumps",
+"unspsc",40151563,"Fire pump sets",
+"unspsc",40151564,"Chemical pumps",
+"unspsc",40151600,"Compressors",
+"unspsc",40151601,"Air compressors",
+"unspsc",40151602,"Axial flow compressors",
+"unspsc",40151603,"Diaphragm compressors",
+"unspsc",40151604,"Gas compressors",
+"unspsc",40151605,"Motor compressors",
+"unspsc",40151606,"Reciprocating compressors",
+"unspsc",40151607,"Refrigerant compressors",
+"unspsc",40151608,"Rotary compressors",
+"unspsc",40151609,"Screw compressors",
+"unspsc",40151610,"Compressor parts or accessories",
+"unspsc",40151611,"Barrel compressors",
+"unspsc",40151612,"Centrifugal compressors",
+"unspsc",40151613,"Combination compressors",
+"unspsc",40151614,"Semi radial compressors",
+"unspsc",40151615,"Turbo compressors",
+"unspsc",40151616,"Compressor kits",
+"unspsc",40151700,"Pump parts and accessories",
+"unspsc",40151701,"Pump casings",
+"unspsc",40151712,"Pump packings",
+"unspsc",40151713,"Pump liners",
+"unspsc",40151714,"Pump barrels",
+"unspsc",40151715,"Pump idlers",
+"unspsc",40151716,"Pump head",
+"unspsc",40151717,"Pump discs",
+"unspsc",40151718,"Sludge pump spare parts",
+"unspsc",40151719,"Sewage pump spare parts",
+"unspsc",40151720,"Submersible pump spare parts",
+"unspsc",40151721,"Water pump spare parts",
+"unspsc",40151722,"Well pump spare parts",
+"unspsc",40151723,"Sump pump spare parts",
+"unspsc",40151724,"Dosing pump spare parts",
+"unspsc",40151725,"Centrifugal pump spare parts",
+"unspsc",40151726,"Circulation pump spare parts",
+"unspsc",40151727,"Rotary pump spare parts",
+"unspsc",40151728,"Pump repair kits",
+"unspsc",40160000,"Industrial filtering and purification",
+"unspsc",40161500,"Filters",
+"unspsc",40161501,"Vacuum filters",
+"unspsc",40161502,"Water filters",
+"unspsc",40161503,"Dust collectors",
+"unspsc",40161504,"Oil filters",
+"unspsc",40161505,"Air filters",
+"unspsc",40161506,"Filtering machinery",
+"unspsc",40161507,"Filter membranes",
+"unspsc",40161508,"Bag filters",
+"unspsc",40161509,"Absorption filters",
+"unspsc",40161511,"Coalescing filters",
+"unspsc",40161512,"Electronic filters",
+"unspsc",40161513,"Fuel filters",
+"unspsc",40161514,"Gas pipeline filters",
+"unspsc",40161515,"Hydraulic filters",
+"unspsc",40161516,"In line filters",
+"unspsc",40161517,"Light filters",
+"unspsc",40161518,"Microfiber filters",
+"unspsc",40161519,"Panel filters",
+"unspsc",40161520,"Radial fin filters",
+"unspsc",40161521,"Filter Base",
+"unspsc",40161522,"Filter Fins",
+"unspsc",40161524,"Paint filters",
+"unspsc",40161525,"Housings for filters",
+"unspsc",40161526,"Filter retainers or accessories",
+"unspsc",40161527,"Filter repair kits",
+"unspsc",40161600,"Purification",
+"unspsc",40161601,"Air scrubbers",
+"unspsc",40161602,"Air cleaners",
+"unspsc",40161700,"Separators",
+"unspsc",40161701,"Centrifuges",
+"unspsc",40161702,"Wet scrubbers",
+"unspsc",40161703,"Mist eliminators",
+"unspsc",40161704,"Hydro cyclones",
+"unspsc",40161800,"Filter media",
+"unspsc",40161801,"Metal fabric media",
+"unspsc",40161802,"Pressed felts",
+"unspsc",40161803,"Filter papers",
+"unspsc",40161804,"Filter aids",
+"unspsc",40161805,"Filter cloth",
+"unspsc",40161806,"Filter mesh",
+"unspsc",41000000,"Laboratory and Measuring and Observing and Testing Equipment",
+"unspsc",41100000,"Laboratory and scientific equipment",
+"unspsc",41101500,"Laboratory blending and dispersing and homogenizing equipment and supplies",
+"unspsc",41101502,"Stomachers",
+"unspsc",41101503,"Laboratory sprayers",
+"unspsc",41101504,"Homogenizers",
+"unspsc",41101505,"French pressure cells",
+"unspsc",41101515,"Liquid measuring cans",
+"unspsc",41101516,"Dounce homogenizers",
+"unspsc",41101518,"Laboratory blenders or emulsifiers",
+"unspsc",41101700,"Laboratory boring and grinding and cutting and crushing and pressing equipment",
+"unspsc",41101701,"Laboratory mills",
+"unspsc",41101702,"Pestle or mortars",
+"unspsc",41101703,"Tissue grinders",
+"unspsc",41101705,"Laboratory crushers or pulverizers",
+"unspsc",41101706,"Laboratory disintegrators",
+"unspsc",41101707,"Laboratory presses",
+"unspsc",41101800,"Laboratory electron and solid state physics equipment",
+"unspsc",41101801,"Electron guns",
+"unspsc",41101802,"X ray generators",
+"unspsc",41101803,"Coulometers",
+"unspsc",41101804,"Electroscopes",
+"unspsc",41101805,"Fluxmeters",
+"unspsc",41101806,"Magnetometers",
+"unspsc",41101807,"Electron diffraction apparatus",
+"unspsc",41101808,"Neutron diffraction apparatus",
+"unspsc",41101809,"Optical diffraction apparatus",
+"unspsc",41101810,"Diffractometers",
+"unspsc",41101900,"Laboratory ionic equipment",
+"unspsc",41101901,"Ion sources",
+"unspsc",41101902,"Ion exchange apparatus",
+"unspsc",41101903,"Ion implantation equipment",
+"unspsc",41102400,"Laboratory heating and drying equipment",
+"unspsc",41102401,"Gas burners",
+"unspsc",41102402,"Spirit burners",
+"unspsc",41102403,"Laboratory incinerators",
+"unspsc",41102404,"Laboratory heaters",
+"unspsc",41102405,"Heating mantles or tapes",
+"unspsc",41102406,"Laboratory hotplates",
+"unspsc",41102407,"Warming cabinets",
+"unspsc",41102410,"Infrared dryers",
+"unspsc",41102412,"Hot air blowers",
+"unspsc",41102421,"Temperature cycling chambers or thermal cyclers",
+"unspsc",41102422,"Dry baths or heating blocks",
+"unspsc",41102423,"Stirring hotplates",
+"unspsc",41102424,"Slide warmers",
+"unspsc",41102425,"Slide dryers",
+"unspsc",41102426,"Heating or drying equipment or accessories",
+"unspsc",41102500,"Laboratory entomological equipment and accessories",
+"unspsc",41102501,"Laboratory insect containers",
+"unspsc",41102502,"Rearing facilities for entomology",
+"unspsc",41102503,"Fabric or netting for entomology",
+"unspsc",41102504,"Entomological pinning equipment",
+"unspsc",41102505,"Entomological mounting materials",
+"unspsc",41102506,"Entomological trays",
+"unspsc",41102507,"Entomological catching equipment",
+"unspsc",41102508,"Entomological aspirators",
+"unspsc",41102509,"Entomological dippers",
+"unspsc",41102510,"Entomological monocups",
+"unspsc",41102511,"Entomological sticky traps",
+"unspsc",41102512,"Insect test kits",
+"unspsc",41102513,"Entomological display units",
+"unspsc",41102600,"Animal laboratory equipment and accessories",
+"unspsc",41102601,"Laboratory cages for small animals",
+"unspsc",41102602,"Aquaria equipment",
+"unspsc",41102603,"Animal identification supplies",
+"unspsc",41102604,"Animal catching devices",
+"unspsc",41102605,"Fish aeration systems",
+"unspsc",41102606,"Laboratory animal restraints or harnesses",
+"unspsc",41102607,"Animal feeding needles",
+"unspsc",41102608,"Animal testing equipment",
+"unspsc",41102700,"Crystallography equipment",
+"unspsc",41102701,"Crystal lattice models",
+"unspsc",41102702,"Scintillation crystal assemblies",
+"unspsc",41102703,"Light scattering equipment",
+"unspsc",41102704,"X ray diffraction equipment",
+"unspsc",41102705,"Crystallizers",
+"unspsc",41102706,"Crystal growing equipment",
+"unspsc",41102900,"Histology equipment",
+"unspsc",41102901,"Tissue embedding stations",
+"unspsc",41102902,"Embedding molds",
+"unspsc",41102903,"Embedding capsules",
+"unspsc",41102904,"Embedding compounds",
+"unspsc",41102905,"Histological staining apparatus",
+"unspsc",41102909,"Tissue processors",
+"unspsc",41102910,"Tissue culture apparatus",
+"unspsc",41102911,"Histological knives or knife holders or blades",
+"unspsc",41102912,"Histological glass knife makers",
+"unspsc",41102913,"Histological hones or straps or compounds",
+"unspsc",41102914,"Ultrasonic disintegrators",
+"unspsc",41102915,"Histology sampling and dissecting stations",
+"unspsc",41102916,"Microtomes",
+"unspsc",41102917,"Microtome blades",
+"unspsc",41102918,"Laboratory cover slippers",
+"unspsc",41102919,"Solvent recyclers",
+"unspsc",41102920,"Histology tissue cassettes",
+"unspsc",41102921,"Histology paraffin",
+"unspsc",41102922,"Automated cover slipping equipment",
+"unspsc",41103000,"Laboratory cooling equipment",
+"unspsc",41103001,"Refrigerated cooling plate probes",
+"unspsc",41103003,"Cryostats",
+"unspsc",41103004,"Fan circulated ovens",
+"unspsc",41103005,"Ultra cold or ultralow upright cabinets or freezers",
+"unspsc",41103006,"Cryogenic or liquid nitrogen freezers",
+"unspsc",41103007,"Chilling units or cold water circulators",
+"unspsc",41103008,"Refrigerated cooling modules",
+"unspsc",41103010,"Blood bank refrigerators",
+"unspsc",41103011,"General purpose refrigerators or refrigerator freezers",
+"unspsc",41103012,"Flammable material storage refrigerators or refrigerator freezers",
+"unspsc",41103013,"Explosion proof refrigerators or refrigerator freezers",
+"unspsc",41103014,"Chromatography refrigerators",
+"unspsc",41103015,"Blood bank freezers",
+"unspsc",41103017,"Flammable material storage freezers",
+"unspsc",41103019,"Plasma storage freezers",
+"unspsc",41103020,"Ultra cold or ultralow chest freezers",
+"unspsc",41103021,"Laboratory plate freezers",
+"unspsc",41103022,"Cool transport or storage",
+"unspsc",41103023,"Laboratory chillers",
+"unspsc",41103024,"Cold traps",
+"unspsc",41103025,"Laboratory cooling equipment accessories",
+"unspsc",41103200,"Laboratory washing and cleaning equipment",
+"unspsc",41103201,"Chemical engineering washers",
+"unspsc",41103202,"Laboratory washing machines",
+"unspsc",41103203,"Pipette washers",
+"unspsc",41103205,"Washing machine racks or accessories",
+"unspsc",41103206,"Laboratory washing detergents",
+"unspsc",41103207,"Microplate washers",
+"unspsc",41103208,"Blood bank cell washers",
+"unspsc",41103209,"Laboratory wash bottles",
+"unspsc",41103210,"Laboratory ultraviolet UV sterilizers",
+"unspsc",41103300,"Fluid mechanics equipment",
+"unspsc",41103301,"Liquid scintillation counters",
+"unspsc",41103302,"Battery acid hydrometers",
+"unspsc",41103303,"Densitometers",
+"unspsc",41103305,"High vacuum equipment",
+"unspsc",41103306,"Pneumatic vacuum equipment",
+"unspsc",41103307,"Vacuum or mercury vapour equipment",
+"unspsc",41103308,"High vacuum combustion apparatus",
+"unspsc",41103309,"Flow injection analysis equipment",
+"unspsc",41103310,"Gas or vapour concentration measuring instruments",
+"unspsc",41103311,"Manometers",
+"unspsc",41103312,"Viscosimeters",
+"unspsc",41103313,"Depth indicators",
+"unspsc",41103314,"Microscopic structure estimation apparatus",
+"unspsc",41103315,"Solution strength estimation apparatus",
+"unspsc",41103316,"Pycnometers",
+"unspsc",41103317,"Surface tension measuring instruments",
+"unspsc",41103318,"Nuclear densitometer",
+"unspsc",41103400,"Laboratory environmental conditioning equipment",
+"unspsc",41103401,"Contamination control screens",
+"unspsc",41103403,"Microbiological aircontrol equipment",
+"unspsc",41103406,"Isolation glove boxes",
+"unspsc",41103407,"Anaerobic chamber",
+"unspsc",41103408,"Refrigerated reach in environmental or growth chambers",
+"unspsc",41103409,"Heated reach in environmental or growth chambers",
+"unspsc",41103410,"Refrigerated and heated reach in environmental or growth chambers",
+"unspsc",41103411,"Refrigerated walk in environmental or growth chambers",
+"unspsc",41103412,"Heated walk in environmental or growth chambers",
+"unspsc",41103413,"Refrigerated and heated walk in environmental or growth chambers",
+"unspsc",41103414,"Laboratory environmental conditioning equipment accessories",
+"unspsc",41103415,"Clean benches",
+"unspsc",41103500,"Laboratory enclosures and accessories",
+"unspsc",41103501,"Ebuliometer",
+"unspsc",41103502,"Fume hoods or cupboards",
+"unspsc",41103504,"Laminar flow cabinets or stations",
+"unspsc",41103506,"PCR enclosures",
+"unspsc",41103507,"HEPA filtered enclosures",
+"unspsc",41103508,"Carbon filtered enclosures",
+"unspsc",41103509,"Laboratory scrubbers",
+"unspsc",41103510,"Laboratory blowers",
+"unspsc",41103511,"Laboratory enclosure accessories",
+"unspsc",41103512,"Static eliminators",
+"unspsc",41103513,"Tissue culture enclosures",
+"unspsc",41103700,"Laboratory baths",
+"unspsc",41103701,"Circulating baths",
+"unspsc",41103702,"Thermostatic baths",
+"unspsc",41103703,"Multiple baths",
+"unspsc",41103704,"Biological baths",
+"unspsc",41103705,"Organ baths",
+"unspsc",41103706,"Water baths",
+"unspsc",41103707,"Oil baths",
+"unspsc",41103708,"Sand baths",
+"unspsc",41103709,"Refrigerated baths",
+"unspsc",41103710,"Orbital shaking water baths",
+"unspsc",41103711,"Reciprocating shaking water baths",
+"unspsc",41103712,"Immersion circulators",
+"unspsc",41103713,"Viscosity baths",
+"unspsc",41103714,"Tissue flotation baths",
+"unspsc",41103715,"Laboratory bath accessories or supplies",
+"unspsc",41103800,"Laboratory mixing and stirring and shaking equipment and supplies",
+"unspsc",41103801,"Laboratory mixers",
+"unspsc",41103802,"Roller mixers",
+"unspsc",41103803,"Stirring tables",
+"unspsc",41103804,"Multi bank or flocculation equipment",
+"unspsc",41103805,"Laboratory vibrators",
+"unspsc",41103806,"Magnetic stirrers",
+"unspsc",41103807,"Laboratory touch mixers",
+"unspsc",41103808,"Platelet mixers",
+"unspsc",41103809,"Hematology or chemistry mixers",
+"unspsc",41103810,"Overhead stirrers",
+"unspsc",41103811,"Orbital shakers",
+"unspsc",41103812,"Reciprocal shakers",
+"unspsc",41103813,"Rotating shakers",
+"unspsc",41103814,"Vortex mixers",
+"unspsc",41103815,"Tube rotators",
+"unspsc",41103816,"Mixer or shaker accessories or attachments",
+"unspsc",41103900,"Laboratory centrifuges and accessories",
+"unspsc",41103901,"Microcentrifuges",
+"unspsc",41103902,"Refrigerated microcentrifuges",
+"unspsc",41103903,"Benchtop centrifuges",
+"unspsc",41103904,"Refrigerated benchtop centrifuges",
+"unspsc",41103905,"Floor centrifuges",
+"unspsc",41103906,"Refrigerated floor centrifuges",
+"unspsc",41103907,"Ultracentrifuges",
+"unspsc",41103908,"Vacuum centrifuges",
+"unspsc",41103909,"Centrifuge rotors",
+"unspsc",41103910,"Centrifuge buckets",
+"unspsc",41103911,"Centrifuge adapters",
+"unspsc",41103912,"Centrifuge brushes",
+"unspsc",41103913,"Laboratory centrifuge accessories",
+"unspsc",41104000,"Sampling equipment",
+"unspsc",41104001,"Sample changers",
+"unspsc",41104002,"Sample oxidizer",
+"unspsc",41104003,"Sample preparation line",
+"unspsc",41104004,"Sample preparation bombs",
+"unspsc",41104005,"Laboratory bailers",
+"unspsc",41104006,"Coliwasas",
+"unspsc",41104007,"Water samplers",
+"unspsc",41104008,"Air samplers or collectors",
+"unspsc",41104009,"Air sampling pumps",
+"unspsc",41104010,"Reagent kits for use with air samplers",
+"unspsc",41104011,"Filters or other spare parts for samplers",
+"unspsc",41104012,"Dust fall holders or jars",
+"unspsc",41104013,"Sulphur dioxide or smoke samplers",
+"unspsc",41104014,"Sample applicators",
+"unspsc",41104015,"Plant samples analysis equipment",
+"unspsc",41104016,"Air pollutant samplers",
+"unspsc",41104017,"Sample holders",
+"unspsc",41104018,"Solid phase extraction preparations",
+"unspsc",41104019,"Sampling manifolds",
+"unspsc",41104020,"Calcine element flow tray",
+"unspsc",41104100,"Specimen collection and transport containers and supplies",
+"unspsc",41104101,"Slide or specimen mailers or shippers",
+"unspsc",41104102,"Lancets",
+"unspsc",41104103,"Heel warmers",
+"unspsc",41104104,"Tourniquets",
+"unspsc",41104105,"Specimen collection or transport bags",
+"unspsc",41104106,"Phlebotomy trays or accessories",
+"unspsc",41104107,"Vacuum blood collection tubes or containers",
+"unspsc",41104108,"Non vacuum blood collection tubes or containers",
+"unspsc",41104109,"Blood unit collection bags",
+"unspsc",41104110,"Blood culture bottles",
+"unspsc",41104111,"Cytology collection kits or containers",
+"unspsc",41104112,"Urine collection containers",
+"unspsc",41104114,"Frepp Sepp collection containers",
+"unspsc",41104115,"Serum Filter collection containers",
+"unspsc",41104116,"Swab collection or transport containers",
+"unspsc",41104117,"Specimen holders",
+"unspsc",41104118,"Specimen collectors",
+"unspsc",41104119,"Bone tissue collection containers",
+"unspsc",41104120,"Sedimentation rate tubes",
+"unspsc",41104121,"Stool collection containers with media",
+"unspsc",41104122,"Stool collection containers without media",
+"unspsc",41104123,"Sputum collection apparatus or containers",
+"unspsc",41104124,"Laboratory bone marrow biopsy trays",
+"unspsc",41104200,"Laboratory water purification equipment and supplies",
+"unspsc",41104201,"Water purification reagents",
+"unspsc",41104202,"Deionization or demineralization equipment",
+"unspsc",41104203,"Base exchange equipment",
+"unspsc",41104204,"Reverse osmosis equipment",
+"unspsc",41104205,"Ultra violet water purification units",
+"unspsc",41104206,"Ultra pure water systems",
+"unspsc",41104207,"Water analysis systems",
+"unspsc",41104208,"Dehydrators",
+"unspsc",41104209,"Deoxiders",
+"unspsc",41104210,"Dissolvers",
+"unspsc",41104211,"Softeners",
+"unspsc",41104212,"Water filtration cartridges",
+"unspsc",41104300,"Fermentation equipment",
+"unspsc",41104301,"Standard fermentation units",
+"unspsc",41104302,"Continuous culture apparatus",
+"unspsc",41104303,"Anaerobic jars or accessories",
+"unspsc",41104304,"Digestion systems",
+"unspsc",41104305,"Inspissators",
+"unspsc",41104306,"In vitro culture equipment",
+"unspsc",41104307,"Microbiology fermentation equipment",
+"unspsc",41104308,"Anaerobic environmental culture systems or supplies",
+"unspsc",41104400,"Laboratory incubating equipment",
+"unspsc",41104401,"Gravity convection general purpose incubators",
+"unspsc",41104402,"Forced air or mechanical convection general purpose incubators",
+"unspsc",41104403,"Tissue culture incubators",
+"unspsc",41104404,"Cooled biological oxygen demand BOD incubators",
+"unspsc",41104405,"Shaking incubators",
+"unspsc",41104406,"Plate incubators",
+"unspsc",41104407,"Water jacketed single chamber carbon dioxide incubators",
+"unspsc",41104408,"Water jacketed dual chamber carbon dioxide incubators",
+"unspsc",41104409,"Water jacketed single chamber carbon dioxide incubators with humidity control",
+"unspsc",41104410,"Water jacketed dual chamber carbon dioxide incubators with humidity control",
+"unspsc",41104411,"Dry wall single chamber carbon dioxide incubators",
+"unspsc",41104412,"Dry wall dual chamber carbon dioxide incubators",
+"unspsc",41104413,"Dry wall single chamber carbon dioxide incubators with humidity control",
+"unspsc",41104414,"Dry wall dual chamber carbon dioxide incubators with humidity control",
+"unspsc",41104415,"Water jacketed single chamber three gas incubators",
+"unspsc",41104416,"Water jacketed dual chamber three gas incubators",
+"unspsc",41104417,"Water jacketed single chamber three gas incubators with humidity control",
+"unspsc",41104418,"Water jacketed dual chamber three gas incubators with humidity control",
+"unspsc",41104419,"Dry wall single chamber three gas incubators",
+"unspsc",41104420,"Dry wall dual chamber three gas incubators",
+"unspsc",41104421,"Dry wall single chamber three gas incubators with humidity control",
+"unspsc",41104422,"Dry wall dual chamber three gas incubators with humidity control",
+"unspsc",41104423,"Refrigerated incubators",
+"unspsc",41104424,"Incubator accessories",
+"unspsc",41104500,"Laboratory ovens and accessories",
+"unspsc",41104501,"Laboratory mechanical convection ovens",
+"unspsc",41104502,"Gravity convection ovens",
+"unspsc",41104503,"Ageing ovens",
+"unspsc",41104504,"Cleanroom ovens",
+"unspsc",41104505,"Laboratory quartz oven pots",
+"unspsc",41104506,"Laboratory safety ovens",
+"unspsc",41104507,"Laboratory microwave ovens",
+"unspsc",41104508,"Induction dryers",
+"unspsc",41104509,"Vacuum ovens",
+"unspsc",41104510,"Drying cabinets or ovens",
+"unspsc",41104511,"Hybridization ovens or incubators",
+"unspsc",41104512,"Laboratory oven accessories",
+"unspsc",41104600,"Laboratory furnaces and accessories",
+"unspsc",41104601,"Laboratory box furnaces",
+"unspsc",41104602,"Programmable box furnaces",
+"unspsc",41104603,"Tube furnaces",
+"unspsc",41104604,"Programmable tube furnaces",
+"unspsc",41104605,"Crucible furnaces",
+"unspsc",41104606,"Programmable crucible furnaces",
+"unspsc",41104607,"Furnace control console",
+"unspsc",41104608,"Programmable furnace control console",
+"unspsc",41104609,"Laboratory safety furnaces",
+"unspsc",41104610,"Laboratory furnace hearthplates",
+"unspsc",41104611,"Laboratory furnace replacement insulation",
+"unspsc",41104612,"Laboratory furnace accessories",
+"unspsc",41104700,"Laboratory freeze dryers and lyopholizers and accessories",
+"unspsc",41104701,"Freeze dryers or lyopholizers",
+"unspsc",41104702,"Freeze dryer glassware",
+"unspsc",41104703,"Tray dryers",
+"unspsc",41104704,"Freeze dryer or lyopholizer accessories",
+"unspsc",41104800,"Laboratory decanting and distilling and evaporating and extracting equipment and supplies",
+"unspsc",41104801,"Flask or retort units",
+"unspsc",41104802,"Bi distillation units",
+"unspsc",41104803,"Laboratory evaporators",
+"unspsc",41104804,"Vacuum or rotary evaporators",
+"unspsc",41104805,"Nitrogen blowdown evaporators",
+"unspsc",41104806,"Extracting equipment for laboratories",
+"unspsc",41104807,"Fat extractors",
+"unspsc",41104808,"Crude fiber extractors",
+"unspsc",41104809,"Sedimentological analyzing unit",
+"unspsc",41104810,"Fractionation apparatus",
+"unspsc",41104811,"Density gradient fractionators",
+"unspsc",41104812,"Distillation pipings or columns or fittings",
+"unspsc",41104813,"Reflux components",
+"unspsc",41104814,"Laboratory heat exchange condensers",
+"unspsc",41104815,"Kjeldahl nitrogen determination apparatus",
+"unspsc",41104816,"Vacuum or centrifugal concentrators",
+"unspsc",41104817,"Extraction thimbles",
+"unspsc",41104900,"Laboratory filtering equipment and supplies",
+"unspsc",41104901,"Laboratory line filters",
+"unspsc",41104902,"Gel filtration equipment",
+"unspsc",41104903,"Ultra filtration equipment",
+"unspsc",41104904,"Sintered cell filters",
+"unspsc",41104905,"Thin channel filtration equipment",
+"unspsc",41104906,"Reverse osmosis filtration equipment",
+"unspsc",41104907,"Molecular filtration equipment",
+"unspsc",41104908,"Laboratory cartridge element filters",
+"unspsc",41104909,"Laboratory filter holders or cyclones",
+"unspsc",41104910,"Laboratory multi sheet or press filters",
+"unspsc",41104911,"Laboratory air filtration systems",
+"unspsc",41104912,"Fluid presses filter",
+"unspsc",41104913,"Bioseparation filters",
+"unspsc",41104914,"Bottletops or filtration cups",
+"unspsc",41104915,"Capsules filters",
+"unspsc",41104916,"Centrifugal filters",
+"unspsc",41104917,"Laboratory environmental filters",
+"unspsc",41104918,"Laboratory glass filters",
+"unspsc",41104919,"Laboratory HEPA filters",
+"unspsc",41104920,"Hybridization filters",
+"unspsc",41104921,"Laboratory membrane filters",
+"unspsc",41104922,"Syringe filters",
+"unspsc",41104923,"Multiwell plate filters",
+"unspsc",41104924,"Microbiology filters",
+"unspsc",41104925,"Laboratory filtration hardware or accessories",
+"unspsc",41104926,"Silica bed filter",
+"unspsc",41104927,"Filter support screens",
+"unspsc",41104928,"Laboratory bottle receiver",
+"unspsc",41104929,"Laboratory filter papers",
+"unspsc",41105000,"Laboratory sieves and sifting equipment and supplies",
+"unspsc",41105001,"Laboratory separators",
+"unspsc",41105002,"Laboratory sifting equipment",
+"unspsc",41105003,"Test sieves",
+"unspsc",41105100,"Laboratory pumps and tubing",
+"unspsc",41105101,"Laboratory vacuum pumps",
+"unspsc",41105102,"Peristaltic pumps",
+"unspsc",41105103,"Laboratory centrifugal pumps",
+"unspsc",41105104,"Syringe pumps",
+"unspsc",41105105,"Metering pumps",
+"unspsc",41105106,"Chromatography pumps",
+"unspsc",41105107,"Laboratory drum pumps",
+"unspsc",41105108,"Laboratory general purpose tubing",
+"unspsc",41105109,"Rotary vane pumps",
+"unspsc",41105200,"Laboratory slide stainer equipment and accessories",
+"unspsc",41105201,"Histology or cytology slide stainers",
+"unspsc",41105202,"Hematology slide stainers",
+"unspsc",41105203,"Microbiology slide stainers",
+"unspsc",41105204,"Laboratory slide stainer accessories",
+"unspsc",41105205,"Microslide making equipment",
+"unspsc",41105300,"Laboratory electrophoresis and blotting system and supplies",
+"unspsc",41105301,"Gel boxes",
+"unspsc",41105302,"Gel dryers",
+"unspsc",41105303,"Electrophoresis system power supplies",
+"unspsc",41105304,"Transilluminators",
+"unspsc",41105305,"Electrophoresis system accessories",
+"unspsc",41105307,"Instrumentation for capillary electrophoresis",
+"unspsc",41105308,"Capillaries or cartridges",
+"unspsc",41105309,"Kits or reagents for capillary electrophoresis",
+"unspsc",41105310,"Blotting or transfer accessories",
+"unspsc",41105311,"Blotting or transfer apparatus",
+"unspsc",41105312,"Combs or plates or spacers or trays",
+"unspsc",41105313,"Cassettes or related detection accessories",
+"unspsc",41105314,"Gel documentation systems",
+"unspsc",41105315,"Gel documentation accessories",
+"unspsc",41105316,"Ultraviolet crosslinkers",
+"unspsc",41105317,"Agarose gel making reagents",
+"unspsc",41105318,"Agarose premade gels",
+"unspsc",41105319,"Polyacrylamide gel making reagents",
+"unspsc",41105320,"Polyacrylamide premade gels",
+"unspsc",41105321,"Nucleic acid gels stain",
+"unspsc",41105322,"Polyacrylamide gels stain",
+"unspsc",41105323,"Electrophoresis premade buffers or solutions",
+"unspsc",41105324,"Deoxyribonucleic acid DNA or ribonucleic acid RNA probes",
+"unspsc",41105325,"Microwells plates for deoxyribonucleic acid DNA or deoxyribonucleic acid DNA hybridization",
+"unspsc",41105326,"Hybridization reagents or buffers",
+"unspsc",41105327,"Conjugated nucleotides or oligomers",
+"unspsc",41105328,"Premade northern or southern or western blots",
+"unspsc",41105329,"Blocking agents",
+"unspsc",41105330,"Control proteins or cell lysates or tissue lysates",
+"unspsc",41105331,"Protein chemifluorescent detection reagents or kits or substrates",
+"unspsc",41105332,"Protein chemiluminescent detection reagents or kits or substrates",
+"unspsc",41105333,"Protein chromogenic detection reagents or kits or substrates",
+"unspsc",41105334,"Deoxyribonucleic acid DNA quantitation markers",
+"unspsc",41105335,"Deoxyribonucleic acid DNA size markers or standards",
+"unspsc",41105336,"Isoelectric focusing IEF markers",
+"unspsc",41105337,"Protein electrophoresis markers",
+"unspsc",41105338,"Ribonucleic acid RNA markers or standards",
+"unspsc",41105339,"Blotting membranes",
+"unspsc",41105500,"Nucleic acid extraction and purification and quantitation kits and components",
+"unspsc",41105501,"Deoxyribonucleic acid DNA cleanup or gel extraction kits",
+"unspsc",41105502,"Kits for deoxyribonucleic acid DNA extraction from food",
+"unspsc",41105503,"Electroelution systems",
+"unspsc",41105504,"Genomic deoxyribonucleic acid DNA purification kits",
+"unspsc",41105505,"High throughput screening HTS systems in nucleic acid purification",
+"unspsc",41105506,"Kits for purification of messenger ribonucleic acid mRNA",
+"unspsc",41105507,"Nucleic acid isolation magnetic beads",
+"unspsc",41105508,"Nucleic acids coprecipitants",
+"unspsc",41105509,"Nucleic acids quantitation kits",
+"unspsc",41105510,"Phage deoxyribonucleic acid DNA purification kits",
+"unspsc",41105511,"Kits for plasmids deoxyribonucleic acid DNA extraction from yeast",
+"unspsc",41105512,"Plasmids or cosmids or bacterial artificial chromosomes BAC purification kit",
+"unspsc",41105513,"Labeled nucleic acid purification kits",
+"unspsc",41105514,"Reagents for nucleic acid extraction or precipitation or resuspension",
+"unspsc",41105515,"Ribonucleic acid RNA cleanup or stabilization materials",
+"unspsc",41105516,"Ribonucleic acid RNA gel extraction kits",
+"unspsc",41105517,"Kits for nucleic acid extraction from plant cells or tissue",
+"unspsc",41105518,"Total ribonucleic acid RNA purification kits",
+"unspsc",41105519,"Viral deoxyribonucleic acid DNA purification kits",
+"unspsc",41105520,"Viral ribonucleic acid RNA purification kits",
+"unspsc",41105600,"Deoxyribonucleic acid DNA sequencing products",
+"unspsc",41105601,"Kits or enzymes for sequencing",
+"unspsc",41105700,"Gene arrays",
+"unspsc",41105701,"Acid nucleic immobilized on glass or nylon membranes",
+"unspsc",41105800,"In vitro transcription and translation products",
+"unspsc",41105801,"Oligomer conjugates or derivatives",
+"unspsc",41105802,"Ribonucleotides",
+"unspsc",41105803,"Transcription or translation systems or kits",
+"unspsc",41105804,"Translation labeling accessories",
+"unspsc",41105900,"Libraries and related materials",
+"unspsc",41105901,"Animal tissues or  bodily fluids",
+"unspsc",41105902,"Complementary deoxyribonucleic acid cDNA libraries",
+"unspsc",41105903,"Complementary deoxyribonucleic acid cDNA synthesis kits",
+"unspsc",41105904,"Genomic libraries",
+"unspsc",41105905,"Library construction kits",
+"unspsc",41105906,"Protein or peptide display libraries",
+"unspsc",41105907,"Two hybrid libraries or systems",
+"unspsc",41105908,"Viral packaging kits",
+"unspsc",41106000,"Nucleic acid labeling and detection systems",
+"unspsc",41106001,"Nucleic acid chemifluorescent detection materials",
+"unspsc",41106002,"Nucleic acid chemiluminescent detection materials",
+"unspsc",41106003,"Nucleic acid chromogenic detection materials",
+"unspsc",41106004,"Nucleic acid non radioactive labeling kits",
+"unspsc",41106005,"Nucleic acid radioactive labeling kits",
+"unspsc",41106006,"Radio nucleotides or nucleosides",
+"unspsc",41106100,"Deoxyribonucleic acid DNA analysis kits",
+"unspsc",41106101,"Cytogenetics kits",
+"unspsc",41106102,"Differential display or subtraction kits",
+"unspsc",41106103,"Deoxyribonucleic acid DNA typing kits",
+"unspsc",41106104,"Nuclease protection assays",
+"unspsc",41106200,"Microorganism propagation and transformation media and kits and equipment",
+"unspsc",41106201,"Antimycotics",
+"unspsc",41106202,"Bacteria competent cells",
+"unspsc",41106203,"Bacteria transformation kits",
+"unspsc",41106204,"Bottled agar media or stabs for bacteria",
+"unspsc",41106205,"Brent supplement mixtures for yeast",
+"unspsc",41106206,"Complete supplement mixtures for yeast",
+"unspsc",41106207,"Dictyostelium discoideum media",
+"unspsc",41106208,"Electroporation cuvettes",
+"unspsc",41106209,"Hollenberg supplement mixtures for yeast",
+"unspsc",41106210,"Media or supplements for schizosaccharomyces  pombe",
+"unspsc",41106211,"Media ingredients or additives schizosaccharomyces  pombe",
+"unspsc",41106212,"Media ingredients or additives for bacteria",
+"unspsc",41106213,"Premixed media dry",
+"unspsc",41106214,"Reagents for preparing competent bacteria",
+"unspsc",41106215,"Reagents for preparing competent yeast",
+"unspsc",41106216,"Rich media for yeast",
+"unspsc",41106217,"Specialty plates for bacteria",
+"unspsc",41106218,"Specialty premixed media dry",
+"unspsc",41106219,"Synthetic complete supplement mixtures for yeast",
+"unspsc",41106220,"Synthetic media for yeast",
+"unspsc",41106221,"Yeast competent cells",
+"unspsc",41106222,"Yeast transformation kits",
+"unspsc",41106223,"Yeast nitrogen bases YNB or yeast nitrogen base YNB variants",
+"unspsc",41106300,"Polymerase chain reaction PCR and reverse transcriptase polymerase chain reaction RT PCR products",
+"unspsc",41106301,"Deoxynucleotide triphosphates dNTPs",
+"unspsc",41106302,"Gene specific polymerase chain reaction PCR kits",
+"unspsc",41106303,"Kits for polymerase chain reaction PCR purification",
+"unspsc",41106304,"Kits for messenger ribonucleic acid mRNA quantitation by polymerase chain reaction PCR",
+"unspsc",41106305,"Nucleotides",
+"unspsc",41106306,"Polymerase chain reaction PCR buffers",
+"unspsc",41106307,"Polymerase chain reaction PCR optimizing products",
+"unspsc",41106308,"Polymerase chain reaction PCR or reverse transcriptase polymerase chain reaction RT PCR primers",
+"unspsc",41106309,"Premade complementary deoxyribonucleic acid cDNA",
+"unspsc",41106310,"Purified genomic deoxyribonucleic acids DNA",
+"unspsc",41106311,"Purified ribonucleic acids RNA",
+"unspsc",41106312,"Rapid amplification or complementary deoxyribonucleic acid ends RACE technology products",
+"unspsc",41106313,"Reverse transcriptase polymerase chain reaction RT PCR kits",
+"unspsc",41106314,"Thermostable deoxyribonucleic acid DNA polymerases or kits",
+"unspsc",41106400,"Primers  and linkers and adaptors",
+"unspsc",41106401,"Adaptors or linkers",
+"unspsc",41106402,"Miscellaneous primers",
+"unspsc",41106403,"Sequencing primers",
+"unspsc",41106500,"Protein expression products",
+"unspsc",41106501,"Bacterial expression kits",
+"unspsc",41106502,"Eucariotic transfection reagents",
+"unspsc",41106503,"Inducers or regulators",
+"unspsc",41106504,"Insect cells",
+"unspsc",41106505,"Insect expression  kits",
+"unspsc",41106506,"Insect media",
+"unspsc",41106507,"Insect medium supplements or reagents",
+"unspsc",41106508,"Mammalian cell expression  kits",
+"unspsc",41106509,"Mammalian cells",
+"unspsc",41106510,"Kits for protein extraction from mammalian cells or tissues",
+"unspsc",41106511,"Kits for protein extraction from bacteria",
+"unspsc",41106512,"Kits for protein extraction from yeast",
+"unspsc",41106513,"Reporter gene assay",
+"unspsc",41106514,"Stable mammalian cell lines",
+"unspsc",41106515,"Yeast expression kits",
+"unspsc",41106516,"Enzyme expression consumables",
+"unspsc",41106600,"Vectors",
+"unspsc",41106601,"Chromosome targeting vectors",
+"unspsc",41106602,"Bacterial expression vectors",
+"unspsc",41106603,"Cassette vectors",
+"unspsc",41106604,"Display vector maps or sequences",
+"unspsc",41106605,"Enzyme reporter vector maps or sequences",
+"unspsc",41106606,"Expression complementary deoxyribonucleic acid cDNA vectors",
+"unspsc",41106607,"Fluorescent protein vector maps or sequences",
+"unspsc",41106608,"Fusion vectors",
+"unspsc",41106609,"Gene targeting vectors",
+"unspsc",41106610,"General cloning vectors",
+"unspsc",41106611,"Hybrid system vectors or kits",
+"unspsc",41106612,"Insect expression vectors",
+"unspsc",41106613,"Library construction vectors",
+"unspsc",41106614,"Mammalian cell expression vectors",
+"unspsc",41106615,"Polymerase chain reaction PCR cloning vectors or kits",
+"unspsc",41106616,"Phage or viral deoxyribonucleic acids DNA",
+"unspsc",41106617,"Plasmid mutagenesis vectors or kits",
+"unspsc",41106618,"Recombination mediated cloning or expression products",
+"unspsc",41106619,"Sequencing vectors",
+"unspsc",41106620,"Signal transduction reporter vector maps or sequences",
+"unspsc",41106621,"Virus mediated expression vectors or kits",
+"unspsc",41106622,"Yeast expression vectors",
+"unspsc",41110000,"Measuring and observing and testing instruments",
+"unspsc",41111500,"Weight measuring instruments",
+"unspsc",41111501,"Electronic toploading balances",
+"unspsc",41111502,"Laboratory balances",
+"unspsc",41111503,"Mechanical balances",
+"unspsc",41111504,"Pull spring balances",
+"unspsc",41111505,"Calibration weights or weight sets",
+"unspsc",41111506,"Animal weighing scales",
+"unspsc",41111507,"Bench scales",
+"unspsc",41111508,"Bodyweight measuring scales",
+"unspsc",41111509,"Floor or platform scales",
+"unspsc",41111510,"Postal scales",
+"unspsc",41111511,"Truck or rail scales",
+"unspsc",41111512,"Triple beam balances",
+"unspsc",41111513,"Moisture balances",
+"unspsc",41111515,"Balance weighing containers or bowls or boats or papers",
+"unspsc",41111516,"Weight measuring instrument accessories",
+"unspsc",41111517,"Analytical balances",
+"unspsc",41111600,"Length and thickness and distance measuring instruments",
+"unspsc",41111601,"Micrometers",
+"unspsc",41111602,"Pedometers",
+"unspsc",41111603,"Rangefinders",
+"unspsc",41111604,"Rulers",
+"unspsc",41111605,"Strain gauges",
+"unspsc",41111606,"Tellurometers",
+"unspsc",41111607,"Thread counters or gauges",
+"unspsc",41111613,"Distance meters",
+"unspsc",41111614,"Height gauges",
+"unspsc",41111615,"Laser measuring systems",
+"unspsc",41111616,"Measuring wheels for distance",
+"unspsc",41111617,"Feeler gauges",
+"unspsc",41111618,"Gage block set",
+"unspsc",41111619,"Go or no go gauge",
+"unspsc",41111620,"Etalon wedge",
+"unspsc",41111621,"Calipers",
+"unspsc",41111622,"Micrometer calipers",
+"unspsc",41111623,"Thickness measuring devices",
+"unspsc",41111700,"Viewing and observing instruments and accessories",
+"unspsc",41111701,"Ion microscopes",
+"unspsc",41111702,"Monocular microscopes",
+"unspsc",41111703,"Stereo or dissecting light microscopes",
+"unspsc",41111704,"Illuminators for microscopes",
+"unspsc",41111705,"Microscope objectives",
+"unspsc",41111706,"Photo attachments for microscopes",
+"unspsc",41111707,"Profile projectors",
+"unspsc",41111708,"Video attachments for microscopes",
+"unspsc",41111709,"Binocular light compound microscopes",
+"unspsc",41111710,"Combination electron and light microscopes",
+"unspsc",41111711,"Electron microscopes",
+"unspsc",41111712,"Inverted microscopes",
+"unspsc",41111713,"Magnifiers",
+"unspsc",41111714,"Loupes",
+"unspsc",41111715,"Telescopes",
+"unspsc",41111716,"Borescope inspection equipment",
+"unspsc",41111717,"Binoculars",
+"unspsc",41111718,"Metallurgical microscopes",
+"unspsc",41111719,"Darkfield microscopes",
+"unspsc",41111720,"Scanning electron microscopes",
+"unspsc",41111721,"Transmission electron microscopes",
+"unspsc",41111722,"Fluorescent microscopes",
+"unspsc",41111723,"Scanning light or spinning disk or laser scanning microscopes",
+"unspsc",41111724,"Scanning probe microscopes",
+"unspsc",41111725,"Polarizing microscopes",
+"unspsc",41111726,"Acoustic microscopes",
+"unspsc",41111727,"Projection microscopes",
+"unspsc",41111728,"Wide field microscopes",
+"unspsc",41111729,"Microscope eyepieces",
+"unspsc",41111730,"Microscope condensers",
+"unspsc",41111731,"Microscope collectors",
+"unspsc",41111733,"Microscope tubes",
+"unspsc",41111734,"Microscope stages",
+"unspsc",41111735,"Automated microscope stages",
+"unspsc",41111736,"Microscope covers",
+"unspsc",41111737,"Videoscopes",
+"unspsc",41111738,"Fiberscopes",
+"unspsc",41111739,"Laboratory microscope replacement bulbs",
+"unspsc",41111800,"Non destructive examination equipment",
+"unspsc",41111801,"Eddy current examination equipment",
+"unspsc",41111802,"Liquid penetrant examination equipment",
+"unspsc",41111803,"Magnetic particle examination equipment",
+"unspsc",41111804,"Ultrasonic examination equipment",
+"unspsc",41111805,"CO 60 radiography examination equipment",
+"unspsc",41111806,"CS 137 radiography examination equipment",
+"unspsc",41111807,"IR 192 radiography examination equipment",
+"unspsc",41111808,"X ray radiography examination equipment",
+"unspsc",41111809,"Leak testing equipment",
+"unspsc",41111900,"Indicating and recording instruments",
+"unspsc",41111901,"Counters",
+"unspsc",41111902,"Electronic counters",
+"unspsc",41111903,"Metal detectors",
+"unspsc",41111904,"Electronic columns",
+"unspsc",41111905,"Electronic measuring probes",
+"unspsc",41111906,"Chart recorders",
+"unspsc",41111907,"Digital readout recorders",
+"unspsc",41111908,"Graphic recorders",
+"unspsc",41111909,"Magnetic tape recorders",
+"unspsc",41111910,"Multipen recorders",
+"unspsc",41111911,"Oscillographic recorders",
+"unspsc",41111912,"Physiological recorders",
+"unspsc",41111913,"Point plotting recorders",
+"unspsc",41111914,"Servo recorders",
+"unspsc",41111915,"Bi metallic sensors",
+"unspsc",41111916,"Non contact sensors",
+"unspsc",41111917,"Digital testers",
+"unspsc",41111918,"Gyroscopic instruments",
+"unspsc",41111919,"Detection apparatus for non metallic objects",
+"unspsc",41111920,"Coordinate measuring machines CMM",
+"unspsc",41111921,"Speed sensors",
+"unspsc",41111922,"Lamp failure sensor",
+"unspsc",41111923,"Pre ignition knock sensor",
+"unspsc",41111924,"Oxygen sensors",
+"unspsc",41111926,"Proximity sensors",
+"unspsc",41111927,"Pressure sensors",
+"unspsc",41111928,"Current sensors",
+"unspsc",41111929,"Radiation detectors",
+"unspsc",41111930,"Electrical power sensors",
+"unspsc",41111931,"Flow sensors",
+"unspsc",41111932,"Liquid leak detectors",
+"unspsc",41111933,"Electrical charge sensors",
+"unspsc",41111934,"Force or torque sensors",
+"unspsc",41111935,"Tilt sensors",
+"unspsc",41111936,"Complementary metal oxide semiconductor CMOS image sensors",
+"unspsc",41111937,"Rotary position sensors",
+"unspsc",41111938,"Level sensors or transmitters",
+"unspsc",41111939,"Acoustic sensors",
+"unspsc",41111940,"Color sensors",
+"unspsc",41111941,"Olfactory sensors",
+"unspsc",41111942,"Opacity or dust or visibility sensors",
+"unspsc",41111943,"Electrical resistance or conductance sensors",
+"unspsc",41111944,"Electrical admittance sensors",
+"unspsc",41111945,"Linear position sensors",
+"unspsc",41111946,"Electrical inductance sensors",
+"unspsc",41111947,"Chart recorder pens",
+"unspsc",41111948,"Manual or electronic hematology differential cell counters",
+"unspsc",41112100,"Transducers",
+"unspsc",41112101,"Piezo electric crystals",
+"unspsc",41112103,"Fiber sensors",
+"unspsc",41112104,"Audio transducers",
+"unspsc",41112105,"Temperature transmitters",
+"unspsc",41112106,"Humidity transmitters",
+"unspsc",41112107,"Electro pneumatic transducers",
+"unspsc",41112108,"Loadcells",
+"unspsc",41112200,"Temperature and heat measuring instruments",
+"unspsc",41112201,"Calorimeters",
+"unspsc",41112202,"Heat tracing equipment",
+"unspsc",41112203,"Melting point recorders",
+"unspsc",41112204,"Pyrometers",
+"unspsc",41112205,"Temperature regulators",
+"unspsc",41112206,"Thermocouples",
+"unspsc",41112207,"Thermographs",
+"unspsc",41112209,"Thermostats",
+"unspsc",41112210,"Remote reading thermometers",
+"unspsc",41112211,"Resistance thermometers",
+"unspsc",41112212,"Surface thermometers",
+"unspsc",41112213,"Handheld thermometer",
+"unspsc",41112214,"Cryogenic temperature controllers",
+"unspsc",41112215,"Humidifier temperature controllers",
+"unspsc",41112216,"Thermowells",
+"unspsc",41112217,"Thermoheads",
+"unspsc",41112218,"Oscillographic recorders",
+"unspsc",41112219,"Thermocouple probes",
+"unspsc",41112220,"Laboratory freezer or refrigerator thermometers",
+"unspsc",41112221,"Laboratory incubator thermometers",
+"unspsc",41112300,"Humidity and moisture measuring instruments",
+"unspsc",41112301,"Hygrometers",
+"unspsc",41112302,"Psychrometers",
+"unspsc",41112303,"Temperature humidity testers",
+"unspsc",41112304,"Moisture meters",
+"unspsc",41112400,"Pressure measuring and control instruments",
+"unspsc",41112401,"Depth gauges",
+"unspsc",41112402,"Manostats",
+"unspsc",41112403,"Pressure indicators",
+"unspsc",41112404,"Pressure regulator",
+"unspsc",41112405,"Pressure or vacuum recorders",
+"unspsc",41112406,"Vacuum gauges",
+"unspsc",41112407,"Liquid level controls or instruments",
+"unspsc",41112408,"Pressure intensifiers",
+"unspsc",41112409,"Pressure scanners",
+"unspsc",41112410,"Pressure transmitters",
+"unspsc",41112411,"Pressure controllers",
+"unspsc",41112500,"Liquid and gas flow measuring and observing instruments",
+"unspsc",41112501,"Flowmeters",
+"unspsc",41112502,"Rheometers",
+"unspsc",41112503,"Rotameters",
+"unspsc",41112504,"Water meters",
+"unspsc",41112505,"Water meter spares",
+"unspsc",41112506,"Venturis",
+"unspsc",41112508,"Gas gauges",
+"unspsc",41112509,"Air velocity and temperature monitors",
+"unspsc",41112510,"Sight flow indicators",
+"unspsc",41112511,"Sight flow windows",
+"unspsc",41112512,"Flow computers or totalizers",
+"unspsc",41112513,"Orifice plate",
+"unspsc",41112514,"Oil gauges",
+"unspsc",41112516,"Flow transmitters",
+"unspsc",41112600,"Hygiene monitoring and testing equipment",
+"unspsc",41112601,"Manual swab test kits",
+"unspsc",41112602,"Automated swab test kits",
+"unspsc",41112700,"Seed and feed equipment",
+"unspsc",41112701,"Grain analyzers",
+"unspsc",41112702,"Seed counters",
+"unspsc",41112704,"Feed analyzers",
+"unspsc",41112800,"Transportation related equipment and instruments",
+"unspsc",41112801,"Speedometers",
+"unspsc",41112802,"Tachometers",
+"unspsc",41112803,"Tachometer disks",
+"unspsc",41112900,"Navigational equipment and instruments",
+"unspsc",41112901,"Direction finding compasses",
+"unspsc",41112902,"Radio navigation instruments",
+"unspsc",41112903,"Sextants",
+"unspsc",41112904,"Complex controlling devices",
+"unspsc",41113000,"Chemical evaluation instruments and supplies",
+"unspsc",41113001,"Digital Analyzer controllers",
+"unspsc",41113002,"Chemiluminescence or bioluminescence analyzers",
+"unspsc",41113003,"Electrogravimetry analyzers",
+"unspsc",41113004,"Flame ionization analyzers",
+"unspsc",41113005,"Ion analyzers",
+"unspsc",41113006,"Radiometry analyzers",
+"unspsc",41113007,"Random access analyzers",
+"unspsc",41113008,"Cintigraphic analyzers",
+"unspsc",41113009,"Thermal differential analyzers",
+"unspsc",41113010,"Thermo gravimetry analyzers",
+"unspsc",41113023,"Gel partition equipment",
+"unspsc",41113024,"Hydrometers",
+"unspsc",41113025,"Monochromators",
+"unspsc",41113026,"Nephelometers",
+"unspsc",41113027,"Osmometers",
+"unspsc",41113029,"Polarographs",
+"unspsc",41113030,"Radiochromatographic scanner",
+"unspsc",41113031,"Saccharometers",
+"unspsc",41113033,"Volumeters",
+"unspsc",41113034,"pH test strips or papers",
+"unspsc",41113035,"Chemical test strips or papers",
+"unspsc",41113036,"Microplates",
+"unspsc",41113037,"Microplate readers",
+"unspsc",41113100,"Gas analyzers and monitors",
+"unspsc",41113101,"Automotive exhaust emission analyzers",
+"unspsc",41113102,"Catalytic combustion analyzers",
+"unspsc",41113103,"Chemical absorption gas analyzers",
+"unspsc",41113104,"Explosimeters",
+"unspsc",41113105,"Hydrocarbons analyzers or detectors",
+"unspsc",41113106,"Infra red or ultra violet absorption analyzers",
+"unspsc",41113107,"Nitrogen gas analyzers",
+"unspsc",41113108,"Nitrogen oxide analyzers",
+"unspsc",41113109,"ORSAT equipment",
+"unspsc",41113110,"Oxygen gas analyzers",
+"unspsc",41113111,"Ozone analyzers",
+"unspsc",41113112,"Paramagnetic susceptibility analyzers",
+"unspsc",41113113,"Sulfur dioxide analyzers or detectors",
+"unspsc",41113114,"Thermal conductivity analyzers",
+"unspsc",41113115,"Radon detectors",
+"unspsc",41113116,"Gas detector tubes",
+"unspsc",41113117,"Single gas monitors",
+"unspsc",41113118,"Multi gas monitors",
+"unspsc",41113119,"Dissolved carbon dioxide analyzers",
+"unspsc",41113300,"Liquid and solid and elemental analyzers",
+"unspsc",41113301,"Acid or base analyzers",
+"unspsc",41113302,"Albuminometers",
+"unspsc",41113304,"Bauxite analyzers",
+"unspsc",41113305,"Calcium analyzers",
+"unspsc",41113306,"Chloride analyzers",
+"unspsc",41113308,"Electrolyte analyzers",
+"unspsc",41113309,"Enzyme analyzers",
+"unspsc",41113310,"Fatty acid analyzers",
+"unspsc",41113311,"Halide detector lamp",
+"unspsc",41113312,"Lactate analyzers",
+"unspsc",41113313,"Mineral oil testing instruments",
+"unspsc",41113314,"Oil content monitors analyzers",
+"unspsc",41113315,"Organic carbon analyzers",
+"unspsc",41113316,"Petroleum testing equipment",
+"unspsc",41113318,"Uranium analyzers",
+"unspsc",41113319,"Water analyzers",
+"unspsc",41113320,"Lubricating oil testing kit",
+"unspsc",41113321,"Paint tester",
+"unspsc",41113322,"Nitrogen or nitrate or nitrite analyzer",
+"unspsc",41113323,"Sugar analyzers",
+"unspsc",41113400,"Nuclear evaluation instruments",
+"unspsc",41113401,"Alpha counters",
+"unspsc",41113402,"Alpha beta counters",
+"unspsc",41113403,"Beta counters",
+"unspsc",41113404,"Beta gamma counters",
+"unspsc",41113405,"Gamma counters",
+"unspsc",41113406,"KVP meters",
+"unspsc",41113407,"X ray microanalysers",
+"unspsc",41113600,"Electrical measuring and testing equipment",
+"unspsc",41113601,"Ammeters",
+"unspsc",41113602,"Phasemeters",
+"unspsc",41113603,"Laboratory bridges",
+"unspsc",41113604,"Capacitance meters",
+"unspsc",41113605,"Thermoanalysis derivatographs",
+"unspsc",41113606,"Freeze watch indicators",
+"unspsc",41113607,"Heat stress monitors",
+"unspsc",41113608,"Coincidence or anticoincidence counters",
+"unspsc",41113611,"Cross talk meters",
+"unspsc",41113612,"Earth resistance testers",
+"unspsc",41113613,"Electrical value recorders",
+"unspsc",41113614,"Electromagnetic field meters",
+"unspsc",41113615,"Electrometers",
+"unspsc",41113616,"Electronic loads",
+"unspsc",41113617,"Field strength measuring equipment",
+"unspsc",41113618,"Gain measuring instruments",
+"unspsc",41113619,"Galvanometers",
+"unspsc",41113620,"High voltage cable detection",
+"unspsc",41113621,"Impedance meters",
+"unspsc",41113622,"Calibrated inductance coils or boxes",
+"unspsc",41113623,"Insulation resistance meters",
+"unspsc",41113624,"Insulation testers",
+"unspsc",41113625,"Ionization chambers",
+"unspsc",41113626,"Ionmeters",
+"unspsc",41113627,"Line earth loop testers",
+"unspsc",41113628,"Megohmmeters",
+"unspsc",41113629,"Microwave leakage meters",
+"unspsc",41113630,"Multimeters",
+"unspsc",41113631,"Ohmmeters",
+"unspsc",41113632,"Oscillographs",
+"unspsc",41113633,"Potentiometers",
+"unspsc",41113634,"Q Meters",
+"unspsc",41113635,"Calibrated resistance measuring equipment",
+"unspsc",41113636,"Level generators",
+"unspsc",41113637,"Voltage or current meters",
+"unspsc",41113638,"Oscilloscopes",
+"unspsc",41113639,"Accelerometers",
+"unspsc",41113640,"Wattmeters",
+"unspsc",41113641,"GFI circuit testers",
+"unspsc",41113642,"Circuit tester",
+"unspsc",41113643,"Demand meters or registers",
+"unspsc",41113644,"Circuit tracers",
+"unspsc",41113645,"Earth leakage devices",
+"unspsc",41113646,"Temperature calibrator or simulator",
+"unspsc",41113647,"Frequency calibrator or simulator",
+"unspsc",41113648,"Clamp On Multimeter",
+"unspsc",41113700,"Electronic and communication measuring and testing instruments",
+"unspsc",41113701,"Cathode ray tube tester",
+"unspsc",41113702,"Comparators",
+"unspsc",41113703,"Directional coupler",
+"unspsc",41113704,"Integrated circuit testers",
+"unspsc",41113705,"Logic state testers",
+"unspsc",41113706,"Semiconductor testers",
+"unspsc",41113707,"Transistor circuit testers",
+"unspsc",41113708,"Power meters",
+"unspsc",41113709,"Modulation meters",
+"unspsc",41113710,"Level meter",
+"unspsc",41113711,"Network analyzers",
+"unspsc",41113712,"Tape testers",
+"unspsc",41113713,"Tapespeed testers",
+"unspsc",41113714,"Differentiator",
+"unspsc",41113715,"Integrated services digital network ISDN testers",
+"unspsc",41113716,"Fiber optic fault locators",
+"unspsc",41113717,"Fiber optic test sources",
+"unspsc",41113718,"Protocol analyzers",
+"unspsc",41113800,"Geophysical and geotechnical instruments",
+"unspsc",41113801,"Geological compasses",
+"unspsc",41113802,"Geological prospecting apparatus",
+"unspsc",41113803,"Electromagnetic geophysical instruments",
+"unspsc",41113804,"Gravity geophysical instruments",
+"unspsc",41113805,"Induced polarization IP geophysical instruments",
+"unspsc",41113806,"Magnetometer geophysical instruments",
+"unspsc",41113807,"Resistivity geophysical instruments",
+"unspsc",41113808,"Gravimeters",
+"unspsc",41113900,"Soil measuring equipment",
+"unspsc",41113901,"Bore measuring instruments",
+"unspsc",41113902,"Dissolution or disintegration testers",
+"unspsc",41113903,"Particle size measuring apparatus",
+"unspsc",41113904,"Penetrometers",
+"unspsc",41113905,"Permeability testing apparatus",
+"unspsc",41113906,"Permeability or porosity estimation apparatus",
+"unspsc",41113907,"Porosimeters",
+"unspsc",41113908,"Sand testing apparatus",
+"unspsc",41113909,"Soil core sampling apparatus",
+"unspsc",41113910,"Soil testing kits",
+"unspsc",41114000,"Rock and strata measuring equipment",
+"unspsc",41114001,"Clinometers",
+"unspsc",41114100,"Seismological instruments",
+"unspsc",41114102,"Earthquake simulators",
+"unspsc",41114103,"Seismic alarm modules",
+"unspsc",41114104,"Seismic amplifiers",
+"unspsc",41114105,"Portable seismic apparatus",
+"unspsc",41114106,"Seismic recorders or seismographs",
+"unspsc",41114107,"Seismometers",
+"unspsc",41114108,"Vibrometers",
+"unspsc",41114200,"Land surveying instruments",
+"unspsc",41114201,"Measuring tapes",
+"unspsc",41114202,"Measuring rods",
+"unspsc",41114203,"Measuring tables",
+"unspsc",41114204,"Theodolites",
+"unspsc",41114205,"Location stake",
+"unspsc",41114206,"Location hub",
+"unspsc",41114300,"Hydrological instruments",
+"unspsc",41114301,"Open stream current meters",
+"unspsc",41114302,"Logging instruments for water wells",
+"unspsc",41114303,"Open stream water level recorders",
+"unspsc",41114400,"Meteorological instruments",
+"unspsc",41114401,"Anemometers",
+"unspsc",41114402,"Barometers",
+"unspsc",41114403,"Precipitation or evaporation recorders",
+"unspsc",41114404,"Radiosonde apparatus",
+"unspsc",41114405,"Rainfall recorders",
+"unspsc",41114406,"Precipitation or evaporation surface observing apparatus",
+"unspsc",41114407,"Solar radiation surface observing apparatus",
+"unspsc",41114408,"Temperature or humidity surface observing apparatus",
+"unspsc",41114409,"Wind surface observing apparatus",
+"unspsc",41114410,"Weather stations",
+"unspsc",41114411,"Meteorology instrument accessories",
+"unspsc",41114500,"Mechanical instruments",
+"unspsc",41114501,"Dynamometers",
+"unspsc",41114502,"Elastometers",
+"unspsc",41114503,"Extensometers",
+"unspsc",41114504,"Pitch measuring instruments",
+"unspsc",41114505,"Roundness testing instruments",
+"unspsc",41114506,"Spherometers",
+"unspsc",41114507,"Spring testing machines",
+"unspsc",41114508,"Surface testers",
+"unspsc",41114509,"Tensiometers",
+"unspsc",41114510,"Torque limiter",
+"unspsc",41114600,"Metals and metallurgy and structural materials testing instruments",
+"unspsc",41114601,"Abrasion testers",
+"unspsc",41114602,"Compression testers",
+"unspsc",41114603,"Concrete or cement testing instruments",
+"unspsc",41114604,"Corrosion testers",
+"unspsc",41114605,"Crack or corrosion detectors",
+"unspsc",41114606,"Creep testers",
+"unspsc",41114607,"Ductility testing machines",
+"unspsc",41114608,"Fatigue testers",
+"unspsc",41114609,"Forging testing apparatus",
+"unspsc",41114610,"Foundry testing apparatus",
+"unspsc",41114611,"Hardness testers",
+"unspsc",41114612,"Impact testers",
+"unspsc",41114613,"Load frame",
+"unspsc",41114614,"Metal testing instruments",
+"unspsc",41114615,"Photoelastic testing instruments",
+"unspsc",41114616,"Proofstress indicators",
+"unspsc",41114617,"Relaxation testers",
+"unspsc",41114618,"Roughness measuring instruments",
+"unspsc",41114619,"Shear strength testers",
+"unspsc",41114620,"Shock testing apparatus",
+"unspsc",41114621,"Tension testers",
+"unspsc",41114622,"Torsion testers",
+"unspsc",41114623,"Flexure or transverse testing machines",
+"unspsc",41114624,"Vibration testers",
+"unspsc",41114625,"Wear testers",
+"unspsc",41114626,"Welding testing apparatus",
+"unspsc",41114700,"Paper and wood and textile testing instruments",
+"unspsc",41114701,"Cardboard testing instruments",
+"unspsc",41114702,"Textiles fastness testers",
+"unspsc",41114703,"Leather testing instruments",
+"unspsc",41114704,"Paper testing instruments",
+"unspsc",41114705,"Textile testing instruments",
+"unspsc",41114706,"Wood testing instruments",
+"unspsc",41114800,"Ceramics and glass testing instruments",
+"unspsc",41114801,"Ceramics testing instruments",
+"unspsc",41114802,"Glass testing instruments",
+"unspsc",41114803,"Pottery testing instruments",
+"unspsc",41115100,"Coal and ore testing instruments",
+"unspsc",41115101,"Coal testing instruments",
+"unspsc",41115200,"Radar and sonar systems and components",
+"unspsc",41115201,"Radarbased surveillance systems",
+"unspsc",41115202,"Feed horns",
+"unspsc",41115300,"Light and wave generating and measuring equipment",
+"unspsc",41115301,"Light absorption meters",
+"unspsc",41115302,"Anechoic chambers",
+"unspsc",41115303,"Frequency analyzers",
+"unspsc",41115304,"Frequency counters or timer or dividers",
+"unspsc",41115305,"Electrical frequency meters",
+"unspsc",41115306,"Interferometers",
+"unspsc",41115307,"Lasers",
+"unspsc",41115308,"Lightmeters",
+"unspsc",41115309,"Luxmeters",
+"unspsc",41115310,"Optical calibration sets",
+"unspsc",41115311,"Photometers",
+"unspsc",41115312,"Bench refractometers or polarimeters",
+"unspsc",41115313,"Handheld refractometers or polarimeters",
+"unspsc",41115314,"Polarimeters",
+"unspsc",41115315,"Polariscopes",
+"unspsc",41115316,"Reflectometers",
+"unspsc",41115317,"Stroboscopes",
+"unspsc",41115318,"Colorimeters",
+"unspsc",41115319,"Tube or plate readers",
+"unspsc",41115320,"Signal generators",
+"unspsc",41115321,"Infrared imagers",
+"unspsc",41115322,"Laser beam analyzers",
+"unspsc",41115400,"Spectroscopic equipment",
+"unspsc",41115401,"Spectrofluorimeters or fluorimeters",
+"unspsc",41115402,"Spectrographs",
+"unspsc",41115403,"Spectrometers",
+"unspsc",41115404,"Mass spectrometers",
+"unspsc",41115405,"Proton spectrometers",
+"unspsc",41115406,"Spectrophotometers",
+"unspsc",41115407,"Atomic absorption AA spectrometers",
+"unspsc",41115408,"Infrared spectrometers",
+"unspsc",41115409,"Nuclear magnetic resonance NMR spectrometers",
+"unspsc",41115411,"Inductively coupled plasma ICP spectrometers",
+"unspsc",41115500,"Sound generating and measuring equipment",
+"unspsc",41115501,"Sonars",
+"unspsc",41115502,"Sonometers",
+"unspsc",41115503,"Sound measuring apparatus or decibel meter",
+"unspsc",41115504,"Sound velocity analyzers",
+"unspsc",41115505,"Acoustic testing rooms",
+"unspsc",41115600,"Electrochemical measuring instruments and accessories",
+"unspsc",41115601,"Karl Fischer titration equipment",
+"unspsc",41115602,"Titration equipment",
+"unspsc",41115603,"pH meters",
+"unspsc",41115604,"pH electrodes",
+"unspsc",41115606,"Ion selective electrode ISE meters",
+"unspsc",41115607,"Ion selective test strips",
+"unspsc",41115608,"Ion selective electrode",
+"unspsc",41115609,"Conductivity meters",
+"unspsc",41115610,"Conductivity cells",
+"unspsc",41115611,"Dissolved oxygen meters",
+"unspsc",41115612,"Dissolved oxygen probes",
+"unspsc",41115613,"Salinity meter",
+"unspsc",41115614,"pH transmitters",
+"unspsc",41115700,"Chromatographic measuring instruments and accessories",
+"unspsc",41115701,"Chromatographic detectors",
+"unspsc",41115702,"Chromatographic scanners",
+"unspsc",41115703,"Gas chromatographs",
+"unspsc",41115704,"Ion chromatographs",
+"unspsc",41115705,"Liquid chromatographs",
+"unspsc",41115706,"Thinlayer chromatographs",
+"unspsc",41115707,"High pressure liquid chromatograph chromatography",
+"unspsc",41115708,"High pressure thin layer chromatograph TLC",
+"unspsc",41115709,"High pressure liquid chromatography HPLC columns",
+"unspsc",41115710,"Gas chomatography GC columns",
+"unspsc",41115711,"Liquid chromatography LC columns",
+"unspsc",41115712,"Solid phase extraction SPE columns",
+"unspsc",41115713,"Thin layer chromatography tanks",
+"unspsc",41115714,"Autosamplers",
+"unspsc",41115715,"Injectors",
+"unspsc",41115716,"Liquid chromatography fittings",
+"unspsc",41115717,"Gas chromatography fittings",
+"unspsc",41115718,"Injector septa",
+"unspsc",41115719,"Gas chromatography liners",
+"unspsc",41115720,"Chromatography tubing",
+"unspsc",41115800,"Clinical and diagnostic analyzers and accessories and supplies",
+"unspsc",41115801,"Amino acid analyzers",
+"unspsc",41115802,"Amino acid analyzer accessories or supplies",
+"unspsc",41115803,"Blood bank analyzers",
+"unspsc",41115804,"Blood bank analyzer accessories or supplies",
+"unspsc",41115805,"Blood gas analyzers",
+"unspsc",41115806,"Blood gas analyzer accessories or supplies",
+"unspsc",41115807,"Chemistry analyzers",
+"unspsc",41115808,"Chemistry analyzer accessories or supplies",
+"unspsc",41115809,"Coagulation analyzers",
+"unspsc",41115810,"Coagulation analyzer accessories or supplies",
+"unspsc",41115811,"Deoxyribonucleic sequence analyzers",
+"unspsc",41115812,"Deoxyribonucleic sequence analyzer accessories or supplies",
+"unspsc",41115813,"Toxicology analyzers",
+"unspsc",41115814,"Toxicology analyzers accessories or supplies",
+"unspsc",41115815,"Hematology analyzers",
+"unspsc",41115816,"Hematology analyzer accessories or supplies",
+"unspsc",41115817,"Histology analyzers",
+"unspsc",41115818,"Histology analyzer accessories or supplies",
+"unspsc",41115819,"Immunology analyzers",
+"unspsc",41115820,"Immunology analyzer accessories or supplies",
+"unspsc",41115821,"Microbiology analyzers",
+"unspsc",41115822,"Microbiology analyzer accessories or supplies",
+"unspsc",41115823,"Protein analyzers",
+"unspsc",41115824,"Protein analyzer accessories or supplies",
+"unspsc",41115825,"Radioisotopic analyzers",
+"unspsc",41115826,"Radioisotopic analyzer accessories or supplies",
+"unspsc",41115827,"Urinalysis analyzers",
+"unspsc",41115828,"Urinalysis analyzer accessories or supplies",
+"unspsc",41115829,"Meat or dairy product analyzers",
+"unspsc",41115830,"Glucose analyzers",
+"unspsc",41116000,"Clinical and diagnostic analyzer reagents",
+"unspsc",41116001,"Amino acid analyzer reagents",
+"unspsc",41116002,"Blood bank analyzer reagents",
+"unspsc",41116003,"Blood gas analyzer reagents",
+"unspsc",41116004,"Chemistry analyzer reagents",
+"unspsc",41116005,"Coagulation analyzer reagents",
+"unspsc",41116006,"Deoxyribonucleic acid DNA sequence analyzer reagents",
+"unspsc",41116007,"Toxicology analyzer reagents",
+"unspsc",41116008,"Hematology analyzer reagents",
+"unspsc",41116009,"Histology analyzer reagents",
+"unspsc",41116010,"Immunology analyzer reagents",
+"unspsc",41116011,"Microbiology analyzer reagents",
+"unspsc",41116012,"Protein analyzer reagents",
+"unspsc",41116013,"Radioisotopic analyzer reagents",
+"unspsc",41116014,"Urinalysis analyzer reagents",
+"unspsc",41116015,"Flow cytometry analyzers reagents or antibodies",
+"unspsc",41116100,"Manual test kits and quality controls and calibrators and standards",
+"unspsc",41116101,"Blood bank test kits or supplies",
+"unspsc",41116102,"Blood bank reagents or solutions",
+"unspsc",41116103,"Blood bank quality controls or calibrators or standards",
+"unspsc",41116104,"Chemistry test kits or supplies",
+"unspsc",41116105,"Chemistry reagents or solutions",
+"unspsc",41116106,"Chemistry test strips or test paper",
+"unspsc",41116107,"Chemistry quality controls or calibrators or standards",
+"unspsc",41116108,"Coagulation test kits or supplies",
+"unspsc",41116109,"Coagulation reagents or solutions",
+"unspsc",41116110,"Coagulation quality controls or calibrators or standards",
+"unspsc",41116111,"Cytology test kits or supplies",
+"unspsc",41116112,"Cytology quality controls or calibrators or standards",
+"unspsc",41116113,"Cytology reagents or solutions or stains",
+"unspsc",41116116,"Environmental test kits or supplies",
+"unspsc",41116117,"Environmental reagents or solutions or stains",
+"unspsc",41116118,"Food test kits or supplies",
+"unspsc",41116119,"Food test kits reagents or solutions or stains",
+"unspsc",41116120,"Hematology test kits or supplies",
+"unspsc",41116121,"Hematology reagents or solutions or stains",
+"unspsc",41116122,"Hematology quality controls or calibrators or standards",
+"unspsc",41116123,"Histology test kits or supplies",
+"unspsc",41116124,"Histology reagents or solutions or stains",
+"unspsc",41116125,"Histology quality controls or calibrators or standards",
+"unspsc",41116126,"Immunology or serology test kits or supplies",
+"unspsc",41116127,"Immunology or serology reagents or solutions or stains",
+"unspsc",41116128,"Immunology or serology quality controls or calibrators or standards",
+"unspsc",41116129,"Microbiology or bacteriology test kits or supplies",
+"unspsc",41116130,"Microbiology or bacteriology reagents or solutions or stains",
+"unspsc",41116131,"Microbiology or bacteriology identification or sensitivity disks or panels",
+"unspsc",41116132,"Microbiology or bacteriology quality controls or calibrators or standards",
+"unspsc",41116133,"Molecular biology test kits or supplies",
+"unspsc",41116134,"Molecular biology reagents or solutions or stains",
+"unspsc",41116135,"Molecular biology quality controls or calibrators or standards",
+"unspsc",41116136,"Urinalysis test kits or supplies",
+"unspsc",41116137,"Urinalysis reagents or solutions or stains",
+"unspsc",41116138,"Urinalysis test strips",
+"unspsc",41116139,"Urinalysis quality controls or calibrators or standards",
+"unspsc",41116140,"Parasitology or mycology test kits or supplies",
+"unspsc",41116141,"Parasitology or mycology reagents or solutions or stains",
+"unspsc",41116142,"Parasitology or mycology media",
+"unspsc",41116143,"Parasitology or mycology quality controls or calibrators or standards",
+"unspsc",41116144,"Virology test kits or supplies",
+"unspsc",41116145,"Virology quality controls or calibrators or standards",
+"unspsc",41116146,"Toxicology test kits or supplies",
+"unspsc",41116147,"Toxicology quality controls or calibrators or standards",
+"unspsc",41116148,"Flow cytometry test kits or supplies",
+"unspsc",41116200,"Patient point of care testing supplies and equipment",
+"unspsc",41116201,"Glucose monitors or meters",
+"unspsc",41116202,"Cholesterol monitors or meters",
+"unspsc",41116203,"Monitor or meter accessories",
+"unspsc",41116205,"Rapid test kits",
+"unspsc",41116300,"Laboratory flash point testers",
+"unspsc",41116301,"Flash point testers",
+"unspsc",41116400,"Acceleration and vibration measuring instruments",
+"unspsc",41116401,"Impact hammers",
+"unspsc",41116500,"Instrument parts and accessories",
+"unspsc",41116501,"Meter dials or dial kits",
+"unspsc",41120000,"Laboratory supplies and fixtures",
+"unspsc",41121500,"Pipettes and liquid handling equipment and supplies",
+"unspsc",41121501,"Robotic or automated liquid handling systems",
+"unspsc",41121502,"Laboratory diluters",
+"unspsc",41121503,"Manual multichannel air displacement pipetters",
+"unspsc",41121504,"Manual single channel air displacement pipetters",
+"unspsc",41121505,"Manual single channel positive displacement pipetters",
+"unspsc",41121506,"Manual single channel repeating pipetters",
+"unspsc",41121507,"Electronic single channel pipetters",
+"unspsc",41121508,"Electronic multichannel pipetters",
+"unspsc",41121509,"Pasteur or transfer pipettes",
+"unspsc",41121510,"Volumetric pipettes",
+"unspsc",41121511,"Serological pipettes",
+"unspsc",41121513,"Dropping pipettes",
+"unspsc",41121514,"Pipette pumps",
+"unspsc",41121515,"Pipette bulbs",
+"unspsc",41121516,"Bottle top dispensers",
+"unspsc",41121517,"Pipetter inserts or accessories",
+"unspsc",41121600,"Pipette tips",
+"unspsc",41121601,"Filter tip pipette tips",
+"unspsc",41121602,"Aerosol barrier pipette tips",
+"unspsc",41121603,"Low retention pipette tips",
+"unspsc",41121604,"Reference pipette tips",
+"unspsc",41121605,"Ultramicro pipette tips",
+"unspsc",41121606,"Gel loading pipette tips",
+"unspsc",41121607,"Universal pipette tips",
+"unspsc",41121608,"Robotic pipette tips",
+"unspsc",41121609,"Variable volume pipette tips",
+"unspsc",41121700,"Test Tubes",
+"unspsc",41121701,"Multipurpose or general test tubes",
+"unspsc",41121702,"Microcentrifuge tubes",
+"unspsc",41121703,"Centrifuge tubes",
+"unspsc",41121704,"Cryogenic tubes",
+"unspsc",41121705,"Nuclear magnetic resonance NMR tubes",
+"unspsc",41121706,"Culture tubes",
+"unspsc",41121707,"Separator test tubes",
+"unspsc",41121708,"Anti coagulant test tubes",
+"unspsc",41121709,"Capillary or hematocrit tubes",
+"unspsc",41121710,"Test tube closures or caps",
+"unspsc",41121711,"Urinalysis testing tubes or accessories",
+"unspsc",41121800,"General laboratory glassware and plasticware and supplies",
+"unspsc",41121801,"Laboratory watch glasses",
+"unspsc",41121802,"Laboratory stirring rods",
+"unspsc",41121803,"Laboratory beakers",
+"unspsc",41121804,"Laboratory flasks",
+"unspsc",41121805,"Laboratory graduated cylinders",
+"unspsc",41121806,"Laboratory vials",
+"unspsc",41121807,"Laboratory ampoules",
+"unspsc",41121808,"Laboratory burets",
+"unspsc",41121809,"Laboratory funnels",
+"unspsc",41121810,"Laboratory staining dishes or jars",
+"unspsc",41121811,"Laboratory microchemistry kits",
+"unspsc",41121812,"Laboratory dishes",
+"unspsc",41121813,"Cuvettes",
+"unspsc",41121814,"Laboratory lids or covers or coverslips",
+"unspsc",41121815,"Laboratory adapters or connectors or fittings",
+"unspsc",41122000,"Laboratory or sampling syringes",
+"unspsc",41122001,"Chromatography syringes",
+"unspsc",41122002,"Chromatography syringe needles",
+"unspsc",41122003,"Syringe adapters or accessories",
+"unspsc",41122004,"Sampling syringes",
+"unspsc",41122100,"Tissue culture and high throughput screening supplies",
+"unspsc",41122101,"Petri plates or dishes",
+"unspsc",41122102,"Multiwell plates",
+"unspsc",41122103,"Cell scrapers",
+"unspsc",41122104,"Tissue culture flasks",
+"unspsc",41122105,"Roller bottles",
+"unspsc",41122106,"Inoculating devices",
+"unspsc",41122107,"Tissue culture coated plates or dishes or inserts",
+"unspsc",41122108,"Microbiology inoculation loops or needles",
+"unspsc",41122109,"Petri pads",
+"unspsc",41122110,"Petri pad dispenser",
+"unspsc",41122200,"Crucibles",
+"unspsc",41122201,"Glass crucibles",
+"unspsc",41122202,"Ceramic crucibles",
+"unspsc",41122203,"Metal crucibles",
+"unspsc",41122300,"Laboratory bench protectors and liners",
+"unspsc",41122301,"Bench protectors or liners",
+"unspsc",41122400,"Laboratory implements",
+"unspsc",41122401,"Magnetic spin bars or stir bars or stirring beads",
+"unspsc",41122402,"Magnetic spin bar retrievers or stir bar retrievers",
+"unspsc",41122403,"Laboratory spatulas",
+"unspsc",41122404,"Laboratory tongs",
+"unspsc",41122405,"Laboratory forceps",
+"unspsc",41122406,"Laboratory knives",
+"unspsc",41122407,"Laboratory scalpels",
+"unspsc",41122408,"Laboratory scissors",
+"unspsc",41122409,"Laboratory tools",
+"unspsc",41122410,"Laboratory sealing film",
+"unspsc",41122411,"Laboratory timers or watches",
+"unspsc",41122412,"Laboratory tube sealants",
+"unspsc",41122413,"Laboratory clamps",
+"unspsc",41122500,"Laboratory corks and stoppers and accessories",
+"unspsc",41122501,"Laboratory corks",
+"unspsc",41122502,"Laboratory stoppers",
+"unspsc",41122503,"Laboratory cork borers",
+"unspsc",41122600,"Laboratory microscope slides and supplies",
+"unspsc",41122601,"Microscope slides",
+"unspsc",41122602,"Microscopes slide coverslips",
+"unspsc",41122603,"Microscope lens paper",
+"unspsc",41122604,"Hemocytometers",
+"unspsc",41122605,"Microscope immersion oil",
+"unspsc",41122606,"Microscope slide dispensers",
+"unspsc",41122700,"Laboratory tapes and labels",
+"unspsc",41122701,"Slide or specimen labels",
+"unspsc",41122702,"Labeling tapes",
+"unspsc",41122703,"Safety tapes",
+"unspsc",41122704,"Tamper proof tapes",
+"unspsc",41122800,"Laboratory stands and racks and trays",
+"unspsc",41122801,"Pipette racks or stands",
+"unspsc",41122802,"Microscope slide racks",
+"unspsc",41122803,"Sedimentation tube racks or stands",
+"unspsc",41122804,"Test tube racks",
+"unspsc",41122805,"Drying racks",
+"unspsc",41122806,"Cryoracks",
+"unspsc",41122807,"Dissecting trays",
+"unspsc",41122808,"General purpose trays",
+"unspsc",41122809,"Petri dish racks",
+"unspsc",41123000,"Laboratory desiccators and desiccants",
+"unspsc",41123001,"Jar desiccators",
+"unspsc",41123002,"Cabinet desiccators",
+"unspsc",41123003,"Desiccants",
+"unspsc",41123004,"Vacuum desiccators",
+"unspsc",41123100,"Laboratory dialysis supplies",
+"unspsc",41123101,"Dialysis tubing",
+"unspsc",41123102,"Dialysis clamps",
+"unspsc",41123200,"Preserved specimens and supplies",
+"unspsc",41123201,"Preserved prepared slides",
+"unspsc",41123202,"Preserved animals and organisms",
+"unspsc",41123300,"General laboratory storage containers and cabinets",
+"unspsc",41123302,"Microscope slide boxes or folders",
+"unspsc",41123303,"Microscope slide cabinets",
+"unspsc",41123304,"Cryogenic storage boxes",
+"unspsc",41123305,"Histology or tissue cassette cabinets",
+"unspsc",41123400,"Dosing devices",
+"unspsc",41123401,"Dosing cups",
+"unspsc",41123402,"Dosing spoons",
+"unspsc",41123403,"Dosing droppers",
+"unspsc",42000000,"Medical Equipment and Accessories and Supplies",
+"unspsc",42120000,"Veterinary equipment and supplies",
+"unspsc",42121500,"Veterinary equipment",
+"unspsc",42121501,"Veterinary blood pressure testers",
+"unspsc",42121502,"Veterinary kymograph tester",
+"unspsc",42121503,"Veterinary pyrogenic tester",
+"unspsc",42121504,"Veterinary stereotoxic equipment",
+"unspsc",42121505,"Veterinary electrocardiograph ECG",
+"unspsc",42121506,"Veterinary surgical instrument sets",
+"unspsc",42121507,"Veterinary injection or suction units or accessories",
+"unspsc",42121508,"Veterinary bottle sets",
+"unspsc",42121509,"Veterinary clinical thermometers",
+"unspsc",42121510,"Cases for veterinary instruments or accessories",
+"unspsc",42121511,"Instrument rolls for veterinary instruments or accessories",
+"unspsc",42121512,"Veterinary speculums",
+"unspsc",42121513,"Veterinary castration instruments",
+"unspsc",42121514,"Veterinary external fixation kits",
+"unspsc",42121515,"Veterinary nail trimmers or cutters",
+"unspsc",42121600,"Veterinary products",
+"unspsc",42121601,"Gastrointestinal veterinary products",
+"unspsc",42121602,"Blood or blood forming veterinary products",
+"unspsc",42121603,"Respiratory system veterinary products",
+"unspsc",42121604,"Musculo skeletal or nervous system veterinary products",
+"unspsc",42121605,"Cardiovascular system veterinary products",
+"unspsc",42121606,"Dermatologicals or antiprotozoa veterinary products",
+"unspsc",42121607,"Genito urinary system sex or hormone veterinary products",
+"unspsc",42121608,"Dental veterinary products",
+"unspsc",42121700,"Veterinary clinical furniture",
+"unspsc",42121701,"Veterinary surgical tables",
+"unspsc",42121702,"Veterinary storage chests",
+"unspsc",42130000,"Medical apparel and textiles",
+"unspsc",42131500,"Patient clothing",
+"unspsc",42131501,"Patient bibs",
+"unspsc",42131502,"Patient caps",
+"unspsc",42131503,"Patient exam capes",
+"unspsc",42131504,"Patient gowns",
+"unspsc",42131505,"Patient infant shirts or vests",
+"unspsc",42131506,"Patient jackets",
+"unspsc",42131507,"Patient slippers",
+"unspsc",42131508,"Patient pajamas",
+"unspsc",42131509,"Hospital robes",
+"unspsc",42131510,"Patient trousers",
+"unspsc",42131600,"Medical staff clothing and related articles",
+"unspsc",42131601,"Medical staff aprons or bibs",
+"unspsc",42131602,"Medical staff beard covers",
+"unspsc",42131603,"Medical staff blouses or smocks",
+"unspsc",42131604,"Medical staff bouffant caps",
+"unspsc",42131605,"Medical staff coveralls",
+"unspsc",42131606,"Medical staff isolation or surgical masks",
+"unspsc",42131607,"Medical staff jackets or coats",
+"unspsc",42131608,"Medical staff scrubs",
+"unspsc",42131609,"Medical staff shoe covers",
+"unspsc",42131610,"Medical staff sleeve protection",
+"unspsc",42131611,"Surgeon caps or hoods",
+"unspsc",42131612,"Medical staff isolation or cover gowns",
+"unspsc",42131613,"Post operative shoes or accessories",
+"unspsc",42131700,"Surgical textiles",
+"unspsc",42131701,"Surgical drapes",
+"unspsc",42131702,"Surgical gowns",
+"unspsc",42131703,"Surgical packs",
+"unspsc",42131704,"Surgical towels",
+"unspsc",42131705,"Surgical leggings",
+"unspsc",42131706,"Surgical jumpsuits",
+"unspsc",42131707,"Surgical isolation suits or helmets or facemasks or accessories",
+"unspsc",42132100,"Hospital housekeeping textiles",
+"unspsc",42132101,"Hospital underpads",
+"unspsc",42132102,"Medical stretcher sheets",
+"unspsc",42132103,"Patient barrier drapes",
+"unspsc",42132104,"Hospital antimicrobial pillows",
+"unspsc",42132105,"Hospital bed sheets",
+"unspsc",42132106,"Hospital bedspreads",
+"unspsc",42132107,"Hospital blankets",
+"unspsc",42132108,"Hospital protective pillow covers",
+"unspsc",42132200,"Medical gloves and accessories",
+"unspsc",42132201,"Medical glove boxes or dispensers",
+"unspsc",42132202,"Finger cots",
+"unspsc",42132203,"Medical exam or non surgical procedure gloves",
+"unspsc",42132204,"Medical glove liners",
+"unspsc",42132205,"Surgical gloves",
+"unspsc",42140000,"Patient care and treatment products and supplies",
+"unspsc",42141500,"Applicator swabs and cotton balls",
+"unspsc",42141501,"Cotton ball or fiber",
+"unspsc",42141502,"Fiber tipped sticks",
+"unspsc",42141503,"Skin preparation wipes",
+"unspsc",42141504,"Medicated applicators or absorbents",
+"unspsc",42141600,"Basins and bedpans and urinals and admission kits",
+"unspsc",42141601,"Patient care admission kits",
+"unspsc",42141602,"Bedpans for general use",
+"unspsc",42141603,"Emesis basins",
+"unspsc",42141604,"Fracture bedpans",
+"unspsc",42141605,"Medical mixing or solution basins or bowls",
+"unspsc",42141606,"Medical multipurpose basins",
+"unspsc",42141607,"Patient urinals for general use",
+"unspsc",42141700,"Decubitus prevention products",
+"unspsc",42141701,"Alternating pressure systems",
+"unspsc",42141702,"Blanket frames or lifters",
+"unspsc",42141703,"Extremities cradles",
+"unspsc",42141704,"Mattress overlays",
+"unspsc",42141705,"Patient positioning cushions or pads or pillows",
+"unspsc",42141800,"Electrotherapy equipment",
+"unspsc",42141801,"Electrotherapy combination units",
+"unspsc",42141802,"Electrotherapy electrodes or accessories",
+"unspsc",42141803,"Electrotherapy lead wires or cables",
+"unspsc",42141804,"Galvanic or faradic stimulators",
+"unspsc",42141805,"Neuromuscular stimulators or kits",
+"unspsc",42141806,"Short wave diathermy units",
+"unspsc",42141807,"Transcutaneous electric nerve stimulation units",
+"unspsc",42141808,"Diathermy electrodes",
+"unspsc",42141809,"Muscle stimulator lead sets",
+"unspsc",42141900,"Enema administration supplies",
+"unspsc",42141901,"Enema buckets",
+"unspsc",42141902,"Enema bags",
+"unspsc",42141903,"Enema kits or accessories",
+"unspsc",42141904,"Enema tubing or tips or clamps",
+"unspsc",42141905,"Enema soaps",
+"unspsc",42142000,"Floor grade instruments",
+"unspsc",42142001,"Floor grade forceps or hemostats",
+"unspsc",42142002,"Floor grade knife",
+"unspsc",42142003,"Floor grade knife handles",
+"unspsc",42142004,"Floor grade nail nippers",
+"unspsc",42142005,"Floor grade needle holders",
+"unspsc",42142006,"Floor grade retractors",
+"unspsc",42142007,"Floor grade scissors",
+"unspsc",42142100,"Heat and cold therapy products",
+"unspsc",42142101,"Covers for heat or cold therapy products",
+"unspsc",42142102,"Medical cold storage chilling units or accessories",
+"unspsc",42142103,"Medical heat lamps or accessories",
+"unspsc",42142104,"Medical hydrocollators or accessories",
+"unspsc",42142105,"Therapeutic heating or cooling units or systems",
+"unspsc",42142106,"Therapeutic heating or cooling blankets or drapes",
+"unspsc",42142107,"Therapeutic cryo compression therapy systems",
+"unspsc",42142108,"Therapeutic heating or cooling pads or compresses or packs",
+"unspsc",42142109,"Therapeutic hot or cold therapy mitts",
+"unspsc",42142110,"Therapeutic hot or cold water bottles",
+"unspsc",42142111,"Therapeutic ice packs or pillows",
+"unspsc",42142112,"Therapeutic paraffin baths or accessories",
+"unspsc",42142113,"Therapeutic sinus masks",
+"unspsc",42142114,"Therapeutic hot or cold therapy pants",
+"unspsc",42142119,"Hypothermia apparatus",
+"unspsc",42142200,"Hydrotherapy products",
+"unspsc",42142201,"Extremity hydrotherapy baths or tanks",
+"unspsc",42142202,"Full body immersion hydrotherapy baths or tanks",
+"unspsc",42142203,"Hydrotherapy bath or tank accessories",
+"unspsc",42142204,"Hydrotherapy bath chairs",
+"unspsc",42142300,"Medical documentation products",
+"unspsc",42142301,"General use medical labels",
+"unspsc",42142302,"Medical charting systems components or accessories",
+"unspsc",42142303,"Patient identification products",
+"unspsc",42142400,"Medical suction and vacuum products",
+"unspsc",42142401,"Medical fluid solidifiers",
+"unspsc",42142402,"Medical suction cannulas or tubes or accessories",
+"unspsc",42142403,"Medical suction containers",
+"unspsc",42142404,"Medical suction or vacuum appliances",
+"unspsc",42142405,"Cases for medical instrument sets or its accessories",
+"unspsc",42142406,"Medical suction sets or kits",
+"unspsc",42142407,"Cases for medical suction cannula",
+"unspsc",42142500,"Injection and aspiration needles and accessories",
+"unspsc",42142501,"Amniocentesis needles",
+"unspsc",42142502,"Anesthesia needles",
+"unspsc",42142503,"Arterial needles",
+"unspsc",42142504,"Biopsy needles",
+"unspsc",42142505,"Blood collection needle holders",
+"unspsc",42142506,"Blunt needles",
+"unspsc",42142507,"Butterfly needles",
+"unspsc",42142509,"Epidural trays or accessories",
+"unspsc",42142510,"Filter needles",
+"unspsc",42142511,"Needle caps or protection devices or accessories",
+"unspsc",42142512,"Fistula needles",
+"unspsc",42142513,"Radiology procedural needles",
+"unspsc",42142514,"Spinal trays or needles",
+"unspsc",42142515,"Vacuum tube needles",
+"unspsc",42142516,"Vented needles",
+"unspsc",42142517,"Extension tubes",
+"unspsc",42142518,"Biopsy aspirator products or accessories",
+"unspsc",42142519,"Needle guides",
+"unspsc",42142520,"Dispensing pins",
+"unspsc",42142521,"Blood collection needles",
+"unspsc",42142522,"Surgical needles for ears or noses or throats",
+"unspsc",42142523,"Hypodermic needles",
+"unspsc",42142524,"Etching needles or sets",
+"unspsc",42142525,"Irrigation needles",
+"unspsc",42142526,"Needle protectors",
+"unspsc",42142527,"Needle cleaning wires",
+"unspsc",42142528,"Sternum puncture needles or sets",
+"unspsc",42142529,"Needle trays or holders",
+"unspsc",42142530,"Diagnostic procedure needles",
+"unspsc",42142531,"Needle or blade or other sharp disposal containers or carts or accessories",
+"unspsc",42142532,"Pericardiocentesis needles or kits or accessories",
+"unspsc",42142600,"Syringes and accessories",
+"unspsc",42142601,"Medical aspiration or irrigation syringes",
+"unspsc",42142602,"Medical bulb syringes",
+"unspsc",42142603,"Medical cartridge syringes",
+"unspsc",42142604,"Medical catheter tip syringes",
+"unspsc",42142605,"Medical ear syringes",
+"unspsc",42142606,"Medical metered delivery syringes",
+"unspsc",42142607,"Medical micro syringes",
+"unspsc",42142608,"Medical syringes without needles",
+"unspsc",42142609,"Medical syringes with needles",
+"unspsc",42142610,"Oral liquid medication syringes",
+"unspsc",42142611,"Tuberculin syringes",
+"unspsc",42142612,"Irrigation syringe sets",
+"unspsc",42142613,"Injection guns",
+"unspsc",42142614,"Hypodermic injection apparatus or accessories",
+"unspsc",42142615,"Syringe accessories",
+"unspsc",42142616,"Blood collection syringes",
+"unspsc",42142617,"Fountain syringes",
+"unspsc",42142618,"Blood gas analysis syringe kits",
+"unspsc",42142700,"Urological supplies",
+"unspsc",42142701,"Suprapubic urinary catheters",
+"unspsc",42142702,"Urethral urinary catheters",
+"unspsc",42142703,"Urinary catheter plugs or clamps",
+"unspsc",42142704,"Urinary drainage bags or meters",
+"unspsc",42142705,"Urinary drainage bag straps or fasteners",
+"unspsc",42142706,"Urological procedure trays or packs or kits",
+"unspsc",42142707,"Urinary irrigation tubings",
+"unspsc",42142708,"Urological instrument adapters",
+"unspsc",42142709,"Nephrostomy sets or accessories",
+"unspsc",42142710,"Urinary drainage tubes or accessories",
+"unspsc",42142711,"Urethral sound sets",
+"unspsc",42142712,"Stone remover sets or accessories",
+"unspsc",42142713,"Urological sheaths or sets",
+"unspsc",42142714,"Urological percolators",
+"unspsc",42142715,"Urinary catheterization kits or accessories",
+"unspsc",42142716,"Pessary device",
+"unspsc",42142800,"Vascular and compression therapy equipment and supplies",
+"unspsc",42142801,"Vascular sequential compression devices or tubing",
+"unspsc",42142802,"Vascular or compression apparel or supports",
+"unspsc",42142900,"Vision correction or cosmetic eyewear and related products",
+"unspsc",42142901,"Eyeglasses",
+"unspsc",42142902,"Eyeglass lenses",
+"unspsc",42142903,"Eyeglass frames",
+"unspsc",42142904,"Eyeglass hardware",
+"unspsc",42142905,"Sunglasses",
+"unspsc",42142906,"Eyeglass cases",
+"unspsc",42142907,"Eyeglass cleaning cloths",
+"unspsc",42142908,"Eyeglass cleaning kits",
+"unspsc",42142909,"Eyeglass retainers",
+"unspsc",42142910,"Contact lens cases",
+"unspsc",42142911,"Contact lens inserters or removers",
+"unspsc",42142912,"Contact lens radius gauges",
+"unspsc",42142913,"Contact lenses",
+"unspsc",42143100,"Obstetrical and gynecological equipment and supplies",
+"unspsc",42143101,"Intrauterine catheters or catheterization kits",
+"unspsc",42143102,"Uterine devices or accessories",
+"unspsc",42143103,"Intrauterine contraceptive devices or accessories",
+"unspsc",42143104,"Amniocentesis kits or accessories",
+"unspsc",42143105,"Obstetrical extraction units or accessories",
+"unspsc",42143106,"Gynecology drainage kits or accessories",
+"unspsc",42143200,"Fertility and Sterility treatment equipment and supplies",
+"unspsc",42143201,"Semen preparation kits or accessories",
+"unspsc",42143202,"Impotence treatment products or kits or accessories",
+"unspsc",42143300,"Chemotherapy equipment and supplies",
+"unspsc",42143301,"Chemotherapy administration sets or kits",
+"unspsc",42143400,"Hyperhidrosis control equipment and supplies",
+"unspsc",42143401,"Sweat control equipment or accessories",
+"unspsc",42143500,"Ear nose and throat ENT treatment products and accessories",
+"unspsc",42143501,"Earmold cleaning aids",
+"unspsc",42143502,"Nasal irrigation devices or accessories",
+"unspsc",42143503,"Nasal bleeding control devices or balloons",
+"unspsc",42143504,"Earmolds or its accessories",
+"unspsc",42143505,"Earmold repair kits",
+"unspsc",42143506,"Eustachian filiform sets",
+"unspsc",42143507,"Medication ear packs",
+"unspsc",42143508,"Ear windhoods",
+"unspsc",42143509,"Earmold glues or cements",
+"unspsc",42143510,"Ear windshield screens",
+"unspsc",42143511,"Cerumen hooks",
+"unspsc",42143512,"Ear wicks",
+"unspsc",42143513,"Otological instruments or accessories",
+"unspsc",42143600,"Restraints and accessories",
+"unspsc",42143601,"Restraint vests and jackets",
+"unspsc",42143602,"Torso and belt restraints",
+"unspsc",42143603,"Extremity restraints",
+"unspsc",42143604,"Non EMS head restraints",
+"unspsc",42143605,"Restraint straps or buckles or accessories or supplies",
+"unspsc",42143606,"Full body restraints",
+"unspsc",42143607,"Patient motion sensors or alarms or accessories",
+"unspsc",42143608,"Patient stabilization or fall prevention devices or accessories",
+"unspsc",42150000,"Dental equipment and supplies",
+"unspsc",42151500,"Cosmetic dentistry equipment and supplies",
+"unspsc",42151501,"Cosmetic dentistry curing lights or accessories",
+"unspsc",42151502,"Cosmetic dentistry mixing wells",
+"unspsc",42151503,"Crowns or crown forms",
+"unspsc",42151504,"Dental veneer",
+"unspsc",42151505,"Tooth etching supplies",
+"unspsc",42151506,"Tooth whitening or bleaching supplies",
+"unspsc",42151507,"Dental shades",
+"unspsc",42151600,"Dental and subspecialty instruments and devices",
+"unspsc",42151601,"Attachments or replacement parts for dental instruments",
+"unspsc",42151602,"Bands for dental matrix",
+"unspsc",42151603,"Calcium hydroxide placement tools",
+"unspsc",42151604,"Composite placement tools",
+"unspsc",42151605,"Crown or bridge removers",
+"unspsc",42151606,"Dental amalgam carvers",
+"unspsc",42151607,"Dental instrument cassettes",
+"unspsc",42151608,"Dental instrument trays or tubs",
+"unspsc",42151609,"Dental instruments mats",
+"unspsc",42151610,"Dental nippers",
+"unspsc",42151611,"Dental operative brushes",
+"unspsc",42151612,"Dental retractors",
+"unspsc",42151613,"Dental burnishers",
+"unspsc",42151614,"Dental burs",
+"unspsc",42151615,"Dental cryosurgical units",
+"unspsc",42151616,"Dental depth gauges",
+"unspsc",42151617,"Dental drills or drill bits",
+"unspsc",42151618,"Dental elevators",
+"unspsc",42151619,"Dental excavators",
+"unspsc",42151620,"Dental files or rasps",
+"unspsc",42151621,"Dental filler contouring instruments",
+"unspsc",42151622,"Dental finger protectors",
+"unspsc",42151623,"Dental forceps",
+"unspsc",42151624,"Dental hand pieces or accessories",
+"unspsc",42151625,"Dental hygiene instruments",
+"unspsc",42151626,"Dental instrument sharpening accessories",
+"unspsc",42151627,"Dental mirrors or mirror handles",
+"unspsc",42151628,"Dental mixing slabs",
+"unspsc",42151629,"Dental organizers",
+"unspsc",42151630,"Dental placement instruments",
+"unspsc",42151631,"Dental probes",
+"unspsc",42151632,"Dental reamers",
+"unspsc",42151633,"Dental retraction cord packing instruments",
+"unspsc",42151634,"Dental root tip picks",
+"unspsc",42151635,"Dental saliva ejectors or oral suction devices or supplies",
+"unspsc",42151636,"Dental scalers or accessories",
+"unspsc",42151637,"Dental scales",
+"unspsc",42151638,"Dental scissors",
+"unspsc",42151639,"Dental spatulas",
+"unspsc",42151640,"Dental tweezers",
+"unspsc",42151641,"Dental wax carvers",
+"unspsc",42151642,"Gingivectomy knives",
+"unspsc",42151643,"Dental margin trimmers",
+"unspsc",42151644,"Dental mouth props",
+"unspsc",42151645,"Preassembled reusable dental operative kits or trays",
+"unspsc",42151646,"Protective devices for teeth",
+"unspsc",42151647,"Dental absorbent holders",
+"unspsc",42151648,"Dental calipers",
+"unspsc",42151650,"Dental fracture detecting tools",
+"unspsc",42151651,"Dental tooth separators",
+"unspsc",42151652,"Dental pin drivers",
+"unspsc",42151653,"Dental pin benders",
+"unspsc",42151654,"Dental guides",
+"unspsc",42151655,"Dental pulp or vitality testers",
+"unspsc",42151656,"Dental spreaders",
+"unspsc",42151657,"Dental tubings or accessories",
+"unspsc",42151658,"Dental floss threaders",
+"unspsc",42151659,"Ripping tooth parts kit",
+"unspsc",42151660,"Dental applicators or absorbents",
+"unspsc",42151661,"Dental instrument cases or bags",
+"unspsc",42151662,"Dental anesthesia electrodes or refills",
+"unspsc",42151663,"Dental wedges or sets",
+"unspsc",42151664,"Dental cutting or separating discs",
+"unspsc",42151665,"Dental gages or accessories",
+"unspsc",42151666,"Dental buccal holders",
+"unspsc",42151667,"Dental matrices or sets",
+"unspsc",42151668,"Instrument rolls for dental instruments or accessories",
+"unspsc",42151669,"Dental dehydrators",
+"unspsc",42151670,"Dental heat carriers",
+"unspsc",42151671,"Refills or refill kits for dental post systems",
+"unspsc",42151672,"Dental expanders",
+"unspsc",42151673,"Dental mallets",
+"unspsc",42151674,"Dental bur holders",
+"unspsc",42151675,"Dental restorative kits",
+"unspsc",42151676,"Dental knives",
+"unspsc",42151677,"Dental pressure indicating kits",
+"unspsc",42151678,"Holders for mixing pads or slabs",
+"unspsc",42151679,"Dental mixing bags",
+"unspsc",42151680,"Endodontic stops or accessories",
+"unspsc",42151681,"Dental anesthesia sets or accessories",
+"unspsc",42151700,"Dental clinical furniture",
+"unspsc",42151701,"Dental examination chairs or related parts or accessories",
+"unspsc",42151702,"Dental stools",
+"unspsc",42151703,"Dental cabinets",
+"unspsc",42151704,"Dental tables or accessories",
+"unspsc",42151705,"Combination furniture sets for dental procedures",
+"unspsc",42151800,"Dental fillers and finishing and polishing supplies",
+"unspsc",42151801,"Amalgam carriers",
+"unspsc",42151802,"Dental material pluggers or tips or accessories",
+"unspsc",42151803,"Dental amalgam capsules",
+"unspsc",42151804,"Dental cord packers",
+"unspsc",42151805,"Dental finishing or polishing discs",
+"unspsc",42151806,"Dental finishing or polishing strips",
+"unspsc",42151807,"Dental finishing or polishing tips",
+"unspsc",42151808,"Dental burnishing compounds",
+"unspsc",42151809,"Dental squeeze cloths",
+"unspsc",42151810,"Dental finishing or polishing kits",
+"unspsc",42151811,"Dental polishing cups or sets",
+"unspsc",42151812,"Springs for dental grinding or polishing machines",
+"unspsc",42151813,"Dental filling tubes",
+"unspsc",42151814,"Chuck adapters for dental grinding or polishing machines",
+"unspsc",42151815,"Cones for dental grinding or polishing machines",
+"unspsc",42151816,"Gold foil carriers",
+"unspsc",42151900,"Dental hygiene and preventive care equipment and supplies",
+"unspsc",42151901,"Dental plate or denture brushes",
+"unspsc",42151902,"Dental prophylaxis kits",
+"unspsc",42151903,"Denture cups or containers",
+"unspsc",42151904,"Disclosing solutions or tablets",
+"unspsc",42151905,"Fluoride gels or rinses",
+"unspsc",42151906,"Fluoride tablets or drops",
+"unspsc",42151907,"Dental prophylaxis tanks",
+"unspsc",42151908,"Denture flasks or sets",
+"unspsc",42151909,"Preventive dentistry pastes or kits",
+"unspsc",42151910,"Teeth cleaning devices or accessories",
+"unspsc",42151911,"Dental tissue conditioner sets",
+"unspsc",42151912,"Endodontic sprays",
+"unspsc",42152000,"Dental imaging equipment and supplies",
+"unspsc",42152001,"Bite wing holders",
+"unspsc",42152002,"Dental bite blocks or wings or tabs",
+"unspsc",42152003,"Dental film processors",
+"unspsc",42152004,"Dental radiology film hangers",
+"unspsc",42152005,"Dental radiology film holders",
+"unspsc",42152006,"Dental radiology film mounts",
+"unspsc",42152007,"Dental x ray duplicators",
+"unspsc",42152008,"Dental x ray units",
+"unspsc",42152009,"Dental x ray viewers or accessories",
+"unspsc",42152010,"Dental radiology film",
+"unspsc",42152011,"Dental x ray film adapters",
+"unspsc",42152012,"Dental x ray apparatus parts or kits or accessories",
+"unspsc",42152013,"Dental radiography film analyzers",
+"unspsc",42152014,"Dental radioactive tracers",
+"unspsc",42152100,"Dental impression and forming equipment and supplies",
+"unspsc",42152101,"Dental casting rings or related supplies",
+"unspsc",42152102,"Dental formers",
+"unspsc",42152103,"Dental impression tray adhesives",
+"unspsc",42152104,"Dental impression tray cleaners",
+"unspsc",42152105,"Dental impression trays",
+"unspsc",42152106,"Dental plaster knives",
+"unspsc",42152107,"Dental waxing instruments",
+"unspsc",42152108,"Dental impression material syringes or accessories",
+"unspsc",42152109,"Dental impression material water baths or accessories",
+"unspsc",42152110,"Dental marking devices",
+"unspsc",42152111,"Dental impression material hardeners",
+"unspsc",42152112,"Dental drying instruments or accessories",
+"unspsc",42152113,"Denture base forming kits",
+"unspsc",42152114,"Dental impression materials delivery kits",
+"unspsc",42152115,"Dental impression baskets",
+"unspsc",42152200,"Dental laboratory and sterilization equipment and supplies",
+"unspsc",42152201,"Dental foils",
+"unspsc",42152202,"Dental laboratory air abrasion units",
+"unspsc",42152203,"Dental laboratory burners or torches",
+"unspsc",42152204,"Dental laboratory casting machines or its parts or accessories",
+"unspsc",42152205,"Dental laboratory curing units",
+"unspsc",42152206,"Dental laboratory dies",
+"unspsc",42152207,"Dental laboratory dust collectors",
+"unspsc",42152208,"Dental laboratory engines or accessories",
+"unspsc",42152209,"Dental laboratory furnaces",
+"unspsc",42152210,"Dental laboratory gold platers or supplies",
+"unspsc",42152211,"Dental laboratory lathes or accessories",
+"unspsc",42152212,"Dental laboratory model trimmers or accessories",
+"unspsc",42152213,"Dental laboratory models",
+"unspsc",42152214,"Dental laboratory plaster traps",
+"unspsc",42152215,"Dental laboratory sandblasters or supplies",
+"unspsc",42152216,"Dental laboratory soldering machines or supplies",
+"unspsc",42152217,"Dental laboratory vacuum units or supplies",
+"unspsc",42152218,"Dental laboratory vibrators",
+"unspsc",42152219,"Dental laboratory waxing units",
+"unspsc",42152220,"Dental stones",
+"unspsc",42152221,"Dental laboratory model protectors or cases",
+"unspsc",42152222,"Crucibles for dental casting machines",
+"unspsc",42152223,"Dental resins processing units or accessories",
+"unspsc",42152224,"Dental laboratory flasks",
+"unspsc",42152300,"Dental lasers and illumination and fiber optic equipment and supplies",
+"unspsc",42152301,"Dental lasers",
+"unspsc",42152302,"Dentoscopes",
+"unspsc",42152303,"General dental lights or its accessories",
+"unspsc",42152304,"Intraoral lights",
+"unspsc",42152305,"Tripods for dental operating lights",
+"unspsc",42152306,"Dental fiber optic lights or accessories",
+"unspsc",42152307,"Dental operating illumination sets",
+"unspsc",42152400,"Dental materials",
+"unspsc",42152401,"Alloys for dental amalgam",
+"unspsc",42152402,"Athletic mouth protector materials",
+"unspsc",42152403,"Cast cobalt chromium molybdenum alloys for dental implants",
+"unspsc",42152404,"Combined reversible irreversible hydrocolloid impression materials",
+"unspsc",42152405,"Crown or bridge plastics",
+"unspsc",42152406,"Dental abrasive pastes",
+"unspsc",42152407,"Dental abrasive powders",
+"unspsc",42152408,"Dental absorbent points",
+"unspsc",42152409,"Dental agar impression materials",
+"unspsc",42152410,"Dental alginate impression materials",
+"unspsc",42152411,"Dental base metal casting alloys",
+"unspsc",42152412,"Dental baseplate waxes",
+"unspsc",42152413,"Dental brazing alloys",
+"unspsc",42152414,"Dental casting alloys",
+"unspsc",42152415,"Dental ceramics",
+"unspsc",42152416,"Dental duplicating materials",
+"unspsc",42152417,"Dental ethyl silicate investments",
+"unspsc",42152418,"Dental gypsum products",
+"unspsc",42152419,"Dental impression paste zinc oxide eugenol materials",
+"unspsc",42152420,"Dental inlay casting waxes",
+"unspsc",42152421,"Dental mercury",
+"unspsc",42152422,"Dental obturating points",
+"unspsc",42152423,"Dental pit or fissure sealants",
+"unspsc",42152424,"Dental water based cements",
+"unspsc",42152425,"Denture base resins",
+"unspsc",42152426,"Denture base temporary relining resins",
+"unspsc",42152427,"Denture cold curing repair resins",
+"unspsc",42152428,"Direct filling resins",
+"unspsc",42152429,"Elastomeric dental impression materials",
+"unspsc",42152430,"Endodontic filling materials",
+"unspsc",42152431,"Extraoral maxillofacial prosthesis elastomers",
+"unspsc",42152432,"Gypsum bonded casting Investments for dental gold alloys",
+"unspsc",42152433,"Intraoral dental radiographic film",
+"unspsc",42152434,"Dental amalgamators",
+"unspsc",42152435,"Orthodontic elastomeric materials",
+"unspsc",42152436,"Phosphate bonded investments",
+"unspsc",42152437,"Porcelain teeth",
+"unspsc",42152438,"Refractory die materials",
+"unspsc",42152439,"Resilient lining materials for removable dentures",
+"unspsc",42152440,"Soldering investments",
+"unspsc",42152441,"Synthetic polymer teeth",
+"unspsc",42152442,"Unalloyed titanium for dental implants",
+"unspsc",42152443,"Zinc oxide eugenol and non eugenol cements",
+"unspsc",42152444,"Gingival retraction liquid",
+"unspsc",42152445,"Tooth facing or backing sets",
+"unspsc",42152446,"Dental cavities lining or thinner materials or sets",
+"unspsc",42152447,"Dental stains or supplies",
+"unspsc",42152449,"Dental impression material catalysts",
+"unspsc",42152450,"Dental instrument cleaning compounds",
+"unspsc",42152451,"Dental pressure indicating compounds",
+"unspsc",42152452,"Dental pastes insulating kits or accessories",
+"unspsc",42152453,"Dental restorative compounds",
+"unspsc",42152454,"Dental pulp protectors",
+"unspsc",42152455,"Stands or holders for dental abrasive products",
+"unspsc",42152456,"Dental masking agents",
+"unspsc",42152457,"Dental cementing kits",
+"unspsc",42152458,"Dental die spacers",
+"unspsc",42152459,"Endodontic post kits",
+"unspsc",42152460,"Denture coating compounds",
+"unspsc",42152461,"Coating compounds for dental models",
+"unspsc",42152462,"Denture reliner kits",
+"unspsc",42152463,"Dental wax solvents",
+"unspsc",42152464,"Kits for dental implants",
+"unspsc",42152465,"Dental lubricants",
+"unspsc",42152500,"General dental supplies",
+"unspsc",42152501,"Dental preassembled disposable kits or trays",
+"unspsc",42152502,"Dental bibs",
+"unspsc",42152503,"Dental dam supplies",
+"unspsc",42152504,"Dental dressings",
+"unspsc",42152505,"Dental examination chair headrest covers",
+"unspsc",42152506,"Dental absorbent pellets",
+"unspsc",42152507,"Dental rolls",
+"unspsc",42152508,"Dental syringes or needles or syringes with needles",
+"unspsc",42152509,"Disposable dental tray covers",
+"unspsc",42152510,"Cases or covers for dental instruments or sets",
+"unspsc",42152511,"Dental dishes",
+"unspsc",42152512,"Dental tongs",
+"unspsc",42152513,"Dental measuring cups",
+"unspsc",42152514,"Dental waste containers or accessories",
+"unspsc",42152516,"Dental mixing bowls",
+"unspsc",42152517,"Dental napkin holders or dispensers",
+"unspsc",42152518,"Dental materials dispensers",
+"unspsc",42152519,"Dental syringe accessory kits",
+"unspsc",42152520,"Dental cuspidors",
+"unspsc",42152600,"Dental operatory specific supplies",
+"unspsc",42152601,"Dental operatory articulating papers or related products",
+"unspsc",42152602,"Dental operatory infection control barriers",
+"unspsc",42152603,"Dental operatory retention pins or related products",
+"unspsc",42152604,"Dental operatory retraction cords",
+"unspsc",42152605,"Dental sialography sets",
+"unspsc",42152606,"Dental splints or sets",
+"unspsc",42152607,"Dental instruments rings",
+"unspsc",42152608,"Orthodontic ligature cartridges",
+"unspsc",42152700,"Orthodontic and prosthodontic equipment and supplies",
+"unspsc",42152701,"Dental articulators or accessories",
+"unspsc",42152702,"Dental hemostatic solutions",
+"unspsc",42152703,"Dental pins or posts or related supplies",
+"unspsc",42152704,"Dental retainers",
+"unspsc",42152705,"Orthodontic appliance clasps",
+"unspsc",42152706,"Orthodontic brackets",
+"unspsc",42152707,"Orthodontic buccal tubes",
+"unspsc",42152708,"Orthodontic coil springs",
+"unspsc",42152709,"Orthodontic elastics",
+"unspsc",42152710,"Orthodontic elastomerics",
+"unspsc",42152711,"Orthodontic expansion screws",
+"unspsc",42152712,"Orthodontic molar bands",
+"unspsc",42152713,"Orthodontic pliers",
+"unspsc",42152714,"Orthodontic retainer cases",
+"unspsc",42152715,"Orthodontic setter bands",
+"unspsc",42152716,"Orthodontic stops or locks",
+"unspsc",42152800,"Periodontal equipment and supplies",
+"unspsc",42152801,"Periodontal chisels",
+"unspsc",42152802,"Periodontal files",
+"unspsc",42152803,"Periodontal hoes",
+"unspsc",42152804,"Periodontal implant to bone interface testing instruments",
+"unspsc",42152805,"Periodontium control instruments",
+"unspsc",42152806,"Periodontal tissue dissectors",
+"unspsc",42152807,"Periodontal protective pastes",
+"unspsc",42152808,"Periodontal curettes",
+"unspsc",42152809,"Periodontal knives",
+"unspsc",42152810,"Periodontal membranes",
+"unspsc",42160000,"Dialysis equipment and supplies",
+"unspsc",42161500,"Peritoneal and equilibrium dialysis equipment and supplies",
+"unspsc",42161501,"Continuous ambulatory peritoneal dialysis CAPD transfer sets",
+"unspsc",42161502,"Peritoneal dialysate warmers",
+"unspsc",42161503,"Peritoneal dialysis administration or catheterization sets",
+"unspsc",42161504,"Peritoneal dialysis catheter adapters or clamps or connectors",
+"unspsc",42161505,"Peritoneal dialysis drainage bags or containers",
+"unspsc",42161506,"Peritoneal dialysis shunts or catheters or indwelling access devices",
+"unspsc",42161507,"Peritoneal dialysis solutions",
+"unspsc",42161508,"Peritoneal dialysis unit straps or harnesses",
+"unspsc",42161509,"Peritoneal dialysis units",
+"unspsc",42161510,"Peritoneal lavage kits",
+"unspsc",42161600,"Extracorporeal hemodialysis equipment and supplies",
+"unspsc",42161601,"Hemodialysis administration kits or sets or accessories",
+"unspsc",42161602,"Hemodialysis blood bag samplers",
+"unspsc",42161603,"Hemodialysis blood oxygen demand apparatus",
+"unspsc",42161604,"Hemodialysis chairs",
+"unspsc",42161605,"Hemodialysis dialysate conductivity meters",
+"unspsc",42161606,"Hemodialysis dialysate level detectors",
+"unspsc",42161607,"Hemodialysis dialysate pressure pumps",
+"unspsc",42161608,"Hemodialysis dialysate solutions",
+"unspsc",42161609,"Hemodialysis dialysate tanks",
+"unspsc",42161610,"Hemodialysis dialysate tubing",
+"unspsc",42161611,"Hemodialysis dialysate warming baths",
+"unspsc",42161612,"Hemodialysis dialyzer celluloid filters",
+"unspsc",42161613,"Hemodialysis dialyzer collodion filters",
+"unspsc",42161614,"Hemodialysis dialyzer hollow filament filters",
+"unspsc",42161615,"Hemodialysis dialyzer reprocessing systems",
+"unspsc",42161616,"Hemodialysis unit air bubble or foam or clot detectors or traps or alarms",
+"unspsc",42161617,"Hemodialysis unit arterial pressure monitors",
+"unspsc",42161618,"Hemodialysis unit blood line clamps",
+"unspsc",42161619,"Hemodialysis unit blood port caps",
+"unspsc",42161620,"Hemodialysis unit blood pumps",
+"unspsc",42161621,"Hemodialysis unit dialysate port caps",
+"unspsc",42161622,"Hemodialysis unit disinfectants or cleansers",
+"unspsc",42161623,"Hemodialysis unit heparin infusion pumps",
+"unspsc",42161624,"Hemodialysis unit single needle controllers",
+"unspsc",42161625,"Hemodialysis unit single pass converters",
+"unspsc",42161626,"Hemodialysis unit stands or supports or carts",
+"unspsc",42161627,"Hemodialysis unit temperature monitors",
+"unspsc",42161628,"Hemodialysis unit test equipment",
+"unspsc",42161629,"Hemodialysis unit transducer filters",
+"unspsc",42161630,"Hemodialysis unit transducer protectors",
+"unspsc",42161631,"Hemodialysis unit water purification systems",
+"unspsc",42161632,"Hemodialysis units",
+"unspsc",42161633,"Hemodialysis apparatus dialyzer membranes",
+"unspsc",42161634,"Hemodialysis procedure trays or accessories",
+"unspsc",42161635,"Hemodialysis apparatus cartridges",
+"unspsc",42161700,"Hemofiltration equipment and supplies",
+"unspsc",42161701,"Hemafilters",
+"unspsc",42161702,"Hemofiltrate collection bags",
+"unspsc",42161703,"Hemofiltration infusion ports",
+"unspsc",42161704,"Hemofiltration sampling ports",
+"unspsc",42161800,"Continuous renal replacement therapy CRRT equipment and supplies",
+"unspsc",42161801,"Continuous arteriovenous dialysis CAVHD units or related products",
+"unspsc",42161802,"Continuous arteriovenous hemofiltration CAVH units or related products",
+"unspsc",42161803,"Continuous venovenous hemofiltration or hemodialysis units or related products",
+"unspsc",42161804,"Slow continuous ultrafiltration SCUF units or related products",
+"unspsc",42170000,"Emergency and field medical services products",
+"unspsc",42171500,"Emergency medical services disaster management products",
+"unspsc",42171501,"Emergency medical services disaster body pouches",
+"unspsc",42171502,"Emergency medical services triage tags",
+"unspsc",42171600,"Emergency medical services extricating and immobilizing and transporting products",
+"unspsc",42171601,"Air evacuation stretchers or accessories",
+"unspsc",42171602,"Ambulance cots or accessories",
+"unspsc",42171603,"Anti shock garments",
+"unspsc",42171604,"Basket stretchers or accessories",
+"unspsc",42171605,"Cinch rescue loops",
+"unspsc",42171606,"Emergency medical services air splints",
+"unspsc",42171607,"Emergency medical services cervical or extrication collars",
+"unspsc",42171608,"Emergency medical services head immobilizers",
+"unspsc",42171609,"Emergency medical services restraint or spine board straps",
+"unspsc",42171610,"Emergency medical services torso immobilizers",
+"unspsc",42171611,"Emergency response litters or stretchers or accessories",
+"unspsc",42171612,"Scoop stretchers or accessories",
+"unspsc",42171613,"Spine boards",
+"unspsc",42171614,"Water rescue tubes or cans",
+"unspsc",42171700,"Emergency medical services blankets",
+"unspsc",42171701,"Emergency or rescue blankets",
+"unspsc",42171702,"First aid blankets",
+"unspsc",42171703,"Emergency medical services heat shielding wraps or blankets",
+"unspsc",42171704,"Emergency medical services infant swaddlers or buntings",
+"unspsc",42171800,"Emergency medical services airway management equipment",
+"unspsc",42171801,"Emergency medical services oropharyngeal airway or intubation kits",
+"unspsc",42171802,"Emergency medical services laryngoscope kits",
+"unspsc",42171803,"Emergency medical services suction units or accessories",
+"unspsc",42171804,"Emergency medical services tracheal tube or cricothyrotomy kits",
+"unspsc",42171805,"Jaw spreaders",
+"unspsc",42171806,"Seizure sticks",
+"unspsc",42171900,"Emergency medical services storage cases and bags",
+"unspsc",42171901,"Emergency medical services airway management bags",
+"unspsc",42171902,"Emergency medical services defibrillator cases",
+"unspsc",42171903,"Emergency medical services drug cases",
+"unspsc",42171904,"Emergency medical services extrication products cases or bags",
+"unspsc",42171905,"Emergency medical services intravenous IV cases",
+"unspsc",42171906,"Emergency medical services intubation cases",
+"unspsc",42171907,"Emergency medical services laryngoscope bags",
+"unspsc",42171908,"Emergency medical services life support cases",
+"unspsc",42171909,"Emergency medical services long distance response LDR trauma packs",
+"unspsc",42171910,"Emergency medical services paramedic cases",
+"unspsc",42171911,"Emergency medical services portable oxygen or resuscitation cases",
+"unspsc",42171912,"Emergency medical services rescue bags or cases",
+"unspsc",42171913,"Emergency medical services response cases or bags",
+"unspsc",42171914,"Emergency medical services trauma cases or bags",
+"unspsc",42171915,"Emergency medical technician EMT cases or bags",
+"unspsc",42171916,"Emergency medical services immobilization set carrying or storage cases",
+"unspsc",42171917,"Emergency medical services first aid kit cases or bags or accessories",
+"unspsc",42171918,"Emergency medical services gas casualty treatment set cases",
+"unspsc",42171919,"Emergency medical services evacuation bags or liners",
+"unspsc",42171920,"Emergency medical services clothing cases or accessories",
+"unspsc",42172000,"Emergency and field medical services kits",
+"unspsc",42172001,"Emergency medical services first aid kits",
+"unspsc",42172002,"Emergency medical services first response kits",
+"unspsc",42172003,"Emergency medical services intravenous IV kits",
+"unspsc",42172004,"Emergency medical services life support kits",
+"unspsc",42172005,"Emergency medical services long distance response LDR trauma kits",
+"unspsc",42172006,"Emergency medical services obstetrics kits",
+"unspsc",42172007,"Emergency medical services oxygen or resuscitation kits",
+"unspsc",42172008,"Emergency medical services rappel kits",
+"unspsc",42172009,"Emergency medical services search and rescue kits",
+"unspsc",42172010,"Emergency medical services trauma kits",
+"unspsc",42172011,"Emergency medical technician EMT kits",
+"unspsc",42172012,"Emergency medical services ventriculostomy kits",
+"unspsc",42172013,"Emergency medical services evacuation kits",
+"unspsc",42172014,"Emergency medical services patient transport kits or supplies",
+"unspsc",42172015,"Emergency medical services dental treatment kits",
+"unspsc",42172016,"Emergency medical services fracture kits",
+"unspsc",42172017,"Field medical or laboratory medical equipment kits or related products",
+"unspsc",42172100,"Emergency medical services resuscitation products",
+"unspsc",42172101,"Automated external defibrillators AED or hard paddles",
+"unspsc",42172102,"Cardiopulmonary resuscitation CPR protective shields or masks",
+"unspsc",42172103,"Emergency resuscitator or aspirator kits",
+"unspsc",42172200,"Emergency medical services supplies",
+"unspsc",42172201,"Emergency medical services tourniquets or clamps",
+"unspsc",42180000,"Patient exam and monitoring products",
+"unspsc",42181500,"Diagnostic assessment and exam products for general use",
+"unspsc",42181501,"Tongue depressors or blades or sticks",
+"unspsc",42181502,"Medical exam transilluminators",
+"unspsc",42181503,"Exam or personal lubricants or jellies",
+"unspsc",42181504,"Hemacytometer sets",
+"unspsc",42181505,"Endometrial cell sampler sets or accessories",
+"unspsc",42181506,"Sexual assault determination kits",
+"unspsc",42181507,"Medical examining mirror headbands or accessories",
+"unspsc",42181508,"Cleaning wipes for diagnostic equipment",
+"unspsc",42181509,"Flight surgeon physical examination sets",
+"unspsc",42181510,"Transcutaneous jaundice meters",
+"unspsc",42181511,"Male impotence gages",
+"unspsc",42181512,"Typhoid carrier examination spoons",
+"unspsc",42181513,"Sinus irrigation kits",
+"unspsc",42181514,"Hemoglobin photometers",
+"unspsc",42181515,"Exam procedure trays",
+"unspsc",42181516,"Electromyography EMG units or accessories",
+"unspsc",42181517,"Electroencephalography EEG units or accessories",
+"unspsc",42181600,"Blood pressure units and related products",
+"unspsc",42181601,"Aneroid blood pressure units",
+"unspsc",42181602,"Electronic blood pressure units",
+"unspsc",42181603,"Mercury blood pressure units",
+"unspsc",42181604,"Blood pressure air release valves or inflation bulbs",
+"unspsc",42181605,"Blood pressure cuffs or bladders",
+"unspsc",42181606,"Blood pressure inflation hoses or pneumatic hoses or adapters",
+"unspsc",42181607,"Blood pressure recording units",
+"unspsc",42181608,"Blood pressure measuring instrument accessories",
+"unspsc",42181609,"Blood pressure monitor dome kits",
+"unspsc",42181610,"Blood pressure cuff kits",
+"unspsc",42181700,"Electrocardiography EKG units and related products",
+"unspsc",42181701,"Electrocardiography EKG units",
+"unspsc",42181702,"Electrocardiography EKG adapters or cables or leads",
+"unspsc",42181703,"Electrocardiography EKG cable or lead or unit testers",
+"unspsc",42181704,"Electrocardiography EKG calipers or rulers",
+"unspsc",42181705,"Electrocardiography EKG graphic recorders",
+"unspsc",42181706,"Electrocardiography EKG monitor screens",
+"unspsc",42181707,"Electrocardiography EKG neonatal strap or ring electrodes",
+"unspsc",42181708,"Electrocardiography EKG patch electrodes",
+"unspsc",42181709,"Electrocardiography EKG recording paper",
+"unspsc",42181710,"Electrocardiography EKG surface electrode testers",
+"unspsc",42181711,"Electrocardiography EKG telephone transmitter or receiver systems",
+"unspsc",42181712,"Electrocardiography EKG unit analyzers",
+"unspsc",42181713,"Long term continuous electrocardiography EKG or holter monitoring systems",
+"unspsc",42181714,"Electrocardiography EKG monitor accessory kits",
+"unspsc",42181715,"Electrode solutions or creams",
+"unspsc",42181716,"Electrocardiography EKG accessories",
+"unspsc",42181717,"Electrocardiography EKG electrode bulbs",
+"unspsc",42181718,"Electrocardiography EKG recording pens",
+"unspsc",42181719,"Electrocardiography EKG transmitter or telemetry or accessories",
+"unspsc",42181800,"Pulse oximeters",
+"unspsc",42181801,"Pulse oximeter units",
+"unspsc",42181802,"Pulse oximeter cables",
+"unspsc",42181803,"Pulse oximeter probes or sensors",
+"unspsc",42181804,"Pulse oximeter probe or sensor accessories",
+"unspsc",42181805,"Pulse oximeter unit accessories",
+"unspsc",42181900,"Acute care monitoring units and related products",
+"unspsc",42181901,"Acute care fetal or maternal monitoring units or accessories",
+"unspsc",42181902,"Intracranial pressure ICP monitoring units or accessories",
+"unspsc",42181903,"Cardiac output CO monitoring units or accessories",
+"unspsc",42181904,"Transport or mobile multiparameter vital sign units or accessories",
+"unspsc",42181905,"Medical transducer monitor cables",
+"unspsc",42181906,"Intrauterine pressure monitoring catheters",
+"unspsc",42181907,"Basal metabolism apparatus",
+"unspsc",42181908,"Intracompartmental pressure monitoring sets or accessories",
+"unspsc",42181909,"Fetal monitor recording papers",
+"unspsc",42181910,"Transcervical intrauterine kits",
+"unspsc",42181911,"Acute care fetal/maternal recording paper",
+"unspsc",42182000,"Scopes and specula and accessories for medical exam diagnostic use",
+"unspsc",42182001,"Anal or rectal exam specula",
+"unspsc",42182002,"Anoscopes or proctoscopes",
+"unspsc",42182003,"Colposcopes or vaginoscopes or accessories",
+"unspsc",42182004,"Dermatoscopes",
+"unspsc",42182005,"Ophthalmoscopes or otoscopes or scope sets",
+"unspsc",42182006,"Laryngeal or oropharyngial exam specula",
+"unspsc",42182007,"Medical exam scope bulbs or lamps",
+"unspsc",42182008,"Medical exam scope handles or handle chargers",
+"unspsc",42182009,"Medical exam scope specula tips or specula tip dispensers",
+"unspsc",42182010,"Medical exam specula holders or stands",
+"unspsc",42182011,"Medical exam specula or dilator tips or tip dispensers",
+"unspsc",42182012,"Nasal exam specula or dilators",
+"unspsc",42182013,"Vaginal exam specula",
+"unspsc",42182014,"Otoscope or opthalmoscope accessories",
+"unspsc",42182015,"Otoscope speculums",
+"unspsc",42182016,"Nasopharyngoscopes or accessories",
+"unspsc",42182017,"Ear specula sets",
+"unspsc",42182018,"Bronchoscopes or accessories",
+"unspsc",42182019,"Dilator kits",
+"unspsc",42182020,"Angioscopes or accessories",
+"unspsc",42182100,"Stethoscopes and related products",
+"unspsc",42182101,"Electronic stethoscopes or accessories",
+"unspsc",42182102,"Hand held vascular dopplers or accessories",
+"unspsc",42182103,"Mechanical stethoscopes or accessories",
+"unspsc",42182104,"Pediatric stethoscope heads",
+"unspsc",42182105,"Stethoscope head covers",
+"unspsc",42182106,"Stethoscopic phonocardiographs",
+"unspsc",42182107,"Stethoscope headsets",
+"unspsc",42182108,"Patient thermoregulators",
+"unspsc",42182200,"Medical thermometers and accessories",
+"unspsc",42182201,"Electronic medical thermometers",
+"unspsc",42182202,"Fiberoptic medical thermometers",
+"unspsc",42182203,"Medical thermometer carrying cases or covers",
+"unspsc",42182204,"Medical thermometer racks",
+"unspsc",42182205,"Medical thermometer tip or probe covers",
+"unspsc",42182206,"Mercury medical thermometers",
+"unspsc",42182207,"Patient temperature continuous or trend monitors",
+"unspsc",42182208,"Patient temperature strips",
+"unspsc",42182209,"Thermometer probes",
+"unspsc",42182300,"Neurological exam products",
+"unspsc",42182301,"Medical diagnostic pinwheels",
+"unspsc",42182302,"Reflex hammers or mallets",
+"unspsc",42182303,"Neuropsychiatry exam cards",
+"unspsc",42182304,"Psychodiagnostic test sets or kits",
+"unspsc",42182305,"Myelographic procedure sets",
+"unspsc",42182306,"Neurological discriminators",
+"unspsc",42182307,"Neurological pins",
+"unspsc",42182308,"Electroencephalographs or accessories",
+"unspsc",42182309,"Electroencephalograph recording papers",
+"unspsc",42182310,"Electromyographs",
+"unspsc",42182311,"Neurological sensors",
+"unspsc",42182312,"Electromyograph electrodes or sets",
+"unspsc",42182313,"Neurological diagnostic sets",
+"unspsc",42182314,"EEG recording paper",
+"unspsc",42182400,"Hearing testing products",
+"unspsc",42182401,"Audiometers or accessories",
+"unspsc",42182402,"Audiometric bone vibrators or middle ear analyzers",
+"unspsc",42182403,"Audiometric booths or acoustic hearing test chambers",
+"unspsc",42182404,"Auditory function screening unit calibration sets",
+"unspsc",42182405,"Auditory function screening units",
+"unspsc",42182406,"Auditory test graphic recorders",
+"unspsc",42182407,"Ear fenestrometers",
+"unspsc",42182408,"Electrocochleographs",
+"unspsc",42182409,"Hearing aid analyzers or test systems",
+"unspsc",42182410,"Medical tuning fork cases",
+"unspsc",42182411,"Medical tuning fork hammers",
+"unspsc",42182412,"Medical tuning forks",
+"unspsc",42182413,"Medical tuning fork sets",
+"unspsc",42182414,"Tinnitus analyzers",
+"unspsc",42182415,"Toynbee diagnostic tubes",
+"unspsc",42182416,"Tympanometers or accessories",
+"unspsc",42182417,"Audiometer ribbons",
+"unspsc",42182418,"Fenestrometer guides",
+"unspsc",42182419,"Hearing control apparatus",
+"unspsc",42182420,"Aural probes",
+"unspsc",42182421,"Ear plug gages or accessories",
+"unspsc",42182422,"Ear inflating bags",
+"unspsc",42182500,"Nasal function meters",
+"unspsc",42182501,"Olfactometers",
+"unspsc",42182502,"Nasal flowmeters or rhinoanemometers",
+"unspsc",42182600,"Medical exam lights or lamps",
+"unspsc",42182601,"Freestanding medical exam lights or lamps",
+"unspsc",42182602,"Installed medical exam lights or lamps",
+"unspsc",42182603,"Medical exam headlights or headlamps or accessories",
+"unspsc",42182604,"Medical exam penlights",
+"unspsc",42182700,"Medical exam size measuring devices",
+"unspsc",42182701,"Goniometers",
+"unspsc",42182702,"Medical tape measures",
+"unspsc",42182703,"Patient height rulers",
+"unspsc",42182704,"Skinfold calipers",
+"unspsc",42182800,"Medical weight scales",
+"unspsc",42182801,"Diaper weight scales",
+"unspsc",42182802,"Infant scales",
+"unspsc",42182803,"Patient bed or table scales for general use",
+"unspsc",42182804,"Patient chair scales",
+"unspsc",42182805,"Patient floor scales",
+"unspsc",42182806,"Patient sling scales",
+"unspsc",42182807,"Wheelchair platform scales",
+"unspsc",42182808,"Covers or liners for weighing scales",
+"unspsc",42182900,"Specialty exam tables and related products",
+"unspsc",42182901,"Obstetrical or gynecological exam tables",
+"unspsc",42182902,"Obstetrical or gynecological exam table foot stirrups",
+"unspsc",42182903,"Pediatric examination tables",
+"unspsc",42182904,"Pediatric examination table restraint or measurement systems",
+"unspsc",42183000,"Ophthalmic diagnostic exam products",
+"unspsc",42183001,"Eye charts or vision cards",
+"unspsc",42183002,"Corneal topographers",
+"unspsc",42183003,"Exophthalmometers",
+"unspsc",42183004,"Keratoscopes",
+"unspsc",42183005,"Ophthalmic colorimeters",
+"unspsc",42183006,"Ophthalmic distometers",
+"unspsc",42183007,"Ophthalmic drums or its accessories",
+"unspsc",42183008,"Ophthalmic euthyscopes",
+"unspsc",42183009,"Ophthalmic eye test lenses or accessories",
+"unspsc",42183010,"Ophthalmic lensometers",
+"unspsc",42183011,"Ophthalmic perimeters",
+"unspsc",42183012,"Ophthalmic photometers",
+"unspsc",42183013,"Ophthalmic prisms",
+"unspsc",42183014,"Ophthalmic retinoscopes",
+"unspsc",42183015,"Ophthalmic slit lamps",
+"unspsc",42183016,"Ophthalmic spectrophotometers",
+"unspsc",42183017,"Ophthalmic specula",
+"unspsc",42183018,"Ophthalmic tonometers or accessories",
+"unspsc",42183019,"Ophthalmic transilluminators",
+"unspsc",42183020,"Ophthalmic visual field plotters",
+"unspsc",42183021,"Ophthalmic visual function analyzers",
+"unspsc",42183022,"Ophthalmic visuometers",
+"unspsc",42183023,"Ophthalmometers",
+"unspsc",42183024,"Ophthalmic instrument tables or accessories",
+"unspsc",42183025,"Vitrectomy lenses",
+"unspsc",42183026,"Ophthalmodynamometers",
+"unspsc",42183027,"Tangent screen test objects kits or accessories",
+"unspsc",42183028,"Ophthalmic retinoscope accessories",
+"unspsc",42183029,"Phoropter units",
+"unspsc",42183030,"Eye occluders",
+"unspsc",42183031,"Pseudoisochromatic plate sets or accessories",
+"unspsc",42183032,"Tachistoscopes",
+"unspsc",42183033,"Spectacle fitting sets",
+"unspsc",42183034,"Vision testing stereoscopes",
+"unspsc",42183035,"Combination refractor keratometers",
+"unspsc",42183036,"Opthalmometer base plates",
+"unspsc",42183037,"Chart projectors or accessories",
+"unspsc",42183038,"Ophthalmic instrument pads",
+"unspsc",42183039,"Ophthalmic lens holders",
+"unspsc",42183040,"Opticians tools or accessories",
+"unspsc",42183041,"Color perception testing lanterns",
+"unspsc",42183042,"Depth perception apparatus",
+"unspsc",42183043,"Ophthalmometer bulbs",
+"unspsc",42183044,"Tangent screens",
+"unspsc",42183045,"Electroretinogram systems",
+"unspsc",42183046,"Binocular vision test sets or accessories",
+"unspsc",42183047,"Viewing stands for vision acuity testing",
+"unspsc",42183048,"Ophthalmic child fixation bars",
+"unspsc",42183100,"Taste function meters",
+"unspsc",42183101,"Gustometers",
+"unspsc",42183200,"Allergy examining equipment and supplies",
+"unspsc",42183201,"Allergy detecting or testing instruments or accessories",
+"unspsc",42183300,"Ear nose throat ENT examining unit accessories and related products",
+"unspsc",42183301,"Ear nose throat ENT examining mirror accessories",
+"unspsc",42190000,"Medical facility products",
+"unspsc",42191500,"Medical facility materials handling and distribution equipment",
+"unspsc",42191501,"Clinical pneumatic tube system",
+"unspsc",42191502,"Medicine trays or covers",
+"unspsc",42191600,"Medical facility building systems",
+"unspsc",42191601,"Patient room lighting or accessories",
+"unspsc",42191602,"Operating room lighting or accessories",
+"unspsc",42191603,"Hospital equipment instrument panels",
+"unspsc",42191604,"Clinical monitor arms",
+"unspsc",42191605,"Hospital equipment power columns",
+"unspsc",42191606,"Medical facility ceiling arms",
+"unspsc",42191607,"Patient cubicle curtains or screens or curtain track hardware",
+"unspsc",42191608,"Nursing controls or exit monitors",
+"unspsc",42191609,"Clinical headwall systems",
+"unspsc",42191610,"Clinical modular casework",
+"unspsc",42191611,"Nurse communication modules or systems",
+"unspsc",42191612,"Hospital intercom systems",
+"unspsc",42191700,"Medical gas products",
+"unspsc",42191701,"Medical gas or electric service tracks",
+"unspsc",42191702,"Medical gas delivery columns",
+"unspsc",42191703,"Medical gas outlets",
+"unspsc",42191704,"Medical gas air compressor systems",
+"unspsc",42191705,"Medical gas alarms",
+"unspsc",42191706,"Medical gas manifold",
+"unspsc",42191707,"Medical vacuum systems",
+"unspsc",42191708,"Medical air pressure control cabinets",
+"unspsc",42191709,"Medical gas shutoff valves or valve boxes",
+"unspsc",42191710,"Medical gas cylinder carts or stands or accessories",
+"unspsc",42191711,"Surgical compressed air tanks or accessories",
+"unspsc",42191800,"Patient beds and accessories",
+"unspsc",42191801,"Overbed tables or accessories",
+"unspsc",42191802,"Clinical incubators or infant warmers",
+"unspsc",42191803,"Clinical bassinets or cribs or pediatric beds or accessories",
+"unspsc",42191804,"Medical or surgical bedside rails",
+"unspsc",42191805,"Medical suspended columns",
+"unspsc",42191806,"Clinical trapeze bars",
+"unspsc",42191807,"Patient care beds or accessories for general use",
+"unspsc",42191808,"Patient care beds or accessories for specialty care",
+"unspsc",42191809,"Alternating pressure pads or pumps",
+"unspsc",42191810,"Patient care mattresses or accessories",
+"unspsc",42191811,"Infant positioning cradles",
+"unspsc",42191812,"Infant incubator supply kits",
+"unspsc",42191813,"Patient care cot covers",
+"unspsc",42191814,"Clinical incubator or infant warmer accessories",
+"unspsc",42191900,"Clinical cabinetry",
+"unspsc",42191901,"Bedside clinical cabinets or accessories",
+"unspsc",42191902,"Hospital armoires",
+"unspsc",42191903,"Medical monitor cabinets",
+"unspsc",42191904,"Narcotic cabinets or safes",
+"unspsc",42191905,"Medical treatment cabinets",
+"unspsc",42191906,"Blanket or solution warmer cabinets",
+"unspsc",42191907,"Medical instrument storage cabinets or chests",
+"unspsc",42192000,"Clinical procedure and examination tables",
+"unspsc",42192001,"Medical exam or procedure tables for general use",
+"unspsc",42192002,"Medical exam or procedure table accessories for general use excluding cover sheets",
+"unspsc",42192100,"Clinical seating and stools and related products",
+"unspsc",42192101,"Blood drawing or phlebotomy chairs or accessories",
+"unspsc",42192102,"Hospital recliners or accessories",
+"unspsc",42192103,"Patient chairs",
+"unspsc",42192104,"Physician stools and accessories",
+"unspsc",42192106,"Medical facility visitor chairs",
+"unspsc",42192107,"Clinical examination chairs or accessories",
+"unspsc",42192200,"Patient transport products",
+"unspsc",42192201,"Patient transport trolleys or accessories",
+"unspsc",42192202,"Gurneys or scissor lifts",
+"unspsc",42192203,"Geriatric chairs or accessories",
+"unspsc",42192204,"Patient transport incubators or accessories",
+"unspsc",42192205,"Patient scooter accessories",
+"unspsc",42192206,"Patient scooters",
+"unspsc",42192207,"Patient stretchers or stretcher accessories",
+"unspsc",42192208,"Wheelchair accessories",
+"unspsc",42192209,"Wheelchair ramps",
+"unspsc",42192210,"Wheelchairs",
+"unspsc",42192211,"Patient shifting boards or accessories",
+"unspsc",42192212,"Patient transfer mats",
+"unspsc",42192213,"Patient holding or evacuation system heater unit or accessories",
+"unspsc",42192300,"Patient lifts",
+"unspsc",42192301,"Patient lifts or accessories",
+"unspsc",42192302,"Clinical hydraulic lifts or accessories",
+"unspsc",42192303,"Patient suspended seats or slings",
+"unspsc",42192304,"Patient ceiling hoists",
+"unspsc",42192305,"Infant slings or accessories",
+"unspsc",42192400,"Medical equipment transport and transfer products",
+"unspsc",42192401,"Emergency or resuscitation carts",
+"unspsc",42192402,"Diagnostic or monitoring equipment specific carts",
+"unspsc",42192403,"Medical isolation carts",
+"unspsc",42192404,"Medical carts or accessories",
+"unspsc",42192405,"Irrigator mobile stands",
+"unspsc",42192406,"Urinal carrying carts",
+"unspsc",42192500,"Medical equipment protectors",
+"unspsc",42192501,"Medical equipment covers",
+"unspsc",42192502,"Medical equipment bags",
+"unspsc",42192600,"Medication dispensing and measuring devices and supplies",
+"unspsc",42192601,"Suppository molds",
+"unspsc",42192602,"Medication or pill dispensers or accessories",
+"unspsc",42192603,"Medicine feeding cups or bottles or accessories",
+"unspsc",42192604,"Drug delivery systems or accessories",
+"unspsc",42192605,"Aneurysm encapsulating kits",
+"unspsc",42200000,"Medical diagnostic imaging and nuclear medicine products",
+"unspsc",42201500,"Medical computed tomography CT or CAT systems and related products",
+"unspsc",42201501,"Medical computed tomography CT or CAT complete stationery unit installations",
+"unspsc",42201502,"Medical computed tomography CT or CAT mobile or transportable or van units",
+"unspsc",42201503,"Medical computed tomography CT or CAT 3 dimensional system components",
+"unspsc",42201504,"Medical computed tomography CT or CAT bone mineral content components",
+"unspsc",42201505,"Medical computed tomography CT or CAT consoles",
+"unspsc",42201506,"Medical computed tomography CT or CAT contrast agent injectors",
+"unspsc",42201507,"Medical computed tomography CT or CAT helical system components",
+"unspsc",42201508,"Medical computed tomography CT or CAT monitors",
+"unspsc",42201509,"Medical computed tomography CT or CAT power conditioners",
+"unspsc",42201510,"Medical computed tomography CT or CAT quality assurance or calibration phantoms or devices",
+"unspsc",42201511,"Medical computed tomography CT or CAT scanners or tubes",
+"unspsc",42201512,"Medical computed tomography CT or CAT tables or stands or chairs",
+"unspsc",42201513,"Medical computed tomography CT or CAT ultrafast system components",
+"unspsc",42201600,"Medical magnetic resonance imaging MRI products",
+"unspsc",42201601,"Medical magnetic resonance imaging MRI complete stationery unit installations",
+"unspsc",42201602,"Medical magnetic resonance imaging MRI mobile or transportable or van systems",
+"unspsc",42201603,"Medical magnetic resonance imaging MRI 3 dimensional system components",
+"unspsc",42201604,"Medical magnetic resonance imaging MRI quality assurance or calibration phantoms or devices",
+"unspsc",42201605,"Medical magnetic resonance imaging MRI coils",
+"unspsc",42201606,"Medical magnetic resonance imaging MRI contrast agent injectors",
+"unspsc",42201607,"Medical magnetic resonance imaging MRI monitors",
+"unspsc",42201608,"Medical magnetic resonance imaging MRI primary or remote or secondary consoles",
+"unspsc",42201609,"Medical magnetic resonance imaging MRI scanners",
+"unspsc",42201610,"Medical magnetic resonance imaging MRI surgical instruments or guidance systems",
+"unspsc",42201611,"Medical magnetic resonance imaging MRI tables",
+"unspsc",42201700,"Medical ultrasound and doppler and echo imaging products",
+"unspsc",42201701,"Cardiac ultrasound or doppler or echo units or cardioscopes",
+"unspsc",42201702,"Fetal or gynecological ultrasound or echo units",
+"unspsc",42201703,"Mammographic ultrasound or echo units",
+"unspsc",42201704,"Medical ultrasound bone densitometers",
+"unspsc",42201705,"Medical ultrasound or doppler or echo probe covers",
+"unspsc",42201706,"Medical ultrasound or doppler or echo probes",
+"unspsc",42201707,"Medical ultrasound or doppler or echo gel warmers",
+"unspsc",42201708,"Medical ultrasound or doppler or echo gels",
+"unspsc",42201709,"Medical ultrasound or doppler or echo monitors",
+"unspsc",42201710,"Medical ultrasound or doppler or echo printers",
+"unspsc",42201711,"Medical ultrasound or doppler or echo transducers or accessories",
+"unspsc",42201712,"Medical ultrasound or doppler or pulse echo or echography units for general diagnostic use",
+"unspsc",42201713,"Medical ultrasound or doppler or echo three dimensional components",
+"unspsc",42201714,"Thesiometers",
+"unspsc",42201715,"Vaginal ultrasound or echo probes or accessories",
+"unspsc",42201716,"Vascular ultrasound units",
+"unspsc",42201717,"Medical ultrasound transmission pads",
+"unspsc",42201718,"Medical ultrasound ophthalmic scanners",
+"unspsc",42201719,"Medical ultrasound scanning lotions",
+"unspsc",42201800,"Medical diagnostic x ray products",
+"unspsc",42201801,"Cardiology x ray films",
+"unspsc",42201802,"Chest x ray equipment",
+"unspsc",42201803,"Mammography x ray equipment",
+"unspsc",42201804,"Medical c arm x ray units",
+"unspsc",42201805,"Medical cine fluoroscopy equipment",
+"unspsc",42201806,"Medical radiology and fluoroscopy RF equipment",
+"unspsc",42201807,"Medical radioisotope scanners",
+"unspsc",42201808,"Medical x ray buckys",
+"unspsc",42201809,"Medical imaging contrast agent injectors or accessories",
+"unspsc",42201810,"Medical x ray film or cassettes for general use",
+"unspsc",42201811,"Medical x ray quality assurance or calibration devices",
+"unspsc",42201812,"Medical x ray tables or stands or chairs or cabinets or accessories",
+"unspsc",42201813,"Medical x ray tomography units",
+"unspsc",42201814,"Medical x ray tubes",
+"unspsc",42201815,"Medical x ray units for general diagnostic use",
+"unspsc",42201816,"Medical xeroradiography units",
+"unspsc",42201817,"X ray bone densitometers",
+"unspsc",42201818,"Combination step wedges and spin tops for radiographic equipment",
+"unspsc",42201819,"Medical x ray film hangers or its accessories",
+"unspsc",42201820,"Medical radiographic equipment grids",
+"unspsc",42201821,"Radiographic film cassette holders",
+"unspsc",42201822,"Medical x ray equipment cases or covers or accessories",
+"unspsc",42201823,"Medical x ray tube and transfomer unit",
+"unspsc",42201824,"Medical arthrography sets",
+"unspsc",42201825,"Medical x ray apparatus tube inserts",
+"unspsc",42201826,"Medical x ray apparatus repair kits",
+"unspsc",42201827,"Medical x ray darkroom tent repair kits",
+"unspsc",42201828,"Medical x ray apparatus filters",
+"unspsc",42201829,"Radiographic locators",
+"unspsc",42201830,"Medical x ray intensifying screens",
+"unspsc",42201831,"Medical x ray films or cassettes masks",
+"unspsc",42201832,"Radiographic film or cassette covers",
+"unspsc",42201833,"Radiographic film or cassette changers",
+"unspsc",42201834,"Medical radiographic x ray apparatus rectifier assemblies",
+"unspsc",42201835,"Medical x ray apparatus tube unit assemblies",
+"unspsc",42201836,"Medical x ray apparatus compression band assemblies",
+"unspsc",42201837,"Medical x ray water coolers",
+"unspsc",42201838,"Medical enteroclysis catheters or catheters kits",
+"unspsc",42201839,"Medical imaging procedure trays",
+"unspsc",42201840,"Vascular sealing devices",
+"unspsc",42201841,"Medical diagnostic x ray papers",
+"unspsc",42201900,"Medical x ray film illuminators and viewing equipment",
+"unspsc",42201901,"Medical x ray film hot spot lights",
+"unspsc",42201902,"Medical x ray film large rack viewing systems",
+"unspsc",42201903,"Medical x ray film view boxes",
+"unspsc",42201904,"Medical x ray film illuminator windows or screens",
+"unspsc",42201905,"Medical x ray film transfer cases",
+"unspsc",42201906,"Medical x ray film illuminator clips",
+"unspsc",42201907,"Medical x ray film stereoscopes",
+"unspsc",42201908,"Medical fluoroscopic screen hoods",
+"unspsc",42202000,"Medical diagnostic gamma cameras and related products",
+"unspsc",42202001,"Medical gamma cameras for general use",
+"unspsc",42202002,"Lymphatic mapping navigator systems or accessories",
+"unspsc",42202003,"Lymphatic mapping probes",
+"unspsc",42202004,"Lymphatic mapping collimators",
+"unspsc",42202005,"Lymphatic mapping procedure pack",
+"unspsc",42202100,"Brachytherapy products",
+"unspsc",42202101,"Brachytherapy intracavity containers or seeds",
+"unspsc",42202102,"Brachytherapy catheters or syringes or inserters or applicators",
+"unspsc",42202103,"Brachytherapy seed storage containers",
+"unspsc",42202104,"Brachytherapy seed capture kits",
+"unspsc",42202105,"Brachytherapy units",
+"unspsc",42202200,"Gamma radiation therapy products",
+"unspsc",42202201,"Radiosurgical gamma knife collimators or helmets",
+"unspsc",42202202,"Radiosurgical gamma knife units or scintillators",
+"unspsc",42202203,"Cushion sets for radiosurgical helmets",
+"unspsc",42202300,"Medical linear accelerator intensity modulated radiation therapy IMRT products",
+"unspsc",42202301,"Medical linear accelerator intensity modulated radiation therapy IMRT two dimensional units",
+"unspsc",42202302,"Medical linear accelerator intensity modulated radiation therapy IMRT three dimensional units",
+"unspsc",42202303,"Medical linear accelerator intensity modulated radiation therapy IMRT collimators",
+"unspsc",42202400,"Medical positron emission tomography PET equipment and related products",
+"unspsc",42202401,"Medical positron emission tomography PET units",
+"unspsc",42202500,"Medical single photon emission computed tomography SPECT equipment and related products",
+"unspsc",42202501,"Medical single photon emission computed tomography SPECT units",
+"unspsc",42202600,"Radioimmunotherapy and radioisotope administration products",
+"unspsc",42202601,"Thyroid irradiation therapy supplies",
+"unspsc",42202602,"Test kits for radioimmunotherapy",
+"unspsc",42202700,"Radiotherapy teletherapy products",
+"unspsc",42202701,"Radiotherapy teletherapy cobalt 60 equipment",
+"unspsc",42202702,"Radiotherapy teletherapy linear accelerators",
+"unspsc",42202703,"Radiotherapy teletherapy orthovoltage x ray machines",
+"unspsc",42202704,"Radiotherapy teletherapy superficial x ray machines",
+"unspsc",42202800,"Lithotriptors and related products",
+"unspsc",42202801,"Ultrasound lithotriptors",
+"unspsc",42202802,"Lithotriptic electrodes or probes",
+"unspsc",42202900,"Low energy medical x ray equipment",
+"unspsc",42202901,"Low energy medical x ray units",
+"unspsc",42203000,"Medical linear accelerators and related products",
+"unspsc",42203001,"Mobile or transportable medical linear accelerators",
+"unspsc",42203100,"Radiobiological instruments",
+"unspsc",42203101,"Radiobiological effect microdosimeters",
+"unspsc",42203200,"Radiotherapy simulators",
+"unspsc",42203201,"X ray and fluoroscopy RF radiotherapy planning simulators",
+"unspsc",42203202,"Computed tomography CT or CAT radiotherapy simulators",
+"unspsc",42203300,"Medical stereotactic systems",
+"unspsc",42203301,"Frameless stereotactic therapy systems",
+"unspsc",42203302,"Stereotactic therapy headframes",
+"unspsc",42203303,"Stereotactic biopsy systems",
+"unspsc",42203400,"Vascular imaging and interventional cardiology and cardiac catheterization lab products",
+"unspsc",42203401,"Coronary stents",
+"unspsc",42203402,"Diagnostic or interventional vascular catheters or sets",
+"unspsc",42203403,"Diagnostic or interventional vascular catheter introducers or sets",
+"unspsc",42203404,"Vascular imaging guidewires or snares or accessories",
+"unspsc",42203405,"Angioplasty balloons",
+"unspsc",42203406,"Removal devices of diagnostic or interventional vascular catheters or sets",
+"unspsc",42203407,"Angiography contrast medium delivery sets",
+"unspsc",42203408,"Cardiovascular sheath kits",
+"unspsc",42203409,"Angioscopic valvulotomes",
+"unspsc",42203410,"Cardiovascular catheter protector sleeves",
+"unspsc",42203411,"Catheter carts",
+"unspsc",42203412,"Peripheral or biliary stents",
+"unspsc",42203500,"Cardiac pacemakers and related products",
+"unspsc",42203501,"Cardiac pacemaker generators or implantable defibrillators or accessories",
+"unspsc",42203502,"Cardiac pacing leads or electrodes or accessories",
+"unspsc",42203503,"Cardiac pacing lead introducers or sets",
+"unspsc",42203504,"Cardiac catheterization lab equipment",
+"unspsc",42203600,"Medical radiological imaging information and archiving products",
+"unspsc",42203601,"Defense Digital Imaging Network DIN system equipment",
+"unspsc",42203602,"Digital Imaging Communications in Medicine DICOM standard system equipment",
+"unspsc",42203603,"Medical picture archiving computer systems PACS",
+"unspsc",42203604,"Medical x ray film archiving system hardware",
+"unspsc",42203605,"Medical x ray film archiving system software",
+"unspsc",42203700,"Medical imaging processing equipment and supplies",
+"unspsc",42203701,"Medical x ray film daylight stampers or identification printers",
+"unspsc",42203702,"Medical imaging wet darkroom or daylight processors",
+"unspsc",42203703,"Medical x ray passthrough boxes",
+"unspsc",42203704,"Medical toners or developers",
+"unspsc",42203705,"Medical imaging dry laser printers or imagers",
+"unspsc",42203706,"Medical x ray film processing chemical kits",
+"unspsc",42203707,"Medical x ray darkroom equipment or supplies",
+"unspsc",42203708,"Medical x ray film processing fixers",
+"unspsc",42203709,"Combination displays and printers for x ray system calibrator sets",
+"unspsc",42203710,"Medical x ray film markers",
+"unspsc",42203800,"Medical radiological positioning aids",
+"unspsc",42203801,"Medical computed tomography CT or CAT positioning aids",
+"unspsc",42203802,"Medical magnetic resonance imaging MRI positioning aids",
+"unspsc",42203803,"Medical radiological positioning aids for general radiological use",
+"unspsc",42203900,"Medical radiation detection or monitoring products",
+"unspsc",42203901,"Medical radiation dosimeters",
+"unspsc",42203902,"Medical radiation films or badges",
+"unspsc",42204000,"Medical radiological shielding and protection products",
+"unspsc",42204001,"Medical radiological shielding apron racks",
+"unspsc",42204002,"Medical radiological shielding aprons or masks or drapes",
+"unspsc",42204003,"Medical radiological shielding portable containers for radioactive materials",
+"unspsc",42204004,"Medical radiological shielding earplugs",
+"unspsc",42204005,"Medical radiological shielding gloves",
+"unspsc",42204006,"Medical radiological shielding freestanding or portable screens",
+"unspsc",42204007,"Medical radiological shielding wall or ceiling or floor installed panels",
+"unspsc",42204008,"Medical radiological shielding chambers or rooms or safes",
+"unspsc",42210000,"Independent living aids for the physically challenged",
+"unspsc",42211500,"Ambulation and transfer and positioning aids for the physically challenged",
+"unspsc",42211501,"Canes or cane accessories",
+"unspsc",42211502,"Crutches or crutch accessories",
+"unspsc",42211503,"Positioning devices",
+"unspsc",42211504,"Standers or standing aids",
+"unspsc",42211505,"Walker or rollator accessories",
+"unspsc",42211506,"Walkers or rollators",
+"unspsc",42211507,"Whole body sliding or turning devices",
+"unspsc",42211508,"Multifunctional mobility devices or accessories",
+"unspsc",42211509,"Head or face protective helmets or devices or accessories for the physically challenged",
+"unspsc",42211600,"Bathroom and bathing aids for the physically challenged",
+"unspsc",42211601,"Bathboards for the physically challenged",
+"unspsc",42211602,"Bath brushes or sponges or scrubbers for the physically challenged",
+"unspsc",42211603,"Bath lifts or accessories for the physically challenged",
+"unspsc",42211604,"Bath mitts for the physically challenged",
+"unspsc",42211605,"Bath pillows for the physically challenged",
+"unspsc",42211606,"Commodes or accessories for the physically challenged",
+"unspsc",42211607,"Elevated toilet seats for the physically challenged",
+"unspsc",42211608,"Grab bars or tub safety rails for the physically challenged",
+"unspsc",42211609,"Hand held shower heads for the physically challenged",
+"unspsc",42211610,"Shower or bath chairs or seats for the physically challenged",
+"unspsc",42211611,"Sitz baths for the physically challenged",
+"unspsc",42211612,"Toilet arm supports for the physically challenged",
+"unspsc",42211613,"Toilet frames for the physically challenged",
+"unspsc",42211614,"Toilet seats for the physically challenged",
+"unspsc",42211615,"Toilet seat lifters for the physically challenged",
+"unspsc",42211616,"Hygiene or stimulation toileting aids for the physically challenged",
+"unspsc",42211617,"Transfer benches for the physically challenged",
+"unspsc",42211618,"Bedwetting wrist alarms for the physically chalenged",
+"unspsc",42211700,"Communication aids for the physically challenged",
+"unspsc",42211701,"Adaptive communication switches for the physically challenged",
+"unspsc",42211702,"Braille devices for the physically challenged",
+"unspsc",42211703,"Braille writing paper or plastic for physically challenged",
+"unspsc",42211704,"Headpointers or mouthsticks for the physically challenged",
+"unspsc",42211705,"Hearing aids for the physically challenged",
+"unspsc",42211706,"Letter or symbol boards for the physically challenged",
+"unspsc",42211707,"Telecommunication devices TDD or teletypewriters TTY  for the physically challenged",
+"unspsc",42211708,"Telephone aids for the physically challenged",
+"unspsc",42211709,"Typing aids for the physically challenged",
+"unspsc",42211710,"Writing aids for the physically challenged",
+"unspsc",42211711,"Voice synthesizers for the physically challenged",
+"unspsc",42211712,"Cases for hearing aids",
+"unspsc",42211800,"Dressing and grooming aids for the physically challenged",
+"unspsc",42211801,"Button hooks for the physically challenged",
+"unspsc",42211802,"Dressing kits for the physically challenged",
+"unspsc",42211803,"Dressing sticks for the physically challenged",
+"unspsc",42211804,"Hairbrushes or combs for the physically challenged",
+"unspsc",42211805,"Inspection mirror for the physically challenged",
+"unspsc",42211806,"Lotion applicators for the physically challenged",
+"unspsc",42211807,"Mouth care for the physically challenged",
+"unspsc",42211808,"Nail clippers or files for the physically challenged",
+"unspsc",42211809,"Pant clips for the physically challenged",
+"unspsc",42211810,"Shoe fasteners for the physically challenged",
+"unspsc",42211811,"Shoe horns for the physically challenged",
+"unspsc",42211812,"Sock or stocking aids for the physically challenged",
+"unspsc",42211813,"Zipper pulls for the physically challenged",
+"unspsc",42211900,"Eating and drinking and food preparation aids for the physically challenged",
+"unspsc",42211901,"Anti slip materials for the physically challenged",
+"unspsc",42211902,"Assistive cooking devices for the physically challenged",
+"unspsc",42211903,"Can openers for the physically challenged",
+"unspsc",42211904,"Choppers for the physically challenged",
+"unspsc",42211905,"Cups or mugs for the physically challenged",
+"unspsc",42211906,"Cutlery or utensil holders for the physically challenged",
+"unspsc",42211907,"Cutlery or utensils for the physically challenged",
+"unspsc",42211908,"Cutting or paring boards for the physically challenged",
+"unspsc",42211909,"Drink holders for the physically challenged",
+"unspsc",42211910,"Food catchers or bibs for the physically challenged",
+"unspsc",42211911,"Food guards for the physically challenged",
+"unspsc",42211912,"Holders for kitchen devices for the physically challenged",
+"unspsc",42211913,"Jumbo digit timers for the physically challenged",
+"unspsc",42211914,"Measuring aids for the physically challenged",
+"unspsc",42211915,"Self feeders or accessories for the physically challenged",
+"unspsc",42211916,"Straws or straw holders for the physically challenged",
+"unspsc",42211917,"Tableware for the physically challenged",
+"unspsc",42211918,"Talking food scales for the physically challenged",
+"unspsc",42212000,"Housekeeping and homemaking aids for the physically challenged",
+"unspsc",42212001,"Door openers for the physically challenged",
+"unspsc",42212002,"Key turners or holders for the physically challenged",
+"unspsc",42212003,"Knob turners for the physically challenged",
+"unspsc",42212004,"Light switch extensions for the physically challenged",
+"unspsc",42212005,"Long handled dustpans or brushes for the physically challenged",
+"unspsc",42212006,"Self opening scissors for the physically challenged",
+"unspsc",42212007,"Suction brushes for the physically challenged",
+"unspsc",42212100,"Leisure and recreational aids for the physically challenged",
+"unspsc",42212101,"Automatic card shufflers for the physically challenged",
+"unspsc",42212102,"Board games for the physically challenged",
+"unspsc",42212103,"Book holders for the physically challenged",
+"unspsc",42212104,"Braille or large face playing cards for the physically challenged",
+"unspsc",42212105,"Camping equipment for the physically challenged",
+"unspsc",42212106,"Fishing or hunting aids for the physically challenged",
+"unspsc",42212107,"Flotation or swimming aids for the physically challenged",
+"unspsc",42212108,"Gardening tools for the physically challenged",
+"unspsc",42212109,"Handicraft tools or materials or equipment for the physically challenged",
+"unspsc",42212110,"Page turners for the physically challenged",
+"unspsc",42212111,"Playing card holders for the physically challenged",
+"unspsc",42212112,"Sewing aids for the physically challenged",
+"unspsc",42212113,"Smokers aids for the physically challenged",
+"unspsc",42212200,"Medication handling aids for the physically challenged",
+"unspsc",42212201,"Pill crushers or splitters for the physically challenged",
+"unspsc",42212202,"Pill organizers for the physically challenged",
+"unspsc",42212203,"Pill reminders for the physically challenged",
+"unspsc",42212204,"Tube squeezers for the physically challenged",
+"unspsc",42212300,"Reaching and gripping aids for the physically challenged",
+"unspsc",42212301,"Grip materials or devices for the physically challenged",
+"unspsc",42212302,"Holders for the physically challenged",
+"unspsc",42212303,"Container openers for the physically challenged",
+"unspsc",42212304,"Reachers for the physically challenged",
+"unspsc",42220000,"Intravenous and arterial administration products",
+"unspsc",42221500,"Intravenous and arterial cannulas and catheters and accessories",
+"unspsc",42221501,"Arterial line catheters",
+"unspsc",42221502,"Arterial line continuous catheter flush valves",
+"unspsc",42221503,"Central venous catheters",
+"unspsc",42221504,"Peripheral intravenous catheters for general use",
+"unspsc",42221505,"Pediatric or microflow or scalp vein intravenous or arterial catheters",
+"unspsc",42221506,"Umbilical catheters",
+"unspsc",42221507,"Intravenous or arterial start kits without catheter",
+"unspsc",42221508,"Intravenous or arterial catheter skin care kits",
+"unspsc",42221509,"Intravenous or arterial catheter trays",
+"unspsc",42221512,"Intravenous or arterial cannulas or accessories",
+"unspsc",42221513,"Cardiovascular catheterization kits",
+"unspsc",42221600,"Intravenous and arterial tubing and administration sets and related products",
+"unspsc",42221601,"Intravenous or arterial administration air bubble detectors",
+"unspsc",42221602,"Intravenous or arterial administration ports or injection sites or caps or protectors",
+"unspsc",42221603,"Intravenous or arterial extension tubing",
+"unspsc",42221604,"Intravenous or arterial tubing adapters or connectors or locks or caps or protectors",
+"unspsc",42221605,"Intravenous or arterial tubing check valves",
+"unspsc",42221606,"Intravenous or arterial tubing clamps",
+"unspsc",42221607,"Intravenous or arterial tubing filters or screens for general use",
+"unspsc",42221608,"Intravenous or arterial tubing identification labels or tapes",
+"unspsc",42221609,"Intravenous or arterial tubing administration sets",
+"unspsc",42221610,"Intravenous tubing spike entry ports or caps or protectors",
+"unspsc",42221611,"Intravenous tubing spikes or caps or protectors",
+"unspsc",42221612,"Intravenous or arterial tubing needleless injection ports or stopcocks or manifolds",
+"unspsc",42221613,"Intravenous tubing transfer leg closures or snaps",
+"unspsc",42221614,"Intravenous tubing with catheter administration kits",
+"unspsc",42221615,"Secondary medication intravenous tubing",
+"unspsc",42221616,"Intravenous or arterial extension sets",
+"unspsc",42221617,"Needle resheathers",
+"unspsc",42221618,"Intravenous or arterial procedure trays",
+"unspsc",42221700,"Intravenous and arterial infusion bags and containers and related products",
+"unspsc",42221701,"Intravenous or arterial infusion single port bags or containers",
+"unspsc",42221702,"Intravenous or arterial infusion transfer bags or containers",
+"unspsc",42221703,"Intravenous or arterial infusion fluid warmers",
+"unspsc",42221704,"Intravenous or arterial pressure infusion bags",
+"unspsc",42221705,"Analgesia infusion vial assemblies",
+"unspsc",42221706,"Intravenous or arterial infusion transfer bags or container spouts",
+"unspsc",42221707,"Analgesic infusion sets or kits",
+"unspsc",42221800,"Intravenous and arterial catheter and needle positioning aids",
+"unspsc",42221801,"Intravenous or arterial arm board covers",
+"unspsc",42221802,"Intravenous or arterial arm boards",
+"unspsc",42221803,"Intravenous or arterial catheter positioning tapes or dressings or straps or cuffs",
+"unspsc",42221900,"Intravenous or arterial flow measurement and regulation products",
+"unspsc",42221901,"Dial calibrated intravenous flowmeters or regulators",
+"unspsc",42221902,"Intravenous drop counters or regulators",
+"unspsc",42221903,"Ultrasonic blood flow detectors",
+"unspsc",42222000,"Intravenous infusion pumps and its analyzers and sensors and its accessories",
+"unspsc",42222001,"Intravenous infusion pumps for general use",
+"unspsc",42222002,"Intravenous syringe infusion pumps",
+"unspsc",42222003,"Multichannel intravenous infusion pumps",
+"unspsc",42222004,"Patient controlled analgesia infusion pumps",
+"unspsc",42222005,"Intravenous pump parts or accessories",
+"unspsc",42222006,"Intravenous infusion pump analyzers or sensors",
+"unspsc",42222007,"Intravenous infusion pump transducers",
+"unspsc",42222008,"Infusion pump kits or accessories",
+"unspsc",42222100,"Intravenous and arterial equipment suspension and transport systems",
+"unspsc",42222101,"Intravenous or arterial line equipment hangers",
+"unspsc",42222102,"Mounted tracks or racks for intravenous infusion gravity systems",
+"unspsc",42222103,"Intravenous infusion poles for wheelchairs",
+"unspsc",42222104,"Intravenous or arterial line poles or stands",
+"unspsc",42222200,"Needleless intraveneous injection and withdrawal systems",
+"unspsc",42222201,"Needleless intraveneous injection syringe sets or injection cannulas",
+"unspsc",42222202,"Needleless vial or bag withdrawal cannulas or adapters or decanters",
+"unspsc",42222300,"Blood administration and transfusion products",
+"unspsc",42222301,"Blood transfusion administration kits",
+"unspsc",42222302,"Blood transfusion filters or screens or accessories",
+"unspsc",42222303,"Blood administration or transfusion identification systems",
+"unspsc",42222304,"Blood administration or transfusion tubing",
+"unspsc",42222305,"Blood administration or transfusion tubing clamps",
+"unspsc",42222306,"Blood administration or transfusion waste collection systems",
+"unspsc",42222307,"Blood warming or transfusion systems",
+"unspsc",42222308,"Blood administration or transfusion bags or containers",
+"unspsc",42222309,"Blood administration or transfusion conservation systems",
+"unspsc",42230000,"Clinical nutrition",
+"unspsc",42231500,"Enteral feeding equipment and supplies",
+"unspsc",42231501,"Enteral feeding infusion pumps",
+"unspsc",42231502,"Enteral feeding administration sets",
+"unspsc",42231503,"Enteral feeding irrigation sets or trays",
+"unspsc",42231504,"Enteral nutrition bags or containers",
+"unspsc",42231505,"Enteral feeding set adapters or connectors or extensions",
+"unspsc",42231506,"Nasoenteric tube securing devices",
+"unspsc",42231507,"Enteral tube cleaning brush",
+"unspsc",42231508,"Enteral feeding set valves",
+"unspsc",42231509,"Enteral nutrition weighing chambers",
+"unspsc",42231510,"Enteral feeding infusion pump tubing sets",
+"unspsc",42231600,"Gastrostomy and jejunostomy access devices or accessories",
+"unspsc",42231601,"Gastrostomy tubes for general use",
+"unspsc",42231602,"Percutaneous Endoscopic Gastrostomy tubes",
+"unspsc",42231603,"Jejunostomy tubes",
+"unspsc",42231604,"Gastric access buttons",
+"unspsc",42231605,"Gastrostomy or jejunostomy tube holders",
+"unspsc",42231606,"Colon decompression kits",
+"unspsc",42231608,"Jejunostomy catheter and needle sets",
+"unspsc",42231609,"Gastrostomy feeding tube kits",
+"unspsc",42231700,"Nasoenteric tubes",
+"unspsc",42231701,"Nasogastric tubes",
+"unspsc",42231702,"Nasojejunal tubes",
+"unspsc",42231703,"Gastric decompression tubes",
+"unspsc",42231704,"Nasoenteric tubes not elsewhere classified",
+"unspsc",42231705,"Nasogastric filters",
+"unspsc",42231800,"Formulas and products for nutritional support",
+"unspsc",42231801,"Adult supplemental formulas for general use",
+"unspsc",42231802,"Pediatric supplemental formulas",
+"unspsc",42231803,"Adult disease specific supplemental formulas",
+"unspsc",42231804,"Pediatric disease specific supplemental formulas",
+"unspsc",42231805,"Nutritional bars or pudding or other supplements",
+"unspsc",42231806,"Medical nutrition food or liquid thickeners",
+"unspsc",42231807,"Nursing bottle nipples",
+"unspsc",42231900,"Breast feeding equipment and supplies",
+"unspsc",42231901,"Breast pumps or its accessories",
+"unspsc",42231902,"Breast shells or shields",
+"unspsc",42231903,"Breast pump kits",
+"unspsc",42232000,"Tablet crushers and cutters and related products",
+"unspsc",42232001,"Tablet crushers or accessories",
+"unspsc",42232002,"Tablet crusher dispensers or accessories",
+"unspsc",42232003,"Tablet cutters or accessories",
+"unspsc",42240000,"Orthopedic and prosthetic and sports medicine products",
+"unspsc",42241500,"Casting and splinting supplies",
+"unspsc",42241501,"Cast footwear",
+"unspsc",42241502,"Cast or splint padding materials",
+"unspsc",42241503,"Cast or splint protectors",
+"unspsc",42241504,"Cast or splint stockinet or liners",
+"unspsc",42241505,"Orthopedic casting rolls or tapes",
+"unspsc",42241506,"Orthopedic casting material for splints",
+"unspsc",42241507,"Orthopedic splint systems",
+"unspsc",42241509,"Thermoplastic orthoses components",
+"unspsc",42241510,"Thermoplastic splint kits or materials",
+"unspsc",42241511,"Traction splint sets",
+"unspsc",42241512,"Cast or splint bonding materials",
+"unspsc",42241513,"Carrier and storage cases for splints or precut splints or splint systems",
+"unspsc",42241514,"Instrument rolls for splint sets or accessories",
+"unspsc",42241515,"Cases for splint or accessories",
+"unspsc",42241600,"Casting equipment and parts and accessories",
+"unspsc",42241601,"Cast or splint carts",
+"unspsc",42241602,"Cast cutters or saws",
+"unspsc",42241603,"Cast removal systems",
+"unspsc",42241604,"Cast vacuums",
+"unspsc",42241606,"Cast impression trays",
+"unspsc",42241607,"Cast stands",
+"unspsc",42241700,"Orthopedic softgoods for lower extremity",
+"unspsc",42241701,"Ankle or foot orthopedic softgoods",
+"unspsc",42241702,"Hip orthopedic softgoods",
+"unspsc",42241703,"Knee braces or hinged knee supports",
+"unspsc",42241704,"Knee immobilizers or arthroscopic wraps",
+"unspsc",42241705,"Leg orthopedic softgoods or accessories",
+"unspsc",42241706,"Orthotics or foot care products",
+"unspsc",42241707,"Walking braces",
+"unspsc",42241708,"Femoral fracture pillows",
+"unspsc",42241800,"Orthopedic softgoods for upper extremity and torso",
+"unspsc",42241801,"Arm orthopedic softgoods",
+"unspsc",42241802,"Back or lumbar or sacral orthopedic softgoods",
+"unspsc",42241803,"Cervical collars or neck braces",
+"unspsc",42241804,"Clavicle orthopedic softgoods",
+"unspsc",42241805,"Elbow orthopedic softgoods",
+"unspsc",42241806,"Forearm or wrist or thumb orthopedic softgoods",
+"unspsc",42241807,"Hand or finger orthopedic softgoods",
+"unspsc",42241808,"Ribs or abdomen orthopedic softgoods",
+"unspsc",42241809,"Shoulder orthopedic softgoods",
+"unspsc",42241810,"Spine orthopedic soft goods",
+"unspsc",42241811,"Hernia truss",
+"unspsc",42241900,"Outrigger and dynamic splinting supplies",
+"unspsc",42241901,"Outrigger splint kits",
+"unspsc",42241902,"Outrigger splint parts or accessories",
+"unspsc",42242000,"Prosthetic devices or accessories and supplies",
+"unspsc",42242001,"Lower extremity prosthetic devices",
+"unspsc",42242002,"Upper extremity prosthetic devices",
+"unspsc",42242003,"Prosthetic clamping devices or accessories",
+"unspsc",42242004,"Preparation kit for penile prosthesis",
+"unspsc",42242100,"Orthopedic traction supplies and accessories",
+"unspsc",42242101,"Arm traction supplies",
+"unspsc",42242102,"Hand or finger traction supplies",
+"unspsc",42242103,"Head or neck traction supplies",
+"unspsc",42242104,"Leg traction supplies",
+"unspsc",42242105,"Mobile traction carts",
+"unspsc",42242106,"Pelvis or back traction supplies",
+"unspsc",42242107,"Pivotal traction therapy supplies",
+"unspsc",42242108,"Orthopedic traction hardware or weights",
+"unspsc",42242109,"Orthopedic traction softgoods for general use",
+"unspsc",42242300,"Orthopedic equipment and supplies",
+"unspsc",42242301,"Orthopedic scar pumps",
+"unspsc",42242302,"Orthopedic upper limb appliances",
+"unspsc",42250000,"Physical and occupational therapy and rehabilitation products",
+"unspsc",42251500,"Cognitive and dexterity and perceptual and sensory evaluation and therapy products",
+"unspsc",42251501,"Dressing education products",
+"unspsc",42251502,"Cognitive or dexterity or perceptual or sensory evaluation or testing products",
+"unspsc",42251503,"Therapeutic games",
+"unspsc",42251504,"Therapeutic pegboards or activity boards",
+"unspsc",42251505,"Therapeutic puzzles",
+"unspsc",42251506,"Therapeutic decorating boxes",
+"unspsc",42251600,"Rehabilitation exercise devices and equipment",
+"unspsc",42251601,"Balance beams or boards or bolsters or rockers for rehabilitation or therapy",
+"unspsc",42251602,"Climbing devices for rehabilitation or therapy",
+"unspsc",42251603,"Continuous passive motion CPM devices or accessories",
+"unspsc",42251604,"Extremity exercise skates for rehabilitation or therapy",
+"unspsc",42251605,"Pedal exercisers for rehabilitation or therapy",
+"unspsc",42251606,"Powder boards for rehabilitation or therapy",
+"unspsc",42251607,"Pulleys or accessories for rehabilitation or therapy",
+"unspsc",42251608,"Resistive exercise bands or putty or tubing or accessories for rehabilitation or therapy",
+"unspsc",42251609,"Skateboards or figure eight boards for rehabilitation or therapy",
+"unspsc",42251610,"Therapeutic balls or accessories",
+"unspsc",42251611,"Vestibular motion devices for rehabilitation or therapy",
+"unspsc",42251612,"Weights or sets or accessories for rehabilitation or therapy",
+"unspsc",42251613,"Treadmill exercisers  for rehabilitation or therapy",
+"unspsc",42251614,"Sandbags or sandbag sets for rehabilitation or therapy",
+"unspsc",42251615,"Weight belts or kits for rehabilitation or therapy",
+"unspsc",42251616,"Electric vibrators for rehabilitation or therapy",
+"unspsc",42251617,"Therapeutic cushion seats or accessories",
+"unspsc",42251618,"Wrist exercisers for rehabilitation or therapy",
+"unspsc",42251619,"Therapeutic ceremic clays or accessories",
+"unspsc",42251620,"Mats or platforms for rehabilitation or therapy",
+"unspsc",42251621,"Boot exercisers for rehabilitation or therapy",
+"unspsc",42251622,"Lung exercisers for rehabilitation or therapy",
+"unspsc",42251623,"Ultrasonic therapy apparatus or supplies",
+"unspsc",42251624,"Weight machines for rehabilitation or therapy",
+"unspsc",42251700,"Gait training products",
+"unspsc",42251701,"Gait belts for rehabilitation or therapy",
+"unspsc",42251702,"Training ramps for rehabilitation or therapy",
+"unspsc",42251703,"Training stairs for rehabilitation or therapy",
+"unspsc",42251704,"Gait bars for rehabilitation or therapy",
+"unspsc",42251705,"Parallel bars for rehabilitation or therapy",
+"unspsc",42251706,"Gait training walkers or bikers or exercisers or accessories",
+"unspsc",42251800,"Work hardening equipment for rehabilitation or therapy",
+"unspsc",42251801,"Bolt boards or accessories for rehabilitation or therapy",
+"unspsc",42251802,"Lift boxes or accessories for rehabilitation or therapy",
+"unspsc",42251803,"Pipe trees or accessories fore rehabilitation or therapy",
+"unspsc",42251804,"Push or pull carts or accessories for rehabilitation or therapy",
+"unspsc",42251805,"Work tables or stations or accessories for rehabilitation or therapy",
+"unspsc",42260000,"Postmortem and mortuary equipment and supplies",
+"unspsc",42261500,"Pathology dissection instruments and supplies",
+"unspsc",42261501,"Autopsy scissors",
+"unspsc",42261502,"Autopsy dissection forceps for general use",
+"unspsc",42261503,"Autopsy bullet probes",
+"unspsc",42261504,"Autopsy thread or needle pullers",
+"unspsc",42261505,"Autopsy knives or blades",
+"unspsc",42261506,"Autopsy chisels or osteotomes",
+"unspsc",42261507,"Postmortem thread",
+"unspsc",42261508,"Postmortem needles",
+"unspsc",42261509,"Autopsy dissection kits",
+"unspsc",42261510,"Postmortem incision clips",
+"unspsc",42261511,"Autopsy vein directors",
+"unspsc",42261512,"Autopsy saws",
+"unspsc",42261513,"Autopsy saw blades or accessories",
+"unspsc",42261514,"Dissection boards or pads",
+"unspsc",42261515,"Cases for postmortem surgical instruments or accessories",
+"unspsc",42261516,"Instrument rolls for postmortem surgical instruments or accessories",
+"unspsc",42261600,"Autopsy equipment and supplies",
+"unspsc",42261601,"Bone dust collectors",
+"unspsc",42261602,"Body bags",
+"unspsc",42261603,"Cadaver transport bags",
+"unspsc",42261604,"Autopsy head rests",
+"unspsc",42261605,"Autopsy body boards",
+"unspsc",42261606,"Autopsy hanging scales",
+"unspsc",42261607,"Autopsy specimen bags or containers",
+"unspsc",42261608,"Autopsy infectious disease kits",
+"unspsc",42261609,"Postmortem identification tags or bracelets",
+"unspsc",42261610,"Autopsy fluid collection vacuum aspirators or tubing",
+"unspsc",42261611,"Postmortem rectal thermometers",
+"unspsc",42261612,"Postmortem finger straighteners",
+"unspsc",42261613,"Cadaver tissue builder kits",
+"unspsc",42261700,"Autopsy furniture",
+"unspsc",42261701,"Autopsy grossing workstations or accessories",
+"unspsc",42261702,"Autopsy sinks or accessories",
+"unspsc",42261703,"Autopsy tables or accessories",
+"unspsc",42261704,"Necropsy tables or accessories",
+"unspsc",42261705,"Postmortem animal dissection tables or accessories",
+"unspsc",42261706,"Embalming workstations or accessories",
+"unspsc",42261707,"Autopsy down draft workstations or accessories",
+"unspsc",42261800,"Cadaver transport and storage equipment and supplies",
+"unspsc",42261801,"Cadaver storage racks",
+"unspsc",42261802,"Cadaver carriers",
+"unspsc",42261803,"Cadaver scissor lift trolleys",
+"unspsc",42261804,"Morgue cabinet refrigerators",
+"unspsc",42261805,"Morgue walk in refrigerators",
+"unspsc",42261806,"Morgue freezers",
+"unspsc",42261807,"Autopsy carts",
+"unspsc",42261808,"Cadaver trays",
+"unspsc",42261809,"Cadaver lifter or transfer devices",
+"unspsc",42261810,"Body transport containers",
+"unspsc",42261900,"Clinical forensics equipment and supplies",
+"unspsc",42261901,"Postmortem fingerprint or impression materials",
+"unspsc",42261902,"Antiputrefaction masks",
+"unspsc",42261903,"Postmortem blood detection kits or supplies",
+"unspsc",42261904,"Biological evidence collection kits",
+"unspsc",42262000,"Embalming equipment and supplies",
+"unspsc",42262001,"Embalming cavity injectors",
+"unspsc",42262002,"Embalming vein drainage tubes",
+"unspsc",42262003,"Embalming fluids or chemical treatments",
+"unspsc",42262004,"Embalming injecting tubes",
+"unspsc",42262005,"Embalming sinks or accessories",
+"unspsc",42262006,"Embalming kits",
+"unspsc",42262007,"Embalming injector needles",
+"unspsc",42262008,"Eye caps",
+"unspsc",42262100,"Mortuary equipment and supplies",
+"unspsc",42262101,"Mortuary outfits",
+"unspsc",42262102,"Mortuary packs",
+"unspsc",42262103,"Mortuary wraps",
+"unspsc",42262104,"Mortuary aspirators",
+"unspsc",42262105,"Mortuary hardening compounds",
+"unspsc",42270000,"Respiratory and anesthesia and resuscitation products",
+"unspsc",42271500,"Respiratory monitoring products",
+"unspsc",42271501,"Apnea monitors or accessories",
+"unspsc",42271502,"Arterial blood gas monitors or accessories",
+"unspsc",42271503,"End tidal carbon dioxide monitors or supplies",
+"unspsc",42271504,"Esophageal stethoscopes",
+"unspsc",42271505,"Respiratory monitoring kits or its accessories",
+"unspsc",42271506,"Oxygen monitors or supplies",
+"unspsc",42271600,"Pulmonary function testing and treatment products",
+"unspsc",42271601,"Body plethysmographs",
+"unspsc",42271602,"Spirometers or its accessories or its supplies",
+"unspsc",42271603,"Bedside pulmonary function screeners",
+"unspsc",42271604,"Peak flowmeters",
+"unspsc",42271605,"Pulmonary function calculators",
+"unspsc",42271606,"Pulmonary calibration devices",
+"unspsc",42271607,"Pulmonary functioning tubing or accessories",
+"unspsc",42271608,"Pulmonary stress test products",
+"unspsc",42271609,"Sleep study monitors or accessories",
+"unspsc",42271610,"Transcutaneous monitors or related products",
+"unspsc",42271611,"Pulmonary ventilation monitors",
+"unspsc",42271612,"Pulmonary gas analyzers or monitors",
+"unspsc",42271613,"Pulmonary pressure monitors",
+"unspsc",42271614,"Respiratory temperature monitors",
+"unspsc",42271615,"Pneumotachs",
+"unspsc",42271616,"Pulmonary function monitor filters",
+"unspsc",42271617,"Chest percussors",
+"unspsc",42271618,"Spirometer recording pens",
+"unspsc",42271700,"Oxygen therapy delivery systems and devices",
+"unspsc",42271701,"Medical gas cylinders or related devices",
+"unspsc",42271702,"Oxygen concentrators",
+"unspsc",42271703,"Oxygen air blenders",
+"unspsc",42271704,"Oxygen timers",
+"unspsc",42271705,"Oxygen delivery connectors or adapters",
+"unspsc",42271706,"Respiratory therapy compressors",
+"unspsc",42271707,"Flow sensors or regulators or components",
+"unspsc",42271708,"Medical oxygen masks or parts",
+"unspsc",42271709,"Medical nasal cannulae",
+"unspsc",42271710,"Medical nasal catheters or catheterization kits",
+"unspsc",42271711,"Medical head hoods",
+"unspsc",42271712,"Medical aerosol tents",
+"unspsc",42271713,"Medical hyperbaric chambers",
+"unspsc",42271714,"Medical incubators",
+"unspsc",42271715,"Medical oxygen tubing or connectors",
+"unspsc",42271716,"Cases for nasal insufflators",
+"unspsc",42271717,"Inhalators or sets",
+"unspsc",42271718,"Oxygen therapy delivery system products accessories or its supplies",
+"unspsc",42271719,"Oxygen insufflator or its accessories",
+"unspsc",42271720,"Liquid oxygen converters",
+"unspsc",42271721,"Oxygen concentrator filters",
+"unspsc",42271800,"Respiratory humidity and aerosol therapy products",
+"unspsc",42271801,"Respiratory humidifiers or vaporizers",
+"unspsc",42271802,"Nebulizers or accessories",
+"unspsc",42271803,"Transfer sets for respiratory therapy",
+"unspsc",42271900,"Airway management products",
+"unspsc",42271901,"Pharyngeal airways",
+"unspsc",42271902,"Esophageal tubes",
+"unspsc",42271903,"Endotracheal tubes",
+"unspsc",42271904,"Tracheostomy tubes",
+"unspsc",42271905,"Endobronchial tubes",
+"unspsc",42271906,"Endotracheal or tracheostomy tube repair kits",
+"unspsc",42271907,"Respiratory aspirator products or accessories",
+"unspsc",42271908,"Artificial airway holders",
+"unspsc",42271909,"Artificial airway accessories",
+"unspsc",42271910,"Endotracheal or tracheotomy sets",
+"unspsc",42271911,"Respiratory manometer kits",
+"unspsc",42271912,"Nasopharyngeal tubes",
+"unspsc",42271913,"Pharyngeal airways or airways kits",
+"unspsc",42271914,"Airway pressure gages",
+"unspsc",42271915,"Tracheostomy accessories",
+"unspsc",42272000,"Intubation supplies",
+"unspsc",42272001,"Laryngoscopes or accessories",
+"unspsc",42272002,"Laryngeal sprays",
+"unspsc",42272003,"Bite blocks",
+"unspsc",42272004,"Intubation stylets",
+"unspsc",42272005,"Intubation forceps",
+"unspsc",42272006,"Introducers",
+"unspsc",42272007,"Bender tools",
+"unspsc",42272008,"Intubation gauges or guides",
+"unspsc",42272009,"Patient carbon dioxide detectors",
+"unspsc",42272010,"Suction pumps",
+"unspsc",42272011,"Suction catheters or its accessories",
+"unspsc",42272012,"Suction tube or tubing",
+"unspsc",42272013,"Suction canisters or liners",
+"unspsc",42272014,"Suction connectors or adapters",
+"unspsc",42272015,"Suction kits",
+"unspsc",42272016,"Laryngeal keels or accessories",
+"unspsc",42272017,"Intubator components or accessories",
+"unspsc",42272100,"Negative mechanical pressure ventilators",
+"unspsc",42272101,"Iron lung",
+"unspsc",42272102,"Chest cuirass products",
+"unspsc",42272200,"Positive mechanical pressure ventilators and accessories",
+"unspsc",42272201,"Intermittent positive pressure breathing IPPB machines",
+"unspsc",42272202,"Non invasive continuous positive air pressure machines",
+"unspsc",42272203,"Non invasive bi level machines",
+"unspsc",42272204,"Transport ventilators",
+"unspsc",42272205,"Adult or pediatric intensive care ventilators",
+"unspsc",42272206,"Infant intensive care ventilators",
+"unspsc",42272207,"High frequency ventilators",
+"unspsc",42272208,"Home care ventilators",
+"unspsc",42272209,"Ventilator or breathing circuits",
+"unspsc",42272210,"Breathing circuit bags",
+"unspsc",42272211,"Hyperinflation products",
+"unspsc",42272212,"Positive end expiratory pressure PEEP valves",
+"unspsc",42272213,"Continuous positive airway pressure CPAP masks or straps",
+"unspsc",42272214,"Circuit connectors or adapters or valves",
+"unspsc",42272215,"Ventilator testing supplies",
+"unspsc",42272216,"Ventilator thermometers",
+"unspsc",42272217,"Ventilator water traps",
+"unspsc",42272218,"Ventilator gas sampling ports or lines",
+"unspsc",42272219,"Ventilator heat or moisture exchangers or filters",
+"unspsc",42272220,"Ventilator accessories",
+"unspsc",42272221,"Ventilator humidification products",
+"unspsc",42272222,"Ventilator weaning products",
+"unspsc",42272223,"Breathing apparatus accessories or supplies",
+"unspsc",42272224,"Ventilator circuit kits",
+"unspsc",42272225,"Bi level positive airway pressure Bi PAP accessories",
+"unspsc",42272300,"Resuscitation supplies",
+"unspsc",42272301,"Manual resuscitators",
+"unspsc",42272302,"Pneumatic resuscitators",
+"unspsc",42272303,"Resuscitation masks or accessories",
+"unspsc",42272304,"Resuscitator components or accessories",
+"unspsc",42272305,"Resuscitation connectors",
+"unspsc",42272306,"Resuscitation kits",
+"unspsc",42272307,"Cases for resuscitation apparatus or accessories",
+"unspsc",42272400,"Thoracentesis products",
+"unspsc",42272401,"Thoracentesis needles",
+"unspsc",42272402,"Thoracentesis sets or trays",
+"unspsc",42272403,"Thoracentesis catheters or catheterization kits or accessories",
+"unspsc",42272404,"Pleural cavity drainage unit or accessories",
+"unspsc",42272500,"Anesthesia apparatus and accessories and supplies",
+"unspsc",42272501,"Gas anesthesia apparatus",
+"unspsc",42272502,"Absorber units for gas anesthesia apparatus",
+"unspsc",42272503,"Anesthesia inhalers or inhaler units or accessories",
+"unspsc",42272504,"Anesthesia sets or kits",
+"unspsc",42272505,"Gas anesthesia apparatus tubes or tubing assemblies or tube fittings or accessories",
+"unspsc",42272506,"Anesthesia apparatus screen filters",
+"unspsc",42272507,"Temperature control for anesthesia apparatus",
+"unspsc",42272508,"Baclofen pumps",
+"unspsc",42280000,"Medical sterilization products",
+"unspsc",42281500,"Autoclave and sterilizer equipment and accessories",
+"unspsc",42281501,"Chemical or gas sterilizers",
+"unspsc",42281502,"Dry heat or hot air sterilizers",
+"unspsc",42281503,"Filter sterilizers",
+"unspsc",42281504,"Glass bead sterilizers",
+"unspsc",42281505,"Lifting handles for sterilizer containers or trays",
+"unspsc",42281506,"Powered instrument cleaning devices or accessories",
+"unspsc",42281507,"Radiation sterilizers",
+"unspsc",42281508,"Steam autoclaves or sterilizers",
+"unspsc",42281509,"Sterilization containers or trays",
+"unspsc",42281510,"Sterilization instrument clips or racks or stringers or holders",
+"unspsc",42281511,"Sterilization lamps",
+"unspsc",42281512,"Sterilization lids",
+"unspsc",42281513,"Sterilization nameplates",
+"unspsc",42281514,"Sanitizer heaters or accessories",
+"unspsc",42281515,"Sterilization cabinets",
+"unspsc",42281516,"Sterilization filters",
+"unspsc",42281517,"Sterilization water recovery systems",
+"unspsc",42281518,"Sterilization cannula bars",
+"unspsc",42281519,"Needle sterilizers",
+"unspsc",42281520,"Test packs for steam sterilizers",
+"unspsc",42281521,"Sterilization sets",
+"unspsc",42281522,"Sterilization instruments or sterilization cases inserts",
+"unspsc",42281523,"Sterilization filter sleeves",
+"unspsc",42281524,"Sterilization adapters or adapter assemblies",
+"unspsc",42281600,"Cold sterilization and disinfectant solutions",
+"unspsc",42281601,"Decontamination solutions",
+"unspsc",42281602,"Glutaraldehyde solutions",
+"unspsc",42281603,"Medical instrument disinfectants",
+"unspsc",42281604,"Medical surface disinfectants",
+"unspsc",42281605,"Medical antisetting compounds",
+"unspsc",42281606,"Medical gas fumigators",
+"unspsc",42281700,"Presterilization cleaning equipment and solutions",
+"unspsc",42281701,"Chamber cleaners for autoclaves or sterilizers",
+"unspsc",42281702,"Disinfectant soaking pans",
+"unspsc",42281703,"Instrument care kits",
+"unspsc",42281704,"Instrument cleaners or detergents",
+"unspsc",42281705,"Instrument disinfectant washing equipment",
+"unspsc",42281706,"Instrument lubricants or milk",
+"unspsc",42281707,"Instrument stain remover pads",
+"unspsc",42281708,"Sterilization cart cleaners",
+"unspsc",42281709,"Sterilization cleaning brushes",
+"unspsc",42281710,"Sterilization deodorants",
+"unspsc",42281711,"Sterilization liquid descalers",
+"unspsc",42281712,"Ultrasonic cleaning equipment",
+"unspsc",42281713,"Sterilization drain pans",
+"unspsc",42281800,"Sterilization indicators and controls",
+"unspsc",42281801,"Disinfectant test strips",
+"unspsc",42281802,"Sterilization labels",
+"unspsc",42281803,"Sterilization biological kits",
+"unspsc",42281804,"Sterilization controls",
+"unspsc",42281805,"Sterilization indicator records",
+"unspsc",42281806,"Sterilization indicator strips",
+"unspsc",42281807,"Sterilization indicator tapes",
+"unspsc",42281808,"Sterilization papers or sheets",
+"unspsc",42281809,"Sterilization record storage envelopes",
+"unspsc",42281810,"Sterilization test packs and accessories",
+"unspsc",42281900,"Sterilization wraps and packaging supplies",
+"unspsc",42281901,"Holders or carts for sterilization wrappers or pouches",
+"unspsc",42281902,"Sterilization wraps or overwraps",
+"unspsc",42281903,"Sterilization dust covers",
+"unspsc",42281904,"Sterilization pouches",
+"unspsc",42281905,"Sterilization heat sealers",
+"unspsc",42281906,"Sterilization instrument bands",
+"unspsc",42281907,"Sterilization instrument protectors",
+"unspsc",42281908,"Sterilization instrument tray liners",
+"unspsc",42281909,"Sterilization labeling guns or tapes or pens",
+"unspsc",42281912,"Sterilization towels",
+"unspsc",42281913,"Sterilization tubing",
+"unspsc",42281914,"Sterilization disposable containers",
+"unspsc",42281915,"Sterilization reels",
+"unspsc",42281916,"Sterilization bags",
+"unspsc",42290000,"Surgical products",
+"unspsc",42291500,"Surgical bone biopsy instruments and related products",
+"unspsc",42291501,"Surgical bone biopsy mills or related products",
+"unspsc",42291502,"Surgical bone biopsy trephines",
+"unspsc",42291600,"Surgical cutting instruments and snares and related products",
+"unspsc",42291601,"Laser surgery scalpels or knives or knife handles",
+"unspsc",42291602,"Surgical bolt or cable or pin or wire cutter instruments",
+"unspsc",42291603,"Surgical bone cutting forceps",
+"unspsc",42291604,"Surgical bone hand saws or wire saws or saw handles",
+"unspsc",42291605,"Surgical broaches",
+"unspsc",42291606,"Surgical chisels or gouges",
+"unspsc",42291607,"Surgical curettes or loops",
+"unspsc",42291608,"Surgical cutting blocks or boards or platforms",
+"unspsc",42291609,"Surgical nippers",
+"unspsc",42291610,"Surgical planes",
+"unspsc",42291611,"Surgical rasps",
+"unspsc",42291612,"Surgical ronguers",
+"unspsc",42291613,"Surgical scalpels or knives or blades or trephines or accessories",
+"unspsc",42291614,"Surgical scissors",
+"unspsc",42291615,"Surgical shears",
+"unspsc",42291616,"Surgical snares or snare wires",
+"unspsc",42291617,"Surgical spuds",
+"unspsc",42291619,"Surgical tomes",
+"unspsc",42291620,"Surgical trocars for general use or accessories",
+"unspsc",42291621,"Finger ring removers",
+"unspsc",42291622,"Adenotomes",
+"unspsc",42291623,"Periosteotomes",
+"unspsc",42291624,"Meniscotomes",
+"unspsc",42291625,"Infant heel incision instruments",
+"unspsc",42291700,"Surgical hand drills and reamers and puncturing instruments and accessories and related products",
+"unspsc",42291701,"Surgical hand or twist drills or drill kits or accessories",
+"unspsc",42291702,"Surgical hand reamers or awls",
+"unspsc",42291703,"Surgical perforators",
+"unspsc",42291704,"Surgical punches or punch holder or accessories",
+"unspsc",42291705,"Surgical reamer adapters",
+"unspsc",42291706,"Surgical burs or its accessories",
+"unspsc",42291707,"Craniotomy kits",
+"unspsc",42291708,"Surgical drillbits or accessories",
+"unspsc",42291709,"Surgical saw blades or accessories",
+"unspsc",42291800,"Surgical clamps and forceps and surgical ligators and related instruments",
+"unspsc",42291801,"Surgical band ligator appliers or bands or related products",
+"unspsc",42291802,"Surgical clamps or clips or forceps or accessories",
+"unspsc",42291803,"Surgical laser clamps or forceps",
+"unspsc",42291900,"Surgical instrument and tube holders and positioners",
+"unspsc",42291901,"Surgical instrument holders or positioners",
+"unspsc",42291902,"Surgical tube holders or positioners",
+"unspsc",42292000,"Surgical mirrors",
+"unspsc",42292001,"Surgical otolaryngological mirrors or accessories",
+"unspsc",42292100,"Surgical inserters and extractors and related products",
+"unspsc",42292101,"Surgical inserters or inserters kits",
+"unspsc",42292102,"Surgical extractors",
+"unspsc",42292103,"Surgical chucks or keys",
+"unspsc",42292200,"Surgical approximators and compressors and depressors and related products",
+"unspsc",42292201,"Surgical approximators",
+"unspsc",42292202,"Surgical compressors",
+"unspsc",42292203,"Surgical depressors",
+"unspsc",42292300,"Surgical bending irons and crimpers and pliers and tensioners and wrenches and related products",
+"unspsc",42292301,"Surgical bending instruments",
+"unspsc",42292302,"Surgical crimpers",
+"unspsc",42292303,"Surgical pliers",
+"unspsc",42292304,"Surgical tensioners",
+"unspsc",42292305,"Surgical vice grips",
+"unspsc",42292306,"Surgical wire holding forceps or twisters",
+"unspsc",42292307,"Surgical wrenches",
+"unspsc",42292400,"Surgical taps and drivers and related products",
+"unspsc",42292401,"Surgical taps",
+"unspsc",42292402,"Surgical drivers or its parts or accessories",
+"unspsc",42292403,"Surgical ratchet handles",
+"unspsc",42292500,"Surgical hammers and mallets and impactors and presses and related products",
+"unspsc",42292501,"Surgical tamps",
+"unspsc",42292502,"Surgical hammers or mallets",
+"unspsc",42292503,"Surgical impactors or packers",
+"unspsc",42292504,"Surgical presses",
+"unspsc",42292505,"Surgical hammer or mallet caps",
+"unspsc",42292600,"Surgical dilators and probes and grooves and related products",
+"unspsc",42292601,"Surgical dilators or accessories",
+"unspsc",42292602,"Surgical grooves",
+"unspsc",42292603,"Surgical probes or directors",
+"unspsc",42292700,"Surgical dissectors and elevators and picks and related products",
+"unspsc",42292701,"Surgical dissectors",
+"unspsc",42292702,"Surgical elevators or levers",
+"unspsc",42292703,"Surgical lifters",
+"unspsc",42292704,"Surgical picks",
+"unspsc",42292800,"Surgical marking instruments",
+"unspsc",42292801,"Ophthalmic marking instruments",
+"unspsc",42292802,"Surgical marking instruments for general use",
+"unspsc",42292900,"Suture and surgical tissue closure instruments and related products",
+"unspsc",42292901,"Surgical cerclage instruments",
+"unspsc",42292902,"Surgical laser needle holders",
+"unspsc",42292903,"Surgical needle holders for general use",
+"unspsc",42292904,"Surgical suture or wire passers or related products",
+"unspsc",42292907,"Skin stretching systems",
+"unspsc",42292908,"Surgical purstring devices",
+"unspsc",42293000,"Surgical measuring devices and related products",
+"unspsc",42293001,"Surgical calipers or rulers",
+"unspsc",42293002,"Surgical measuring gauges or rods",
+"unspsc",42293003,"Surgical graft measuring instruments",
+"unspsc",42293004,"Surgical sizing instruments for general use",
+"unspsc",42293005,"Surgical valve sizing instruments",
+"unspsc",42293006,"Surgical measuring tapes",
+"unspsc",42293100,"Surgical retractors and related products",
+"unspsc",42293101,"Laser surgery retractors",
+"unspsc",42293102,"Surgical retraction hooks",
+"unspsc",42293103,"Surgical lighted fiberoptic retractors",
+"unspsc",42293104,"Surgical mouth gags or accessories",
+"unspsc",42293105,"Surgical rake retractors",
+"unspsc",42293106,"Surgical retractor sets",
+"unspsc",42293107,"Surgical retractors for general use",
+"unspsc",42293108,"Surgical stabilizers",
+"unspsc",42293109,"Surgical tissue protectors",
+"unspsc",42293110,"Orthopedic retractors",
+"unspsc",42293111,"Opthalmic retractors",
+"unspsc",42293112,"Cardiovascular or thoracic retractors",
+"unspsc",42293113,"Vein retractors",
+"unspsc",42293114,"Oral retractors",
+"unspsc",42293115,"Tracheal retractors",
+"unspsc",42293116,"Rectal retractors",
+"unspsc",42293117,"Gastrointestinal retractors",
+"unspsc",42293118,"Uterine retractors",
+"unspsc",42293119,"Abdominal retractors",
+"unspsc",42293120,"Spine or neuro retractors",
+"unspsc",42293121,"Gland retractors",
+"unspsc",42293122,"Ear retractors",
+"unspsc",42293123,"Plastic surgery retractors",
+"unspsc",42293124,"Nerve retractors",
+"unspsc",42293125,"Sternum retractors",
+"unspsc",42293126,"Amputation retractors",
+"unspsc",42293127,"Tissue retractors",
+"unspsc",42293128,"Skin retractors",
+"unspsc",42293129,"Microsurgical retractors",
+"unspsc",42293130,"Lung retractors",
+"unspsc",42293131,"Eyelid retractors",
+"unspsc",42293132,"Finger retractors",
+"unspsc",42293133,"Surgical retractor rings",
+"unspsc",42293134,"Cervical retractors",
+"unspsc",42293135,"Lip retractors",
+"unspsc",42293136,"Retractor adapters",
+"unspsc",42293137,"Orthopedic retractor blades",
+"unspsc",42293138,"Surgical urology retractors or its accessories",
+"unspsc",42293139,"Retractor attachments",
+"unspsc",42293200,"Surgical myoma instruments",
+"unspsc",42293201,"Surgical myoma screws",
+"unspsc",42293300,"Surgical distractors and spreaders and separators and related products",
+"unspsc",42293301,"Surgical distractors or accessories",
+"unspsc",42293302,"Surgical separators",
+"unspsc",42293303,"Surgical specula",
+"unspsc",42293304,"Surgical spreaders",
+"unspsc",42293400,"Surgical manipulators and implant positioners and related products",
+"unspsc",42293401,"Surgical guides",
+"unspsc",42293403,"Surgical implant holders",
+"unspsc",42293404,"Surgical pushers",
+"unspsc",42293405,"Surgical manipulating instruments",
+"unspsc",42293406,"Surgical implant positioners",
+"unspsc",42293407,"Ureteral filiforms",
+"unspsc",42293500,"Surgical suction and irrigation cannulas and tips and stylets and related products",
+"unspsc",42293501,"Surgical irrigation or suction handpieces or cannulas or cystotomes or tips or related products",
+"unspsc",42293502,"Surgical laser suction or irrigation cannulas or tips or related products",
+"unspsc",42293503,"Surgical vacuum extraction devices or curettes or related products",
+"unspsc",42293504,"Ophthalmic irrigation or aspiration supplies or accessories",
+"unspsc",42293505,"Surgical suction drain probes",
+"unspsc",42293506,"Surgical suction bulbs",
+"unspsc",42293507,"Surgical suction reservoirs",
+"unspsc",42293508,"Ear nose and throat ENT irrigation or aspiration supplies or accessories",
+"unspsc",42293509,"Surgical irrigation sets or accessories",
+"unspsc",42293600,"Surgical bougies and sounds and obturators and related products",
+"unspsc",42293601,"Surgical bougies",
+"unspsc",42293602,"Surgical obturators",
+"unspsc",42293603,"Surgical sounds",
+"unspsc",42293700,"Surgical crushers and excavators and morselizers and related products",
+"unspsc",42293701,"Surgical crushers",
+"unspsc",42293702,"Surgical excavators",
+"unspsc",42293703,"Surgical morselizers",
+"unspsc",42293800,"Surgical passers and searchers and tunnelers and strippers and related products",
+"unspsc",42293801,"Surgical passers",
+"unspsc",42293802,"Surgical searchers",
+"unspsc",42293803,"Surgical strippers",
+"unspsc",42293804,"Surgical tunnelers or accessories",
+"unspsc",42293900,"Surgical wound packing instruments and related products",
+"unspsc",42293901,"Surgical laparotomy rings",
+"unspsc",42293902,"Surgical wound packing instruments",
+"unspsc",42294000,"Surgical spatulas and spoons and scoops and related products",
+"unspsc",42294001,"Surgical scoops",
+"unspsc",42294002,"Surgical spatulas",
+"unspsc",42294003,"Surgical spoons",
+"unspsc",42294100,"Surgical skeletal traction devices and related products",
+"unspsc",42294101,"Surgical traction bows or pin tractor loops or related products",
+"unspsc",42294102,"Surgical skull traction devices or related products",
+"unspsc",42294103,"Surgical traction halters",
+"unspsc",42294200,"Surgical instrument sets and systems and trays",
+"unspsc",42294201,"Cardiovascular or thoracic surgical instrument sets",
+"unspsc",42294202,"External fixation instrument sets or systems",
+"unspsc",42294203,"General surgical instrument sets",
+"unspsc",42294204,"Micro or delicate or plastic surgery instrument sets",
+"unspsc",42294205,"Neurosurgical or spinal instrument sets",
+"unspsc",42294206,"Ophthalmic surgery instrument sets",
+"unspsc",42294207,"Maxillofacial surgical instrument sets",
+"unspsc",42294208,"Orthopedic revision or total joint instrument systems",
+"unspsc",42294209,"Orthopedic trauma fixation instrument systems",
+"unspsc",42294210,"Otolaryngological surgical instrument sets",
+"unspsc",42294211,"Surgical custom or specialty instrument or procedure trays",
+"unspsc",42294212,"Urological surgical instrument sets",
+"unspsc",42294213,"Laparotomy surgical instrument sets",
+"unspsc",42294214,"Tracheotomy surgical instrument sets",
+"unspsc",42294215,"Craniotomy surgical instrument sets",
+"unspsc",42294216,"Angiography surgical instrument sets",
+"unspsc",42294217,"Gastroscopy surgical instrument sets",
+"unspsc",42294218,"Ear nose and throat ENT surgical instrument sets",
+"unspsc",42294219,"Orthopedic surgical instrument sets",
+"unspsc",42294220,"Blood recovery and delivery systems",
+"unspsc",42294300,"Minimally invasive breast biopsy instruments and supplies and equipment",
+"unspsc",42294301,"Minimally invasive breast biopsy drivers or firing modules or accessories",
+"unspsc",42294302,"Minimally invasive breast biopsy premium loading units",
+"unspsc",42294303,"Minimally invasive breast biopsy needle guides",
+"unspsc",42294304,"Minimally invasive breast biopsy marker instruments",
+"unspsc",42294305,"Minimally invasive breast biopsy vacuum units or accessories",
+"unspsc",42294306,"Breast location needles",
+"unspsc",42294400,"Vascular and cardiac systems",
+"unspsc",42294401,"Vein harvest systems",
+"unspsc",42294402,"Coronary visualization systems",
+"unspsc",42294500,"Ophthalmic specialty instruments and related products",
+"unspsc",42294501,"Conformers or shields for ophthalmic surgery",
+"unspsc",42294502,"Eyelid weights for ophthalmic surgery",
+"unspsc",42294503,"Fixation rings for ophthalmic surgery",
+"unspsc",42294504,"Intraocular membrane instruments for ophthalmic surgery",
+"unspsc",42294505,"Lid plates for ophthalmic surgery",
+"unspsc",42294506,"Nucleus rotators for ophthalmic surgery",
+"unspsc",42294507,"Ophthalmic burs or handles or rust ring removers",
+"unspsc",42294508,"Ophthalmic needle irrigating or aspirating tips",
+"unspsc",42294509,"Needles for ophthalmic surgery",
+"unspsc",42294510,"Sponges for ophthalmic surgery",
+"unspsc",42294511,"Ophthalmic surgical knives or blades or scissors or accessories",
+"unspsc",42294512,"Eye protector or its accessories",
+"unspsc",42294513,"Ophthalmic vitrectomy kits",
+"unspsc",42294514,"Hemostatic eraser probes",
+"unspsc",42294515,"Ophthalmic lens polishers",
+"unspsc",42294516,"Eye holders or accessories",
+"unspsc",42294517,"Optical inserts",
+"unspsc",42294518,"Optical insert fitting sets",
+"unspsc",42294519,"Ophthalmic spoons or curettes",
+"unspsc",42294520,"Ophthalmic lens holders or accessories",
+"unspsc",42294521,"Scleral buckling components",
+"unspsc",42294522,"Ophthalmic plug punctum sets",
+"unspsc",42294523,"Ophthalmic plastic surgery supplies or its related products",
+"unspsc",42294524,"Eyemagnets for ophthalmic surgery",
+"unspsc",42294525,"Ophthalmic medical instrument sets",
+"unspsc",42294526,"Lachrymal dilators or sets",
+"unspsc",42294600,"Autotransfusion products",
+"unspsc",42294601,"Autotransfusion blood or transfer bags",
+"unspsc",42294602,"Autotransfusion bowl kits or centrifugal kits",
+"unspsc",42294603,"Autotransfusion units",
+"unspsc",42294604,"Autotransfusion filters",
+"unspsc",42294605,"Autotransfusion reservoirs or its accessories",
+"unspsc",42294606,"Autotransfusion tubing sets or kits",
+"unspsc",42294607,"Autotransfusion valves",
+"unspsc",42294700,"Open heart perfusion equipment and monitors and accessories and related products",
+"unspsc",42294701,"Heart and lung machines or accessories",
+"unspsc",42294702,"Intraaortic balloon pumps or accessories",
+"unspsc",42294703,"Intracardiac suction devices or accessories",
+"unspsc",42294704,"Perfusion filters or related products",
+"unspsc",42294705,"Perfusion blood parameter monitors or accessories or related products",
+"unspsc",42294706,"Perfusion bubble traps",
+"unspsc",42294707,"Perfusion cardioplegia sets",
+"unspsc",42294708,"Perfusion cardiotomy reservoirs",
+"unspsc",42294709,"Perfusion centrifugal systems or accessories",
+"unspsc",42294710,"Perfusion heater or cooler or dual heater and cooler equipment or accessories",
+"unspsc",42294711,"Perfusion haemoconcentrators or accessories",
+"unspsc",42294712,"Perfusion oxygen or hematocrit saturation monitors or accessories",
+"unspsc",42294713,"Perfusion oxygenators or accessories",
+"unspsc",42294714,"Perfusion pump heads",
+"unspsc",42294715,"Perfusion pump pack tubing",
+"unspsc",42294716,"Perfusion venous reservoirs",
+"unspsc",42294717,"Ventricular assist devices",
+"unspsc",42294718,"Perfusion pumps",
+"unspsc",42294719,"Cardiovascular reservoirs",
+"unspsc",42294720,"Temperature monitoring needles",
+"unspsc",42294721,"Aortic punches",
+"unspsc",42294722,"Ventricular drainage sets",
+"unspsc",42294800,"Endoscopes and accessories and related products",
+"unspsc",42294801,"Rigid endoscopes or accessories or related products",
+"unspsc",42294802,"Flexible endoscopes or accessories or related products",
+"unspsc",42294803,"Cystourethroscopes",
+"unspsc",42294804,"Resectoscopes",
+"unspsc",42294805,"Laparoscopes or laparoscopic telescopes",
+"unspsc",42294806,"Cystoscopes",
+"unspsc",42294807,"Endoscopic sphincterotomes",
+"unspsc",42294808,"Esophagoscopes or its accessories",
+"unspsc",42294900,"Endoscopic instruments and supplies and accessories and related products",
+"unspsc",42294901,"Endoscope or instrument positioners or holders",
+"unspsc",42294902,"Endoscopic applicators or elevators",
+"unspsc",42294903,"Endoscopic aspiration or biopsy needles",
+"unspsc",42294904,"Endoscopic bite blocks or straps",
+"unspsc",42294905,"Endoscopic cleaning brushes or related products",
+"unspsc",42294906,"Endoscopic cutting instruments",
+"unspsc",42294907,"Endoscopic cytology or microbiology brushes",
+"unspsc",42294908,"Endoscopic clamps or dissectors or graspers or forceps or ligators",
+"unspsc",42294909,"Endoscopic dilators or inflation devices or related products",
+"unspsc",42294910,"Endoscopic electrodes or cables",
+"unspsc",42294911,"Endoscopic fixation kits",
+"unspsc",42294912,"Endoscopic fluid management systems or accessories",
+"unspsc",42294913,"Endoscopic hemostatic balloons or needles or tubes or accessories",
+"unspsc",42294914,"Endoscopic instrument sets",
+"unspsc",42294915,"Endoscopic instrument spreaders",
+"unspsc",42294916,"Endoscopic insufflation filters",
+"unspsc",42294917,"Endoscopic insufflation needles",
+"unspsc",42294918,"Endoscopic insufflation tubing",
+"unspsc",42294919,"Endoscopic introducers or guidewires or glidewires",
+"unspsc",42294920,"Endoscopic laser instruments or accessories",
+"unspsc",42294921,"Endoscopic knot pushers or delivery systems",
+"unspsc",42294922,"Endoscopic ligators",
+"unspsc",42294923,"Endoscopic manipulators",
+"unspsc",42294924,"Endoscopic monopolar or bipolar hand instruments or accessories or related products",
+"unspsc",42294925,"Endoscopic needles or punches",
+"unspsc",42294926,"Endoscopic overtubes",
+"unspsc",42294927,"Endoscopic instrument packs or trays or kits",
+"unspsc",42294928,"Endoscopic probes",
+"unspsc",42294929,"Endoscopic retractors",
+"unspsc",42294930,"Endoscopic snares or snare wires or accessories",
+"unspsc",42294931,"Endoscopic specimen retrieval forceps or devices",
+"unspsc",42294932,"Endoscopic stents or tubes",
+"unspsc",42294933,"Endoscopic suction or irrigation tips or coagulation probes or accessories",
+"unspsc",42294934,"Endoscopic suturing devices",
+"unspsc",42294935,"Endoscopic trocars or sheaths or obturators or cannulas or procedure trays or kits or related products",
+"unspsc",42294936,"Endoscopic working elements or working channels",
+"unspsc",42294937,"Fog reduction devices for endoscopes or mirrors",
+"unspsc",42294938,"Sealing caps for endoscopes",
+"unspsc",42294939,"Endoscopic valves or accessories",
+"unspsc",42294940,"Endoscopic converters",
+"unspsc",42294941,"Endoscopic biliary drainage sets",
+"unspsc",42294942,"Endoscopic instrument seals",
+"unspsc",42294943,"Endoscopic valve units",
+"unspsc",42294944,"Endoscopic accessory kits",
+"unspsc",42294945,"Endoscopic sponges",
+"unspsc",42294946,"Endoscopic gages",
+"unspsc",42294947,"Endoscopic diaphragms",
+"unspsc",42294948,"Endoscopic mouthpieces",
+"unspsc",42294949,"Endoscopic guidewire handles",
+"unspsc",42294950,"Endoscopic drills or drill bits",
+"unspsc",42294951,"Endoscopic small joint instrument sets",
+"unspsc",42294952,"Endoscopic retrievers or sets",
+"unspsc",42294953,"Endoscopic extractors",
+"unspsc",42294954,"Endoscopic tissue or specimen removing devices or accessories",
+"unspsc",42294955,"Endoscopic hooks or accessories",
+"unspsc",42294956,"Endoscopic guidewire tracers",
+"unspsc",42295000,"Endoscopic equipment and accessories and related products",
+"unspsc",42295001,"Endoscope maintenance units or accessories",
+"unspsc",42295002,"Endoscope storage cabinets or accessories",
+"unspsc",42295003,"Endoscope wall hangers or accessories",
+"unspsc",42295004,"Endoscopic equipment or procedure carts or accessories",
+"unspsc",42295005,"Endoscopic equipment sets",
+"unspsc",42295006,"Endoscopic heater probe units or heater probes or accessories",
+"unspsc",42295007,"Endoscopic imaging systems or accessories",
+"unspsc",42295008,"Endoscopic insufflation or distention units or accessories",
+"unspsc",42295009,"Endoscopic or surgical light sources or cables or accessories",
+"unspsc",42295010,"Endoscopic printers or accessories",
+"unspsc",42295011,"Endoscopic video cameras or recorders or adapters or accessories",
+"unspsc",42295012,"Endoscopic water bottles or accessories",
+"unspsc",42295013,"Endoscope tip protector or covers",
+"unspsc",42295014,"Endoscopic instrument cases",
+"unspsc",42295015,"Endoscopic lenses",
+"unspsc",42295100,"Surgical equipment and accessories and related products",
+"unspsc",42295101,"Basin stands for surgical use",
+"unspsc",42295102,"Cryosurgery equipment or accessories",
+"unspsc",42295103,"Delivery room or cesarean section patient procedure tables or accessories or related products",
+"unspsc",42295104,"Electrosurgical or electrocautery equipment or accessories or related products",
+"unspsc",42295105,"Instrument tables for surgical or obstetrical delivery use or accessories or related products",
+"unspsc",42295106,"Lap mayo trays or mayo stands for surgical use or accessories",
+"unspsc",42295107,"Operating room case carts or procedure carts or wall racks or accessories",
+"unspsc",42295108,"Operating room patient fracture tables or orthopedic tables or accessories or related products",
+"unspsc",42295109,"Operating room kick buckets or accessories or related products",
+"unspsc",42295110,"Operating room lighting for surgical field or accessories or related products",
+"unspsc",42295111,"Operating room patient positioning devices or accessories",
+"unspsc",42295112,"Operating room patient procedure tables or accessories or related products",
+"unspsc",42295113,"Ophthalmic irrigation or aspiration equipment or accessories",
+"unspsc",42295114,"Phacoemulsification or extrusion equipment or accessories for ophthalmic surgery",
+"unspsc",42295115,"Rolling surgeons stools or accessories",
+"unspsc",42295116,"Step stools for surgical use or accessories",
+"unspsc",42295117,"Surgical blanket or solution warming cabinets or accessories",
+"unspsc",42295118,"Surgical irrigation pump equipment or pulsed lavage or accessories with or without suction",
+"unspsc",42295119,"Surgical lasers or accessories",
+"unspsc",42295120,"Surgical lithotripters or accessories",
+"unspsc",42295121,"Surgical microscopes or loops or magnifiers or accessories",
+"unspsc",42295122,"Surgical pneumatic or electric tourniquets or accessories",
+"unspsc",42295123,"Surgical suction machines or vacuum extractors or ultrasonic surgical aspirators or regulators or accessories",
+"unspsc",42295124,"Surgical smoke evacuators or accessories",
+"unspsc",42295125,"Surgical urological tables or accessories",
+"unspsc",42295126,"Vitreo retinal fragmatome surgery equipment or accessories for ophthalmic surgery",
+"unspsc",42295127,"Microsurgery equipment or accessories",
+"unspsc",42295128,"Maxillofacial surgical instruments or accessories",
+"unspsc",42295129,"Operating room medication dispensers or related products",
+"unspsc",42295130,"Surgical instrument connecting tubes or accessories",
+"unspsc",42295131,"Surgical equipment stands or accessories",
+"unspsc",42295132,"Surgical instrument cases or accessories",
+"unspsc",42295133,"Orthopedic pin racks or accessories",
+"unspsc",42295134,"General surgical supply sets or accessories",
+"unspsc",42295135,"Orthopedic target devices or accessories",
+"unspsc",42295136,"Surgical controller instruments",
+"unspsc",42295137,"Gastroenterology equipment or supplies or accessories",
+"unspsc",42295138,"Surgical urological dilation devices  or accessories",
+"unspsc",42295139,"Instrument rolls for surgical instruments or accessories",
+"unspsc",42295140,"Surgical instrument cabinets or chests",
+"unspsc",42295200,"Surgical power equipment and accessories and related products",
+"unspsc",42295201,"Surgical dermatomes or dermabraders or dermameshers or accessories",
+"unspsc",42295202,"Surgical pneumatic or battery or electric saws or drills or pin drivers or accessories",
+"unspsc",42295203,"Surgical power equipment sets or accessories",
+"unspsc",42295204,"Surgical reamers",
+"unspsc",42295205,"Surgical shaver equipment or handpieces or blades or accessories",
+"unspsc",42295206,"Endoscopic surgical units",
+"unspsc",42295300,"Open heart surgical supplies and accessories and related products",
+"unspsc",42295301,"Surgical coronary artery blowers or misters or accessories",
+"unspsc",42295302,"Surgical perfusion cannulas",
+"unspsc",42295303,"Surgical perfusion catheters or connectors or accessories",
+"unspsc",42295304,"Surgical phrenic nerve pads or heart pillows",
+"unspsc",42295305,"Surgical tourniquets or vascular occluders or ligators or accessories",
+"unspsc",42295306,"Surgical vessel loops or retraction tapes",
+"unspsc",42295307,"Surgical carotid artery strippers or accessories",
+"unspsc",42295308,"Coronary perfusion sets",
+"unspsc",42295400,"Surgical support supplies",
+"unspsc",42295401,"Battery operated surgical cautery pencils",
+"unspsc",42295402,"Surgical marking pens",
+"unspsc",42295403,"External or internal fixation devices or arch bars or accessories",
+"unspsc",42295404,"Gastrointestinal stents",
+"unspsc",42295405,"Introducers or guide pins or guidewires or glidewires for non endoscopic surgical or open heart procedures",
+"unspsc",42295406,"Laparotomy or specialty or x ray detectable or gauze surgical spears or sponges or wicks",
+"unspsc",42295407,"Patient masks for surgical use",
+"unspsc",42295408,"Surgeons hand scrub brushes or solutions or accessories",
+"unspsc",42295409,"Surgical applicators",
+"unspsc",42295410,"Surgical basin sets or packs",
+"unspsc",42295411,"Surgical blade holders or breakers",
+"unspsc",42295412,"Surgical bone cement or mixing systems or accessories",
+"unspsc",42295413,"Surgical canal brushes",
+"unspsc",42295414,"Surgical custom or specialty procedure packs",
+"unspsc",42295415,"Surgical equipment covers",
+"unspsc",42295416,"Surgical evacuators",
+"unspsc",42295417,"Surgical light handles or covers",
+"unspsc",42295418,"Surgical magnetic mats",
+"unspsc",42295419,"Surgical nerve stimulators or accessories",
+"unspsc",42295420,"Surgical or endoscopic catheters or catheterization kits or drainage bags",
+"unspsc",42295421,"Surgical prep scrub or paint solutions",
+"unspsc",42295422,"Surgical scrub or prep kits for patient",
+"unspsc",42295423,"Surgical sharps or sponge counters",
+"unspsc",42295424,"Surgical shave kits or prep razors or clippers",
+"unspsc",42295425,"Surgical silver nitrate sticks or pencils or crystals",
+"unspsc",42295426,"Surgical specimen collection traps or containers",
+"unspsc",42295427,"Surgical sterile instrument brushes or instrument stylets or instrument wipes",
+"unspsc",42295428,"Surgical suction or irrigation tubings or accessories",
+"unspsc",42295429,"Surgical suction canisters or accessories",
+"unspsc",42295430,"Surgical tracheal stents",
+"unspsc",42295431,"Surgical transparent incise drapes or instrument pouches",
+"unspsc",42295432,"Urological stents",
+"unspsc",42295433,"Urological surgical catheters or accessories",
+"unspsc",42295434,"Vaginal or uterine stents",
+"unspsc",42295435,"Ear protectors or shields",
+"unspsc",42295436,"Anastomosis rings",
+"unspsc",42295437,"Surgeon utensil sets or cabinets or accessories",
+"unspsc",42295439,"Orthopedic bone smoothers",
+"unspsc",42295440,"Endoscopic catheter adapters",
+"unspsc",42295441,"Surgical retriever sets",
+"unspsc",42295445,"Tray inserts for surgical apparatus",
+"unspsc",42295446,"Internal organ retainers",
+"unspsc",42295448,"Surgical splash guards or accessories",
+"unspsc",42295450,"Surgical pail carriages or accessories",
+"unspsc",42295451,"Surgical preparation mits",
+"unspsc",42295452,"Skin preparation cups",
+"unspsc",42295453,"Surgical drains or sets or accessories",
+"unspsc",42295454,"Surgical hand protectors",
+"unspsc",42295455,"Cranial repair resin kits",
+"unspsc",42295456,"Surgical felts",
+"unspsc",42295457,"Surgical helmet lenses or hoods",
+"unspsc",42295458,"Drying or powdering equipment for surgical gloves",
+"unspsc",42295459,"Fluid decanting devices for surgical use",
+"unspsc",42295460,"Protective caps for orthopedic implants",
+"unspsc",42295461,"Tissue glue or systems or applicators or accessories",
+"unspsc",42295462,"Urodynamic catheters or accessories",
+"unspsc",42295463,"Ureteral catheters",
+"unspsc",42295500,"Surgical implants and expanders and extenders and surgical wires and related products",
+"unspsc",42295501,"Cardiovascular implants",
+"unspsc",42295502,"Human tissue implants",
+"unspsc",42295503,"Implantable infusion ports or accessories",
+"unspsc",42295504,"Neurosurgical implants",
+"unspsc",42295505,"Ophthalmic implants",
+"unspsc",42295506,"Oral maxillofacial implants or sets",
+"unspsc",42295507,"Orthopedic implants or surgical wires",
+"unspsc",42295508,"Otolaryngology implants or sets",
+"unspsc",42295509,"Plastic or cosmetic implants or tissue expanders or sets",
+"unspsc",42295510,"Surgical adhesion barriers",
+"unspsc",42295511,"Surgical bone stimulators",
+"unspsc",42295512,"Surgical implantable shunts or shunt extenders",
+"unspsc",42295513,"Surgical mesh or tissue barrier products",
+"unspsc",42295514,"Surgical silastic implants for general use",
+"unspsc",42295515,"Synthetic tissue implants",
+"unspsc",42295516,"Urological implants or sets",
+"unspsc",42295517,"Cardiovascular extenders",
+"unspsc",42295518,"Graft protectors",
+"unspsc",42300000,"Medical training and education supplies",
+"unspsc",42301500,"Aids for medical training",
+"unspsc",42301501,"Anatomical human models for medical education or training",
+"unspsc",42301502,"Anatomical human mannequins for medical education or training",
+"unspsc",42301503,"Cardio pulmonary resuscitation CPR training aids",
+"unspsc",42301504,"Kits for medical education or training",
+"unspsc",42301505,"Nursing or medical clipboards",
+"unspsc",42301506,"Dual earpiece stethoscopes",
+"unspsc",42301507,"Training videos for medical staff education",
+"unspsc",42301508,"Operational or instructional videos for medical equipment",
+"unspsc",42310000,"Wound care products",
+"unspsc",42311500,"Bandages and dressings and related products",
+"unspsc",42311501,"Clips for bandages or dressings",
+"unspsc",42311502,"Bandage or dressing starter kits",
+"unspsc",42311503,"Bandage rollers",
+"unspsc",42311504,"Bandages or dressings for burn care",
+"unspsc",42311505,"Bandages or dressings for general use",
+"unspsc",42311506,"Compression bandages or dressings",
+"unspsc",42311507,"Dressing sponges",
+"unspsc",42311508,"Dressing trays",
+"unspsc",42311509,"Fluff dressings",
+"unspsc",42311510,"Foam dressings",
+"unspsc",42311511,"Gauze bandages",
+"unspsc",42311512,"Gauze sponges",
+"unspsc",42311513,"Gel dressings",
+"unspsc",42311514,"Germicidal dressings",
+"unspsc",42311515,"Hydrocolloid dressings",
+"unspsc",42311516,"Intravenous dressings",
+"unspsc",42311517,"Liquid adhesives for bandages or dressings",
+"unspsc",42311518,"Medical eye pads or patches",
+"unspsc",42311519,"Medical non adherent straps",
+"unspsc",42311520,"Medical non adherent tapes",
+"unspsc",42311521,"Negative pressure dressings",
+"unspsc",42311522,"Occlusive dressings",
+"unspsc",42311523,"Paste bandages",
+"unspsc",42311524,"Petrolatum dressings",
+"unspsc",42311525,"Pressure bandages",
+"unspsc",42311526,"Spunlace dressings",
+"unspsc",42311527,"Transparent film dressings",
+"unspsc",42311528,"Wet dressing systems",
+"unspsc",42311531,"Dressing covers",
+"unspsc",42311532,"Dry dressings",
+"unspsc",42311537,"Bandage scissors or its supplies",
+"unspsc",42311538,"Hyperalimentation kits",
+"unspsc",42311539,"Bandage applicators",
+"unspsc",42311600,"Exogenous topical hemostatic agents",
+"unspsc",42311601,"Absorbable gelatin sponges",
+"unspsc",42311602,"Bone wax",
+"unspsc",42311603,"Oxidized cellulose",
+"unspsc",42311604,"Collagen hemostatics or microfibrillar collagen",
+"unspsc",42311700,"Medical and surgical adherent tapes and related products for specialty use",
+"unspsc",42311702,"Infant umbilical tapes",
+"unspsc",42311703,"Medical or surgical tapes for skin attachment",
+"unspsc",42311704,"Medical or surgical tape dispensers",
+"unspsc",42311705,"Medical or surgical tape removers",
+"unspsc",42311707,"Surgical tissue tapes",
+"unspsc",42311708,"Medical and surgical adherent tapes for general use",
+"unspsc",42311900,"Medical incision drains and drainage bags and reservoirs and related products",
+"unspsc",42311901,"Medical incision drain accessories",
+"unspsc",42311902,"Medical incision drainage bags or reservoirs",
+"unspsc",42311903,"Medical incision drains",
+"unspsc",42312000,"Medical tissue closure and related products",
+"unspsc",42312001,"Butterfly skin closures",
+"unspsc",42312002,"Clips for skin closure",
+"unspsc",42312003,"Wound or skin closure strips",
+"unspsc",42312004,"Medical adhesive or glue removers",
+"unspsc",42312005,"Medical adhesives or glues for skin closure",
+"unspsc",42312006,"Medical clip appliers for internal use",
+"unspsc",42312007,"Medical clips for internal use",
+"unspsc",42312008,"Medical staple or clip removers",
+"unspsc",42312009,"Staplers for internal use",
+"unspsc",42312010,"Staplers for skin closure",
+"unspsc",42312011,"Staples for internal use",
+"unspsc",42312012,"Staples for skin closure",
+"unspsc",42312014,"Tissue closure kits or trays or packs or sets",
+"unspsc",42312100,"Ostomy supplies and non surgical wound drainage products",
+"unspsc",42312101,"Ostomy appliance adhesives",
+"unspsc",42312102,"Ostomy appliances",
+"unspsc",42312103,"Ostomy cleaners or deodorants",
+"unspsc",42312104,"Ostomy collection supplies",
+"unspsc",42312105,"Ostomy skin barriers or protective care kits",
+"unspsc",42312106,"Ostomy inserts",
+"unspsc",42312107,"Ostomy wafers",
+"unspsc",42312108,"Wound drainage pouches",
+"unspsc",42312109,"Ostomy bag rings",
+"unspsc",42312110,"Ostomy starter kits",
+"unspsc",42312111,"Ostomy bag covers",
+"unspsc",42312112,"Ostomy belt or accessories",
+"unspsc",42312113,"Ostomy bag plugs",
+"unspsc",42312114,"Ventriculostomy kits",
+"unspsc",42312115,"Ostomy irrigation sleeves",
+"unspsc",42312200,"Suture and related products",
+"unspsc",42312201,"Suture",
+"unspsc",42312202,"Suturing kits or trays or packs or sets",
+"unspsc",42312203,"Suture buttons or bridges or related accessories",
+"unspsc",42312204,"Suture capturing devices",
+"unspsc",42312205,"Suture carts or racks",
+"unspsc",42312206,"Suture needles",
+"unspsc",42312207,"Suture removal kits or trays or packs or sets",
+"unspsc",42312208,"Suture removers",
+"unspsc",42312300,"Wound cleaning and debridement products",
+"unspsc",42312301,"Absorbers for wound cleansing",
+"unspsc",42312302,"Debridement sponges",
+"unspsc",42312303,"Pulsed lavage systems or related accessories for wound treatment",
+"unspsc",42312304,"Medical autolytic debridement products",
+"unspsc",42312305,"Medical enzymatic debridement products",
+"unspsc",42312306,"Medical mechanical debridement products",
+"unspsc",42312307,"Medical surgical debridement products",
+"unspsc",42312309,"Wound irrigation systems",
+"unspsc",42312310,"Cleansing bottles",
+"unspsc",42312311,"Disinfectant kits",
+"unspsc",42312312,"Wound care or cleansing trays",
+"unspsc",42312313,"Wound cleaning solutions",
+"unspsc",42312400,"Wound packing products",
+"unspsc",42312401,"Calcium alginate wound packing",
+"unspsc",42312402,"Nasal splints or stents",
+"unspsc",42312403,"Packing strips for wound care",
+"unspsc",42312500,"Wound supports and supplies and accessories",
+"unspsc",42312501,"Mammary support binders",
+"unspsc",42312502,"Abdominal binders",
+"unspsc",42312503,"Scrotal supports",
+"unspsc",43000000,"Information Technology Broadcasting and Telecommunications",
+"unspsc",43190000,"Communications Devices and Accessories",
+"unspsc",43191500,"Personal communication devices",
+"unspsc",43191501,"Mobile phones",
+"unspsc",43191502,"Pagers",
+"unspsc",43191503,"Pay phones",
+"unspsc",43191504,"Fixed phones",
+"unspsc",43191505,"Answering machines",
+"unspsc",43191507,"Special purpose telephones",
+"unspsc",43191508,"Digital telephones",
+"unspsc",43191509,"Analog telephones",
+"unspsc",43191510,"Two way radios",
+"unspsc",43191511,"IP phones",
+"unspsc",43191512,"Digital enhanced cordless telecommunications DECT cordless phones",
+"unspsc",43191600,"Personal communications device accessories or parts",
+"unspsc",43191601,"Mobile phone face plates",
+"unspsc",43191602,"Phone dialers",
+"unspsc",43191603,"Phone extension cords",
+"unspsc",43191604,"Phone face plates",
+"unspsc",43191605,"Phone handset cords",
+"unspsc",43191606,"Phone handsets",
+"unspsc",43191607,"Phone headset ear or speaker cushions",
+"unspsc",43191608,"Phone headset voice tubes",
+"unspsc",43191609,"Phone headsets",
+"unspsc",43191610,"Personal communication holders or mounts, stands",
+"unspsc",43191611,"Phone line protectors",
+"unspsc",43191612,"Phone rests",
+"unspsc",43191614,"Phone voice converters",
+"unspsc",43191615,"Vehicle handsfree phone set",
+"unspsc",43191616,"Centrex phone consoles",
+"unspsc",43191618,"Conversation recording units",
+"unspsc",43191619,"Telephone signaling devices",
+"unspsc",43191621,"Handset adapters",
+"unspsc",43191622,"Pager modules or accessories",
+"unspsc",43191623,"Pay phone coin mechanisms",
+"unspsc",43191624,"Pay phone coin chutes",
+"unspsc",43191625,"Pay phone coin boxes",
+"unspsc",43191626,"Pay phone hoppers",
+"unspsc",43191627,"Pay phone coin box vault doors",
+"unspsc",43191628,"Pay phone microphone windscreens",
+"unspsc",43191629,"Notebook or palmtop skins or face plates",
+"unspsc",43191630,"Mobile phone starter kits",
+"unspsc",43191631,"Phone or modem jack adapters or country kits or travel kits",
+"unspsc",43200000,"Components for information technology or broadcasting or telecommunications",
+"unspsc",43201400,"System Cards",
+"unspsc",43201401,"Graphics or video accelerator cards",
+"unspsc",43201402,"Memory module cards",
+"unspsc",43201403,"Modem cards",
+"unspsc",43201404,"Network interface cards",
+"unspsc",43201405,"Optical network receive cards",
+"unspsc",43201406,"Optical network transmit cards",
+"unspsc",43201407,"Peripheral controller cards",
+"unspsc",43201408,"Serial port cards",
+"unspsc",43201409,"Wireless network interface cards",
+"unspsc",43201410,"Switch ports or cards",
+"unspsc",43201500,"System boards processors interfaces or modules",
+"unspsc",43201501,"Asynchronous transfer mode ATM telecommunications interface cards",
+"unspsc",43201502,"Audio accelerator cards",
+"unspsc",43201503,"Central processing unit CPU processors",
+"unspsc",43201507,"Daughterboards",
+"unspsc",43201508,"Dispersion compensation fiber module DCFMs",
+"unspsc",43201509,"Exchange datacom modules",
+"unspsc",43201513,"Motherboards",
+"unspsc",43201522,"Parallel port cards",
+"unspsc",43201531,"Video capture boards",
+"unspsc",43201533,"Musical instrument digital interface MIDI interfaces",
+"unspsc",43201534,"Exchange component CODEC interfaces",
+"unspsc",43201535,"Serial infrared ports",
+"unspsc",43201537,"Print servers",
+"unspsc",43201538,"Central processing unit coolers",
+"unspsc",43201539,"Console controller  mainframe",
+"unspsc",43201540,"Channel converter",
+"unspsc",43201541,"Channel to channel interface mainframe",
+"unspsc",43201542,"Control unit",
+"unspsc",43201543,"Coupler facility  mainframe",
+"unspsc",43201544,"Interface bus converter or controller",
+"unspsc",43201545,"Fax boards",
+"unspsc",43201546,"Audio conferencing boards",
+"unspsc",43201547,"Voice boards",
+"unspsc",43201549,"Interface bus switches",
+"unspsc",43201550,"Network packet data synchronization device",
+"unspsc",43201552,"Hardware or telephony adapters",
+"unspsc",43201553,"Transceivers and media converters",
+"unspsc",43201554,"Personal computer television PC TV tuners",
+"unspsc",43201555,"PC radio tuners",
+"unspsc",43201556,"Small computer system interconnect SCSI adapters",
+"unspsc",43201557,"Redundant array of independent disks RAID controllers",
+"unspsc",43201558,"Fibre channel controller",
+"unspsc",43201600,"Chassis components",
+"unspsc",43201601,"Computer chassis",
+"unspsc",43201602,"Network equipment chassis",
+"unspsc",43201603,"Chassis stacking components",
+"unspsc",43201604,"Electronic equipment bays or baskets",
+"unspsc",43201605,"Expanders",
+"unspsc",43201608,"Removable drive frames",
+"unspsc",43201609,"Storage device trays or assemblies",
+"unspsc",43201610,"Backplane or panels or assemblies",
+"unspsc",43201611,"Computer cradles",
+"unspsc",43201612,"Computer faceplates",
+"unspsc",43201614,"Console extenders",
+"unspsc",43201615,"Drive bay cover kits",
+"unspsc",43201616,"Hard disk drive array towers",
+"unspsc",43201800,"Media storage devices",
+"unspsc",43201801,"Floppy drives",
+"unspsc",43201802,"Hard disk arrays",
+"unspsc",43201803,"Hard disk drives",
+"unspsc",43201806,"Tape arrays",
+"unspsc",43201807,"Tape drives",
+"unspsc",43201808,"Read only compact disc CD",
+"unspsc",43201809,"Read write compact disc CD",
+"unspsc",43201810,"Read only digital versatile disc DVD",
+"unspsc",43201811,"Read write digital versatile disc DVD",
+"unspsc",43201812,"Magneto optical MO drives",
+"unspsc",43201813,"High capacity removable media drives",
+"unspsc",43201814,"Electronic media or data duplicating equipment",
+"unspsc",43201815,"Peripheral component microchannel interconnect architecture  reader and writer drives",
+"unspsc",43201816,"Ultra density optical UDO drives or autoloaders or libraries",
+"unspsc",43201900,"Media storage device accessories",
+"unspsc",43201902,"Optical disk changers",
+"unspsc",43201903,"Tape drive libraries",
+"unspsc",43202000,"Removable storage media",
+"unspsc",43202001,"Compact disks CDs",
+"unspsc",43202002,"Blank tapes",
+"unspsc",43202003,"Digital versatile disks DVDs",
+"unspsc",43202004,"Floppy disks",
+"unspsc",43202005,"Flash memory storage devices",
+"unspsc",43202006,"Magneto Optical MO disks",
+"unspsc",43202007,"High capacity removable media blank disks",
+"unspsc",43202008,"Ultra density optical UDO blank disks",
+"unspsc",43202100,"Removable storage media accessories"," "
+"unspsc",43202101,"Compact disk cases"," "
+"unspsc",43202102,"Floppy disk cases",
+"unspsc",43202103,"Multimedia storage holders",
+"unspsc",43202104,"Vertical helix scan VHS  videotape storage or accessories",
+"unspsc",43202105,"Multiple media cabinets",
+"unspsc",43202200,"Sub assemblies for electronic devices",
+"unspsc",43202201,"Telephone piece parts",
+"unspsc",43202202,"Telephone ring generators",
+"unspsc",43202204,"External ringer or its parts",
+"unspsc",43202205,"Keycaps or keytops or keys",
+"unspsc",43202206,"Storage drive or input device components",
+"unspsc",43202207,"Head mount arms and assembly",
+"unspsc",43202208,"Lead assemblies",
+"unspsc",43202209,"Head stack assemblies",
+"unspsc",43202210,"Crash stops",
+"unspsc",43202211,"Platters or disks",
+"unspsc",43202212,"Read write head assemblies",
+"unspsc",43202213,"Disc motor drives",
+"unspsc",43202214,"Comb assemblies",
+"unspsc",43210000,"Computer Equipment and Accessories",
+"unspsc",43211500,"Computers",
+"unspsc",43211501,"Computer servers",
+"unspsc",43211502,"High end computer servers",
+"unspsc",43211503,"Notebook computers",
+"unspsc",43211504,"Personal digital assistant PDAs or organizers",
+"unspsc",43211505,"Point of sale POS terminal",
+"unspsc",43211506,"Thin client computers",
+"unspsc",43211507,"Desktop computers",
+"unspsc",43211508,"Personal computers",
+"unspsc",43211509,"Tablet computers",
+"unspsc",43211510,"Mainframe console or dumb terminals",
+"unspsc",43211511,"Wearable computing devices",
+"unspsc",43211512,"Mainframe computers",
+"unspsc",43211600,"Computer accessories",
+"unspsc",43211601,"Computer switch boxes",
+"unspsc",43211602,"Docking stations",
+"unspsc",43211603,"Port replicators",
+"unspsc",43211604,"Peripheral switch boxes",
+"unspsc",43211605,"Signal processor upgrades",
+"unspsc",43211606,"Multimedia kits",
+"unspsc",43211607,"Computer speakers",
+"unspsc",43211608,"Encoder decoder equipment",
+"unspsc",43211609,"Universal serial bus hubs or connectors",
+"unspsc",43211610,"Computer country or localization kits",
+"unspsc",43211611,"Handheld PDA Starter Kits",
+"unspsc",43211700,"Computer data input devices",
+"unspsc",43211701,"Bar code reader equipment",
+"unspsc",43211702,"Magnetic card readers",
+"unspsc",43211704,"Currency recognition equipment",
+"unspsc",43211705,"Game pads or joy sticks",
+"unspsc",43211706,"Keyboards",
+"unspsc",43211707,"Light stylus",
+"unspsc",43211708,"Computer mouse or trackballs",
+"unspsc",43211709,"Pressure stylus",
+"unspsc",43211710,"Radio frequency identification devices",
+"unspsc",43211711,"Scanners",
+"unspsc",43211712,"Graphics tablets",
+"unspsc",43211713,"Touch pads",
+"unspsc",43211714,"Biometric identification equipment",
+"unspsc",43211715,"Portable data input terminals",
+"unspsc",43211717,"Optical character recognition systems",
+"unspsc",43211718,"Camera based vision systems for automated data collection",
+"unspsc",43211719,"Voice microphones for computers",
+"unspsc",43211720,"Point of sale credit or debit verification kits",
+"unspsc",43211721,"Punch card readers",
+"unspsc",43211800,"Computer data input device accessories",
+"unspsc",43211801,"Computer data input device covers",
+"unspsc",43211802,"Mouse pads",
+"unspsc",43211803,"Key board skins",
+"unspsc",43211804,"Keyboard drawers or shelves",
+"unspsc",43211805,"Service kits for storage devices",
+"unspsc",43211900,"Computer displays",
+"unspsc",43211901,"Cathode ray tube CRT monitors",
+"unspsc",43211902,"Liquid crystal display LCD panels or monitors",
+"unspsc",43211903,"Touch screen monitors",
+"unspsc",43211904,"Plasma display panels PDP",
+"unspsc",43211905,"Organic light emitting displays",
+"unspsc",43211906,"Character displays",
+"unspsc",43211907,"Head mounted displays",
+"unspsc",43212000,"Computer display accessories",
+"unspsc",43212001,"Computer display glare screens",
+"unspsc",43212002,"Monitor arms",
+"unspsc",43212100,"Computer printers",
+"unspsc",43212101,"Band printers",
+"unspsc",43212102,"Dot matrix printers",
+"unspsc",43212103,"Dye sublimination printers",
+"unspsc",43212104,"Inkjet printers",
+"unspsc",43212105,"Laser printers",
+"unspsc",43212106,"Line matrix printers",
+"unspsc",43212107,"Plotter printers",
+"unspsc",43212108,"Thermal tape printers",
+"unspsc",43212109,"Bag tag printer",
+"unspsc",43212110,"Multi function printers",
+"unspsc",43212111,"Airline ticket or boarding pass ATB printers",
+"unspsc",43212112,"Point of sale POS receipt printers",
+"unspsc",43212113,"Compact disc CD or labeling printers",
+"unspsc",43212114,"Digital image printers",
+"unspsc",43220000,"Data Voice or Multimedia Network Equipment or Platforms and Accessories",
+"unspsc",43221500,"Call management systems or accessories",
+"unspsc",43221501,"Automated attendant systems",
+"unspsc",43221502,"Automatic call distributor ACD",
+"unspsc",43221503,"Telecom announcers",
+"unspsc",43221504,"Premise branch exchange PBX systems",
+"unspsc",43221505,"Standalone telephone caller identification",
+"unspsc",43221506,"Teleconferencing console",
+"unspsc",43221507,"Autodialers",
+"unspsc",43221508,"Telephone busy lamp fields",
+"unspsc",43221509,"Telephone call accounting systems",
+"unspsc",43221510,"Telephone call diverter or forwarder",
+"unspsc",43221513,"Telephone call sequencers",
+"unspsc",43221514,"Telephone dial backup units",
+"unspsc",43221515,"Telephone line sharing devices",
+"unspsc",43221516,"Telephone line status monitors",
+"unspsc",43221517,"Telephony equipment service observing units",
+"unspsc",43221518,"Telephony equipment toll restrictors",
+"unspsc",43221519,"Voice mail systems",
+"unspsc",43221520,"Interactive voice recognition equipment",
+"unspsc",43221521,"Telecommunications remote access unit",
+"unspsc",43221522,"Teleconference equipment",
+"unspsc",43221523,"Music or message on hold player",
+"unspsc",43221524,"Music on hold adapter",
+"unspsc",43221525,"Intercom systems",
+"unspsc",43221526,"Telephone entry systems",
+"unspsc",43221600,"Digital subscriber loop DSL access equipment and components and accessories",
+"unspsc",43221601,"Digital subscriber loop DSL captive office plain old telephone system POTS splitter",
+"unspsc",43221602,"Digital subscriber loop DSL captive office splitter shelf",
+"unspsc",43221603,"Digital subscriber loop DSL customer premise equipment CPE plain old telephone system POTS splitter",
+"unspsc",43221700,"Fixed network equipment and components",
+"unspsc",43221701,"Television core equipment",
+"unspsc",43221702,"Television access equipment",
+"unspsc",43221703,"Television antennas",
+"unspsc",43221704,"Radio core equipment",
+"unspsc",43221705,"Radio access equipment",
+"unspsc",43221706,"Radio antennas",
+"unspsc",43221707,"Microwave core equipment",
+"unspsc",43221708,"Microwave access equipment",
+"unspsc",43221709,"Microwave antennas",
+"unspsc",43221710,"Satellite core equipment",
+"unspsc",43221711,"Satellite access equipment",
+"unspsc",43221712,"Satellite antennas",
+"unspsc",43221713,"Shortwave core equipment",
+"unspsc",43221714,"Shortwave access equipment",
+"unspsc",43221715,"Shortwave antennas",
+"unspsc",43221716,"Pager core equipment",
+"unspsc",43221717,"Pager access equipment",
+"unspsc",43221718,"Radar antennas",
+"unspsc",43221719,"Aircraft antennas",
+"unspsc",43221720,"Automotive antennas",
+"unspsc",43221721,"Radio frequency data communication equipment",
+"unspsc",43221800,"Optical network devices",
+"unspsc",43221801,"Optical amplifiers",
+"unspsc",43221802,"Optical network or communication filters",
+"unspsc",43221803,"Optical adapters",
+"unspsc",43221804,"Optical networking lasers",
+"unspsc",43221805,"Asynchronous transfer mode ATM network equipment",
+"unspsc",43221806,"Synchronous optical network SONET network equipment",
+"unspsc",43221807,"Telecommunications dense wavelength division multiplexing DWDM filters",
+"unspsc",43221808,"Synchronous digital hierarchy SDH telecom equipment",
+"unspsc",43222500,"Network security equipment",
+"unspsc",43222501,"Firewall network security equipment",
+"unspsc",43222502,"VPN network security equipment",
+"unspsc",43222503,"Vulnerability Assessment Security Equipment",
+"unspsc",43222600,"Network service equipment",
+"unspsc",43222602,"Cable head end equipment",
+"unspsc",43222604,"Content delivery networking equipment",
+"unspsc",43222605,"Network gateway",
+"unspsc",43222606,"Internet service node startup kits",
+"unspsc",43222607,"Cache engine equipment",
+"unspsc",43222608,"Network repeaters",
+"unspsc",43222609,"Network routers",
+"unspsc",43222610,"Network service concentrators or hubs",
+"unspsc",43222611,"Network channel or data service units",
+"unspsc",43222612,"Network switches",
+"unspsc",43222615,"Storage area network SAN switch",
+"unspsc",43222619,"Video networking equipment",
+"unspsc",43222620,"Multiservice switch",
+"unspsc",43222621,"Content switch",
+"unspsc",43222622,"Server load balancer",
+"unspsc",43222623,"Digital cross connects DCX equipment",
+"unspsc",43222624,"Optical cross connects equipment",
+"unspsc",43222625,"Access servers",
+"unspsc",43222626,"Cable modems",
+"unspsc",43222627,"Integrated services digital network ISDN access devices",
+"unspsc",43222628,"Modems",
+"unspsc",43222629,"Modem banks",
+"unspsc",43222630,"Multistation access units",
+"unspsc",43222631,"Wireless fidelity base stations Wifi",
+"unspsc",43222632,"Broadband aggregators",
+"unspsc",43222633,"Remote management adapters",
+"unspsc",43222634,"Network management or monitoring device",
+"unspsc",43222700,"Telegraph equipment",
+"unspsc",43222701,"Telegraph keys",
+"unspsc",43222702,"Telegraph electromagnets",
+"unspsc",43222703,"Telegraph sounders",
+"unspsc",43222800,"Telephony equipment",
+"unspsc",43222801,"Broadband or narrowband digital cross connect DCX equipment",
+"unspsc",43222802,"Circuit switchboard equipment",
+"unspsc",43222803,"Digital loop carrier DLCs",
+"unspsc",43222805,"Private branch exchange PBX equipment",
+"unspsc",43222806,"Punch down blocks",
+"unspsc",43222811,"Telephony equipment alarm units",
+"unspsc",43222813,"Telephone switchboard part kits",
+"unspsc",43222814,"Telecommunication equipment installation or modification kits",
+"unspsc",43222815,"Telecommunication terminal units",
+"unspsc",43222816,"Telephony keyers",
+"unspsc",43222817,"Telecommunication repeaters",
+"unspsc",43222818,"Telephone distributing terminal frames",
+"unspsc",43222819,"Port connection panels",
+"unspsc",43222820,"Voice echo cancellers",
+"unspsc",43222821,"Patch panel",
+"unspsc",43222822,"Time division multiplexer TDM",
+"unspsc",43222823,"Wave division mulitplexer WDM",
+"unspsc",43222824,"Aerial cable rollers",
+"unspsc",43222825,"Telephone modification kits",
+"unspsc",43222900,"Telephony equipment accessories",
+"unspsc",43222901,"Line conditioners",
+"unspsc",43222902,"Telephony cable air dryers",
+"unspsc",43223000,"Teletype equipment",
+"unspsc",43223001,"Teletype input devices",
+"unspsc",43223100,"Digital mobile network infrastructure equipment and components",
+"unspsc",43223101,"2G GSM mobile core network equipment and components",
+"unspsc",43223102,"2G GSM wireless access network equipment and components",
+"unspsc",43223103,"2,5G GPRS mobile core network equipment and components",
+"unspsc",43223104,"2,5G GPRS wireless access network equipment and components",
+"unspsc",43223105,"3G UMTS mobile core network equipment and components",
+"unspsc",43223106,"3G UMTS wireless access network equipment and components",
+"unspsc",43223107,"WLAN mobile core network equipment and components",
+"unspsc",43223108,"WLAN wireless access network equipment and components",
+"unspsc",43223109,"IN SSP switching equipment",
+"unspsc",43223110,"IN mobile core equipment",
+"unspsc",43223111,"OSS mobile core network equipment and components",
+"unspsc",43223112,"OSS wireless access network equipment and components",
+"unspsc",43223113,"GSM UMT LAN antenna",
+"unspsc",43223200,"Mobile messaging platforms",
+"unspsc",43223201,"Voice messaging portal",
+"unspsc",43223202,"Short message service center",
+"unspsc",43223203,"Multimedia service center",
+"unspsc",43223204,"Unified messaging platform",
+"unspsc",43223205,"Instant messaging platform",
+"unspsc",43223206,"Wireless internet gateway",
+"unspsc",43223207,"Video streaming system",
+"unspsc",43223208,"Mobile or messaging game platform",
+"unspsc",43223209,"Location based messaging service platforms",
+"unspsc",43223210,"Micropayment messaging systems",
+"unspsc",43223211,"Paging controllers",
+"unspsc",43223212,"Paging terminals",
+"unspsc",43230000,"Software",
+"unspsc",43231500,"Business function specific software",
+"unspsc",43231501,"Helpdesk or call center software",
+"unspsc",43231503,"Procurement software",
+"unspsc",43231505,"Human resources software",
+"unspsc",43231506,"Materials requirements planning logistics and supply chain software",
+"unspsc",43231507,"Project management software",
+"unspsc",43231508,"Inventory management software",
+"unspsc",43231509,"Bar coding software",
+"unspsc",43231510,"Label making software",
+"unspsc",43231511,"Expert system software",
+"unspsc",43231512,"License management software",
+"unspsc",43231513,"Office suite software",
+"unspsc",43231600,"Finance accounting and enterprise resource planning ERP software",
+"unspsc",43231601,"Accounting software",
+"unspsc",43231602,"Enterprise resource planning ERP software",
+"unspsc",43231603,"Tax preparation software",
+"unspsc",43231604,"Financial analysis software",
+"unspsc",43231605,"Time accounting software",
+"unspsc",43232000,"Computer game or entertainment software",
+"unspsc",43232001,"Action games",
+"unspsc",43232002,"Adventure games",
+"unspsc",43232003,"Sports games",
+"unspsc",43232004,"Family software",
+"unspsc",43232005,"Music or sound editing software",
+"unspsc",43232100,"Content authoring and editing software",
+"unspsc",43232101,"Pattern design software",
+"unspsc",43232102,"Graphics or photo imaging software",
+"unspsc",43232103,"Video creation and editing software",
+"unspsc",43232104,"Word processing software",
+"unspsc",43232105,"Charting software",
+"unspsc",43232106,"Presentation software",
+"unspsc",43232107,"Web page creation and editing software",
+"unspsc",43232108,"Calendar and scheduling software",
+"unspsc",43232110,"Spreadsheet software",
+"unspsc",43232111,"Optical character reader OCR or scanning software",
+"unspsc",43232112,"Desktop publishing software",
+"unspsc",43232200,"Content management software",
+"unspsc",43232201,"Content workflow software",
+"unspsc",43232202,"Document management software",
+"unspsc",43232203,"File versioning software",
+"unspsc",43232300,"Data management and query software",
+"unspsc",43232301,"Categorization or classification software",
+"unspsc",43232302,"Clustering software",
+"unspsc",43232303,"Customer relationship management CRM software",
+"unspsc",43232304,"Data base management system software",
+"unspsc",43232305,"Data base reporting software",
+"unspsc",43232306,"Data base user interface and query software",
+"unspsc",43232307,"Data mining software",
+"unspsc",43232309,"Information retrieval or search software",
+"unspsc",43232310,"Metadata management software",
+"unspsc",43232311,"Object oriented data base management software",
+"unspsc",43232312,"Portal server software",
+"unspsc",43232313,"Transaction server software",
+"unspsc",43232400,"Development software",
+"unspsc",43232401,"Configuration management software",
+"unspsc",43232402,"Development environment software",
+"unspsc",43232403,"Enterprise application integration software",
+"unspsc",43232404,"Graphical user interface development software",
+"unspsc",43232405,"Object or component oriented development software",
+"unspsc",43232406,"Program testing software",
+"unspsc",43232407,"Requirements analysis and system architecture software",
+"unspsc",43232408,"Web platform development software",
+"unspsc",43232409,"Compiler and decompiler software",
+"unspsc",43232500,"Educational or reference software",
+"unspsc",43232501,"Foreign language software",
+"unspsc",43232502,"Computer based training software",
+"unspsc",43232503,"Spell checkers",
+"unspsc",43232504,"Route navigation software",
+"unspsc",43232505,"Multi-media educational software",
+"unspsc",43232506,"Encyclopedia software",
+"unspsc",43232600,"Industry specific software",
+"unspsc",43232601,"Aviation ground support software",
+"unspsc",43232602,"Aviation test software",
+"unspsc",43232603,"Facilities management software",
+"unspsc",43232604,"Computer aided design CAD software",
+"unspsc",43232605,"Analytical or scientific software",
+"unspsc",43232606,"Compliance software",
+"unspsc",43232607,"Flight control software",
+"unspsc",43232608,"Industrial control software",
+"unspsc",43232609,"Library software",
+"unspsc",43232610,"Medical software",
+"unspsc",43232611,"Point of sale POS software",
+"unspsc",43232612,"Computer aided manufacturing CAM software",
+"unspsc",43232700,"Network applications software",
+"unspsc",43232701,"Application server software",
+"unspsc",43232702,"Desktop communications software",
+"unspsc",43232703,"Interactive voice response software",
+"unspsc",43232704,"Internet directory services software",
+"unspsc",43232705,"Internet browser software",
+"unspsc",43232800,"Network management software",
+"unspsc",43232801,"Network monitoring software",
+"unspsc",43232802,"Network operating system enhancement software",
+"unspsc",43232803,"Optical network management software",
+"unspsc",43232804,"Administration software",
+"unspsc",43232900,"Networking software",
+"unspsc",43232901,"Access software",
+"unspsc",43232902,"Communications server software",
+"unspsc",43232903,"Contact center software",
+"unspsc",43232904,"Fax software",
+"unspsc",43232905,"LAN software",
+"unspsc",43232906,"Multiplexer software",
+"unspsc",43232907,"Storage networking software",
+"unspsc",43232908,"Switch or router software",
+"unspsc",43232909,"WAN switching software and firmware",
+"unspsc",43232910,"Wireless software",
+"unspsc",43232911,"Network connectivity terminal emulation software",
+"unspsc",43232912,"Gateway software",
+"unspsc",43232913,"Bridge software",
+"unspsc",43232914,"Modem software",
+"unspsc",43232915,"Platform interconnectivity software",
+"unspsc",43233000,"Operating environment software",
+"unspsc",43233001,"Filesystem software",
+"unspsc",43233002,"Network operation system software",
+"unspsc",43233004,"Operating system software",
+"unspsc",43233200,"Security and protection software",
+"unspsc",43233201,"Authentication server software",
+"unspsc",43233203,"Network security or virtual private network VPN management software",
+"unspsc",43233204,"Network security and virtual private network VPN equipment software",
+"unspsc",43233205,"Transaction security and virus protection software",
+"unspsc",43233400,"Utility and device driver software",
+"unspsc",43233401,"Compact disc CD server software",
+"unspsc",43233402,"Data conversion software",
+"unspsc",43233403,"Data compression software",
+"unspsc",43233404,"Compact disc CD or DVD or sound card software",
+"unspsc",43233405,"Device drivers or system software",
+"unspsc",43233406,"Ethernet driver software",
+"unspsc",43233407,"Graphics card driver software",
+"unspsc",43233410,"Printer driver software",
+"unspsc",43233411,"Screen saver software",
+"unspsc",43233413,"Voice recognition software",
+"unspsc",43233414,"Storage media loading software",
+"unspsc",43233415,"Backup or archival software",
+"unspsc",43233500,"Information exchange software",
+"unspsc",43233501,"Electronic mail software",
+"unspsc",43233502,"Video conferencing software",
+"unspsc",43233503,"Network conferencing software",
+"unspsc",43233504,"Instant messaging software",
+"unspsc",43233505,"Ambient music or advertising messaging software",
+"unspsc",43233506,"Map creation software",
+"unspsc",43233507,"Mobile operator specific standard software",
+"unspsc",43233508,"Mobile operator specific application software",
+"unspsc",43233509,"Mobile messaging service software",
+"unspsc",43233510,"Mobile internet services software",
+"unspsc",43233511,"Mobile location based services software",
+"unspsc",44000000,"Office Equipment and Accessories and Supplies",
+"unspsc",44100000,"Office machines and their supplies and accessories",
+"unspsc",44101500,"Duplicating machines",
+"unspsc",44101501,"Photocopiers",
+"unspsc",44101502,"Facsimile machines",
+"unspsc",44101503,"Multifunction machines",
+"unspsc",44101504,"Digital senders",
+"unspsc",44101505,"Digital duplicators",
+"unspsc",44101506,"Faxswitch machines",
+"unspsc",44101600,"Paper processing machines and accessories",
+"unspsc",44101601,"Paper cutting machines or accessories",
+"unspsc",44101602,"Paper punching or binding machines",
+"unspsc",44101603,"Paper shredding machines or accessories",
+"unspsc",44101604,"Base protection boards",
+"unspsc",44101605,"Paper jogging machines",
+"unspsc",44101606,"Paper sorting machines",
+"unspsc",44101700,"Printer and photocopier and facsimile accessories",
+"unspsc",44101701,"Color options or upgrades",
+"unspsc",44101702,"Duplexer trays",
+"unspsc",44101703,"Duplexer units",
+"unspsc",44101704,"Facsimile handsets",
+"unspsc",44101705,"Office machine trays or feeders",
+"unspsc",44101706,"Photoconductor or imaging units",
+"unspsc",44101707,"Stapler units",
+"unspsc",44101708,"Ozone filters",
+"unspsc",44101709,"Mirror assemblies",
+"unspsc",44101710,"Magnetic pickup assemblies",
+"unspsc",44101711,"Compressor assembly",
+"unspsc",44101712,"Mailbox stackers",
+"unspsc",44101713,"Copy counters",
+"unspsc",44101714,"Facsimile units for office machines",
+"unspsc",44101715,"Platen covers",
+"unspsc",44101716,"Hole punching units",
+"unspsc",44101718,"Infrared adapters",
+"unspsc",44101719,"Copy or scan accessories",
+"unspsc",44101720,"Language fonts",
+"unspsc",44101721,"Media spindles",
+"unspsc",44101722,"Multi bin mailbox power upgrades",
+"unspsc",44101723,"Multi bin mailboxes",
+"unspsc",44101724,"Multi function upgrades",
+"unspsc",44101725,"Printer cabinets",
+"unspsc",44101726,"Printer emulation upgrades",
+"unspsc",44101727,"Printer stands",
+"unspsc",44101728,"Roll feeds",
+"unspsc",44101729,"Output stackers",
+"unspsc",44101800,"Calculating machines and accessories",
+"unspsc",44101801,"Calculators or accessories",
+"unspsc",44101802,"Adding machines",
+"unspsc",44101803,"Accounting machines",
+"unspsc",44101804,"Cash registers",
+"unspsc",44101805,"Calculator ribbons",
+"unspsc",44101806,"Cash register ribbons",
+"unspsc",44101900,"Check endorsing and writing machines",
+"unspsc",44101901,"Check endorsing machines",
+"unspsc",44101902,"Check writing machines",
+"unspsc",44102000,"Laminating supplies",
+"unspsc",44102001,"Lamination film",
+"unspsc",44102002,"Laminator pouches",
+"unspsc",44102003,"Transfer foils",
+"unspsc",44102004,"Creative foils",
+"unspsc",44102100,"Mail machines",
+"unspsc",44102101,"Franking or postage machines",
+"unspsc",44102102,"Mail opening machines",
+"unspsc",44102103,"Mail sealing machines",
+"unspsc",44102104,"Stamp canceling machines",
+"unspsc",44102105,"Addressing machines",
+"unspsc",44102106,"Letter folders",
+"unspsc",44102107,"Stamp affixers",
+"unspsc",44102108,"Mail machine accessories",
+"unspsc",44102200,"Scanner accessories",
+"unspsc",44102201,"Endorsers",
+"unspsc",44102202,"Scanner document feeders",
+"unspsc",44102203,"Scanner transparency adapters",
+"unspsc",44102300,"Packing machines",
+"unspsc",44102301,"Bundling machines",
+"unspsc",44102302,"Parcel wrapping machines",
+"unspsc",44102303,"Seal presses",
+"unspsc",44102304,"Sealing machines",
+"unspsc",44102305,"Strapping tensioners or sealers",
+"unspsc",44102306,"Tying machines",
+"unspsc",44102307,"Collators",
+"unspsc",44102400,"Labeling machines",
+"unspsc",44102402,"Dating or numbering machines",
+"unspsc",44102403,"Identification ID press machines",
+"unspsc",44102404,"Label applying machines",
+"unspsc",44102405,"Label making machines",
+"unspsc",44102406,"Lettering equipment",
+"unspsc",44102407,"Tape embosser",
+"unspsc",44102408,"Automatic labeling systems",
+"unspsc",44102409,"Semi automatic labeling systems",
+"unspsc",44102411,"Label dispensers",
+"unspsc",44102412,"Adhesive label cartridges",
+"unspsc",44102500,"Sorting machines",
+"unspsc",44102501,"Money counting machines",
+"unspsc",44102502,"Sorters",
+"unspsc",44102503,"Coin wrapper machines",
+"unspsc",44102600,"Typing machines and accessories",
+"unspsc",44102602,"Typewriters",
+"unspsc",44102603,"Printwheels",
+"unspsc",44102604,"Stenotype machines",
+"unspsc",44102605,"Dictation machines",
+"unspsc",44102606,"Typerwriter ribbons",
+"unspsc",44102607,"Word processors",
+"unspsc",44102608,"Typewriter printing elements",
+"unspsc",44102609,"Accessory or supply kits for typewriters",
+"unspsc",44102610,"Typewriter starter kits",
+"unspsc",44102800,"Binding and lamination machines",
+"unspsc",44102801,"Laminators",
+"unspsc",44102900,"Office machine accessories",
+"unspsc",44102901,"Travel kits for office machines",
+"unspsc",44102902,"Storage accessories for office machines",
+"unspsc",44102903,"Tape cleaners",
+"unspsc",44102904,"Air compressed spray",
+"unspsc",44102905,"Small paper bags of wet absorbing salts",
+"unspsc",44102906,"Computer or office equipment cleaning kit",
+"unspsc",44102907,"Equipment dust covers",
+"unspsc",44102908,"Compact disc cleaners or scratch removers",
+"unspsc",44102909,"Compact disc drive cleaner",
+"unspsc",44102910,"Laminator trays",
+"unspsc",44102911,"Cleaning wipes for office machines",
+"unspsc",44102912,"Cleaning solutions for office equipment",
+"unspsc",44102913,"Compact disc destroyer",
+"unspsc",44103000,"Fusers and accessories",
+"unspsc",44103001,"Fuser cleaning pads or filters",
+"unspsc",44103002,"Fuser oil",
+"unspsc",44103003,"Fuser wiper",
+"unspsc",44103004,"Fusers",
+"unspsc",44103005,"Fuser lamps or assemblies",
+"unspsc",44103100,"Printer and facsimile and photocopier supplies",
+"unspsc",44103101,"Printer or facsimile or photocopier belts",
+"unspsc",44103103,"Toner",
+"unspsc",44103104,"Transfer rolls",
+"unspsc",44103105,"Ink cartridges",
+"unspsc",44103106,"Ink sticks",
+"unspsc",44103107,"Printer or facsimile or photocopier cleaning supplies",
+"unspsc",44103108,"Developer for printers or photocopiers",
+"unspsc",44103109,"Printer or facsimile or photocopier drums",
+"unspsc",44103110,"Print heads",
+"unspsc",44103111,"Ink rolls",
+"unspsc",44103112,"Printer ribbon",
+"unspsc",44103113,"Phasers or inkjet kits",
+"unspsc",44103114,"Laserjet coating kits",
+"unspsc",44103116,"Kit for printer",
+"unspsc",44103117,"Facsimile ribbons",
+"unspsc",44103118,"Transparency film",
+"unspsc",44103119,"Heat transfer paper for copiers",
+"unspsc",44103120,"Toner collectors",
+"unspsc",44103121,"Printer or facsimile or photocopier roller guides",
+"unspsc",44103122,"Print bands",
+"unspsc",44103123,"Plotter pens",
+"unspsc",44103124,"Thermal ribbon",
+"unspsc",44103200,"Office time recording machines and accessories",
+"unspsc",44103201,"Time card machines",
+"unspsc",44103202,"Time stamping machines",
+"unspsc",44103203,"Time card machine replacement ribbon",
+"unspsc",44103204,"Time card racks",
+"unspsc",44103205,"Time cards or sheets",
+"unspsc",44103500,"Binding machine supplies",
+"unspsc",44103502,"Binding covers",
+"unspsc",44103503,"Binding spines or snaps",
+"unspsc",44103504,"Binding coils or wire loops",
+"unspsc",44103505,"Binding combs or strips",
+"unspsc",44103506,"Binding tape",
+"unspsc",44103507,"Binding Kits",
+"unspsc",44103600,"Cassette disposal equipment and accessories",
+"unspsc",44103601,"Cassette or tape shredders",
+"unspsc",44110000,"Office and desk accessories",
+"unspsc",44111500,"Organizers and accessories",
+"unspsc",44111501,"Message holders or dispensers",
+"unspsc",44111502,"Desk drawer organizers",
+"unspsc",44111503,"Desktop trays or organizers",
+"unspsc",44111506,"Paper or pad holder or dispensers",
+"unspsc",44111507,"Book ends",
+"unspsc",44111509,"Pen or pencil holders",
+"unspsc",44111510,"Hanging organizers or accessories",
+"unspsc",44111511,"Display systems or its accessories",
+"unspsc",44111512,"Literature rack",
+"unspsc",44111513,"Supports for diaries or calendars",
+"unspsc",44111514,"Stamp racks or organizers",
+"unspsc",44111515,"File storage boxes or organizers",
+"unspsc",44111516,"Personal organizers",
+"unspsc",44111517,"Study stands",
+"unspsc",44111518,"Business card holders",
+"unspsc",44111519,"Collating racks",
+"unspsc",44111520,"Surface protectors or pads",
+"unspsc",44111521,"Copy holders",
+"unspsc",44111600,"Cash handling supplies",
+"unspsc",44111601,"Currency bags or wallets",
+"unspsc",44111603,"Coin sorters",
+"unspsc",44111604,"Coin wrappers or bill straps",
+"unspsc",44111605,"Cash or ticket boxes",
+"unspsc",44111606,"Cash box trays",
+"unspsc",44111607,"Check files",
+"unspsc",44111608,"Coin banks",
+"unspsc",44111609,"Counterfeit bill detectors or supplies",
+"unspsc",44111610,"Coin trays",
+"unspsc",44111611,"Money clips",
+"unspsc",44111612,"Coin bag seal",
+"unspsc",44111613,"Credit card holders",
+"unspsc",44111614,"Bill strap racks",
+"unspsc",44111615,"Deposit bags",
+"unspsc",44111616,"Check separators",
+"unspsc",44111800,"Drafting supplies",
+"unspsc",44111801,"Stencils or lettering aids",
+"unspsc",44111802,"Drafting films",
+"unspsc",44111803,"Compasses",
+"unspsc",44111804,"Drafting papers",
+"unspsc",44111805,"Curves",
+"unspsc",44111806,"Protractors",
+"unspsc",44111807,"Scales",
+"unspsc",44111808,"T squares",
+"unspsc",44111809,"Templates",
+"unspsc",44111810,"Triangles",
+"unspsc",44111812,"Drafting kits or sets",
+"unspsc",44111813,"Drafting dots or tapes",
+"unspsc",44111814,"Work surface protection covers",
+"unspsc",44111815,"Drafting table covers",
+"unspsc",44111900,"Boards",
+"unspsc",44111901,"Planning boards or accessories",
+"unspsc",44111902,"Electronic copyboards or accessories",
+"unspsc",44111903,"Easels or accessories",
+"unspsc",44111904,"Letter boards or accessories",
+"unspsc",44111905,"Dry erase boards or accessories",
+"unspsc",44111906,"Chalk boards or accessories",
+"unspsc",44111907,"Bulletin boards or accessories",
+"unspsc",44111908,"Magnetic boards or accessories",
+"unspsc",44111909,"Board cleaning kits or accessories",
+"unspsc",44111910,"Hanging rails or holders",
+"unspsc",44111911,"Interactive whiteboards or accessories",
+"unspsc",44112000,"Planning systems",
+"unspsc",44112001,"Address books or refills",
+"unspsc",44112002,"Calendars",
+"unspsc",44112004,"Meeting planners",
+"unspsc",44112005,"Appointment books or refills",
+"unspsc",44112006,"Diaries or refills",
+"unspsc",44112007,"Suggestion box",
+"unspsc",44112008,"Wall planners or refills",
+"unspsc",44120000,"Office supplies",
+"unspsc",44121500,"Mailing supplies",
+"unspsc",44121501,"Mailer tubes",
+"unspsc",44121503,"Mailers",
+"unspsc",44121504,"Window envelopes",
+"unspsc",44121505,"Specialty envelopes",
+"unspsc",44121506,"Standard envelopes",
+"unspsc",44121507,"Catalog or clasp envelopes",
+"unspsc",44121508,"Message droppers",
+"unspsc",44121509,"Mailing bags",
+"unspsc",44121510,"Mailing seals",
+"unspsc",44121511,"Mailing boxes",
+"unspsc",44121512,"Mailer tube caps",
+"unspsc",44121600,"Desk supplies",
+"unspsc",44121604,"Stamps",
+"unspsc",44121605,"Tape dispensers",
+"unspsc",44121611,"Paper or eyelet punches",
+"unspsc",44121612,"Paper cutters or refills",
+"unspsc",44121613,"Staple removers",
+"unspsc",44121614,"Call bells",
+"unspsc",44121615,"Staplers",
+"unspsc",44121617,"Manual letter openers",
+"unspsc",44121618,"Scissors",
+"unspsc",44121619,"Pencil sharpeners",
+"unspsc",44121620,"Finger stalls",
+"unspsc",44121621,"Desk pads or its accessories",
+"unspsc",44121622,"Moisteners",
+"unspsc",44121623,"Mechanical letter opener",
+"unspsc",44121624,"Embossing tools",
+"unspsc",44121625,"Paper weights",
+"unspsc",44121626,"Adhesive remover",
+"unspsc",44121627,"Bookmarks",
+"unspsc",44121628,"Clip holders or dispensers",
+"unspsc",44121630,"Stapler kit",
+"unspsc",44121631,"Glue dispensers or refills",
+"unspsc",44121632,"Scissor sharpener",
+"unspsc",44121633,"Postage stamp dispensers",
+"unspsc",44121634,"Adhesive rollers",
+"unspsc",44121635,"Adhesive tape spindles",
+"unspsc",44121700,"Writing instruments",
+"unspsc",44121701,"Rollerball pens",
+"unspsc",44121702,"Pen or pencil sets",
+"unspsc",44121703,"Fountain pens",
+"unspsc",44121704,"Ball point pens",
+"unspsc",44121705,"Mechanical pencils",
+"unspsc",44121706,"Wooden pencils",
+"unspsc",44121707,"Colored pencils",
+"unspsc",44121708,"Markers",
+"unspsc",44121709,"Crayons",
+"unspsc",44121710,"Writing chalk or accessories",
+"unspsc",44121711,"Felt pen",
+"unspsc",44121712,"Marker refills",
+"unspsc",44121713,"Pen nibs",
+"unspsc",44121714,"Pencil or pen grips",
+"unspsc",44121715,"Combination pen or pencil",
+"unspsc",44121716,"Highlighters",
+"unspsc",44121717,"Combination pen and highlighter",
+"unspsc",44121718,"Secured pen sets",
+"unspsc",44121800,"Correction media",
+"unspsc",44121801,"Correction film or tape",
+"unspsc",44121802,"Correction fluid",
+"unspsc",44121804,"Erasers",
+"unspsc",44121805,"Correction pens",
+"unspsc",44121806,"Correction pen refills",
+"unspsc",44121807,"Eraser refills",
+"unspsc",44121808,"Electrical erasers",
+"unspsc",44121900,"Ink and lead refills",
+"unspsc",44121902,"Lead refills",
+"unspsc",44121904,"Ink refills",
+"unspsc",44121905,"Ink or stamp pads",
+"unspsc",44122000,"Folders and binders and indexes",
+"unspsc",44122001,"Index card files",
+"unspsc",44122002,"Sheet protectors",
+"unspsc",44122003,"Binders",
+"unspsc",44122005,"Magazine or book covers",
+"unspsc",44122008,"Tab indexes",
+"unspsc",44122009,"Rotary or business card files",
+"unspsc",44122010,"Dividers",
+"unspsc",44122011,"Folders",
+"unspsc",44122012,"Clipboards",
+"unspsc",44122013,"Report covers",
+"unspsc",44122014,"Sheet lifters",
+"unspsc",44122015,"File backers",
+"unspsc",44122016,"Document holder",
+"unspsc",44122017,"Hanging folders or accessories",
+"unspsc",44122018,"File inserts or tabs",
+"unspsc",44122019,"File pockets or accessories",
+"unspsc",44122020,"Card pockets",
+"unspsc",44122021,"Postage stamp albums",
+"unspsc",44122022,"Folder binding accessories",
+"unspsc",44122023,"Archboards",
+"unspsc",44122024,"Binder handles",
+"unspsc",44122025,"Binder pockets or accessories",
+"unspsc",44122026,"Paper claws",
+"unspsc",44122027,"Expandable file folders",
+"unspsc",44122028,"Binder mounting channels",
+"unspsc",44122100,"Fastening supplies",
+"unspsc",44122101,"Rubber bands",
+"unspsc",44122103,"Clasp fasteners",
+"unspsc",44122104,"Paper clips",
+"unspsc",44122105,"Binder or bulldog clips",
+"unspsc",44122106,"Pins or tacks",
+"unspsc",44122107,"Staples",
+"unspsc",44122109,"Velcro fasteners",
+"unspsc",44122110,"Adhesive mounts",
+"unspsc",44122111,"Hole reinforcements",
+"unspsc",44122112,"Round head fasteners",
+"unspsc",44122113,"Tag fasteners",
+"unspsc",44122114,"Screw posts",
+"unspsc",44122115,"Adhesive corners",
+"unspsc",44122116,"Bag clips",
+"unspsc",44122117,"Book rings",
+"unspsc",44122118,"Prong fasteners",
+"unspsc",44122119,"Self adhesive fasteners",
+"unspsc",44122120,"Binder posts",
+"unspsc",44122121,"Wall or board clips",
+"unspsc",45000000,"Printing and Photographic and Audio and Visual Equipment and Supplies",
+"unspsc",45100000,"Printing and publishing equipment",
+"unspsc",45101500,"Printing machinery and equipment",
+"unspsc",45101501,"Heliographic printers",
+"unspsc",45101502,"Offset printing presses",
+"unspsc",45101503,"Letterpress equipment",
+"unspsc",45101504,"Lithographic equipment",
+"unspsc",45101505,"Photogravure printing machines",
+"unspsc",45101506,"Silk screen printing machines",
+"unspsc",45101507,"Printing presses",
+"unspsc",45101508,"Perforating machines",
+"unspsc",45101509,"Ultraviolet UV rotary printer",
+"unspsc",45101510,"Flexographic printer",
+"unspsc",45101511,"Inkjet printer for commercial printing applications",
+"unspsc",45101512,"Thermal transfer printer for commercial printing applications",
+"unspsc",45101513,"Hot stamp printer",
+"unspsc",45101514,"Pad printer",
+"unspsc",45101515,"Core printer",
+"unspsc",45101600,"Printing machinery accessories",
+"unspsc",45101602,"Offset darkroom equipment",
+"unspsc",45101603,"Offset printing consumables",
+"unspsc",45101604,"Offset printing plate processors",
+"unspsc",45101606,"Offset film processors",
+"unspsc",45101607,"Silk screen arc lamps",
+"unspsc",45101608,"Silk screen screens",
+"unspsc",45101609,"Silk screen printing racks",
+"unspsc",45101610,"Silk screen vacuum printing frames",
+"unspsc",45101611,"Silk screen squeegees",
+"unspsc",45101700,"Printing accessories",
+"unspsc",45101701,"Printing assemblers",
+"unspsc",45101702,"Printing guillotines",
+"unspsc",45101703,"Printing collators or decollators",
+"unspsc",45101704,"Printing cutters",
+"unspsc",45101705,"Printing trimmers",
+"unspsc",45101706,"Printing punches",
+"unspsc",45101707,"Printing plates",
+"unspsc",45101708,"Printing awls",
+"unspsc",45101800,"Book binding and sewing equipment and accessories",
+"unspsc",45101801,"Book creasing machines",
+"unspsc",45101802,"Book cutting machines",
+"unspsc",45101803,"Book punching machines",
+"unspsc",45101804,"Book stitching machines",
+"unspsc",45101805,"Book jogging machines",
+"unspsc",45101806,"Book gathering machines",
+"unspsc",45101807,"Book folding machines",
+"unspsc",45101808,"Thermal book binding machines",
+"unspsc",45101900,"Printing laboratory equipment and accessories",
+"unspsc",45101901,"Banding machines",
+"unspsc",45101902,"Platemakers",
+"unspsc",45101903,"Paper drilling machines",
+"unspsc",45101904,"Enlargers",
+"unspsc",45101905,"Drawing or retouching boards",
+"unspsc",45102000,"Composing machines and accessories",
+"unspsc",45102001,"Intertype composing machines",
+"unspsc",45102002,"Linotype composing machines",
+"unspsc",45102003,"Photocomposition materials",
+"unspsc",45102004,"Monotype composing machines",
+"unspsc",45102005,"Phototypesetting machines",
+"unspsc",45110000,"Audio and visual presentation and composing equipment",
+"unspsc",45111500,"Lecterns and sound systems and accessories",
+"unspsc",45111501,"Free standing lecterns",
+"unspsc",45111502,"Table top lecterns",
+"unspsc",45111503,"Gavels or sounding blocks",
+"unspsc",45111504,"Lighting or power or data components for lecterns",
+"unspsc",45111600,"Projectors and supplies",
+"unspsc",45111601,"Pointers",
+"unspsc",45111602,"Projection lamps",
+"unspsc",45111603,"Projection screens or displays",
+"unspsc",45111604,"Slide projectors",
+"unspsc",45111605,"Transparency equipment or supplies",
+"unspsc",45111606,"Liquid crystal display projection panels",
+"unspsc",45111607,"Overhead projectors",
+"unspsc",45111608,"Film projectors",
+"unspsc",45111609,"Multimedia projectors",
+"unspsc",45111610,"Epidiascopes",
+"unspsc",45111612,"Dissolve controls",
+"unspsc",45111613,"Cathode ray tube projector",
+"unspsc",45111614,"Liquid crystal display projector",
+"unspsc",45111615,"Projection lenses",
+"unspsc",45111616,"Video projectors",
+"unspsc",45111617,"Overhead projector or video trolleys",
+"unspsc",45111618,"Presentation light boxes",
+"unspsc",45111700,"Audio presentation and composing equipment and hardware and controllers",
+"unspsc",45111701,"Assistive listening devices",
+"unspsc",45111702,"Audio jack boxes",
+"unspsc",45111703,"Listening centers",
+"unspsc",45111704,"Audio mixing consoles",
+"unspsc",45111705,"Public address systems",
+"unspsc",45111800,"Video and combination video and audio presentation equipment and hardware and controllers",
+"unspsc",45111801,"Media control systems",
+"unspsc",45111802,"Television mounts",
+"unspsc",45111803,"Scan converters",
+"unspsc",45111804,"Line doublers",
+"unspsc",45111805,"Video editors",
+"unspsc",45111806,"Distance learning systems",
+"unspsc",45111807,"Interfaces",
+"unspsc",45111808,"Lighting controls",
+"unspsc",45111809,"Television mount accessories",
+"unspsc",45111810,"Visual presenters",
+"unspsc",45111900,"Phone and video conference equipment and hardware and controllers",
+"unspsc",45111901,"Audioconferencing systems",
+"unspsc",45111902,"Videoconferencing systems",
+"unspsc",45112000,"Microfilm equipment and supplies",
+"unspsc",45112001,"Microfiche or microfilm viewers",
+"unspsc",45112002,"Microfiche reader printers",
+"unspsc",45112003,"Microfiche or microfilm viewer components or accessories",
+"unspsc",45112004,"Microfiche reader printer components or accessories",
+"unspsc",45120000,"Photographic or filming or video equipment",
+"unspsc",45121500,"Cameras",
+"unspsc",45121501,"Still cameras",
+"unspsc",45121502,"Instant print cameras",
+"unspsc",45121503,"Disposable cameras",
+"unspsc",45121504,"Digital cameras",
+"unspsc",45121505,"Cinematographic cameras",
+"unspsc",45121506,"Video conference cameras",
+"unspsc",45121510,"Aerial cameras",
+"unspsc",45121511,"High speed cameras",
+"unspsc",45121512,"Underwater cameras",
+"unspsc",45121513,"Offset cameras",
+"unspsc",45121514,"Photocopier cameras",
+"unspsc",45121515,"Hand held camcorders or video cameras",
+"unspsc",45121516,"Digital camcorders or video cameras",
+"unspsc",45121517,"Document camera",
+"unspsc",45121518,"Camera kits",
+"unspsc",45121519,"Low light camera",
+"unspsc",45121520,"Web cameras",
+"unspsc",45121600,"Camera accessories",
+"unspsc",45121601,"Camera flashes or lighting",
+"unspsc",45121602,"Camera tripods",
+"unspsc",45121603,"Camera lenses or filters",
+"unspsc",45121604,"Camera shutters",
+"unspsc",45121605,"Screen frames",
+"unspsc",45121606,"Camera harnesses",
+"unspsc",45121607,"Camera blocks or holders",
+"unspsc",45121608,"Camera assemblies",
+"unspsc",45121609,"Camera brackets",
+"unspsc",45121610,"Camera cables",
+"unspsc",45121611,"Lens cover",
+"unspsc",45121612,"Camera tables",
+"unspsc",45121613,"Camera enclosures or covers",
+"unspsc",45121614,"Retrofit kits",
+"unspsc",45121615,"Camera rings",
+"unspsc",45121616,"Pan heads",
+"unspsc",45121617,"Camera bags",
+"unspsc",45121618,"Camera lens adapters",
+"unspsc",45121619,"Picture card wallets",
+"unspsc",45121620,"Camera power adapters",
+"unspsc",45121621,"Picture card adapters",
+"unspsc",45121622,"Camera lens cleaners",
+"unspsc",45121623,"Camera controllers",
+"unspsc",45121700,"Photographic processing equipment",
+"unspsc",45121701,"Film driers",
+"unspsc",45121702,"Film washers",
+"unspsc",45121703,"Film splicers",
+"unspsc",45121704,"Film editors",
+"unspsc",45121705,"Photographic enlargers",
+"unspsc",45121706,"Photo cutters or trimmers",
+"unspsc",45121800,"Microfilm production equipment and supplies",
+"unspsc",45121801,"Microfilm cameras",
+"unspsc",45121802,"Microfilm duplicators",
+"unspsc",45121803,"Microfilm jacket fillers",
+"unspsc",45121804,"Microfilm processors",
+"unspsc",45121805,"Microfilm camera components or accessories",
+"unspsc",45121806,"Microfilm duplicator components or accessories",
+"unspsc",45121807,"Microfilm jacket filler components or accessories",
+"unspsc",45121808,"Microfilm processor components or accessories",
+"unspsc",45121809,"Microfilm film supplies",
+"unspsc",45121810,"Microfilm sundry components or accessories",
+"unspsc",45130000,"Photographic and recording media",
+"unspsc",45131500,"Still picture film",
+"unspsc",45131501,"Color film",
+"unspsc",45131502,"Black and white film",
+"unspsc",45131503,"Instant picture film",
+"unspsc",45131505,"X ray film",
+"unspsc",45131600,"Moving picture media",
+"unspsc",45131601,"Motion picture camera film",
+"unspsc",45131604,"Blank video tapes",
+"unspsc",45131700,"Media storage",
+"unspsc",45131701,"Slide trays or organizers",
+"unspsc",45140000,"Photographic filmmaking supplies",
+"unspsc",45141500,"Photographic processing chemicals",
+"unspsc",45141501,"Developer solution",
+"unspsc",45141502,"Fixative",
+"unspsc",45141600,"Darkroom supplies",
+"unspsc",45141601,"Developing trays",
+"unspsc",45141602,"Developing tanks",
+"unspsc",45141603,"Developing tongs",
+"unspsc",46000000,"Defense and Law Enforcement and Security and Safety Equipment and Supplies",
+"unspsc",46100000,"Light weapons and ammunition",
+"unspsc",46101500,"Firearms",
+"unspsc",46101501,"Machine guns",
+"unspsc",46101502,"Police or security shotguns",
+"unspsc",46101503,"Military rifles",
+"unspsc",46101504,"Handguns",
+"unspsc",46101505,"Air rifles or air handguns",
+"unspsc",46101506,"Parts of guns or pistols",
+"unspsc",46101600,"Ammunition",
+"unspsc",46101601,"Defense or law enforcement ammunition",
+"unspsc",46101700,"Ammunition handling systems",
+"unspsc",46101701,"Tank ammunition handling systems",
+"unspsc",46101702,"Aircraft ammunition handling systems",
+"unspsc",46101800,"Arms and ammunition accessories",
+"unspsc",46101801,"Gun cases",
+"unspsc",46110000,"Conventional war weapons",
+"unspsc",46111500,"Bombs and grenades",
+"unspsc",46111501,"Grenades",
+"unspsc",46111502,"Mines",
+"unspsc",46111503,"Mortar bombs",
+"unspsc",46111600,"Gun systems",
+"unspsc",46111601,"Chain gun systems",
+"unspsc",46111602,"Gatling gun systems",
+"unspsc",46111700,"Infrared IR sensors",
+"unspsc",46111701,"Infrared IR coolers",
+"unspsc",46111702,"Infrared IR detectors",
+"unspsc",46111800,"Naval weapons",
+"unspsc",46111801,"Torpedoes",
+"unspsc",46120000,"Missiles",
+"unspsc",46121500,"Guided missiles",
+"unspsc",46121501,"Air to air missiles",
+"unspsc",46121502,"Antiaircraft missiles",
+"unspsc",46121503,"Antimissile missiles",
+"unspsc",46121504,"Antiship missiles",
+"unspsc",46121505,"Antitank missiles",
+"unspsc",46121506,"Ballistic missiles",
+"unspsc",46121507,"Cruise missiles",
+"unspsc",46121508,"Surface to air missiles",
+"unspsc",46121509,"Antiballistic missiles",
+"unspsc",46121510,"Surface to surface missiles",
+"unspsc",46121511,"Air to surface missiles",
+"unspsc",46121512,"Training missiles",
+"unspsc",46121600,"Missile subsystems",
+"unspsc",46121601,"Electronic safe or arm devices",
+"unspsc",46121602,"Solid missile boosters",
+"unspsc",46121603,"Missile warheads",
+"unspsc",46121604,"Safety pin pullers",
+"unspsc",46121605,"Jet reaction control assemblies",
+"unspsc",46130000,"Rockets and subsystems",
+"unspsc",46131500,"Launch vehicles and rockets",
+"unspsc",46131501,"Multi stage rockets",
+"unspsc",46131502,"Reusable rockets",
+"unspsc",46131503,"Single stage rockets",
+"unspsc",46131504,"Liquid rockets",
+"unspsc",46131505,"Solid rockets",
+"unspsc",46131600,"Boosters",
+"unspsc",46131601,"Reusable boosters",
+"unspsc",46131602,"Solid boosters",
+"unspsc",46131603,"Multi stage boosters",
+"unspsc",46131604,"Liquid boosters",
+"unspsc",46140000,"Launchers",
+"unspsc",46141500,"Missile and rocket launchers",
+"unspsc",46141501,"Missile launchers",
+"unspsc",46141502,"Rocket launchers",
+"unspsc",46150000,"Law enforcement",
+"unspsc",46151500,"Crowd control equipment",
+"unspsc",46151501,"Barricades",
+"unspsc",46151502,"Riot helmets",
+"unspsc",46151503,"Riot shields",
+"unspsc",46151504,"Body armour",
+"unspsc",46151505,"Barriers",
+"unspsc",46151506,"Riot batons",
+"unspsc",46151507,"Queuing control system",
+"unspsc",46151600,"Security and control equipment",
+"unspsc",46151601,"Handcuffs",
+"unspsc",46151602,"Night sticks",
+"unspsc",46151604,"Alcohol analysers",
+"unspsc",46151605,"Weapons or explosives detectors",
+"unspsc",46151606,"Narcotic test kits",
+"unspsc",46151607,"Security lanyards",
+"unspsc",46151700,"Forensic equipment and supplies and accessories",
+"unspsc",46151702,"Fingerprint applicators or brushes",
+"unspsc",46151703,"Fingerprint ink",
+"unspsc",46151704,"Fingerprint ink removers",
+"unspsc",46151705,"Fingerprint or palmprint ink rollers",
+"unspsc",46151706,"Fingerprint latent print kits",
+"unspsc",46151707,"Fingerprint lifters",
+"unspsc",46151708,"Forensic magnifiers",
+"unspsc",46151709,"Fingerprint marking pens",
+"unspsc",46151710,"Fingerprint powders",
+"unspsc",46151711,"Footprint lifters",
+"unspsc",46151712,"Forensic chemical workstations",
+"unspsc",46151713,"Forensic latent print chemicals",
+"unspsc",46151714,"Evidence drying cabinets",
+"unspsc",46151715,"Fingerprint equipment",
+"unspsc",46160000,"Public safety and control",
+"unspsc",46161500,"Traffic control",
+"unspsc",46161501,"Airport signaling systems",
+"unspsc",46161502,"Railway signaling systems",
+"unspsc",46161503,"Marine signaling systems",
+"unspsc",46161504,"Traffic signals",
+"unspsc",46161505,"Parking meters",
+"unspsc",46161506,"Snow or ice melter",
+"unspsc",46161507,"Barrier tapes or chains",
+"unspsc",46161508,"Traffic cones or delineators",
+"unspsc",46161509,"Speed stoppers",
+"unspsc",46161510,"Gate barrier systems",
+"unspsc",46161600,"Water safety",
+"unspsc",46161601,"Rope float lines",
+"unspsc",46161602,"Life rings",
+"unspsc",46161603,"Pool alarms",
+"unspsc",46161604,"Life vests or preservers",
+"unspsc",46170000,"Security surveillance and detection",
+"unspsc",46171500,"Locks and security hardware and accessories",
+"unspsc",46171501,"Padlocks",
+"unspsc",46171502,"Cable locks",
+"unspsc",46171503,"Lock sets",
+"unspsc",46171504,"Pushbutton locks",
+"unspsc",46171505,"Keys",
+"unspsc",46171506,"Safes",
+"unspsc",46171507,"Security bars",
+"unspsc",46171508,"Number locks",
+"unspsc",46171509,"Key cabinets or organizers",
+"unspsc",46171510,"Time locks",
+"unspsc",46171511,"Lockout devices",
+"unspsc",46171512,"Instrument locks",
+"unspsc",46171513,"Locking cam",
+"unspsc",46171514,"Security chains or accessories",
+"unspsc",46171515,"Key chains or key cases",
+"unspsc",46171516,"Door guards",
+"unspsc",46171517,"Keyhole signals",
+"unspsc",46171600,"Surveillance and detection equipment",
+"unspsc",46171602,"Safety horns",
+"unspsc",46171603,"Clock timers",
+"unspsc",46171604,"Alarm systems",
+"unspsc",46171605,"Door chimes",
+"unspsc",46171606,"Sirens",
+"unspsc",46171607,"Buzzers",
+"unspsc",46171608,"Motion detectors",
+"unspsc",46171609,"Convex security mirrors",
+"unspsc",46171610,"Security cameras",
+"unspsc",46171611,"Video identification systems",
+"unspsc",46171612,"Video monitors",
+"unspsc",46171613,"Gas detectors",
+"unspsc",46171615,"Light enhancing cameras or vision devices",
+"unspsc",46171616,"Radar detectors",
+"unspsc",46171617,"Door eyes",
+"unspsc",46171618,"Door bells",
+"unspsc",46171619,"Security or access control systems",
+"unspsc",46171620,"Safety light curtains",
+"unspsc",46171621,"Surveillance video or audio recorders",
+"unspsc",46180000,"Personal safety and protection",
+"unspsc",46181500,"Safety apparel",
+"unspsc",46181501,"Protective aprons",
+"unspsc",46181502,"Bullet proof vests",
+"unspsc",46181503,"Protective coveralls",
+"unspsc",46181504,"Protective gloves",
+"unspsc",46181505,"Protective knee pads",
+"unspsc",46181506,"Protective ponchos",
+"unspsc",46181507,"Safety vests",
+"unspsc",46181508,"Fire retardant apparel",
+"unspsc",46181509,"Hazardous material protective apparel",
+"unspsc",46181512,"Cleanroom apparel",
+"unspsc",46181514,"Elbow protectors",
+"unspsc",46181516,"Safety sleeves",
+"unspsc",46181517,"Insulated or flotation suits",
+"unspsc",46181518,"Heat resistant clothing",
+"unspsc",46181520,"Leg protectors",
+"unspsc",46181522,"Safety hoods",
+"unspsc",46181525,"Protective rainwear or wet environment apparel",
+"unspsc",46181526,"Protective shirts",
+"unspsc",46181527,"Protective pants",
+"unspsc",46181528,"Protective frock",
+"unspsc",46181529,"Insulated clothing for cold environments",
+"unspsc",46181530,"Protective finger cots",
+"unspsc",46181531,"Reflective apparel or accessories",
+"unspsc",46181532,"Lab coats",
+"unspsc",46181533,"Protective coats",
+"unspsc",46181534,"Protective wristbands",
+"unspsc",46181535,"Protective socks or hosiery",
+"unspsc",46181600,"Safety footwear",
+"unspsc",46181601,"Fire retardant footwear",
+"unspsc",46181602,"Hazardous material protective footwear",
+"unspsc",46181603,"Cleanroom footwear",
+"unspsc",46181604,"Safety boots",
+"unspsc",46181605,"Safety shoes",
+"unspsc",46181606,"Footwear covers",
+"unspsc",46181700,"Face and head protection",
+"unspsc",46181701,"Hard hats",
+"unspsc",46181702,"Facial shields",
+"unspsc",46181703,"Welding masks",
+"unspsc",46181704,"Safety helmets",
+"unspsc",46181705,"Motorcycle helmets",
+"unspsc",46181706,"Helmet parts or accessories",
+"unspsc",46181707,"Facial shields parts or accessories",
+"unspsc",46181800,"Vision protection and accessories",
+"unspsc",46181801,"Eyewear holders or cases",
+"unspsc",46181802,"Safety glasses",
+"unspsc",46181803,"Eye shields",
+"unspsc",46181804,"Goggles",
+"unspsc",46181805,"Video display filters",
+"unspsc",46181806,"Lens cleaner",
+"unspsc",46181808,"Goggle protective covers",
+"unspsc",46181809,"Eye shield garters",
+"unspsc",46181810,"Eyewashers or eye wash stations",
+"unspsc",46181811,"Protective lens",
+"unspsc",46181900,"Hearing protectors",
+"unspsc",46181901,"Ear plugs",
+"unspsc",46181902,"Ear muffs",
+"unspsc",46181903,"Earmuff replacement parts or accessories",
+"unspsc",46182000,"Respiratory protection",
+"unspsc",46182001,"Masks or accessories",
+"unspsc",46182002,"Respirators",
+"unspsc",46182003,"Gas masks",
+"unspsc",46182004,"Respiration air supplying self contained breathing apparatus or accessories",
+"unspsc",46182005,"Mask or respirators filters or accessories",
+"unspsc",46182006,"Protective films",
+"unspsc",46182007,"Powered air purifying respirator system PAPRs or accessories",
+"unspsc",46182100,"Anti static equipment and supplies",
+"unspsc",46182101,"Antistatic wrist straps",
+"unspsc",46182102,"Heel grounding straps",
+"unspsc",46182103,"Grounding hardware",
+"unspsc",46182104,"Anti static floor mats",
+"unspsc",46182105,"Anti static worktable mats",
+"unspsc",46182106,"Antistatic belts",
+"unspsc",46182107,"Antistatic maintenance kits",
+"unspsc",46182108,"Antistatic toe straps",
+"unspsc",46182200,"Ergonomic support aids",
+"unspsc",46182201,"Back support belts",
+"unspsc",46182202,"Elbow supports",
+"unspsc",46182203,"Back support rests",
+"unspsc",46182204,"Wrist braces",
+"unspsc",46182205,"Foot rests",
+"unspsc",46182206,"Wrist rests",
+"unspsc",46182207,"Ankle supports",
+"unspsc",46182208,"Shoe insoles",
+"unspsc",46182209,"Knee supports",
+"unspsc",46182300,"Fall protection",
+"unspsc",46182301,"Lifelines or lifeline equipment",
+"unspsc",46182302,"Fall protection lanyard",
+"unspsc",46182303,"Safety harness winders",
+"unspsc",46182304,"Anchorage connector",
+"unspsc",46182305,"Self retracting lanyard",
+"unspsc",46182306,"Safety harnesses or belts",
+"unspsc",46182400,"Decontamination aids and safety cleaning equipment",
+"unspsc",46182401,"Decontamination shower",
+"unspsc",46182402,"Safety wash units",
+"unspsc",46182500,"Personal safety devices or weapons",
+"unspsc",46182501,"Repellents for canine attacks",
+"unspsc",46190000,"Fire protection",
+"unspsc",46191500,"Fire prevention",
+"unspsc",46191501,"Smoke detectors",
+"unspsc",46191502,"Heat detectors",
+"unspsc",46191503,"Fire resistant coatings or putties or sealants",
+"unspsc",46191504,"Flame detectors",
+"unspsc",46191505,"Fire alarm systems",
+"unspsc",46191600,"Fire fighting equipment",
+"unspsc",46191601,"Fire extinguishers",
+"unspsc",46191602,"Fire sprinkler systems",
+"unspsc",46191603,"Fire hoses or nozzles",
+"unspsc",46191604,"Fire blankets",
+"unspsc",46191605,"Fire suppression hand tools",
+"unspsc",46191606,"Fire suppression foam or similar compounds",
+"unspsc",46191607,"Fire breathing apparatus",
+"unspsc",46191608,"Fire suppression system",
+"unspsc",46191609,"Fire escape equipment",
+"unspsc",46191610,"Fire sprinkler heads",
+"unspsc",47000000,"Cleaning Equipment and Supplies",
+"unspsc",47100000,"Water and wastewater treatment supply and disposal",
+"unspsc",47101500,"Water treatment and supply equipment",
+"unspsc",47101501,"Activated carbon equipment",
+"unspsc",47101502,"Ammonia removal equipment",
+"unspsc",47101503,"Carbon filtration equipment",
+"unspsc",47101504,"Bacterial removal equipment",
+"unspsc",47101505,"Chlorine handling equipment",
+"unspsc",47101506,"Corrosion control equipment",
+"unspsc",47101507,"Grit chambers",
+"unspsc",47101508,"Desalination equipment",
+"unspsc",47101509,"Fluoridation equipment",
+"unspsc",47101510,"Iron removal equipment",
+"unspsc",47101511,"Ion exchange equipment",
+"unspsc",47101512,"Mixers or agitators",
+"unspsc",47101513,"Oxygen generators",
+"unspsc",47101514,"Water purification equipment",
+"unspsc",47101516,"Turbidimeters",
+"unspsc",47101517,"Ultraviolet disinfection equipment",
+"unspsc",47101518,"Water conditioners",
+"unspsc",47101519,"Water softening accessories",
+"unspsc",47101521,"Ultrafiltration equipment",
+"unspsc",47101522,"Packaged water treatment systems",
+"unspsc",47101523,"Collection tanks",
+"unspsc",47101524,"Sludge or sewage composting equipment",
+"unspsc",47101525,"Dewatering equipment",
+"unspsc",47101526,"Sludge pelletizers",
+"unspsc",47101527,"Sludge shredders",
+"unspsc",47101528,"Water treatment dryers",
+"unspsc",47101529,"Incinerators",
+"unspsc",47101530,"Odor control equipment",
+"unspsc",47101531,"Septic tanks",
+"unspsc",47101532,"Settling tanks",
+"unspsc",47101533,"Lift stations",
+"unspsc",47101534,"Sewage distributors",
+"unspsc",47101535,"Sludge disposal equipment",
+"unspsc",47101536,"Sludge collectors",
+"unspsc",47101537,"Sludge conditioning equipment",
+"unspsc",47101538,"Sludge or sewage digesters",
+"unspsc",47101539,"Sludge or sewage removal equipment",
+"unspsc",47101600,"Water treatment consumables",
+"unspsc",47101601,"Algaecides",
+"unspsc",47101602,"Antiscalants",
+"unspsc",47101603,"Descalers",
+"unspsc",47101604,"Boiler feed chemicals",
+"unspsc",47101605,"Bacterial removal chemicals",
+"unspsc",47101606,"Corrosion control chemicals",
+"unspsc",47101607,"Odor control chemicals",
+"unspsc",47101608,"Flocculents",
+"unspsc",47101609,"Microbiocides",
+"unspsc",47101610,"Water softening compounds",
+"unspsc",47101611,"Demulsifiers",
+"unspsc",47101612,"Polyelectrolytes",
+"unspsc",47101613,"Buffer solutions",
+"unspsc",47110000,"Industrial laundry and dry cleaning equipment",
+"unspsc",47111500,"Washing and drying equipment",
+"unspsc",47111501,"Laundry type combined washing or drying machines",
+"unspsc",47111502,"Laundry type washing machines",
+"unspsc",47111503,"Clothes dryers",
+"unspsc",47111505,"Laundry equipment stands",
+"unspsc",47111600,"Ironing equipment",
+"unspsc",47111601,"Ironing machines or presses",
+"unspsc",47111602,"Folding machines",
+"unspsc",47111603,"Steam pressing machines",
+"unspsc",47111700,"Dry cleaning equipment",
+"unspsc",47111701,"Dry cleaning machines",
+"unspsc",47120000,"Janitorial equipment",
+"unspsc",47121500,"Janitor carts and accessories",
+"unspsc",47121501,"Janitor carts",
+"unspsc",47121502,"Janitor cart accessories",
+"unspsc",47121600,"Floor machines and accessories",
+"unspsc",47121602,"Vacuum cleaners",
+"unspsc",47121603,"Floor polishers",
+"unspsc",47121604,"Wet or dry combination vacuum cleaners",
+"unspsc",47121605,"Floor scrubbers",
+"unspsc",47121606,"Carpet sweepers",
+"unspsc",47121607,"Vacuum cleaner supplies or accessories",
+"unspsc",47121608,"Floor machine pads",
+"unspsc",47121609,"Carpet cleaning equipment",
+"unspsc",47121610,"Floor washing machine",
+"unspsc",47121611,"Floor scrapers",
+"unspsc",47121612,"Floor sweepers",
+"unspsc",47121613,"Floor polisher accessories",
+"unspsc",47121700,"Waste containers and accessories",
+"unspsc",47121701,"Trash bags",
+"unspsc",47121702,"Waste containers or rigid liners",
+"unspsc",47121703,"Smoking urns or accessories",
+"unspsc",47121704,"Waste container lids",
+"unspsc",47121705,"Urn sand bags",
+"unspsc",47121706,"Ash trays",
+"unspsc",47121707,"Motion sickness bags",
+"unspsc",47121708,"Hygienic bags",
+"unspsc",47121800,"Cleaning equipment",
+"unspsc",47121801,"Cleaning dusters",
+"unspsc",47121802,"Lint removers",
+"unspsc",47121803,"Squeegees or washers",
+"unspsc",47121804,"Cleaning pails or buckets",
+"unspsc",47121805,"Pressure or steam cleaners",
+"unspsc",47121806,"Mop wringer",
+"unspsc",47121807,"Drain or toilet plunger",
+"unspsc",47121808,"Drain or pipe cleaning equipment",
+"unspsc",47121809,"Degreasing pans",
+"unspsc",47121810,"Cleaning rag dispenser",
+"unspsc",47121811,"Duct cleaning machines",
+"unspsc",47121812,"Cleaning scrapers",
+"unspsc",47121813,"Scraper replacement blades",
+"unspsc",47121900,"Cleaning equipment accessories",
+"unspsc",47121901,"Squeege or washer holsters",
+"unspsc",47121902,"Squeege or washer accessories",
+"unspsc",47121903,"Pressure or steam cleaner accessories",
+"unspsc",47130000,"Cleaning and janitorial supplies",
+"unspsc",47131500,"Cleaning rags and cloths and wipes",
+"unspsc",47131501,"Rags",
+"unspsc",47131502,"Cleaning cloths or wipes",
+"unspsc",47131503,"Chamois or wash leathers",
+"unspsc",47131600,"Brooms and mops and brushes and accessories",
+"unspsc",47131601,"Dust brushes or pans",
+"unspsc",47131602,"Scouring pads",
+"unspsc",47131603,"Sponges",
+"unspsc",47131604,"Brooms",
+"unspsc",47131605,"Cleaning brushes",
+"unspsc",47131608,"Toilet brushes",
+"unspsc",47131609,"Broom or mop handles",
+"unspsc",47131610,"Floor finish applicator",
+"unspsc",47131611,"Trash picker",
+"unspsc",47131612,"Replacement rubbers",
+"unspsc",47131613,"Mop or broom holder",
+"unspsc",47131614,"Cleaning equipment clamps",
+"unspsc",47131615,"Broom heads",
+"unspsc",47131616,"Cleaning pad holders",
+"unspsc",47131617,"Dust mops",
+"unspsc",47131618,"Wet mops",
+"unspsc",47131619,"Mop heads",
+"unspsc",47131700,"Restroom supplies",
+"unspsc",47131701,"Paper towel dispensers",
+"unspsc",47131702,"Sanitary goods dispensers",
+"unspsc",47131703,"Sanitary waste receptacles",
+"unspsc",47131704,"Institutional soap or lotion dispensers",
+"unspsc",47131705,"Urinal or toilet accessories",
+"unspsc",47131706,"Air freshener dispensers",
+"unspsc",47131707,"Institutional hand dryers",
+"unspsc",47131708,"Bathroom tissue dispenser",
+"unspsc",47131709,"Facial tissue dispensers",
+"unspsc",47131710,"Toilet tissue dispensers",
+"unspsc",47131711,"Cleaner dispenser",
+"unspsc",47131800,"Cleaning and disinfecting solutions",
+"unspsc",47131801,"Floor cleaners",
+"unspsc",47131802,"Floor finishes or polishes",
+"unspsc",47131803,"Household disinfectants",
+"unspsc",47131804,"Ammonia cleaners",
+"unspsc",47131805,"General purpose cleaners",
+"unspsc",47131806,"Furniture polish or waxes",
+"unspsc",47131807,"Bleaches",
+"unspsc",47131808,"Dry germicidal",
+"unspsc",47131809,"Shoe cleaning or polishing products",
+"unspsc",47131810,"Dishwashing products",
+"unspsc",47131811,"Laundry products",
+"unspsc",47131812,"Air freshener",
+"unspsc",47131813,"Screen cleaner",
+"unspsc",47131814,"Metal cleaners or polishes",
+"unspsc",47131815,"Drain cleaner",
+"unspsc",47131816,"Deodorizers",
+"unspsc",47131817,"Household or automotive protectants",
+"unspsc",47131818,"Air sanitizer",
+"unspsc",47131819,"Caustic cleaners",
+"unspsc",47131820,"Petroleum derivative cleaners",
+"unspsc",47131821,"Degreasing compounds",
+"unspsc",47131822,"Carbon removing compounds",
+"unspsc",47131823,"Deicers or defrosters",
+"unspsc",47131824,"Glass or window cleaners",
+"unspsc",47131825,"Contact surface cleaners",
+"unspsc",47131826,"Carpet or upholstery cleaners",
+"unspsc",47131827,"Stain cleaners or removers",
+"unspsc",47131828,"Automotive cleaners",
+"unspsc",47131829,"Toilet cleaners",
+"unspsc",47131830,"Furniture cleaners",
+"unspsc",47131831,"Muriatic acid",
+"unspsc",47131832,"Anti dust products",
+"unspsc",47131833,"Food grade sanitizers",
+"unspsc",47131834,"Jewelry cleaning solutions",
+"unspsc",47131900,"Absorbents",
+"unspsc",47131901,"Absorbent mats",
+"unspsc",47131902,"Granular absorbent",
+"unspsc",47131903,"Plugging compound",
+"unspsc",47131904,"Absorbent socks",
+"unspsc",47131905,"Spill kits",
+"unspsc",47131906,"Absorbent pans",
+"unspsc",47131907,"Absorbent booms",
+"unspsc",47131908,"Absorbent pillows",
+"unspsc",47131909,"Sorbent pads or rolls",
+"unspsc",47132100,"Cleaning kits",
+"unspsc",47132101,"Industrial cleaning kits",
+"unspsc",47132102,"General purpose cleaning kits",
+"unspsc",48000000,"Service Industry Machinery and Equipment and Supplies",
+"unspsc",48100000,"Institutional food services equipment",
+"unspsc",48101500,"Cooking and warming equipment",
+"unspsc",48101501,"Commercial use bain maries",
+"unspsc",48101502,"Commercial use barbeque ovens",
+"unspsc",48101503,"Commercial use broilers",
+"unspsc",48101504,"Commercial use charcoal grills",
+"unspsc",48101505,"Commercial use coffee or iced tea makers",
+"unspsc",48101506,"Commercial use coffee warmers",
+"unspsc",48101507,"Commercial use convection ovens",
+"unspsc",48101508,"Commercial use conveyer toasters",
+"unspsc",48101509,"Commercial use deep fryers",
+"unspsc",48101510,"Commercial use food warmers",
+"unspsc",48101511,"Commercial use griddles",
+"unspsc",48101512,"Commercial use grills",
+"unspsc",48101513,"Commercial use heat lamps",
+"unspsc",48101514,"Commercial use high pressure steamers",
+"unspsc",48101515,"Commercial use hot dog grills",
+"unspsc",48101516,"Commercial use microwave ovens",
+"unspsc",48101517,"Commercial use ovens",
+"unspsc",48101518,"Commercial use pasta cookers",
+"unspsc",48101519,"Commercial use pizza ovens",
+"unspsc",48101520,"Commercial use popcorn machines",
+"unspsc",48101521,"Commercial use ranges",
+"unspsc",48101522,"Commercial use rotisseries",
+"unspsc",48101523,"Commercial use smokers or smoke ovens",
+"unspsc",48101524,"Commercial use steamers",
+"unspsc",48101525,"Commercial use toasters",
+"unspsc",48101526,"Commercial use waffle irons",
+"unspsc",48101527,"Barbecues",
+"unspsc",48101528,"Commercial use crepe machines",
+"unspsc",48101529,"Pressure cookers or pressure fryers",
+"unspsc",48101530,"Commercial use rice cookers",
+"unspsc",48101531,"Commercial salmon poachers or kettles",
+"unspsc",48101532,"Commercial use cotton candy machines or accessories",
+"unspsc",48101600,"Food preparation equipment",
+"unspsc",48101601,"Commercial use blenders",
+"unspsc",48101602,"Commercial use electric can openers",
+"unspsc",48101603,"Commercial use food choppers or cubers or dicers",
+"unspsc",48101604,"Commercial use coffee grinders",
+"unspsc",48101605,"Commercial use food grinders",
+"unspsc",48101606,"Commercial use graters",
+"unspsc",48101607,"Commercial use juicers",
+"unspsc",48101608,"Commercial use mixers",
+"unspsc",48101609,"Commercial use pasta machines",
+"unspsc",48101610,"Commercial use peelers",
+"unspsc",48101611,"Commercial use scales",
+"unspsc",48101612,"Commercial use food processors",
+"unspsc",48101613,"Commercial use dough machines",
+"unspsc",48101614,"Commercial use icing sets or bags",
+"unspsc",48101615,"Commercial use dishwashers",
+"unspsc",48101616,"Commercial use food slicers",
+"unspsc",48101617,"Commercial use plastic shovels",
+"unspsc",48101700,"Food and beverage dispensing equipment",
+"unspsc",48101701,"Carbonated beverage dispenser",
+"unspsc",48101702,"Non carbonated beverage dispenser",
+"unspsc",48101703,"Milk dispensers",
+"unspsc",48101704,"Syrup pumps",
+"unspsc",48101705,"Cappuccino or espresso machines",
+"unspsc",48101706,"Milkshake machines",
+"unspsc",48101707,"Soft serve machines",
+"unspsc",48101708,"Slush machines",
+"unspsc",48101709,"Ice dispensers",
+"unspsc",48101710,"Drinking fountains or bubblers",
+"unspsc",48101711,"Bottled water dispensers or accessories",
+"unspsc",48101712,"Cup dispenser",
+"unspsc",48101713,"Cocktail shakers or accessories",
+"unspsc",48101714,"Hot water dispenser",
+"unspsc",48101715,"Ice shaver machines or accessories",
+"unspsc",48101800,"Cookware and kitchen tools",
+"unspsc",48101801,"Commercial use cutlery",
+"unspsc",48101802,"Commercial use molds",
+"unspsc",48101803,"Commercial use scoops",
+"unspsc",48101804,"Commercial use measuring cups",
+"unspsc",48101805,"Commercial use mixing bowls",
+"unspsc",48101806,"Commercial use cake or pie pans",
+"unspsc",48101807,"Commercial use pizza pans",
+"unspsc",48101808,"Commercial use sauce or saute pans",
+"unspsc",48101809,"Commercial use stock or sauce pots",
+"unspsc",48101810,"Commercial use pot or pan covers",
+"unspsc",48101811,"Commercial use rolling pins",
+"unspsc",48101812,"Commercial use strainers",
+"unspsc",48101813,"Commercial use whisks",
+"unspsc",48101814,"Commercial use woks",
+"unspsc",48101815,"Commercial use ladles",
+"unspsc",48101816,"Commercial use cutlery pouch",
+"unspsc",48101817,"Cake decorating equipment or moulds",
+"unspsc",48101900,"Tabletop and serving equipment",
+"unspsc",48101901,"Food service dinnerware",
+"unspsc",48101902,"Food service flatware",
+"unspsc",48101903,"Food service glasses",
+"unspsc",48101904,"Food service stemware",
+"unspsc",48101905,"Food service cups or mugs",
+"unspsc",48101906,"Food service serving baskets",
+"unspsc",48101907,"Food service pitchers",
+"unspsc",48101908,"Food service chafers",
+"unspsc",48101909,"Food service coffee or tea pots",
+"unspsc",48101910,"Food service soup crocks",
+"unspsc",48101911,"Food service ice buckets or wine coolers",
+"unspsc",48101912,"Food service condiment dispensers",
+"unspsc",48101913,"Food service punch bowls",
+"unspsc",48101914,"Food service wine carafes",
+"unspsc",48101915,"Food service trays",
+"unspsc",48101916,"Food service napkin dispensers",
+"unspsc",48101917,"Food service fondue pots",
+"unspsc",48101918,"Food service table covering rolls",
+"unspsc",48101919,"Food service glasses or cups or mugs or container lids",
+"unspsc",48101920,"Straw dispensers",
+"unspsc",48102000,"Restaurant furniture",
+"unspsc",48102001,"Restaurant chairs",
+"unspsc",48102002,"Booths",
+"unspsc",48102003,"Salad bars",
+"unspsc",48102004,"Tabletops",
+"unspsc",48102005,"Bar stools",
+"unspsc",48102006,"Permanent bars",
+"unspsc",48102007,"Portable bars",
+"unspsc",48102100,"Storage and handling equipment and supplies",
+"unspsc",48102101,"Display cases",
+"unspsc",48102102,"Heated display cases",
+"unspsc",48102103,"Refrigerated display cases",
+"unspsc",48102104,"Ice cream display cases",
+"unspsc",48102105,"Glass chilling equipment",
+"unspsc",48102106,"Cool containers",
+"unspsc",48102107,"Catering gloves or glove dispensers",
+"unspsc",48110000,"Vending machines",
+"unspsc",48111000,"Liquid vending machines",
+"unspsc",48111001,"Machines dispensing single servings with cups",
+"unspsc",48111002,"Machines dispensing bulk quantities",
+"unspsc",48111100,"Piece and part vending machines",
+"unspsc",48111101,"Bottle or can vending machines",
+"unspsc",48111102,"Gumball candy or childrens novelties machines",
+"unspsc",48111103,"Snack or small package goods display machines",
+"unspsc",48111104,"A la carte foods vending machines",
+"unspsc",48111105,"Frozen confections machines",
+"unspsc",48111106,"Personal accommodation item dispensers",
+"unspsc",48111107,"Cigarette machines",
+"unspsc",48111108,"Drug dispensers",
+"unspsc",48111200,"Prepared to order food vending machines",
+"unspsc",48111201,"French fry vending machines",
+"unspsc",48111202,"Popcorn vending machines",
+"unspsc",48111300,"Service and ticket vending machines",
+"unspsc",48111301,"Ticket dispensing machines",
+"unspsc",48111302,"Insurance policy vending machines",
+"unspsc",48111303,"Stamp machines",
+"unspsc",48111400,"Currency vending machines",
+"unspsc",48111401,"Automatic teller machines ATMs",
+"unspsc",48111402,"Bill to coin changers",
+"unspsc",48111403,"Foreign currency exchange machines",
+"unspsc",48111404,"Electronic funds transfer point of sale equipment",
+"unspsc",48111405,"Automatic teller machine accessories",
+"unspsc",48120000,"Gambling or wagering equipment",
+"unspsc",48121100,"Coin operated gambling machines",
+"unspsc",48121101,"Poker or slot machines",
+"unspsc",48121200,"Gambling tables and games",
+"unspsc",48121201,"Roulette wheels",
+"unspsc",48121202,"Card tables",
+"unspsc",48121300,"Gambling management and networked wagering systems",
+"unspsc",48121301,"Table gambling management systems",
+"unspsc",48121302,"Networked wagering games",
+"unspsc",49000000,"Sports and Recreational Equipment and Supplies and Accessories",
+"unspsc",49100000,"Collectibles and awards",
+"unspsc",49101600,"Collectibles",
+"unspsc",49101601,"Antiques",
+"unspsc",49101602,"Souvenirs",
+"unspsc",49101603,"Mint coin collections",
+"unspsc",49101604,"Stamp collections",
+"unspsc",49101605,"Antique rugs",
+"unspsc",49101606,"Diggings",
+"unspsc",49101607,"Comic book collections",
+"unspsc",49101608,"Antique musical instruments",
+"unspsc",49101609,"Ornaments or decorations",
+"unspsc",49101611,"Charms",
+"unspsc",49101612,"Holograms",
+"unspsc",49101613,"Glass crystals",
+"unspsc",49101700,"Awards",
+"unspsc",49101701,"Medals",
+"unspsc",49101702,"Trophies",
+"unspsc",49101704,"Plaques",
+"unspsc",49101705,"Certificates",
+"unspsc",49101706,"Photo award",
+"unspsc",49101707,"Achievement certificate",
+"unspsc",49101708,"Crowns",
+"unspsc",49120000,"Camping and outdoor equipment and accessories",
+"unspsc",49121500,"Camping and outdoor equipment",
+"unspsc",49121502,"Sleeping pads",
+"unspsc",49121503,"Tents",
+"unspsc",49121504,"Sleeping bags",
+"unspsc",49121505,"Ice chests",
+"unspsc",49121506,"Tent repair kits",
+"unspsc",49121507,"Pneumatic mattresses",
+"unspsc",49121508,"Mosquito nets",
+"unspsc",49121509,"Camping or outdoor stoves",
+"unspsc",49121510,"Drink coolers",
+"unspsc",49121600,"Camping furniture",
+"unspsc",49121601,"Camping chairs or stools",
+"unspsc",49121602,"Camping tables",
+"unspsc",49121603,"Camping cots",
+"unspsc",49130000,"Fishing and hunting equipment",
+"unspsc",49131500,"Fishing tackle",
+"unspsc",49131501,"Fishing rods",
+"unspsc",49131502,"Fishing line",
+"unspsc",49131503,"Fishing reels",
+"unspsc",49131504,"Fishing lures",
+"unspsc",49131505,"Fishing bait",
+"unspsc",49131506,"Fishing weights or sinkers",
+"unspsc",49131600,"Hunting products",
+"unspsc",49131601,"Animal calls",
+"unspsc",49131602,"Sporting decoys",
+"unspsc",49131603,"Sporting traps",
+"unspsc",49131604,"Sporting shotguns",
+"unspsc",49131605,"Sporting rifles",
+"unspsc",49131606,"Sporting ammunition",
+"unspsc",49131607,"Gun barrel",
+"unspsc",49140000,"Watersports equipment",
+"unspsc",49141500,"Scuba and snorkeling gear",
+"unspsc",49141501,"Bouyancy compensators",
+"unspsc",49141502,"Scuba tanks",
+"unspsc",49141503,"Scuba regulators",
+"unspsc",49141504,"Diving instruments or accessories",
+"unspsc",49141505,"Masks or fins or snorkels",
+"unspsc",49141506,"Wetsuits",
+"unspsc",49141507,"Drysuits",
+"unspsc",49141600,"Surf and swim equipment and accessories",
+"unspsc",49141602,"Wakeboards or kneeboards or boogieboards",
+"unspsc",49141603,"Water skis or accessories",
+"unspsc",49141604,"Windsurfing equipment",
+"unspsc",49141605,"Surfboards",
+"unspsc",49141606,"Swim goggles or swim fins",
+"unspsc",49141607,"Parasailing equipment",
+"unspsc",49150000,"Winter sports equipment",
+"unspsc",49151500,"Skiing and snowboarding equipment",
+"unspsc",49151501,"Ski boots",
+"unspsc",49151502,"Skis",
+"unspsc",49151503,"Ski poles",
+"unspsc",49151504,"Bindings",
+"unspsc",49151505,"Snowboards",
+"unspsc",49151600,"Skating and ice hockey equipment",
+"unspsc",49151601,"Hockey pucks",
+"unspsc",49151602,"Ice skates",
+"unspsc",49151603,"Hockey sticks",
+"unspsc",49160000,"Field and court sports equipment",
+"unspsc",49161500,"Field sports equipment",
+"unspsc",49161501,"Football blocking sleds",
+"unspsc",49161502,"Baseball gloves",
+"unspsc",49161503,"Baseballs",
+"unspsc",49161504,"Footballs",
+"unspsc",49161505,"Soccer balls",
+"unspsc",49161506,"Baseball bats",
+"unspsc",49161507,"Baseball bases",
+"unspsc",49161508,"Pitching machines",
+"unspsc",49161509,"Softballs",
+"unspsc",49161510,"Football tackling dummies",
+"unspsc",49161511,"Lacrosse sticks",
+"unspsc",49161512,"Lacrosse balls",
+"unspsc",49161513,"Field hockey sticks",
+"unspsc",49161514,"Field hockey balls",
+"unspsc",49161515,"Team handball balls",
+"unspsc",49161516,"Team handball school sets",
+"unspsc",49161517,"Baseball or softball protective gear",
+"unspsc",49161518,"Baseball batting aids",
+"unspsc",49161519,"Baseball backstops or fences",
+"unspsc",49161520,"Softball bats",
+"unspsc",49161521,"Softball gloves",
+"unspsc",49161522,"Football kicking tees",
+"unspsc",49161523,"Flag football gear",
+"unspsc",49161524,"Soccer field marking equipment",
+"unspsc",49161525,"Soccer protective equipment",
+"unspsc",49161526,"Soccer training aids",
+"unspsc",49161600,"Racquet and court sports equipment",
+"unspsc",49161601,"Racquetball rackets",
+"unspsc",49161602,"Badminton rackets",
+"unspsc",49161603,"Basketballs",
+"unspsc",49161604,"Tennis balls",
+"unspsc",49161605,"Racquet balls",
+"unspsc",49161606,"Squash balls",
+"unspsc",49161607,"Tennis racquets",
+"unspsc",49161608,"Volleyballs",
+"unspsc",49161609,"Badminton birdies or shuttlecocks",
+"unspsc",49161610,"Squash racquets",
+"unspsc",49161611,"Tennis training aids",
+"unspsc",49161612,"Tennis court equipment",
+"unspsc",49161613,"Volleyball storage for balls or nets",
+"unspsc",49161614,"Volleyball gymnasium standards",
+"unspsc",49161615,"Basketball complete game systems",
+"unspsc",49161616,"Floor hockey protective equipment",
+"unspsc",49161617,"Tether poles",
+"unspsc",49161618,"Tether balls",
+"unspsc",49161619,"Racquet strings",
+"unspsc",49161620,"Racquet grips",
+"unspsc",49161700,"Track sports equipment",
+"unspsc",49161701,"Javelins",
+"unspsc",49161702,"Jumping bars",
+"unspsc",49161703,"Discus",
+"unspsc",49161704,"Shotputs",
+"unspsc",49161705,"Vaulting poles",
+"unspsc",49161706,"Hurdles",
+"unspsc",49161707,"Batons",
+"unspsc",49170000,"Gymnastics and boxing equipment",
+"unspsc",49171500,"Gymnastics equipment",
+"unspsc",49171501,"Gymnastic bars or beams",
+"unspsc",49171502,"Gymnastic ropes or rings or climbing accessories",
+"unspsc",49171503,"Gymnastic vaulting equipment",
+"unspsc",49171504,"Gymnastic trampolines",
+"unspsc",49171505,"Balance equipment",
+"unspsc",49171600,"Boxing equipment",
+"unspsc",49171601,"Boxing rings",
+"unspsc",49171602,"Punching bags",
+"unspsc",49171603,"Boxing gloves",
+"unspsc",49180000,"Target and table games and equipment",
+"unspsc",49181500,"Table games and equipment",
+"unspsc",49181501,"Billiard tables",
+"unspsc",49181502,"Pool cues",
+"unspsc",49181503,"Shuffleboard",
+"unspsc",49181504,"Pinball games",
+"unspsc",49181505,"Billiard balls",
+"unspsc",49181506,"Air hockey tables or accessories",
+"unspsc",49181507,"Tennis tables",
+"unspsc",49181508,"Table tennis paddles",
+"unspsc",49181509,"Table tennis balls",
+"unspsc",49181510,"Foosball tables",
+"unspsc",49181511,"Foosballs",
+"unspsc",49181512,"Foosball replacement players",
+"unspsc",49181513,"Billiard cue tips",
+"unspsc",49181514,"Billiard chalk",
+"unspsc",49181515,"Billiard racks",
+"unspsc",49181600,"Target games and equipment",
+"unspsc",49181601,"Archery targets",
+"unspsc",49181602,"Archery bows",
+"unspsc",49181603,"Archery arrows",
+"unspsc",49181604,"Darts",
+"unspsc",49181605,"Dart boards",
+"unspsc",49181606,"Trapshooting equipment",
+"unspsc",49181607,"Throwing targets",
+"unspsc",49181608,"Archery bow strings",
+"unspsc",49181609,"Archery gloves",
+"unspsc",49181610,"Archery arm guards",
+"unspsc",49181611,"Archery target stands",
+"unspsc",49181612,"Archery backstops",
+"unspsc",49200000,"Fitness equipment",
+"unspsc",49201500,"Aerobic training equipment",
+"unspsc",49201501,"Treadmills",
+"unspsc",49201502,"Stair climbers",
+"unspsc",49201503,"Stationary bicycles",
+"unspsc",49201504,"Rowing machines",
+"unspsc",49201512,"Jump ropes",
+"unspsc",49201513,"Exercise trampolines",
+"unspsc",49201514,"Exercise balls",
+"unspsc",49201515,"Step aerobic equipment",
+"unspsc",49201516,"Cross trainers",
+"unspsc",49201600,"Weight and resistance training equipment",
+"unspsc",49201601,"Dumbbells",
+"unspsc",49201602,"Barbells",
+"unspsc",49201603,"Lower body resistance machines",
+"unspsc",49201604,"Weight benches or racks",
+"unspsc",49201605,"Upper body resistance machines",
+"unspsc",49201606,"Fitness weights",
+"unspsc",49201607,"Pilates machines",
+"unspsc",49201608,"Grip strengthener",
+"unspsc",49201609,"Resistance bands",
+"unspsc",49201610,"Resistance tubes",
+"unspsc",49201611,"Multi gyms",
+"unspsc",49210000,"Other sports",
+"unspsc",49211600,"Golf equipment",
+"unspsc",49211601,"Golf bags",
+"unspsc",49211602,"Golf balls",
+"unspsc",49211603,"Golf clubs",
+"unspsc",49211604,"Golf tees",
+"unspsc",49211605,"Golf club head covers",
+"unspsc",49211606,"Golf gloves",
+"unspsc",49211607,"Divot fixers",
+"unspsc",49211608,"Golfscopes",
+"unspsc",49211609,"Golf putting partner",
+"unspsc",49211700,"Bowling equipment and supplies and accessories",
+"unspsc",49211701,"Bowling equipment",
+"unspsc",49211702,"Bowling supplies",
+"unspsc",49211703,"Bowling accessories",
+"unspsc",49211800,"Physical education classroom equipment",
+"unspsc",49211801,"Parachute equipment",
+"unspsc",49211802,"Hula hoops or hoop equipment",
+"unspsc",49211803,"Orienteering equipment",
+"unspsc",49211804,"Team identification materials or markers",
+"unspsc",49211805,"Lanyards",
+"unspsc",49211806,"Physical education equipment storage",
+"unspsc",49211807,"Physical education assessment tools",
+"unspsc",49220000,"Sports equipment and accessories",
+"unspsc",49221500,"Sport accessories",
+"unspsc",49221501,"Sport scoreboards",
+"unspsc",49221502,"Sport goals",
+"unspsc",49221503,"Sport safety equipment other than headgear",
+"unspsc",49221504,"Sport safety headgear",
+"unspsc",49221505,"Sport nets or netting",
+"unspsc",49221506,"Sport mats or padding",
+"unspsc",49221507,"Basketball backboards",
+"unspsc",49221508,"Basketball hoop",
+"unspsc",49221509,"Roller skates or roller blades",
+"unspsc",49221510,"Sport caps",
+"unspsc",49221511,"Sports equipment bags",
+"unspsc",49240000,"Recreation and playground and swimming and spa equipment and supplies",
+"unspsc",49241500,"Playground equipment",
+"unspsc",49241501,"Playground swings",
+"unspsc",49241502,"Playground climbing apparatus",
+"unspsc",49241503,"Playground merry go rounds",
+"unspsc",49241504,"Playground slides",
+"unspsc",49241505,"Playground see saws",
+"unspsc",49241506,"Playground tunnels",
+"unspsc",49241507,"Playground sandboxes",
+"unspsc",49241508,"Playground bleachers",
+"unspsc",49241509,"Wall climbing equipment",
+"unspsc",49241510,"Rope climbing equipment",
+"unspsc",49241600,"Recreational equipment",
+"unspsc",49241601,"Croquet sets",
+"unspsc",49241602,"Lawn bowling equipment",
+"unspsc",49241603,"Horseshoe equipment",
+"unspsc",49241604,"Lawn darts",
+"unspsc",49241700,"Swimming pool and spa equipment and supplies",
+"unspsc",49241701,"Diving boards",
+"unspsc",49241702,"Pool slides",
+"unspsc",49241703,"Spa blower",
+"unspsc",49241704,"Water test kit or solutions",
+"unspsc",49241705,"Automatic pool cleaner",
+"unspsc",49241706,"Solar blanket",
+"unspsc",49241707,"Pool or spa heater",
+"unspsc",49241708,"Ozone generator",
+"unspsc",49241709,"Solar blanket reels",
+"unspsc",50000000,"Food Beverage and Tobacco Products",
+"unspsc",50100000,"Fruits and vegetables and nuts and seeds",
+"unspsc",50101500,"Vegetables",
+"unspsc",50101538,"Fresh vegetables",
+"unspsc",50101539,"Frozen vegetables",
+"unspsc",50101540,"Shelf stable vegetables",
+"unspsc",50101541,"Mushrooms or fungi",
+"unspsc",50101542,"Vegetable flour",
+"unspsc",50101543,"Dried beans",
+"unspsc",50101544,"Canned or shelf stable beans",
+"unspsc",50101545,"Dried vegetables",
+"unspsc",50101600,"Fruits",
+"unspsc",50101634,"Fresh fruit",
+"unspsc",50101635,"Frozen fruit",
+"unspsc",50101636,"Shelf stable fruit",
+"unspsc",50101700,"Nuts and seeds",
+"unspsc",50101716,"Whole nuts or seeds",
+"unspsc",50101717,"Shelled nuts or seeds",
+"unspsc",50110000,"Meat and poultry products",
+"unspsc",50111500,"Meat and poultry",
+"unspsc",50111510,"Fresh meat or poultry",
+"unspsc",50111511,"Frozen meat or poultry",
+"unspsc",50111512,"Shelf stable meat or poultry",
+"unspsc",50112000,"Processed and prepared meats",
+"unspsc",50112001,"Fresh processed or prepared meats",
+"unspsc",50112002,"Frozen processed or prepared meats",
+"unspsc",50112003,"Shelf stable processed or prepared meats",
+"unspsc",50120000,"Seafood",
+"unspsc",50121500,"Fish",
+"unspsc",50121537,"Frozen fish",
+"unspsc",50121538,"Shelf stable fish",
+"unspsc",50121539,"Fresh fish",
+"unspsc",50121600,"Shellfish",
+"unspsc",50121611,"Fresh shellfish",
+"unspsc",50121612,"Frozen shellfish",
+"unspsc",50121613,"Shelf stable shellfish",
+"unspsc",50121700,"Aquatic invertebrates",
+"unspsc",50121705,"Fresh aquatic invertebrates",
+"unspsc",50121706,"Frozen aquatic invertebrates",
+"unspsc",50121707,"Shelf stable aquatic invertebrates",
+"unspsc",50121800,"Aquatic plants",
+"unspsc",50121802,"Fresh aquatic plants",
+"unspsc",50121803,"Frozen aquatic plants",
+"unspsc",50121804,"Shelf stable aquatic plants",
+"unspsc",50130000,"Dairy products and eggs",
+"unspsc",50131600,"Eggs and egg substitutes",
+"unspsc",50131606,"Fresh eggs",
+"unspsc",50131607,"Egg substitutes",
+"unspsc",50131608,"Egg whites or yolks",
+"unspsc",50131609,"Prepared eggs",
+"unspsc",50131610,"Frozen eggs",
+"unspsc",50131611,"Liquid eggs",
+"unspsc",50131700,"Milk and butter products",
+"unspsc",50131701,"Fresh milk or butter products",
+"unspsc",50131702,"Shelf stable milk or butter products",
+"unspsc",50131703,"Frozen milk and butter products",
+"unspsc",50131800,"Cheese",
+"unspsc",50131801,"Natural cheese",
+"unspsc",50131802,"Processed cheese",
+"unspsc",50131803,"Imitation cheese",
+"unspsc",50150000,"Edible oils and fats",
+"unspsc",50151500,"Edible vegetable and plant oils and fats",
+"unspsc",50151513,"Edible vegetable or plant oils",
+"unspsc",50151514,"Edible vegetable or plant fats",
+"unspsc",50151600,"Edible animal oils and fats",
+"unspsc",50151604,"Edible animal oils",
+"unspsc",50151605,"Edible animal fats",
+"unspsc",50160000,"Chocolate and sugars and sweeteners and confectionary products",
+"unspsc",50161500,"Chocolate and sugars and sweetening products",
+"unspsc",50161509,"Natural sugars or sweetening products",
+"unspsc",50161510,"Artificial sweetening agents",
+"unspsc",50161511,"Chocolate or chocolate substitute",
+"unspsc",50161512,"Syrups",
+"unspsc",50161800,"Confectionary products",
+"unspsc",50161813,"Chocolate or chocolate substitute candy",
+"unspsc",50161814,"Sugar or sugar substitute candy",
+"unspsc",50161815,"Chewing gum",
+"unspsc",50170000,"Seasonings and preservatives",
+"unspsc",50171500,"Herbs and spices and extracts",
+"unspsc",50171548,"Fresh herbs",
+"unspsc",50171549,"Dried herbs",
+"unspsc",50171550,"Spices or extracts",
+"unspsc",50171551,"Cooking or table salt",
+"unspsc",50171552,"Seasoning mix",
+"unspsc",50171700,"Vinegars and cooking wines",
+"unspsc",50171707,"Vinegars",
+"unspsc",50171708,"Cooking wines",
+"unspsc",50171800,"Sauces and spreads and condiments",
+"unspsc",50171830,"Dipping sauces or condiments or spreads or marinades",
+"unspsc",50171831,"Cooking sauce",
+"unspsc",50171832,"Salad dressing or dips",
+"unspsc",50171833,"Savory spread or pate",
+"unspsc",50171900,"Pickles and relish and olives",
+"unspsc",50171901,"Pickles",
+"unspsc",50171902,"Relish",
+"unspsc",50171903,"Olives",
+"unspsc",50171904,"Chutneys",
+"unspsc",50180000,"Bread and bakery products",
+"unspsc",50181700,"Baking mixes and supplies",
+"unspsc",50181708,"Baking mixes",
+"unspsc",50181709,"Baking supplies",
+"unspsc",50181900,"Bread and biscuits and cookies",
+"unspsc",50181901,"Fresh bread",
+"unspsc",50181902,"Frozen bread",
+"unspsc",50181903,"Plain savory biscuits",
+"unspsc",50181904,"Dried breads or bread shells or croutons",
+"unspsc",50181905,"Sweet biscuits or cookies",
+"unspsc",50181906,"Shelf stable bread",
+"unspsc",50181907,"Frozen cookie dough",
+"unspsc",50181908,"Frozen  bread dough",
+"unspsc",50181909,"Crackers",
+"unspsc",50182000,"Cakes and pies and pastries",
+"unspsc",50182001,"Fresh cakes or pies or pastries",
+"unspsc",50182002,"Frozen cakes or pies or pastries",
+"unspsc",50182003,"Frozen pastry dough",
+"unspsc",50182004,"Frozen savory biscuit dough",
+"unspsc",50190000,"Prepared and preserved foods",
+"unspsc",50191500,"Prepared soups and stews",
+"unspsc",50191505,"Fresh prepared soups or stews",
+"unspsc",50191506,"Frozen prepared soups or stews",
+"unspsc",50191507,"Shelf stable prepared soups or stews",
+"unspsc",50192100,"Snack foods",
+"unspsc",50192109,"Crisps or chips or pretzels or mixes",
+"unspsc",50192110,"Nuts or dried fruits",
+"unspsc",50192111,"Dried or processed meats",
+"unspsc",50192112,"Popped corn",
+"unspsc",50192300,"Desserts and dessert toppings",
+"unspsc",50192301,"Prepared desserts",
+"unspsc",50192302,"Dessert toppings",
+"unspsc",50192303,"Flavored ices or ice cream or ice cream desserts or frozen yogurts",
+"unspsc",50192304,"Edible ice cream cups or cones",
+"unspsc",50192400,"Jams and jellies and nut and sweet spreads and fruit conserves",
+"unspsc",50192401,"Jams or jellies or fruit preserves",
+"unspsc",50192402,"Nut or mixed spreads",
+"unspsc",50192403,"Honey",
+"unspsc",50192404,"Gelatin or jelly crystals",
+"unspsc",50192500,"Sandwiches and filled rolls",
+"unspsc",50192501,"Fresh sandwiches or filled rolls",
+"unspsc",50192502,"Frozen sandwiches or filled rolls",
+"unspsc",50192503,"Fresh sandwich fillers",
+"unspsc",50192504,"Frozen sandwich fillers",
+"unspsc",50192600,"Prepared side dishes",
+"unspsc",50192601,"Fresh prepared potatoes or rice or pasta or stuffing",
+"unspsc",50192602,"Frozen prepared potatoes or rice or pasta or stuffing",
+"unspsc",50192603,"Shelf stable prepared potatoes or rice or pasta or stuffing",
+"unspsc",50192700,"Packaged combination meals",
+"unspsc",50192701,"Fresh combination meals",
+"unspsc",50192702,"Frozen combination meals",
+"unspsc",50192703,"Shelf stable combination meals",
+"unspsc",50192800,"Savory pies and quiches and pasties",
+"unspsc",50192801,"Fresh savory pies or quiches or pasties",
+"unspsc",50192802,"Frozen savory pies or quiches or pasties",
+"unspsc",50192803,"Shelf stable savory pies or quiches or pasties",
+"unspsc",50192900,"Plain pasta and noodles",
+"unspsc",50192901,"Fresh plain pasta or noodles",
+"unspsc",50192902,"Shelf stable plain pasta or noodles",
+"unspsc",50193000,"Infant foods and beverages",
+"unspsc",50193001,"Infant foods",
+"unspsc",50193002,"Infant beverages",
+"unspsc",50193100,"Instant mixes and supplies",
+"unspsc",50193101,"Instant snack mixes",
+"unspsc",50193102,"Dessert mix",
+"unspsc",50193103,"Gravy mix",
+"unspsc",50193104,"Soup bases",
+"unspsc",50193105,"Batter or breading mixes",
+"unspsc",50193200,"Prepared salads",
+"unspsc",50193201,"Fresh prepared salads",
+"unspsc",50193202,"Frozen prepared salads",
+"unspsc",50193203,"Shelf stable prepared salads",
+"unspsc",50200000,"Beverages",
+"unspsc",50201700,"Coffee and tea",
+"unspsc",50201706,"Coffee",
+"unspsc",50201707,"Coffee substitutes",
+"unspsc",50201708,"Coffee drinks",
+"unspsc",50201709,"Instant coffee",
+"unspsc",50201710,"Leaf tea",
+"unspsc",50201711,"Instant tea",
+"unspsc",50201712,"Tea drinks",
+"unspsc",50201713,"Tea bags",
+"unspsc",50201714,"Non dairy creamers",
+"unspsc",50202200,"Alcoholic beverages",
+"unspsc",50202201,"Beer",
+"unspsc",50202202,"Cider or perry",
+"unspsc",50202203,"Wine",
+"unspsc",50202204,"Fortified wine",
+"unspsc",50202205,"Sparkling wine",
+"unspsc",50202206,"Spirits or liquors",
+"unspsc",50202207,"Alcohol cocktails or drink mixes",
+"unspsc",50202300,"Non alcoholic beverages",
+"unspsc",50202301,"Water",
+"unspsc",50202302,"Ice",
+"unspsc",50202303,"Frozen juices",
+"unspsc",50202304,"Shelf stable juice",
+"unspsc",50202305,"Fresh juice",
+"unspsc",50202306,"Soft drinks",
+"unspsc",50202307,"Chocolate or malt or other hot beverages",
+"unspsc",50202308,"Alcohol free cocktails or drink mixes",
+"unspsc",50202309,"Sport or energy drink",
+"unspsc",50202310,"Spring or mineral water",
+"unspsc",50202311,"Powdered drink mix",
+"unspsc",50210000,"Tobacco and smoking products and substitutes",
+"unspsc",50211500,"Tobacco and substitutes",
+"unspsc",50211502,"Cigarettes or cigars",
+"unspsc",50211503,"Pipe tobacco or leaf tobacco",
+"unspsc",50211504,"Chewing tobacco",
+"unspsc",50211505,"Herbal cigarettes",
+"unspsc",50211506,"Snuff",
+"unspsc",50211600,"Tobacco product accessories and supplies",
+"unspsc",50211607,"Cigarette papers or filters",
+"unspsc",50211608,"Cigarette lighters or flints",
+"unspsc",50211609,"Smoking pipes",
+"unspsc",50211610,"Tobacco pipe cleaners",
+"unspsc",50211611,"Smoking sets",
+"unspsc",50211612,"Cigarette lighter housings",
+"unspsc",50220000,"Cereal and pulse products",
+"unspsc",50221000,"Pulses",
+"unspsc",50221001,"Pulse grains",
+"unspsc",50221002,"Pulse flour",
+"unspsc",50221100,"Cereals",
+"unspsc",50221101,"Cereal grains",
+"unspsc",50221102,"Cereal flour",
+"unspsc",50221200,"Processed cereals",
+"unspsc",50221201,"Ready to eat or hot cereals",
+"unspsc",50221202,"Health or breakfast bars",
+"unspsc",51000000,"Drugs and Pharmaceutical Products",
+"unspsc",51100000,"Anti infective drugs",
+"unspsc",51101500,"Antibiotics",
+"unspsc",51101503,"Chloramphenicol",
+"unspsc",51101504,"Clindamycin ",
+"unspsc",51101507,"Penicillin",
+"unspsc",51101508,"Antibiotic sulfonamides",
+"unspsc",51101509,"Tetracycline",
+"unspsc",51101510,"Oxytetracycline",
+"unspsc",51101511,"Amoxycillin",
+"unspsc",51101512,"Cloxacillin",
+"unspsc",51101513,"Neomycin",
+"unspsc",51101514,"Framycetin sulphate",
+"unspsc",51101515,"Lincomycin hydrochloride",
+"unspsc",51101516,"Gramicidin",
+"unspsc",51101518,"Ofloxacin",
+"unspsc",51101519,"Thiamphenicol",
+"unspsc",51101521,"Pristinamycine",
+"unspsc",51101522,"Clarithromycin",
+"unspsc",51101523,"Chlorquinaldol",
+"unspsc",51101524,"Bacitracin zinc",
+"unspsc",51101525,"Benzoyl peroxide",
+"unspsc",51101526,"Polymyxins",
+"unspsc",51101527,"Colistimethate sodium",
+"unspsc",51101528,"Tyrothricin",
+"unspsc",51101530,"Trimethoprim",
+"unspsc",51101531,"Streptogramins",
+"unspsc",51101532,"Teicoplanin",
+"unspsc",51101533,"Rifamycin",
+"unspsc",51101534,"Ceftibuten",
+"unspsc",51101535,"Cephradine",
+"unspsc",51101536,"Moxifloxacin hydrochloride",
+"unspsc",51101537,"Lomefloxacin hydrochloride",
+"unspsc",51101538,"Levofloxacin",
+"unspsc",51101539,"Grepafloxacin hydrochloride",
+"unspsc",51101540,"Gatifloxacin",
+"unspsc",51101541,"Enoxacin",
+"unspsc",51101542,"Ciprofloxacin",
+"unspsc",51101543,"Cephapirin",
+"unspsc",51101544,"loracarbef",
+"unspsc",51101545,"Ceftizoxime",
+"unspsc",51101546,"Norfloxacin",
+"unspsc",51101547,"Cefprozil",
+"unspsc",51101548,"Fosfomycin tromethamine",
+"unspsc",51101549,"Linezolid",
+"unspsc",51101550,"Cephalexin",
+"unspsc",51101551,"Ceftriaxone",
+"unspsc",51101552,"Ceftazidime",
+"unspsc",51101553,"Alatrofloxacin",
+"unspsc",51101554,"Dicloxacillin sodium",
+"unspsc",51101555,"Aztreonam",
+"unspsc",51101556,"Minocycline",
+"unspsc",51101557,"Doxycycline",
+"unspsc",51101558,"Demeclocycline",
+"unspsc",51101559,"Chlortetracycline",
+"unspsc",51101560,"Ticarcillin",
+"unspsc",51101561,"Piperacillin",
+"unspsc",51101562,"Oxacillin sodium",
+"unspsc",51101563,"Trovafloxacin mesylate",
+"unspsc",51101564,"Mezlocillin",
+"unspsc",51101565,"Cefpodoxime proxetil",
+"unspsc",51101566,"Carbenicillin",
+"unspsc",51101567,"Ampicillin",
+"unspsc",51101568,"Troleandomycin",
+"unspsc",51101569,"Roxithromycin",
+"unspsc",51101570,"Erythromycin",
+"unspsc",51101571,"Dirithromycin",
+"unspsc",51101572,"Azithromycin",
+"unspsc",51101573,"Cefuroxime",
+"unspsc",51101574,"Furazolidone",
+"unspsc",51101575,"Nafcillin sodium",
+"unspsc",51101576,"Cephalothin",
+"unspsc",51101577,"Cefdinir",
+"unspsc",51101578,"Cefazolin",
+"unspsc",51101579,"Cefamandole",
+"unspsc",51101580,"Cefadroxil",
+"unspsc",51101581,"Cefaclor",
+"unspsc",51101582,"Tobramycin",
+"unspsc",51101583,"Cefditoren",
+"unspsc",51101584,"Gentamicin",
+"unspsc",51101585,"Netilmicin",
+"unspsc",51101586,"Amikacin",
+"unspsc",51101587,"Kanamycin",
+"unspsc",51101588,"Sparfloxacin",
+"unspsc",51101589,"Carbapenems including thienamycins",
+"unspsc",51101590,"Quinupristin",
+"unspsc",51101591,"Vancomycin",
+"unspsc",51101592,"Cefoxitin",
+"unspsc",51101593,"Cefotaxime",
+"unspsc",51101594,"Cefepime",
+"unspsc",51101595,"Cefotetan",
+"unspsc",51101596,"Cefoperazone",
+"unspsc",51101597,"Mupirocin",
+"unspsc",51101598,"Cefonicid",
+"unspsc",51101599,"Cefixime",
+"unspsc",51101600,"Amebicides and Trichomonacides and Antiprotozoals",
+"unspsc",51101601,"Atovaquone",
+"unspsc",51101602,"Eflornithine hydrochloride",
+"unspsc",51101603,"Metronidazole",
+"unspsc",51101604,"Meglumine antimonate",
+"unspsc",51101606,"Rifapentine",
+"unspsc",51101607,"Calcium oxide",
+"unspsc",51101610,"Chlorocresol",
+"unspsc",51101611,"Meropenem",
+"unspsc",51101612,"Polynoxylin",
+"unspsc",51101613,"Pentamidine isetionate",
+"unspsc",51101614,"Diloxanide furoate",
+"unspsc",51101616,"Melarsoprol",
+"unspsc",51101617,"Tinidazole",
+"unspsc",51101618,"Taurolidine",
+"unspsc",51101619,"Secnidazole",
+"unspsc",51101620,"Iodoquinol",
+"unspsc",51101624,"Metronidazole hydrochloride",
+"unspsc",51101625,"Paromomycin sulfate",
+"unspsc",51101629,"Trimetrexate glucuronate",
+"unspsc",51101630,"Propamidine isethionate",
+"unspsc",51101700,"Anthelmintics and other antiparasitics",
+"unspsc",51101701,"Albendadole",
+"unspsc",51101702,"Mebendazole",
+"unspsc",51101703,"Oxamniquine",
+"unspsc",51101704,"Piperazine citrate",
+"unspsc",51101705,"Praziquantel",
+"unspsc",51101706,"Pyrantel pamoate",
+"unspsc",51101707,"Thiabendazole",
+"unspsc",51101708,"Sulphanilamide",
+"unspsc",51101709,"Niclosamide",
+"unspsc",51101710,"Piperazine",
+"unspsc",51101711,"Diethylcarbamazine citrate",
+"unspsc",51101712,"Isobornyl thiocyanoacetate",
+"unspsc",51101713,"Malathion topical antiparasitic",
+"unspsc",51101714,"Methylparaben",
+"unspsc",51101715,"Permethrin topical antiparasitic",
+"unspsc",51101716,"Tetrachloroethylene",
+"unspsc",51101717,"Ivermectin",
+"unspsc",51101718,"Benzyl benzoate",
+"unspsc",51101719,"Piperonyl butoxide",
+"unspsc",51101720,"Lindane",
+"unspsc",51101800,"Antifungal drugs",
+"unspsc",51101801,"Amphotericin B",
+"unspsc",51101802,"Butenafine hydrochloride",
+"unspsc",51101803,"Butoconazole nitrate",
+"unspsc",51101804,"Ciclopirox olamine",
+"unspsc",51101805,"Clotrimazole",
+"unspsc",51101806,"Econazole nitrate",
+"unspsc",51101807,"Fluconazole",
+"unspsc",51101808,"Flucytosine",
+"unspsc",51101809,"Griseofulvin",
+"unspsc",51101810,"Itraconazole",
+"unspsc",51101811,"Ketoconazole",
+"unspsc",51101812,"Miconazole",
+"unspsc",51101813,"Naftifine hydrochloride",
+"unspsc",51101814,"Natamycin",
+"unspsc",51101815,"Nystatin",
+"unspsc",51101816,"Oxiconazole nitrate",
+"unspsc",51101817,"Sulconazole nitrate",
+"unspsc",51101818,"Terbinafine hydrochloride",
+"unspsc",51101819,"Terconazole nitrate",
+"unspsc",51101820,"Tioconazole",
+"unspsc",51101821,"Tolnaftate",
+"unspsc",51101824,"Undecylenic acid",
+"unspsc",51101825,"Ciclopirox",
+"unspsc",51101826,"Streptomycin sulphate",
+"unspsc",51101827,"Isoconazole",
+"unspsc",51101828,"Terconazole",
+"unspsc",51101829,"Calcium undecylenate",
+"unspsc",51101830,"Octanoic acid",
+"unspsc",51101831,"Triacetin",
+"unspsc",51101832,"Voriconazole",
+"unspsc",51101834,"Miconazole nitrate",
+"unspsc",51101835,"Caspofungin acetate",
+"unspsc",51101836,"Sodium propionate",
+"unspsc",51101900,"Antimalarial drugs",
+"unspsc",51101901,"Aminoquinolines",
+"unspsc",51101902,"Mefloquine hydrochloride",
+"unspsc",51101903,"Primaquine phosphate",
+"unspsc",51101904,"Quinine sulfate",
+"unspsc",51101905,"Chloroquine",
+"unspsc",51101906,"Proguanil",
+"unspsc",51101907,"Pyrimethamine",
+"unspsc",51101908,"Artemether",
+"unspsc",51101909,"Chloroquine hydrochloride",
+"unspsc",51101910,"Chloroquine phosphate",
+"unspsc",51101911,"Halofantrine hydrochloride",
+"unspsc",51101912,"Hydroxychloroquine sulfate",
+"unspsc",51102000,"Antitubercular drugs",
+"unspsc",51102001,"Cycloserine",
+"unspsc",51102002,"Ethambutol hydrochloride",
+"unspsc",51102003,"Isoniazid",
+"unspsc",51102004,"Rifubutin",
+"unspsc",51102005,"Rifampin",
+"unspsc",51102006,"Guaiacol",
+"unspsc",51102007,"Thiacetazone",
+"unspsc",51102008,"Pyrazinamide",
+"unspsc",51102009,"Capreomycin sulfate",
+"unspsc",51102100,"Leprostatics",
+"unspsc",51102101,"Clofazimine",
+"unspsc",51102102,"Dapsone",
+"unspsc",51102200,"Urinary anti infectives and analgesics",
+"unspsc",51102201,"Cinoxacin",
+"unspsc",51102202,"Flavoxate hydrochloride",
+"unspsc",51102203,"Methenamine hippurate",
+"unspsc",51102204,"Methenamine mandelate",
+"unspsc",51102205,"Nalidixic acid",
+"unspsc",51102206,"Nitrofurantoin",
+"unspsc",51102207,"Oxybutynin chloride",
+"unspsc",51102208,"Pentosan polysulfate sodium",
+"unspsc",51102209,"Phenazopyridine hydrochloride",
+"unspsc",51102211,"Alfuzosin hydrochloride",
+"unspsc",51102212,"Acetohydroxamic acid",
+"unspsc",51102213,"Cefpirome sulphate",
+"unspsc",51102300,"Antiviral drugs",
+"unspsc",51102301,"Acyclovir",
+"unspsc",51102302,"Amantadine hydrochloride",
+"unspsc",51102304,"Didanosine",
+"unspsc",51102305,"Famciclovir",
+"unspsc",51102306,"Foscarnet sodium",
+"unspsc",51102307,"Ganciclovir sodium",
+"unspsc",51102308,"Idoxuridine",
+"unspsc",51102309,"Indinavir sulfate",
+"unspsc",51102310,"Lamivudine",
+"unspsc",51102311,"Nevirapine",
+"unspsc",51102312,"Ribavirin",
+"unspsc",51102313,"Rimantadine hydrochloride",
+"unspsc",51102314,"Ritonavir",
+"unspsc",51102315,"Saquinavir mesylate",
+"unspsc",51102316,"Stavidine",
+"unspsc",51102317,"Trifluradine",
+"unspsc",51102318,"Valacyclovir hydrochloride",
+"unspsc",51102319,"Vidarabine",
+"unspsc",51102320,"Zalcitabine",
+"unspsc",51102321,"Zidovudine",
+"unspsc",51102322,"Abacavir sulfate",
+"unspsc",51102323,"Cidofovir",
+"unspsc",51102324,"Delavirdine mesylate",
+"unspsc",51102325,"Docosanol",
+"unspsc",51102326,"Efavirenz",
+"unspsc",51102327,"Amprenavir",
+"unspsc",51102328,"Fomivirsen sodium",
+"unspsc",51102329,"Nelfinavir mesylate",
+"unspsc",51102330,"Penciclovir",
+"unspsc",51102331,"Saquinavir",
+"unspsc",51102332,"Tenofovir disoproxil fumarate",
+"unspsc",51102333,"Valganciclovir hydrochloride",
+"unspsc",51102334,"Zanamivir",
+"unspsc",51102335,"Acyclovir sodium",
+"unspsc",51102336,"Moroxydine ",
+"unspsc",51102400,"Ophthalmic",
+"unspsc",51102402,"Hypromellose",
+"unspsc",51102500,"Veterinary anthelmintics",
+"unspsc",51102501,"Copper napthanate",
+"unspsc",51102502,"Toltrazuril",
+"unspsc",51102503,"Flumethrin",
+"unspsc",51102505,"Trichlorofon",
+"unspsc",51102506,"Oxfendazole",
+"unspsc",51102507,"Piperidolate hydrochloride",
+"unspsc",51102600,"Veterinary antibiotics",
+"unspsc",51102601,"Enrofloxacin",
+"unspsc",51102700,"Antiseptics",
+"unspsc",51102701,"Clofoctol",
+"unspsc",51102702,"Sterile water for irrigation",
+"unspsc",51102705,"Cetrimide",
+"unspsc",51102706,"Acetic acid antiseptics",
+"unspsc",51102707,"Chlorhexidine gluconate",
+"unspsc",51102708,"Formaldehyde antiseptics",
+"unspsc",51102709,"Hydrogen peroxide antiseptics",
+"unspsc",51102710,"Alcohol or acetone based antiseptics",
+"unspsc",51102711,"Oxyquinoline",
+"unspsc",51102712,"Phenol antiseptics",
+"unspsc",51102713,"Povidone iodine",
+"unspsc",51102714,"Sodium chloride solution for irrigation",
+"unspsc",51102715,"Clioquinol",
+"unspsc",51102717,"Nitrofurazone",
+"unspsc",51102718,"Silver nitrate",
+"unspsc",51102719,"Iodoform",
+"unspsc",51102720,"Chloroxylenol",
+"unspsc",51102721,"Ichthammol",
+"unspsc",51102722,"Topical iodine solutions or gels",
+"unspsc",51102723,"Merbromin",
+"unspsc",51102724,"Benzalkonium Chloride",
+"unspsc",51102725,"Hexylresorcinol",
+"unspsc",51102726,"Carbamide peroxide",
+"unspsc",51102727,"Thymol iodide",
+"unspsc",51102728,"Sodium perborate",
+"unspsc",51102729,"Cetylpyridinium chloride",
+"unspsc",51102730,"Hexamidine isetionate",
+"unspsc",51110000,"Antineoplastic agents",
+"unspsc",51111500,"Alkylating agents",
+"unspsc",51111501,"Amifostine",
+"unspsc",51111502,"Busulfan",
+"unspsc",51111503,"Carboplatin",
+"unspsc",51111504,"Carmustine",
+"unspsc",51111505,"Chlorambucil",
+"unspsc",51111506,"Cisplatin",
+"unspsc",51111507,"Cyclophosphamide",
+"unspsc",51111508,"Dacarbazine",
+"unspsc",51111509,"Ifosfamide",
+"unspsc",51111510,"Lomustine",
+"unspsc",51111511,"Mechlorethamine hydrochloride",
+"unspsc",51111512,"Melphalan",
+"unspsc",51111513,"Mesna",
+"unspsc",51111514,"Pipobroman",
+"unspsc",51111515,"Streptozocin",
+"unspsc",51111516,"Thiotepa",
+"unspsc",51111517,"Uracil mustard",
+"unspsc",51111518,"Melphalan hydrochloride",
+"unspsc",51111519,"Temozolomide",
+"unspsc",51111520,"Procarbazine hydrochloride",
+"unspsc",51111521,"Altretamine",
+"unspsc",51111600,"Antimetabolites",
+"unspsc",51111601,"Cladribine",
+"unspsc",51111602,"Cytarabine",
+"unspsc",51111603,"Floxuridine",
+"unspsc",51111604,"Fludarabine phosphate",
+"unspsc",51111605,"Fluorouracil",
+"unspsc",51111606,"Hydroxyurea",
+"unspsc",51111609,"Mercaptopurine",
+"unspsc",51111610,"Methotrexate",
+"unspsc",51111611,"Teniposide",
+"unspsc",51111612,"Thioguanine",
+"unspsc",51111613,"Lenograstim",
+"unspsc",51111614,"Etoposide",
+"unspsc",51111615,"Glutathione",
+"unspsc",51111616,"Capecitabine",
+"unspsc",51111617,"Gemcitabine hydrochloride",
+"unspsc",51111618,"Methotrexate sodium",
+"unspsc",51111700,"Antineoplastic antibiotics",
+"unspsc",51111701,"Bleomycin sulfate",
+"unspsc",51111702,"Dactinomycin",
+"unspsc",51111703,"Daunorubicins",
+"unspsc",51111704,"Mitomycin",
+"unspsc",51111705,"Mitotane",
+"unspsc",51111706,"Mitoxantrone hydrochloride",
+"unspsc",51111707,"Pentostatin",
+"unspsc",51111708,"Plicamycin",
+"unspsc",51111709,"Vincristine sulphate",
+"unspsc",51111710,"Epirubicin",
+"unspsc",51111711,"Doxorubicin hydrochloride",
+"unspsc",51111712,"Pirarubicin",
+"unspsc",51111713,"Alemtuzumab",
+"unspsc",51111714,"Doxorubicin hydrochloride liposomal",
+"unspsc",51111715,"Epirubicin hydrochloride",
+"unspsc",51111716,"Rituximab",
+"unspsc",51111717,"Trastuzumab",
+"unspsc",51111718,"Valrubicin",
+"unspsc",51111719,"Idarubicin hydrochloride",
+"unspsc",51111800,"Hormones and antihormones",
+"unspsc",51111801,"Anastrozole",
+"unspsc",51111802,"Bicalutamide",
+"unspsc",51111803,"Estramustine phosphate sodium",
+"unspsc",51111804,"Flutamide",
+"unspsc",51111805,"Goserelin acetate",
+"unspsc",51111806,"Irinotecan hydrochloride",
+"unspsc",51111807,"Leuprolide acetate",
+"unspsc",51111808,"Nilutamide",
+"unspsc",51111809,"Tamoxifen",
+"unspsc",51111810,"Testolactone",
+"unspsc",51111811,"Topotecan hydrochloride",
+"unspsc",51111812,"Vinblastine sulfate",
+"unspsc",51111813,"Vincristine sulfate",
+"unspsc",51111814,"Vinorelbine tartrate",
+"unspsc",51111815,"Triptorelin",
+"unspsc",51111816,"Buserelin",
+"unspsc",51111817,"Toremifene citrate",
+"unspsc",51111818,"Triptorelin pamoate",
+"unspsc",51111819,"Fulvestrant",
+"unspsc",51111820,"Letrozole",
+"unspsc",51111821,"Tamoxifen citrate",
+"unspsc",51111900,"Natural antineoplastic products",
+"unspsc",51111901,"Asparaginase",
+"unspsc",51111902,"Docetaxel",
+"unspsc",51111904,"Paclitaxel",
+"unspsc",51111905,"Porfimer sodium",
+"unspsc",51111906,"Pegaspargase",
+"unspsc",51111907,"Sodium phenylbutyrate",
+"unspsc",51120000,"Cardiovascular drugs",
+"unspsc",51121500,"Antiarrythmic agents",
+"unspsc",51121501,"Adenosine",
+"unspsc",51121502,"Digoxin",
+"unspsc",51121503,"Quinidine gluconate",
+"unspsc",51121504,"Flecainide",
+"unspsc",51121506,"Sotalol hydrochloride",
+"unspsc",51121507,"Hydroquinidine hydrochloride",
+"unspsc",51121509,"Propafenone",
+"unspsc",51121510,"Disopyramide",
+"unspsc",51121511,"Amiodarone hydrochloride",
+"unspsc",51121512,"Bretylium tosylate",
+"unspsc",51121513,"Disopyramide phosphate",
+"unspsc",51121514,"Dofetilide",
+"unspsc",51121515,"Flecainide acetate",
+"unspsc",51121516,"Ibutilide fumarate",
+"unspsc",51121517,"Mexiletine hydrochloride",
+"unspsc",51121518,"Moricizine hydrochloride",
+"unspsc",51121519,"Procainamide hydrochloride",
+"unspsc",51121520,"Propafenone hydrochloride",
+"unspsc",51121521,"Quinidine polygalacturonate",
+"unspsc",51121522,"Tocainide hydrochloride",
+"unspsc",51121523,"Quinidine sulfate",
+"unspsc",51121600,"Antianginal drugs",
+"unspsc",51121601,"Amyl nitrate",
+"unspsc",51121602,"Isosorbide dinitrate",
+"unspsc",51121603,"Nitroglycerin",
+"unspsc",51121604,"Pentaerythritol tetranitrate",
+"unspsc",51121607,"Nicorandil",
+"unspsc",51121608,"Nicardipine Hydrochloride",
+"unspsc",51121609,"Molsidomine",
+"unspsc",51121610,"Pralidoxime",
+"unspsc",51121611,"Trimetazidine",
+"unspsc",51121614,"Isosorbide mononitrate",
+"unspsc",51121615,"Bepridil hydrochloride",
+"unspsc",51121616,"Isoxsuprine hydrochloride",
+"unspsc",51121700,"Antihypertensive drugs",
+"unspsc",51121701,"Diazoxide",
+"unspsc",51121702,"Terazosin",
+"unspsc",51121703,"Captopril",
+"unspsc",51121704,"Lisinopril",
+"unspsc",51121705,"Felodipine",
+"unspsc",51121706,"Isradipine",
+"unspsc",51121707,"Verapamil",
+"unspsc",51121708,"Methyldopa",
+"unspsc",51121709,"Carvedilol",
+"unspsc",51121710,"Losartan potassium",
+"unspsc",51121711,"Minoxidil",
+"unspsc",51121713,"Diltiazem hydrochloride",
+"unspsc",51121714,"Vincamine",
+"unspsc",51121715,"Enalapril",
+"unspsc",51121716,"Piretanide",
+"unspsc",51121717,"Eprosartan mesylate",
+"unspsc",51121718,"Clonidine hydrochloride",
+"unspsc",51121721,"Metoprolol tartrate",
+"unspsc",51121722,"Reserpine",
+"unspsc",51121724,"Naftidrofuryl oxalate",
+"unspsc",51121725,"Bisoprolol fumarate",
+"unspsc",51121726,"Indapamide",
+"unspsc",51121727,"Penbutolol",
+"unspsc",51121728,"Prazosin",
+"unspsc",51121729,"Celiprolol",
+"unspsc",51121730,"Ramipril",
+"unspsc",51121731,"Trandolapril",
+"unspsc",51121732,"Combination trandolapril and verapamil hydrochloride",
+"unspsc",51121733,"Valsartan",
+"unspsc",51121734,"Xantinol nicotinate",
+"unspsc",51121735,"Candesartan cilexetil",
+"unspsc",51121737,"Benazepril hydrochloride",
+"unspsc",51121738,"Deserpidine",
+"unspsc",51121739,"Verapamil hydrochloride",
+"unspsc",51121740,"Nisoldipine",
+"unspsc",51121741,"Mibefradil dihydrochloride",
+"unspsc",51121742,"Diltiazem malate",
+"unspsc",51121743,"Amlodipine besylate",
+"unspsc",51121744,"Enalpril maleate",
+"unspsc",51121745,"Enalaprilat dihydrate",
+"unspsc",51121746,"Fenoldopam mesylate",
+"unspsc",51121747,"Fosinopril sodium",
+"unspsc",51121748,"Guanabenz acetate",
+"unspsc",51121749,"Guanadrel sulfate",
+"unspsc",51121750,"Guanethidine sulfate",
+"unspsc",51121751,"Guanfacine hydrochloride",
+"unspsc",51121752,"Hydralazine hydrochloride",
+"unspsc",51121753,"Irbesartan",
+"unspsc",51121754,"Mecamylamine hydrochloride",
+"unspsc",51121755,"Methyldopate hydrochloride",
+"unspsc",51121756,"Metyrosine",
+"unspsc",51121757,"Moexipril hydrochloride",
+"unspsc",51121758,"Nitroprusside sodium",
+"unspsc",51121759,"Olmesartan medoxomil",
+"unspsc",51121760,"Perindopril erbumine",
+"unspsc",51121761,"Quinapril hydrochloride",
+"unspsc",51121762,"Rauwolfia serpentina",
+"unspsc",51121763,"Telmisartan",
+"unspsc",51121764,"Quinapril",
+"unspsc",51121765,"Metoprolol",
+"unspsc",51121800,"Antihyperlipidemic and hypocholesterolemic agents",
+"unspsc",51121801,"Fluvastatin sodium",
+"unspsc",51121802,"Lovastatin",
+"unspsc",51121803,"Simvastatin",
+"unspsc",51121804,"Clofibrate",
+"unspsc",51121805,"Gemfibrozil",
+"unspsc",51121806,"Pravastatin sodium",
+"unspsc",51121807,"Polidocanol",
+"unspsc",51121808,"Probucol",
+"unspsc",51121809,"Fenofibrate",
+"unspsc",51121810,"Atorvastatin calcium",
+"unspsc",51121811,"Cerivastatin sodium",
+"unspsc",51121812,"Choline",
+"unspsc",51121813,"Choline bitartrate",
+"unspsc",51121814,"Inositol",
+"unspsc",51121815,"Racemethionine",
+"unspsc",51121816,"Phosphatidylcholine",
+"unspsc",51121817,"Cholestyramine",
+"unspsc",51121818,"Atorvastatin",
+"unspsc",51121819,"Ezetimibe",
+"unspsc",51121820,"Chondroitin sulfate A",
+"unspsc",51121900,"Drugs used for congestive heart failure",
+"unspsc",51121901,"Inamrinone lactate",
+"unspsc",51121902,"Milrinone lactate",
+"unspsc",51121903,"Digitoxin",
+"unspsc",51121904,"Nifedipine",
+"unspsc",51121905,"Enoximone",
+"unspsc",51121906,"Betaine",
+"unspsc",51121907,"Nesiritide",
+"unspsc",51121908,"Powdered or prepared digitalis leaf",
+"unspsc",51122100,"Vasodilators",
+"unspsc",51122101,"Dihydroergocristine mesilate",
+"unspsc",51122102,"Buflomedil hydrochloride",
+"unspsc",51122103,"Linsidomine hydrochlorate",
+"unspsc",51122104,"Papaverine",
+"unspsc",51122105,"Pentifylline",
+"unspsc",51122107,"Ifenprodil tartrate",
+"unspsc",51122108,"Ergoloid mesylates",
+"unspsc",51122109,"Papaverine hydrochloride",
+"unspsc",51122110,"Nimodipine",
+"unspsc",51122111,"Amyl nitrite",
+"unspsc",51122112,"Alprostadil",
+"unspsc",51122200,"Antihypotensive drugs",
+"unspsc",51122201,"Ornipressin",
+"unspsc",51122300,"Cardioplegic agents",
+"unspsc",51122301,"Cardioplegic solution",
+"unspsc",51130000,"Hematolic drugs",
+"unspsc",51131500,"Antianemic drugs",
+"unspsc",51131501,"Ferrous fumarate",
+"unspsc",51131502,"Ferrous gluconate",
+"unspsc",51131503,"Ferrous sulfate",
+"unspsc",51131504,"Magnesium pidolate",
+"unspsc",51131505,"Oxymetholone",
+"unspsc",51131506,"Erythropoietin",
+"unspsc",51131507,"Darbepoetin alfa",
+"unspsc",51131508,"Epoetin alfa",
+"unspsc",51131509,"Ferric ammonium citrate",
+"unspsc",51131510,"Heme iron polypeptide",
+"unspsc",51131511,"Iron polysaccharide",
+"unspsc",51131512,"Ferric pyrophosphate",
+"unspsc",51131513,"Ferrous cacodylate",
+"unspsc",51131514,"Carbonyl iron",
+"unspsc",51131515,"Hemin or hematin",
+"unspsc",51131516,"Iron sucrose",
+"unspsc",51131600,"Anticoagulants",
+"unspsc",51131601,"Aprotinin",
+"unspsc",51131602,"Heparin calcium",
+"unspsc",51131603,"Heparin sodium",
+"unspsc",51131604,"Warfarin sodium",
+"unspsc",51131605,"Sodium Citrate",
+"unspsc",51131606,"Sodium apolate",
+"unspsc",51131607,"Enoxaparin sodium",
+"unspsc",51131608,"Lepirudin",
+"unspsc",51131609,"Desirudin",
+"unspsc",51131610,"Ardeparin sodium",
+"unspsc",51131611,"Dalteparin sodium",
+"unspsc",51131612,"Danaparoid sodium",
+"unspsc",51131613,"Dicumarol",
+"unspsc",51131614,"Anisindione",
+"unspsc",51131615,"Fondaparinux sodium",
+"unspsc",51131616,"Tinzaparin sodium",
+"unspsc",51131617,"Anticoagulant citrate phosphate dextrose solution",
+"unspsc",51131700,"Thrombolytic drugs and platelet aggregation inhibitors",
+"unspsc",51131701,"Abciximab",
+"unspsc",51131702,"Alteplase",
+"unspsc",51131703,"Streptokinase",
+"unspsc",51131704,"Urokinase",
+"unspsc",51131705,"Dipyridamole",
+"unspsc",51131706,"Argatroban",
+"unspsc",51131707,"Bivalirudin",
+"unspsc",51131708,"Cilostazol",
+"unspsc",51131709,"Clopidogrel bisulfate",
+"unspsc",51131710,"Eptifibatide",
+"unspsc",51131711,"Tenecteplase",
+"unspsc",51131712,"Ticlopidine hydrochloride",
+"unspsc",51131713,"Tirofiban hydrochloride monohydrate",
+"unspsc",51131714,"Anistreplase",
+"unspsc",51131715,"Anagrelide hydrochloride",
+"unspsc",51131716,"Reteplase",
+"unspsc",51131800,"Coagulants and systemic hemostatic agents",
+"unspsc",51131801,"Fibrinogen",
+"unspsc",51131802,"Antihemophilic factors or globulins",
+"unspsc",51131803,"Thrombin",
+"unspsc",51131804,"Oprelvekin",
+"unspsc",51131805,"Ethamsylate",
+"unspsc",51131806,"Ferric subsulfate",
+"unspsc",51131807,"Morrhuate sodium",
+"unspsc",51131808,"Aminocaproic acid",
+"unspsc",51131809,"Calcium dobesilate",
+"unspsc",51131900,"Blood plasma substitutes and extenders and expanders",
+"unspsc",51131901,"Poligeline",
+"unspsc",51131903,"Gelatin",
+"unspsc",51131904,"Human blood plasma",
+"unspsc",51131905,"Dextran",
+"unspsc",51131906,"Pentastarch",
+"unspsc",51131907,"Human plasma protein fraction",
+"unspsc",51131908,"Hetastarch",
+"unspsc",51131909,"Albumin human",
+"unspsc",51131910,"Polyvidone or Povidone",
+"unspsc",51132000,"Hemorrheologic agents",
+"unspsc",51132001,"Pentoxifylline",
+"unspsc",51140000,"Central nervous system drugs",
+"unspsc",51141500,"Anticonvulsants",
+"unspsc",51141501,"Acetazolamide",
+"unspsc",51141502,"Clonazepam",
+"unspsc",51141503,"Felbamate",
+"unspsc",51141504,"Lamotrigine",
+"unspsc",51141505,"Phenobarbital",
+"unspsc",51141506,"Phenobarbital sodium",
+"unspsc",51141507,"Phenytoin",
+"unspsc",51141508,"Ethosuximide",
+"unspsc",51141509,"Vigabatrin",
+"unspsc",51141510,"Barbexaclon",
+"unspsc",51141511,"Urbanyl",
+"unspsc",51141512,"Clobazam",
+"unspsc",51141513,"Carbamazepine",
+"unspsc",51141514,"Zonisamide",
+"unspsc",51141515,"Ethotoin",
+"unspsc",51141516,"Fosphenytoin sodium",
+"unspsc",51141517,"Gabapentin",
+"unspsc",51141518,"Levetiracetam",
+"unspsc",51141519,"Mephenytoin",
+"unspsc",51141520,"Mephobarbital",
+"unspsc",51141521,"Methsuximide",
+"unspsc",51141522,"Oxcarbazepine",
+"unspsc",51141523,"Paramethadione",
+"unspsc",51141524,"Phenacemide",
+"unspsc",51141525,"Phenytoin sodium",
+"unspsc",51141526,"Primidone",
+"unspsc",51141527,"Tiagabine hydrochloride",
+"unspsc",51141528,"Topiramate",
+"unspsc",51141529,"Trimethadione",
+"unspsc",51141530,"Valproate sodium",
+"unspsc",51141531,"Valproic acid",
+"unspsc",51141532,"Acetazolamide sodium",
+"unspsc",51141533,"Divalproex sodium",
+"unspsc",51141600,"Antidepressants",
+"unspsc",51141601,"Amitriptyline hydrochloride",
+"unspsc",51141602,"Doxepin hydrochloride",
+"unspsc",51141603,"Imipramine pamoate",
+"unspsc",51141604,"Mirtazapine",
+"unspsc",51141605,"Paroxetine hydrochloride",
+"unspsc",51141606,"Trazodone hydrochloride",
+"unspsc",51141607,"Fluvoxamine maleate",
+"unspsc",51141608,"Amitriptylinoxide",
+"unspsc",51141609,"Tranylcypromine sulphate",
+"unspsc",51141610,"Desipramine hydrochloride",
+"unspsc",51141611,"Trimipramine mesilate",
+"unspsc",51141612,"Sibutramine",
+"unspsc",51141613,"Carpipramine hydrochloride",
+"unspsc",51141614,"Clomipramine",
+"unspsc",51141615,"Trimipramine",
+"unspsc",51141616,"Clomipramine hydrochloride",
+"unspsc",51141617,"Citalopram hydrobromide",
+"unspsc",51141618,"Fluoxetine hydrochloride",
+"unspsc",51141619,"Sertraline hydrochloride",
+"unspsc",51141620,"St. John's Wort",
+"unspsc",51141621,"Imipramine hydrochloride",
+"unspsc",51141622,"Isocarboxazid",
+"unspsc",51141623,"Maprotiline hydrochloride",
+"unspsc",51141624,"Nefazodone hydrochloride",
+"unspsc",51141625,"Nortriptyline hydrochloride",
+"unspsc",51141626,"Protriptyline hydrochloride",
+"unspsc",51141627,"Trimipramine maleate",
+"unspsc",51141628,"Nortriptyline",
+"unspsc",51141629,"Amoxapine",
+"unspsc",51141630,"Thyroid",
+"unspsc",51141631,"Bupropion hydrochloride",
+"unspsc",51141632,"Phenelzine sulfate",
+"unspsc",51141633,"Escitalopram oxalate",
+"unspsc",51141700,"Antipsychotic agents",
+"unspsc",51141701,"Phenothiazines",
+"unspsc",51141702,"Haloperidol",
+"unspsc",51141703,"Olanzapine",
+"unspsc",51141704,"Risperidone",
+"unspsc",51141705,"Nicergoline",
+"unspsc",51141706,"Citicoline",
+"unspsc",51141707,"Buspirone hydrochloride",
+"unspsc",51141708,"Chlordiazepoxide",
+"unspsc",51141709,"Fluphenazine",
+"unspsc",51141710,"Periciazine",
+"unspsc",51141711,"Levomepromazine",
+"unspsc",51141712,"Zotepine",
+"unspsc",51141713,"Pipotiazine palmitate",
+"unspsc",51141714,"Piracetam",
+"unspsc",51141715,"Clozapine",
+"unspsc",51141716,"Haloperidol decanoate",
+"unspsc",51141717,"Haloperidol lactate",
+"unspsc",51141718,"Loxapine hydrochloride",
+"unspsc",51141719,"Loxapine succinate",
+"unspsc",51141720,"Molindone hydrochloride",
+"unspsc",51141721,"Pimozide",
+"unspsc",51141722,"Quetiapine fumarate",
+"unspsc",51141723,"Thiothixenes",
+"unspsc",51141724,"Thiothixene hydrochloride",
+"unspsc",51141725,"Ziprasidone hydrochloride",
+"unspsc",51141726,"Triflupromazine hydrochloride",
+"unspsc",51141727,"Ziprasidone mesylate",
+"unspsc",51141728,"Droperidol",
+"unspsc",51141729,"Thioridazine hydrochloride",
+"unspsc",51141800,"Hypnotics",
+"unspsc",51141801,"Pentobarbital",
+"unspsc",51141802,"Secobarbital sodium",
+"unspsc",51141803,"Chloral hydrate",
+"unspsc",51141804,"Estazolam",
+"unspsc",51141805,"Triazolam",
+"unspsc",51141806,"Butobarbitone",
+"unspsc",51141807,"Flunitrazepam",
+"unspsc",51141808,"Zolpidem tartrate",
+"unspsc",51141809,"Loprazolam mesilate",
+"unspsc",51141810,"Zopiclone",
+"unspsc",51141811,"Amobarbital sodium",
+"unspsc",51141812,"Dexmedetomidine hydrochloride",
+"unspsc",51141813,"Ethchlorvynol",
+"unspsc",51141814,"Flurazepam hydrochloride",
+"unspsc",51141815,"Glutethimide",
+"unspsc",51141816,"Paraldehyde",
+"unspsc",51141817,"Quazepam",
+"unspsc",51141818,"Tryptophan",
+"unspsc",51141819,"Zaleplon",
+"unspsc",51141820,"Pentobarbital sodium",
+"unspsc",51141821,"Doxylamine succinate",
+"unspsc",51141822,"Butabarbital",
+"unspsc",51141900,"Tranquilizers and antimanic and antianxiety drugs",
+"unspsc",51141903,"Lithium carbonate",
+"unspsc",51141904,"Lithium citrate",
+"unspsc",51141907,"Sulpiride",
+"unspsc",51141908,"Tiapride",
+"unspsc",51141910,"Bromazepam",
+"unspsc",51141911,"Tofisopam",
+"unspsc",51141912,"Chlordiazepoxide hydrochloride",
+"unspsc",51141913,"Chlormezanone",
+"unspsc",51141914,"Clorazepate dipotassium",
+"unspsc",51141915,"Halazepam",
+"unspsc",51141916,"Lorazepam",
+"unspsc",51141917,"Oxazepam",
+"unspsc",51141918,"Meprobamate",
+"unspsc",51141919,"Alprazolam",
+"unspsc",51141920,"Diazepam",
+"unspsc",51141921,"Midazolam hydrochloride",
+"unspsc",51141922,"Temazepam",
+"unspsc",51142000,"Non narcotic analgesics and antipyretics",
+"unspsc",51142001,"Acetaminophen",
+"unspsc",51142002,"Acetylsalicylic acid",
+"unspsc",51142003,"Mesalamine",
+"unspsc",51142004,"Meprobromate",
+"unspsc",51142005,"Methyl butetisalicylate",
+"unspsc",51142006,"Oxaceprol",
+"unspsc",51142009,"Metamizol sodium",
+"unspsc",51142010,"Acetanilide",
+"unspsc",51142011,"Magnesium salicylate",
+"unspsc",51142012,"Mefenamic acid",
+"unspsc",51142013,"Salicylamide",
+"unspsc",51142014,"Sodium thiosalicylate",
+"unspsc",51142015,"Triethanolamine salicylate",
+"unspsc",51142016,"Antipyrine and benzocaine solution",
+"unspsc",51142017,"Salsalate or salicylsalicylic acid",
+"unspsc",51142018,"Dehydrated alcohol injection",
+"unspsc",51142100,"Nonsteroidal anti inflammatory drugs NSAIDs",
+"unspsc",51142101,"Auranofin",
+"unspsc",51142102,"Carpofen",
+"unspsc",51142103,"Diclofenac potassium",
+"unspsc",51142104,"Diclofenac sodium",
+"unspsc",51142105,"Flurbiprofen",
+"unspsc",51142106,"Ibuprofen",
+"unspsc",51142107,"Indomethacin",
+"unspsc",51142108,"Ketoprofen",
+"unspsc",51142109,"Naproxen",
+"unspsc",51142110,"Naproxen sodium",
+"unspsc",51142111,"Oxaprozin",
+"unspsc",51142112,"Sulindac",
+"unspsc",51142113,"Suprofen",
+"unspsc",51142114,"Benzydamine hydrochloride",
+"unspsc",51142116,"Diethylamine salicylate",
+"unspsc",51142117,"Diclofenac diethylamine",
+"unspsc",51142118,"Nimesulide",
+"unspsc",51142119,"Benorilate",
+"unspsc",51142120,"Serrapeptase",
+"unspsc",51142121,"Diclofenac",
+"unspsc",51142122,"Sodium aurothiomalate",
+"unspsc",51142123,"Ketorolac trometamol",
+"unspsc",51142124,"Etodolac",
+"unspsc",51142125,"Etofenamate",
+"unspsc",51142126,"Floctafenine",
+"unspsc",51142127,"Emorfazone",
+"unspsc",51142128,"Piroxicam",
+"unspsc",51142129,"Tiaprofenic acid",
+"unspsc",51142130,"Leflunomide",
+"unspsc",51142131,"Celecoxib",
+"unspsc",51142132,"Aurothioglucose",
+"unspsc",51142133,"Bromfenac sodium",
+"unspsc",51142134,"Choline salicylate",
+"unspsc",51142135,"Fenoprofen calcium",
+"unspsc",51142136,"Flurbiprofen sodium",
+"unspsc",51142137,"Indomethacin sodium trihydrate",
+"unspsc",51142138,"Ketorolac tromethamine",
+"unspsc",51142139,"Meclofenamate sodium",
+"unspsc",51142140,"Meloxicam",
+"unspsc",51142141,"Nabumetone",
+"unspsc",51142142,"Rofecoxib",
+"unspsc",51142143,"Tolmetin sodium",
+"unspsc",51142144,"Valdecoxib",
+"unspsc",51142145,"Adalimumab",
+"unspsc",51142146,"Diflunisal",
+"unspsc",51142147,"Anakinra",
+"unspsc",51142148,"Sodium hyaluronate",
+"unspsc",51142149,"Glucosamine",
+"unspsc",51142200,"Narcotic analgesics",
+"unspsc",51142201,"Butorphanol tartrate",
+"unspsc",51142202,"Codeine phosphate",
+"unspsc",51142203,"Codeine sulfate",
+"unspsc",51142205,"Meperidine hydrochloride",
+"unspsc",51142206,"Morphine sulfate",
+"unspsc",51142207,"Oxycodone",
+"unspsc",51142208,"Sufentanil citrate",
+"unspsc",51142209,"Nefopam hydrochloride",
+"unspsc",51142210,"Ethylmorphine hydrochloride",
+"unspsc",51142211,"Hydrocodone",
+"unspsc",51142212,"Dihydrocodeine resinate",
+"unspsc",51142213,"Propoxyphene napsylate",
+"unspsc",51142214,"Alfentanil hydrochloride",
+"unspsc",51142215,"Buprenorphine hydrochloride",
+"unspsc",51142216,"Dezocine",
+"unspsc",51142217,"Dihydrocodeine tartrate",
+"unspsc",51142218,"Dihydrocodeine",
+"unspsc",51142219,"Fentanyl",
+"unspsc",51142220,"Fentanyl citrate",
+"unspsc",51142221,"Hydrocodone bitartrate",
+"unspsc",51142222,"Hydromorphone hydrochloride",
+"unspsc",51142223,"Hydrocodone polistirex",
+"unspsc",51142224,"Levomethadyl acetate hydrochloride",
+"unspsc",51142225,"Levorphanol tartrate",
+"unspsc",51142226,"Methadone hydrochloride",
+"unspsc",51142227,"Oxycodone hydrochloride",
+"unspsc",51142228,"Oxymorphone hydrochloride",
+"unspsc",51142229,"Pentazocine hydrochloride",
+"unspsc",51142230,"Pentazocine lactate",
+"unspsc",51142231,"Propoxyphene hydrochloride",
+"unspsc",51142232,"Remifentanil hydrochloride",
+"unspsc",51142233,"Codeine",
+"unspsc",51142234,"Dihydrocodeine bitartrate",
+"unspsc",51142235,"Tramadol hydrochloride",
+"unspsc",51142236,"Opium",
+"unspsc",51142237,"Dextropropoxyphene",
+"unspsc",51142300,"Narcotic antagonists",
+"unspsc",51142301,"Nalmefene hydrochloride",
+"unspsc",51142302,"Naloxone hydrochloride",
+"unspsc",51142303,"Naltrexone",
+"unspsc",51142304,"Nalbuphine hydrochloride",
+"unspsc",51142305,"Roxatidine",
+"unspsc",51142400,"Drugs used for vascular and migraine headaches",
+"unspsc",51142401,"Methysergide maleate",
+"unspsc",51142402,"Sumatriptan succinate",
+"unspsc",51142403,"Ergotamine tartrate",
+"unspsc",51142404,"Dihydroergotamine",
+"unspsc",51142405,"Combination acetaminophen acetylsalicylic acid",
+"unspsc",51142406,"Almotriptan malate",
+"unspsc",51142407,"Dihydroergotamine mesylate",
+"unspsc",51142408,"Frovatriptan succinate",
+"unspsc",51142409,"Isometheptene",
+"unspsc",51142410,"Naratriptan hydrochloride",
+"unspsc",51142411,"Rizatriptan benzoate",
+"unspsc",51142412,"Eletriptan hydrobromide",
+"unspsc",51142413,"Zolmitriptan",
+"unspsc",51142414,"Sumatriptan",
+"unspsc",51142500,"Antiparkinson drugs",
+"unspsc",51142501,"Bromocriptine mesylate",
+"unspsc",51142502,"Carbidopa",
+"unspsc",51142503,"Levodopa",
+"unspsc",51142504,"Selegiline hydrochloride",
+"unspsc",51142505,"Biperiden",
+"unspsc",51142506,"Biperiden hydrochloride",
+"unspsc",51142507,"Pergolide mesylate",
+"unspsc",51142508,"Pramipexole dihydrochloride",
+"unspsc",51142509,"Ropinirole hydrochloride",
+"unspsc",51142510,"Tolcapone",
+"unspsc",51142600,"Stimulants and anorexiants",
+"unspsc",51142601,"Amphetamine sulfate",
+"unspsc",51142602,"Fenfluramine",
+"unspsc",51142603,"Mazindol",
+"unspsc",51142604,"Pemoline",
+"unspsc",51142605,"Phendimetrazine tartrate",
+"unspsc",51142606,"Pipradrol hydrochloride",
+"unspsc",51142607,"Fenproporex",
+"unspsc",51142608,"Trimethylxanthine",
+"unspsc",51142609,"Amfepramone hydrochloride",
+"unspsc",51142610,"Caffeine",
+"unspsc",51142611,"Dexfenfluramine hydrochloride",
+"unspsc",51142612,"Diethylpropion hydrochloride",
+"unspsc",51142613,"Fenfluramine hydrochloride",
+"unspsc",51142614,"Benzphetamine hydrochloride",
+"unspsc",51142615,"Phentermine hydrochloride",
+"unspsc",51142616,"Phentermine resin",
+"unspsc",51142617,"Sibutramine hydrochloride monohydrate",
+"unspsc",51142618,"Methylphenidate hydrochloride",
+"unspsc",51142619,"Ammonia aromatic spirit",
+"unspsc",51142700,"Veterinary nonsteroidal anti inflammatory drugs VNSAIDs",
+"unspsc",51142701,"Phenylbutazone",
+"unspsc",51142702,"Meclofenamic acid",
+"unspsc",51142800,"Anti amyotrophic lateral sclerosis ALS drugs",
+"unspsc",51142801,"Riluzole",
+"unspsc",51142900,"Anaesthetic drugs and related adjuncts and analeptics",
+"unspsc",51142901,"Chloroform",
+"unspsc",51142902,"Eutectic mixture of local anesthetics EMLA",
+"unspsc",51142903,"Ropivacaine",
+"unspsc",51142904,"Lidocaine",
+"unspsc",51142905,"Bupivacaine",
+"unspsc",51142906,"Amethocaine hydrochloride",
+"unspsc",51142907,"Oxybuprocaine",
+"unspsc",51142908,"Lignocaine",
+"unspsc",51142909,"Benzocaine",
+"unspsc",51142910,"Prilocaine",
+"unspsc",51142911,"Quinisocaine hydrochloride",
+"unspsc",51142912,"Dibucaine",
+"unspsc",51142913,"Halothane",
+"unspsc",51142914,"Amylocaine hydrochloride",
+"unspsc",51142915,"Septocaine",
+"unspsc",51142916,"Hyaluronidase",
+"unspsc",51142917,"Mepivacaine",
+"unspsc",51142918,"Articaine",
+"unspsc",51142919,"Isoflurane",
+"unspsc",51142920,"Procaine",
+"unspsc",51142921,"Thiopental sodium",
+"unspsc",51142922,"Benoxinate hydrochloride",
+"unspsc",51142923,"Butamben",
+"unspsc",51142924,"Chlorobutanol",
+"unspsc",51142925,"Chloroprocaine hydrochloride",
+"unspsc",51142926,"Cocaine hydrochloride",
+"unspsc",51142927,"Desflurane",
+"unspsc",51142928,"Dyclonine hydrochloride",
+"unspsc",51142929,"Enflurane",
+"unspsc",51142930,"Ether",
+"unspsc",51142931,"Ethyl chloride",
+"unspsc",51142932,"Etidocaine hydrochloride",
+"unspsc",51142933,"Etomidate",
+"unspsc",51142934,"Ketamine hydrochloride",
+"unspsc",51142935,"Levobupivacaine hydrochloride",
+"unspsc",51142936,"Levonordefrin",
+"unspsc",51142937,"Lidocaine hydrochloride",
+"unspsc",51142938,"Methohexital sodium",
+"unspsc",51142939,"Pramoxine hydrochloride",
+"unspsc",51142940,"Proparacaine hydrochloride",
+"unspsc",51142941,"Propofol",
+"unspsc",51142942,"Sevoflurane",
+"unspsc",51142943,"Tetracaine",
+"unspsc",51142944,"Tetracaine hydrochloride",
+"unspsc",51142945,"Doxapram hydrochloride",
+"unspsc",51142946,"Methoxyflurane",
+"unspsc",51142947,"Cinchocaine hydrochloride",
+"unspsc",51150000,"Autonomic nervous system drugs",
+"unspsc",51151500,"Cholinergic drugs and cholinesterase inhibitors",
+"unspsc",51151501,"Bethanechol chloride",
+"unspsc",51151502,"Edrophonium chloride",
+"unspsc",51151503,"Physostigmine salicylate",
+"unspsc",51151504,"Pilocarpine nitrate",
+"unspsc",51151505,"Tropatepine hydrochlorate",
+"unspsc",51151506,"Esterase inhibitor",
+"unspsc",51151507,"Ambenonium chloride",
+"unspsc",51151508,"Dexpanthenol",
+"unspsc",51151509,"Donepezil hydrochloride",
+"unspsc",51151510,"Galantamine hydrobromide",
+"unspsc",51151511,"Mepenzolate bromide",
+"unspsc",51151512,"Neostigmine methylsulfate",
+"unspsc",51151513,"Neostigmine bromide",
+"unspsc",51151514,"Pyridostigmine bromide",
+"unspsc",51151515,"Rivastigmine tartrate",
+"unspsc",51151516,"Tacrine hydrlochloride",
+"unspsc",51151517,"Cevimeline hydrchloride",
+"unspsc",51151518,"Lecithin or phosphatidylcholine",
+"unspsc",51151600,"Cholinergic blocking agents",
+"unspsc",51151601,"Atropine sulfate",
+"unspsc",51151602,"Benztropine mesylate",
+"unspsc",51151603,"Procyclidine hydrochloride",
+"unspsc",51151604,"Trihexyphenidyl hydrochloride",
+"unspsc",51151605,"Cyclopentolate hydrochloride",
+"unspsc",51151606,"Tropicamide",
+"unspsc",51151607,"Clidinium bromide",
+"unspsc",51151608,"Dicyclomine hydrochloride",
+"unspsc",51151609,"Propantheline bromide",
+"unspsc",51151610,"Belladonna alkaloids",
+"unspsc",51151611,"Glycopyrrolate",
+"unspsc",51151612,"Hyoscyamine sulfate",
+"unspsc",51151613,"Scopolamine hydrobromide",
+"unspsc",51151614,"Homatropine hydrobromide",
+"unspsc",51151615,"Caramiphen",
+"unspsc",51151616,"Atropine ",
+"unspsc",51151700,"Sympathomimetic or adrenergic drugs",
+"unspsc",51151701,"Albuterol",
+"unspsc",51151702,"Brimonidine tartrate",
+"unspsc",51151703,"Epinephrine",
+"unspsc",51151704,"Epinephrine borate",
+"unspsc",51151705,"Epinephrine hydrochloride",
+"unspsc",51151706,"Isoproterenol",
+"unspsc",51151707,"Isoproterenol sulfate",
+"unspsc",51151708,"Levarterenol bitartrate",
+"unspsc",51151709,"Phenylpropanolamine hydrochloride",
+"unspsc",51151710,"Phenylephrine hydrochloride",
+"unspsc",51151711,"Terbutaline sulfate",
+"unspsc",51151712,"Arbutamine hydrochloride",
+"unspsc",51151713,"Cinnamedrine hydrochloride",
+"unspsc",51151714,"D amphetamine sulfate",
+"unspsc",51151715,"Ephedrine sulfate",
+"unspsc",51151716,"Isoproterenol hydrochloride",
+"unspsc",51151717,"Mephentermine sulfate",
+"unspsc",51151718,"Metaraminol bitartrate",
+"unspsc",51151719,"Pseudoephedrine",
+"unspsc",51151720,"Salmeterol xinafoate",
+"unspsc",51151721,"Midodrine hydrochloride",
+"unspsc",51151722,"Levalbuterol hydrochloride",
+"unspsc",51151723,"Tetrahydrozoline hydrochloride",
+"unspsc",51151724,"Naphazoline hydrochloride",
+"unspsc",51151725,"Dipivefrin",
+"unspsc",51151726,"Phenylpropanolamine",
+"unspsc",51151727,"Norepinephrine bitartrate",
+"unspsc",51151728,"Hydroxyamphetamine hydrobromide",
+"unspsc",51151729,"Methamphetamine hydrochloride",
+"unspsc",51151730,"Epinephrine bitartrate",
+"unspsc",51151731,"Metaproterenol sulfate",
+"unspsc",51151732,"Dobutamine hydrochloride",
+"unspsc",51151733,"Dipivefrin hydrochloride",
+"unspsc",51151734,"Albuterol sulfate",
+"unspsc",51151735,"Amphetamine aspartate",
+"unspsc",51151736,"Isoetharine mesylate",
+"unspsc",51151737,"Dopamine hydrochloride",
+"unspsc",51151738,"Formoterol fumarate",
+"unspsc",51151739,"Methoxamine hydrochloride",
+"unspsc",51151740,"Isoetharine hydrochloride",
+"unspsc",51151741,"Ephedrine",
+"unspsc",51151742,"Phenylephrine",
+"unspsc",51151743,"Pseudoephedrine hydrochloride",
+"unspsc",51151744,"Ephedrine hydrochloride",
+"unspsc",51151745,"Pseudoephedrine tannate",
+"unspsc",51151746,"Pseudoephedrine sulfate",
+"unspsc",51151747,"Racepinephrine hydrochloride",
+"unspsc",51151748,"Naphazoline ",
+"unspsc",51151749,"Destroamphetamine",
+"unspsc",51151800,"Adrenergic blocking agents",
+"unspsc",51151801,"Atenolol",
+"unspsc",51151802,"Esmolol hydrochloride",
+"unspsc",51151803,"Nadolol",
+"unspsc",51151804,"Pindolol",
+"unspsc",51151805,"Timolol maleate",
+"unspsc",51151810,"Phentolamine mesylate",
+"unspsc",51151811,"Yohimbine hydrochloride",
+"unspsc",51151812,"Propranolol hydrochloride",
+"unspsc",51151813,"Acebutolol",
+"unspsc",51151814,"Betaxolol hydrochloride",
+"unspsc",51151815,"Tolazoline hydrochloride",
+"unspsc",51151816,"Prazosin hydrochloride",
+"unspsc",51151817,"Tamsulosin hydrochloride",
+"unspsc",51151818,"Carteolol hydrochloride",
+"unspsc",51151819,"Terazosin hydrochloride",
+"unspsc",51151820,"Phenoxybenzamine hydrochloride",
+"unspsc",51151821,"Penbutolol sulfate",
+"unspsc",51151822,"Metoprolol succinate",
+"unspsc",51151823,"Labetalol hydrochloride",
+"unspsc",51151824,"Doxazosin mesylate",
+"unspsc",51151825,"Dapiprazole hydrochloride",
+"unspsc",51151900,"Centrally acting skeletal muscle relaxants",
+"unspsc",51151901,"Baclofen",
+"unspsc",51151902,"Chlorzoxazone",
+"unspsc",51151903,"Dantrolene sodium",
+"unspsc",51151904,"Methocarbamol",
+"unspsc",51151905,"Carisoprodol",
+"unspsc",51151906,"Isoxsuprine",
+"unspsc",51151907,"Ritodrine hydrochloride",
+"unspsc",51151908,"Orphenadrine citrate",
+"unspsc",51151910,"Nonivamide",
+"unspsc",51151911,"Suxamethonium",
+"unspsc",51151912,"Thiocolchicoside",
+"unspsc",51151913,"Chlorphenesin carbamate",
+"unspsc",51151914,"Cyclobenzaprine hydrochloride",
+"unspsc",51151915,"Metaxalone",
+"unspsc",51151916,"Succinylcholine chloride",
+"unspsc",51151917,"Tizanidine hydrochloride",
+"unspsc",51152000,"Neuromuscular blocking agents",
+"unspsc",51152001,"Atracurium besylate",
+"unspsc",51152002,"Mivacurium chyloride",
+"unspsc",51152003,"Rocuronium bromide",
+"unspsc",51152004,"Vecuronium bromide",
+"unspsc",51152005,"Botulinum toxin",
+"unspsc",51152006,"Cisatracurium besylate",
+"unspsc",51152007,"Doxacurium chloride",
+"unspsc",51152008,"Metocurine iodide",
+"unspsc",51152009,"Pancuronium bromide",
+"unspsc",51152010,"Rapacuronium bromide",
+"unspsc",51152011,"Tubocurarine chloride",
+"unspsc",51152012,"Pipecuronium bromide",
+"unspsc",51160000,"Drugs affecting the respiratory tract",
+"unspsc",51161500,"Antiasthmatic drugs",
+"unspsc",51161501,"Bitolterol mesylate",
+"unspsc",51161502,"Nedocromil sodium",
+"unspsc",51161503,"Pirbuterol acetate",
+"unspsc",51161504,"Aminophylline",
+"unspsc",51161505,"Theophylline",
+"unspsc",51161506,"Terbutaline",
+"unspsc",51161507,"Formoterol",
+"unspsc",51161508,"Salbutamol sulphate",
+"unspsc",51161510,"Etofylline",
+"unspsc",51161511,"Sodium cromoglicate",
+"unspsc",51161513,"Dyphylline",
+"unspsc",51161514,"Oxtriphylline",
+"unspsc",51161515,"Montelukast sodium",
+"unspsc",51161516,"Zafirlukast",
+"unspsc",51161517,"Zileuton",
+"unspsc",51161600,"Antihistamines or H1 blockers",
+"unspsc",51161601,"Astemizole",
+"unspsc",51161602,"Clemastine fumarate",
+"unspsc",51161603,"Dexchlorpheniramine maleate",
+"unspsc",51161605,"Levocabastine hydrochloride",
+"unspsc",51161606,"Loratadine",
+"unspsc",51161607,"Terfenadine",
+"unspsc",51161608,"Betahistine hydrochloride",
+"unspsc",51161609,"Triprolidine hydrochloride",
+"unspsc",51161610,"Promethazine",
+"unspsc",51161611,"Oxomemazine",
+"unspsc",51161612,"Ebastine",
+"unspsc",51161613,"Dihydroergotoxine mesilate",
+"unspsc",51161614,"Meclozine hydrochloride",
+"unspsc",51161615,"Cetirizine",
+"unspsc",51161616,"Betahistine",
+"unspsc",51161617,"Buclizine hydrochloride",
+"unspsc",51161618,"Alimemazine",
+"unspsc",51161619,"Mepyramine maleate",
+"unspsc",51161620,"Diphenhydramine",
+"unspsc",51161621,"Fexofenadine hydrochloride",
+"unspsc",51161622,"Cromolyn sodium",
+"unspsc",51161623,"Hydroxyzine pamoate",
+"unspsc",51161624,"Azatadine maleate",
+"unspsc",51161625,"Azelastine hydrochloride",
+"unspsc",51161626,"Bosentan",
+"unspsc",51161627,"Brompheniramine maleate",
+"unspsc",51161628,"Carbinoxamine maleate",
+"unspsc",51161629,"Cetirizine hydrochloride",
+"unspsc",51161630,"Chlorpheniramine maleate",
+"unspsc",51161631,"Chlorpheniramine tannate",
+"unspsc",51161632,"Cyproheptadine hydrochloride",
+"unspsc",51161633,"Desloratadine",
+"unspsc",51161634,"Dexbrompheniramime maleate",
+"unspsc",51161635,"Diphenhydramine hydrochloride",
+"unspsc",51161636,"Diphenhydramine tannate",
+"unspsc",51161637,"Hydroxyzine hydrochloride",
+"unspsc",51161638,"Ketotifen fumarate",
+"unspsc",51161639,"Olopatadine hydrochloride",
+"unspsc",51161640,"Phenindamine tartrate",
+"unspsc",51161646,"Acrivastine",
+"unspsc",51161647,"Brompheniramine",
+"unspsc",51161648,"Emedastine difumarate",
+"unspsc",51161649,"Lodoxamide tromethamine",
+"unspsc",51161650,"Promethazine hydrochloride",
+"unspsc",51161651,"Pemirolast potassium",
+"unspsc",51161700,"Drugs used for respiratory tract disorders",
+"unspsc",51161701,"Acetylcysteine",
+"unspsc",51161702,"Beractant",
+"unspsc",51161703,"Budesonide",
+"unspsc",51161704,"Colfosceril palmitate",
+"unspsc",51161705,"Ipratropium bromide",
+"unspsc",51161706,"Sobrerol",
+"unspsc",51161707,"Bamifylline hydrochloride",
+"unspsc",51161708,"Dornase alfa",
+"unspsc",51161709,"Poractant alfa",
+"unspsc",51161710,"Calfactant",
+"unspsc",51161800,"Cough and cold and antiallergy products",
+"unspsc",51161801,"Benzonatate",
+"unspsc",51161802,"Guaifenesin",
+"unspsc",51161803,"Menthol",
+"unspsc",51161805,"Carbocisteine",
+"unspsc",51161806,"Ammonia chloride",
+"unspsc",51161808,"Dextromethorphan",
+"unspsc",51161809,"Oxolamine citrate",
+"unspsc",51161810,"Pholcodine",
+"unspsc",51161811,"Bromhexine",
+"unspsc",51161812,"Combination chlorpheniramine acetaminophen",
+"unspsc",51161813,"Potassium guaiacolsulfonate",
+"unspsc",51161814,"Phenylpropanolamine bitartrate",
+"unspsc",51161815,"Carbetapentane tannate",
+"unspsc",51161817,"Dextromethorphan hydrobromide",
+"unspsc",51161818,"Dextromethorphan polistirex",
+"unspsc",51161819,"Dextromethorphan tannate",
+"unspsc",51161820,"Eucalyptol or eucalyptus oil",
+"unspsc",51161900,"Nasal decongestants",
+"unspsc",51161901,"Oxymetazoline hydrochloride",
+"unspsc",51161903,"Xylometazoline hydrochloride",
+"unspsc",51170000,"Drugs affecting the gastrointestinal system",
+"unspsc",51171500,"Antacids and antiflatulents",
+"unspsc",51171501,"Calcium carbonate",
+"unspsc",51171502,"Magaldrate",
+"unspsc",51171503,"Magnesium hydroxide",
+"unspsc",51171504,"Sodium bicarbonate antacids",
+"unspsc",51171505,"Simethicone",
+"unspsc",51171507,"Hydrotalcite",
+"unspsc",51171508,"Magnesium carbonate",
+"unspsc",51171509,"Betaine hydrochloride",
+"unspsc",51171510,"Magnesium trisilicate",
+"unspsc",51171511,"Aluminium hydroxide",
+"unspsc",51171513,"Dihydroxyaluminum sodium carbonate",
+"unspsc",51171600,"Laxatives",
+"unspsc",51171601,"Cascara sagrada",
+"unspsc",51171602,"Docusate calcium",
+"unspsc",51171603,"Docusate potassium",
+"unspsc",51171604,"Docusate sodium",
+"unspsc",51171605,"Lactulose",
+"unspsc",51171606,"Magnesium sulfate",
+"unspsc",51171607,"Psyllium hydrophilic muciloid",
+"unspsc",51171608,"Glycerine",
+"unspsc",51171609,"Dehydrocholic acid",
+"unspsc",51171610,"Senna or sennosides",
+"unspsc",51171611,"Bisacodyl stimulant",
+"unspsc",51171612,"Methylcellulose",
+"unspsc",51171613,"Aloin",
+"unspsc",51171614,"Bisacodyl",
+"unspsc",51171615,"Calcium polycarbophil",
+"unspsc",51171616,"Casanthranol",
+"unspsc",51171617,"Castor oil",
+"unspsc",51171618,"Cisapride monohydrate",
+"unspsc",51171619,"Glycerin suppositories",
+"unspsc",51171620,"Magnesium citrate",
+"unspsc",51171621,"Metoclopramide hydrochloride",
+"unspsc",51171622,"Sodium phosphate",
+"unspsc",51171623,"Phenolphthalein",
+"unspsc",51171624,"Psyllium seed",
+"unspsc",51171626,"Potassium bitartrate",
+"unspsc",51171627,"Potassium sodium tartrate",
+"unspsc",51171628,"Potassium phosphate",
+"unspsc",51171629,"Sodium sulfate",
+"unspsc",51171630,"Mineral oil",
+"unspsc",51171631,"Polyethylene glycol laxative preparation",
+"unspsc",51171632,"Magnesium chloride",
+"unspsc",51171700,"Antidiarrheals",
+"unspsc",51171701,"Difenoxin hydrochloride",
+"unspsc",51171702,"Loperamide hydrochloride",
+"unspsc",51171703,"Paregoric",
+"unspsc",51171704,"Nifuroxazide",
+"unspsc",51171706,"Attapulgite",
+"unspsc",51171707,"Bismuth subsalicylate",
+"unspsc",51171708,"Diphenoxylate hydrochloride",
+"unspsc",51171709,"Saccharomyces boulardii",
+"unspsc",51171710,"Alosetron hydrochloride",
+"unspsc",51171711,"Kaolin mixture with pectin",
+"unspsc",51171712,"Purified pectin with acidophilus",
+"unspsc",51171800,"Antiemetics and antinauseants and antivertigo agents",
+"unspsc",51171801,"Dronabinol",
+"unspsc",51171802,"Granisetron hydrochloride",
+"unspsc",51171803,"Meclizine hydrochloride",
+"unspsc",51171804,"Ondansetron hydrochloride",
+"unspsc",51171805,"Trimethobenzamide hydrochloride",
+"unspsc",51171806,"Metoclopramide",
+"unspsc",51171807,"Cinnarizine",
+"unspsc",51171808,"Difenidol hydrochloride",
+"unspsc",51171809,"Cyclizine",
+"unspsc",51171811,"Combinational fructose Dextrose and phosphoric acid",
+"unspsc",51171812,"Prochlorperazine",
+"unspsc",51171813,"Metopimazine",
+"unspsc",51171814,"Dolasetron mesylate",
+"unspsc",51171815,"Cyclizine hydrochloride",
+"unspsc",51171816,"Ondansetron",
+"unspsc",51171817,"Prochlorperazine edisylate",
+"unspsc",51171818,"Prochlorperazine maleate",
+"unspsc",51171819,"Thiethylperazine maleate",
+"unspsc",51171820,"Dimenhydrinate",
+"unspsc",51171821,"Aprepitant",
+"unspsc",51171822,"Palonosetron hydrochloride",
+"unspsc",51171900,"Antiulcer and related gastrointestinal GI drugs",
+"unspsc",51171901,"Cimetidine",
+"unspsc",51171902,"Famotidine",
+"unspsc",51171903,"Nizatidine",
+"unspsc",51171904,"Ranitidine hydrochloride",
+"unspsc",51171905,"Cisapride",
+"unspsc",51171906,"Lansoprazole",
+"unspsc",51171907,"Chlordiazepoxide hydrochloride or clidinium bromide combination",
+"unspsc",51171908,"Misoprostol",
+"unspsc",51171909,"Omeprazole",
+"unspsc",51171910,"Pancreatin",
+"unspsc",51171911,"Sucralfate",
+"unspsc",51171912,"Cimetidine hydrochloride",
+"unspsc",51171913,"Esomeprazole magnesium trihydrate",
+"unspsc",51171914,"Pantoprazole sodium sesquihydrate",
+"unspsc",51171915,"Pantoprazole sodium",
+"unspsc",51171916,"Rabeprazole sodium",
+"unspsc",51171917,"Ranitidine bismuth citrate",
+"unspsc",51171918,"Aluminum carbonate",
+"unspsc",51172000,"Drugs used for gallbladder disease",
+"unspsc",51172001,"Chenodiol",
+"unspsc",51172002,"Monoctanoin",
+"unspsc",51172003,"Ursodiol",
+"unspsc",51172004,"Dimethyl sulfoxide",
+"unspsc",51172100,"Antispasmodics",
+"unspsc",51172101,"Mebeverine hydrochloride",
+"unspsc",51172102,"Dicycloverine hydrochloride",
+"unspsc",51172103,"Pitofenone hydrochloride",
+"unspsc",51172105,"Phloroglucinol",
+"unspsc",51172106,"Oxybutynin hydrochloride",
+"unspsc",51172107,"Hyoscine butylbromide",
+"unspsc",51172108,"Viquidil hydrochloride",
+"unspsc",51172109,"Trimebutine",
+"unspsc",51172110,"Prozapine hydrochloride",
+"unspsc",51172111,"Alverine",
+"unspsc",51180000,"Hormones and hormone antagonists",
+"unspsc",51181500,"Antidiabetic agents and hyperglycemic agents",
+"unspsc",51181501,"Acarbose",
+"unspsc",51181502,"Acetohexamide",
+"unspsc",51181503,"Chlorpropamide",
+"unspsc",51181504,"Glimepiride",
+"unspsc",51181505,"Glipizide",
+"unspsc",51181506,"Insulin",
+"unspsc",51181508,"Glucagon",
+"unspsc",51181509,"Gliclazide",
+"unspsc",51181510,"Phenformin hydrochloride",
+"unspsc",51181511,"Buformin",
+"unspsc",51181513,"Nateglinide",
+"unspsc",51181514,"Pancreatic extract",
+"unspsc",51181515,"Tolbutamide",
+"unspsc",51181516,"Glibenclamide or glyburide",
+"unspsc",51181517,"Metformin hydrochloride",
+"unspsc",51181519,"Miglitol",
+"unspsc",51181520,"Pioglitazone hydrochloride",
+"unspsc",51181521,"Repaglinide",
+"unspsc",51181522,"Rosiglitazone maleate",
+"unspsc",51181523,"Tolazamide",
+"unspsc",51181524,"Troglitazone",
+"unspsc",51181600,"Thyroid and antithyroid drugs",
+"unspsc",51181601,"Levothyroxine sodium",
+"unspsc",51181602,"Liothyronine sodium",
+"unspsc",51181603,"Liotrix",
+"unspsc",51181604,"Thyrotropin",
+"unspsc",51181605,"Methimazole",
+"unspsc",51181606,"Propylthiouracil",
+"unspsc",51181607,"Potassium iodide",
+"unspsc",51181608,"Levothyroxine",
+"unspsc",51181609,"Sodium iodide",
+"unspsc",51181700,"Corticosteroids",
+"unspsc",51181701,"Betamethasone",
+"unspsc",51181702,"Corticotropin",
+"unspsc",51181703,"Cosyntropin",
+"unspsc",51181704,"Dexamethasone",
+"unspsc",51181705,"Flunisolide",
+"unspsc",51181706,"Hydrocortisone",
+"unspsc",51181707,"Methylprednisolone",
+"unspsc",51181708,"Prednisolone",
+"unspsc",51181709,"Triamcinolone",
+"unspsc",51181710,"Desoximetasone",
+"unspsc",51181711,"Meprednisone",
+"unspsc",51181712,"Risedronic acid",
+"unspsc",51181713,"Prednisone",
+"unspsc",51181714,"Prednicarbate",
+"unspsc",51181715,"Cortisone",
+"unspsc",51181716,"Cortivazol",
+"unspsc",51181717,"Desoxycortone acetate",
+"unspsc",51181718,"Deflazacort",
+"unspsc",51181719,"Fluocinolone acetonide",
+"unspsc",51181720,"Diflorasone diacetate",
+"unspsc",51181721,"Corticorelin ovine triflutate",
+"unspsc",51181722,"Fluticasone",
+"unspsc",51181723,"Hydrocortisone acetate",
+"unspsc",51181724,"Hydrocortisone buteprate",
+"unspsc",51181725,"Hydrocortisone butyrate",
+"unspsc",51181726,"Hydrocortisone sodium phosphate",
+"unspsc",51181727,"Hydrocortisone valerate",
+"unspsc",51181728,"Methylprednisolone acetate",
+"unspsc",51181729,"Methylprednisolone sodium succinate",
+"unspsc",51181730,"Prednisolone acetate",
+"unspsc",51181731,"Triamcinolone acetonide",
+"unspsc",51181732,"Triamcinolone diacetate",
+"unspsc",51181733,"Triamcinolone hexacetonide",
+"unspsc",51181734,"Alclometasone dipropionate",
+"unspsc",51181735,"Halobetasol propionate",
+"unspsc",51181736,"Fluorometholone",
+"unspsc",51181737,"Halcinonide",
+"unspsc",51181738,"Fludrocortisone acetate",
+"unspsc",51181739,"Rimexolone",
+"unspsc",51181740,"Dexamethasone sodium phosphate",
+"unspsc",51181741,"Loteprednol etabonate",
+"unspsc",51181742,"Clobetasol propionate",
+"unspsc",51181743,"Clocortolone pivalate",
+"unspsc",51181744,"Fluocinonide",
+"unspsc",51181745,"Flurandrenolide",
+"unspsc",51181746,"Amcinonide",
+"unspsc",51181747,"Hydrocortisone probutate",
+"unspsc",51181748,"Medrysone",
+"unspsc",51181749,"Mometasone furoate",
+"unspsc",51181750,"Desonide",
+"unspsc",51181751,"Prednisolone sodium phosphate",
+"unspsc",51181752,"Beclomethasone dipropionate",
+"unspsc",51181753,"Cortisone acetate",
+"unspsc",51181754,"Betamethasone dipropionate",
+"unspsc",51181755,"Betamethasone valerate",
+"unspsc",51181800,"Estrogens and progestins and internal contraceptives",
+"unspsc",51181801,"Chlorotrianisene",
+"unspsc",51181802,"Estrone",
+"unspsc",51181803,"Estrogens conjugated",
+"unspsc",51181804,"Estropipate",
+"unspsc",51181805,"Levonorgestrel",
+"unspsc",51181806,"Megestrol acetate",
+"unspsc",51181807,"Ethinyl estradiol",
+"unspsc",51181808,"Mestranol",
+"unspsc",51181810,"Chlormadinone acetate",
+"unspsc",51181811,"Desogestrel and ethinyl estradiol",
+"unspsc",51181812,"Dienestrol",
+"unspsc",51181813,"Estradiol",
+"unspsc",51181814,"Ethisterone",
+"unspsc",51181815,"Estradiol and norethisterone acetate",
+"unspsc",51181816,"Hydroxyestrone diacetate",
+"unspsc",51181817,"Promestriene",
+"unspsc",51181818,"Progesterone",
+"unspsc",51181819,"Promegestone",
+"unspsc",51181820,"Gestrinone",
+"unspsc",51181821,"Estradiol cypionate",
+"unspsc",51181822,"Estradiol valerate",
+"unspsc",51181823,"Esterified estrogen",
+"unspsc",51181824,"Ethynodiol diacetate",
+"unspsc",51181825,"Diethylstilbestrol diphos",
+"unspsc",51181826,"Hydroxyprogesterone caproate",
+"unspsc",51181827,"Medroxyprogesterone acetate",
+"unspsc",51181828,"Norethindrone",
+"unspsc",51181829,"Norethindrone acetate",
+"unspsc",51181830,"Norgestimate",
+"unspsc",51181831,"Norgestrel",
+"unspsc",51181832,"Etonogestrel and ethinyl estradiol combination",
+"unspsc",51181833,"Ethinyl estradiol and ethynodiol diacetate combination",
+"unspsc",51181834,"Norethindrone and ethinyl estradiol combination",
+"unspsc",51181900,"Gonadotropic hormones and ovarian stimulants and inhibitors",
+"unspsc",51181901,"Chorionic gonadotropin",
+"unspsc",51181902,"Danazol",
+"unspsc",51181903,"Gonadorelin acetate",
+"unspsc",51181904,"Histrelin acetate",
+"unspsc",51181905,"Menotropins",
+"unspsc",51181906,"Urofollitropin",
+"unspsc",51181908,"Fosfestrol sodium",
+"unspsc",51181911,"Clomiphene citrate",
+"unspsc",51181912,"Follitropin",
+"unspsc",51181913,"Gonadorelin hydrochloride",
+"unspsc",51182000,"Androgens and androgen inhibitors",
+"unspsc",51182001,"Finasteride",
+"unspsc",51182002,"Testosterone",
+"unspsc",51182003,"Testosterone cypionate",
+"unspsc",51182004,"Testosterone enanthate",
+"unspsc",51182005,"Testosterone propionate",
+"unspsc",51182006,"Trenbolone Acetate",
+"unspsc",51182007,"Methandriol",
+"unspsc",51182008,"Fluoxymesterone",
+"unspsc",51182009,"Methyltestosterone",
+"unspsc",51182010,"Nandrolone decanoate",
+"unspsc",51182011,"Nandrolone phenpropionate",
+"unspsc",51182012,"Prasterone",
+"unspsc",51182013,"Stanozolol",
+"unspsc",51182014,"Dutasteride",
+"unspsc",51182100,"Posterior pituitary hormones",
+"unspsc",51182101,"Desmopressin acetate",
+"unspsc",51182102,"Vasopressin",
+"unspsc",51182200,"Drugs for inducing labor",
+"unspsc",51182201,"Dinoprostone",
+"unspsc",51182202,"Methylergonovine maleate",
+"unspsc",51182203,"Oxytocin",
+"unspsc",51182204,"Ergonovine maleate",
+"unspsc",51182300,"Growth hormones and their inhibitors",
+"unspsc",51182301,"Somatrem",
+"unspsc",51182302,"Somatropin",
+"unspsc",51182303,"Somatostatin",
+"unspsc",51182304,"Octreotide acetate",
+"unspsc",51182400,"Calcium salts and calcium regulators",
+"unspsc",51182401,"Calcium chloride",
+"unspsc",51182403,"Calcium gluconate",
+"unspsc",51182404,"Calcium lactate",
+"unspsc",51182405,"Dibase calcium phosphate",
+"unspsc",51182406,"Alendronate sodium",
+"unspsc",51182407,"Calcitonin",
+"unspsc",51182408,"Cellulose sodium phosphate",
+"unspsc",51182409,"Gallium nitrate",
+"unspsc",51182410,"Etidronate disodium",
+"unspsc",51182411,"Nandrolone",
+"unspsc",51182412,"Tribasic calcium phosphates",
+"unspsc",51182413,"Calcium glycero phosphate",
+"unspsc",51182415,"Zoledronic acid",
+"unspsc",51182416,"Pamidronate disodium",
+"unspsc",51182417,"Risedronate sodium",
+"unspsc",51182418,"Calcium acetate",
+"unspsc",51182419,"Calcium glucoheptonate or calcium gluceptate",
+"unspsc",51182420,"Dihydrotachysterol",
+"unspsc",51190000,"Agents affecting water and electrolytes",
+"unspsc",51191500,"Diuretics",
+"unspsc",51191501,"Chlorothiazide",
+"unspsc",51191502,"Chlorthalidone",
+"unspsc",51191503,"Metolazone",
+"unspsc",51191504,"Bumetanide",
+"unspsc",51191505,"Ethacrynate sodium",
+"unspsc",51191506,"Amiloride hydrochloride",
+"unspsc",51191507,"Spironolactone",
+"unspsc",51191508,"Triamterene",
+"unspsc",51191509,"Mannitol",
+"unspsc",51191510,"Furosemide",
+"unspsc",51191511,"Canrenoate potassium",
+"unspsc",51191512,"Lasitone",
+"unspsc",51191513,"Bendroflumethiazide",
+"unspsc",51191514,"Ethacrynic acid",
+"unspsc",51191515,"Hydrochlorothiazide",
+"unspsc",51191516,"Hydroflumethiazide",
+"unspsc",51191517,"Isosorbide",
+"unspsc",51191518,"Methyclothiazide",
+"unspsc",51191519,"Pamabrom",
+"unspsc",51191520,"Polythiazide",
+"unspsc",51191521,"Torsemide",
+"unspsc",51191522,"Trichlormethiazide",
+"unspsc",51191523,"Urea osmotic diuretic",
+"unspsc",51191600,"Electrolytes",
+"unspsc",51191601,"Dextrose",
+"unspsc",51191602,"Sodium chloride electrolytes",
+"unspsc",51191603,"Total parenteral alimentation or nutrition TPN solutions",
+"unspsc",51191604,"Lactated ringers solution",
+"unspsc",51191700,"Alkalinizing agents",
+"unspsc",51191701,"Tromethamine",
+"unspsc",51191702,"Sodium lactate",
+"unspsc",51191703,"Sodium acetate",
+"unspsc",51191704,"Multiple electrolyte solutions",
+"unspsc",51191705,"Citric acid and potassium citrate combination",
+"unspsc",51191706,"Citric acid and sodium citrate combination",
+"unspsc",51191800,"Potassium salts",
+"unspsc",51191801,"Potassium bicarbonate",
+"unspsc",51191802,"Potassium chloride",
+"unspsc",51191803,"Potassium gluconate",
+"unspsc",51191804,"Potassium acetate",
+"unspsc",51191805,"Potassium supplement",
+"unspsc",51191900,"Dietary supplements and nutritional therapy products",
+"unspsc",51191901,"Residue of maize germ",
+"unspsc",51191902,"Amino acid supplements",
+"unspsc",51191903,"Phentermine",
+"unspsc",51191904,"Phospholipids",
+"unspsc",51191905,"Vitamin supplements",
+"unspsc",51191906,"Oral rehydration solution",
+"unspsc",51191907,"Ammonium molybdate",
+"unspsc",51200000,"Immunomodulating drugs",
+"unspsc",51201500,"Immunosuppressants",
+"unspsc",51201501,"Azathioprine",
+"unspsc",51201502,"Cyclosporine",
+"unspsc",51201503,"Mycophenolate mofetil",
+"unspsc",51201504,"Tacrolimus",
+"unspsc",51201505,"Antilymphocyte",
+"unspsc",51201506,"Defibrotide",
+"unspsc",51201507,"Aldesleukin",
+"unspsc",51201508,"Basiliximab",
+"unspsc",51201509,"Daclizumab",
+"unspsc",51201510,"Imiquimod",
+"unspsc",51201511,"Muromonab CD3",
+"unspsc",51201512,"Mycophenolate mofetil hydrochloride",
+"unspsc",51201513,"Peginterferon",
+"unspsc",51201514,"Pimecrolimus",
+"unspsc",51201515,"Sirolimus",
+"unspsc",51201516,"Antilymphocyte or lymphocyte immune globulin",
+"unspsc",51201517,"Guanidine hydrochloride",
+"unspsc",51201518,"Azathioprine sodium",
+"unspsc",51201600,"Vaccines and antigens and toxoids",
+"unspsc",51201601,"Anthrax antigen",
+"unspsc",51201602,"Brucella antigen",
+"unspsc",51201603,"Cholera vaccine",
+"unspsc",51201604,"Diphteria",
+"unspsc",51201605,"Encephalitis virus vaccine",
+"unspsc",51201606,"Hemophilus influenzae",
+"unspsc",51201607,"Hepatitis B virus vaccine",
+"unspsc",51201608,"Influenza virus vaccine",
+"unspsc",51201609,"Measles virus vaccine",
+"unspsc",51201610,"Meningococcal vaccine",
+"unspsc",51201611,"Morbilli",
+"unspsc",51201612,"Mumps virus vaccine",
+"unspsc",51201613,"Parotitis",
+"unspsc",51201614,"Pertussis vaccine",
+"unspsc",51201615,"Pneumococcal vaccine",
+"unspsc",51201616,"Poliovirus vaccine",
+"unspsc",51201617,"Rabies vaccine",
+"unspsc",51201618,"Rota virus",
+"unspsc",51201619,"Rubella virus vaccine",
+"unspsc",51201620,"Smallpox",
+"unspsc",51201621,"Tetanus toxoid",
+"unspsc",51201622,"Tuberculosis",
+"unspsc",51201623,"Typhoid vaccine",
+"unspsc",51201624,"Varicella virus vaccine",
+"unspsc",51201625,"Yellow fever vaccine",
+"unspsc",51201626,"Hepatitis a",
+"unspsc",51201627,"Haemophilus B vaccine",
+"unspsc",51201628,"Measles and mumps and rubella virus vaccine",
+"unspsc",51201629,"Diphtheria and tetanus toxoids absorbed",
+"unspsc",51201631,"Diptheria and tetanus toxoids and acellular pertussis vaccine",
+"unspsc",51201632,"Diptheria and tetanus and wholecell pertussis",
+"unspsc",51201633,"Haemophilus influenzae b with diptheria and tetanus and acellular pertussis",
+"unspsc",51201634,"Haemophilus influenzae B with diptheria and tetanus and wholecell pertussis conjugated vaccine",
+"unspsc",51201635,"Hepatitis A virus vaccine",
+"unspsc",51201636,"Lyme disease vaccine",
+"unspsc",51201638,"Plague vaccine",
+"unspsc",51201639,"Staphylococcus vaccine",
+"unspsc",51201646,"Measles and rubella  virus vaccine",
+"unspsc",51201647,"BCG vaccine",
+"unspsc",51201648,"Rubella and mumps virus vaccine",
+"unspsc",51201700,"Poultry vaccines",
+"unspsc",51201701,"Hypcuprsis",
+"unspsc",51201702,"E Coli",
+"unspsc",51201703,"Gumboro",
+"unspsc",51201704,"Avian infectious bronchitis",
+"unspsc",51201705,"Newcastle",
+"unspsc",51201800,"Immunostimulating agents",
+"unspsc",51201801,"Bacterial immunoglobulins",
+"unspsc",51201802,"Filgrastim",
+"unspsc",51201803,"Pegfilgrastim",
+"unspsc",51201804,"Sargramostim",
+"unspsc",51201805,"Rho D immuno globulins",
+"unspsc",51201806,"Immuno Globulin or Gamma IGG",
+"unspsc",51201807,"Viral immunoglobulins",
+"unspsc",51201808,"Levamisole hydrochloride",
+"unspsc",51201809,"Interferon",
+"unspsc",51201900,"Multiple sclerosis MS agents",
+"unspsc",51201901,"Glatiramer acetate",
+"unspsc",51210000,"Miscellaneous drug categories",
+"unspsc",51211500,"Antigout drugs",
+"unspsc",51211501,"Allopurinol",
+"unspsc",51211502,"Colchicine",
+"unspsc",51211503,"Probenecid",
+"unspsc",51211504,"Sulfinpyrazone",
+"unspsc",51211505,"Benzbromarone",
+"unspsc",51211600,"Antidotes and emetics",
+"unspsc",51211601,"Deferoxamine mesylate",
+"unspsc",51211602,"Dexrazoxane",
+"unspsc",51211603,"Digoxin Immune Fab",
+"unspsc",51211604,"Dimercaprol",
+"unspsc",51211605,"Edetate disodium",
+"unspsc",51211606,"Flumazenil",
+"unspsc",51211607,"Ipecac",
+"unspsc",51211608,"Penicillamine",
+"unspsc",51211609,"Protamine sulfate",
+"unspsc",51211610,"Sodium polystyrene sulfonate",
+"unspsc",51211611,"Trientine",
+"unspsc",51211612,"Leucovorin",
+"unspsc",51211613,"Sorbitol",
+"unspsc",51211615,"Methylene blue",
+"unspsc",51211616,"Antivenins",
+"unspsc",51211617,"Leucovorin calcium",
+"unspsc",51211618,"Activated charcoal antidote",
+"unspsc",51211619,"Edetate calcium disodium",
+"unspsc",51211620,"Fomepizole",
+"unspsc",51211621,"Pralidoxime chloride",
+"unspsc",51211622,"Sodium thiosulfate",
+"unspsc",51211623,"Succimer",
+"unspsc",51211624,"Copper sulfate",
+"unspsc",51211625,"Exopeptidase G2",
+"unspsc",51211900,"Veterinary anaesthetic drugs",
+"unspsc",51211901,"Xylazine",
+"unspsc",51212000,"Herbal drugs",
+"unspsc",51212001,"Etheric oil",
+"unspsc",51212002,"Centella asiatica extract",
+"unspsc",51212003,"Ipecacuanha extract",
+"unspsc",51212004,"Aesculus",
+"unspsc",51212005,"Aconitum napelus",
+"unspsc",51212006,"Valerian",
+"unspsc",51212007,"Garlic",
+"unspsc",51212008,"Chelidonium majus",
+"unspsc",51212009,"Soapwort",
+"unspsc",51212010,"Primula",
+"unspsc",51212011,"Pimpinella",
+"unspsc",51212012,"Coriander",
+"unspsc",51212013,"Hedera helix",
+"unspsc",51212014,"Gumplant",
+"unspsc",51212015,"Boneset",
+"unspsc",51212016,"Echinacea",
+"unspsc",51212017,"Aconite",
+"unspsc",51212018,"Coccus cacti",
+"unspsc",51212020,"Catnip",
+"unspsc",51212021,"Ginseng",
+"unspsc",51212022,"Asafetida",
+"unspsc",51212023,"Bilberry",
+"unspsc",51212024,"Arnica",
+"unspsc",51212025,"Balsam peru",
+"unspsc",51212026,"Eyebright",
+"unspsc",51212027,"Ginkgo biloba",
+"unspsc",51212028,"Hydrastis",
+"unspsc",51212029,"Gotu kola",
+"unspsc",51212030,"Saw palmetto",
+"unspsc",51212031,"Pygeum africanum",
+"unspsc",51212032,"Angelica root",
+"unspsc",51212033,"Gentian violet",
+"unspsc",51212034,"Capsaicin",
+"unspsc",51212035,"Milk thistle",
+"unspsc",51212036,"Black cohosh",
+"unspsc",51212100,"Dental drugs",
+"unspsc",51212101,"Sodium flourides",
+"unspsc",51212200,"Anti abuse drugs",
+"unspsc",51212201,"Disulfiram",
+"unspsc",51212202,"Nicotine",
+"unspsc",51212203,"Nicotine polacrilex",
+"unspsc",51212300,"Diagnostic agents and radiopharmaceuticals",
+"unspsc",51212301,"Aminohippurate sodium",
+"unspsc",51212302,"Ethiodized oil",
+"unspsc",51212303,"Fluorescein sodium",
+"unspsc",51212304,"Indigotindisulfonate sodium",
+"unspsc",51212305,"Indocyanine green",
+"unspsc",51212306,"Methacholine chloride",
+"unspsc",51212307,"Metyrapone",
+"unspsc",51212308,"Rose bengal sodium I 131",
+"unspsc",51212309,"Meglumine Ioxaglate",
+"unspsc",51212400,"Drugs to treat sexual disfunction",
+"unspsc",51212401,"Sildenafil citrate",
+"unspsc",51212402,"Vardenafil hydrochloride",
+"unspsc",51240000,"Drugs affecting the ears, eye, nose and skin",
+"unspsc",51241000,"Aural preparations",
+"unspsc",51241001,"Dioctyl sodium sulphosuccinate",
+"unspsc",51241002,"Triethanolamine polypeptide oleate",
+"unspsc",51241100,"Opthalmic agents",
+"unspsc",51241101,"Acetylcholine chloride",
+"unspsc",51241102,"Apraclonidine hydrochloride",
+"unspsc",51241103,"Bimatoprost",
+"unspsc",51241104,"Brinzolamide",
+"unspsc",51241105,"Carbachol",
+"unspsc",51241106,"Demecarium bromide",
+"unspsc",51241107,"Dorzolamide hydorchloride",
+"unspsc",51241108,"Echothiophate iodide",
+"unspsc",51241109,"Epinephryl borate",
+"unspsc",51241110,"Latanoprost",
+"unspsc",51241111,"Levobunolol hydrochloride",
+"unspsc",51241112,"Metipranolol",
+"unspsc",51241113,"Physostigmine sulfate",
+"unspsc",51241114,"Pilocarpine hydrochloride",
+"unspsc",51241115,"Timolol",
+"unspsc",51241116,"Travoprost",
+"unspsc",51241117,"Unoprostone isoprpyl ",
+"unspsc",51241118,"Dichlorphenamide",
+"unspsc",51241119,"Methazolamide",
+"unspsc",51241120,"Artificial tears",
+"unspsc",51241200,"Dermatologic agents",
+"unspsc",51241201,"Salicylic acid",
+"unspsc",51241202,"Azelaic acid",
+"unspsc",51241203,"Bismuth subcarbonate",
+"unspsc",51241204,"Boric acid",
+"unspsc",51241205,"Calamine",
+"unspsc",51241206,"Chloroxine",
+"unspsc",51241207,"Topcial coal tar preparations",
+"unspsc",51241208,"Hydrophillic creams or ointments",
+"unspsc",51241209,"Hydroquinone",
+"unspsc",51241210,"Methyl salicylate",
+"unspsc",51241211,"Minoxidil topical solution",
+"unspsc",51241212,"Papain",
+"unspsc",51241213,"Topical pine tar preparation",
+"unspsc",51241214,"Podofilox",
+"unspsc",51241215,"Podophyllum resin",
+"unspsc",51241216,"Pyrithione zinc",
+"unspsc",51241217,"Resorcinol",
+"unspsc",51241218,"Selenium sulfide",
+"unspsc",51241219,"Tazarotene",
+"unspsc",51241220,"Tretinoin",
+"unspsc",51241221,"Crystallized trypsin",
+"unspsc",51241222,"Dimethicone",
+"unspsc",51241223,"Calcipotriene",
+"unspsc",51241224,"Anthralin or dithranol",
+"unspsc",51241225,"Topical camphor preparations",
+"unspsc",51241226,"Topical urea preparations",
+"unspsc",51241227,"Topical turpentine oil preparations",
+"unspsc",51241228,"Lactic acid",
+"unspsc",51241229,"Saliva substitute solution",
+"unspsc",51241300,"Astringents",
+"unspsc",51241301,"Aluminum acetate",
+"unspsc",51241302,"Hamamelis or witch hazel",
+"unspsc",51241303,"Zinc acetate",
+"unspsc",51241304,"Ammonium alum",
+"unspsc",51241305,"Tannic acid",
+"unspsc",51250000,"Veterinary nutritional supplement",
+"unspsc",51251000,"Metabolites",
+"unspsc",51251001,"Butaphosphan",
+"unspsc",52000000,"Domestic Appliances and Supplies and Consumer Electronic Products",
+"unspsc",52100000,"Floor coverings",
+"unspsc",52101500,"Rugs and mats",
+"unspsc",52101501,"Oriental rugs",
+"unspsc",52101502,"Area rugs",
+"unspsc",52101503,"Wool rugs",
+"unspsc",52101504,"Cotton rugs",
+"unspsc",52101505,"Synthetic rugs",
+"unspsc",52101506,"Braided rugs",
+"unspsc",52101507,"Bath mats",
+"unspsc",52101508,"Door mats",
+"unspsc",52101509,"Decorative mats",
+"unspsc",52101510,"Anti fatigue mats",
+"unspsc",52101511,"Rubber or vinyl mats",
+"unspsc",52101512,"Chair mat",
+"unspsc",52101513,"Carpet protector",
+"unspsc",52120000,"Bedclothes and table and kitchen linen and towels",
+"unspsc",52121500,"Bedclothes",
+"unspsc",52121501,"Quilts",
+"unspsc",52121502,"Comforters",
+"unspsc",52121503,"Comforter covers",
+"unspsc",52121504,"Mattress covers",
+"unspsc",52121505,"Pillows",
+"unspsc",52121506,"Mattress pads",
+"unspsc",52121507,"Featherbeds",
+"unspsc",52121508,"Blankets",
+"unspsc",52121509,"Sheets",
+"unspsc",52121510,"Dust ruffles",
+"unspsc",52121511,"Duvets",
+"unspsc",52121512,"Pillow cases",
+"unspsc",52121513,"Bed spreads",
+"unspsc",52121600,"Table and kitchen linen and accessories",
+"unspsc",52121601,"Dish towels",
+"unspsc",52121602,"Napkins",
+"unspsc",52121603,"Table runners",
+"unspsc",52121604,"Table cloths",
+"unspsc",52121605,"Domestic oven mits or pot holders",
+"unspsc",52121606,"Place mats",
+"unspsc",52121607,"Table skirts",
+"unspsc",52121608,"Clips for table skirts",
+"unspsc",52121700,"Towels",
+"unspsc",52121701,"Bath towels",
+"unspsc",52121702,"Beach towels",
+"unspsc",52121703,"Wash cloths",
+"unspsc",52121704,"Hand towels",
+"unspsc",52130000,"Window treatments",
+"unspsc",52131500,"Curtains and draperies",
+"unspsc",52131501,"Curtains",
+"unspsc",52131503,"Draperies",
+"unspsc",52131600,"Blinds and shades",
+"unspsc",52131601,"Venetian blinds",
+"unspsc",52131602,"Roll up shades",
+"unspsc",52131603,"Interior shutters",
+"unspsc",52131604,"Vertical blinds",
+"unspsc",52131700,"Window treatment accessories and hardware",
+"unspsc",52131701,"Valances",
+"unspsc",52131702,"Curtain rods",
+"unspsc",52131703,"Rod finials",
+"unspsc",52131704,"Curtain rings or clips",
+"unspsc",52140000,"Domestic appliances",
+"unspsc",52141500,"Domestic kitchen appliances",
+"unspsc",52141501,"Domestic refrigerators",
+"unspsc",52141502,"Domestic microwave ovens",
+"unspsc",52141503,"Domestic garbage disposals",
+"unspsc",52141504,"Domestic ranges",
+"unspsc",52141505,"Domestic dish washers",
+"unspsc",52141506,"Domestic freezers",
+"unspsc",52141507,"Domestic upright freezers",
+"unspsc",52141508,"Domestic chest freezers",
+"unspsc",52141509,"Domestic combination refrigerator freezers",
+"unspsc",52141510,"Domestic portable air conditioners",
+"unspsc",52141511,"Domestic juicers",
+"unspsc",52141512,"Domestic waffle irons",
+"unspsc",52141513,"Domestic electric can openers",
+"unspsc",52141514,"Domestic food processors",
+"unspsc",52141515,"Domestic trash compactors",
+"unspsc",52141516,"Domestic deep fryers",
+"unspsc",52141517,"Domestic popcorn poppers",
+"unspsc",52141518,"Domestic bread making machines",
+"unspsc",52141519,"Domestic convectional ovens",
+"unspsc",52141520,"Domestic mixers",
+"unspsc",52141521,"Domestic toaster ovens",
+"unspsc",52141522,"Domestic toasters",
+"unspsc",52141523,"Domestic electrical kettles",
+"unspsc",52141524,"Domestic blenders",
+"unspsc",52141525,"Domestic hot plates",
+"unspsc",52141526,"Domestic coffee makers",
+"unspsc",52141527,"Domestic electric knives",
+"unspsc",52141528,"Domestic electric woks",
+"unspsc",52141529,"Domestic coffee grinders",
+"unspsc",52141530,"Parts of dishwashing machines",
+"unspsc",52141531,"Domestic food choppers",
+"unspsc",52141532,"Domestic electric skillets",
+"unspsc",52141533,"Domestic electric griddles",
+"unspsc",52141534,"Domestic electric sandwich maker",
+"unspsc",52141535,"Domestic indoor electric grills",
+"unspsc",52141536,"Domestic pizelle or cookie maker",
+"unspsc",52141537,"Domestic crock pot",
+"unspsc",52141538,"Domestic use food warmers",
+"unspsc",52141539,"Domestic tea makers",
+"unspsc",52141600,"Domestic laundry appliances and supplies",
+"unspsc",52141601,"Domestic clothes washers",
+"unspsc",52141602,"Domestic tumble dryers",
+"unspsc",52141603,"Domestic clothing irons",
+"unspsc",52141604,"Footwear dryers",
+"unspsc",52141605,"Laundry hampers",
+"unspsc",52141606,"Laundry baskets",
+"unspsc",52141607,"Fabric wrinkle removing compounds",
+"unspsc",52141608,"Garment steamer",
+"unspsc",52141700,"Domestic bath appliances",
+"unspsc",52141701,"Domestic electric toothbrushes",
+"unspsc",52141703,"Domestic hair dryers",
+"unspsc",52141704,"Domestic electric razors",
+"unspsc",52141705,"Parts of shavers or hair removers",
+"unspsc",52141706,"Nail dryers",
+"unspsc",52141800,"Other domestic household appliances",
+"unspsc",52141801,"Domestic sewing machines",
+"unspsc",52141802,"Domestic space heaters",
+"unspsc",52141803,"Domestic electric blankets",
+"unspsc",52150000,"Domestic kitchenware",
+"unspsc",52151500,"Domestic disposable kitchenware",
+"unspsc",52151501,"Domestic disposable cookware",
+"unspsc",52151502,"Domestic disposable dishes",
+"unspsc",52151503,"Domestic disposable flatware",
+"unspsc",52151504,"Domestic disposable cups or glasses or lids",
+"unspsc",52151505,"Domestic disposable stirrers",
+"unspsc",52151506,"Domestic disposable food containers",
+"unspsc",52151507,"Domestic disposable drinking straws",
+"unspsc",52151600,"Domestic kitchen tools and utensils",
+"unspsc",52151601,"Domestic rolling pins",
+"unspsc",52151602,"Domestic mixing bowls",
+"unspsc",52151603,"Domestic graters",
+"unspsc",52151604,"Domestic strainers or colanders",
+"unspsc",52151605,"Domestic can or bottle openers",
+"unspsc",52151606,"Domestic cutting boards",
+"unspsc",52151607,"Domestic measuring cups",
+"unspsc",52151608,"Basters or basting brushes",
+"unspsc",52151609,"Vegetable peeler",
+"unspsc",52151610,"Cookie cutters",
+"unspsc",52151611,"Domestic kitchen tongs",
+"unspsc",52151612,"Domestic kitchen wire whips",
+"unspsc",52151613,"Domestic food scrapers",
+"unspsc",52151614,"Domestic cooling racks",
+"unspsc",52151615,"Domestic pizza cutters",
+"unspsc",52151616,"Domestic kitchen spatulas",
+"unspsc",52151617,"Domestic wooden spoons",
+"unspsc",52151618,"Domestic wooden oven paddle",
+"unspsc",52151619,"Domestic pastry blender",
+"unspsc",52151620,"Domestic sifter",
+"unspsc",52151621,"Domestic cookie stampers",
+"unspsc",52151622,"Domestic pastry decorating gun",
+"unspsc",52151623,"Domestic cookie press",
+"unspsc",52151624,"Domestic knife sharpeners",
+"unspsc",52151625,"Domestic biscuit cutters",
+"unspsc",52151626,"Domestic mandolin",
+"unspsc",52151627,"Domestic garlic press",
+"unspsc",52151628,"Domestic egg slicer",
+"unspsc",52151629,"Domestic egg separator",
+"unspsc",52151630,"Domestic cheese slicer",
+"unspsc",52151631,"Domestic food mill",
+"unspsc",52151632,"Domestic kitchen funnels",
+"unspsc",52151633,"Domestic garnishing tools",
+"unspsc",52151634,"Domestic apple corer",
+"unspsc",52151635,"Domestic melon or butter baller",
+"unspsc",52151636,"Domestic food scoops",
+"unspsc",52151637,"Domestic pumpkin carver",
+"unspsc",52151638,"Domestic vegetable brush",
+"unspsc",52151639,"Domestic egg beater",
+"unspsc",52151640,"Domestic pasta drying rack",
+"unspsc",52151641,"Domestic whipped cream maker",
+"unspsc",52151642,"Domestic dough press",
+"unspsc",52151643,"Domestic ravioli maker",
+"unspsc",52151644,"Domestic mist or trigger sprayers",
+"unspsc",52151645,"Domestic pastry brush",
+"unspsc",52151646,"Domestic kitchen or diet scales",
+"unspsc",52151647,"Domestic kitchen timers",
+"unspsc",52151648,"Domestic kitchen or food thermometers",
+"unspsc",52151649,"Domestic bread slicing guide",
+"unspsc",52151650,"Domestic drain boards",
+"unspsc",52151700,"Domestic flatware and cutlery",
+"unspsc",52151701,"Domestic serving utensils",
+"unspsc",52151702,"Domestic knives",
+"unspsc",52151703,"Domestic forks",
+"unspsc",52151704,"Domestic spoons",
+"unspsc",52151705,"Spoon rests",
+"unspsc",52151706,"Chopsticks",
+"unspsc",52151707,"Domestic cutlery set",
+"unspsc",52151708,"Butter spreaders",
+"unspsc",52151709,"Flatware set",
+"unspsc",52151800,"Domestic cookware",
+"unspsc",52151801,"Domestic dutch ovens",
+"unspsc",52151802,"Domestic frying pans",
+"unspsc",52151803,"Domestic saucepans",
+"unspsc",52151804,"Domestic kettles",
+"unspsc",52151805,"Domestic woks",
+"unspsc",52151806,"Domestic steamers",
+"unspsc",52151807,"Domestic stock pots",
+"unspsc",52151808,"Domestic pressure cookers",
+"unspsc",52151809,"Domestic saute pans",
+"unspsc",52151810,"Domestic chafing dishes",
+"unspsc",52151811,"Domestic griddles",
+"unspsc",52151812,"Domestic double boilers",
+"unspsc",52151813,"Domestic splatter shield",
+"unspsc",52151900,"Domestic bakeware",
+"unspsc",52151901,"Domestic muffin pans",
+"unspsc",52151902,"Domestic baking pans",
+"unspsc",52151903,"Domestic cake or pie pans",
+"unspsc",52151904,"Domestic roasting pans",
+"unspsc",52151905,"Domestic baking sheets",
+"unspsc",52151906,"Domestic broiling pans",
+"unspsc",52151907,"Domestic baking molds",
+"unspsc",52151908,"Domestic pizza pans",
+"unspsc",52151909,"Domestic tortilla bakers",
+"unspsc",52152000,"Domestic dishes and servingware and storage containers",
+"unspsc",52152001,"Domestic pitchers",
+"unspsc",52152002,"Domestic food storage containers",
+"unspsc",52152003,"Domestic punch bowls",
+"unspsc",52152004,"Domestic plates",
+"unspsc",52152005,"Domestic saucers",
+"unspsc",52152006,"Domestic trays or platters",
+"unspsc",52152007,"Domestic serving bowls",
+"unspsc",52152008,"Domestic tea or coffee pots",
+"unspsc",52152009,"Domestic soup or salad bowls",
+"unspsc",52152010,"Domestic vacuum flasks",
+"unspsc",52152011,"Inners for vacuum flasks",
+"unspsc",52152012,"Ice trays",
+"unspsc",52152013,"Spice or salt or pepper shakers",
+"unspsc",52152014,"Carafe sets",
+"unspsc",52152015,"Domestic cake plate with dome",
+"unspsc",52152016,"Domestic dinner set",
+"unspsc",52152100,"Domestic drink ware",
+"unspsc",52152101,"Domestic coffee or tea cups",
+"unspsc",52152102,"Domestic drinking glasses",
+"unspsc",52152103,"Domestic mugs",
+"unspsc",52152104,"Domestic stemware",
+"unspsc",52152105,"Feeding bottles or accessories",
+"unspsc",52152200,"Dishwashing and dish storage accessories",
+"unspsc",52152201,"Shelf liner",
+"unspsc",52152202,"Dish drainer",
+"unspsc",52152203,"Soap dispensing brush",
+"unspsc",52160000,"Consumer electronics",
+"unspsc",52161500,"Audio and visual equipment",
+"unspsc",52161502,"Cassette players or recorders",
+"unspsc",52161505,"Televisions",
+"unspsc",52161507,"Clock radios",
+"unspsc",52161508,"Laser disc players",
+"unspsc",52161509,"Portable stereo systems",
+"unspsc",52161510,"Home stereo systems",
+"unspsc",52161511,"Radios",
+"unspsc",52161512,"Loudspeakers",
+"unspsc",52161513,"Combination television video cassette recorders",
+"unspsc",52161514,"Headphones",
+"unspsc",52161515,"Compact disk players or recorders",
+"unspsc",52161516,"Digital video disk players or recorders",
+"unspsc",52161517,"Equalizers",
+"unspsc",52161518,"Global positioning system receivers",
+"unspsc",52161520,"Microphones",
+"unspsc",52161521,"Multimedia receivers",
+"unspsc",52161522,"Radio frequency scanners",
+"unspsc",52161523,"Radio frequency transmitters or receivers",
+"unspsc",52161524,"Radio receivers",
+"unspsc",52161525,"Remote control",
+"unspsc",52161526,"Satellite receivers",
+"unspsc",52161527,"Subwoofers",
+"unspsc",52161529,"Video cassette players or recorders",
+"unspsc",52161531,"Radio phonographs",
+"unspsc",52161532,"Karaoke systems",
+"unspsc",52161533,"Megaphones",
+"unspsc",52161534,"Integrated circut IC chip recorder",
+"unspsc",52161535,"Digital voice recorders",
+"unspsc",52161536,"Minidisc players or recorders",
+"unspsc",52161537,"Magnetic storage media erasers",
+"unspsc",52161538,"Video tape rewinders",
+"unspsc",52161539,"Combination digital video disc DVD video cassette disc VCD compact disc CD player",
+"unspsc",52161540,"Video switchers",
+"unspsc",52161541,"Audio switchers",
+"unspsc",52161542,"Plasma screens",
+"unspsc",52161543,"MP3 players or recorders",
+"unspsc",52161544,"Video or audio cassette erasers",
+"unspsc",52161545,"Digital video recorders",
+"unspsc",52161546,"Television tuners",
+"unspsc",52161600,"Audio visual equipment accessories",
+"unspsc",52161601,"Cassette storage",
+"unspsc",52161602,"Audio or video head cleaners",
+"unspsc",52161603,"Compact video cassette adapter",
+"unspsc",52161604,"Headphone jack adapters",
+"unspsc",52170000,"Domestic wall treatments",
+"unspsc",52171000,"Bathroom wall treatments",
+"unspsc",52171001,"Hanging toiletry organizer or shelf",
+"unspsc",53000000,"Apparel and Luggage and Personal Care Products",
+"unspsc",53100000,"Clothing",
+"unspsc",53101500,"Slacks and trousers and shorts",
+"unspsc",53101501,"Boys slacks or trousers or sho+C15705rts",
+"unspsc",53101502,"Mens slacks or trousers or shorts",
+"unspsc",53101503,"Girls slacks or trousers or shorts",
+"unspsc",53101504,"Womens slacks or trousers or shorts",
+"unspsc",53101505,"Infants slacks or trousers or shorts",
+"unspsc",53101600,"Shirts and blouses",
+"unspsc",53101601,"Boys shirts",
+"unspsc",53101602,"Mens shirts",
+"unspsc",53101603,"Girls shirts or blouses",
+"unspsc",53101604,"Womens shirts or blouses",
+"unspsc",53101605,"Infants shirts or blouses",
+"unspsc",53101700,"Sweaters",
+"unspsc",53101701,"Boys sweaters",
+"unspsc",53101702,"Mens sweaters",
+"unspsc",53101703,"Girls sweaters",
+"unspsc",53101704,"Womens sweaters",
+"unspsc",53101705,"Infants sweaters",
+"unspsc",53101800,"Coats and jackets",
+"unspsc",53101801,"Boys coats or jackets",
+"unspsc",53101802,"Mens coats or jackets",
+"unspsc",53101803,"Girls coats or jackets",
+"unspsc",53101804,"Womens coats or jackets",
+"unspsc",53101805,"Infants coats or jackets",
+"unspsc",53101900,"Suits",
+"unspsc",53101901,"Boys suits",
+"unspsc",53101902,"Mens suits",
+"unspsc",53101903,"Girls suits",
+"unspsc",53101904,"Womens suits",
+"unspsc",53101905,"Infants suits",
+"unspsc",53102000,"Dresses and skirts and saris and kimonos",
+"unspsc",53102001,"Girls dresses or skirts or saris or kimonos",
+"unspsc",53102002,"Womens dresses or skirts or saris or kimonos",
+"unspsc",53102003,"Infants dresses or skirts or saris or kimonos",
+"unspsc",53102100,"Overalls and coveralls",
+"unspsc",53102101,"Boys overalls or coveralls",
+"unspsc",53102102,"Mens overalls or coveralls",
+"unspsc",53102103,"Girls overalls or coveralls",
+"unspsc",53102104,"Womens overalls or coveralls",
+"unspsc",53102105,"Infants overalls or coveralls",
+"unspsc",53102200,"Folkloric clothing",
+"unspsc",53102201,"Boys folkloric clothing",
+"unspsc",53102202,"Mens folkloric clothing",
+"unspsc",53102203,"Girls folkloric clothing",
+"unspsc",53102204,"Womens folkloric clothing",
+"unspsc",53102205,"Infants folkloric clothing",
+"unspsc",53102300,"Undergarments",
+"unspsc",53102301,"Undershirts",
+"unspsc",53102302,"Slips",
+"unspsc",53102303,"Underpants",
+"unspsc",53102304,"Brassieres",
+"unspsc",53102305,"Infant diapers",
+"unspsc",53102306,"Adult diapers",
+"unspsc",53102307,"Body shaping garments",
+"unspsc",53102308,"Diaper liners",
+"unspsc",53102400,"Hosiery",
+"unspsc",53102401,"Stockings",
+"unspsc",53102402,"Socks",
+"unspsc",53102403,"Panty hose",
+"unspsc",53102404,"Tights",
+"unspsc",53102500,"Clothing accessories",
+"unspsc",53102501,"Belts or suspenders",
+"unspsc",53102502,"Ties or scarves or mufflers",
+"unspsc",53102503,"Hats",
+"unspsc",53102504,"Gloves or mittens",
+"unspsc",53102505,"Umbrellas",
+"unspsc",53102506,"Sweat bands",
+"unspsc",53102507,"Clothing hangers",
+"unspsc",53102508,"Armbands",
+"unspsc",53102509,"Garters",
+"unspsc",53102510,"Tassles",
+"unspsc",53102511,"Bandannas",
+"unspsc",53102512,"Handkerchiefs",
+"unspsc",53102513,"Headbands",
+"unspsc",53102514,"Pocket protectors",
+"unspsc",53102515,"Button covers",
+"unspsc",53102516,"Caps",
+"unspsc",53102517,"Tie holders",
+"unspsc",53102518,"Chevrons",
+"unspsc",53102519,"Gorgets",
+"unspsc",53102520,"Shoulder boards or epaulettes",
+"unspsc",53102600,"Nightwear",
+"unspsc",53102601,"Boys pajamas or nightshirts or robes",
+"unspsc",53102602,"Mens pajamas or nightshirts or robes",
+"unspsc",53102603,"Girls pajamas or nightshirts or robes",
+"unspsc",53102604,"Womens pajamas or nightshirts or robes",
+"unspsc",53102605,"Infants pajamas or nightshirts or robes",
+"unspsc",53102606,"Bath robes",
+"unspsc",53102700,"Uniforms",
+"unspsc",53102701,"Military uniforms",
+"unspsc",53102702,"Customs uniforms",
+"unspsc",53102703,"Police uniforms",
+"unspsc",53102704,"Institutional food preparation or service attire",
+"unspsc",53102705,"School uniforms",
+"unspsc",53102706,"Security uniforms",
+"unspsc",53102707,"Doctors coat",
+"unspsc",53102708,"Nurses uniforms",
+"unspsc",53102709,"Ambulance officers uniforms",
+"unspsc",53102710,"Corporate uniforms",
+"unspsc",53102711,"Salon smocks",
+"unspsc",53102712,"Paramedic uniforms",
+"unspsc",53102800,"Swimwear",
+"unspsc",53102801,"Mens swimwear",
+"unspsc",53102802,"Womens swimwear",
+"unspsc",53102803,"Boys swimwear",
+"unspsc",53102804,"Girls swimwear",
+"unspsc",53102805,"Infants swimwear",
+"unspsc",53102900,"Athletic wear",
+"unspsc",53102901,"Womens athletic wear",
+"unspsc",53102902,"Mens athletic wear",
+"unspsc",53102903,"Boys athletic wear",
+"unspsc",53102904,"Girls athletic wear",
+"unspsc",53103000,"Tshirts",
+"unspsc",53103001,"Mens tshirts",
+"unspsc",53103100,"Waistcoats",
+"unspsc",53103101,"Mens waistcoats",
+"unspsc",53110000,"Footwear",
+"unspsc",53111500,"Boots",
+"unspsc",53111501,"Mens boots",
+"unspsc",53111502,"Womens boots",
+"unspsc",53111503,"Boys boots",
+"unspsc",53111504,"Girls boots",
+"unspsc",53111505,"Infants boots",
+"unspsc",53111600,"Shoes",
+"unspsc",53111601,"Mens shoes",
+"unspsc",53111602,"Womens shoes",
+"unspsc",53111603,"Boys shoes",
+"unspsc",53111604,"Girls shoes",
+"unspsc",53111605,"Infants shoes",
+"unspsc",53111700,"Slippers",
+"unspsc",53111701,"Mens slippers",
+"unspsc",53111702,"Womens slippers",
+"unspsc",53111703,"Boys slippers",
+"unspsc",53111704,"Girls slippers",
+"unspsc",53111705,"Infants slippers",
+"unspsc",53111800,"Sandals",
+"unspsc",53111801,"Mens sandals",
+"unspsc",53111802,"Womens sandals",
+"unspsc",53111803,"Boys sandals",
+"unspsc",53111804,"Girls sandals",
+"unspsc",53111805,"Infants sandals",
+"unspsc",53111900,"Athletic footwear",
+"unspsc",53111901,"Mens athletic footwear",
+"unspsc",53111902,"Womens athletic footwear",
+"unspsc",53111903,"Boys athletic footwear",
+"unspsc",53111904,"Girls athletic footwear",
+"unspsc",53111905,"Infants athletic footwear",
+"unspsc",53112000,"Shoe accessories",
+"unspsc",53112001,"Shoehorns",
+"unspsc",53112002,"Shoelaces",
+"unspsc",53112003,"Heel pads",
+"unspsc",53112004,"Shoe stretcher",
+"unspsc",53112005,"Foot measuring device",
+"unspsc",53112100,"Overshoes",
+"unspsc",53112101,"Mens overshoes",
+"unspsc",53112102,"Womens overshoes",
+"unspsc",53112103,"Boys overshoes",
+"unspsc",53112104,"Girls overshoes",
+"unspsc",53112105,"Infants overshoes",
+"unspsc",53120000,"Luggage and handbags and packs and cases",
+"unspsc",53121500,"Luggage",
+"unspsc",53121501,"Garment bags",
+"unspsc",53121502,"Luggage sets",
+"unspsc",53121503,"Individual luggage pieces",
+"unspsc",53121600,"Purses and handbags and bags",
+"unspsc",53121601,"Handbags or purses",
+"unspsc",53121602,"Duffel bags",
+"unspsc",53121603,"Backpacks",
+"unspsc",53121605,"Coin purses",
+"unspsc",53121606,"Lipstick cases",
+"unspsc",53121607,"Cigar case",
+"unspsc",53121608,"Shopping bags",
+"unspsc",53121700,"Business cases",
+"unspsc",53121701,"Briefcases",
+"unspsc",53121702,"Attaches",
+"unspsc",53121704,"Portfolios",
+"unspsc",53121705,"Equipment cases",
+"unspsc",53121706,"Computer bags",
+"unspsc",53121800,"Travel kits and accessories",
+"unspsc",53121801,"Travel kits",
+"unspsc",53121802,"Travel carts",
+"unspsc",53121803,"Garment brushes",
+"unspsc",53121804,"Makeup or manicure cases",
+"unspsc",53130000,"Personal care products",
+"unspsc",53131500,"Dental",
+"unspsc",53131501,"Mouthwash",
+"unspsc",53131502,"Toothpaste",
+"unspsc",53131503,"Toothbrushes",
+"unspsc",53131504,"Dental floss",
+"unspsc",53131505,"Infant soother or pacifier or dummy",
+"unspsc",53131506,"Dental kits",
+"unspsc",53131507,"Toothpicks",
+"unspsc",53131508,"Denture cleaning tablets",
+"unspsc",53131509,"Mouth fresheners",
+"unspsc",53131600,"Bath and body",
+"unspsc",53131601,"Shower caps",
+"unspsc",53131602,"Hair care supplies",
+"unspsc",53131603,"Razors",
+"unspsc",53131604,"Hair combs or brushes",
+"unspsc",53131605,"Vanity kits",
+"unspsc",53131606,"Deodorants",
+"unspsc",53131607,"Hand or body lotions",
+"unspsc",53131608,"Soaps",
+"unspsc",53131609,"Sun protection products",
+"unspsc",53131610,"Eye care supplies",
+"unspsc",53131611,"Shaving creams",
+"unspsc",53131612,"Bath gels",
+"unspsc",53131613,"Skin care products",
+"unspsc",53131614,"Foot care products",
+"unspsc",53131615,"Feminine hygiene products",
+"unspsc",53131616,"Para pharmaceutical creams or lotions",
+"unspsc",53131617,"Manicure implements",
+"unspsc",53131618,"Pedicure implements",
+"unspsc",53131619,"Cosmetics",
+"unspsc",53131620,"Perfumes or colognes or fragrances",
+"unspsc",53131621,"Nail clippers",
+"unspsc",53131622,"Condoms",
+"unspsc",53131623,"Hair removal or depilatory products",
+"unspsc",53131624,"Disposable personal wipes",
+"unspsc",53131625,"Hair or beard nets",
+"unspsc",53131626,"Hand sanitizer",
+"unspsc",53131627,"Hand cleaner",
+"unspsc",53131628,"Shampoos",
+"unspsc",53131629,"Makeup kits",
+"unspsc",53131630,"Lip balm",
+"unspsc",53131631,"Tattoos",
+"unspsc",53131632,"Hot rollers",
+"unspsc",53131633,"Barrettes",
+"unspsc",53131634,"Chemical protection products",
+"unspsc",53131635,"Shaving brushes",
+"unspsc",53131636,"Rose water",
+"unspsc",53131637,"Nursing pads",
+"unspsc",53131638,"Nail polish",
+"unspsc",53140000,"Sewing supplies and accessories",
+"unspsc",53141500,"Sewing fasteners",
+"unspsc",53141501,"Straight pins",
+"unspsc",53141502,"Safety pins",
+"unspsc",53141503,"Zippers",
+"unspsc",53141504,"Buckles",
+"unspsc",53141505,"Buttons",
+"unspsc",53141506,"Snaps",
+"unspsc",53141507,"Clasps",
+"unspsc",53141508,"Garment rivet",
+"unspsc",53141600,"Miscellaneous sewing supplies",
+"unspsc",53141601,"Pin cushions",
+"unspsc",53141602,"Sewing kits",
+"unspsc",53141603,"Thimbles",
+"unspsc",53141604,"Sewing patterns",
+"unspsc",53141605,"Sewing needles",
+"unspsc",53141606,"Bobbins or bobbin holders",
+"unspsc",53141607,"Seam gauge",
+"unspsc",53141608,"Bodkin",
+"unspsc",53141609,"Loop turner",
+"unspsc",53141610,"Fabric or tailors chalk holders",
+"unspsc",53141611,"Fabric markers or fabric pencils or fabric chalk",
+"unspsc",53141612,"Serrated pattern tracing wheel",
+"unspsc",53141613,"Transfer paper",
+"unspsc",53141614,"Tapestry needles",
+"unspsc",53141615,"Weaving needles",
+"unspsc",53141616,"Looper looms",
+"unspsc",53141617,"Cotton jersey loops",
+"unspsc",53141618,"Needlepoint canvas",
+"unspsc",53141619,"Magnet wands",
+"unspsc",53141620,"Seam ripper",
+"unspsc",53141621,"Needle threader",
+"unspsc",53141622,"Dressmakers ruler",
+"unspsc",53141623,"Liquid thread lock or reinforcer",
+"unspsc",53141624,"Cross stitch fabric or needles",
+"unspsc",53141625,"Cross stitch designs",
+"unspsc",53141626,"Embroidery hoops",
+"unspsc",53141627,"Crochet hooks",
+"unspsc",53141628,"Quilters basting tools",
+"unspsc",53141629,"Quilters pins",
+"unspsc",53141630,"Pattern cutting mats or boards",
+"unspsc",54000000,"Timepieces and Jewelry and Gemstone Products",
+"unspsc",54100000,"Jewelry",
+"unspsc",54101500,"Fine jewelry",
+"unspsc",54101501,"Gold or silver or platinum chains",
+"unspsc",54101502,"Fine jewelry necklaces",
+"unspsc",54101503,"Fine jewelry rings",
+"unspsc",54101504,"Fine jewelry earrings",
+"unspsc",54101505,"Fine body jewelry",
+"unspsc",54101506,"Fine jewelry bracelets",
+"unspsc",54101507,"Tiaras",
+"unspsc",54101508,"Fine jewelry ring guards",
+"unspsc",54101509,"Fine jewelry cuff links",
+"unspsc",54101510,"Fine jewelry earring clasps",
+"unspsc",54101511,"Fine jewelry pendants",
+"unspsc",54101512,"Fine jewelry pendant bales",
+"unspsc",54101600,"Imitation jewelry",
+"unspsc",54101601,"Bracelets",
+"unspsc",54101602,"Necklaces",
+"unspsc",54101603,"Rings",
+"unspsc",54101604,"Earrings",
+"unspsc",54101605,"Body jewelry",
+"unspsc",54101700,"Jewelry making tools and supplies",
+"unspsc",54101701,"Pickling compounds",
+"unspsc",54101702,"Dapping punches",
+"unspsc",54101703,"Wire mills",
+"unspsc",54101704,"Jewelry mandrels",
+"unspsc",54101705,"Ring sizers",
+"unspsc",54101706,"Low temperature malleable friendly plastic materials or accessories",
+"unspsc",54110000,"Timepieces",
+"unspsc",54111500,"Watches",
+"unspsc",54111501,"Wrist watches",
+"unspsc",54111502,"Pocket watches",
+"unspsc",54111600,"Clocks",
+"unspsc",54111601,"Wall clocks",
+"unspsc",54111602,"Mantel or table clocks",
+"unspsc",54111603,"Free standing clocks",
+"unspsc",54111604,"Hourglasses",
+"unspsc",54111700,"Watch or clock parts or accessories",
+"unspsc",54111701,"Watch or clock dials",
+"unspsc",54111702,"Watch or clock crystals",
+"unspsc",54111703,"Watch or clock plates or bridges",
+"unspsc",54111704,"Watch straps or bands or bracelets or fobs",
+"unspsc",54111705,"Watch or clock cases",
+"unspsc",54111706,"Watch or clock holders",
+"unspsc",54111707,"Watch or clock case openers",
+"unspsc",54111708,"Watch or clock pendulum",
+"unspsc",54111709,"Watch or clock repair kits",
+"unspsc",54120000,"Gemstones",
+"unspsc",54121500,"Precious stones",
+"unspsc",54121501,"Diamond gemstones",
+"unspsc",54121502,"Emerald gemstones",
+"unspsc",54121503,"Ruby gemstones",
+"unspsc",54121504,"Sapphire gemstones",
+"unspsc",54121600,"Semi precious stones",
+"unspsc",54121601,"Garnet gemstones",
+"unspsc",54121602,"Jade gemstones",
+"unspsc",54121603,"Opal gemstones",
+"unspsc",54121700,"Pearls",
+"unspsc",54121701,"Cultured pearls",
+"unspsc",54121702,"Natural pearls",
+"unspsc",54121800,"Industrial precious and semi precious stones",
+"unspsc",54121801,"Industrial diamonds",
+"unspsc",54121802,"Industrial garnets",
+"unspsc",55000000,"Published Products",
+"unspsc",55100000,"Printed media",
+"unspsc",55101500,"Printed publications",
+"unspsc",55101501,"Charts or maps or atlases",
+"unspsc",55101502,"Directories",
+"unspsc",55101503,"Catalogs",
+"unspsc",55101504,"Newspapers",
+"unspsc",55101505,"Comic books",
+"unspsc",55101506,"Magazines",
+"unspsc",55101507,"Picture or drawing or coloring books for children",
+"unspsc",55101509,"Educational or vocational textbooks",
+"unspsc",55101510,"Leisure reading books",
+"unspsc",55101513,"Trading cards",
+"unspsc",55101514,"Sheet music",
+"unspsc",55101515,"Promotional material or annual reports",
+"unspsc",55101516,"Operation or instruction manuals",
+"unspsc",55101517,"Clearance or dimensional drawings",
+"unspsc",55101518,"Technical diagrams or drawings",
+"unspsc",55101519,"Periodicals",
+"unspsc",55101520,"Instruction sheets or booklets",
+"unspsc",55101521,"Owner or user manuals",
+"unspsc",55101522,"Terrestrial or celestial globes",
+"unspsc",55101523,"Exercise books",
+"unspsc",55101524,"Reference books",
+"unspsc",55101525,"Encyclopedias",
+"unspsc",55101526,"Dictionaries",
+"unspsc",55101527,"Song Books",
+"unspsc",55101528,"Religious books",
+"unspsc",55110000,"Electronic reference material",
+"unspsc",55111500,"Electronic publications and music",
+"unspsc",55111501,"Electronic directories",
+"unspsc",55111502,"Electronic dictionaries",
+"unspsc",55111503,"Electronic encyclopedias",
+"unspsc",55111504,"Electronic catalogs",
+"unspsc",55111505,"Books on tape or compact disc",
+"unspsc",55111506,"Electronic magazines",
+"unspsc",55111507,"Electronic newspapers",
+"unspsc",55111508,"Electronic charts or maps or atlases",
+"unspsc",55111509,"Background music",
+"unspsc",55111510,"Motion pictures on celluloid",
+"unspsc",55111511,"Motion pictures on video tape",
+"unspsc",55111512,"Music on tape or compact disc",
+"unspsc",55111513,"Electronic educational or vocational texts",
+"unspsc",55111514,"Motion pictures on digital video disk DVD",
+"unspsc",55111600,"Electronic software reference material",
+"unspsc",55111601,"Electronic software documentation or user manuals",
+"unspsc",55120000,"Signage and accessories",
+"unspsc",55121500,"Tags",
+"unspsc",55121501,"Luggage tags",
+"unspsc",55121502,"Security tags",
+"unspsc",55121503,"Identification tags",
+"unspsc",55121504,"Key tags",
+"unspsc",55121505,"Tag holders or accessories",
+"unspsc",55121506,"Price tags",
+"unspsc",55121600,"Labels",
+"unspsc",55121601,"Label removing kits",
+"unspsc",55121602,"Clothing labels",
+"unspsc",55121604,"Canning or bottling labels",
+"unspsc",55121605,"Addressing or mailing labels",
+"unspsc",55121606,"Self adhesive labels",
+"unspsc",55121607,"Decals",
+"unspsc",55121608,"Bar code labels",
+"unspsc",55121609,"Packaging labels",
+"unspsc",55121610,"Consecutively numbered labels",
+"unspsc",55121611,"Label making tapes",
+"unspsc",55121612,"Printer labels",
+"unspsc",55121613,"Color coding labels",
+"unspsc",55121614,"Removable labels",
+"unspsc",55121615,"Adhesive dots or arrows",
+"unspsc",55121616,"Self adhesive flags",
+"unspsc",55121617,"Label protectors",
+"unspsc",55121618,"Label holders",
+"unspsc",55121619,"Non adhesive labels",
+"unspsc",55121620,"Multipurpose labels",
+"unspsc",55121621,"Notary seals",
+"unspsc",55121700,"Signage",
+"unspsc",55121701,"Metallic nameplates",
+"unspsc",55121702,"Non metallic nameplates",
+"unspsc",55121703,"Illuminated signs",
+"unspsc",55121704,"Safety signs",
+"unspsc",55121705,"Self adhesive signs",
+"unspsc",55121706,"Banners",
+"unspsc",55121707,"Magnetic signs",
+"unspsc",55121708,"Neon signs",
+"unspsc",55121709,"Moving message signs",
+"unspsc",55121710,"Traffic signs",
+"unspsc",55121711,"Billboards",
+"unspsc",55121712,"Directional signs",
+"unspsc",55121713,"Point of purchase signs",
+"unspsc",55121714,"Pennants",
+"unspsc",55121715,"Flags or accessories",
+"unspsc",55121716,"Wooden signs",
+"unspsc",55121717,"Marker plates",
+"unspsc",55121718,"Informational signs",
+"unspsc",55121719,"Signalling components",
+"unspsc",55121720,"Emblems",
+"unspsc",55121721,"Signage characters",
+"unspsc",55121722,"Flagpoles or parts or accessories",
+"unspsc",55121723,"Sign holders or stands",
+"unspsc",55121724,"Flag stands",
+"unspsc",55121725,"Signage kits",
+"unspsc",55121726,"Identification panels",
+"unspsc",55121727,"Title boards",
+"unspsc",55121728,"Signage covers",
+"unspsc",55121729,"Tokens",
+"unspsc",55121730,"Casualty signs",
+"unspsc",55121731,"Identification markers",
+"unspsc",55121732,"Sizing donuts",
+"unspsc",55121800,"Identification documents",
+"unspsc",55121801,"Car tax discs",
+"unspsc",55121802,"Identification cards or bands or similar products",
+"unspsc",55121803,"Passports",
+"unspsc",55121804,"Badges or badge holders",
+"unspsc",55121806,"Personnel identification band kits or accessories",
+"unspsc",55121807,"Identification product holders or accessories",
+"unspsc",56000000,"Furniture and Furnishings",
+"unspsc",56100000,"Accommodation furniture",
+"unspsc",56101500,"Furniture",
+"unspsc",56101501,"Stands",
+"unspsc",56101502,"Sofas",
+"unspsc",56101503,"Coat racks",
+"unspsc",56101504,"Chairs",
+"unspsc",56101505,"Entertainment centers",
+"unspsc",56101506,"Futons",
+"unspsc",56101507,"Bookcases",
+"unspsc",56101508,"Mattresses or sleep sets",
+"unspsc",56101509,"Dressers or armoires",
+"unspsc",56101510,"Partitions",
+"unspsc",56101513,"Cots or accessories",
+"unspsc",56101514,"Foot stools",
+"unspsc",56101515,"Beds",
+"unspsc",56101516,"Chests",
+"unspsc",56101518,"Wall racks",
+"unspsc",56101519,"Tables",
+"unspsc",56101520,"Lockers",
+"unspsc",56101521,"Bed headboard or footboard",
+"unspsc",56101522,"Arm chair",
+"unspsc",56101523,"Umbrella holders or stands",
+"unspsc",56101524,"Ironing boards",
+"unspsc",56101525,"Ironing board covers",
+"unspsc",56101526,"Fridge bar",
+"unspsc",56101527,"Household type linen driers",
+"unspsc",56101528,"Artificial plants",
+"unspsc",56101529,"Magazine racks",
+"unspsc",56101530,"Storage cabinets",
+"unspsc",56101531,"Shoe racks",
+"unspsc",56101532,"Furniture set",
+"unspsc",56101533,"Armrests",
+"unspsc",56101535,"Furniture carts",
+"unspsc",56101536,"Instrument tripods",
+"unspsc",56101537,"Dressing tables",
+"unspsc",56101538,"Dining servers or buffets",
+"unspsc",56101539,"Bedframes or parts or accessories",
+"unspsc",56101540,"Apparel costumers",
+"unspsc",56101541,"Mattress ventilators",
+"unspsc",56101600,"Outdoor furniture",
+"unspsc",56101601,"Outdoor umbrellas",
+"unspsc",56101602,"Outdoor chairs",
+"unspsc",56101603,"Outdoor tables or picnic tables",
+"unspsc",56101604,"Outdoor swings",
+"unspsc",56101605,"Outdoor benches",
+"unspsc",56101606,"Flower stands",
+"unspsc",56101607,"Outside clothes dryer",
+"unspsc",56101608,"Bicycle racks",
+"unspsc",56101700,"Office furniture",
+"unspsc",56101701,"Credenzas",
+"unspsc",56101702,"Filing cabinets or accesories",
+"unspsc",56101703,"Desks",
+"unspsc",56101704,"Table base",
+"unspsc",56101705,"Showcases",
+"unspsc",56101706,"Conferencing tables",
+"unspsc",56101707,"Drafting tables",
+"unspsc",56101708,"Mobile files",
+"unspsc",56101710,"Projector stands or carts",
+"unspsc",56101711,"Modular furniture connectors",
+"unspsc",56101712,"Pedestals",
+"unspsc",56101713,"Desk returns",
+"unspsc",56101714,"Data binder racks",
+"unspsc",56101715,"Mail sorters or organizers",
+"unspsc",56101716,"Desktop organizer hutches",
+"unspsc",56101717,"Table risers",
+"unspsc",56101800,"Baby and toddler furniture and accessories",
+"unspsc",56101803,"Carriages or perambulators or strollers",
+"unspsc",56101804,"Cribs or playpens or accessories",
+"unspsc",56101805,"Car seats",
+"unspsc",56101806,"High chairs or accessories",
+"unspsc",56101807,"Bouncer seats or jumpers",
+"unspsc",56101808,"Swings or jumpers or accessories",
+"unspsc",56101809,"Potty seats",
+"unspsc",56101810,"Baby baths or tubs",
+"unspsc",56101811,"Bassinets or cradles",
+"unspsc",56101812,"Changing tables or accessories",
+"unspsc",56101813,"Bath seats",
+"unspsc",56101900,"General furniture parts and accessories",
+"unspsc",56101901,"Furniture tops or work surfaces",
+"unspsc",56101902,"Furniture moving discs",
+"unspsc",56101903,"Furniture glides or cups or pads",
+"unspsc",56101904,"Furniture bases or legs or leg extensions",
+"unspsc",56101905,"Panel assemblies or sections",
+"unspsc",56101906,"Table extension leafs",
+"unspsc",56101907,"Slip covers",
+"unspsc",56110000,"Commercial and industrial furniture",
+"unspsc",56111500,"Workstations and office packages",
+"unspsc",56111501,"Modular reception office packages",
+"unspsc",56111502,"Casegood or non modular executive office packages",
+"unspsc",56111503,"Modular executive office packages",
+"unspsc",56111504,"Casegood or non modular managerial office packages",
+"unspsc",56111505,"Modular managerial office packages",
+"unspsc",56111506,"Casegood or non modular staff office packages",
+"unspsc",56111507,"Modular staff office packages",
+"unspsc",56111508,"Casegood or non modular technical office packages",
+"unspsc",56111509,"Modular technical office packages",
+"unspsc",56111510,"Casegood or non modular clerical office packages",
+"unspsc",56111511,"Modular clerical office packages",
+"unspsc",56111512,"Casegood or non modular reception office packages",
+"unspsc",56111513,"Conference or non modular room packages",
+"unspsc",56111514,"Modular counter office packages",
+"unspsc",56111600,"Panel systems",
+"unspsc",56111601,"Screens for panel systems",
+"unspsc",56111602,"Storage for panel systems",
+"unspsc",56111603,"Organization for panel systems",
+"unspsc",56111604,"Work surfaces for panel systems",
+"unspsc",56111605,"Lighting or power or data components for panel systems",
+"unspsc",56111606,"Parts or accessories panel systems",
+"unspsc",56111700,"Casegood and non modular systems",
+"unspsc",56111701,"Casegood  or non modular desk",
+"unspsc",56111702,"Casegood or non modular credenza",
+"unspsc",56111703,"Casegood or non modular storage",
+"unspsc",56111704,"Casegood or non modular organization",
+"unspsc",56111705,"Casegood or non modular lighting or power or data components",
+"unspsc",56111706,"Casegood or non modular parts or accessories",
+"unspsc",56111707,"Casegood or non modular shelf",
+"unspsc",56111800,"Freestanding furniture",
+"unspsc",56111801,"Freestanding lighting or power or data components",
+"unspsc",56111802,"Freestanding tables",
+"unspsc",56111803,"Freestanding storage",
+"unspsc",56111804,"Freestanding organization",
+"unspsc",56111805,"Freestanding parts or accessories",
+"unspsc",56111900,"Industrial furniture",
+"unspsc",56111901,"Industrial lighting or power or data components",
+"unspsc",56111902,"Industrial work surfaces",
+"unspsc",56111903,"Industrial storage units",
+"unspsc",56111904,"Industrial organization",
+"unspsc",56111905,"Industrial parts or accessories",
+"unspsc",56111906,"Industrial cabinets or drawers or shelving",
+"unspsc",56111907,"Industrial tool carts",
+"unspsc",56112000,"Computer support furniture",
+"unspsc",56112001,"Computer support lighting or power or data components",
+"unspsc",56112002,"Computer support work surfaces",
+"unspsc",56112003,"Computer support storage accessories",
+"unspsc",56112004,"Computer support organization",
+"unspsc",56112005,"Computer support parts or accessories",
+"unspsc",56112100,"Seating",
+"unspsc",56112101,"Auditorium or stadium or special use seating",
+"unspsc",56112102,"Task seating",
+"unspsc",56112103,"Guest seating",
+"unspsc",56112104,"Executive seating",
+"unspsc",56112105,"Lounge seating",
+"unspsc",56112106,"Stool seating",
+"unspsc",56112107,"Seating parts or accessories",
+"unspsc",56112108,"Combination chair with desk",
+"unspsc",56112109,"Benches",
+"unspsc",56112110,"Musician seating",
+"unspsc",56112200,"Desking systems",
+"unspsc",56112201,"Desk based screens",
+"unspsc",56112202,"Desk storage components",
+"unspsc",56112203,"Desking organizational components",
+"unspsc",56112204,"Worksurfaces",
+"unspsc",56112205,"Lighting, power or data components",
+"unspsc",56112206,"Desking systems related parts and accessories",
+"unspsc",56120000,"Classroom and instructional and institutional furniture and fixtures",
+"unspsc",56121000,"Library furnishings",
+"unspsc",56121001,"Book carts or book trucks",
+"unspsc",56121002,"Circulation or librarian desks or components",
+"unspsc",56121003,"Book returns",
+"unspsc",56121004,"Card catalog units",
+"unspsc",56121005,"Dictionary stands",
+"unspsc",56121006,"Upholstered benches",
+"unspsc",56121007,"Public access tables",
+"unspsc",56121008,"Book browser units",
+"unspsc",56121009,"Sloped reading tables",
+"unspsc",56121010,"Book kiosks",
+"unspsc",56121011,"Library compact disc or audio cassette displayers",
+"unspsc",56121012,"Rotary island stands",
+"unspsc",56121014,"Hang up bag racks or bags",
+"unspsc",56121100,"Art classroom furnishings",
+"unspsc",56121101,"Art horse",
+"unspsc",56121102,"Art student bench",
+"unspsc",56121200,"First aid room furnishings",
+"unspsc",56121201,"First aid couches",
+"unspsc",56121300,"General educational facility fixtures",
+"unspsc",56121301,"Standing risers",
+"unspsc",56121302,"Table or chair movers or caddys",
+"unspsc",56121303,"Rubber brush floor matting",
+"unspsc",56121304,"Planning tables",
+"unspsc",56121400,"Cafeteria and lunchroom furnishings",
+"unspsc",56121401,"Mobile bench tables",
+"unspsc",56121402,"Mobile stool tables",
+"unspsc",56121403,"Mobile tables",
+"unspsc",56121500,"General classroom furnishings",
+"unspsc",56121501,"Activity tables",
+"unspsc",56121502,"Classroom chairs",
+"unspsc",56121503,"Classroom benches",
+"unspsc",56121504,"Classroom stools",
+"unspsc",56121505,"Classroom tables",
+"unspsc",56121506,"Student desks",
+"unspsc",56121507,"Study carrels",
+"unspsc",56121508,"Student computer desks",
+"unspsc",56121509,"Student computer tables",
+"unspsc",56121600,"Creative play and rest time furnishings for daycare and early childhood facilities",
+"unspsc",56121601,"Toddler or child size living room sets",
+"unspsc",56121602,"Toddler or child size sofas",
+"unspsc",56121603,"Toddler or child size easy chairs",
+"unspsc",56121604,"Toddler or child size bean bag chairs",
+"unspsc",56121605,"Low rise room dividers or play panels",
+"unspsc",56121606,"Childs rest mats",
+"unspsc",56121607,"Childs rest mat racks or holders",
+"unspsc",56121608,"Childrens cots",
+"unspsc",56121609,"Childrens cot carriers",
+"unspsc",56121610,"Childrens cot activity systems",
+"unspsc",56121700,"Book and general storage units for classrooms",
+"unspsc",56121701,"General storage units",
+"unspsc",56121702,"Book storage units",
+"unspsc",56121703,"Cubbie units",
+"unspsc",56121704,"Institutional Storage Cabinets",
+"unspsc",56121800,"Vocational classroom furnishings and fixtures",
+"unspsc",56121801,"Technical education tool storage cabinets or cabinets with tools",
+"unspsc",56121802,"General shop tool storage cabinets or cabinets with tools",
+"unspsc",56121803,"Woodworking tool storage cabinets or cabinets with tools",
+"unspsc",56121804,"Instructors technical desk",
+"unspsc",56121805,"Flat files",
+"unspsc",56121900,"Demonstration furnishings",
+"unspsc",56121901,"Sewing machine demonstrator tables",
+"unspsc",56122000,"Laboratory furniture",
+"unspsc",56122001,"Laboratory benches",
+"unspsc",56122002,"Laboratory storage units or accessories",
+"unspsc",56122003,"Laboratory workstations",
+"unspsc",56122004,"Sink base units",
+"unspsc",60000000,"Musical Instruments and Games and Toys and Arts and Crafts and Educational Equipment and Materials and Accessories and Supplies",
+"unspsc",60100000,"Developmental and professional teaching aids and materials and accessories and supplies",
+"unspsc",60101000,"Math kits",
+"unspsc",60101001,"Addition math kits",
+"unspsc",60101002,"Division math kits",
+"unspsc",60101003,"Fraction math kits",
+"unspsc",60101004,"Middle school math kits",
+"unspsc",60101005,"Early childhood math kits",
+"unspsc",60101006,"Measurement math kits",
+"unspsc",60101007,"Multiplication math kits",
+"unspsc",60101008,"Elementary math kits",
+"unspsc",60101009,"Subtraction math kits",
+"unspsc",60101010,"High school math kits",
+"unspsc",60101100,"Electronic learning aids",
+"unspsc",60101101,"Electronic card readers",
+"unspsc",60101102,"Curriculum based electronic learning aids",
+"unspsc",60101103,"Electronic globes",
+"unspsc",60101104,"Electronic quiz machines",
+"unspsc",60101200,"Educational incentives",
+"unspsc",60101201,"Bible based chart stickers",
+"unspsc",60101202,"Bible based incentive charts",
+"unspsc",60101203,"Incentive chart stickers",
+"unspsc",60101204,"Incentive charts",
+"unspsc",60101205,"Incentive punchcards",
+"unspsc",60101300,"Educational stickers and supplies",
+"unspsc",60101301,"Bible based stickers",
+"unspsc",60101302,"Giant stickers",
+"unspsc",60101304,"Photo stickers",
+"unspsc",60101305,"Reward stickers",
+"unspsc",60101306,"Scented stickers",
+"unspsc",60101307,"Shape stickers",
+"unspsc",60101308,"Sparkle stickers",
+"unspsc",60101309,"Reward star stickers",
+"unspsc",60101310,"Sticker assortments",
+"unspsc",60101311,"Sticker books",
+"unspsc",60101312,"Sticker boxes",
+"unspsc",60101313,"Tattoo stickers",
+"unspsc",60101314,"Addition flash cards",
+"unspsc",60101315,"All facts flash cards",
+"unspsc",60101316,"Blank flash cards",
+"unspsc",60101317,"Division flash cards",
+"unspsc",60101318,"Electronic flash cards",
+"unspsc",60101319,"Equivalent flash cards",
+"unspsc",60101320,"Fraction flash cards",
+"unspsc",60101321,"Greater than or less than flash cards",
+"unspsc",60101322,"Multiplication flash cards",
+"unspsc",60101323,"Subtraction flash cards",
+"unspsc",60101324,"Alphabet flash cards",
+"unspsc",60101325,"Word building flash cards",
+"unspsc",60101326,"Phonics flash cards",
+"unspsc",60101327,"Handwriting or writing flash cards",
+"unspsc",60101328,"Number flash cards",
+"unspsc",60101329,"Money flash cards",
+"unspsc",60101330,"Time flash cards",
+"unspsc",60101331,"State flash cards",
+"unspsc",60101400,"Classroom awards",
+"unspsc",60101401,"Badges",
+"unspsc",60101402,"Award buttons",
+"unspsc",60101403,"Celebration crowns",
+"unspsc",60101404,"Reward jewelry",
+"unspsc",60101405,"Classroom ribbons or rosettes",
+"unspsc",60101600,"Educational certificates or diplomas",
+"unspsc",60101601,"Bible based certificates",
+"unspsc",60101602,"Blank certificates",
+"unspsc",60101603,"Certificate frames",
+"unspsc",60101604,"Certificate holders",
+"unspsc",60101605,"Certificate ribbons",
+"unspsc",60101606,"Diplomas",
+"unspsc",60101607,"Foreign language certificates",
+"unspsc",60101608,"General praise certificates",
+"unspsc",60101609,"Grade specific certificates",
+"unspsc",60101610,"Subject specific certificates",
+"unspsc",60101700,"Teacher resource materials",
+"unspsc",60101701,"Assessment resource books",
+"unspsc",60101702,"Calendars or cut outs",
+"unspsc",60101703,"Character education resource materials",
+"unspsc",60101704,"Classroom activity books",
+"unspsc",60101705,"Critical thinking resource materials",
+"unspsc",60101706,"Cross curriculum guides",
+"unspsc",60101707,"Curriculum guides",
+"unspsc",60101708,"Fabric charts",
+"unspsc",60101709,"Flannel board aids",
+"unspsc",60101710,"Educator gifts",
+"unspsc",60101711,"Grading stamps",
+"unspsc",60101712,"Hall passes",
+"unspsc",60101713,"Home education resource materials",
+"unspsc",60101714,"Homework assignment resources",
+"unspsc",60101715,"Idea books",
+"unspsc",60101716,"Magnetic board aids",
+"unspsc",60101717,"Name plates or tags",
+"unspsc",60101718,"Teacher plan books",
+"unspsc",60101719,"Pocket charts",
+"unspsc",60101720,"Teacher communication postcards",
+"unspsc",60101721,"Professional teacher resource books",
+"unspsc",60101722,"Teacher classroom grading books",
+"unspsc",60101723,"Classroom student seating charts",
+"unspsc",60101724,"Substitute teacher folders or forms",
+"unspsc",60101725,"Technology activity or resource books",
+"unspsc",60101726,"Technology reference guides",
+"unspsc",60101727,"Test taking resource materials",
+"unspsc",60101728,"Theme unit resource materials",
+"unspsc",60101729,"Middle or junior school teaching kits",
+"unspsc",60101730,"Laboratory manuals",
+"unspsc",60101731,"Sentence strips or rolls",
+"unspsc",60101732,"Pointing sticks",
+"unspsc",60101800,"Church school educational resources",
+"unspsc",60101801,"Bible reference guides",
+"unspsc",60101802,"Bible based dramas",
+"unspsc",60101803,"Bible based resource or activity books",
+"unspsc",60101804,"Sunday school activity resource books",
+"unspsc",60101805,"Vacation bible school resources",
+"unspsc",60101806,"Holy emblems or symbols",
+"unspsc",60101807,"Prayer beads",
+"unspsc",60101808,"Prayer wheels",
+"unspsc",60101809,"Religious product kits or supplies",
+"unspsc",60101810,"Patens",
+"unspsc",60101811,"Vestments",
+"unspsc",60101900,"Alphabet skills materials and resources",
+"unspsc",60101901,"Alphabet activity books",
+"unspsc",60101902,"Alphabet cubes",
+"unspsc",60101903,"Alphabet desk tapes",
+"unspsc",60101904,"Alphabet kits",
+"unspsc",60101905,"Alphabet letter tiles",
+"unspsc",60101906,"Alphabet poster cards",
+"unspsc",60101907,"Alphabet reference guides",
+"unspsc",60101908,"Alphabet resource books",
+"unspsc",60101909,"Alphabet stamps",
+"unspsc",60101910,"Alphabet wall cards",
+"unspsc",60101911,"Tactile alphabets",
+"unspsc",60102000,"Word building resource materials and accessories",
+"unspsc",60102001,"Speech mirror",
+"unspsc",60102002,"Spelling resource materials",
+"unspsc",60102003,"Word building activity books",
+"unspsc",60102004,"Word building kits",
+"unspsc",60102005,"Word building resource books",
+"unspsc",60102006,"Word building tiles",
+"unspsc",60102007,"Word walls",
+"unspsc",60102100,"Language arts resource materials",
+"unspsc",60102101,"Adjective resource books",
+"unspsc",60102102,"Adverb resource books",
+"unspsc",60102103,"Grammar resource books",
+"unspsc",60102104,"Noun resource books",
+"unspsc",60102105,"Punctuation resource books",
+"unspsc",60102106,"Verb resource books",
+"unspsc",60102200,"Phonics resource materials and accessories",
+"unspsc",60102201,"Phonics activity books",
+"unspsc",60102202,"Phonics drill cards",
+"unspsc",60102203,"Phonics kit",
+"unspsc",60102204,"Phonics picture cards",
+"unspsc",60102205,"Phonics resource books",
+"unspsc",60102206,"Phonics tiles",
+"unspsc",60102300,"Reading books and resources",
+"unspsc",60102301,"Reading activity books",
+"unspsc",60102302,"Beginning reading books",
+"unspsc",60102303,"Bible based childrens literature books",
+"unspsc",60102304,"Childrens literature books",
+"unspsc",60102305,"Critical reading skills",
+"unspsc",60102306,"Flannel boards",
+"unspsc",60102307,"Poetry resource books",
+"unspsc",60102308,"Reading comprehension materials",
+"unspsc",60102309,"Reading development materials or kits",
+"unspsc",60102310,"Reading resource books",
+"unspsc",60102311,"Reading thematic units",
+"unspsc",60102312,"Vocabulary activity or resource books",
+"unspsc",60102400,"Early learning math and counting resources and accessories",
+"unspsc",60102401,"Abacus or counting frames",
+"unspsc",60102402,"Activity or resource books for working with early math manipulatives",
+"unspsc",60102403,"Activity cards for working with early math manipulatives",
+"unspsc",60102404,"Beads or bead activity sets for early math",
+"unspsc",60102405,"Counters or counter activity sets for early math",
+"unspsc",60102406,"Counting or sorting trays or bowls for early math",
+"unspsc",60102407,"Laces or lacing sets for early math",
+"unspsc",60102408,"Linking manipulatives or linking activity sets for early math",
+"unspsc",60102409,"Math game chips or tokens",
+"unspsc",60102410,"Number cards",
+"unspsc",60102411,"Number forms models or accessories",
+"unspsc",60102412,"Pegboards for early math",
+"unspsc",60102413,"Pegs for early math",
+"unspsc",60102414,"Sorting manipulatives or sorting activity sets for early math",
+"unspsc",60102500,"Basic math operations and numeration resources and materials",
+"unspsc",60102501,"Addition activity or resource books",
+"unspsc",60102502,"Basic operations models",
+"unspsc",60102503,"Basic operations reference guides",
+"unspsc",60102504,"Division activity or resource books",
+"unspsc",60102505,"Multiplication activity or resource books",
+"unspsc",60102506,"Subtraction activity or resource books",
+"unspsc",60102507,"Number desk tapes",
+"unspsc",60102508,"Hundreds charts or boards",
+"unspsc",60102509,"Hundreds number tiles",
+"unspsc",60102510,"Number kits",
+"unspsc",60102511,"Number lines",
+"unspsc",60102512,"Numeration activity or resource books",
+"unspsc",60102513,"Dominoes",
+"unspsc",60102600,"Probability or chance or data or problem solving teacher resource materials",
+"unspsc",60102601,"Two sided counters or tokens",
+"unspsc",60102602,"Spinners",
+"unspsc",60102603,"Dice sets",
+"unspsc",60102604,"Probability activity or resource books",
+"unspsc",60102605,"Logic activity or resource books",
+"unspsc",60102606,"Attribute blocks",
+"unspsc",60102607,"Attribute blocks activity cards",
+"unspsc",60102608,"Attribute activity or resource books",
+"unspsc",60102609,"Graphing mat",
+"unspsc",60102610,"Graphing activity or resource books",
+"unspsc",60102611,"Logic games",
+"unspsc",60102612,"Attribute sets or kits",
+"unspsc",60102613,"Problem solving activity or resource books",
+"unspsc",60102614,"Problem solving activity cards",
+"unspsc",60102700,"Patterning or matching or spatial perception or logical thinking teacher resource materials",
+"unspsc",60102701,"Pattern blocks or parquetry blocks activity or resource books",
+"unspsc",60102702,"Pattern blocks",
+"unspsc",60102703,"Pattern block activity or pattern cards",
+"unspsc",60102704,"Pattern block games or activity sets",
+"unspsc",60102705,"Pattern block stickers",
+"unspsc",60102706,"Pattern blocks mirror",
+"unspsc",60102707,"Pattern blocks charts or posters",
+"unspsc",60102708,"Parquetry blocks",
+"unspsc",60102709,"Parquetry blocks activity or pattern cards",
+"unspsc",60102710,"Parquetry blocks activity sets",
+"unspsc",60102711,"Tangrams activity or resource books",
+"unspsc",60102712,"Tangram activity or pattern cards",
+"unspsc",60102713,"Tangram puzzle activity sets",
+"unspsc",60102714,"Tangrams puzzles",
+"unspsc",60102715,"Pentominoes activity and resource books",
+"unspsc",60102717,"Pentominoes",
+"unspsc",60102718,"Pentominoes activity sets",
+"unspsc",60102800,"Base ten and place value teacher resource materials",
+"unspsc",60102801,"Base ten blocks",
+"unspsc",60102802,"Base ten or place value activity or resource books",
+"unspsc",60102803,"Base ten or place value activity cards",
+"unspsc",60102804,"Base ten rubber stamps",
+"unspsc",60102805,"Place value grids",
+"unspsc",60102806,"Place value games or activity sets",
+"unspsc",60102807,"Place value models or accessories",
+"unspsc",60102900,"Money and time teacher resource materials",
+"unspsc",60102901,"Money activity or resource books",
+"unspsc",60102902,"Bulk bills for the classroom",
+"unspsc",60102903,"Bulk coins for the classroom",
+"unspsc",60102904,"Coin cubes or dice",
+"unspsc",60102905,"Magnetic money",
+"unspsc",60102906,"Overhead bills",
+"unspsc",60102907,"Overhead coins",
+"unspsc",60102908,"Money puzzles",
+"unspsc",60102909,"Money rubber stamps",
+"unspsc",60102910,"Coin bank",
+"unspsc",60102911,"Money games or kits",
+"unspsc",60102912,"Play cash registers",
+"unspsc",60102913,"Money reference guides",
+"unspsc",60102914,"Time activity or resource books",
+"unspsc",60102915,"Time rubber stamps",
+"unspsc",60102916,"Time kits",
+"unspsc",60102917,"Time reference guides",
+"unspsc",60103000,"Fractions and pentominoes and decimals teaching aids",
+"unspsc",60103001,"Fraction circles or squares",
+"unspsc",60103002,"Decimal squares",
+"unspsc",60103003,"Fraction activity books",
+"unspsc",60103004,"Fraction bars",
+"unspsc",60103005,"Fraction charts",
+"unspsc",60103006,"Fraction dice",
+"unspsc",60103007,"Fraction games",
+"unspsc",60103008,"Fraction kits",
+"unspsc",60103009,"Fraction tiles",
+"unspsc",60103010,"Fractions discs",
+"unspsc",60103012,"Pentominoes activity book",
+"unspsc",60103013,"Pentominoes pattern cards",
+"unspsc",60103100,"Geometry teacher resource materials",
+"unspsc",60103101,"Geometry activity or resource books",
+"unspsc",60103102,"Geometry charts or posters",
+"unspsc",60103103,"Geoboards",
+"unspsc",60103104,"Geometric construction sets",
+"unspsc",60103105,"Double sided geoboards",
+"unspsc",60103106,"Geoboard games or activity kits",
+"unspsc",60103107,"Geoboard rubber bands",
+"unspsc",60103108,"Geoboards activity cards",
+"unspsc",60103109,"Geometric chalkboard drawing instruments",
+"unspsc",60103110,"Geometry reference guides",
+"unspsc",60103111,"GeoMirror",
+"unspsc",60103112,"Geometric solids models",
+"unspsc",60103200,"Algebra teacher resource materials",
+"unspsc",60103201,"Algebra activity or resource books",
+"unspsc",60103202,"Centimeter cubes",
+"unspsc",60103203,"Algebra or pre algebra reference guides",
+"unspsc",60103204,"Algebra models or accessories",
+"unspsc",60103300,"Precalculus and calculus teacher resource materials",
+"unspsc",60103301,"Calculus activity or resources books",
+"unspsc",60103302,"Precalculus or calculus reference guides",
+"unspsc",60103303,"Precalculus activity or resource books",
+"unspsc",60103400,"Geography and map skills resources and accessories",
+"unspsc",60103401,"Geography charts or posters",
+"unspsc",60103402,"Continents activity or resource books",
+"unspsc",60103403,"Electronic social studies learning aids",
+"unspsc",60103404,"Geography reference guides",
+"unspsc",60103405,"Map racks",
+"unspsc",60103406,"Map stencil kits",
+"unspsc",60103407,"Portable wall maps",
+"unspsc",60103408,"Geography resource or activity books",
+"unspsc",60103409,"Map measurers",
+"unspsc",60103410,"Map teaching aids or materials",
+"unspsc",60103500,"Political science",
+"unspsc",60103501,"Economics activity or resource books",
+"unspsc",60103502,"Government activity or resource books",
+"unspsc",60103503,"Government reference guides",
+"unspsc",60103504,"State theme units",
+"unspsc",60103600,"Multicultural activities and resources",
+"unspsc",60103601,"Ancient civilizations resources",
+"unspsc",60103602,"Customs or rituals or traditions resources",
+"unspsc",60103603,"Ethnic diversity resources",
+"unspsc",60103604,"Genealogy resources",
+"unspsc",60103605,"Multicultural holidays resources",
+"unspsc",60103606,"Multicultural theme units",
+"unspsc",60103700,"Foreign languages resources",
+"unspsc",60103701,"Resources for learning to speak Spanish",
+"unspsc",60103702,"Resources for learning to speak French",
+"unspsc",60103703,"Resources for learning to speak German",
+"unspsc",60103704,"Resources for learning to speak English",
+"unspsc",60103705,"Resources for learning to speak Latin",
+"unspsc",60103706,"Resources for learning to speak Italian",
+"unspsc",60103800,"History teaching resources",
+"unspsc",60103801,"African history resource books",
+"unspsc",60103802,"History charts or posters",
+"unspsc",60103803,"European history resource books",
+"unspsc",60103804,"Historical maps",
+"unspsc",60103805,"History theme units",
+"unspsc",60103806,"History photo cards",
+"unspsc",60103807,"History resource books",
+"unspsc",60103808,"Womans history resources",
+"unspsc",60103809,"World history resources",
+"unspsc",60103900,"Living organisms and preserved specimens and related materials",
+"unspsc",60103903,"Amphibia models",
+"unspsc",60103904,"Fungi cultures",
+"unspsc",60103905,"Culture kits or supplies",
+"unspsc",60103906,"Protozoan cultures",
+"unspsc",60103907,"Aquaria plants",
+"unspsc",60103908,"Terrarium plants",
+"unspsc",60103909,"Live invertebrates",
+"unspsc",60103911,"Live vertebrates",
+"unspsc",60103915,"Dissection kits or supplies",
+"unspsc",60103916,"Preserved embryos",
+"unspsc",60103918,"Biospheres",
+"unspsc",60103919,"Biology experiment kits or supplies",
+"unspsc",60103920,"Staining kits or supplies",
+"unspsc",60103921,"Preserved life cycle specimens",
+"unspsc",60103922,"Biology reference guides",
+"unspsc",60103923,"Skeleton or bone or shell specimen",
+"unspsc",60103924,"Biology resource or activity books",
+"unspsc",60103925,"Biology study or activity kits",
+"unspsc",60103926,"Biology charts or posters",
+"unspsc",60103927,"Preserved plant body or organ specimens",
+"unspsc",60103928,"Biology activity or photo cards",
+"unspsc",60103929,"Plant life cycle specimens",
+"unspsc",60103930,"Combination organism specimens",
+"unspsc",60103931,"Animal body or body part or organ specimens",
+"unspsc",60103932,"Ecosystem displays",
+"unspsc",60103933,"Human body or body part or organ specimens",
+"unspsc",60103934,"Tissue cultures",
+"unspsc",60103936,"Anatomy charts or sets",
+"unspsc",60104000,"Biotechnology and bio chemistry and genetics and microbiology and related materials",
+"unspsc",60104001,"Deoxyribonucleic acid DNA models",
+"unspsc",60104002,"Deoxyribonucleic acid DNA experiment kits",
+"unspsc",60104003,"Genetics books",
+"unspsc",60104004,"Genetics kits",
+"unspsc",60104005,"Bacteria teaching kits",
+"unspsc",60104006,"Bacteria testing supplies",
+"unspsc",60104007,"Enzymology kits or supplies",
+"unspsc",60104008,"Protein testing kits or supplies",
+"unspsc",60104100,"Body systems and related materials",
+"unspsc",60104101,"Human body or body part or organ models",
+"unspsc",60104102,"Cell models",
+"unspsc",60104103,"Cell teaching kits",
+"unspsc",60104104,"Body systems teaching kits",
+"unspsc",60104105,"Body systems teaching aids",
+"unspsc",60104106,"Plant body or body part or organ models",
+"unspsc",60104107,"Animal body or body part or organ models",
+"unspsc",60104200,"Water testing and conservation and ecology",
+"unspsc",60104201,"Water testing chemicals",
+"unspsc",60104202,"Water testing and sampling kits",
+"unspsc",60104203,"Water models",
+"unspsc",60104204,"Water ecology supplies",
+"unspsc",60104300,"Astronomy",
+"unspsc",60104301,"Astronomy models",
+"unspsc",60104302,"Astronomy charts",
+"unspsc",60104303,"Astronomy study kits",
+"unspsc",60104400,"Geology and earth science",
+"unspsc",60104401,"Rock specimen sets",
+"unspsc",60104402,"Rock specimens",
+"unspsc",60104403,"Fossils",
+"unspsc",60104404,"Landform models",
+"unspsc",60104405,"Fossil models",
+"unspsc",60104406,"Geology tools or field",
+"unspsc",60104407,"Stream tables",
+"unspsc",60104408,"Geology study kits",
+"unspsc",60104500,"Chemistry and electrochemistry and microchemistry",
+"unspsc",60104501,"Periodic table posters or boards",
+"unspsc",60104502,"Consumer analysis kits",
+"unspsc",60104503,"Chemistry class kits",
+"unspsc",60104504,"Chemistry demonstration kits",
+"unspsc",60104505,"Atomic models",
+"unspsc",60104506,"Molecular models",
+"unspsc",60104507,"Electrochemical demonstration tools",
+"unspsc",60104508,"Electrochemical kits",
+"unspsc",60104509,"Fuel cells",
+"unspsc",60104511,"Microchemistry tools",
+"unspsc",60104600,"Mechanical physics materials",
+"unspsc",60104601,"Force tables",
+"unspsc",60104602,"Gravity models or model sets",
+"unspsc",60104604,"Inclined planes",
+"unspsc",60104605,"Friction apparatus",
+"unspsc",60104606,"Physic cars",
+"unspsc",60104607,"Pendulum apparatus",
+"unspsc",60104608,"Torque apparatus",
+"unspsc",60104609,"Projectile apparatus",
+"unspsc",60104610,"Air tables",
+"unspsc",60104611,"Air apparatus",
+"unspsc",60104612,"Light or photo apparatus",
+"unspsc",60104700,"Energy and power physics materials",
+"unspsc",60104701,"Solar collecting devices",
+"unspsc",60104702,"Solar kits",
+"unspsc",60104703,"Energy demonstration kits",
+"unspsc",60104704,"Energy class kits",
+"unspsc",60104705,"Matter demonstration kits",
+"unspsc",60104706,"Matter class kits",
+"unspsc",60104707,"Monometers",
+"unspsc",60104708,"Gas diffusion apparatus",
+"unspsc",60104800,"Wave and sound physics materials",
+"unspsc",60104801,"Wave generators",
+"unspsc",60104802,"Wave tanks",
+"unspsc",60104803,"Wave springs",
+"unspsc",60104804,"Wave demonstration sets",
+"unspsc",60104805,"Tuning forks",
+"unspsc",60104806,"Doppler demonstrators",
+"unspsc",60104807,"Resonance apparatus",
+"unspsc",60104808,"Sound meters",
+"unspsc",60104809,"Wave apparatus",
+"unspsc",60104810,"Spectroscopes",
+"unspsc",60104811,"Spectrum charts",
+"unspsc",60104812,"Light demonstration kits",
+"unspsc",60104813,"Color charts or samples",
+"unspsc",60104814,"Radiometer",
+"unspsc",60104815,"Reflection or refraction apparatus",
+"unspsc",60104816,"Optics sets or kits",
+"unspsc",60104900,"Electrical physics materials",
+"unspsc",60104901,"Van degraff generators",
+"unspsc",60104902,"Electrostatic apparatus",
+"unspsc",60104903,"Electrostatic kits",
+"unspsc",60104904,"Electricity kits",
+"unspsc",60104905,"Electricity demonstration boards",
+"unspsc",60104906,"Battery kits",
+"unspsc",60104907,"Hand held generators",
+"unspsc",60104908,"Electromagnetic apparatus",
+"unspsc",60104909,"Magnetism apparatus",
+"unspsc",60104910,"Electromagnets",
+"unspsc",60104911,"Electric bells or accessories",
+"unspsc",60104912,"Electric lead wires or cables",
+"unspsc",60105000,"Nuclear physics materials",
+"unspsc",60105001,"Radioactivity sets",
+"unspsc",60105002,"Geiger counters",
+"unspsc",60105003,"Electron apparatus",
+"unspsc",60105004,"Radiation warning signs",
+"unspsc",60105005,"Nuclear physics transparencies",
+"unspsc",60105006,"Nuclear physics charts",
+"unspsc",60105100,"Rocketry and flight materials and supplies",
+"unspsc",60105101,"Rocket sets",
+"unspsc",60105102,"Launching apparatus",
+"unspsc",60105103,"Altitude measuring devices",
+"unspsc",60105104,"Airplane kits",
+"unspsc",60105200,"Life skills resources instructional materials",
+"unspsc",60105201,"Building listening skills instructional materials",
+"unspsc",60105202,"Study skills instructional materials",
+"unspsc",60105203,"Test preparation instructional materials",
+"unspsc",60105300,"Career education instructional materials",
+"unspsc",60105301,"Career education or planning or decision making skills instructional materials",
+"unspsc",60105302,"Basic job skills instructional materials",
+"unspsc",60105303,"Job search skills instructional materials",
+"unspsc",60105304,"Time management skills instructional materials",
+"unspsc",60105305,"Interview skills instructional materials",
+"unspsc",60105306,"Resume skills instructional materials",
+"unspsc",60105307,"Work ethics or attitude training instructional materials",
+"unspsc",60105308,"Team building skills instructional materials",
+"unspsc",60105309,"Business etiquette instructional materials",
+"unspsc",60105400,"Consumer economics and money management and independent living instructional materials",
+"unspsc",60105401,"Personal finance or money management education instructional materials",
+"unspsc",60105402,"Shopping or consumer skills instructional materials",
+"unspsc",60105403,"Independent living instructional materials",
+"unspsc",60105404,"Understanding consumer credit or loans instructional materials",
+"unspsc",60105405,"Insurance coverage or insurance comparison instructional materials",
+"unspsc",60105406,"Home buying instructional materials",
+"unspsc",60105407,"Apartment rental instructional materials",
+"unspsc",60105408,"Car buying educational aids",
+"unspsc",60105409,"Brand marketing or advertising instructional materials",
+"unspsc",60105410,"Relationship building or family life skills instructional materials",
+"unspsc",60105411,"Developing self concept and self esteem instructional materials",
+"unspsc",60105412,"Violence avoidance education or violence prevention instructional materials",
+"unspsc",60105413,"Anger resolution training instructional materials",
+"unspsc",60105414,"Teaching patience skills instructional materials",
+"unspsc",60105415,"Tolerance training instructional materials",
+"unspsc",60105416,"Personal safety instructional materials",
+"unspsc",60105417,"Personal conflict resolution instructional materials",
+"unspsc",60105418,"Practical teen advice guides",
+"unspsc",60105419,"Developing social skills instructional materials",
+"unspsc",60105420,"Manners or etiquette or courtesy instructional aids",
+"unspsc",60105421,"Understanding or dealing with cultural diversity instructional materials",
+"unspsc",60105422,"How to read body language instructional materials",
+"unspsc",60105423,"Developing resiliency instructional materials",
+"unspsc",60105424,"Understanding community service instructional materials",
+"unspsc",60105425,"Developing refusal skills instructional materials",
+"unspsc",60105426,"Responsibility or Ddecision making skills instructional materials",
+"unspsc",60105427,"Understanding teens legal rights instructional materials",
+"unspsc",60105428,"Repercussions of dropping out of school instructional materials",
+"unspsc",60105429,"Race relations videos",
+"unspsc",60105500,"Home and interior design instructional materials",
+"unspsc",60105501,"Feng shui instructional materials",
+"unspsc",60105502,"Instructional materials for using color or paint for home decoration",
+"unspsc",60105503,"Instructional materials for home planning or design",
+"unspsc",60105504,"Landscaping design instructional materials",
+"unspsc",60105505,"Instructional materials for home decorating or furnishing",
+"unspsc",60105600,"Health education and nutrition and food preparation instructional materials",
+"unspsc",60105601,"Dietary guidelines or balanced diets educational resources",
+"unspsc",60105602,"Nutritional curriculum menu planning skills instructional materials",
+"unspsc",60105603,"Understanding nutrition labeling instructional materials",
+"unspsc",60105604,"Food shopping instructional materials",
+"unspsc",60105605,"Healthy food choices demonstration units",
+"unspsc",60105606,"Understanding the effects of dietary fat instructional materials",
+"unspsc",60105607,"Understanding vegetarianism instructional materials",
+"unspsc",60105608,"Recipe books or cook books",
+"unspsc",60105609,"Eating disorders education instructional materials",
+"unspsc",60105610,"Weight control or exercise instructional materials",
+"unspsc",60105611,"Kitchen measurements of solids or liquids instructional aids",
+"unspsc",60105612,"Kitchen equivalants or kitchen math instructional aids",
+"unspsc",60105613,"Kitchen utensils instructional aids",
+"unspsc",60105614,"Kitchen safety or sanitation instructional materials",
+"unspsc",60105615,"Food safety instructional materials",
+"unspsc",60105616,"Food science activities instructional materials",
+"unspsc",60105617,"Cooking skills instruction instructional materials",
+"unspsc",60105618,"Table manners or eating etiquette instructional materials",
+"unspsc",60105619,"Table setting instructional materials",
+"unspsc",60105620,"Food service training instructional materials",
+"unspsc",60105621,"Drug or tobacco or alcohol abuse education instructional materials",
+"unspsc",60105622,"Smoking Simulators",
+"unspsc",60105623,"Understanding addiction or addiction avoidance instructional materials",
+"unspsc",60105624,"Teen depression symptoms instructional materials",
+"unspsc",60105625,"Teen suicide avoidance training instructional materials",
+"unspsc",60105626,"Coping with stress instructional materials",
+"unspsc",60105700,"Memory books and supplies",
+"unspsc",60105701,"Memory books",
+"unspsc",60105702,"Memory book posts or extenders",
+"unspsc",60105703,"Memory book paper",
+"unspsc",60105704,"Acid free glue sticks",
+"unspsc",60105705,"Acid free tape",
+"unspsc",60105800,"Clothing and textile design instructional materials",
+"unspsc",60105801,"Sewing skills instructional materials",
+"unspsc",60105802,"Sewing project materials",
+"unspsc",60105803,"Understanding clothing construction or workmanship instructional materials",
+"unspsc",60105804,"Clothing design or fashion instructional materials",
+"unspsc",60105805,"Personal color analysis instructional materials",
+"unspsc",60105806,"Fashion merchandising or retail fundamentals instructional materials",
+"unspsc",60105807,"Science of fabrics or fibers instructional materials",
+"unspsc",60105808,"Clothing care or maintenance or laundering instructional materials",
+"unspsc",60105809,"Materials for teaching the art of design color on fabric",
+"unspsc",60105810,"Fabric dyes or paints instructional materials",
+"unspsc",60105811,"Quilting projects instructional materials",
+"unspsc",60105900,"Dating and sex and teen pregnancy and parenting skills and child development instructional materials",
+"unspsc",60105901,"Sex education or sexually transmitted disease instructional materials",
+"unspsc",60105902,"Prenatal nutrition resources or fetal abuse instructional materials",
+"unspsc",60105903,"Parenting skills instructional materials",
+"unspsc",60105904,"Child development instructional materials",
+"unspsc",60105905,"Understanding date rape or dating skills or harassment instructional materials",
+"unspsc",60105906,"Childbirth education instructional materials",
+"unspsc",60105907,"Pregnancy from conception through birth instructional materials",
+"unspsc",60105908,"Understanding the risks of birth defects instructional materials",
+"unspsc",60105909,"Pregnancy simulators",
+"unspsc",60105910,"Infant simulators and accessories",
+"unspsc",60105911,"Infant care training instructional materials",
+"unspsc",60105912,"Understanding physical or emotional child abuse instructional materials",
+"unspsc",60105913,"Discipline skill education instructional materials for parents",
+"unspsc",60105914,"Home safety or childproofing instructional materials",
+"unspsc",60105915,"Cardio pulmonary resusitation or  basic life support instructional materials",
+"unspsc",60105916,"Understanding childhood illnesses instructional materials",
+"unspsc",60105917,"Understanding attention deficit hyperactivity disorder instructional materials",
+"unspsc",60105918,"Child caregiver instructional materials",
+"unspsc",60105919,"Babysitting instructional materials",
+"unspsc",60106000,"Curriculum guides and projects and activities and lessons",
+"unspsc",60106001,"Middle school curriculum resource or idea books",
+"unspsc",60106002,"High School curriculum resource or idea books",
+"unspsc",60106003,"Home economics independent study projects",
+"unspsc",60106004,"Home economics projects or activities resources or guides",
+"unspsc",60106100,"Vocational teaching aids and materials",
+"unspsc",60106101,"Automotive teaching aids or materials",
+"unspsc",60106102,"Construction teaching aids or materials",
+"unspsc",60106103,"Drafting or design teaching aids or materials",
+"unspsc",60106104,"Electronics or electricity teaching aids or materials",
+"unspsc",60106105,"Graphic arts or photography teaching aids or materials",
+"unspsc",60106106,"Horticulture teaching aids or materials",
+"unspsc",60106107,"Manufacturing teaching aids or materials",
+"unspsc",60106108,"Safety or hazardous teaching aids or materials",
+"unspsc",60106109,"Welding teaching aids or materials",
+"unspsc",60106200,"Technology teaching aids and materials",
+"unspsc",60106201,"Agriculture teaching aids or materials",
+"unspsc",60106202,"Biotechnology teaching aids or materials",
+"unspsc",60106203,"Communications teaching aids or materials",
+"unspsc",60106204,"Computer science teaching aids or materials",
+"unspsc",60106205,"Energy or power teaching aids or materials",
+"unspsc",60106206,"Environmental teaching aids or materials",
+"unspsc",60106207,"Materials teaching aids or materials",
+"unspsc",60106208,"Medical teaching aids or materials",
+"unspsc",60106209,"Transportation teaching aids or materials",
+"unspsc",60106210,"Weapon system teaching aids or materials",
+"unspsc",60106211,"Engine or engine parts teaching aids or materials",
+"unspsc",60106212,"Navigational instrument teaching aids or materials",
+"unspsc",60106213,"Fluid mechanics or machines teaching aids or materials",
+"unspsc",60106214,"Robotics teaching aids or materials",
+"unspsc",60106215,"Cooling systems teaching aids or materials",
+"unspsc",60106300,"Forensic science teaching equipment and supplies",
+"unspsc",60106301,"Forensic science kits",
+"unspsc",60106302,"Forensic science teaching aids or materials",
+"unspsc",60106400,"Electronics teaching supplies and equipment",
+"unspsc",60106401,"Electronics kits",
+"unspsc",60106402,"Electronics teaching supplies",
+"unspsc",60110000,"Classroom decoratives and supplies",
+"unspsc",60111000,"Classroom Charts or classroom posters",
+"unspsc",60111001,"Chart packs",
+"unspsc",60111002,"Classroom charts",
+"unspsc",60111003,"Classroom posters or sets",
+"unspsc",60111004,"Do it yourself posters",
+"unspsc",60111005,"Chart holders or accessories",
+"unspsc",60111100,"Bulletin board sets",
+"unspsc",60111101,"Big bulletin board sets",
+"unspsc",60111102,"Calendar bulletin board sets",
+"unspsc",60111103,"Early childhood bulletin board sets",
+"unspsc",60111104,"Language bulletin board sets",
+"unspsc",60111105,"Math bulletin board sets",
+"unspsc",60111106,"Multipurpose bulletin board sets",
+"unspsc",60111107,"Science bulletin board sets",
+"unspsc",60111108,"Seasonal bulletin board sets",
+"unspsc",60111109,"Social studies bulletin board sets",
+"unspsc",60111200,"Bulletin board borders and trimmers",
+"unspsc",60111201,"Classroom banners",
+"unspsc",60111202,"Border packs",
+"unspsc",60111203,"Classroom headers",
+"unspsc",60111204,"Corrugated borders or trimmers",
+"unspsc",60111205,"Die cut shaped scalloped borders or trimmers",
+"unspsc",60111206,"Sparkle borders or trimmers",
+"unspsc",60111207,"Straight borders or trimmers",
+"unspsc",60111208,"Border or Trimmer storage",
+"unspsc",60111300,"Decorative letters and numbers",
+"unspsc",60111301,"Lettered or numbered blocks",
+"unspsc",60111302,"Casual letters or numbers",
+"unspsc",60111303,"Italic letters or numbers",
+"unspsc",60111304,"Self adhesive letters or numbers",
+"unspsc",60111305,"Sparkle letters or numbers",
+"unspsc",60111306,"Tracing letters or numbers",
+"unspsc",60111400,"Specialty decoratives for the classroom and decorative accessories",
+"unspsc",60111401,"Classroom decorative kits",
+"unspsc",60111402,"Door decorations",
+"unspsc",60111403,"Mobiles",
+"unspsc",60111404,"Two sided decorations",
+"unspsc",60111405,"Window cling decorations",
+"unspsc",60111407,"Decorative Storage Systems",
+"unspsc",60111408,"Decorative tapes or twists",
+"unspsc",60111409,"Decorative buttons",
+"unspsc",60111410,"Decorative shapes or strings",
+"unspsc",60111411,"Decorative sprays",
+"unspsc",60120000,"Arts and crafts equipment and accessories and supplies",
+"unspsc",60121000,"Art",
+"unspsc",60121001,"Paintings",
+"unspsc",60121002,"Sculptures",
+"unspsc",60121003,"Statuary",
+"unspsc",60121004,"Portraits",
+"unspsc",60121005,"Drawings",
+"unspsc",60121006,"Pictures",
+"unspsc",60121007,"Lithographs",
+"unspsc",60121008,"Posters",
+"unspsc",60121009,"Decorative pot",
+"unspsc",60121010,"Scrolls",
+"unspsc",60121011,"Photographs",
+"unspsc",60121012,"Decorative stickers",
+"unspsc",60121100,"Canvases and films and boards and artists papers",
+"unspsc",60121101,"Sulphite drawing paper",
+"unspsc",60121102,"Groundwood drawing paper",
+"unspsc",60121103,"Tracing or vellum drawing paper",
+"unspsc",60121104,"Bond drawing paper",
+"unspsc",60121105,"Charcoal or pastel drawing paper",
+"unspsc",60121106,"Bristol drawing paper",
+"unspsc",60121107,"Watercolor paper sheets",
+"unspsc",60121108,"Watercolor paper pads",
+"unspsc",60121109,"Watercolor paper blocks",
+"unspsc",60121110,"Finger paint paper",
+"unspsc",60121111,"Sulphite construction paper",
+"unspsc",60121112,"Groundwood construction paper",
+"unspsc",60121113,"Foil construction paper",
+"unspsc",60121114,"Origami craft papers",
+"unspsc",60121115,"Paper or plastic Confetti",
+"unspsc",60121116,"Crepe paper for crafts",
+"unspsc",60121117,"Craft tissue paper",
+"unspsc",60121118,"Corrugated craft paper",
+"unspsc",60121119,"Pattern printed craft paper",
+"unspsc",60121120,"Self adhesive craft paper",
+"unspsc",60121121,"Glow in the dark paper",
+"unspsc",60121123,"Hand made paper",
+"unspsc",60121124,"Kraft paper",
+"unspsc",60121125,"Canvas panels",
+"unspsc",60121126,"Prestretched canvas",
+"unspsc",60121127,"Primed canvas",
+"unspsc",60121128,"Unprimed canvas",
+"unspsc",60121129,"Masonite panels",
+"unspsc",60121130,"Canvas like paper pads",
+"unspsc",60121131,"Japanese printmaking paper",
+"unspsc",60121132,"Lithography or intaglio printmaking paper",
+"unspsc",60121133,"Blockprinting printmaking paper",
+"unspsc",60121134,"Foil paper",
+"unspsc",60121135,"Acetate or vinyl or polyester films",
+"unspsc",60121136,"Cellophane films",
+"unspsc",60121137,"Acrylic sheets",
+"unspsc",60121138,"Illustration boards",
+"unspsc",60121139,"Mat boards",
+"unspsc",60121140,"Mounting board",
+"unspsc",60121141,"Foam core mounting board",
+"unspsc",60121142,"Tagboard or railroad board",
+"unspsc",60121143,"Display board",
+"unspsc",60121144,"Scratch art papers",
+"unspsc",60121145,"Scratch art boards",
+"unspsc",60121146,"Scratch art accessories",
+"unspsc",60121147,"Gloss paper",
+"unspsc",60121148,"Color paperboard",
+"unspsc",60121149,"Plant press paper",
+"unspsc",60121150,"Sugar paper",
+"unspsc",60121151,"Drawing or sketching boards or accessories",
+"unspsc",60121152,"Writing slates",
+"unspsc",60121153,"Transfer sheets",
+"unspsc",60121200,"Classroom and fine art paint and mediums and applicators and accessories",
+"unspsc",60121201,"Traditional liquid tempera paint",
+"unspsc",60121202,"Contemporary liquid tempera paint",
+"unspsc",60121203,"Powdered tempera paint",
+"unspsc",60121204,"Washable tempera paint",
+"unspsc",60121205,"Tempera cakes",
+"unspsc",60121206,"Liquid face or body paint",
+"unspsc",60121207,"Cake face or body paint",
+"unspsc",60121208,"Marker face or body paint",
+"unspsc",60121209,"Temporary tattoo paint",
+"unspsc",60121210,"Washable finger paint",
+"unspsc",60121211,"School style acrylic paint",
+"unspsc",60121212,"Acrylic airbrush paint",
+"unspsc",60121213,"Synthetic heat treated oil paint or mediums",
+"unspsc",60121214,"Water soluble oil paint or mediums",
+"unspsc",60121215,"Low viscosity removable glass or ceramic paint",
+"unspsc",60121216,"Low viscosity permanent glass or ceramic paint",
+"unspsc",60121217,"High viscosity Gel removable glass or ceramic paint",
+"unspsc",60121218,"High viscosity Gel permanent glass or ceramic paint",
+"unspsc",60121219,"Oven baked glass or ceramic paint",
+"unspsc",60121220,"Marker delivery system glass or ceramic paint",
+"unspsc",60121221,"Pan watercolor paint",
+"unspsc",60121222,"Tube watercolor paint",
+"unspsc",60121223,"Liquid watercolor paint",
+"unspsc",60121224,"Liquid watercolor frisket paint",
+"unspsc",60121225,"Watercolor painting mediums",
+"unspsc",60121226,"Watercolor brushes",
+"unspsc",60121227,"Oriental brushes",
+"unspsc",60121228,"Utility brushes",
+"unspsc",60121229,"Specialty brushes",
+"unspsc",60121230,"Easel brushes",
+"unspsc",60121231,"Palette knives",
+"unspsc",60121232,"Brayers for hand printing",
+"unspsc",60121233,"Sponge stamps",
+"unspsc",60121234,"Scrapers for paint application",
+"unspsc",60121235,"Pipettes for paint or dye mixing",
+"unspsc",60121236,"Combs or tools for paint or ink application",
+"unspsc",60121237,"Palettes for paint or ink mixing",
+"unspsc",60121238,"Paint pots for paint storage or mixing",
+"unspsc",60121239,"Paint cups or bottles",
+"unspsc",60121241,"Brush or tool cleaners",
+"unspsc",60121242,"Paint aprons",
+"unspsc",60121243,"Artists Smocks",
+"unspsc",60121244,"Stretcher strips",
+"unspsc",60121245,"Canvas stretchers",
+"unspsc",60121246,"Metal easels",
+"unspsc",60121247,"Wood easels",
+"unspsc",60121248,"Table top easels",
+"unspsc",60121249,"Presentation easels",
+"unspsc",60121250,"Drawing portfolios",
+"unspsc",60121251,"Gouache paint",
+"unspsc",60121252,"Paint pans",
+"unspsc",60121253,"Art airbrushes",
+"unspsc",60121300,"Art and craft cutting products",
+"unspsc",60121301,"Guillotine paper trimmers",
+"unspsc",60121302,"Mat cutter",
+"unspsc",60121303,"Mat knives",
+"unspsc",60121304,"Artist knives",
+"unspsc",60121305,"Rotary paper or fabric cutter",
+"unspsc",60121306,"Circle or oval paper cutters",
+"unspsc",60121400,"Picture framing",
+"unspsc",60121401,"Preassembled wood picture frames",
+"unspsc",60121402,"Wood section picture frames",
+"unspsc",60121403,"Preassembled metal picture frames",
+"unspsc",60121404,"Metal section picture frames",
+"unspsc",60121405,"Adjustable picture frames",
+"unspsc",60121406,"Plastic picture frames",
+"unspsc",60121407,"Clear box picture frame",
+"unspsc",60121408,"Point drivers or accessories for picture frames",
+"unspsc",60121409,"Mitre box",
+"unspsc",60121410,"Picture Hanging devices",
+"unspsc",60121411,"Acrylic panels for picture frames",
+"unspsc",60121412,"Glass panels for picture frames",
+"unspsc",60121413,"Photo or picture albums or organizers",
+"unspsc",60121414,"Magnetic mounts for frames",
+"unspsc",60121415,"Frame kits",
+"unspsc",60121500,"Drawing tools and supplies and accessories",
+"unspsc",60121501,"Water based markers",
+"unspsc",60121502,"Solvent based markers",
+"unspsc",60121503,"Washable markers",
+"unspsc",60121504,"Calligraphy markers",
+"unspsc",60121505,"Fabric markers",
+"unspsc",60121506,"Metallic markers",
+"unspsc",60121507,"Tempera or chalk window markers",
+"unspsc",60121508,"Paint markers",
+"unspsc",60121509,"Wax based crayons",
+"unspsc",60121510,"Soy based crayons",
+"unspsc",60121511,"Specialty crayons",
+"unspsc",60121512,"Watercolor crayons",
+"unspsc",60121513,"Dry pastel",
+"unspsc",60121514,"Chalk pastel",
+"unspsc",60121515,"Oil based pastel",
+"unspsc",60121516,"Compressed charcoal",
+"unspsc",60121517,"Vine charcoal",
+"unspsc",60121518,"Graphite pencils",
+"unspsc",60121519,"Wax based colored drawing pencils",
+"unspsc",60121520,"Charcoal pencils",
+"unspsc",60121521,"Watercolor pencils",
+"unspsc",60121522,"Waterbased pens",
+"unspsc",60121523,"Permanent pens",
+"unspsc",60121524,"Gel pens",
+"unspsc",60121525,"Technical pens",
+"unspsc",60121526,"Calligraphy pens",
+"unspsc",60121531,"Pink pencil erasers",
+"unspsc",60121532,"Kneaded erasers",
+"unspsc",60121533,"Vinyl erasers",
+"unspsc",60121534,"Plastic erasers",
+"unspsc",60121535,"Gum erasers",
+"unspsc",60121536,"Crayon remover",
+"unspsc",60121537,"Dip pens or their accessories",
+"unspsc",60121538,"Calligraphy kits",
+"unspsc",60121539,"Drawing fixatives",
+"unspsc",60121540,"Drawing cloths",
+"unspsc",60121600,"Studio aids",
+"unspsc",60121601,"Wood mannequins",
+"unspsc",60121602,"Clear acrylic mirrors or panels",
+"unspsc",60121603,"Plastic Rubbing plates",
+"unspsc",60121604,"Studio aid accessories",
+"unspsc",60121605,"Anatomical models",
+"unspsc",60121606,"Background screens",
+"unspsc",60121700,"Printmaking supplies and accessories",
+"unspsc",60121701,"Rubber stamping stamps",
+"unspsc",60121702,"Rubber stamping stamp pads",
+"unspsc",60121703,"Rubber stamping accessories",
+"unspsc",60121704,"Linoleum for block printing",
+"unspsc",60121705,"Wood blocks for printing",
+"unspsc",60121706,"Synthetic blocks for printing",
+"unspsc",60121707,"Block printing accessories",
+"unspsc",60121708,"Intaglio or lithography plates",
+"unspsc",60121709,"Intaglio or lithography blankets",
+"unspsc",60121710,"Intaglio or lithography wipes",
+"unspsc",60121711,"Intaglio or lithography hot plates",
+"unspsc",60121712,"Intaglio or lithography printing presses",
+"unspsc",60121713,"Printing barens and brayers",
+"unspsc",60121714,"Intaglio etching or engraving tools",
+"unspsc",60121715,"Silkscreen screens or printing stations",
+"unspsc",60121716,"Silkscreen accessories",
+"unspsc",60121717,"Etching needles",
+"unspsc",60121718,"Printing ink extenders",
+"unspsc",60121800,"Printing and drawing inks",
+"unspsc",60121801,"Water based poster inks",
+"unspsc",60121802,"Water based acrylic inks",
+"unspsc",60121803,"Oil based silkscreen inks",
+"unspsc",60121804,"Water based Textile inks",
+"unspsc",60121805,"Oil based textile inks",
+"unspsc",60121806,"Printmaking sublimation inks",
+"unspsc",60121807,"Oil based intaglio or lithography inks",
+"unspsc",60121808,"Oil based monoprint inks",
+"unspsc",60121809,"Water based monoprint inks",
+"unspsc",60121810,"Water based drawing inks",
+"unspsc",60121811,"Solvent based drawing inks",
+"unspsc",60121812,"Calligraphy drawing inks",
+"unspsc",60121813,"Silkscreen inks",
+"unspsc",60121814,"Lithographic varnishes",
+"unspsc",60121900,"Art fabric and fabric decoration materials and supplies",
+"unspsc",60121901,"Muslin",
+"unspsc",60121902,"Felt",
+"unspsc",60121903,"Craft fur",
+"unspsc",60121904,"Cotton blends",
+"unspsc",60121905,"Canvas imprintables",
+"unspsc",60121906,"Pre sensitized imprintables",
+"unspsc",60121907,"Cotton imprintables",
+"unspsc",60121908,"Blended imprintables",
+"unspsc",60121909,"Batik waxes",
+"unspsc",60121910,"Batik accessories",
+"unspsc",60121911,"Batik fabric",
+"unspsc",60121912,"Art stumps",
+"unspsc",60122000,"Sewing and stitchery and weaving equipment and accessories",
+"unspsc",60122002,"Weaving accessories",
+"unspsc",60122003,"Hand sewing needles",
+"unspsc",60122004,"String art kits",
+"unspsc",60122005,"Hand looms",
+"unspsc",60122006,"Table looms",
+"unspsc",60122007,"Floor looms",
+"unspsc",60122008,"Rexlace",
+"unspsc",60122009,"Lacing or stringing accessories",
+"unspsc",60122100,"Candlemaking",
+"unspsc",60122101,"Candlemaking wicks",
+"unspsc",60122102,"Candlemaking forms",
+"unspsc",60122103,"Candlemaking accessories",
+"unspsc",60122200,"Wood crafts",
+"unspsc",60122201,"Wood craft materials",
+"unspsc",60122202,"Finishing materials",
+"unspsc",60122203,"Wood burning tools",
+"unspsc",60122204,"Carving tools",
+"unspsc",60122300,"Basketry making supplies",
+"unspsc",60122301,"Basketry reed",
+"unspsc",60122302,"Basketry project kits",
+"unspsc",60122400,"Stained glass making supplies",
+"unspsc",60122401,"Stained Glass fragments",
+"unspsc",60122402,"Stained glass tools or accessories",
+"unspsc",60122500,"Paper crafts and hand made papermaking",
+"unspsc",60122501,"Paper shaping tools",
+"unspsc",60122502,"Paper picture frames",
+"unspsc",60122503,"Paper plates or trays",
+"unspsc",60122504,"Paper filters",
+"unspsc",60122505,"Corrugated cardboard shapes",
+"unspsc",60122506,"Paper Doilies",
+"unspsc",60122507,"Deckles or molds for hand made paper",
+"unspsc",60122508,"Couch sheets or felts for hand made paper",
+"unspsc",60122509,"Pulp or raw materials for hand made paper",
+"unspsc",60122600,"Mosaics",
+"unspsc",60122601,"Mosaic tiles",
+"unspsc",60122602,"Mosaic molds",
+"unspsc",60122603,"Mosaic tools",
+"unspsc",60122604,"Mosaic accessories",
+"unspsc",60122700,"Enameling paints and accessories",
+"unspsc",60122701,"Enameling paints or mediums",
+"unspsc",60122702,"Copper shapes",
+"unspsc",60122703,"Enameling accessories",
+"unspsc",60122704,"Enameling Kilns",
+"unspsc",60122800,"Maskmaking",
+"unspsc",60122801,"Maskmaking forms",
+"unspsc",60122900,"Beads or beading accessories",
+"unspsc",60122901,"Seed beads",
+"unspsc",60122902,"Pony beads",
+"unspsc",60122903,"Wood beads",
+"unspsc",60122904,"Straw beads",
+"unspsc",60122905,"Ceramic beads",
+"unspsc",60122906,"Glass beads",
+"unspsc",60122907,"Assorted or decorative beads",
+"unspsc",60122908,"Bead accessories",
+"unspsc",60122909,"Plastic beads",
+"unspsc",60123000,"Foam crafts",
+"unspsc",60123001,"Styrofoam shapes",
+"unspsc",60123002,"Tools for foam crafts",
+"unspsc",60123100,"Chenille stem crafts",
+"unspsc",60123101,"Jumbo chenille stems",
+"unspsc",60123102,"Cotton chenille stems",
+"unspsc",60123103,"Bumps chenille stems",
+"unspsc",60123200,"Ribbon making materials",
+"unspsc",60123201,"Paper ribbons",
+"unspsc",60123202,"Silk ribbons",
+"unspsc",60123203,"Synthetic ribbons",
+"unspsc",60123204,"Decorative ribbons",
+"unspsc",60123300,"Craft poms",
+"unspsc",60123301,"Acrylic craft poms",
+"unspsc",60123302,"Glitter craft poms",
+"unspsc",60123303,"Craft pom beadz",
+"unspsc",60123400,"Wiggle eyes materials",
+"unspsc",60123401,"Non self adhesive wiggle eyes",
+"unspsc",60123402,"Self adhesive wiggle eyes",
+"unspsc",60123403,"Decorative wiggle eyes",
+"unspsc",60123500,"Leather craft materials",
+"unspsc",60123501,"Leather or leather lacing materials",
+"unspsc",60123502,"Leather accessories",
+"unspsc",60123600,"Glitter",
+"unspsc",60123601,"Glitter glue",
+"unspsc",60123602,"Glitter dots",
+"unspsc",60123603,"Glitter jewels",
+"unspsc",60123604,"Plastic glitter",
+"unspsc",60123605,"Irridescent glitter",
+"unspsc",60123606,"Metallic glitter",
+"unspsc",60123700,"Macrame craft materials and accessories",
+"unspsc",60123701,"Macrame cord",
+"unspsc",60123702,"Macrame beads",
+"unspsc",60123703,"Macrame accessories",
+"unspsc",60123800,"Marbling supplies and accessories",
+"unspsc",60123801,"Marbling inks",
+"unspsc",60123802,"Marbling accessories",
+"unspsc",60123900,"Sequins and trims",
+"unspsc",60123901,"Decorative sequins or trims",
+"unspsc",60124000,"Cork craft supplies and accessories",
+"unspsc",60124001,"Cork sheets",
+"unspsc",60124002,"Cork stoppers or accessories",
+"unspsc",60124100,"Multicultural project materials and accessories",
+"unspsc",60124101,"Multicultural painting products",
+"unspsc",60124102,"Multicultural crafts products",
+"unspsc",60124200,"Cross curricular projects",
+"unspsc",60124201,"Mylar sculptures",
+"unspsc",60124300,"Clay and modeling compounds and ceramics equipment and accessories",
+"unspsc",60124301,"Moist kiln fired clay",
+"unspsc",60124302,"Dry kiln fired clay",
+"unspsc",60124303,"Kiln furniture",
+"unspsc",60124304,"Kilns for firing ceramics",
+"unspsc",60124305,"Kiln accessories for firing ceramics",
+"unspsc",60124306,"Potters wheels for hand made ceramics",
+"unspsc",60124307,"Extruders for modeling materials",
+"unspsc",60124308,"Cones for firing kilns",
+"unspsc",60124309,"Pottery batts",
+"unspsc",60124310,"Decorating wheels for pottery",
+"unspsc",60124311,"Clay or modeling tools",
+"unspsc",60124312,"Fired ceramic tiles",
+"unspsc",60124313,"Clay storage containers",
+"unspsc",60124314,"Plasticized non hardening modeling compounds",
+"unspsc",60124315,"Oilbased nonhardening modeling compounds",
+"unspsc",60124316,"Air dry clay or modeling compounds",
+"unspsc",60124317,"Modeling dough",
+"unspsc",60124318,"Papier mache",
+"unspsc",60124319,"Specialty modeling compounds",
+"unspsc",60124320,"Plaster compounds",
+"unspsc",60124321,"Oven hardening clay or modeling compounds",
+"unspsc",60124322,"Plastic modeling compounds",
+"unspsc",60124323,"Casts or molds for shaping modeling compounds",
+"unspsc",60124324,"Clay modeling kits",
+"unspsc",60124400,"Art metals",
+"unspsc",60124401,"Copper tooling foil",
+"unspsc",60124402,"Aluminum tooling foil",
+"unspsc",60124403,"Aluminum wire",
+"unspsc",60124404,"Brass tooling foil",
+"unspsc",60124405,"Brass wire",
+"unspsc",60124406,"Silver sheets or plates",
+"unspsc",60124407,"Silver wire",
+"unspsc",60124408,"Pewter pellets or shots",
+"unspsc",60124409,"Pewter ingots",
+"unspsc",60124410,"Nu gold sheets plates",
+"unspsc",60124411,"Nu gold wire",
+"unspsc",60124412,"Galvanized stovepipe wire",
+"unspsc",60124500,"Sculpture supplies and accessories",
+"unspsc",60124501,"Plaster wrap",
+"unspsc",60124502,"Casting resins",
+"unspsc",60124503,"Sculpture accessories",
+"unspsc",60124504,"Puzzle racks",
+"unspsc",60124505,"Bubbles or accessories",
+"unspsc",60124506,"Plastic sand or water tools or molds or toys",
+"unspsc",60124507,"Play sand",
+"unspsc",60124508,"Sand or water tables or activity centers",
+"unspsc",60124509,"Vehicle sets",
+"unspsc",60124510,"Waterway sets",
+"unspsc",60124511,"Play tools or play tool kits",
+"unspsc",60124512,"Scooter boards",
+"unspsc",60124513,"Beanbags",
+"unspsc",60124514,"Tactile toys",
+"unspsc",60124515,"Cognitive toys",
+"unspsc",60130000,"Musical Instruments and parts and accessories",
+"unspsc",60131000,"Keyboard instruments",
+"unspsc",60131001,"Pianos",
+"unspsc",60131002,"Accordions",
+"unspsc",60131003,"Musical organs",
+"unspsc",60131004,"Celestas",
+"unspsc",60131100,"Brass instruments",
+"unspsc",60131101,"Trumpets",
+"unspsc",60131102,"Trombones",
+"unspsc",60131103,"Sousaphones",
+"unspsc",60131104,"Saxophones",
+"unspsc",60131105,"Whistle",
+"unspsc",60131106,"Bugles",
+"unspsc",60131107,"Saxhorns",
+"unspsc",60131108,"French horns",
+"unspsc",60131109,"Mellophones",
+"unspsc",60131110,"Alto horns",
+"unspsc",60131111,"Baritone horns",
+"unspsc",60131112,"Flugel horns",
+"unspsc",60131200,"Woodwind instruments",
+"unspsc",60131201,"Clarinets",
+"unspsc",60131202,"Oboes",
+"unspsc",60131203,"Musical flutes",
+"unspsc",60131204,"Piccoloes",
+"unspsc",60131205,"Musical cornets",
+"unspsc",60131206,"Bagpipes",
+"unspsc",60131207,"Harmonicas",
+"unspsc",60131208,"Kazoos",
+"unspsc",60131209,"English horns",
+"unspsc",60131210,"Ocarinas",
+"unspsc",60131300,"String instruments",
+"unspsc",60131301,"Harpsichords",
+"unspsc",60131302,"Clavichords",
+"unspsc",60131303,"Guitars",
+"unspsc",60131304,"Violins",
+"unspsc",60131305,"Harps",
+"unspsc",60131306,"Banjoes",
+"unspsc",60131307,"Mandolins",
+"unspsc",60131308,"Violoncellos",
+"unspsc",60131309,"Basses",
+"unspsc",60131400,"Percussion instruments",
+"unspsc",60131401,"Cymbals",
+"unspsc",60131402,"Bells",
+"unspsc",60131403,"Tambourines",
+"unspsc",60131404,"Castanets",
+"unspsc",60131405,"Drums",
+"unspsc",60131406,"Xylophones",
+"unspsc",60131407,"Vibraphones",
+"unspsc",60131500,"Musical instrument parts and accessories",
+"unspsc",60131501,"Metronomes",
+"unspsc",60131502,"Reeds",
+"unspsc",60131503,"Instrument strings or picks",
+"unspsc",60131504,"Tuning pins",
+"unspsc",60131505,"Musical instrument stands or sheet holders",
+"unspsc",60131506,"Accessories for stringed instruments",
+"unspsc",60131507,"Percussion instrument accessory",
+"unspsc",60131508,"Music boxes or mechanisms",
+"unspsc",60131509,"Mouthpieces",
+"unspsc",60131510,"Musical instrument pouches or cases or accessories",
+"unspsc",60131511,"Mutes",
+"unspsc",60131512,"Tuning bars",
+"unspsc",60131513,"Conductors batons",
+"unspsc",60131514,"Piccolo pads",
+"unspsc",60131600,"Musical instrument sets",
+"unspsc",60131601,"Rhythm band sets",
+"unspsc",60131700,"Alternative sounds musical instruments",
+"unspsc",60131701,"Boomwhackers",
+"unspsc",60131702,"Disco taps",
+"unspsc",60131800,"Music and dance accessories",
+"unspsc",60131801,"Dancing scarves",
+"unspsc",60131802,"Rhythm sticks or lummi sticks",
+"unspsc",60131803,"Rhythm wands or hoops",
+"unspsc",60140000,"Toys and games",
+"unspsc",60141000,"Toys",
+"unspsc",60141001,"Toy balloons or balls",
+"unspsc",60141002,"Dolls",
+"unspsc",60141003,"Doll houses",
+"unspsc",60141004,"Stuffed animals or puppets",
+"unspsc",60141005,"Playhouses",
+"unspsc",60141006,"Building blocks",
+"unspsc",60141007,"Riding toys",
+"unspsc",60141008,"Pull toys",
+"unspsc",60141009,"Childrens science kits",
+"unspsc",60141010,"Toy vehicles",
+"unspsc",60141011,"Toy trains",
+"unspsc",60141012,"Inflatable toys",
+"unspsc",60141013,"Doll parts or accessories",
+"unspsc",60141014,"Yo yos",
+"unspsc",60141015,"Kites",
+"unspsc",60141016,"Pogs",
+"unspsc",60141017,"Kaleidoscopes",
+"unspsc",60141018,"Pom poms",
+"unspsc",60141019,"Pinatas",
+"unspsc",60141020,"Boomerangs",
+"unspsc",60141021,"Flying discs",
+"unspsc",60141022,"Toy pails",
+"unspsc",60141023,"Bath toys",
+"unspsc",60141024,"Rattles",
+"unspsc",60141025,"Toy weapons",
+"unspsc",60141026,"Tops",
+"unspsc",60141100,"Games",
+"unspsc",60141101,"Educational games",
+"unspsc",60141102,"Board games",
+"unspsc",60141103,"Playing cards",
+"unspsc",60141104,"Video games",
+"unspsc",60141105,"Puzzles",
+"unspsc",60141106,"Dice",
+"unspsc",60141107,"Bingo",
+"unspsc",60141108,"Classic games",
+"unspsc",60141109,"Collaborative games",
+"unspsc",60141110,"Strategy games",
+"unspsc",60141111,"Game accessories",
+"unspsc",60141112,"Game books",
+"unspsc",60141113,"Lotto games",
+"unspsc",60141114,"Memory games",
+"unspsc",60141115,"Game kits",
+"unspsc",60141200,"Active play equipment and accessories",
+"unspsc",60141201,"Balance or gross motor equipment",
+"unspsc",60141202,"Ball pools or accessories",
+"unspsc",60141203,"Play houses or huts",
+"unspsc",60141204,"Trikes or wagons",
+"unspsc",60141205,"Soft play centers",
+"unspsc",60141300,"Childrens blocks and building systems",
+"unspsc",60141302,"Construction sets",
+"unspsc",60141303,"Playmats",
+"unspsc",60141304,"Railplay systems or accessories",
+"unspsc",60141305,"Unit blocks",
+"unspsc",60141306,"Play vehicles",
+"unspsc",60141307,"Play animals",
+"unspsc",60141400,"Dramatic play equipment and accessories",
+"unspsc",60141401,"Costumes or accessories",
+"unspsc",60141402,"Dress up Centers",
+"unspsc",60141403,"Housekeeping units or accessories",
+"unspsc",60141404,"Play food dishes or accessories",
+"unspsc",60141405,"Pretend play kits or supplies",
+"unspsc",70000000,"Farming and Fishing and Forestry and Wildlife Contracting Services",
+"unspsc",70100000,"Fisheries and aquaculture",
+"unspsc",70101500,"Fisheries operations",
+"unspsc",70101501,"Commercial fishing operations",
+"unspsc",70101502,"Fishing port services",
+"unspsc",70101503,"Fishing onshore facilities",
+"unspsc",70101504,"Deep sea fishing operations",
+"unspsc",70101505,"Sonar fishing",
+"unspsc",70101506,"Whaling",
+"unspsc",70101507,"Trawling",
+"unspsc",70101508,"Line fishing",
+"unspsc",70101509,"Seine operations",
+"unspsc",70101510,"Fishing nets",
+"unspsc",70101600,"Fisheries oversight",
+"unspsc",70101601,"Fishery information or documentation services",
+"unspsc",70101602,"Fishery research or experimentation services",
+"unspsc",70101603,"Fishery data collection or distribution",
+"unspsc",70101604,"Fishery commercial management",
+"unspsc",70101605,"Fishing fleet management",
+"unspsc",70101606,"Fishing cooperatives",
+"unspsc",70101607,"Fishery resources protection or conservation",
+"unspsc",70101700,"Fishery industry and technology",
+"unspsc",70101701,"Fishing technology services",
+"unspsc",70101702,"Fishery by products production services",
+"unspsc",70101703,"Fish production",
+"unspsc",70101704,"Fish storage",
+"unspsc",70101800,"Fisheries resources",
+"unspsc",70101801,"Inland water fishery resources",
+"unspsc",70101802,"Fish pond resources",
+"unspsc",70101803,"Fish hatcheries",
+"unspsc",70101804,"Fish ranches",
+"unspsc",70101805,"Fishery by product resources",
+"unspsc",70101806,"Fisheries resource evaluation",
+"unspsc",70101900,"Aquaculture",
+"unspsc",70101901,"Mariculture",
+"unspsc",70101902,"Ostreiculture",
+"unspsc",70101903,"Shellfish culture",
+"unspsc",70101904,"Shrimp farming",
+"unspsc",70101905,"Fish farming",
+"unspsc",70110000,"Horticulture",
+"unspsc",70111500,"Plants and ornamental trees",
+"unspsc",70111501,"Planting services or ornamental plant or bush or tree",
+"unspsc",70111502,"Pruning services or ornamental plant or bush",
+"unspsc",70111503,"Tree trimming services",
+"unspsc",70111504,"Bracing services",
+"unspsc",70111505,"Tree surgery services",
+"unspsc",70111506,"Arborist services",
+"unspsc",70111507,"Removal services or ornamental plant or bush or tree",
+"unspsc",70111508,"Plants or ornamental tree spraying services",
+"unspsc",70111600,"Flowering plants",
+"unspsc",70111601,"Planting services",
+"unspsc",70111602,"Nursery services",
+"unspsc",70111603,"Floriculture services",
+"unspsc",70111700,"Parks and gardens and orchards",
+"unspsc",70111701,"Orchard management or maintenance services",
+"unspsc",70111702,"Vineyard management or maintenance services",
+"unspsc",70111703,"Garden planting or maintenance services",
+"unspsc",70111704,"Horticultural counseling services",
+"unspsc",70111705,"Cemetery upkeep services",
+"unspsc",70111706,"Lawn care services",
+"unspsc",70111707,"Highway lawn maintenance services",
+"unspsc",70111708,"Mulching services",
+"unspsc",70111709,"Seeding services",
+"unspsc",70111710,"Mowing services",
+"unspsc",70111711,"Sprigging services",
+"unspsc",70111712,"Parks or gardens spraying services",
+"unspsc",70111713,"Parks management or maintenance services",
+"unspsc",70120000,"Livestock services",
+"unspsc",70121500,"Dairying",
+"unspsc",70121501,"Dairy herd management",
+"unspsc",70121502,"Dairy industry development",
+"unspsc",70121503,"Dairy technology",
+"unspsc",70121504,"Dairy laboratories services",
+"unspsc",70121505,"Dairy farm in house processing",
+"unspsc",70121600,"Livestock industry",
+"unspsc",70121601,"Livestock breeding",
+"unspsc",70121602,"Livestock genetics services",
+"unspsc",70121603,"Sericulture",
+"unspsc",70121604,"Animal husbandry",
+"unspsc",70121605,"Farm rearing systems",
+"unspsc",70121606,"Poultry production services",
+"unspsc",70121607,"Small animal breeding services",
+"unspsc",70121608,"Bovine production services",
+"unspsc",70121610,"Apiculture",
+"unspsc",70121700,"Livestock management",
+"unspsc",70121701,"Livestock selection",
+"unspsc",70121702,"Livestock showing services",
+"unspsc",70121703,"Livestock slaughtering services",
+"unspsc",70121704,"Herd management",
+"unspsc",70121705,"Livestock breeding or grooming services",
+"unspsc",70121800,"Pets industry",
+"unspsc",70121801,"Pet breeding services",
+"unspsc",70121802,"Pet grooming services",
+"unspsc",70121803,"Kennels services",
+"unspsc",70121900,"Pasture and range services",
+"unspsc",70121901,"Pasture improvement",
+"unspsc",70121902,"Range management",
+"unspsc",70121903,"Range research",
+"unspsc",70122000,"Animal health",
+"unspsc",70122001,"Animal nutrition",
+"unspsc",70122002,"Animal disease control",
+"unspsc",70122003,"Animal trypanosomiasis",
+"unspsc",70122004,"Foot or mouth control services",
+"unspsc",70122005,"Animal health preventive medication services",
+"unspsc",70122006,"Animal vaccination services",
+"unspsc",70122007,"Veterinary administration",
+"unspsc",70122008,"Veterinary laboratory technology",
+"unspsc",70122009,"Animal hospital services",
+"unspsc",70122010,"Animal health information services",
+"unspsc",70130000,"Land and soil preparation and management and protection",
+"unspsc",70131500,"Land and soil protection",
+"unspsc",70131501,"Desertification assessment or control services",
+"unspsc",70131502,"Soil conservation or protection services",
+"unspsc",70131503,"Erosion control services",
+"unspsc",70131504,"Sand dune fixation",
+"unspsc",70131505,"Soil conditioning",
+"unspsc",70131506,"Soil improvement",
+"unspsc",70131600,"Land and soil preparation",
+"unspsc",70131601,"Fertilizer application services",
+"unspsc",70131602,"Lime spreading services",
+"unspsc",70131603,"Plowing services",
+"unspsc",70131604,"Seed bed preparation services",
+"unspsc",70131605,"Soil chemical treatment services",
+"unspsc",70131700,"Land and soil management",
+"unspsc",70131701,"Land use planning",
+"unspsc",70131702,"Land evaluation",
+"unspsc",70131703,"Land reclamation",
+"unspsc",70131704,"Agro ecological zones assessment or planning",
+"unspsc",70131705,"Soil classification",
+"unspsc",70131706,"Watershed management",
+"unspsc",70131707,"Soil fertility analysis",
+"unspsc",70131708,"Pedology",
+"unspsc",70140000,"Crop production and management and protection",
+"unspsc",70141500,"Crop production",
+"unspsc",70141501,"Seed production services",
+"unspsc",70141502,"Hydroponics",
+"unspsc",70141503,"Grass or fodder production",
+"unspsc",70141504,"Aromatic plants production",
+"unspsc",70141505,"Beverage crops production",
+"unspsc",70141506,"Cocoa production",
+"unspsc",70141507,"Sugarbeet or sugarcane production",
+"unspsc",70141508,"Nut production",
+"unspsc",70141509,"Essential oil crops production",
+"unspsc",70141510,"Fiber crops production",
+"unspsc",70141511,"Fruit production",
+"unspsc",70141512,"Grain or legume production",
+"unspsc",70141513,"Insecticidal plants production",
+"unspsc",70141514,"Medicinal plants production",
+"unspsc",70141515,"Roots or tubers production",
+"unspsc",70141516,"Cereals production",
+"unspsc",70141517,"Rubber plant production",
+"unspsc",70141518,"Spice crops production",
+"unspsc",70141519,"Tobacco crop production",
+"unspsc",70141520,"Vegetable production",
+"unspsc",70141600,"Crop protection",
+"unspsc",70141601,"Crop spraying services",
+"unspsc",70141602,"Biological control services",
+"unspsc",70141603,"Weed control services",
+"unspsc",70141604,"Herbicide services",
+"unspsc",70141605,"Integrated pest management services",
+"unspsc",70141606,"Plant pathology",
+"unspsc",70141607,"Locust control",
+"unspsc",70141700,"Crop management",
+"unspsc",70141701,"Greenhouse services",
+"unspsc",70141702,"Fertilizer services",
+"unspsc",70141703,"Crop administration",
+"unspsc",70141704,"Crop substitution",
+"unspsc",70141705,"Extension services",
+"unspsc",70141706,"Crop specialization",
+"unspsc",70141707,"Cultivation farming system management",
+"unspsc",70141708,"Crop rotation or diversification counseling services",
+"unspsc",70141709,"Plant taxonomy services",
+"unspsc",70141710,"Field crop entomology",
+"unspsc",70141800,"Crop planting and cultivation",
+"unspsc",70141801,"Orchard tree or vine planting services",
+"unspsc",70141802,"Sprout or twig services",
+"unspsc",70141803,"Crop cultivating services",
+"unspsc",70141804,"Crop planting services",
+"unspsc",70141900,"Crop harvesting",
+"unspsc",70141901,"Cash grains harvesting services",
+"unspsc",70141902,"Fruit or tree nuts harvesting services",
+"unspsc",70141903,"Field crop harvesting services",
+"unspsc",70141904,"Seed harvesting services",
+"unspsc",70142000,"Post harvesting crop processing",
+"unspsc",70142001,"Silos related services",
+"unspsc",70142002,"Grain dryers services",
+"unspsc",70142003,"Crop processing services",
+"unspsc",70142004,"Field crops market preparation services",
+"unspsc",70142005,"Cash grain crops market preparation services",
+"unspsc",70142006,"Vegetable crops market preparation services",
+"unspsc",70142007,"Fruit crops market preparation services",
+"unspsc",70142008,"Tree nut crops market preparation services",
+"unspsc",70142009,"Ginning services",
+"unspsc",70142010,"Crop cleaning services",
+"unspsc",70142011,"Cooling or refrigeration services",
+"unspsc",70150000,"Forestry",
+"unspsc",70151500,"Forestry management",
+"unspsc",70151501,"Forest resources management services",
+"unspsc",70151502,"Forest pest control",
+"unspsc",70151503,"Forest organizations or associations or cooperatives",
+"unspsc",70151504,"Forest administration services",
+"unspsc",70151505,"Forest inventory",
+"unspsc",70151506,"Forest monitoring or evaluation",
+"unspsc",70151507,"Afforestation services",
+"unspsc",70151508,"Forestry extension services",
+"unspsc",70151509,"Forest nursery management",
+"unspsc",70151510,"Forest sectoral planning",
+"unspsc",70151600,"Forestry industry",
+"unspsc",70151601,"Nonwood production services",
+"unspsc",70151602,"Essential oils production",
+"unspsc",70151603,"Timber production services",
+"unspsc",70151604,"Dyes production",
+"unspsc",70151605,"Edible forestry production",
+"unspsc",70151606,"Wood testing services",
+"unspsc",70151700,"Forestry harvesting",
+"unspsc",70151701,"Logging or felling",
+"unspsc",70151702,"Forest harvesting mountainous areas",
+"unspsc",70151703,"Forest harvesting specialized operations",
+"unspsc",70151704,"Plantation harvesting",
+"unspsc",70151705,"Swamp or mangrove forest harvesting",
+"unspsc",70151706,"Temperate forest harvesting",
+"unspsc",70151707,"Tropical high forests harvesting",
+"unspsc",70151800,"Forestry conservation services",
+"unspsc",70151801,"Conservation of forest genetic resources",
+"unspsc",70151802,"Forest protection services",
+"unspsc",70151803,"Forest arid land rehabilitation",
+"unspsc",70151804,"Forest wind breaks or shelter belts",
+"unspsc",70151805,"Forest reserves or parks conservation services",
+"unspsc",70151806,"Forestry watershed management",
+"unspsc",70151807,"Forestry torrent control",
+"unspsc",70151900,"Forestry resources",
+"unspsc",70151901,"Forest resources development",
+"unspsc",70151902,"Agroforestry resources",
+"unspsc",70151903,"Fuel wood resources",
+"unspsc",70151904,"Silviculture",
+"unspsc",70151905,"Arid rainfed plantation resources",
+"unspsc",70151906,"Broad leafed plantation resources",
+"unspsc",70151907,"Conifers plantations",
+"unspsc",70151909,"Tropical rain forest plantations",
+"unspsc",70151910,"Mangrove swamps resources",
+"unspsc",70160000,"Wildlife and flora",
+"unspsc",70161500,"Fauna",
+"unspsc",70161501,"Fauna protection",
+"unspsc",70161600,"Flora",
+"unspsc",70161601,"Flora protection",
+"unspsc",70161700,"Ecosystems",
+"unspsc",70161701,"Ecodevelopment services",
+"unspsc",70161702,"Marine ecosystem management services",
+"unspsc",70161703,"Terrestrial ecosystem management services",
+"unspsc",70161704,"Ecosystems protection services",
+"unspsc",70170000,"Water resources development and oversight",
+"unspsc",70171500,"Development",
+"unspsc",70171501,"Water quality assessment services",
+"unspsc",70171502,"Water resources planning services",
+"unspsc",70171503,"Ground or surface water surveying",
+"unspsc",70171504,"Water resources mapping services",
+"unspsc",70171505,"River basin development",
+"unspsc",70171506,"Ground or surface water modeling services",
+"unspsc",70171600,"Oversight",
+"unspsc",70171601,"Water quality management",
+"unspsc",70171602,"Water testing services",
+"unspsc",70171603,"Floodplain management",
+"unspsc",70171604,"Water conservation advisory services",
+"unspsc",70171605,"Water rights advisory services",
+"unspsc",70171606,"Water resource recovery services",
+"unspsc",70171607,"Water pricing services",
+"unspsc",70171700,"Irrigation",
+"unspsc",70171701,"Canal maintenance or management services",
+"unspsc",70171702,"Dam maintenance or management services",
+"unspsc",70171703,"Reservoirs maintenance or management services",
+"unspsc",70171704,"Pumping station maintenance or management services",
+"unspsc",70171705,"Pipelines maintenance or management services",
+"unspsc",70171706,"Dike or embankment maintenance or management services",
+"unspsc",70171707,"Water well maintenance or management services",
+"unspsc",70171708,"Irrigation advisory services",
+"unspsc",70171709,"Irrigation systems management services",
+"unspsc",70171800,"Drainage services",
+"unspsc",70171801,"Land drainage services",
+"unspsc",70171802,"Storm water drainage",
+"unspsc",70171803,"Flood protection or control services",
+"unspsc",71000000,"Mining and Oil and Gas Services",
+"unspsc",71100000,"Mining services",
+"unspsc",71101500,"Mine exploration",
+"unspsc",71101501,"Mine development",
+"unspsc",71101502,"Test boring or core drilling",
+"unspsc",71101600,"Mine drilling and blasting services",
+"unspsc",71101601,"Shaft sinking",
+"unspsc",71101602,"Mine blasting services",
+"unspsc",71101700,"Extraction",
+"unspsc",71101701,"Shaft mining services",
+"unspsc",71101702,"Open pit mining services",
+"unspsc",71101703,"Strip mining services",
+"unspsc",71101704,"In situ leaching ISL services",
+"unspsc",71101705,"Pumping or draining",
+"unspsc",71101706,"Overburden removal",
+"unspsc",71101707,"Impoundment or storage of water services",
+"unspsc",71101708,"Soil flushing services",
+"unspsc",71101709,"Mine filling services",
+"unspsc",71110000,"Oil and gas exploration services",
+"unspsc",71112000,"Cased hole well logging services",
+"unspsc",71112001,"Cased hole formation sampling testing services",
+"unspsc",71112002,"Casing thickness measurement services",
+"unspsc",71112003,"Chemical cutters services",
+"unspsc",71112004,"Electromagnetic pipe recovery services",
+"unspsc",71112005,"Well flow measurement services",
+"unspsc",71112006,"Well fluid density measurement services",
+"unspsc",71112007,"Well fluid temperature measurement services",
+"unspsc",71112008,"Free point tool services",
+"unspsc",71112009,"Gamma ray services",
+"unspsc",71112010,"Jet cutter services",
+"unspsc",71112011,"Measurement while perforating services",
+"unspsc",71112012,"Neutron porosity services",
+"unspsc",71112013,"Nuclear spectroscopy services",
+"unspsc",71112014,"Well packer services",
+"unspsc",71112015,"Permanent magnets pipe recovery services",
+"unspsc",71112017,"Well pressure measurement control services",
+"unspsc",71112018,"Production logging borehole fluid measurement services",
+"unspsc",71112019,"Production logging density measurement services",
+"unspsc",71112020,"Production logging downhole video services",
+"unspsc",71112021,"Production logging flow measurement services",
+"unspsc",71112022,"Production logging pressure measurement services",
+"unspsc",71112023,"Other production logging services",
+"unspsc",71112024,"Production logging temperature measurement services",
+"unspsc",71112025,"Severing colliding services",
+"unspsc",71112026,"Well logging sonic services",
+"unspsc",71112027,"Stuck point tool services",
+"unspsc",71112028,"Thermal decay well logging services",
+"unspsc",71112029,"Well tubular corrosion evaluation services",
+"unspsc",71112030,"Well performance services",
+"unspsc",71112031,"Well tubular services",
+"unspsc",71112100,"Open hole well logging services",
+"unspsc",71112101,"Digital sonic logging services",
+"unspsc",71112102,"Borehole geometry logging services",
+"unspsc",71112103,"Density lithology nuclear logging services",
+"unspsc",71112104,"Dipmeter logging services",
+"unspsc",71112105,"Dipole sonic logging services",
+"unspsc",71112106,"Directional logging services",
+"unspsc",71112107,"Directional survey services",
+"unspsc",71112108,"Electromagnetic propagation logging services",
+"unspsc",71112109,"Formation testing sampling services",
+"unspsc",71112110,"Fracture identification logging services",
+"unspsc",71112111,"Gamma ray logging services",
+"unspsc",71112112,"Gamma ray spectroscopy logging services",
+"unspsc",71112113,"Geochemical nuclear logging services",
+"unspsc",71112114,"Well imaging services",
+"unspsc",71112115,"Magnetic resonance logging services",
+"unspsc",71112116,"Microresistivity logging services",
+"unspsc",71112117,"Neutron porosity logging services",
+"unspsc",71112119,"Resistivity logging services",
+"unspsc",71112120,"Slim access sonic logging services",
+"unspsc",71112121,"Sonic cement bond ratio logging services",
+"unspsc",71112122,"Well sonic imaging services",
+"unspsc",71112200,"Other logging services",
+"unspsc",71112202,"Logging while drilling services",
+"unspsc",71112203,"Logging during fishing services",
+"unspsc",71112204,"Logging while perforating services",
+"unspsc",71112205,"Drill pipe conveyed well services",
+"unspsc",71112206,"General well logging services",
+"unspsc",71112300,"Seismic services",
+"unspsc",71112301,"Two dimensional land seismic acquisition services",
+"unspsc",71112302,"Two dimensional marine seismic acquisition services",
+"unspsc",71112303,"Two dimensional seismic data processing services",
+"unspsc",71112304,"Three dimensional land seismic acquisition services",
+"unspsc",71112305,"Three dimensional marine seismic acquisition services",
+"unspsc",71112306,"Three dimensional seismic data processing services",
+"unspsc",71112307,"Four dimensional land seismic acquisition services",
+"unspsc",71112308,"Four dimensional marine seismic acquisition services",
+"unspsc",71112309,"Four dimensional seismic data processing services",
+"unspsc",71112310,"Checkshot seismic services",
+"unspsc",71112311,"Cross well seismic services",
+"unspsc",71112312,"Deviated well seismic services",
+"unspsc",71112313,"Geophysics seismic services",
+"unspsc",71112314,"Offset seismic services",
+"unspsc",71112315,"Quickshot seismic services",
+"unspsc",71112316,"Seismic data acquisition while drilling services",
+"unspsc",71112317,"Slim hole seismic services",
+"unspsc",71112318,"Seismic survey evaluation or design services",
+"unspsc",71112319,"Vertical seismic services",
+"unspsc",71112320,"Walkaway seismic services",
+"unspsc",71112321,"Geological services",
+"unspsc",71120000,"Well drilling construction and maintenance services",
+"unspsc",71121000,"Cement pumping services",
+"unspsc",71121001,"Oilfield casing hardware services",
+"unspsc",71121002,"Oilfield cement lab testing services",
+"unspsc",71121003,"Downhole oilfield tools services",
+"unspsc",71121004,"Oilfield filtering services",
+"unspsc",71121005,"Foam cementing services",
+"unspsc",71121006,"Geothermal well cementing services",
+"unspsc",71121007,"Liner cementing services",
+"unspsc",71121008,"Oilwell lost circulation services",
+"unspsc",71121009,"Oilfield mud removal services",
+"unspsc",71121010,"Plug cementing services",
+"unspsc",71121011,"Well site pressure pumping services",
+"unspsc",71121012,"Oilfield pressure testing services",
+"unspsc",71121013,"Surface casing cementing services",
+"unspsc",71121014,"Intermediate casing cementing services",
+"unspsc",71121015,"Production string cementing services",
+"unspsc",71121016,"Squeeze well cementing services",
+"unspsc",71121017,"Well water control services",
+"unspsc",71121018,"Well cement evaluation services",
+"unspsc",71121019,"Well cement grouting services",
+"unspsc",71121020,"Well cementing additives services",
+"unspsc",71121021,"Well cementing design services",
+"unspsc",71121022,"Well cleaning services",
+"unspsc",71121023,"Well repair services",
+"unspsc",71121100,"Coiled tubing services",
+"unspsc",71121101,"Acidizing through coiled tubing services",
+"unspsc",71121102,"Cable installation through coiled tubing services",
+"unspsc",71121103,"Cementing through coiled tubing services",
+"unspsc",71121104,"Chemical cutting through coiled tubing services",
+"unspsc",71121105,"Clean out through coiled tubing services",
+"unspsc",71121106,"Completion through coiled tubing services",
+"unspsc",71121107,"Conveying inflatables through coiled tubing services",
+"unspsc",71121108,"Coring through coiled tubing services",
+"unspsc",71121109,"Extended reach well services",
+"unspsc",71121110,"Fishing through coiled tubing services",
+"unspsc",71121111,"Fracturing through coiled tubing services",
+"unspsc",71121112,"High pressure coiled tubing services",
+"unspsc",71121113,"Horizontal isolation oilfield services",
+"unspsc",71121114,"Logging with coiled tubing services",
+"unspsc",71121115,"Milling through coiled tubing services",
+"unspsc",71121116,"Nitrogen related applications through coiled tubing",
+"unspsc",71121117,"Perforating through coiled tubing services",
+"unspsc",71121118,"Pipeline or flowline laying services",
+"unspsc",71121119,"Pipeline intervention services",
+"unspsc",71121120,"Sand control through coiled tubing services",
+"unspsc",71121121,"Abrasive tubular cleaning services",
+"unspsc",71121122,"Well kill through coiled tubing services",
+"unspsc",71121123,"Casing exit with coiled tubing services",
+"unspsc",71121200,"Coring services",
+"unspsc",71121201,"Conventional coring services",
+"unspsc",71121202,"Core isolation services",
+"unspsc",71121203,"Core preservation services",
+"unspsc",71121204,"Horizontal coring services",
+"unspsc",71121205,"Oriented coring services",
+"unspsc",71121206,"Rig site core analysis services",
+"unspsc",71121207,"Sponge coring services",
+"unspsc",71121208,"Wireline retrievable coring services",
+"unspsc",71121300,"Downhole tool services",
+"unspsc",71121301,"Downhole vibration control services",
+"unspsc",71121302,"Downhole hole opening services",
+"unspsc",71121303,"Reaming while drilling services",
+"unspsc",71121304,"Downhole torque or drag reduction services",
+"unspsc",71121305,"Downhole underreaming services",
+"unspsc",71121400,"Oilfield drilling bit services",
+"unspsc",71121401,"Oilfield drilling bit design services",
+"unspsc",71121402,"Oilfield drilling bit hydraulic optimization services",
+"unspsc",71121403,"Oilfield drilling bit planning services",
+"unspsc",71121404,"Oilfield drilling bit recording services",
+"unspsc",71121405,"Oilfield drilling bit repair services",
+"unspsc",71121406,"Oilfield drilling bit footage contracts",
+"unspsc",71121407,"Well site drilling optimization assistance service",
+"unspsc",71121500,"Drilling measurement services",
+"unspsc",71121501,"Acoustic measurement when drilling services",
+"unspsc",71121502,"Acoustic telemetry when drilling services",
+"unspsc",71121503,"Caliper measurement when drilling services",
+"unspsc",71121504,"Density measurement when drilling services",
+"unspsc",71121505,"Oilfield drilling performance services",
+"unspsc",71121506,"Electromagnetic telemetry when drilling services",
+"unspsc",71121507,"Formation dip measurement when drilling services",
+"unspsc",71121508,"Formation pressure measurement when drilling services",
+"unspsc",71121509,"Geologically steered wells",
+"unspsc",71121510,"Geostopping services",
+"unspsc",71121511,"Mud logging services",
+"unspsc",71121512,"Nuclear magnetic resonance services",
+"unspsc",71121513,"Porosity measurement when drilling services",
+"unspsc",71121514,"Resistivity measurement when drilling services",
+"unspsc",71121515,"Well surveying management services",
+"unspsc",71121516,"Surveying wireline services",
+"unspsc",71121600,"Oil well drilling services",
+"unspsc",71121601,"Well casing crew service",
+"unspsc",71121602,"Well casing planning services",
+"unspsc",71121603,"Well casing milling services",
+"unspsc",71121604,"Coiled tubing drilling services",
+"unspsc",71121605,"Well completion planning services",
+"unspsc",71121606,"Conventional well directional drilling services",
+"unspsc",71121607,"Well directional drilling services",
+"unspsc",71121608,"Well drilling contract development services",
+"unspsc",71121609,"Well drilling services",
+"unspsc",71121610,"Well drilling engineering services",
+"unspsc",71121611,"Well drilling mud or fluid services",
+"unspsc",71121612,"Well drilling of water intake well services",
+"unspsc",71121613,"Well drilling rig monitor services",
+"unspsc",71121614,"Well drilling solids control",
+"unspsc",71121615,"Well drilling stabilizing or hole opening services",
+"unspsc",71121616,"Well drilling supervision",
+"unspsc",71121617,"Well drilling control services",
+"unspsc",71121618,"Well drilling other general services",
+"unspsc",71121619,"Extended reach directional well drilling services",
+"unspsc",71121620,"Multilateral directional well drilling services",
+"unspsc",71121621,"Oil country tubular modification or testing services",
+"unspsc",71121622,"Well drilling pickup or laydown service",
+"unspsc",71121623,"Well drilling pipe storage",
+"unspsc",71121624,"Well drilling pipe threading",
+"unspsc",71121625,"Rathole well drilling service",
+"unspsc",71121626,"Short radius directional well drilling services",
+"unspsc",71121627,"Steerable underreaming while well drilling services",
+"unspsc",71121628,"Ultra short radius directional well drilling services",
+"unspsc",71121629,"Underbalanced well drilling services",
+"unspsc",71121630,"Well planning services",
+"unspsc",71121631,"Well redrilling or reworking services",
+"unspsc",71121632,"Well drilling deviation control",
+"unspsc",71121633,"Oilfield gravel packing services",
+"unspsc",71121634,"Oilfield hull systems services",
+"unspsc",71121635,"Rig well pulling crew services",
+"unspsc",71121636,"Wellhead equipment services",
+"unspsc",71121637,"Sidetracking with whipstock services",
+"unspsc",71121700,"Oilfield fishing services",
+"unspsc",71121701,"Oilfield fishing service design services",
+"unspsc",71121702,"Oilfield fishing service economic evaluation services",
+"unspsc",71121703,"Oilfield fishing service operation services",
+"unspsc",71121704,"Oilfield junk recovery services",
+"unspsc",71121705,"Oilfield pipe recovery service",
+"unspsc",71121706,"Oilfield fishing or drilling services",
+"unspsc",71121800,"Gas lift services",
+"unspsc",71121801,"Coiled tubing gas lift services",
+"unspsc",71121802,"Gas lift fixing or testing services",
+"unspsc",71121803,"Gas lift kickover services",
+"unspsc",71121804,"Gas lift sand containment services",
+"unspsc",71121900,"Down hole fluid services",
+"unspsc",71121901,"Down hole fluid evaluation services",
+"unspsc",71121902,"Down hole fluid laboratory services",
+"unspsc",71121903,"Down hole fluid sampling services",
+"unspsc",71122000,"Well perforating services",
+"unspsc",71122001,"Coiled tubing well perforating services",
+"unspsc",71122002,"Slickline well perforating services",
+"unspsc",71122003,"Through tubing well perforation services",
+"unspsc",71122004,"Tubing conveyed well perforating services",
+"unspsc",71122005,"Wireline well perforating services",
+"unspsc",71122006,"Well tubing puncher services",
+"unspsc",71122100,"Oilfield sand control services",
+"unspsc",71122101,"Acid sand control pumping services",
+"unspsc",71122102,"Sand control blending services",
+"unspsc",71122103,"Cleaning fluid sand control services",
+"unspsc",71122104,"Completion fluid sand control services",
+"unspsc",71122105,"Well consolidation services",
+"unspsc",71122107,"Fracturing fluid sand control services",
+"unspsc",71122108,"Fracturing pre frac design testing services",
+"unspsc",71122109,"General sand control services",
+"unspsc",71122110,"Gravel carrier fluid sand control services",
+"unspsc",71122111,"Sand control lab testing services",
+"unspsc",71122112,"Multizone sand control services",
+"unspsc",71122113,"Sand control monitoring services",
+"unspsc",71122114,"Sand control temporary isolation services",
+"unspsc",71122115,"Well tool redressing services",
+"unspsc",71122116,"Non fracturing sand control pumping services",
+"unspsc",71122200,"Slickline services",
+"unspsc",71122201,"Slickline fishing services",
+"unspsc",71122202,"Slickline lifting services",
+"unspsc",71122203,"Slickline manipulation services",
+"unspsc",71122300,"Subsea well services",
+"unspsc",71122301,"Subsea well diving services",
+"unspsc",71122302,"Subsea well remote operation vehicle rov services",
+"unspsc",71122303,"Subsea well fixturing or test equipment services",
+"unspsc",71122304,"Subsea well intervention or completion services",
+"unspsc",71122305,"Subsea well safety test tree services",
+"unspsc",71122306,"Subsea well equipment maintenance services",
+"unspsc",71122400,"Well testing services",
+"unspsc",71122401,"Drill stem flow metering services",
+"unspsc",71122402,"Drill stem surface testing services",
+"unspsc",71122403,"Drill stem testing packer services",
+"unspsc",71122404,"Drill stem testing pressure control test services",
+"unspsc",71122405,"Drill stem testing pulse operated test services",
+"unspsc",71122406,"Drill stem testing for ultra high press high temp environment services",
+"unspsc",71122407,"Drill stem testing services",
+"unspsc",71122408,"Periodic well testing services",
+"unspsc",71122409,"Surface well testing services",
+"unspsc",71122410,"Underbalanced testing while drilling services",
+"unspsc",71122500,"Water or gas control services",
+"unspsc",71122501,"Water or gas control design services",
+"unspsc",71122502,"Water or gas control evaluation services",
+"unspsc",71122503,"Water or gas control isolation services",
+"unspsc",71122504,"Water or gas control testing services",
+"unspsc",71122505,"Water or gas testing services",
+"unspsc",71122600,"Well completion services",
+"unspsc",71122601,"Well casing completion services",
+"unspsc",71122602,"Well completion fluids services",
+"unspsc",71122603,"Gas lift well completion services",
+"unspsc",71122604,"Horizontal cased hole services",
+"unspsc",71122605,"Horizontal open hole services",
+"unspsc",71122606,"Intelligent well completion services",
+"unspsc",71122607,"Liner well completion services",
+"unspsc",71122608,"Multilateral well completion services",
+"unspsc",71122609,"Permanent well completion services",
+"unspsc",71122610,"Sand control well completion services",
+"unspsc",71122611,"Temporary drill stem testing well completion services",
+"unspsc",71122612,"Tubing well completion services",
+"unspsc",71122613,"Underbalanced well completion services",
+"unspsc",71122700,"Well maintenance services",
+"unspsc",71122701,"Oil well platform maintenance services",
+"unspsc",71122702,"Oilfield pumping unit maintenance services",
+"unspsc",71122703,"Oilfield rod pump repair services",
+"unspsc",71122704,"Oilfield snubbing service",
+"unspsc",71122705,"Oilfield sucker rod maintenance services",
+"unspsc",71122706,"Well swabbing services",
+"unspsc",71122707,"Oilfield tubing anchor services",
+"unspsc",71122708,"Oilfield pump mechanic services",
+"unspsc",71122800,"Well monitoring services",
+"unspsc",71122801,"Downhole recording services",
+"unspsc",71122802,"Well flow monitoring services",
+"unspsc",71122803,"Oil or gas well monitoring services",
+"unspsc",71122804,"Well site phase monitoring services",
+"unspsc",71122805,"Well site pump monitoring services",
+"unspsc",71122806,"Well site surface data acquisition services",
+"unspsc",71122807,"Well site surface readout services",
+"unspsc",71122808,"Well site surface recording services",
+"unspsc",71122810,"Subsurface well testing services",
+"unspsc",71122900,"Oilfield rigs",
+"unspsc",71122901,"Deepwater oilfield rig services",
+"unspsc",71122902,"Jackup oilfield rig services",
+"unspsc",71122903,"Barge oilfield rig services",
+"unspsc",71122904,"Land oilfield rig services",
+"unspsc",71122905,"Platform oilfield rig services",
+"unspsc",71130000,"Oil and gas extraction and production enhancement services",
+"unspsc",71131000,"Well fracturing services",
+"unspsc",71131001,"Acid based fluid well fracturing services",
+"unspsc",71131002,"Emulsion based fluid well fracturing services",
+"unspsc",71131003,"Foam based fluid well fracturing services",
+"unspsc",71131004,"Oil well fracturing services",
+"unspsc",71131005,"Oil well scale control services",
+"unspsc",71131006,"Well fracture testing services",
+"unspsc",71131007,"Well fracturing downhole evaluation services",
+"unspsc",71131008,"Well fracturing height control services",
+"unspsc",71131009,"Well fracturing monitoring services",
+"unspsc",71131010,"Well fracturing service design services",
+"unspsc",71131011,"Well fracturing service evaluation services",
+"unspsc",71131012,"Well fracturing surface evaluation services",
+"unspsc",71131013,"Well fracturing treatment quality control services",
+"unspsc",71131014,"Oil based fluid well fracturing services",
+"unspsc",71131015,"Other well fracturing services",
+"unspsc",71131016,"Well fracturing stress management services",
+"unspsc",71131017,"Water based fluid well fracturing services",
+"unspsc",71131100,"Matrix stimulation services",
+"unspsc",71131101,"Acid based matrix stimulation services",
+"unspsc",71131102,"Formation sealer matrix stimulation services",
+"unspsc",71131103,"Matrix organic cleanup services",
+"unspsc",71131104,"Matrix organic inhibition services",
+"unspsc",71131105,"Matrix scale cleanup services",
+"unspsc",71131106,"Matrix scale inhibition services",
+"unspsc",71131107,"Matrix treatment design services",
+"unspsc",71131108,"Matrix treatment diversion services",
+"unspsc",71131109,"Matrix treatment evaluation services",
+"unspsc",71131110,"Matrix treatment quality control services",
+"unspsc",71131111,"Non acid based matrix stimulation services",
+"unspsc",71131200,"Oilfield nitrogen services",
+"unspsc",71131201,"Nitrogen well services",
+"unspsc",71131300,"Other oilfield pumping services",
+"unspsc",71131301,"Bottom intake oilfield pumping services",
+"unspsc",71131302,"Cable deployed oilfield pumping services",
+"unspsc",71131303,"Co2 oilfield pumping services",
+"unspsc",71131304,"Coiled tubing deployed oilfield pumping services",
+"unspsc",71131305,"Downhole pumping services",
+"unspsc",71131306,"Dual completion well services",
+"unspsc",71131307,"Horizontal pumping well services",
+"unspsc",71131308,"Oilfield pumping installation pull or operation services",
+"unspsc",71131309,"Well profile modification services",
+"unspsc",71131310,"Oilfield spooling services",
+"unspsc",71131400,"Well production services",
+"unspsc",71131401,"Oilfield flare system services",
+"unspsc",71131402,"Oilfield hot oil or water service",
+"unspsc",71131403,"Oilfield steaming services",
+"unspsc",71140000,"Oil and gas restoration and reclamation services",
+"unspsc",71141000,"Emergency well control services",
+"unspsc",71141001,"Well pressure control services",
+"unspsc",71141002,"Well capping services",
+"unspsc",71141003,"Well fire fighting services",
+"unspsc",71141004,"Wild well control services",
+"unspsc",71141100,"Well plugging and abandonment services",
+"unspsc",71141101,"Well abandonment services",
+"unspsc",71141102,"Well plugging services",
+"unspsc",71141200,"Well site restoration",
+"unspsc",71141201,"Well cleaning or swabbing services",
+"unspsc",71141202,"Well site restoration services",
+"unspsc",71150000,"Oil and gas data management and processing services",
+"unspsc",71151000,"Oilfield data communication services",
+"unspsc",71151001,"Log data transmission services",
+"unspsc",71151002,"Log graphics transmission services",
+"unspsc",71151003,"Real time well data monitoring services",
+"unspsc",71151004,"Satellite well data transmission services",
+"unspsc",71151005,"Well data transmission services",
+"unspsc",71151100,"Oilfield data management services",
+"unspsc",71151101,"Oilfield asset data management services",
+"unspsc",71151102,"Oilfield data mining services",
+"unspsc",71151103,"Log data management services",
+"unspsc",71151104,"Oilfield mapping data management services",
+"unspsc",71151105,"Seismic data management services",
+"unspsc",71151200,"Oilfield economic and risk model services",
+"unspsc",71151201,"Oilfield budgeting services",
+"unspsc",71151202,"Oilfield capital planning services",
+"unspsc",71151203,"Oilfield decision tree services",
+"unspsc",71151300,"Oilfield interpretation services",
+"unspsc",71151301,"Oilfield bubble map services",
+"unspsc",71151302,"Oilfield case studies",
+"unspsc",71151303,"Oilfield decline analysis",
+"unspsc",71151304,"Oilfield field studies",
+"unspsc",71151305,"Oilfield fracturing interpretation services",
+"unspsc",71151306,"Geology services",
+"unspsc",71151307,"Geophysics services",
+"unspsc",71151308,"Gravel pack interpretation services",
+"unspsc",71151309,"Oilfield grid mapping services",
+"unspsc",71151310,"Oilfield mapping or visualization services",
+"unspsc",71151311,"Petrophysics services",
+"unspsc",71151312,"Reservoir engineering services",
+"unspsc",71151313,"Reservoir modeling services",
+"unspsc",71151314,"Reservoir simulation services",
+"unspsc",71151315,"Rock mechanics services",
+"unspsc",71151400,"Well service engineering",
+"unspsc",71151401,"Well cementing job design services",
+"unspsc",71151402,"Coiled tubing job design services",
+"unspsc",71151403,"Well drilling job design services",
+"unspsc",71151404,"Well fracturing job design services",
+"unspsc",71151405,"Matrix stimulation job design services",
+"unspsc",71151406,"Well sand control job design services",
+"unspsc",71160000,"Oil and gas well project management services",
+"unspsc",71161000,"Oilfield Modeling Services",
+"unspsc",71161001,"Oilfield completion models",
+"unspsc",71161002,"Oilfield drilling models",
+"unspsc",71161003,"Oilfield economic models",
+"unspsc",71161004,"Oilfield field development models",
+"unspsc",71161005,"Oilfield production models",
+"unspsc",71161006,"Oilfield risk management services",
+"unspsc",71161100,"Oilfield production engineering management",
+"unspsc",71161101,"Oilfield artificial lift services",
+"unspsc",71161102,"Enhanced oil recovery services",
+"unspsc",71161103,"Well injection services",
+"unspsc",71161104,"Oilfield nodal analysis services",
+"unspsc",71161105,"Well perforation services",
+"unspsc",71161106,"Oilfield production chemistry services",
+"unspsc",71161107,"Oilfield production monitoring services",
+"unspsc",71161109,"Well stimulation services",
+"unspsc",71161110,"Underground gas storage services",
+"unspsc",71161111,"Oilfield water management services",
+"unspsc",71161200,"Oilfield production operations management",
+"unspsc",71161201,"Oilfield hot oiling service",
+"unspsc",71161202,"Oilfield lease operations",
+"unspsc",71161203,"Oilfield logging services",
+"unspsc",71161204,"Oilfield paraffin cutting service",
+"unspsc",71161205,"Oilfield planning services",
+"unspsc",71161206,"Oilfield processing services",
+"unspsc",71161300,"Oilfield project management services",
+"unspsc",71161301,"Oilfield audits or inspection services",
+"unspsc",71161302,"Oilfield emergency response planning services",
+"unspsc",71161303,"Oilfield field development services",
+"unspsc",71161304,"Oilfield performance monitoring services",
+"unspsc",71161305,"Oilfield reporting services",
+"unspsc",71161306,"Oilfield succession plan or handover services",
+"unspsc",71161307,"Oilfield training matrix services",
+"unspsc",71161308,"Well site logistics or procurement services",
+"unspsc",71161400,"Well construction management services",
+"unspsc",71161402,"Well completion engineering services",
+"unspsc",71161403,"Deadman anchor services",
+"unspsc",71161405,"Well site pit lining services",
+"unspsc",71161407,"Well pulling unit services",
+"unspsc",71161408,"Shorebase services",
+"unspsc",71161409,"Test pit lining services",
+"unspsc",71161410,"Well site vacuum truck services",
+"unspsc",71161411,"Underbalanced applications engineering services",
+"unspsc",71161412,"Well workover services",
+"unspsc",71161413,"Well fabrication or construction services",
+"unspsc",71161500,"Well site operations services",
+"unspsc",71161501,"Well site electrical or instrumentation services",
+"unspsc",71161502,"Well site heavy equipment or crane services",
+"unspsc",71161503,"Well site inspection or equipment testing services",
+"unspsc",71161504,"Well instrument or meter services",
+"unspsc",71161505,"Well site valve or valve part services",
+"unspsc",72000000,"Building and Construction and Maintenance Services",
+"unspsc",72100000,"Building construction and support and maintenance and repair services",
+"unspsc",72101500,"Building support services",
+"unspsc",72101501,"Handyman services",
+"unspsc",72101502,"Scaffolding services",
+"unspsc",72101503,"Rigging services",
+"unspsc",72101504,"Disaster proofing or contingency services",
+"unspsc",72101505,"Locksmith services",
+"unspsc",72101506,"Elevator maintenance services.",
+"unspsc",72101600,"Roofing and siding and sheet metal work",
+"unspsc",72101601,"Roofing installation or repair",
+"unspsc",72101602,"Skylight installation",
+"unspsc",72101603,"Gutter or downspout services",
+"unspsc",72101604,"Architectural sheet metal work",
+"unspsc",72101605,"Ceiling erection or repair",
+"unspsc",72101606,"Chute installation",
+"unspsc",72101607,"Siding installation or repair",
+"unspsc",72101700,"Concrete work",
+"unspsc",72101701,"Exterior concrete or stucco services",
+"unspsc",72101702,"Grouting services",
+"unspsc",72101703,"Sidewalk or curb construction",
+"unspsc",72101704,"Foundation or slab work",
+"unspsc",72101800,"Exterior cleaning",
+"unspsc",72101801,"Sandblasting",
+"unspsc",72101802,"High pressure water blasting",
+"unspsc",72101803,"Steam cleaning",
+"unspsc",72101900,"Interior finishing",
+"unspsc",72101901,"Interior design or decorating",
+"unspsc",72101902,"Plastering or drywall",
+"unspsc",72101903,"Finish carpentry or cabinetry",
+"unspsc",72102000,"Coating and caulking and weather and water and fireproofing",
+"unspsc",72102001,"Caulking",
+"unspsc",72102002,"Plastic encasement or coating of structural materials",
+"unspsc",72102003,"Coating or glazing of metal or wood or concrete structural materials",
+"unspsc",72102004,"Dampproofing",
+"unspsc",72102005,"Fireproofing of buildings",
+"unspsc",72102006,"Wrapping of pipes",
+"unspsc",72102100,"Pest control",
+"unspsc",72102101,"Bird proofing services",
+"unspsc",72102102,"Termite control services",
+"unspsc",72102103,"Extermination or fumigation services",
+"unspsc",72102104,"Structural pest control",
+"unspsc",72102105,"Animal trapping",
+"unspsc",72102106,"Rodent control",
+"unspsc",72102200,"Electrical services",
+"unspsc",72102201,"Electric power systems installation or service",
+"unspsc",72102202,"Electronic controls installation",
+"unspsc",72102203,"Communication equipment installation",
+"unspsc",72102204,"Safety or security systems installation",
+"unspsc",72102205,"Telecom equipment maintenance or support",
+"unspsc",72102206,"Underground engineering for communication equipment",
+"unspsc",72102207,"Overground engineering for communication equipment",
+"unspsc",72102208,"Cable laying",
+"unspsc",72102209,"Cable pulling",
+"unspsc",72102300,"Plumbing and heating and air conditioning",
+"unspsc",72102301,"Boiler installation or adjustment or maintenance or repair services",
+"unspsc",72102302,"Heating systems installation repair or maintenance",
+"unspsc",72102303,"Plumbing system construction",
+"unspsc",72102304,"Plumbing system maintenance or repair",
+"unspsc",72102305,"Air conditioning installation or maintenance or repair services",
+"unspsc",72102400,"Painting and paper hanging",
+"unspsc",72102401,"Exterior painting services",
+"unspsc",72102402,"Interior painting services",
+"unspsc",72102403,"Wallcovering services",
+"unspsc",72102404,"Industrial or specialized paint application for aircraft or ship or bridge",
+"unspsc",72102405,"Pavement marking services",
+"unspsc",72102500,"Masonry and stonework and tile setting",
+"unspsc",72102501,"Bricklaying",
+"unspsc",72102502,"Chimney construction or maintenance",
+"unspsc",72102503,"Marble or stone or tile installation",
+"unspsc",72102504,"Retaining wall construction",
+"unspsc",72102505,"Fresco work",
+"unspsc",72102506,"Acoustical",
+"unspsc",72102507,"Insulating material installation",
+"unspsc",72102508,"Restoration of masonry or stonework or tile",
+"unspsc",72102600,"Carpentry",
+"unspsc",72102601,"Rough carpentry",
+"unspsc",72102602,"Windows or door or fixture installation",
+"unspsc",72102700,"Flooring service",
+"unspsc",72102701,"Floor sheathing or laying or installation or finishing",
+"unspsc",72102702,"Floor covering installation or maintenance",
+"unspsc",72102703,"Floor cleaning services",
+"unspsc",72102800,"Refurbishing services",
+"unspsc",72102801,"Renovation of buildings or landmarks or monuments",
+"unspsc",72102802,"Restoration of buildings or landmarks or monuments",
+"unspsc",72102900,"Grounds maintenance services",
+"unspsc",72102901,"Snow removal services",
+"unspsc",72102902,"Landscaping services",
+"unspsc",72102903,"Parking lot or road maintenance or repairs or services",
+"unspsc",72102904,"Parking lot or road sweeping services",
+"unspsc",72102905,"Exterior grounds maintenance",
+"unspsc",72103000,"Site preparation services",
+"unspsc",72103001,"Land clearing services",
+"unspsc",72103002,"Land levelling services",
+"unspsc",72103003,"Demolition services",
+"unspsc",72103004,"Digging services",
+"unspsc",72130000,"General building construction",
+"unspsc",72131500,"Residential construction",
+"unspsc",72131501,"Apartment construction",
+"unspsc",72131502,"Single family home construction",
+"unspsc",72131600,"Commercial or industrial construction",
+"unspsc",72131601,"Power plant construction",
+"unspsc",72131700,"Infrastructure construction",
+"unspsc",72131701,"Highway or road paving or surfacing",
+"unspsc",72131702,"Bridge construction",
+"unspsc",73000000,"Industrial Production and Manufacturing Services",
+"unspsc",73100000,"Plastic and chemical industries",
+"unspsc",73101500,"Petrochemical and plastic production",
+"unspsc",73101501,"Petroleum refining services",
+"unspsc",73101502,"Natural gas production services",
+"unspsc",73101503,"Oils or greases production services",
+"unspsc",73101504,"Coal production services",
+"unspsc",73101505,"Plastics or resins or fibers manufacturing services",
+"unspsc",73101600,"Chemicals and fertilizers production",
+"unspsc",73101601,"Inorganic chemicals production services",
+"unspsc",73101602,"Soda ash or chlorine or caustic soda production services",
+"unspsc",73101603,"Inorganic acids production services",
+"unspsc",73101604,"Organic chemical production services",
+"unspsc",73101605,"Acetylene or derivatives production services",
+"unspsc",73101606,"Ethylene or derivatives production services",
+"unspsc",73101607,"Ethanol or methanol or derivatives production services",
+"unspsc",73101608,"Fertilizers production services",
+"unspsc",73101609,"Potash mining or processing services",
+"unspsc",73101610,"Pesticide production services",
+"unspsc",73101611,"Paints or varnishes or lacquers production services",
+"unspsc",73101612,"Soap or cleaning preparations or perfumes or cosmetics production services",
+"unspsc",73101613,"Solvents or glycols or detergents production services",
+"unspsc",73101614,"Ferments or enzymes services",
+"unspsc",73101700,"Pharmaceutical production",
+"unspsc",73101701,"Drugs or medicine production services",
+"unspsc",73101702,"Vaccines or sera or antibiotics production services",
+"unspsc",73101703,"Parapharmaceutical production services",
+"unspsc",73101800,"Biochemical and biotechnology production",
+"unspsc",73101801,"Biomass production services",
+"unspsc",73101802,"Bioprotein production services",
+"unspsc",73101900,"Rubber production",
+"unspsc",73101901,"Rubber milling services",
+"unspsc",73101902,"Rubber tires or tubes production services",
+"unspsc",73101903,"Rubber or plastic footwear production services",
+"unspsc",73110000,"Wood and paper industries",
+"unspsc",73111500,"Wood processing",
+"unspsc",73111501,"Sawmilling services",
+"unspsc",73111502,"Veneer production services",
+"unspsc",73111503,"Wood base panels manufacturing services",
+"unspsc",73111504,"Wooden containers manufacturing services",
+"unspsc",73111505,"Furniture manufacturing services",
+"unspsc",73111506,"Cork products manufacturing services",
+"unspsc",73111507,"Cane or wickerware processing services",
+"unspsc",73111600,"Pulp and paper processing",
+"unspsc",73111601,"Pulp production services",
+"unspsc",73111602,"Paper or paper board production services",
+"unspsc",73111603,"Hardboard or fiberboard production services",
+"unspsc",73111604,"Paper production or recycling services",
+"unspsc",73120000,"Metal and mineral industries",
+"unspsc",73121500,"Metal smelting and refining and forming processes",
+"unspsc",73121501,"Ferrous alloy production services",
+"unspsc",73121502,"Basic metal combination processes services",
+"unspsc",73121503,"Refractors services for iron or steel production",
+"unspsc",73121504,"Iron or steel making services",
+"unspsc",73121505,"Iron or steel forging services",
+"unspsc",73121506,"Pre finishing iron or steel processes services",
+"unspsc",73121507,"Finishing metal processing services",
+"unspsc",73121508,"Smelting metal services",
+"unspsc",73121509,"Refining metal services",
+"unspsc",73121600,"Metal finishing",
+"unspsc",73121601,"Metal cutting services",
+"unspsc",73121602,"Blacksmith services",
+"unspsc",73121603,"Metal heating services",
+"unspsc",73121606,"Metal forging services",
+"unspsc",73121607,"Metal drawing services",
+"unspsc",73121608,"Metal extruding services",
+"unspsc",73121610,"Horseshoeing services",
+"unspsc",73121611,"Tinsmithing services",
+"unspsc",73121612,"Rebabbiting services",
+"unspsc",73121613,"Metal casting services",
+"unspsc",73121800,"Non metallic mineral products industry services",
+"unspsc",73121801,"Pottery or china or earthenware manufacturing services",
+"unspsc",73121802,"Glass or glass products manufacturing services",
+"unspsc",73121803,"Structural clay products manufacturing services",
+"unspsc",73121804,"Cement or lime or plaster manufacturing services",
+"unspsc",73121805,"Concrete or aggregates or stone products manufacturing services",
+"unspsc",73121806,"Abrasives manufacturing services",
+"unspsc",73121807,"Asbestos products manufacturing services",
+"unspsc",73130000,"Food and beverage industries",
+"unspsc",73131500,"Beverage processing",
+"unspsc",73131501,"Spirits distilling or blending services",
+"unspsc",73131502,"Wine processing services",
+"unspsc",73131503,"Brewery processing services",
+"unspsc",73131504,"Non alcoholic fruit based beverage processing services",
+"unspsc",73131505,"Water beverages processing services",
+"unspsc",73131506,"Infused beverages processing services",
+"unspsc",73131507,"Coffee processing services",
+"unspsc",73131508,"Tea processing services",
+"unspsc",73131600,"Meat and poultry and seafood processing",
+"unspsc",73131601,"Meat products or by products processing services",
+"unspsc",73131602,"Fish or fish products processing services",
+"unspsc",73131603,"Poultry processing services",
+"unspsc",73131604,"Meat hygiene or inspection services",
+"unspsc",73131605,"Meat plant operation or management services",
+"unspsc",73131606,"Slaughter houses services",
+"unspsc",73131607,"Butcher services",
+"unspsc",73131608,"Cold storage services",
+"unspsc",73131700,"Fruits and vegetables processing",
+"unspsc",73131701,"Fruit or vegetable cleaning services",
+"unspsc",73131702,"Fruit or vegetable spraying services",
+"unspsc",73131703,"Fruit or vegetable packing services",
+"unspsc",73131800,"Dairy and eggs processing",
+"unspsc",73131801,"Milk processing services",
+"unspsc",73131802,"Egg processing services",
+"unspsc",73131803,"Cheese processing services",
+"unspsc",73131804,"Butter or cream processing services",
+"unspsc",73131900,"Grains and sugar and oils and fat processing",
+"unspsc",73131902,"Cereal products processing services",
+"unspsc",73131903,"Sugar or sugar products processing services",
+"unspsc",73131904,"Vegetable oils or fats processing services",
+"unspsc",73131905,"Spice processing services",
+"unspsc",73131906,"Bakery products processing services",
+"unspsc",73140000,"Fibers and textiles and fabric industries",
+"unspsc",73141500,"Fiber production",
+"unspsc",73141501,"Rayon or acetate fiber manufacturing services",
+"unspsc",73141502,"Glass fiber manufacturing services",
+"unspsc",73141503,"Silk fiber manufacturing services",
+"unspsc",73141504,"Cotton fiber manufacturing services",
+"unspsc",73141505,"Wool fiber manufacturing services",
+"unspsc",73141506,"Polyester fiber manufacturing services",
+"unspsc",73141507,"Polyamide fiber manufacturing services",
+"unspsc",73141508,"Acrylic fiber manufacturing services",
+"unspsc",73141600,"Thread and yarn processing",
+"unspsc",73141601,"Thread processing services",
+"unspsc",73141602,"Yarn processing services",
+"unspsc",73141700,"Fabrics and leather production",
+"unspsc",73141701,"Broad woven fabrics manufacturing services",
+"unspsc",73141702,"Narrow woven fabrics manufacturing services",
+"unspsc",73141703,"Knitwear manufacturing services",
+"unspsc",73141704,"Carpet or rug manufacturing services",
+"unspsc",73141705,"Cordage or rope or twine manufacturing services",
+"unspsc",73141706,"Dyeing or printing or finishing services",
+"unspsc",73141707,"Woven suits or coats or overcoats manufacturing services",
+"unspsc",73141708,"Woven outerwear clothing manufacturing services",
+"unspsc",73141709,"Fur dressing or dyeing services",
+"unspsc",73141710,"Leather footwear manufacturing services",
+"unspsc",73141711,"Leather luggage or handbags manufacturing services",
+"unspsc",73141712,"Leather tanning or finishing manufacturing services",
+"unspsc",73141713,"Nonwoven fabric services",
+"unspsc",73141714,"Braided yarn or fabric services",
+"unspsc",73141715,"Industrial sewing services",
+"unspsc",73150000,"Manufacturing support services",
+"unspsc",73151500,"Assembly services",
+"unspsc",73151501,"Assembly line work",
+"unspsc",73151502,"Joint sealing services",
+"unspsc",73151600,"Packaging services",
+"unspsc",73151601,"Canning plants services",
+"unspsc",73151602,"Packaging of agricultural by products services",
+"unspsc",73151603,"Packaging of non food products services",
+"unspsc",73151604,"Packaging of pharmaceuticals services",
+"unspsc",73151605,"Point of purchase display packaging services",
+"unspsc",73151606,"Manual hand packaging services",
+"unspsc",73151607,"Machine assisted packaging services",
+"unspsc",73151700,"Material treatment",
+"unspsc",73151701,"Water proofing material treatment services",
+"unspsc",73151702,"Fire protection material treatment services",
+"unspsc",73151703,"Anticorrosion material treatment services",
+"unspsc",73151800,"Converting services",
+"unspsc",73151801,"Sheeting services",
+"unspsc",73151802,"Slitting services",
+"unspsc",73151803,"Die cutting services",
+"unspsc",73151804,"Folding services",
+"unspsc",73151805,"Laminating services",
+"unspsc",73151900,"Industrial printing services",
+"unspsc",73151901,"Flexographic industrial printing services",
+"unspsc",73151902,"Rotogravure industrial printing services",
+"unspsc",73151903,"Screen industrial printing services",
+"unspsc",73151904,"Offset industrial printing services",
+"unspsc",73151905,"Digital industrial printing services",
+"unspsc",73151906,"Thermal transfer industrial printing services",
+"unspsc",73151907,"Compact disk CD duplication and printing services",
+"unspsc",73152000,"Filling Services",
+"unspsc",73152001,"Liquid filling services",
+"unspsc",73152002,"Aerosol filling services",
+"unspsc",73152003,"Paste filling services",
+"unspsc",73152004,"Powder filling services",
+"unspsc",73152100,"Manufacturing equipment maintenance and repair services",
+"unspsc",73152101,"Manufacturing equipment maintenance services",
+"unspsc",73152102,"Manufacturing equipment repair services",
+"unspsc",73160000,"Machinery and transport equipment manufacture",
+"unspsc",73161500,"Manufacture of machinery",
+"unspsc",73161501,"Engine or turbine manufacturing services",
+"unspsc",73161502,"Agricultural machinery or equipment manufacturing services",
+"unspsc",73161503,"Machine tools or metal or wood working manufacturing services",
+"unspsc",73161504,"Special industrial plants or machinery manufacturing services",
+"unspsc",73161505,"Construction machinery or equipment manufacturing services",
+"unspsc",73161506,"Mining machinery or equipment manufacturing services",
+"unspsc",73161507,"Food products machinery or equipment manufacturing services",
+"unspsc",73161508,"Paper printing machinery or equipment manufacture services",
+"unspsc",73161509,"Metallurgical machinery or equipment manufacture services",
+"unspsc",73161510,"Chemical or pharmaceutical machinery or equipment manufacture services",
+"unspsc",73161511,"Cement plant machinery or equipment manufacture services",
+"unspsc",73161512,"Textile machinery or equipment manufacture services",
+"unspsc",73161513,"Power plant boilers manufacture services",
+"unspsc",73161514,"Furnaces or ovens manufacture services",
+"unspsc",73161515,"Office machinery or equipment manufacture services",
+"unspsc",73161516,"Lifting or hoisting or conveying equipment manufacture services",
+"unspsc",73161517,"Air conditioning or ventilating or refrigeration equipment manufacture services",
+"unspsc",73161518,"Domestic appliances or machines except electrical manufacture services",
+"unspsc",73161519,"Pumps or compressors manufacture services",
+"unspsc",73161600,"Manufacture of transport equipment",
+"unspsc",73161601,"Fishing ship or boat building services",
+"unspsc",73161602,"Railroad rolling stock manufacture services",
+"unspsc",73161603,"Locomotive manufacture services",
+"unspsc",73161604,"Motor vehicles manufacture services",
+"unspsc",73161605,"Motor vehicles parts or accessories manufacture services",
+"unspsc",73161606,"Motorcycle or bicycle manufacture services",
+"unspsc",73161607,"Air or spacecraft manufacture services",
+"unspsc",73170000,"Manufacture of electrical goods and precision instruments",
+"unspsc",73171500,"Manufacture of electrical goods",
+"unspsc",73171501,"Power generation or transmission or distribution equipment manufacture services",
+"unspsc",73171502,"Dry or storage battery manufacture services",
+"unspsc",73171503,"Electrical tools manufacture services",
+"unspsc",73171504,"Measuring or testing instruments manufacture services",
+"unspsc",73171505,"Radio or television manufacture services",
+"unspsc",73171506,"Communication equipment manufacture services",
+"unspsc",73171507,"Electrical household appliances manufacture services",
+"unspsc",73171508,"Insulated wire or cable manufacture services",
+"unspsc",73171510,"Electrical accessories or supplies manufacture services",
+"unspsc",73171511,"Electronic equipment manufacture services",
+"unspsc",73171512,"Electronic computers or data processing equipment manufacture services",
+"unspsc",73171600,"Manufacture of precision instruments",
+"unspsc",73171601,"Scientific instruments or measuring equipment manufacture services",
+"unspsc",73171602,"Medical or dental equipment manufacture services",
+"unspsc",73171603,"Photographic or optical equipment manufacture services",
+"unspsc",73171604,"Watches or clocks manufacture services",
+"unspsc",73171605,"Laboratory equipment manufacture services",
+"unspsc",73180000,"Machining and processing services",
+"unspsc",73181000,"Machining services",
+"unspsc",73181001,"Turning services",
+"unspsc",73181002,"Electro discharge machining EDM services",
+"unspsc",73181003,"Electro chemical machining ECM services",
+"unspsc",73181004,"Chem milling services",
+"unspsc",73181005,"Punching services",
+"unspsc",73181006,"Stamping services",
+"unspsc",73181007,"Boring services",
+"unspsc",73181008,"Drilling services",
+"unspsc",73181009,"Tapping services",
+"unspsc",73181010,"Laser services",
+"unspsc",73181011,"Bending services",
+"unspsc",73181012,"Grinding services",
+"unspsc",73181013,"Shot blasting services",
+"unspsc",73181014,"Polishing services",
+"unspsc",73181015,"Flame cutting services",
+"unspsc",73181016,"Laser cutting services",
+"unspsc",73181017,"Plasma cutting services",
+"unspsc",73181018,"Water jet cutting services",
+"unspsc",73181019,"Rolling Services",
+"unspsc",73181020,"Surface treatment Services",
+"unspsc",73181021,"Milling services",
+"unspsc",73181022,"Spraying services",
+"unspsc",73181023,"Sharpening service",
+"unspsc",73181100,"Coating services",
+"unspsc",73181101,"Electro coating services",
+"unspsc",73181102,"Dipping services",
+"unspsc",73181103,"Wrapping services",
+"unspsc",73181104,"Painting services",
+"unspsc",73181105,"Web coating services",
+"unspsc",73181106,"Plating services",
+"unspsc",73181200,"Forming services",
+"unspsc",73181201,"Draw forming services",
+"unspsc",73181202,"Hydro forming services",
+"unspsc",73181203,"Roll forming services",
+"unspsc",73181204,"Stretch forming services",
+"unspsc",73181205,"Spin forming services",
+"unspsc",73181206,"Explosive forming services",
+"unspsc",73181300,"Heat treatment services",
+"unspsc",73181301,"Quench or temper services",
+"unspsc",73181302,"Annealing services",
+"unspsc",73181303,"Normalizing services",
+"unspsc",73181304,"Aging or stabilizing services",
+"unspsc",73181900,"Welding and brazing and soldering services",
+"unspsc",73181901,"Arc welding services",
+"unspsc",73181902,"Metal inert gas MIG welding services",
+"unspsc",73181903,"Tungsten inert gas TIG welding services",
+"unspsc",73181904,"Laser welding services",
+"unspsc",73181905,"Spot welding services",
+"unspsc",73181906,"Projection welding services",
+"unspsc",73181907,"Brazing services",
+"unspsc",73181908,"Soldering services",
+"unspsc",76000000,"Industrial Cleaning Services",
+"unspsc",76100000,"Decontamination services",
+"unspsc",76101500,"Disinfection",
+"unspsc",76101501,"Washroom sanitation services",
+"unspsc",76101502,"Rest room cleaning services",
+"unspsc",76101503,"Disinfection or deodorizing services",
+"unspsc",76101600,"Hazardous material decontamination",
+"unspsc",76101601,"Radioactive decontamination services",
+"unspsc",76101602,"Asbestos decontamination or removal",
+"unspsc",76110000,"Cleaning and janitorial services",
+"unspsc",76111500,"General building and office cleaning and maintenance services",
+"unspsc",76111501,"Building cleaning services",
+"unspsc",76111503,"Lighting maintenance services",
+"unspsc",76111504,"Window or window blind cleaning services",
+"unspsc",76111505,"Fabric and furniture cleaning services",
+"unspsc",76111506,"Interior plant landscaping services",
+"unspsc",76111600,"Building component cleaning services",
+"unspsc",76111601,"Acoustical tile or ceiling cleaning services",
+"unspsc",76111602,"Air duct cleaning",
+"unspsc",76111603,"Chimney cleaning",
+"unspsc",76111604,"Floor waxing or carpet cleaning",
+"unspsc",76111605,"Exhaust hood or fan clearing",
+"unspsc",76111700,"Building site clean up",
+"unspsc",76111701,"Construction site clean up services",
+"unspsc",76111702,"Construction site haul away services",
+"unspsc",76111800,"Transport vehicle cleaning",
+"unspsc",76111801,"Car or boat detailing",
+"unspsc",76120000,"Refuse disposal and treatment",
+"unspsc",76121500,"Refuse collection and disposal",
+"unspsc",76121501,"Garbage collection or destruction or processing or disposal",
+"unspsc",76121502,"Liquid waste collection or processing or disposal",
+"unspsc",76121503,"Street cleaning services",
+"unspsc",76121600,"Nonhazardous waste disposal",
+"unspsc",76121601,"Garbage dump",
+"unspsc",76121602,"Sanitary landfill operations",
+"unspsc",76121603,"Sludge disposal",
+"unspsc",76121604,"Dead animal disposal services",
+"unspsc",76121700,"Liquid waste treatment",
+"unspsc",76121701,"Sewage treatment services",
+"unspsc",76121702,"Chemical treatment services",
+"unspsc",76121800,"Refuse treatment",
+"unspsc",76121801,"Recycling services",
+"unspsc",76121900,"Hazardous waste disposal",
+"unspsc",76121901,"Medical waste disposal",
+"unspsc",76121902,"Acid waste collection or disposal",
+"unspsc",76121903,"Chemical detoxification",
+"unspsc",76130000,"Toxic and hazardous waste cleanup",
+"unspsc",76131500,"Nuclear waste treatment",
+"unspsc",76131501,"Radioactive waste material treatment",
+"unspsc",76131502,"Radioactive containment services",
+"unspsc",76131600,"Toxic spill cleanup",
+"unspsc",76131601,"Toxic spill containment",
+"unspsc",76131602,"Toxic substances spill cleanup",
+"unspsc",76131700,"Oil spill cleanup",
+"unspsc",76131701,"Oil residue disposal or control services",
+"unspsc",76131702,"Oil spill treatment services",
+"unspsc",77000000,"Environmental Services",
+"unspsc",77100000,"Environmental management",
+"unspsc",77101500,"Environmental impact assessment",
+"unspsc",77101501,"Risk or hazard assessment",
+"unspsc",77101502,"Environmental standards",
+"unspsc",77101503,"Environmental indicators analysis",
+"unspsc",77101504,"Environmental Impact Assessment EIA services",
+"unspsc",77101505,"Environmental monitoring",
+"unspsc",77101600,"Environmental planning",
+"unspsc",77101601,"Urban environmental development planning",
+"unspsc",77101602,"Forest conservation strategy planning",
+"unspsc",77101603,"Marine conservation strategy planning",
+"unspsc",77101604,"Natural resources management or conservation strategy planning services",
+"unspsc",77101605,"Environmental institution building or planning",
+"unspsc",77101700,"Environmental advisory services",
+"unspsc",77101701,"Environmental sciences advisory services",
+"unspsc",77101702,"Environmental chemistry advisory services",
+"unspsc",77101703,"Environmental ethics advisory services",
+"unspsc",77101704,"Environmental technology advisory services",
+"unspsc",77101705,"Environmental economics advisory services",
+"unspsc",77101706,"Environmental law advisory services",
+"unspsc",77101707,"Ecology advisory services",
+"unspsc",77101800,"Environmental auditing",
+"unspsc",77101801,"Environmental information systems",
+"unspsc",77101802,"Corporate environmental auditing services",
+"unspsc",77101803,"Sectoral environmental auditing services",
+"unspsc",77101804,"Activity specific environmental auditing services",
+"unspsc",77101805,"Environmental quality control services",
+"unspsc",77101806,"Environmental security control services",
+"unspsc",77101900,"Pollution investigation services",
+"unspsc",77101901,"Industrial site investigation",
+"unspsc",77101902,"Industrial waste site investigation",
+"unspsc",77101903,"Gasworks site investigation",
+"unspsc",77101904,"Chemical works or oil refinery waste site investigation",
+"unspsc",77101905,"Wood treatment plant site investigation",
+"unspsc",77101906,"Oil depot or terminal site investigation",
+"unspsc",77101907,"Dry cleaning plants site investigation",
+"unspsc",77101908,"Foundry site investigation",
+"unspsc",77101909,"Recycling plant site investigation",
+"unspsc",77101910,"Food processing plant site investigation",
+"unspsc",77110000,"Environmental protection",
+"unspsc",77111500,"Environmental safety services",
+"unspsc",77111501,"Landscape protection services",
+"unspsc",77111502,"Ozone protection services",
+"unspsc",77111503,"Food or feed contamination protection services",
+"unspsc",77111504,"Genetic resources protection services",
+"unspsc",77111505,"Toxic substances protection services",
+"unspsc",77111506,"Radiation protection services",
+"unspsc",77111507,"Endangered species protection services",
+"unspsc",77111508,"Natural risks or hazards protection services",
+"unspsc",77111600,"Environmental rehabilitation",
+"unspsc",77111601,"Industrial site rehabilitation",
+"unspsc",77111602,"Environmental decontamination services",
+"unspsc",77111603,"Land reclamation services",
+"unspsc",77120000,"Pollution tracking and monitoring and rehabilitation",
+"unspsc",77121500,"Air pollution",
+"unspsc",77121501,"Air quality management",
+"unspsc",77121502,"Transboundary air pollution management or control services",
+"unspsc",77121503,"Air pollution protection services",
+"unspsc",77121504,"Air pollution monitoring or measurement services",
+"unspsc",77121505,"Toxic gas detection services",
+"unspsc",77121506,"Methane monitoring",
+"unspsc",77121507,"Carbon dioxide monitoring services",
+"unspsc",77121508,"Airborne particle monitoring",
+"unspsc",77121509,"Ozone depletion monitoring services",
+"unspsc",77121600,"Soil pollution",
+"unspsc",77121601,"Soil pollution protection services",
+"unspsc",77121602,"Polluted soil removal services",
+"unspsc",77121603,"Polluted soil treatment or rehabilitation",
+"unspsc",77121604,"Soil pollution advisory services",
+"unspsc",77121605,"Soil pollution mapping",
+"unspsc",77121606,"Soil pollution measurement or monitoring",
+"unspsc",77121607,"Organic fertilizer pollution assessment",
+"unspsc",77121608,"Pesticides pollution assessment",
+"unspsc",77121609,"Nitrates pollution assessment",
+"unspsc",77121610,"Phosphates pollution assessment",
+"unspsc",77121700,"Water pollution",
+"unspsc",77121701,"Surface water pollution monitoring or control services",
+"unspsc",77121702,"Surface water pollution rehabilitation services",
+"unspsc",77121703,"Surface water pollution protection services",
+"unspsc",77121704,"Surface water treatment services",
+"unspsc",77121705,"Surface water pollution drainage services",
+"unspsc",77121706,"Transboundary water pollution management or control services",
+"unspsc",77121707,"Groundwater pollution monitoring or control services",
+"unspsc",77121708,"Groundwater pollution drainage services",
+"unspsc",77121709,"Groundwater pollution treatment or rehabilitation",
+"unspsc",77130000,"Pollutants tracking and monitoring and rehabilitation services",
+"unspsc",77131500,"Oil pollution",
+"unspsc",77131501,"Oil spillage monitoring services",
+"unspsc",77131502,"Oil spillage control services",
+"unspsc",77131503,"Oil spillage rehabilitation services",
+"unspsc",77131600,"Noise pollution",
+"unspsc",77131601,"Noise control services",
+"unspsc",77131602,"Noise pollution protection services",
+"unspsc",77131603,"Noise pollution monitoring services",
+"unspsc",77131604,"Noise pollution advisory services",
+"unspsc",77131700,"Toxic substances pollution",
+"unspsc",77131701,"Toxic substances monitoring services",
+"unspsc",77131702,"Toxic substances rehabilitation services",
+"unspsc",78000000,"Transportation and Storage and Mail Services",
+"unspsc",78100000,"Mail and cargo transport",
+"unspsc",78101500,"Air cargo transport",
+"unspsc",78101501,"Domestic air cargo transport",
+"unspsc",78101502,"International air cargo transport",
+"unspsc",78101503,"Armored air transport",
+"unspsc",78101600,"Rail cargo transport",
+"unspsc",78101601,"Boxcar transport services",
+"unspsc",78101602,"Bulk cargo rail transport services",
+"unspsc",78101603,"Livestock rail transport",
+"unspsc",78101604,"Vehicle transport services",
+"unspsc",78101700,"Marine cargo transport",
+"unspsc",78101701,"Domestic vessel transport services",
+"unspsc",78101702,"International vessel transport services",
+"unspsc",78101703,"Domestic barge transport services",
+"unspsc",78101704,"International barge transport services",
+"unspsc",78101705,"Armored marine transport",
+"unspsc",78101800,"Road cargo transport",
+"unspsc",78101801,"Local area trucking services",
+"unspsc",78101802,"Regional or national trucking services",
+"unspsc",78101803,"Vehicle carrier services",
+"unspsc",78101804,"Relocation services",
+"unspsc",78101900,"Intermodal cargo transport",
+"unspsc",78101901,"Air to ocean transportation",
+"unspsc",78101902,"Ocean to rail transportation",
+"unspsc",78101903,"Ocean to truck transportation",
+"unspsc",78101904,"Air to truck transport",
+"unspsc",78101905,"Rail truck transportation",
+"unspsc",78102000,"Spacecraft cargo transport",
+"unspsc",78102001,"Satellite launch services",
+"unspsc",78102002,"Experimental payload services",
+"unspsc",78102100,"Pipeline services",
+"unspsc",78102101,"Petroleum products transport",
+"unspsc",78102102,"Water transport",
+"unspsc",78102200,"Postal and small parcel and courier services",
+"unspsc",78102201,"National postal delivery services",
+"unspsc",78102202,"Post office box services",
+"unspsc",78102203,"Mailing or mail pick up or delivery services",
+"unspsc",78102204,"Letter or small parcel worldwide delivery services",
+"unspsc",78102205,"Letter or small parcel local delivery services",
+"unspsc",78102206,"Bicycle or scooter messenger services",
+"unspsc",78110000,"Passenger transport",
+"unspsc",78111500,"Passenger air transportation",
+"unspsc",78111501,"Helicopter services",
+"unspsc",78111502,"Commercial airplane travel",
+"unspsc",78111503,"Chartered airplane travel",
+"unspsc",78111600,"Passenger railway transportation",
+"unspsc",78111601,"Light rail vehicle transport LRV services",
+"unspsc",78111602,"Subway transport",
+"unspsc",78111603,"Continental or inter continental rail services",
+"unspsc",78111700,"Passenger marine transportation",
+"unspsc",78111701,"Water taxis",
+"unspsc",78111702,"Overnight ship cruises",
+"unspsc",78111703,"Sightseeing boat excursions",
+"unspsc",78111800,"Passenger road transportation",
+"unspsc",78111802,"Scheduled bus services",
+"unspsc",78111803,"Chartered bus services",
+"unspsc",78111804,"Taxicab services",
+"unspsc",78111807,"Parking fees",
+"unspsc",78111808,"Vehicle rental",
+"unspsc",78111809,"Vehicle leasing",
+"unspsc",78111900,"Space transportation",
+"unspsc",78111901,"Experimental or educational missions",
+"unspsc",78120000,"Material packing and handling",
+"unspsc",78121500,"Packing",
+"unspsc",78121501,"Containerization of goods",
+"unspsc",78121502,"Crating services",
+"unspsc",78121600,"Material handling services",
+"unspsc",78121601,"Freight loading or unloading",
+"unspsc",78121602,"Weighing services",
+"unspsc",78130000,"Storage",
+"unspsc",78131500,"Farm products warehousing",
+"unspsc",78131501,"Silo services",
+"unspsc",78131502,"Grain elevator services",
+"unspsc",78131600,"General goods storage",
+"unspsc",78131601,"Palletized cargo storage",
+"unspsc",78131602,"File archive storage",
+"unspsc",78131603,"Furniture storage",
+"unspsc",78131700,"Bulk storage",
+"unspsc",78131701,"In ground storage services",
+"unspsc",78131800,"Specialized warehousing and storage",
+"unspsc",78131801,"Refrigerated storage",
+"unspsc",78131802,"Customs bonded storage services",
+"unspsc",78131803,"Hazardous materials storage",
+"unspsc",78131804,"Document storage services",
+"unspsc",78131805,"Storage of automatic teller machines",
+"unspsc",78140000,"Transport operations",
+"unspsc",78141500,"Transport arrangements",
+"unspsc",78141501,"Freight forwarders services",
+"unspsc",78141502,"Customs brokerage services",
+"unspsc",78141503,"Transportation industry tariff comparison or freight audit services",
+"unspsc",78141600,"Inspection",
+"unspsc",78141601,"Packing inspection services",
+"unspsc",78141602,"Cargo survey services",
+"unspsc",78141603,"Pest control inspections",
+"unspsc",78141700,"Navigational services",
+"unspsc",78141701,"Tugboat services",
+"unspsc",78141702,"Drawbridge operations",
+"unspsc",78141703,"Marine navigational or communication services",
+"unspsc",78141800,"Terminal services",
+"unspsc",78141801,"Stevedoring services",
+"unspsc",78141802,"Vessel docking services",
+"unspsc",78141803,"Vessel stores services",
+"unspsc",78180000,"Transportation repair or maintenance services",
+"unspsc",78180100,"Vehicle maintenance and repair services",
+"unspsc",78180101,"Vehicle body repair or painting services",
+"unspsc",78180102,"Transmission repair",
+"unspsc",78180103,"Oil or transmission fluid change services",
+"unspsc",78180104,"Landing gear repair",
+"unspsc",78180200,"Panel and paint services",
+"unspsc",78180201,"Panelbeating services",
+"unspsc",78180300,"Transport fuelling and vehicle storage and support services",
+"unspsc",78180301,"Fuelling of vehicles",
+"unspsc",78180302,"Transportation storage",
+"unspsc",78180303,"Vehicle parking services",
+"unspsc",80000000,"Management and Business Professionals and Administrative Services",
+"unspsc",80100000,"Management advisory services",
+"unspsc",80101500,"Business and corporate management consultation services",
+"unspsc",80101501,"New business start up consultation services",
+"unspsc",80101502,"Corporate mergers consultation services",
+"unspsc",80101503,"Corporate divestiture consultation services",
+"unspsc",80101504,"Strategic planning consultation services",
+"unspsc",80101505,"Corporate objectives or policy development",
+"unspsc",80101506,"Organizational structure consultation",
+"unspsc",80101507,"Information technology consultation services",
+"unspsc",80101508,"Business intelligence consulting services",
+"unspsc",80101600,"Project management",
+"unspsc",80101601,"Feasibility studies or screening of project ideas",
+"unspsc",80101602,"Regional or location studies for projects",
+"unspsc",80101603,"Economic or financial evaluation of projects",
+"unspsc",80101604,"Project administration or planning",
+"unspsc",80101700,"Industrial management",
+"unspsc",80101701,"Factory management services",
+"unspsc",80101702,"Productivity or efficiency studies or implementation",
+"unspsc",80101703,"Specification standardization services",
+"unspsc",80101704,"Supply chain analysis or re engineering services",
+"unspsc",80101705,"Co operative or consortium services",
+"unspsc",80101706,"Professional procurement services",
+"unspsc",80101707,"Lobbying services",
+"unspsc",80110000,"Human resources services",
+"unspsc",80111500,"Human resource development",
+"unspsc",80111501,"Management development",
+"unspsc",80111502,"Compensation or benefits planning",
+"unspsc",80111503,"Labor or union relations",
+"unspsc",80111504,"Labor training or development",
+"unspsc",80111505,"Human resources productivity audits",
+"unspsc",80111506,"Personnel relocation",
+"unspsc",80111507,"Outplacement services",
+"unspsc",80111508,"Service recognition programs",
+"unspsc",80111600,"Temporary personnel services",
+"unspsc",80111601,"Temporary clerical or administrative assistance",
+"unspsc",80111602,"Temporary marketing staff needs",
+"unspsc",80111603,"Temporary production staffing needs",
+"unspsc",80111604,"Temporary technician staffing needs",
+"unspsc",80111605,"Temporary financial staffing needs",
+"unspsc",80111606,"Temporary medical staffing needs",
+"unspsc",80111607,"Temporary legal staffing needs",
+"unspsc",80111608,"Temporary information technology software developers",
+"unspsc",80111609,"Temporary information technology systems or database administrators",
+"unspsc",80111610,"Temporary information technology networking specialists",
+"unspsc",80111611,"Temporary warehouse staff",
+"unspsc",80111612,"Temporary drivers",
+"unspsc",80111613,"Temporary manual labor",
+"unspsc",80111614,"Temporary engineering services",
+"unspsc",80111615,"Temporary machinist personnel",
+"unspsc",80111616,"Temporary customer service personnel",
+"unspsc",80111617,"Temporary architectural services",
+"unspsc",80111618,"Temporary construction services",
+"unspsc",80111619,"Temporary creative services",
+"unspsc",80111700,"Personnel recruitment",
+"unspsc",80111701,"Staff recruiting services",
+"unspsc",80111702,"Reference or background check services",
+"unspsc",80111703,"Resume or curriculum vitae screening services",
+"unspsc",80111704,"Permanent marketing staff needs",
+"unspsc",80111705,"Permanent machinist personnel",
+"unspsc",80111706,"Permanent clerical or administrative assistance",
+"unspsc",80111707,"Permanent technical staffing needs",
+"unspsc",80111708,"Permanent financial staffing needs",
+"unspsc",80111709,"Permanent medical staff needs",
+"unspsc",80111710,"Permanent legal staffing needs",
+"unspsc",80111711,"Permanent information technology software developers",
+"unspsc",80111712,"Permanent information technology networking specialists",
+"unspsc",80111713,"Permanent information technology systems or database administrators",
+"unspsc",80111714,"Permanent drivers",
+"unspsc",80111715,"Permanent professional staff",
+"unspsc",80111716,"Permanent information technology staffing needs",
+"unspsc",80120000,"Legal services",
+"unspsc",80121500,"Criminal law services",
+"unspsc",80121501,"Juvenile justice law services",
+"unspsc",80121502,"Appellate procedure services",
+"unspsc",80121503,"Defense or criminal law services",
+"unspsc",80121600,"Business law services",
+"unspsc",80121601,"Government antitrust or regulations law services",
+"unspsc",80121602,"Bankruptcy law services",
+"unspsc",80121603,"Partnership law",
+"unspsc",80121604,"Patent or trademark or copyright law",
+"unspsc",80121605,"Liquidation law services",
+"unspsc",80121606,"Real estate law",
+"unspsc",80121607,"Taxation law",
+"unspsc",80121608,"Mergers or acquisitions law",
+"unspsc",80121609,"Legal Research Services",
+"unspsc",80121610,"Debt collection law services",
+"unspsc",80121611,"Healthcare claim law services",
+"unspsc",80121700,"Civil liability services",
+"unspsc",80121701,"Malpractice or negligence law services",
+"unspsc",80121702,"Personal injury law services",
+"unspsc",80121703,"Property law services",
+"unspsc",80121704,"Contract law services",
+"unspsc",80121705,"Employee benefits law services",
+"unspsc",80121706,"Employment law services",
+"unspsc",80121707,"Labor disputes law services",
+"unspsc",80121800,"Family law services",
+"unspsc",80121801,"Divorce law services",
+"unspsc",80121802,"Adoption law services",
+"unspsc",80121803,"Immigration or naturalization law",
+"unspsc",80121804,"Guardianship or custody law services",
+"unspsc",80130000,"Real estate services",
+"unspsc",80131500,"Lease and rental of property or building",
+"unspsc",80131501,"Residential rental",
+"unspsc",80131502,"Commercial or industrial facility rental",
+"unspsc",80131503,"Land leases",
+"unspsc",80131600,"Sale of property and building",
+"unspsc",80131601,"Real estate brokers or agents",
+"unspsc",80131602,"Real estate auction",
+"unspsc",80131603,"Sale of residential land",
+"unspsc",80131604,"Sale of commercial or industrial land",
+"unspsc",80131605,"Sale of commercial building",
+"unspsc",80131700,"Escrow and title services",
+"unspsc",80131701,"Title reconveyance services",
+"unspsc",80131702,"Title search services",
+"unspsc",80131703,"Escrow account services",
+"unspsc",80131800,"Real estate management services",
+"unspsc",80131801,"Property management",
+"unspsc",80131802,"Real estate appraisal services",
+"unspsc",80131803,"Real estate listing services",
+"unspsc",80140000,"Marketing and distribution",
+"unspsc",80141500,"Market research",
+"unspsc",80141501,"Marketing analysis",
+"unspsc",80141502,"Distributive or service trade statistics",
+"unspsc",80141503,"Commodity price forecasting",
+"unspsc",80141504,"Preparation of commodity market surveys",
+"unspsc",80141505,"Marketing plans",
+"unspsc",80141506,"Internet based market research",
+"unspsc",80141507,"Consumer based research or clinics or focus groups",
+"unspsc",80141508,"Syndicated or proprietary forecast studies",
+"unspsc",80141509,"Market intelligence or competitive analysis",
+"unspsc",80141510,"Market research telephone surveys",
+"unspsc",80141511,"Market research paper surveys",
+"unspsc",80141512,"Market research on location surveys",
+"unspsc",80141513,"Market research one on one interviews",
+"unspsc",80141514,"Market research mail surveys",
+"unspsc",80141600,"Sales and business promotion activities",
+"unspsc",80141601,"Sales promotion services",
+"unspsc",80141602,"Public relation services",
+"unspsc",80141603,"Telemarketing",
+"unspsc",80141604,"Branding of product naming services",
+"unspsc",80141605,"Promotional merchandise",
+"unspsc",80141606,"Direct marketing fulfillment",
+"unspsc",80141607,"Events management",
+"unspsc",80141609,"Sponsorship of event or celebrity",
+"unspsc",80141610,"Close outs",
+"unspsc",80141611,"Product or gift personalization services",
+"unspsc",80141612,"Sales or marketing programs",
+"unspsc",80141613,"After sales programs",
+"unspsc",80141614,"Public relations programs or services",
+"unspsc",80141615,"Demo or rental or used vehicle",
+"unspsc",80141616,"Point of sale materials not including printed materials",
+"unspsc",80141617,"In dealership strategic initiatives training",
+"unspsc",80141618,"Sales marketing agencies including print",
+"unspsc",80141619,"Customer relationship center CRC management services",
+"unspsc",80141620,"In dealership strategic initiatives support",
+"unspsc",80141621,"Motorsport",
+"unspsc",80141622,"Letter shop services",
+"unspsc",80141700,"Distribution",
+"unspsc",80141701,"Direct sales services",
+"unspsc",80141702,"Wholesale distribution services",
+"unspsc",80141703,"Retail distribution services",
+"unspsc",80141704,"Franchise operations",
+"unspsc",80141705,"Auction services",
+"unspsc",80141800,"Mailing services",
+"unspsc",80141801,"Mailing list compilation services",
+"unspsc",80141802,"Mailing list management service",
+"unspsc",80141803,"Addressing service",
+"unspsc",80141900,"Trade shows and exhibits",
+"unspsc",80141901,"Auto shows or other exhibits",
+"unspsc",80141902,"Meetings events",
+"unspsc",80141903,"Talent or entertainment",
+"unspsc",80150000,"Trade policy and services",
+"unspsc",80151500,"Trade facilitation",
+"unspsc",80151501,"Commodity policy or projections services",
+"unspsc",80151502,"Trade expansion",
+"unspsc",80151503,"Trade information services",
+"unspsc",80151504,"Trade promotion services",
+"unspsc",80151505,"Multinational marketing enterprises",
+"unspsc",80151600,"International trade services",
+"unspsc",80151601,"Export development",
+"unspsc",80151602,"Import planning",
+"unspsc",80151603,"Export projections",
+"unspsc",80151604,"Import procurement services",
+"unspsc",80160000,"Business administration services",
+"unspsc",80161500,"Management support services",
+"unspsc",80161501,"Office administration or secretarial services",
+"unspsc",80161502,"Meeting planning services",
+"unspsc",80161503,"Keyboard entry services",
+"unspsc",80161504,"Clerical services",
+"unspsc",80161505,"Fleet management services",
+"unspsc",80161506,"Data archiving services",
+"unspsc",80161507,"Audio visual services",
+"unspsc",80161508,"Document destruction services",
+"unspsc",80161600,"Business facilities oversight",
+"unspsc",80161601,"Property management services",
+"unspsc",80161602,"Receiving or inventorying services",
+"unspsc",80161603,"Furniture project administration or management",
+"unspsc",81000000,"Engineering and Research and Technology Based Services",
+"unspsc",81100000,"Professional engineering services",
+"unspsc",81101500,"Civil engineering",
+"unspsc",81101501,"Well engineering",
+"unspsc",81101502,"Technical drawing",
+"unspsc",81101503,"Harbor or water ports engineering",
+"unspsc",81101505,"Structural engineering",
+"unspsc",81101506,"Naval architecture",
+"unspsc",81101507,"Dam engineering",
+"unspsc",81101508,"Architectural engineering",
+"unspsc",81101509,"Airport engineering",
+"unspsc",81101510,"Highway engineering",
+"unspsc",81101511,"Railway engineering",
+"unspsc",81101512,"Geographic information system GIS services",
+"unspsc",81101513,"Building construction management",
+"unspsc",81101600,"Mechanical engineering",
+"unspsc",81101601,"Mechanical drawing",
+"unspsc",81101602,"Mechanical product enclosures design",
+"unspsc",81101603,"Machine tool design",
+"unspsc",81101604,"Power transmission design",
+"unspsc",81101605,"Electromechanical services",
+"unspsc",81101700,"Electrical and electronic engineering",
+"unspsc",81101701,"Electrical engineering services",
+"unspsc",81101702,"Electronic circuit design",
+"unspsc",81101703,"Engineering testing services",
+"unspsc",81101800,"Chemical engineering",
+"unspsc",81101801,"Plastics engineering",
+"unspsc",81101900,"Oil and gas engineering",
+"unspsc",81101902,"Production engineering for oil or gas",
+"unspsc",81102000,"Mining engineering",
+"unspsc",81102001,"Hydraulic mining",
+"unspsc",81102100,"Ocean engineering",
+"unspsc",81102101,"Coastal engineering",
+"unspsc",81102200,"Transportation engineering",
+"unspsc",81102201,"Traffic engineering",
+"unspsc",81102202,"Urban transport network",
+"unspsc",81102203,"Inland waterways",
+"unspsc",81102300,"Aeronautical engineering",
+"unspsc",81102301,"Avionics design",
+"unspsc",81110000,"Computer services",
+"unspsc",81111500,"Software or hardware engineering",
+"unspsc",81111501,"Mainframe software applications design",
+"unspsc",81111502,"Personal computer PC application design",
+"unspsc",81111503,"Systems integration design",
+"unspsc",81111504,"Application programming services",
+"unspsc",81111505,"Operating system programming services",
+"unspsc",81111506,"Client or server programming services",
+"unspsc",81111507,"ERP or database applications programming services",
+"unspsc",81111508,"Application implementation services",
+"unspsc",81111509,"Internet or intranet client application development services",
+"unspsc",81111510,"Internet or intranet server application development services",
+"unspsc",81111600,"Computer programmers",
+"unspsc",81111601,"Programming for Visual Basic",
+"unspsc",81111602,"Programming for Java",
+"unspsc",81111603,"Programming for HTML",
+"unspsc",81111604,"Programming for ALGOL",
+"unspsc",81111605,"Programming for Assembler",
+"unspsc",81111606,"Programming for Basic",
+"unspsc",81111607,"Programming for C or C++",
+"unspsc",81111608,"Programming for COBOL",
+"unspsc",81111609,"Programming for FORTRAN",
+"unspsc",81111610,"Programming for Pascal",
+"unspsc",81111611,"Programming for PL/1",
+"unspsc",81111612,"Programming or Proprietary Languages",
+"unspsc",81111613,"Programming for Perl",
+"unspsc",81111700,"Management information systems MIS",
+"unspsc",81111701,"Wide area network communications design",
+"unspsc",81111702,"Local area network communications design",
+"unspsc",81111703,"Electronic data interchange EDI design",
+"unspsc",81111704,"Database design",
+"unspsc",81111705,"Systems architecture",
+"unspsc",81111800,"System administrators",
+"unspsc",81111801,"Computer or network or internet security",
+"unspsc",81111802,"Mainframe administration services",
+"unspsc",81111803,"Local area network LAN maintenance or support",
+"unspsc",81111804,"Wide area network WAN maintenance or support",
+"unspsc",81111805,"Proprietary or licensed systems maintenance or support",
+"unspsc",81111806,"Database analysis",
+"unspsc",81111807,"Data storage",
+"unspsc",81111808,"Systems analysis",
+"unspsc",81111809,"System installation",
+"unspsc",81111810,"Software coding",
+"unspsc",81111811,"Technical support or help desk services",
+"unspsc",81111812,"Computer hardware maintenance or support",
+"unspsc",81111814,"Co location service",
+"unspsc",81111818,"Third party warranty",
+"unspsc",81111900,"Information retrieval systems",
+"unspsc",81111901,"Database information retrieval",
+"unspsc",81111902,"On line database information retrieval",
+"unspsc",81112000,"Data services",
+"unspsc",81112001,"On line data processing",
+"unspsc",81112002,"Data processing or preparation services",
+"unspsc",81112003,"Data center services",
+"unspsc",81112004,"Disaster recovery services",
+"unspsc",81112005,"Document scanning service",
+"unspsc",81112006,"Data storage service",
+"unspsc",81112007,"Content or data standardization services",
+"unspsc",81112008,"Cd rom mastering services",
+"unspsc",81112009,"Content or data classification services",
+"unspsc",81112010,"Data conversion service",
+"unspsc",81112100,"Internet services",
+"unspsc",81112101,"Internet service providers ISP",
+"unspsc",81112102,"Electronic mail service provider",
+"unspsc",81112103,"World wide web WWW site design services",
+"unspsc",81112104,"Web search engine providers",
+"unspsc",81112105,"World wide web WWW site operation host services",
+"unspsc",81112106,"Application service providers",
+"unspsc",81112107,"Internet domain names",
+"unspsc",81112200,"Software maintenance and support",
+"unspsc",81112201,"Maintenance or support fees",
+"unspsc",81112202,"Software patches or upgrades",
+"unspsc",81120000,"Economics",
+"unspsc",81121500,"Economic analysis",
+"unspsc",81121501,"Macro economic analysis",
+"unspsc",81121502,"Micro economic analysis",
+"unspsc",81121503,"Econometrics",
+"unspsc",81121504,"Economic forecasts",
+"unspsc",81121600,"Monetary systems and issues",
+"unspsc",81121601,"Monetary policy",
+"unspsc",81121602,"Monetary systems",
+"unspsc",81121603,"Monetary analysis",
+"unspsc",81121604,"Monetary liquidity",
+"unspsc",81121605,"Precious metals reserves",
+"unspsc",81121606,"Foreign exchange control",
+"unspsc",81121607,"Currency exchange markets",
+"unspsc",81130000,"Statistics",
+"unspsc",81131500,"Methodology and analysis",
+"unspsc",81131501,"Factor analysis",
+"unspsc",81131502,"Multivariate analysis",
+"unspsc",81131503,"Regression analysis",
+"unspsc",81131504,"Sampling surveys",
+"unspsc",81131505,"Time series analysis",
+"unspsc",81140000,"Manufacturing technologies",
+"unspsc",81141500,"Quality control",
+"unspsc",81141501,"Materials testing",
+"unspsc",81141502,"Materials synthesis",
+"unspsc",81141503,"Materials or product inspection",
+"unspsc",81141504,"Equipment test or calibration",
+"unspsc",81141505,"Production standards development",
+"unspsc",81141506,"Product testing",
+"unspsc",81141600,"Supply chain management",
+"unspsc",81141601,"Logistics",
+"unspsc",81141602,"Transit analysis",
+"unspsc",81141603,"Transport finance or economics",
+"unspsc",81141604,"Transport facilitation",
+"unspsc",81141605,"Transport infrastructure",
+"unspsc",81141606,"Transport planning",
+"unspsc",81141700,"Production planning and control",
+"unspsc",81141701,"Production planning",
+"unspsc",81141702,"Production control",
+"unspsc",81141703,"Production scheduling",
+"unspsc",81141704,"Production statistics collection or analysis services",
+"unspsc",81141800,"Facilities management",
+"unspsc",81141801,"Safety or risk analysis",
+"unspsc",81141802,"Industrial hygiene or ventilation",
+"unspsc",81141803,"Acoustics or noise control",
+"unspsc",81141804,"Equipment inspection service",
+"unspsc",81141805,"Building inspection service",
+"unspsc",81141806,"Power line inspection service",
+"unspsc",81141807,"Plumbing or sewer inspection service",
+"unspsc",81150000,"Earth science services",
+"unspsc",81151500,"Meteorology",
+"unspsc",81151501,"Climatology",
+"unspsc",81151502,"Meteorological services",
+"unspsc",81151503,"Hydrometeorology",
+"unspsc",81151600,"Cartography",
+"unspsc",81151601,"Mapping",
+"unspsc",81151602,"Map production",
+"unspsc",81151603,"Photogrammetry",
+"unspsc",81151604,"Land surveying",
+"unspsc",81151700,"Geology",
+"unspsc",81151701,"Photogeology",
+"unspsc",81151702,"Stratigraphic geology",
+"unspsc",81151703,"Geological surveys",
+"unspsc",81151704,"Geological exploration",
+"unspsc",81151705,"Archaeological services",
+"unspsc",81151800,"Oceanography and hydrology",
+"unspsc",81151801,"Oceanographic survey",
+"unspsc",81151802,"Estuarine oceanography",
+"unspsc",81151803,"Physical oceanography",
+"unspsc",81151804,"Hydrological surveys",
+"unspsc",81151805,"Bathymetric surveys",
+"unspsc",81151806,"Underwater exploration",
+"unspsc",81151900,"Geophysics",
+"unspsc",81151901,"Geophysical surveys",
+"unspsc",81151902,"Geophysical exploration",
+"unspsc",81151903,"Geophysical photo interpretation",
+"unspsc",81151904,"Aero magnetic geophysics",
+"unspsc",82000000,"Editorial and Design and Graphic and Fine Art Services",
+"unspsc",82100000,"Advertising",
+"unspsc",82101500,"Print advertising",
+"unspsc",82101501,"Billboard advertising",
+"unspsc",82101502,"Poster advertising",
+"unspsc",82101503,"Magazine advertising",
+"unspsc",82101504,"Newspaper advertising",
+"unspsc",82101505,"Handbill or coupon advertising",
+"unspsc",82101506,"Transit advertising services",
+"unspsc",82101507,"Shopping news or advertising or distribution service",
+"unspsc",82101508,"Trade or service directory or yellow page advertising",
+"unspsc",82101600,"Broadcast advertising",
+"unspsc",82101601,"Radio advertising",
+"unspsc",82101602,"Television advertising",
+"unspsc",82101603,"Internet advertising",
+"unspsc",82101604,"Cinema advertising",
+"unspsc",82101700,"Aerial advertising",
+"unspsc",82101701,"Banner advertising services",
+"unspsc",82101702,"Skywriting advertising services",
+"unspsc",82101800,"Advertising agency services",
+"unspsc",82101801,"Advertising campaign services",
+"unspsc",82101900,"Media placement and fulfillment",
+"unspsc",82101901,"Radio placement",
+"unspsc",82101902,"Television placement",
+"unspsc",82101903,"Internet placement",
+"unspsc",82101904,"Cinema placement",
+"unspsc",82101905,"Print placement",
+"unspsc",82110000,"Writing and translations",
+"unspsc",82111500,"Technical writing",
+"unspsc",82111501,"Instruction writing services",
+"unspsc",82111502,"Manual writing services",
+"unspsc",82111503,"Academic or scientific article writing",
+"unspsc",82111600,"Non technical writing",
+"unspsc",82111601,"Letter writing services",
+"unspsc",82111602,"Resume writing services",
+"unspsc",82111603,"Court reporting services",
+"unspsc",82111604,"Transcribing services",
+"unspsc",82111700,"Creative writing",
+"unspsc",82111701,"Article writers services",
+"unspsc",82111702,"Book authors services",
+"unspsc",82111703,"Poetry authors services",
+"unspsc",82111704,"Copywriting",
+"unspsc",82111705,"Speech writing",
+"unspsc",82111800,"Editorial and support services",
+"unspsc",82111801,"Editing services",
+"unspsc",82111802,"Fact checking services",
+"unspsc",82111803,"Proofreading services",
+"unspsc",82111804,"Written translation services",
+"unspsc",82111900,"News and publicity services",
+"unspsc",82111901,"Press release services",
+"unspsc",82111902,"Special interest newsletter services",
+"unspsc",82111903,"News agency wire services",
+"unspsc",82111904,"Newspaper or advertising material delivery services",
+"unspsc",82120000,"Reproduction services",
+"unspsc",82121500,"Printing",
+"unspsc",82121501,"Planning or layout of graphic production",
+"unspsc",82121502,"Typesetting",
+"unspsc",82121503,"Digital printing",
+"unspsc",82121504,"Letterpress or screen printing",
+"unspsc",82121505,"Promotional or advertising printing",
+"unspsc",82121506,"Publication printing",
+"unspsc",82121507,"Stationery or business form printing",
+"unspsc",82121508,"Wrap or tag or label or seal or bag printing",
+"unspsc",82121509,"Security or financial instruments printing",
+"unspsc",82121510,"Textile printing",
+"unspsc",82121511,"Technical manual or instruction sheet printing",
+"unspsc",82121512,"Embossing",
+"unspsc",82121600,"Engraving",
+"unspsc",82121601,"Currency engraving",
+"unspsc",82121602,"Engraved roll printing",
+"unspsc",82121603,"Metal plate engraving",
+"unspsc",82121700,"Photocopying",
+"unspsc",82121701,"Black and white copy or collating services",
+"unspsc",82121702,"Color copy or collating services",
+"unspsc",82121800,"Publishing",
+"unspsc",82121801,"Textbook or research publishing",
+"unspsc",82121802,"Author funded publishing services",
+"unspsc",82121900,"Bookbinding",
+"unspsc",82121901,"Thread stitch bookbinding",
+"unspsc",82121902,"Spiral binding",
+"unspsc",82121903,"Glued binding",
+"unspsc",82121904,"Comb or clamp type binding",
+"unspsc",82121905,"Binding restoration or repair",
+"unspsc",82121906,"Bronzing or gilding or edging or deckling",
+"unspsc",82121907,"Velo binding services",
+"unspsc",82121908,"Case making services",
+"unspsc",82130000,"Photographic services",
+"unspsc",82131500,"Film processing services",
+"unspsc",82131501,"Still film processing or reproduction",
+"unspsc",82131502,"Motion picture film processing or reproduction",
+"unspsc",82131503,"Microfiche services",
+"unspsc",82131504,"Color separation",
+"unspsc",82131600,"Photographers and cinematographers",
+"unspsc",82131601,"Aerial photography services",
+"unspsc",82131602,"Motion picture cinematography",
+"unspsc",82131603,"Video production services",
+"unspsc",82131604,"Studio photography services or still photographs",
+"unspsc",82140000,"Graphic design",
+"unspsc",82141500,"Art design services",
+"unspsc",82141501,"Layout or graphics editing services",
+"unspsc",82141502,"Art design or graphics",
+"unspsc",82141503,"Photocomposition",
+"unspsc",82141504,"Chart or graph design services",
+"unspsc",82141505,"Computer generated design services",
+"unspsc",82141506,"Package design services",
+"unspsc",82141507,"Silkscreen design services",
+"unspsc",82141600,"Graphic display services",
+"unspsc",82141601,"Photographic or picture mounting or framing services",
+"unspsc",82141602,"Article display arrangement",
+"unspsc",82150000,"Professional artists and performers",
+"unspsc",82151500,"Visual art services",
+"unspsc",82151501,"Painters services",
+"unspsc",82151502,"Lithographers services",
+"unspsc",82151503,"Cartoonists services",
+"unspsc",82151504,"Sculptors services",
+"unspsc",82151505,"Ceramics makers services",
+"unspsc",82151506,"Glass blowers services",
+"unspsc",82151507,"Textile spinners or loomers or weavers services",
+"unspsc",82151508,"Taxidermy services",
+"unspsc",82151600,"Circus Performers",
+"unspsc",82151601,"Animal trainers services",
+"unspsc",82151602,"Acrobats services",
+"unspsc",82151603,"Magicians services",
+"unspsc",82151604,"Clowns services",
+"unspsc",82151700,"Performing arts professionals",
+"unspsc",82151701,"Acting services",
+"unspsc",82151702,"Comedians services",
+"unspsc",82151703,"Dancers services",
+"unspsc",82151704,"Musicians services",
+"unspsc",82151705,"Vocalists services",
+"unspsc",82151706,"Choreographic services",
+"unspsc",83000000,"Public Utilities and Public Sector Related Services",
+"unspsc",83100000,"Utilities",
+"unspsc",83101500,"Water and sewer utilities",
+"unspsc",83101501,"Supply of water",
+"unspsc",83101502,"Water resource management",
+"unspsc",83101503,"Water quality control management",
+"unspsc",83101504,"Water distribution management",
+"unspsc",83101505,"Water policy advisory services",
+"unspsc",83101506,"Water treatment services",
+"unspsc",83101507,"Desalination services",
+"unspsc",83101508,"Town water",
+"unspsc",83101509,"Service water",
+"unspsc",83101510,"Chilled water",
+"unspsc",83101600,"Oil and gas utilities",
+"unspsc",83101601,"Supply of natural gas",
+"unspsc",83101602,"Supply of fuel oil",
+"unspsc",83101603,"Oil pipeline services",
+"unspsc",83101604,"Gas pipeline services",
+"unspsc",83101605,"Gas facility charge",
+"unspsc",83101800,"Electric utilities",
+"unspsc",83101801,"Supply of single phase electricity",
+"unspsc",83101802,"Supply of two phase electricity",
+"unspsc",83101803,"Supply of three phase electricity",
+"unspsc",83101804,"Electric power transmission services",
+"unspsc",83101805,"Industrial electric power distribution",
+"unspsc",83101806,"Rural electrical power distribution",
+"unspsc",83101807,"Municipal electric power distribution",
+"unspsc",83101808,"Power quality monitoring",
+"unspsc",83101900,"Energy conservation",
+"unspsc",83101901,"Energy conservation programs",
+"unspsc",83101902,"Energy use reduction measures",
+"unspsc",83101903,"District heating",
+"unspsc",83102000,"Funeral services",
+"unspsc",83102001,"Grave digging",
+"unspsc",83110000,"Telecommunications media services",
+"unspsc",83111500,"Local and long distance telephone communications",
+"unspsc",83111501,"Local telephone service",
+"unspsc",83111502,"Long distance telephone services",
+"unspsc",83111503,"Pay phone provider services",
+"unspsc",83111504,"Pre paid phone card services",
+"unspsc",83111505,"Directory assistance services",
+"unspsc",83111506,"Conference calling services",
+"unspsc",83111507,"Call centre bureau services",
+"unspsc",83111508,"Toll free inbound telephone service",
+"unspsc",83111510,"Interactive voice response service",
+"unspsc",83111511,"Frame relay telecommunications service",
+"unspsc",83111600,"Mobile communications services",
+"unspsc",83111601,"Telecommunication signal enhancement network services",
+"unspsc",83111602,"Satellite or earth communication systems services",
+"unspsc",83111603,"Cellular telephone services",
+"unspsc",83111604,"Paging services",
+"unspsc",83111605,"Spacesegment leasing",
+"unspsc",83111700,"Facsimile and telegraph services",
+"unspsc",83111701,"Facsimile transmission services",
+"unspsc",83111702,"Telegraph transmission services",
+"unspsc",83111703,"Telex transmission services",
+"unspsc",83111800,"Television services",
+"unspsc",83111801,"Cable television services",
+"unspsc",83111802,"Closed circuit television services",
+"unspsc",83111803,"Television antenna construction or rental services",
+"unspsc",83111804,"Television broadcasting station management",
+"unspsc",83111900,"Radio services",
+"unspsc",83111901,"Radio broadcasting station management",
+"unspsc",83111902,"Amateur radio networks or services",
+"unspsc",83111903,"Small scale radio systems",
+"unspsc",83111904,"Radio studio or equipment services",
+"unspsc",83111905,"International bilateral services and international private leased lines",
+"unspsc",83112200,"Enhanced telecommunications services",
+"unspsc",83112201,"ATM asynchronous transfer mode managed network services",
+"unspsc",83112202,"Frame relay public managed network services",
+"unspsc",83112203,"VPN virtual private network managed network services",
+"unspsc",83112204,"X75 managed network services",
+"unspsc",83112205,"X25 managed network services",
+"unspsc",83112300,"Fiber telecommunications services",
+"unspsc",83112301,"Dark fiber",
+"unspsc",83112302,"Dense wavelength division multiplexing DWDM",
+"unspsc",83112303,"Wave division multiplexing WDM",
+"unspsc",83112304,"Ocx optical carrier service",
+"unspsc",83112400,"Switched dial up and leased dedicated line circuit telecommunications services",
+"unspsc",83112401,"High speed circuit switched dial up services",
+"unspsc",83112402,"ISDN integrated services digital network services",
+"unspsc",83112403,"Point to point digital telecommunications circuit",
+"unspsc",83112404,"Multi point analog telecommunications circuit",
+"unspsc",83112405,"Point to point analog telecommunications circuit",
+"unspsc",83112406,"DSL digital subscriber line",
+"unspsc",83112500,"Backbone capacities",
+"unspsc",83112501,"Submarine cable capacities and submarine cable PoP to PoP capacities",
+"unspsc",83112502,"Terrestrial backbone capacities",
+"unspsc",83112503,"Rights of way for transit for half circuit systems, DDPs and admin lease",
+"unspsc",83112504,"Indefeasible rights of use IRU for submarine cable or terrestrial cable systems",
+"unspsc",83112505,"Crossconnection functionality",
+"unspsc",83112600,"Customer access",
+"unspsc",83112601,"Local loop capacities",
+"unspsc",83112602,"Domestic leased lines",
+"unspsc",83112603,"International access lines",
+"unspsc",83112604,"Dial access services",
+"unspsc",83112605,"External international lines",
+"unspsc",83120000,"Information services",
+"unspsc",83121500,"Libraries",
+"unspsc",83121501,"General municipal public use libraries",
+"unspsc",83121502,"College or university libraries",
+"unspsc",83121503,"Privately owned libraries",
+"unspsc",83121504,"National government or military post libraries",
+"unspsc",83121600,"Information centers",
+"unspsc",83121601,"Chambers of Commerce",
+"unspsc",83121602,"Tourism board services",
+"unspsc",83121603,"Computerized information retrieval systems",
+"unspsc",83121604,"Online database information retrieval systems",
+"unspsc",83121605,"Remote database information retrieval services",
+"unspsc",83121606,"Skip tracing",
+"unspsc",83121700,"Mass communication services",
+"unspsc",83121701,"Television related services",
+"unspsc",83121702,"Radio related services",
+"unspsc",83121703,"Internet related services",
+"unspsc",83121704,"Citizen warning systems",
+"unspsc",84000000,"Financial and Insurance Services",
+"unspsc",84100000,"Development finance",
+"unspsc",84101500,"Development assistance",
+"unspsc",84101501,"Financial assistance",
+"unspsc",84101502,"Savings mobilization programs",
+"unspsc",84101503,"Guarantee agreements",
+"unspsc",84101600,"Aid financing",
+"unspsc",84101601,"Co financing",
+"unspsc",84101602,"Bi lateral or multi lateral aid",
+"unspsc",84101603,"Non governmental aid",
+"unspsc",84101604,"Government aid",
+"unspsc",84101700,"Debt management",
+"unspsc",84101701,"Debt negotiation",
+"unspsc",84101702,"Debt reorganization",
+"unspsc",84101703,"Debt servicing",
+"unspsc",84101704,"Debt collection services",
+"unspsc",84101705,"Repossession services",
+"unspsc",84110000,"Accounting and auditing",
+"unspsc",84111500,"Accounting services",
+"unspsc",84111501,"Cost accounting",
+"unspsc",84111502,"Financial accounting",
+"unspsc",84111503,"Tax accounting",
+"unspsc",84111504,"Bookkeeping services",
+"unspsc",84111505,"Payroll accounting services",
+"unspsc",84111506,"Billing services",
+"unspsc",84111507,"Inventory accounting",
+"unspsc",84111600,"Audit services",
+"unspsc",84111601,"Year end audits",
+"unspsc",84111602,"Quarterly reviews",
+"unspsc",84111603,"Internal audits",
+"unspsc",84111700,"Corporate finance",
+"unspsc",84111701,"Treasury services",
+"unspsc",84111702,"Investor relations services or programs",
+"unspsc",84111703,"Budget preparation or review services",
+"unspsc",84111800,"Taxation issues and preparation",
+"unspsc",84111801,"Tax preparers",
+"unspsc",84111802,"Tax advisory services",
+"unspsc",84120000,"Banking and investment",
+"unspsc",84121500,"Banking institutions",
+"unspsc",84121501,"Privately owned banks",
+"unspsc",84121502,"Publicly owned banks",
+"unspsc",84121503,"Credit unions",
+"unspsc",84121504,"Development finance institutions",
+"unspsc",84121600,"Funds transfer and clearance and exchange services",
+"unspsc",84121601,"Funds clearance services",
+"unspsc",84121602,"Letter of credit services",
+"unspsc",84121603,"Currency exchange services",
+"unspsc",84121604,"Spot exchange transaction services",
+"unspsc",84121605,"Currency conversion service",
+"unspsc",84121606,"Remittance processing services",
+"unspsc",84121607,"Operating lease finance service",
+"unspsc",84121700,"Investment advice",
+"unspsc",84121701,"Investment advisers",
+"unspsc",84121702,"Investment policy",
+"unspsc",84121703,"Investment analysis",
+"unspsc",84121704,"Investment agreements",
+"unspsc",84121705,"Market data",
+"unspsc",84121800,"Securities and commodities markets services",
+"unspsc",84121801,"Stock market trading services",
+"unspsc",84121802,"Commodities or futures market services",
+"unspsc",84121803,"Government bonds",
+"unspsc",84121804,"Privately issued bonds",
+"unspsc",84121805,"Precious metals market services",
+"unspsc",84121806,"Securities Custodial Services",
+"unspsc",84121900,"Mortgage banking",
+"unspsc",84121901,"Housing finance",
+"unspsc",84121902,"Re financing services",
+"unspsc",84121903,"Commercial mortgage finance",
+"unspsc",84122000,"Cash vault services",
+"unspsc",84122001,"Deposit verification services",
+"unspsc",84130000,"Insurance and retirement services",
+"unspsc",84131500,"Insurance services for structures and property and possessions",
+"unspsc",84131501,"Building or building contents insurance",
+"unspsc",84131502,"Homeowners or renters insurance",
+"unspsc",84131503,"Car or truck insurance",
+"unspsc",84131504,"Cargo insurance",
+"unspsc",84131505,"Marine insurance",
+"unspsc",84131506,"Reinsurance services",
+"unspsc",84131507,"Business interruption insurance",
+"unspsc",84131508,"Cash in transit insurance",
+"unspsc",84131509,"Comprehensive projects insurance",
+"unspsc",84131510,"Contractors all risks insurance",
+"unspsc",84131511,"Deterioration of stocks insurance",
+"unspsc",84131512,"Electronic equipment insurance",
+"unspsc",84131513,"Erection all risks insurance",
+"unspsc",84131514,"Fidelity guarantee insurance",
+"unspsc",84131515,"Jewelers block insurance",
+"unspsc",84131516,"Professional indemnity insurance",
+"unspsc",84131517,"Travel insurance",
+"unspsc",84131600,"Life and health and accident insurance",
+"unspsc",84131601,"Life insurance",
+"unspsc",84131602,"Health or hospitalization insurance",
+"unspsc",84131603,"Accidental injury insurance",
+"unspsc",84131604,"Disability insurance",
+"unspsc",84131605,"Workmens insurance",
+"unspsc",84131606,"Unemployment insurance",
+"unspsc",84131607,"Liability insurance",
+"unspsc",84131608,"Medical Claims Review and Management",
+"unspsc",84131609,"Employee assistance programs",
+"unspsc",84131610,"Flexible spending accounts FSA",
+"unspsc",84131700,"Pension funds",
+"unspsc",84131701,"Employer administered pension funds",
+"unspsc",84131702,"Union or guild administered pension funds",
+"unspsc",84131800,"Retirement funds",
+"unspsc",84131801,"Self directed or employer sponsored retirement funds",
+"unspsc",84131802,"Self directed or self initiated retirement plans",
+"unspsc",84140000,"Credit agencies",
+"unspsc",84141500,"Governmental credit agencies",
+"unspsc",84141501,"Farm credit services",
+"unspsc",84141502,"Small business loan agencies",
+"unspsc",84141503,"Minority owned business programs",
+"unspsc",84141600,"Personal credit agencies",
+"unspsc",84141601,"Consumer credit gathering or reporting services",
+"unspsc",84141602,"Credit card service providers",
+"unspsc",84141700,"Business credit agencies",
+"unspsc",84141701,"Business credit gathering or reporting services",
+"unspsc",84141702,"Value added network VAN services",
+"unspsc",85000000,"Healthcare Services",
+"unspsc",85100000,"Comprehensive health services",
+"unspsc",85101500,"Healthcare centers",
+"unspsc",85101501,"Emergency or surgical hospital services",
+"unspsc",85101502,"Private specialized clinic services",
+"unspsc",85101503,"Medical office services",
+"unspsc",85101504,"Psychiatric hospital services",
+"unspsc",85101505,"Respiratory hospital services",
+"unspsc",85101506,"Substance abuse hospital services",
+"unspsc",85101507,"Urgent care centers",
+"unspsc",85101508,"Mobile healthcare centers or services",
+"unspsc",85101509,"Gynecological or obstetrical hospital services",
+"unspsc",85101600,"Healthcare provider support persons",
+"unspsc",85101601,"Nursing services",
+"unspsc",85101602,"Midwifery or child birth preparation services",
+"unspsc",85101603,"Personal care services in specialized institutions",
+"unspsc",85101604,"Physicians personnel assistance services",
+"unspsc",85101605,"Home health assistants",
+"unspsc",85101700,"Health administration services",
+"unspsc",85101701,"Health policy",
+"unspsc",85101702,"Health legislation or regulations",
+"unspsc",85101703,"Health service planning",
+"unspsc",85101704,"Health economics",
+"unspsc",85101705,"Public health administration",
+"unspsc",85101706,"Traditional healthcare services",
+"unspsc",85101707,"Health systems evaluation services",
+"unspsc",85110000,"Disease prevention and control",
+"unspsc",85111500,"Contagious disease prevention and control",
+"unspsc",85111501,"Aids prevention or control services",
+"unspsc",85111502,"Parasitic disease prevention or control services",
+"unspsc",85111503,"Fungal diseases prevention or control services",
+"unspsc",85111504,"Tuberculosis prevention or control services",
+"unspsc",85111505,"Leprosy prevention or control services",
+"unspsc",85111506,"Bacterial disease prevention or control services",
+"unspsc",85111507,"Sexually transmitted diseases prevention or control services",
+"unspsc",85111508,"Viral diseases prevention or control services",
+"unspsc",85111509,"Zoonotic diseases prevention or control services",
+"unspsc",85111510,"Vaccination services",
+"unspsc",85111511,"Quarantine services",
+"unspsc",85111512,"Immunization services",
+"unspsc",85111513,"Disinsectization services",
+"unspsc",85111514,"Epidemics prevention or control services",
+"unspsc",85111600,"Non contagious disease prevention and control",
+"unspsc",85111601,"Bone diseases prevention or control services",
+"unspsc",85111602,"Cancer or leukemia prevention or control services",
+"unspsc",85111603,"Endocrine diseases prevention or control services",
+"unspsc",85111604,"Heart diseases prevention or control services",
+"unspsc",85111605,"Immunologic prevention or control services",
+"unspsc",85111606,"Allergies prevention or control services",
+"unspsc",85111607,"Neurological disorders prevention or control services",
+"unspsc",85111608,"Nutritional diseases prevention or control services",
+"unspsc",85111609,"Radiation sickness prevention or control services",
+"unspsc",85111610,"Digestive system diseases prevention or control services",
+"unspsc",85111611,"Eye disease prevention or control services",
+"unspsc",85111612,"Respiratory diseases prevention or control services",
+"unspsc",85111613,"Tropical diseases prevention or control services",
+"unspsc",85111614,"Childhood diseases prevention or control services",
+"unspsc",85111615,"Diarrheal diseases prevention or control services",
+"unspsc",85111616,"Alcoholism prevention or control services",
+"unspsc",85111617,"Drug addiction prevention or control services",
+"unspsc",85111700,"Disease vectors management and control",
+"unspsc",85111701,"Ticks management or control services",
+"unspsc",85111702,"Tsetse flies management or control services",
+"unspsc",85111703,"Bacteria management or control services",
+"unspsc",85111704,"Mosquito management or control services",
+"unspsc",85120000,"Medical practice",
+"unspsc",85121500,"Primary care practitioners services",
+"unspsc",85121501,"Primary care physicians home visits services",
+"unspsc",85121502,"Primary care physicians consultation services",
+"unspsc",85121503,"Primary care physicians control services",
+"unspsc",85121504,"Primary care physicians emergency medical services",
+"unspsc",85121600,"Medical doctors specialist services",
+"unspsc",85121601,"Gynecologic or obstetric services",
+"unspsc",85121602,"Nephrology services",
+"unspsc",85121603,"Cardiology services",
+"unspsc",85121604,"Pulomonary specialists services",
+"unspsc",85121605,"Gastroenterologists services",
+"unspsc",85121606,"Geriatric services",
+"unspsc",85121607,"Psychiatrist services",
+"unspsc",85121608,"Psychologists services",
+"unspsc",85121609,"Surgery services",
+"unspsc",85121610,"Ophthalmologists services",
+"unspsc",85121611,"Dermatology services",
+"unspsc",85121612,"Orthopedics services",
+"unspsc",85121613,"Pediatric services",
+"unspsc",85121614,"Nervous system specialist services",
+"unspsc",85121700,"Healthcare providers specialists services",
+"unspsc",85121701,"Psychotherapists services",
+"unspsc",85121702,"Optometrists services",
+"unspsc",85121703,"Podiatrists services",
+"unspsc",85121704,"Speech specialists services",
+"unspsc",85121705,"Acupuncturists services",
+"unspsc",85121706,"Chiropractors services",
+"unspsc",85121800,"Medical laboratories",
+"unspsc",85121801,"Blood analysis laboratory services",
+"unspsc",85121802,"Bacteriological laboratory services",
+"unspsc",85121803,"Biological laboratory services",
+"unspsc",85121804,"Pathological laboratory services",
+"unspsc",85121805,"Urinalysis laboratory services",
+"unspsc",85121806,"Neurological laboratory services",
+"unspsc",85121807,"Ultrasound laboratory services",
+"unspsc",85121808,"X ray laboratory services",
+"unspsc",85121809,"Blood or sperm or transplant organ banks services",
+"unspsc",85121810,"Drug or alcohol screening",
+"unspsc",85121900,"Pharmacists",
+"unspsc",85121901,"Pharmaceutical preparation services",
+"unspsc",85121902,"Commercial pharmaceutical services",
+"unspsc",85122000,"Dental services",
+"unspsc",85122001,"Dentists services",
+"unspsc",85122002,"Dental hygienists services",
+"unspsc",85122003,"Dentist support staff services",
+"unspsc",85122004,"Oral surgeons services",
+"unspsc",85122005,"Orthodontic services",
+"unspsc",85122100,"Rehabilitation services",
+"unspsc",85122101,"Physical therapy services",
+"unspsc",85122102,"Occupational therapy services",
+"unspsc",85122103,"Rehabilitation services for substance abuse",
+"unspsc",85122104,"Athletic rehabilitation services",
+"unspsc",85122105,"Eating disorders services",
+"unspsc",85122106,"Brain or spinal cord injury services",
+"unspsc",85122107,"Blind or vision impaired rehabilitation services",
+"unspsc",85122108,"Speech or language therapy",
+"unspsc",85122109,"Rehabilitation services for people with chronic disabilities",
+"unspsc",85122200,"Individual health screening and assessment services",
+"unspsc",85122201,"Individual health assessment",
+"unspsc",85130000,"Medical science research and experimentation",
+"unspsc",85131500,"Experimental medicine services",
+"unspsc",85131501,"Organ transplant services",
+"unspsc",85131502,"Clinical human drug trials",
+"unspsc",85131503,"Animal experimentation",
+"unspsc",85131504,"Human experimentation",
+"unspsc",85131505,"Space experimentation",
+"unspsc",85131600,"Medical ethics",
+"unspsc",85131601,"Euthanasia issues",
+"unspsc",85131602,"Medical code of conduct",
+"unspsc",85131603,"Medical societies",
+"unspsc",85131604,"International drug monitoring services",
+"unspsc",85131700,"Medical science and research",
+"unspsc",85131701,"Pharmaceutical research services",
+"unspsc",85131702,"Bacteriology research services",
+"unspsc",85131703,"Biomedical research services",
+"unspsc",85131704,"Cardiology research services",
+"unspsc",85131705,"Anatomy research services",
+"unspsc",85131706,"Pathology research services",
+"unspsc",85131707,"Embryology research services",
+"unspsc",85131708,"Epidemiology research services",
+"unspsc",85131709,"Genetics research services",
+"unspsc",85131710,"Immunology research services",
+"unspsc",85131711,"Physiology research services",
+"unspsc",85131712,"Toxicology research services",
+"unspsc",85131713,"Neurology research services",
+"unspsc",85140000,"Alternative and holistic medicine",
+"unspsc",85141500,"Faith healers",
+"unspsc",85141501,"Witch doctors or voodoo services",
+"unspsc",85141502,"Faith healers services",
+"unspsc",85141503,"Shamans",
+"unspsc",85141504,"Energy work",
+"unspsc",85141600,"Herbal treatments",
+"unspsc",85141601,"Herbal medicine or herbalists services",
+"unspsc",85141602,"Algae or sea weed medical cures",
+"unspsc",85141603,"Hot springs cure services",
+"unspsc",85141700,"Homeopathic practice",
+"unspsc",85141701,"Initial diagnostic assessment",
+"unspsc",85141702,"Remedy consultations",
+"unspsc",85150000,"Food and nutrition services",
+"unspsc",85151500,"Food technology",
+"unspsc",85151501,"Food hygiene control services",
+"unspsc",85151502,"Food contamination control services",
+"unspsc",85151503,"Food preservation management or control services",
+"unspsc",85151504,"Food preparation counseling or control services",
+"unspsc",85151505,"Food research services",
+"unspsc",85151506,"Studies on foods or food habits",
+"unspsc",85151507,"Food additive or quality standards services",
+"unspsc",85151508,"Food analysis services",
+"unspsc",85151509,"Food legislation services",
+"unspsc",85151600,"Nutrition issues",
+"unspsc",85151601,"Nutrition programming services",
+"unspsc",85151602,"Breast or bottle feeding policy",
+"unspsc",85151603,"Nutritional rehabilitation services",
+"unspsc",85151604,"Nutrition project evaluation",
+"unspsc",85151605,"Food or nutrition development strategies",
+"unspsc",85151606,"Nutrient deficiency control programs",
+"unspsc",85151607,"Diet control or programs",
+"unspsc",85151700,"Food policy planning and aid",
+"unspsc",85151701,"Food standards",
+"unspsc",85151702,"Food aid global information or early warning systems services",
+"unspsc",85151703,"Assessment of emergency food requirements",
+"unspsc",85151704,"National food intervention policy or programs",
+"unspsc",85151705,"Evaluation of food aid nutritional impact",
+"unspsc",86000000,"Education and Training Services",
+"unspsc",86100000,"Vocational training",
+"unspsc",86101500,"Agriculture and forestry and other natural resources training services",
+"unspsc",86101501,"Agro industry vocational training",
+"unspsc",86101502,"Dairy industry vocational training",
+"unspsc",86101503,"Meat industry vocational training",
+"unspsc",86101504,"Agriculture vocational training services",
+"unspsc",86101505,"Rural youth or farmers vocational training services",
+"unspsc",86101506,"Forestry vocational training services",
+"unspsc",86101507,"Fishery vocational training services",
+"unspsc",86101508,"Environmental vocational training services",
+"unspsc",86101509,"Natural resources vocational training services",
+"unspsc",86101600,"Scientific vocational training services",
+"unspsc",86101601,"Computer vocational training services",
+"unspsc",86101602,"Energy related vocational training services",
+"unspsc",86101603,"Chemistry vocational training services",
+"unspsc",86101604,"Biology vocational training services",
+"unspsc",86101605,"Medical vocational training services",
+"unspsc",86101606,"Electronics vocational training services",
+"unspsc",86101607,"Telecommunications vocational training services",
+"unspsc",86101608,"Hydraulics vocational training services",
+"unspsc",86101609,"Industrial vocational training services",
+"unspsc",86101610,"Engineering vocational training services",
+"unspsc",86101700,"Non scientific vocational training services",
+"unspsc",86101701,"Communications vocational training services",
+"unspsc",86101702,"Tourism related training",
+"unspsc",86101703,"Library or documentation training",
+"unspsc",86101704,"Procurement or supply chain training",
+"unspsc",86101705,"Clerical training",
+"unspsc",86101706,"Health assistance vocational training services",
+"unspsc",86101707,"Personal care vocational training services",
+"unspsc",86101708,"Literacy services",
+"unspsc",86101709,"Safety training services",
+"unspsc",86101710,"Teacher training services",
+"unspsc",86101711,"Fire fighting training services",
+"unspsc",86101712,"Handcrafts vocational training services",
+"unspsc",86101713,"Law vocational training services",
+"unspsc",86101714,"Law enforcement vocational training services",
+"unspsc",86101715,"Road or rail transportation vocational training services",
+"unspsc",86101716,"Shipping vocational training services",
+"unspsc",86101800,"In service training and manpower development",
+"unspsc",86101801,"Bank or finance sector manpower development",
+"unspsc",86101802,"Re training or refreshing training services",
+"unspsc",86101803,"Vocational rehabilitation services",
+"unspsc",86101804,"Commercial sector manpower development",
+"unspsc",86101805,"Industrial sector manpower development",
+"unspsc",86101806,"Health sector manpower development",
+"unspsc",86101807,"Management sector manpower development",
+"unspsc",86101808,"Public sector manpower development services",
+"unspsc",86101809,"Merchant marine vocational training services",
+"unspsc",86110000,"Alternative educational systems",
+"unspsc",86111500,"Distance learning services",
+"unspsc",86111501,"Distance learning guidance services",
+"unspsc",86111502,"Distance teaching services",
+"unspsc",86111503,"Certificated distance learning services",
+"unspsc",86111504,"Non certificated distance learning services",
+"unspsc",86111505,"Distance learning assessment services",
+"unspsc",86111600,"Adult education",
+"unspsc",86111601,"Evening courses",
+"unspsc",86111602,"Part time adult education services",
+"unspsc",86111603,"Parent education",
+"unspsc",86111604,"Employee education",
+"unspsc",86111700,"Language schooling",
+"unspsc",86111701,"Conversational foreign language instruction",
+"unspsc",86111702,"Foreign language immersion instruction",
+"unspsc",86111800,"Educational exchanges",
+"unspsc",86111801,"Educational exchanges between universities",
+"unspsc",86111802,"Educational exchanges between schools",
+"unspsc",86120000,"Educational institutions",
+"unspsc",86121500,"Elementary and secondary schools",
+"unspsc",86121501,"Pre school educational services",
+"unspsc",86121502,"Religious elementary or secondary schools",
+"unspsc",86121503,"Private elementary or secondary schools",
+"unspsc",86121504,"Public elementary or secondary schools",
+"unspsc",86121600,"Junior colleges",
+"unspsc",86121601,"Community colleges",
+"unspsc",86121602,"Technical institutes",
+"unspsc",86121700,"University and colleges",
+"unspsc",86121701,"Undergraduate programs",
+"unspsc",86121702,"Postgraduate programs",
+"unspsc",86121800,"Professional schools",
+"unspsc",86121802,"Theological seminaries",
+"unspsc",86121803,"Technical professional schools",
+"unspsc",86121804,"Non technical professional schools",
+"unspsc",86130000,"Specialized educational services",
+"unspsc",86131500,"Fine arts",
+"unspsc",86131501,"Theater studies",
+"unspsc",86131502,"Painting",
+"unspsc",86131503,"Sculpture",
+"unspsc",86131504,"Media studies",
+"unspsc",86131600,"Music and drama",
+"unspsc",86131601,"Music schools",
+"unspsc",86131602,"Dance education",
+"unspsc",86131603,"Drama studies",
+"unspsc",86131700,"Driving and flying and sailing",
+"unspsc",86131701,"Vehicle driving schools services",
+"unspsc",86131702,"Flight school services",
+"unspsc",86131703,"Yachting or boating school services",
+"unspsc",86131800,"Military education",
+"unspsc",86131801,"Service academies",
+"unspsc",86131802,"Pilot schools",
+"unspsc",86131803,"Military police training",
+"unspsc",86131804,"War college",
+"unspsc",86131900,"Schools for people with disabilities",
+"unspsc",86131901,"Primary schooling services for people with disabilities",
+"unspsc",86131902,"Secondary schooling services for people with disabilities",
+"unspsc",86131903,"Specialized schools for people with disabilities",
+"unspsc",86131904,"Specialized rehabilitation services for people with disabilities",
+"unspsc",86140000,"Educational facilities",
+"unspsc",86141500,"Educational guidance services",
+"unspsc",86141501,"Educational advisory services",
+"unspsc",86141502,"Universities cooperation guidance services",
+"unspsc",86141503,"Study abroad advisory services",
+"unspsc",86141504,"Tuition reimbursement programs",
+"unspsc",86141600,"Students organizations",
+"unspsc",86141601,"Students hobby clubs",
+"unspsc",86141602,"Students unions",
+"unspsc",86141603,"Students travelling organizations",
+"unspsc",86141700,"Educational technology",
+"unspsc",86141701,"Language laboratories",
+"unspsc",86141702,"Audio visual technology",
+"unspsc",86141703,"Computer programmed instruction",
+"unspsc",86141704,"Library or documentation services",
+"unspsc",90000000,"Travel and Food and Lodging and Entertainment Services",
+"unspsc",90100000,"Restaurants and catering",
+"unspsc",90101500,"Eating and drinking establishments",
+"unspsc",90101501,"Restaurants",
+"unspsc",90101502,"Bars",
+"unspsc",90101503,"Fast food establishments",
+"unspsc",90101504,"On street food vendors",
+"unspsc",90101600,"Banquet and catering services",
+"unspsc",90101601,"Banquet facilities",
+"unspsc",90101602,"Party tent services",
+"unspsc",90101603,"Catering services",
+"unspsc",90101604,"Construction or work site catering services",
+"unspsc",90101700,"Cafeteria services",
+"unspsc",90101701,"On site cafeteria management",
+"unspsc",90101800,"Carryout and takeaway services",
+"unspsc",90101801,"Professionally prepared carryout meals",
+"unspsc",90101802,"Delivered meals services",
+"unspsc",90110000,"Hotels and lodging and meeting facilities",
+"unspsc",90111500,"Hotels and motels and inns",
+"unspsc",90111501,"Hotels",
+"unspsc",90111502,"Lodges or resorts",
+"unspsc",90111503,"Bed and breakfast inns",
+"unspsc",90111504,"Cottage rental services",
+"unspsc",90111600,"Meeting facilities",
+"unspsc",90111601,"Conference centers",
+"unspsc",90111602,"Videoconferencing facilities",
+"unspsc",90111603,"Meeting or banquet rooms",
+"unspsc",90111604,"Marquees",
+"unspsc",90111700,"Camping and wilderness facilities",
+"unspsc",90111701,"Campsites",
+"unspsc",90111702,"Government owned parks",
+"unspsc",90111703,"Recreational vehicle campsite facilities",
+"unspsc",90111800,"Hotel rooms",
+"unspsc",90111801,"Single room",
+"unspsc",90111802,"Double room",
+"unspsc",90111803,"Suite",
+"unspsc",90120000,"Travel facilitation",
+"unspsc",90121500,"Travel agents",
+"unspsc",90121501,"Tour arrangement services",
+"unspsc",90121502,"Travel agencies",
+"unspsc",90121503,"Chartering services",
+"unspsc",90121600,"Travel document assistance",
+"unspsc",90121601,"Passport services",
+"unspsc",90121602,"Visa or auxiliary document services",
+"unspsc",90121700,"Guides and interpreters",
+"unspsc",90121701,"Area or tour guides",
+"unspsc",90121702,"Interpreters",
+"unspsc",90130000,"Performing arts",
+"unspsc",90131500,"Live performances",
+"unspsc",90131501,"Theatrical performances or plays",
+"unspsc",90131502,"Dance performances",
+"unspsc",90131503,"Opera",
+"unspsc",90131504,"Concerts",
+"unspsc",90131600,"Taped or motion picture performances",
+"unspsc",90131601,"Motion pictures",
+"unspsc",90131602,"Videotaped entertainment",
+"unspsc",90140000,"Commercial sports",
+"unspsc",90141500,"Professional sporting events",
+"unspsc",90141501,"League play",
+"unspsc",90141502,"Competitive events",
+"unspsc",90141503,"Exhibitions",
+"unspsc",90141600,"Sports event promotion and sponsorship",
+"unspsc",90141601,"Company sponsored professional sports events",
+"unspsc",90141602,"Company sponsored amateur sports events",
+"unspsc",90141603,"Sporting event promotion services",
+"unspsc",90141700,"Amateur and recreational sports",
+"unspsc",90141701,"Youth competitive sports leagues",
+"unspsc",90141702,"Adult sports leagues",
+"unspsc",90141703,"Youth sports",
+"unspsc",90150000,"Entertainment services",
+"unspsc",90151500,"Tourist attractions",
+"unspsc",90151501,"Museums",
+"unspsc",90151502,"Historical or cultural sites",
+"unspsc",90151503,"Zoological gardens",
+"unspsc",90151600,"Travelling shows",
+"unspsc",90151601,"Circuses",
+"unspsc",90151602,"Touring companies",
+"unspsc",90151603,"Art exhibitions",
+"unspsc",90151700,"Amusement parks",
+"unspsc",90151701,"Theme parks",
+"unspsc",90151702,"Water parks",
+"unspsc",90151703,"Miniature golf courses",
+"unspsc",90151800,"Carnivals and fairs",
+"unspsc",90151801,"Travelling carnivals",
+"unspsc",90151802,"Fair organization or management services",
+"unspsc",90151803,"Fair stands creation or construction",
+"unspsc",90151900,"Gambling and betting establishments",
+"unspsc",90151901,"Casinos",
+"unspsc",90151902,"Card clubs",
+"unspsc",90151903,"Racetracks",
+"unspsc",90152000,"Nightclubs and dance halls",
+"unspsc",90152001,"Nightclubs",
+"unspsc",90152002,"Dance halls",
+"unspsc",90152100,"Concierge services",
+"unspsc",90152101,"Personal assistance services",
+"unspsc",91000000,"Personal and Domestic Services",
+"unspsc",91100000,"Personal appearance",
+"unspsc",91101500,"Spa and workout and rejuvenation facilities",
+"unspsc",91101501,"Health or fitness clubs",
+"unspsc",91101502,"Spas",
+"unspsc",91101503,"Massage services",
+"unspsc",91101504,"Aerobics or exercise classes",
+"unspsc",91101505,"Turkish or steam or ritual baths",
+"unspsc",91101600,"Face and body care and adornment",
+"unspsc",91101601,"Facial or body treatments",
+"unspsc",91101602,"Make up consultation",
+"unspsc",91101603,"Tattoo services",
+"unspsc",91101604,"Body piercing services",
+"unspsc",91101605,"Electrolysis",
+"unspsc",91101700,"Hair care",
+"unspsc",91101701,"Hair cutting or color services",
+"unspsc",91101702,"Hair weaving or replacement services",
+"unspsc",91101800,"Clothing rental",
+"unspsc",91101801,"Tuxedo or formalwear rental",
+"unspsc",91101802,"Evening or bridal gown or dress rental",
+"unspsc",91101803,"Costume rental",
+"unspsc",91101900,"Fashion consultants",
+"unspsc",91101901,"Color consultant",
+"unspsc",91101902,"Fashion stylist",
+"unspsc",91101903,"Wardrobe consultant",
+"unspsc",91110000,"Domestic and personal assistance",
+"unspsc",91111500,"Laundering services",
+"unspsc",91111501,"Uniform rental",
+"unspsc",91111502,"Laundry services",
+"unspsc",91111503,"Dry cleaning",
+"unspsc",91111504,"Coin operated self service laundries",
+"unspsc",91111600,"Household assistance and care",
+"unspsc",91111601,"Housekeeping services",
+"unspsc",91111602,"Yard or pool care services",
+"unspsc",91111603,"Cooking or food preparation services",
+"unspsc",91111700,"Consumer buying and bartering services",
+"unspsc",91111701,"Used clothing consignment services",
+"unspsc",91111702,"Barter clubs or consortiums",
+"unspsc",91111703,"Wardrobe buying services",
+"unspsc",91111800,"Personal item care and storage",
+"unspsc",91111801,"Valet services",
+"unspsc",91111802,"Check room concessions",
+"unspsc",91111803,"Locker rental",
+"unspsc",91111804,"Fur storage",
+"unspsc",91111900,"Personal care services",
+"unspsc",91111901,"Infant or child daycare services",
+"unspsc",91111902,"Nanny or babysitting services",
+"unspsc",91111903,"Elderly daycare services",
+"unspsc",91111904,"Assisted living services",
+"unspsc",92000000,"National Defense and Public Order and Security and Safety Services",
+"unspsc",92100000,"Public order and safety",
+"unspsc",92101500,"Police services",
+"unspsc",92101501,"Policing services",
+"unspsc",92101502,"Special weapons and tactics SWAT or riot teams",
+"unspsc",92101503,"Community outreach programs",
+"unspsc",92101504,"Crime deterrence programs",
+"unspsc",92101600,"Fire services",
+"unspsc",92101601,"Municipal or national firefighting services",
+"unspsc",92101602,"Volunteer fire department services",
+"unspsc",92101603,"Fire prevention services",
+"unspsc",92101604,"Forest or wilderness firefighting services",
+"unspsc",92101700,"Jail and prison system",
+"unspsc",92101701,"Jail or prison or penitentiary services",
+"unspsc",92101702,"Youth camps or facilities services",
+"unspsc",92101703,"Half way house services",
+"unspsc",92101704,"Mentally impaired criminal facilities",
+"unspsc",92101800,"Court system",
+"unspsc",92101801,"Sheriffs services",
+"unspsc",92101802,"Plea bargain agreements",
+"unspsc",92101803,"Civil case court expenses",
+"unspsc",92101804,"Criminal case fees or fines",
+"unspsc",92101805,"Appeals process or judicial review",
+"unspsc",92101900,"Rescue services",
+"unspsc",92101901,"Search and rescue teams",
+"unspsc",92101902,"Ambulance services",
+"unspsc",92101903,"Life saving helicopter services",
+"unspsc",92101904,"Lifeguard services for pool or beach",
+"unspsc",92110000,"Military services and national defense",
+"unspsc",92111500,"Maintenance of international peace and security",
+"unspsc",92111501,"Dispute mediation or conciliation or negotiation or settlement",
+"unspsc",92111502,"Peace keeping operations",
+"unspsc",92111503,"Cease fire agreements or truce supervision",
+"unspsc",92111504,"Fact finding missions",
+"unspsc",92111505,"War prevention strategies",
+"unspsc",92111506,"Counterterrorism",
+"unspsc",92111507,"Embargoes",
+"unspsc",92111600,"Disarmament",
+"unspsc",92111601,"Arms limitations",
+"unspsc",92111602,"Conventional arms disarmament",
+"unspsc",92111603,"Nuclear freezes or disarmament",
+"unspsc",92111604,"Weapons destruction",
+"unspsc",92111605,"Disarmament negotiations or agreements",
+"unspsc",92111606,"Mutual or balanced force reductions",
+"unspsc",92111700,"Military science and research",
+"unspsc",92111701,"Military history",
+"unspsc",92111702,"Conventional weapons usage",
+"unspsc",92111703,"Chemical weapons usage",
+"unspsc",92111704,"Guerilla warfare",
+"unspsc",92111705,"Military strategy",
+"unspsc",92111706,"Aerial maneuvers",
+"unspsc",92111707,"Naval or submarine maneuvers",
+"unspsc",92111708,"Land maneuvers",
+"unspsc",92111800,"Military personnel and discipline",
+"unspsc",92111801,"Civil defense",
+"unspsc",92111802,"Compulsory military services",
+"unspsc",92111803,"Voluntary military services",
+"unspsc",92111804,"Military reservists",
+"unspsc",92111805,"Guerrillas",
+"unspsc",92111806,"Mercenaries",
+"unspsc",92111807,"Veterans",
+"unspsc",92111808,"Military courts",
+"unspsc",92111809,"Military offenses",
+"unspsc",92111810,"Military personnel",
+"unspsc",92111900,"Military policy",
+"unspsc",92111901,"National security",
+"unspsc",92111902,"Defense contracts",
+"unspsc",92111903,"Non first use policy",
+"unspsc",92111904,"Arms race",
+"unspsc",92111905,"Military relations",
+"unspsc",92112000,"Military zones",
+"unspsc",92112001,"Demilitarized zones",
+"unspsc",92112002,"Nuclear or chemical weapon free zones",
+"unspsc",92112003,"Peace zones",
+"unspsc",92112004,"No fly zones",
+"unspsc",92112100,"Nuclear warfare",
+"unspsc",92112101,"Nuclear safeguards",
+"unspsc",92112102,"Nuclear weapon tests",
+"unspsc",92112103,"Nuclear non proliferation",
+"unspsc",92112200,"Military tactics",
+"unspsc",92112201,"Weapons deployment",
+"unspsc",92112202,"Military reconnaissance",
+"unspsc",92112203,"Arms transfers",
+"unspsc",92112204,"Military assistance",
+"unspsc",92112205,"Troop withdrawals",
+"unspsc",92112206,"Rapid deployment forces",
+"unspsc",92112207,"Environmental warfare",
+"unspsc",92112300,"Military bases",
+"unspsc",92112301,"Domestic military bases",
+"unspsc",92112302,"Foreign military bases",
+"unspsc",92112303,"Naval bases",
+"unspsc",92112400,"Armed conflicts and incidents",
+"unspsc",92112401,"Border incidents",
+"unspsc",92112402,"Limited war",
+"unspsc",92112403,"Nuclear war",
+"unspsc",92112404,"Space based war",
+"unspsc",92112405,"Response to terrorist attacks",
+"unspsc",92120000,"Security and personal safety",
+"unspsc",92121500,"Guard services",
+"unspsc",92121501,"Armored car services",
+"unspsc",92121502,"Burglary protection services",
+"unspsc",92121503,"Guard dog rental",
+"unspsc",92121504,"Security guard services",
+"unspsc",92121600,"Detective services",
+"unspsc",92121601,"Detective agencies",
+"unspsc",92121602,"Fingerprint services",
+"unspsc",92121603,"Lie detection services",
+"unspsc",92121604,"Private investigation services",
+"unspsc",92121700,"Security systems services",
+"unspsc",92121701,"Surveillance or alarm maintenance or monitoring",
+"unspsc",92121702,"Fire alarm maintenance or monitoring",
+"unspsc",92121703,"Store or business anti theft services",
+"unspsc",92121704,"Confinement surveillance systems maintenance or monitoring",
+"unspsc",93000000,"Politics and Civic Affairs Services",
+"unspsc",93100000,"Political systems and institutions",
+"unspsc",93101500,"Political bodies",
+"unspsc",93101501,"Political parties representation services",
+"unspsc",93101502,"Political parties fund raising services",
+"unspsc",93101503,"Political parties public appearance services",
+"unspsc",93101504,"Political legislature services",
+"unspsc",93101505,"Political judicial power or services",
+"unspsc",93101506,"Political executive power or services",
+"unspsc",93101600,"Political officials",
+"unspsc",93101601,"Cabinet officers services",
+"unspsc",93101602,"Governors services",
+"unspsc",93101603,"Heads of states services",
+"unspsc",93101604,"Presidential services",
+"unspsc",93101605,"Prime ministers services",
+"unspsc",93101606,"Monarch services",
+"unspsc",93101607,"Statesmen services",
+"unspsc",93101608,"Parliament members services",
+"unspsc",93101700,"Legislative bodies and practice",
+"unspsc",93101701,"National council services",
+"unspsc",93101702,"Corporate states",
+"unspsc",93101703,"Bill drafting services",
+"unspsc",93101704,"Legislative hearings services",
+"unspsc",93101705,"Intelligence services",
+"unspsc",93101706,"Legislators services",
+"unspsc",93101707,"Parliamentary practice services",
+"unspsc",93110000,"Socio political conditions",
+"unspsc",93111500,"Political movements",
+"unspsc",93111501,"Extremist movements",
+"unspsc",93111502,"Peace movements",
+"unspsc",93111503,"Protest movements",
+"unspsc",93111504,"Underground movements",
+"unspsc",93111505,"Student movements",
+"unspsc",93111506,"Peasant movements",
+"unspsc",93111507,"Opposition movements",
+"unspsc",93111600,"Political representation and participation",
+"unspsc",93111601,"Political representation",
+"unspsc",93111602,"Political participation",
+"unspsc",93111603,"Proportional representation",
+"unspsc",93111604,"Vote catcher services",
+"unspsc",93111605,"Voter registration or counting or analysis or scrutiny services",
+"unspsc",93111606,"Pressure groups representation or participation services",
+"unspsc",93111607,"Election analysis services",
+"unspsc",93111608,"Election organization services",
+"unspsc",93120000,"International relations",
+"unspsc",93121500,"Diplomacy",
+"unspsc",93121501,"Diplomatic services",
+"unspsc",93121502,"Consular services",
+"unspsc",93121503,"Diplomats security services",
+"unspsc",93121504,"Diplomatic privileges or immunities services",
+"unspsc",93121505,"State immunities services",
+"unspsc",93121506,"Embassies or Ambassadors services",
+"unspsc",93121507,"State visits organization services",
+"unspsc",93121508,"International law prescription services",
+"unspsc",93121509,"International law promotion or recognition services",
+"unspsc",93121600,"International relations and cooperation",
+"unspsc",93121601,"Multilateral cooperation services",
+"unspsc",93121602,"Military cooperation services",
+"unspsc",93121603,"Political cooperation services",
+"unspsc",93121604,"International economic cooperation services",
+"unspsc",93121605,"North south cooperation services",
+"unspsc",93121606,"East west cooperation services",
+"unspsc",93121607,"International cooperation services",
+"unspsc",93121608,"Non governmental liaison services",
+"unspsc",93121609,"Non aligned countries cooperation",
+"unspsc",93121610,"Aligned countries cooperation",
+"unspsc",93121611,"Political crimes cooperation services",
+"unspsc",93121612,"Peace treaties cooperation",
+"unspsc",93121613,"Treaty signature or accessions or rectification services",
+"unspsc",93121614,"International watercourse cooperation services",
+"unspsc",93121615,"Territorial claims or negotiations third party services",
+"unspsc",93121700,"International organizations",
+"unspsc",93121701,"System of organizations services",
+"unspsc",93121702,"Security council services",
+"unspsc",93121703,"Economic or social council services",
+"unspsc",93121704,"Secretariat services",
+"unspsc",93121705,"Trustship council services",
+"unspsc",93121706,"General assembly services",
+"unspsc",93121707,"International court of justice services",
+"unspsc",93121708,"International political organizations services",
+"unspsc",93121709,"International charity organizations services",
+"unspsc",93121710,"International human relief organizations services",
+"unspsc",93121711,"International health organizations services",
+"unspsc",93130000,"Humanitarian aid and relief",
+"unspsc",93131500,"Refugee programs",
+"unspsc",93131501,"Protection of human rights services",
+"unspsc",93131502,"Promotion of human rights services",
+"unspsc",93131503,"Human rights education or information dissemination services",
+"unspsc",93131504,"Refugee emergency assistance services",
+"unspsc",93131505,"Refugee camps services",
+"unspsc",93131506,"Refugee resettlements or repatriation services",
+"unspsc",93131507,"Displaced persons assistance services",
+"unspsc",93131600,"Food and nutrition policy planning and programs",
+"unspsc",93131601,"Hunger eradication programs",
+"unspsc",93131602,"Emergency food supply services",
+"unspsc",93131603,"World food program services",
+"unspsc",93131604,"Food or agriculture organization services",
+"unspsc",93131605,"Common fund for commodities services",
+"unspsc",93131606,"International fund for agricultural development services",
+"unspsc",93131607,"Food distribution services",
+"unspsc",93131608,"Food supply services",
+"unspsc",93131609,"Food aid policies or programs",
+"unspsc",93131610,"Food planning services",
+"unspsc",93131611,"Food security services",
+"unspsc",93131612,"Food reserves management",
+"unspsc",93131613,"Food shortage or surplus management or control services",
+"unspsc",93131700,"Health programs",
+"unspsc",93131701,"Anti tobacco campaigns",
+"unspsc",93131702,"Sanitation programs",
+"unspsc",93131703,"Research programs",
+"unspsc",93131704,"Disease prevention or control services",
+"unspsc",93131705,"Drug abuse prevention or control programs",
+"unspsc",93131800,"Disaster preparedness and relief",
+"unspsc",93131801,"Disaster warning services",
+"unspsc",93131802,"Disaster preparedness response services",
+"unspsc",93131803,"Emergency housing services",
+"unspsc",93140000,"Community and social services",
+"unspsc",93141500,"Social development and services",
+"unspsc",93141501,"Social policy services",
+"unspsc",93141502,"Social security legislation services",
+"unspsc",93141503,"Social planning services",
+"unspsc",93141504,"Foster home care services or orphanage",
+"unspsc",93141505,"Adoption services",
+"unspsc",93141506,"Social welfare services",
+"unspsc",93141507,"Social work administration services",
+"unspsc",93141508,"Voluntary service management",
+"unspsc",93141509,"Social problems analysis or management services",
+"unspsc",93141510,"Social structure studies or related services",
+"unspsc",93141511,"Social groups studies or related services",
+"unspsc",93141512,"Youth movements or organizations services",
+"unspsc",93141513,"Social justice or legislation services",
+"unspsc",93141514,"Socio cultural services",
+"unspsc",93141600,"Population",
+"unspsc",93141601,"Population census services",
+"unspsc",93141602,"Population sample surveys services",
+"unspsc",93141603,"Birth reporting or control services",
+"unspsc",93141604,"Population control services",
+"unspsc",93141605,"Population trends or projections services",
+"unspsc",93141606,"Birth statistics services",
+"unspsc",93141607,"Marriage research or statistics services",
+"unspsc",93141608,"Population distribution or analysis services",
+"unspsc",93141609,"Population composition analysis services",
+"unspsc",93141610,"Demographic studies",
+"unspsc",93141611,"Immigration analysis or services",
+"unspsc",93141612,"Family planning programs or services",
+"unspsc",93141613,"Human reproduction analysis",
+"unspsc",93141700,"Culture",
+"unspsc",93141701,"Cultural events organizations",
+"unspsc",93141702,"Culture promotional services",
+"unspsc",93141703,"Art related services",
+"unspsc",93141704,"Song writing services",
+"unspsc",93141705,"Literary writing services",
+"unspsc",93141706,"Minorities protection services",
+"unspsc",93141707,"Cultural heritage preservation or promotion services",
+"unspsc",93141708,"Museum services",
+"unspsc",93141709,"Cultural policy services",
+"unspsc",93141710,"Archaic or indigenous language services",
+"unspsc",93141711,"Traditional handcrafts promotion services",
+"unspsc",93141712,"Protection of intellectual or cultural property services",
+"unspsc",93141713,"Historic sites or monuments protection services",
+"unspsc",93141714,"Mythology",
+"unspsc",93141800,"Employment",
+"unspsc",93141801,"Employment promotion or planning services",
+"unspsc",93141802,"Recruitment services",
+"unspsc",93141803,"International labor standards services",
+"unspsc",93141804,"International labor registration services",
+"unspsc",93141805,"Unemployment services",
+"unspsc",93141806,"Employment statistics or forecasting services",
+"unspsc",93141807,"Work time arrangements",
+"unspsc",93141808,"Occupational health or safety services",
+"unspsc",93141810,"Career development services",
+"unspsc",93141811,"Promotional services",
+"unspsc",93141812,"Labor inspection services",
+"unspsc",93141813,"Work council services",
+"unspsc",93141814,"International labor services",
+"unspsc",93141900,"Rural development",
+"unspsc",93141901,"Agricultural commercial banking services",
+"unspsc",93141902,"Rural investment services",
+"unspsc",93141903,"Agricultural institutions organization or management services",
+"unspsc",93141904,"Agricultural or rural cooperatives services",
+"unspsc",93141905,"Agricultural research services",
+"unspsc",93141906,"Farmers or peasants organizations services",
+"unspsc",93141907,"Womens services in agricultural production or rural development",
+"unspsc",93141908,"Agrarian reform or land settlement services",
+"unspsc",93141909,"Land administration services",
+"unspsc",93141910,"Island development services",
+"unspsc",93142000,"Urban development",
+"unspsc",93142001,"Urban development planning services",
+"unspsc",93142002,"Urban land administration services",
+"unspsc",93142003,"Urban investment programming services",
+"unspsc",93142004,"Slum redevelopment services",
+"unspsc",93142005,"Urban lighting services",
+"unspsc",93142006,"Urban development control or regulations services",
+"unspsc",93142007,"Urban building standards or regulations services",
+"unspsc",93142008,"Urban community services",
+"unspsc",93142009,"Urban project or program administration or management services",
+"unspsc",93142100,"Regional development",
+"unspsc",93142101,"Regional development planning services",
+"unspsc",93142102,"Economic cooperation services",
+"unspsc",93142103,"Technical cooperation services",
+"unspsc",93142104,"Sectoral planning services",
+"unspsc",93150000,"Public administration and finance services",
+"unspsc",93151500,"Public administration",
+"unspsc",93151501,"Public enterprises management or financial services",
+"unspsc",93151502,"Public enterprises information or control systems services",
+"unspsc",93151503,"Privatization programs",
+"unspsc",93151504,"Administrative reform services",
+"unspsc",93151505,"Administrative agencies services",
+"unspsc",93151506,"Administrative economic council services",
+"unspsc",93151507,"Administrative procedures or services",
+"unspsc",93151508,"Government departments services",
+"unspsc",93151509,"Government information services",
+"unspsc",93151510,"Administrative fees or tax collection services",
+"unspsc",93151511,"Administrative acts ratification or implementation services",
+"unspsc",93151512,"Public institutions services",
+"unspsc",93151513,"Multinational public corporations services",
+"unspsc",93151514,"Ombudsman services",
+"unspsc",93151515,"National planning services",
+"unspsc",93151600,"Public finance",
+"unspsc",93151601,"Program budgeting services",
+"unspsc",93151602,"Government budgeting services",
+"unspsc",93151603,"Budget or public investment management",
+"unspsc",93151604,"Military expenditures budgeting services",
+"unspsc",93151605,"Government finance services",
+"unspsc",93151606,"Government accounting services",
+"unspsc",93151607,"Government auditing services",
+"unspsc",93151608,"Government or central bank services",
+"unspsc",93151609,"Lotteries services",
+"unspsc",93151610,"Tax collection services",
+"unspsc",93151611,"Subsidies",
+"unspsc",93151700,"Currency",
+"unspsc",93151701,"Currencies or coinage",
+"unspsc",93151702,"National bank notes",
+"unspsc",93160000,"Taxation",
+"unspsc",93161500,"Income tax",
+"unspsc",93161501,"National income tax",
+"unspsc",93161502,"Municipal income tax",
+"unspsc",93161503,"Capital gains tax",
+"unspsc",93161504,"Excess profits tax",
+"unspsc",93161600,"Taxes other than income tax",
+"unspsc",93161601,"Property tax",
+"unspsc",93161602,"Land tax",
+"unspsc",93161603,"Value added tax VAT",
+"unspsc",93161604,"Payroll tax",
+"unspsc",93161605,"Sales tax",
+"unspsc",93161606,"Social security tax",
+"unspsc",93161607,"Inheritance or transfer tax",
+"unspsc",93161700,"Tax administration",
+"unspsc",93161701,"Tax collation",
+"unspsc",93161702,"Tax incentives",
+"unspsc",93161703,"Tax systems",
+"unspsc",93161704,"Tax revenue administration",
+"unspsc",93161800,"Taxation issues",
+"unspsc",93161801,"Tax reform",
+"unspsc",93161802,"Taxation policy",
+"unspsc",93161803,"Tax research",
+"unspsc",93161804,"Investment tax credit",
+"unspsc",93161805,"Tax deductions",
+"unspsc",93161806,"Tax evasion",
+"unspsc",93161807,"Tax shelters or havens",
+"unspsc",93161808,"Tax returns",
+"unspsc",93170000,"Trade policy and regulation",
+"unspsc",93171500,"Trade policy",
+"unspsc",93171501,"Trade agreements",
+"unspsc",93171502,"Trade negotiations",
+"unspsc",93171503,"Formulation of national commodity policies",
+"unspsc",93171504,"Development of small scale industries",
+"unspsc",93171600,"International trade",
+"unspsc",93171601,"International commodity agreements",
+"unspsc",93171602,"Export policy",
+"unspsc",93171603,"Global trade policies or procedures",
+"unspsc",93171604,"Bilateral trade agreements",
+"unspsc",93171700,"Customs administration and compliance",
+"unspsc",93171701,"Customs conventions",
+"unspsc",93171702,"Customs formalities",
+"unspsc",93171703,"Customs offences",
+"unspsc",93171800,"Trade analysis",
+"unspsc",93171801,"Trade projections",
+"unspsc",93171802,"Balance of trade projections",
+"unspsc",93171803,"Trade statistics",
+"unspsc",94000000,"Organizations and Clubs",
+"unspsc",94100000,"Work related organizations",
+"unspsc",94101500,"Business associations",
+"unspsc",94101501,"Agricultural industry associations",
+"unspsc",94101502,"Regulatory associations",
+"unspsc",94101503,"Sectoral business associations",
+"unspsc",94101504,"International business associations",
+"unspsc",94101505,"Employers associations",
+"unspsc",94101600,"Professional associations",
+"unspsc",94101601,"Dental associations",
+"unspsc",94101602,"Medical health associations",
+"unspsc",94101603,"Nursing associations",
+"unspsc",94101604,"Accounting associations",
+"unspsc",94101605,"Architect associations",
+"unspsc",94101606,"Bar associations",
+"unspsc",94101607,"Educational or teacher associations",
+"unspsc",94101608,"Engineering associations",
+"unspsc",94101609,"Scientific associations",
+"unspsc",94101610,"Professional standards review boards",
+"unspsc",94101700,"Staff associations",
+"unspsc",94101701,"Staff hobby clubs",
+"unspsc",94101702,"Staff sports associations",
+"unspsc",94101703,"Women staff associations",
+"unspsc",94101704,"Pensionnist staff associations",
+"unspsc",94101705,"Management staff associations",
+"unspsc",94101800,"Trade unions",
+"unspsc",94101801,"Labor or general workers trade unions",
+"unspsc",94101802,"Trade union activists services",
+"unspsc",94101803,"Trade union information services",
+"unspsc",94101804,"Transport Unions",
+"unspsc",94101805,"Teachers unions",
+"unspsc",94101806,"Medical personnel unions",
+"unspsc",94101807,"Employers unions",
+"unspsc",94101808,"Civil servants unions",
+"unspsc",94101809,"Personal assistance service unions",
+"unspsc",94101810,"Aviation unions",
+"unspsc",94110000,"Religious organizations",
+"unspsc",94111700,"Religious residences",
+"unspsc",94111701,"Private religious home residences",
+"unspsc",94111702,"Community religious home residences",
+"unspsc",94111703,"Religious retreat residences",
+"unspsc",94111704,"Temporary religious home residences",
+"unspsc",94111800,"Pilgrimage organizations and services",
+"unspsc",94111801,"Mecca pilgrimage organizations or services",
+"unspsc",94111802,"Vatican pilgrimage organizations or services",
+"unspsc",94111803,"Pilgrimage travel assistance services",
+"unspsc",94111804,"Pilgrimage tour operators services",
+"unspsc",94111900,"Missionary services",
+"unspsc",94111901,"Religious orders services",
+"unspsc",94111902,"Evangelical missionary services",
+"unspsc",94111903,"Educational missionary services",
+"unspsc",94112000,"Denominational services",
+"unspsc",94112001,"Hinduism services",
+"unspsc",94112002,"Buddhism services",
+"unspsc",94112003,"Christian services",
+"unspsc",94112004,"Islam services",
+"unspsc",94112005,"Judaism services",
+"unspsc",94120000,"Clubs",
+"unspsc",94121500,"Sport clubs",
+"unspsc",94121501,"Ice sports clubs",
+"unspsc",94121502,"Boating or swimming sport clubs",
+"unspsc",94121503,"Gun or hunting sport clubs",
+"unspsc",94121504,"Outdoor field sport clubs",
+"unspsc",94121505,"Indoor or outdoor court sport clubs",
+"unspsc",94121506,"Winter sport clubs",
+"unspsc",94121507,"Beach or water sport clubs",
+"unspsc",94121508,"Cycling sport clubs",
+"unspsc",94121509,"Mountaineering sport clubs",
+"unspsc",94121510,"Racing sport clubs",
+"unspsc",94121511,"Flying sport clubs",
+"unspsc",94121512,"Professional or semiprofessional sports clubs",
+"unspsc",94121513,"Stadium event operator services",
+"unspsc",94121514,"Sport club managers or promoters services",
+"unspsc",94121600,"Hobby clubs",
+"unspsc",94121601,"playing card hobby clubs",
+"unspsc",94121602,"Handcrafts clubs",
+"unspsc",94121603,"Poetry or literature hobby clubs",
+"unspsc",94121604,"Cooking hobby clubs",
+"unspsc",94121605,"Gardening hobby clubs",
+"unspsc",94121606,"Collector hobby club",
+"unspsc",94121607,"Scouting club",
+"unspsc",94121700,"Amateurs clubs",
+"unspsc",94121701,"Amateur drama clubs or services",
+"unspsc",94121702,"Amateur music clubs or services",
+"unspsc",94121703,"Amateur dance clubs or services",
+"unspsc",94121704,"Amateur fine arts clubs or services",
+"unspsc",94121800,"Social clubs",
+"unspsc",94121801,"Youth clubs",
+"unspsc",94121802,"Senior citizens clubs",
+"unspsc",94121803,"Social gathering clubs",
+"unspsc",94121804,"Social clubs for people with disabilities",
+"unspsc",94121805,"War veterans social clubs",
+"unspsc",94130000,"Civic organizations and associations and movements",
+"unspsc",94131500,"Non governmental organizations",
+"unspsc",94131501,"Environmental non governmental services",
+"unspsc",94131502,"Emergency relief non governmental services",
+"unspsc",94131503,"Technical assistance non governmental services",
+"unspsc",94131504,"Development aid non governmental services",
+"unspsc",94131600,"Charity organizations",
+"unspsc",94131601,"Charity organizations shelter services",
+"unspsc",94131602,"Food relief services",
+"unspsc",94131603,"Legal assistance services",
+"unspsc",94131604,"Resource mobilization services",
+"unspsc",94131605,"International aid assistance services",
+"unspsc",94131606,"Orphanage or adoption services",
+"unspsc",94131607,"Elderly assistance organizations",
+"unspsc",94131608,"Prisoner assistance organizations",
+"unspsc",94131700,"Green associations",
+"unspsc",94131701,"Radical green associations",
+"unspsc",94131702,"Ecofeminists associations",
+"unspsc",94131703,"Ecological political organizations",
+"unspsc",94131704,"Green activists movements or services",
+"unspsc",94131800,"Movements",
+"unspsc",94131801,"Gay or lesbian or bisexual or transgender movements",
+"unspsc",94131802,"Anti racism movements",
+"unspsc",94131803,"Women liberation movements",
+"unspsc",94131804,"Fraternal associations",
+"unspsc",94131805,"Ethnic minorities cultural preservation services",
+"unspsc",94131900,"Animal protection associations",
+"unspsc",94131901,"Animal liberation movements",
+"unspsc",94131902,"Endangered species protection associations",
+"unspsc",94131903,"Threatened animals protection associations",
+"unspsc",94132000,"Human rights advocacy and defense associations",
+"unspsc",94132001,"Children rights defense services",
+"unspsc",94132002,"Prisoners defense services",
+"unspsc",94132003,"Physical or mental torture defense associations",
+"unspsc",94132004,"Freedom of speech defense associations",
+"unspsc",94132005,"Voting rights defense associations",
+,,,
+"© 2005-2006 Ariba, Inc., All Rights Reserved. The contents of this document are confidential and proprietary information of Ariba, Inc.",,,
 

file:a/admin/abr-example.php (deleted)
--- a/admin/abr-example.php
+++ /dev/null
@@ -1,23 +1,1 @@
-<?php
-$ch = curl_init();
-curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-curl_setopt($ch, CURLOPT_REFERER, "http://contractdashboard.lambdacomplex.org");
-$guid = "5f2f943e-15f4-4782-8fad-9a0fe83a2f47";
-$orgname = "Department of Foreign Affairs and Trade";
 
-//foreach $agency
-$url = "http://abr.business.gov.au/ABRXMLSearchRPC/ABRXMLSearch.asmx/ABRSearchByNameSimpleProtocol?name=".urlencode($orgname)."&postcode=&legalName=Y&tradingName=Y&NSW=Y&SA=Y&ACT=Y&VIC=Y&WA=Y&NT=Y&QLD=Y&TAS=Y&authenticationGuid=$guid";
-curl_setopt($ch, CURLOPT_URL, $url);
-$body = curl_exec($ch);
-$xml = new SimpleXMLElement($body);
-echo "<pre>";
-$result = $xml->response->searchResultsList->searchResultsRecord[0];
-var_dump($result);
-echo "</pre>";
-echo "<b> Organisation:</b>" . $result->mainName->organisationName;
-echo "<b> ABN:</b>".$result->ABN->identifierValue;
-// fi
-
-curl_close($ch);
-
-?>

file:a/admin/cmd.exe.lnk (deleted)
 Binary files a/admin/cmd.exe.lnk and /dev/null differ
--- a/admin/convertToThematicMapping.php
+++ /dev/null
@@ -1,64 +1,1 @@
-<?php
 
-include_once("../common.inc.php");
-$year = $_REQUEST['year'];
-$query = "SELECT supplierCountry, sum(value) FROM `contractnotice` where childCN = 0 AND (YEAR(contractStart) = $year) AND supplierCountry != 'Australia' GROUP BY supplierCountry ";
-
-$result = mysql_query($query);
-if (!$result) echo mysql_error().$query;
-$countryValues = Array();
-while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
- $supplierCountry = strtoupper($row['supplierCountry']);
-if ($supplierCountry == "MYANMAR") $supplierCountry = "BURMA";
-if ($supplierCountry == "RUSSIAN FEDERATION") $supplierCountry = "RUSSIA";
-if ($supplierCountry == "TAIWAN, PROVINCE OF CHINA") $supplierCountry = "TAIWAN";
-$countryValues[$supplierCountry] = $row['sum(value)'];
-}
-mysql_free_result($result);
-
-$query = "SELECT supplierPostcode, sum(value) FROM `contractnotice` where childCN = 0 AND (YEAR(contractStart) = $year) AND supplierCountry = 'Australia' GROUP BY supplierPostcode ";
-
-$result = mysql_query($query);
-if (!$result) echo mysql_error().$query;
-$postcodeValues = Array();
-while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
-$postcodeValues[$row['supplierPostcode']] = $row['sum(value)'];
-}
-mysql_free_result($result);
-
-
-@mysql_select_db("tme") or die( "Unable to select database tme");
-$query = "SELECT un, name
-FROM `country_simpl`";
-
-$result = mysql_query($query);
-if (!$result) echo mysql_error().$query;
-$countryUN = Array();
-while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
-$countryUN[strtoupper($row['name'])] = $row['un'];
-}
-mysql_free_result($result);
-
-echo "<table>";
-
-// drop from table existing values
-//$result = mysql_query('insert into indicator_values ( "variable", "area", "year", "value" ) VALUES (2107, '.$countryUN[strtoupper($countryName)].', '.$year.','.$countryValue.');');
-//if (!$result) echo mysql_error().$query;
-
-
-foreach ($countryValues as $countryName => $countryValue) {
-echo "<tr><td>$countryName<td>".$countryUN[strtoupper($countryName)]."<td>$countryValue</tr>";
-$query = 'insert into indicator_values ( `variable`, `area`, `year`, `value` ) VALUES (\'2107\', \''.$countryUN[strtoupper($countryName)].'\', \''.$year.'\',\''.$countryValue.'\');';
-$result = mysql_query($query);
-if (!$result) echo mysql_error();
-}
-
-foreach ($postcodeValues as $postcode => $postcodeValue) {
-echo "<tr><td>Australia<td>$postcode<td>$postcodeValue</tr>";
-$query = 'INSERT into indicator_values ( `variable`, `area`, `year`, `value` ) VALUES (\'2107\', \''.($postcode*1000).'\', \''.$year.'\',\''.$countryValue.'\');';
-$result = mysql_query($query);
-if (!$result) echo mysql_error();
-}
-
-echo "</table>";
-?>

--- a/admin/displayRepresentatives.php
+++ /dev/null
@@ -1,7 +1,1 @@
-SELECT representative_id,firstname,surname,party,house,division_id,	portfolio
-FROM portfolio2representative
-INNER JOIN representatives
-ON portfolio2representative.representative_id=representatives.id
-INNER JOIN portfolios
-ON portfolio2representative.portfolio_id=portfolios.id
 

--- a/admin/google-example.htm
+++ /dev/null
@@ -1,39 +1,1 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <title>My Google AJAX Search API Application - http://contractdashboard.lambdacomplex.org</title>
-    <script src="http://www.google.com/jsapi?key=ABQIAAAA95XYXN0cki3Yj_Sb71CFvBSgIPe2k9-DRgEVQvbvQDV8xmTiXRTBpHxrD7bSh5rl2lswY56769CyQQ" type="text/javascript"></script>
-    <script language="Javascript" type="text/javascript">
-    //<![CDATA[
 
-    google.load("search", "1");
-
-    function OnLoad() {
-      // Create a search control
-      var searchControl = new google.search.SearchControl();
-
-      // Add in a full set of searchers
-      var localSearch = new google.search.LocalSearch();
-      searchControl.addSearcher(localSearch);
-      searchControl.addSearcher(new google.search.WebSearch());
-      searchControl.addSearcher(new google.search.VideoSearch());
-      searchControl.addSearcher(new google.search.BlogSearch());
-
-      // Set the Local Search center point
-      localSearch.setCenterPoint("New York, NY");
-
-      // Tell the searcher to draw itself and tell it where to attach
-      searchControl.draw(document.getElementById("searchcontrol"));
-
-      // Execute an inital search
-      searchControl.execute("Google");
-    }
-    google.setOnLoadCallback(OnLoad);
-
-    //]]>
-    </script>
-  </head>
-  <body>
-    <div id="searchcontrol">Loading...</div>
-  </body>
-</html>

--- a/admin/google-example.php
+++ /dev/null
@@ -1,25 +1,1 @@
-<?php
-$ch = curl_init();
-curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-curl_setopt($ch, CURLOPT_REFERER, "http://contractdashboard.lambdacomplex.org");
 
-$agency = "Department of Foreign Affairs and Trade";
-
-//foreach $agency
-$url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&key=ABQIAAAA95XYXN0cki3Yj_Sb71CFvBSgIPe2k9-DRgEVQvbvQDV8xmTiXRTBpHxrD7bSh5rl2lswY56769CyQQ&rsz=small&filter=1&gl=au&q=".urlencode($agency)."%20ABN%20site:.gov.au";
-curl_setopt($ch, CURLOPT_URL, $url);
-$body = curl_exec($ch);
-$json = json_decode($body);
-echo "<pre>";
-$result = $json->responseData->results[0];
-print_r($result);
-echo "</pre>";
-echo "<b> Agency:</b> $agency";
-echo "<b> URL:</b> http://".$result->visibleUrl;
-preg_match('/\d{2} \d{3} \d{3} \d{3}/i', $result->content,$abn);
-echo "<b> ABN:</b> {$abn[0]}";
-// fi
-
-curl_close($ch);
-
-?>

file:a/admin/import.bat (deleted)
--- a/admin/import.bat
+++ /dev/null
@@ -1,1 +1,1 @@
-c:\wamp\bin\php\php5.3.0\php.exe import.php
+

--- /dev/null
+++ b/admin/importUNSPSC.php
@@ -1,1 +1,32 @@
+<?php
+  include_once("../lib/common.inc.php");
+      $success = 0;
+      $fname = "UNSPSC_ECCMA_V13.2_UNDP_V7.csv";
+      echo " ============== $fname  ============== <br>";
+      flush();
+      $row = 1;
+      $handle = fopen($path . $fname, "r");
+      $headers;
+      
+      while (($data = fgetcsv($handle, 1000)) !== false) {
+          $num = count($data);
+          
+          if ($row == 3) {
+              $headers = $data;
+          } elseif ($row > 3) {
+//print_r($data);
+$query = "insert into UNSPSCcategories values(".$data[1].",'$data[2]');";		
+//echo $query."<br>\n";		
+mysql_query($query);
+              flush();
+              
+              //echo "<hr>\n";
+          }
+          
+          $row++;
+      }
+      echo "<br> $success records successfully created";
+      flush();
+      fclose($handle);
+?>
 

--- a/admin/recordsperweek.txt
+++ /dev/null
@@ -1,7 +1,1 @@
- SELECT min( `publishDate` ) AS w, week( `publishDate` ) AS wk, count( 1 )
-FROM `contractnotice`
-WHERE YEAR( `publishDate` ) =2009
-GROUP BY wk
-ORDER BY w
-LIMIT 0 , 30 
 

--- a/admin/updateReport.php
+++ b/admin/updateReport.php
@@ -25,6 +25,6 @@
 echo $stats["count"] . " Australian suppliers with no ABN<br>";*/

 

 

-echo "Last updated: ". $stats["importday"]."<br>";

+echo "Last updated: ". $stats["importdate"]."<br>";

 ?>

 

--- a/admin/updateUNSPSC.php
+++ b/admin/updateUNSPSC.php
@@ -6,6 +6,22 @@
 $unspscresult = mysql_query ("select * from UNSPSCcategories;");

 while ($row = mysql_fetch_assoc($unspscresult)) {

 	$unspsc[$row['Title']] = $row['UNSPSC'];

+	// some Australian spellings

+	$isiz = str_replace("iz","is",$row['Title']);

+	$unspsc[$isiz] = $row['UNSPSC'];

+	$defence = str_replace("efense","efence",$row['Title']);

+	$unspsc[$defence] = $row['UNSPSC'];

+	$center = str_replace("enter","entre",$row['Title']);

+	$unspsc[$center] = $row['UNSPSC'];

+	// some divergence from standard

+	$tobacco = str_replace("Food Beverage and Tobacco Products","Food and Beverage Products",$row['Title']);

+	$unspsc[$tobacco] = $row['UNSPSC'];

+	$architect = str_replace("Building and Construction and Maintenance Services","Architectural services",$row['Title']);

+	$unspsc[$architect] = $row['UNSPSC'];

+	// some just plain wrong

+	$noOilRigs = str_replace("Building and Construction and Maintenance Services","Management and provision of all facilities engineering modification and maintenance services for a site or platform",$row['Title']);

+	$unspsc[$noOilRigs] = $row['UNSPSC'];

+	

 }

 

 $query = "SELECT CNID,category,value

@@ -28,7 +44,7 @@
 	}

 	} 

 } else echo "error".mysql_error();

-asort($missing);

+asort($missing,SORT_NUMERIC);

 print_r($missing);

 ?>

 

--- a/displayContract.php
+++ b/displayContract.php
@@ -28,9 +28,17 @@
 echo "<br>";

 }

 }

-echo '<a href="https://www.tenders.gov.au/?event=public.advancedsearch.keyword&keyword=CN'.$_REQUEST['CNID'].'"> View original record @ tenders.gov.au</a>';

+echo '<br><a href="https://www.tenders.gov.au/?event=public.advancedsearch.keyword&keyword=CN'.$_REQUEST['CNID'].'"> View original record @ tenders.gov.au</a><br>';

 

 mysql_free_result($result);

+

+$query = "SELECT * FROM `heuristic_results` where CNID = ".$_REQUEST['CNID'];

+$result = mysql_query($query);

+if (!$result) echo mysql_error().$query;

+while ($r = mysql_fetch_array($result, MYSQL_ASSOC)) {

+	echo "<b>{$r['heuristic_name']}</b>: {$r['heuristic_value']} (raw value: {$r['raw_value']}, mean: {$r['mean']}, stddev: {$r['stddev']})<br>";

+}

+

 include_footer();

 ?>

 

--- a/exportData.csv.php
+++ b/exportData.csv.php
@@ -1,13 +1,14 @@
 <?php
 
 include_once("./lib/common.inc.php");
-
+setlocale(LC_CTYPE, 'C');
 // source: http://stackoverflow.com/questions/81934/easy-way-to-export-a-sql-table-without-access-to-the-server-or-phpmyadmin#81951
 $result = mysql_query('
-SELECT CNID,contractnotice.agencyName,agency.abn as agencyABN,publishDate,contractStart,contractEnd,value,description,procurementMethod,category,categoryUNSPSC
+SELECT CNID,contractnotice.agencyName,agency.abn as agencyABN,DATE(publishDate),contractStart,contractEnd,value,description,procurementMethod,category,categoryUNSPSC
 ,supplierABN,supplierName,supplierCity,supplierPostcode,supplierCountry,contactPostcode,
 IF(supplierABN != "",supplierABN,supplierName) as supplierID,
-concat("https://www.tenders.gov.au/?event=public.advancedsearch.keyword&keyword=CN",CNID) as sourceURL FROM `contractnotice` join agency on contractnotice.agencyName=agency.agencyName where childCN = 0');
+concat("https://www.tenders.gov.au/?event=public.advancedsearch.keyword&keyword=CN",CNID) as sourceURL 
+FROM `contractnotice` join agency on contractnotice.agencyName=agency.agencyName where childCN = 0');
 if (!$result) die('Couldn\'t fetch records');
 $num_fields = mysql_num_fields($result);
 $headers = array();
@@ -22,6 +23,10 @@
     header('Expires: 0');
     fputcsv($fp, $headers);
     while ($row = mysql_fetch_assoc($result)) {
+	foreach ($row as &$colvalue) {
+			$colvalue =  preg_replace( '/[^[:print:]]/', '',
+			 utf8_encode($colvalue));
+		}
         fputcsv($fp, array_values($row));
     }
     die;

--- a/heuristics/dateHeuristics.php
+++ b/heuristics/dateHeuristics.php
@@ -1,1 +1,102 @@
+<?php
+//long contract period (number of weeks/days?)
+$heuristics["DATE_LONG_CONTRACT_PERIOD"] = Array(
+	"description" => "long contract period (number of weeks/days?)"
+);
+function DATE_LONG_CONTRACT_PERIOD($cn)
+{
+	$averageContractPeriod = getAverageContractPeriod();
+	$stddevContractPeriod = getstddevContractPeriod();
+	$diff = strtotime($cn['contractEnd']) - strtotime($cn['contractStart']);
+	$days = intval($diff / (60 * 60 * 24));
+	$value = abs($days - $averageContractPeriod) / $stddevContractPeriod;
+	return Array(
+		"heuristic_value" => $value,
+		"raw_value" => $days,
+		"mean" => $averageContractPeriod,
+		"stddev" => $stddevContractPeriod
+	);
+}
+$averageContractPeriod;
+function getAverageContractPeriod()
+{
+	global $averageContractPeriod, $stddevContractPeriod;
+	if (!$averageContractPeriod) {
+		getStddevAverageContractPeriod();
+	}
+	return $averageContractPeriod;
+}
+$stddevContractPeriod;
+function getstddevContractPeriod()
+{
+	global $averageContractPeriod, $stddevContractPeriod;
+	if (!$stddevContractPeriod) {
+		getStddevAverageContractPeriod();
+	}
+	return $stddevContractPeriod;
+}
+function getStddevAverageContractPeriod()
+{
+	global $averageContractPeriod, $stddevContractPeriod;
+	$query = "select AVG(dateDiff(contractEnd,contractStart)),stddev(dateDiff(contractEnd,contractStart)) from contractnotice";
+	$result = mysql_query($query);
+	$r = mysql_fetch_array($result, MYSQL_BOTH);
+	$averageContractPeriod = $r[0];
+	$stddevContractPeriod = $r[1];
+}
 
+
+//Reported late, 45 days? A late contract is a dodgy contract except maybe for variations?
+$heuristics["DATE_REPORTED_LATE"] = Array(
+	"description" => "Reported late, 45 days?"
+);
+function DATE_REPORTED_LATE($cn)
+{
+	$averageDaysLate = getAverageDaysLate();
+	$stddevDaysLate = getStddevDaysLate();
+	$diff = strtotime($cn['publishDate']) - strtotime($cn['contractStart']);
+	$days = intval($diff / (60 * 60 * 24));
+	if ($days <= 0) {
+		$value = 0;
+	}
+	else {
+		// +1 demerit for exceeding 45 day requirement
+		$value = (abs($days - $averageDaysLate) / $stddevDaysLate) + ($days < 45 ? 0 : 1);
+	}
+	return Array(
+		"heuristic_value" => $value,
+		"raw_value" => $days,
+		"mean" => $averageDaysLate,
+		"stddev" => $stddevDaysLate
+	);
+}
+$averageDaysLate;
+function getAverageDaysLate()
+{
+	global $averageDaysLate;
+	if (!$averageDaysLate) {
+            getDaysLate();
+	}
+	return $averageDaysLate;
+}
+$stddevDaysLate;
+function getStddevDaysLate()
+{
+	global $stddevDaysLate;
+	if (!$stddevDaysLate) {
+	getDaysLate();
+	}
+	return $stddevDaysLate;
+}
+function getDaysLate() {
+    
+	global $averageDaysLate,$stddevDaysLate;
+    
+    		$query = "select AVG(dateDiff(publishDate,contractStart)), STDDEV(dateDiff(publishDate,contractStart)) from contractnotice";
+		$result = mysql_query($query);
+		$r = mysql_fetch_array($result, MYSQL_BOTH);
+		$averageDaysLate = $r[0];
+                	$stddevDaysLate = $r[1];
+
+}
+?>

--- /dev/null
+++ b/heuristics/heuristics.inc.php
@@ -1,1 +1,39 @@
-
+<?php
+include_once ("../lib/common.inc.php");
+$heuristics = Array();
+//each heuristic adds self to description array
+include ("dateHeuristics.php");
+//include ("historyHeuristics.php");
+//include ("metadataHeuristics.php");
+//include ("valueHeuristics.php");
+function runHeuristic($heuristicName, $cn)
+{
+	// check  if already ran
+	$query = "select count(*) from heuristic_results where heuristic_name = '$heuristicName' and CNID = '{$CN['CNID']}";
+	$result = mysql_query($query);
+	$r = mysql_fetch_array($result);
+	if ($r[0] == 0) {
+		// if not, run now
+		$hresults = call_user_func($heuristicName, $cn);
+		if (!isset($hresults["heuristic_value"]) || !isset($hresults["raw_value"]) || !isset($hresults["mean"]) || !isset($hresults["stddev"])) {
+			print_r($hresults);
+			die("Missing field in heurtistic $heuristicName result");
+		}
+		$query = "insert into heuristic_results values('$heuristicName',
+    '{$hresults["heuristic_value"]}',
+     '{$hresults["raw_value"]}',
+      '{$hresults["mean"]}',
+       '{$hresults["stddev"]}',
+           '{$cn["CNID"]}',
+           NOW(),
+           '{$cn["publishDate"]}',
+           '{$cn["agencyABN"]}',
+           '{$cn["supplierID"]}'
+    )";
+		// save value and cn data via sql
+		$result = mysql_query($query);
+		if ($result) echo "Saved $heuristicName for {$cn["CNID"]} <br>\n";
+		elseif (strpos(mysql_error() , "Duplicate entry") === false) echo $hresults . " failed insert.<br>" . mysql_error() . " <br>  $query <br><br>\n";
+	}
+}
+?>

--- a/heuristics/historyHeuristics.php
+++ b/heuristics/historyHeuristics.php
@@ -1,1 +1,126 @@
+<?php
+$heuristics["HISTORY_LOW_TRANSACTIONS_AGENCY"] = Array(
+	"description" => "unusual for agency due to previous low number of transactions "
+);
+function HISTORY_LOW_TRANSACTIONS_AGENCY($cn)
+{
+	$thisAgencyTransactions = getAgencyTransactions($cn['agencyName']);
+	$averageAgencyTransactions = getAverageAgencyTransactions();
+	$stddevAgencyTransactions = getstddevAgencyTransactions();
+	$diff = strtotime($cn['contractEnd']) - strtotime($cn['contractStart']);
+	$days = intval($diff / (60 * 60 * 24));
+	$value = abs($days - $averageAgencyTransactions) / $stddevAgencyTransactions;
+	return Array(
+		"heuristic_value" => $value,
+		"raw_value" => $days,
+		"mean" => $averageAgencyTransactions,
+		"stddev" => $stddevAgencyTransactions
+	);
+}
+$agencyTransactions = Array();
+function getAgencyTransactions($agencyName)
+{
+	global $agencyTransactions;
+	if (!$agencyTransactions[$agencyName]) {
+		$query = 'select count(*) from contractnotice where agencyName = "' . $agencyName . '"';
+		$result = mysql_query($query);
+		$r = mysql_fetch_array($result, MYSQL_BOTH);
+		$agencyTransactions[$agencyName] = $r[0];
+	}
+	return $agencyTransactions[$agencyName];
+}
+$averageAgencyTransactions;
+function getAverageAgencyTransactions()
+{
+	global $averageAgencyTransactions;
+	if (!$averageAgencyTransactions) {
+		getStatsAgencyTransactions();
+	}
+	return $averageAgencyTransactions;
+}
+$stddevAgencyTransactions;
+function getstddevAgencyTransactions()
+{
+	global $stddevAgencyTransactions;
+	if (!$stddevAgencyTransactions) {
+		getStatsAgencyTransactions();
+	}
+	return $stddevAgencyTransactions;
+}
+function getStatsAgencyTransactions()
+{
+	global $averageAgencyTransactions, $stddevAgencyTransactions;
+	$query = "select avg(count), STDDEV(count) from (select count(*) as count
+                from contractnotice group by agencyName) as a;";
+	$result = mysql_query($query);
+	$r = mysql_fetch_array($result, MYSQL_BOTH);
+	$averageAgencyTransactions = $r[0];
+	$stddevAgencyTransactions = $r[1];
+}
+$heuristics["HISTORY_LOW_TRANSACTIONS_SUPPLIER"] = Array(
+	"description" => "unusual for supplier due to previous low number of transactions "
+);
+function HISTORY_LOW_TRANSACTIONS_SUPPLIER($cn)
+{
+	$thisSupplierTransactions = getSupplierTransactions($cn['supplierName'], $cn['supplierABN']);
+	$averageSupplierTransactions = getAverageSupplierTransactions();
+	$stddevSupplierTransactions = getstddevSupplierTransactions();
+	$diff = strtotime($cn['contractEnd']) - strtotime($cn['contractStart']);
+	$days = intval($diff / (60 * 60 * 24));
+	$value = abs($days - $averageSupplierTransactions) / $stddevSupplierTransactions;
+	return Array(
+		"heuristic_value" => $value,
+		"raw_value" => $days,
+		"mean" => $averageSupplierTransactions,
+		"stddev" => $stddevSupplierTransactions
+	);
+}
+$supplierTransactions = Array();
+function getSupplierTransactions($supplierName, $supplierABN)
+{
+	global $supplierTransactions;
+	if ($supplierABN != 0 && $supplierABN != "") {
+		if (!$supplierTransactions[$supplierABN]) {
+			$query = 'select count(*) from contractnotice where supplierABN = "' . $supplierABN . '"';
+			$result = mysql_query($query);
+			$r = mysql_fetch_array($result, MYSQL_BOTH);
+			$supplierTransactions[$supplierABN] = $r[0];
+		}
+		return $supplierTransactions[$supplierABN];
+	}
+	if (!$supplierTransactions[$supplierName]) {
+		$query = 'select count(*) from contractnotice where supplierName = "' . $supplierName . '"';
+		$result = mysql_query($query);
+		$r = mysql_fetch_array($result, MYSQL_BOTH);
+		$supplierTransactions[$supplierName] = $r[0];
+	}
+	return $supplierTransactions[$supplierName];
+}
+$averageSupplierTransactions;
+function getAverageSupplierTransactions()
+{
+	global $averageSupplierTransactions;
+	if (!$averageSupplierTransactions) {
+		getStatsSupplierTransactions();
+	}
+	return $averageSupplierTransactions;
+}
+$stddevSupplierTransactions;
+function getstddevSupplierTransactions()
+{
+	global $stddevSupplierTransactions;
+	if (!$stddevSupplierTransactions) {
+		getStatsSupplierTransactions();
+	}
+	return $stddevSupplierTransactions;
+}
+function getStatsSupplierTransactions()
+{
+	global $averageSupplierTransactions, $stddevSupplierTransactions;
+	$query = 'select avg(count), stddev(count) from (select IF(supplierABN != "",supplierABN,supplierName) as supplierID, count(*) as count from contractnotice group by supplierID) as a;';
+	$result = mysql_query($query);
+	$r = mysql_fetch_array($result, MYSQL_BOTH);
+	$averageSupplierTransactions = $r[0];
+	$stddevSupplierTransactions = $r[1];
+}
 

--- a/heuristics/metadataHeuristics.php
+++ b/heuristics/metadataHeuristics.php
@@ -1,1 +1,59 @@
+ <?php
+/* all
+   SELECT description, count(*) as count
+FROM `contractnotice` 
+group by description having count > 1 order by count
+*/
+/*- duplicated description
+ - most duplicated overall, most duplicated per agency/category/supplier etc. */
+$heuristics["METADATA_DUPLICATED_DESCRIPTION"] = Array(
+	"description" => ""
+);
+function METADATA_DUPLICATED_DESCRIPTION($cn)
+{
+	$averageDuplicatedDescriptions = getAverageDuplicatedDescriptions();
+	$stddevDuplicatedDescriptions = getstddevDuplicatedDescriptions();
+	$query = 'select count(*) from contractnotice where description = "' . $agencyName . '"';
+	$result = mysql_query($query);
+	$r = mysql_fetch_array($result, MYSQL_BOTH);
+	$dupeDesc = $r[0];
+        if ($dupeDesc == 1) $value = 0;
+	else $value = abs($dupeDesc - $averageDuplicatedDescriptions) / $stddevDuplicatedDescriptions;
+	return Array(
+		"heuristic_value" => $value,
+		"raw_value" => $dupeDesc,
+		"mean" => $averageDuplicatedDescriptions,
+		"stddev" => $stddevDuplicatedDescriptions
+	);
+}
+$averageDuplicatedDescriptions;
+function getAverageDuplicatedDescriptions()
+{
+	global $averageDuplicatedDescriptions;
+	if (!$averageDuplicatedDescriptions) {
+		getStatsDuplicatedDescriptions();
+	}
+	return $averageDuplicatedDescriptions;
+}
+$stddevDuplicatedDescriptions;
+function getstddevDuplicatedDescriptions()
+{
+	global $stddevDuplicatedDescriptions;
+	if (!$stddevDuplicatedDescriptions) {
+		getStatsDuplicatedDescriptions();
+	}
+	return $stddevDuplicatedDescriptions;
+}
+function getStatsDuplicatedDescriptions()
+{
+	$query = "select avg(count),STDDEV(count) from (
+        SELECT description, count(*) as count
+FROM `contractnotice` 
+group by description having count > 1 
+        ) as a;";
+	$result = mysql_query($query);
+	$r = mysql_fetch_array($result, MYSQL_BOTH);
+	$averageDuplicatedDescriptions = $r[0];
+	$stddevDuplicatedDescriptions = $r[1];
+}
 

file:a/heuristics/readme.txt (deleted)
--- a/heuristics/readme.txt
+++ /dev/null
@@ -1,11 +1,1 @@
-heuristicResults
-heuristic = BY_DATE...
-value = 0.0
-cnPubDate = 
-lastUpdated = 1/1/1970
-contractNotice =
-agency = 
-supplier =
 
-work out total value by summing value
-

--- a/heuristics/runHeuristics.php
+++ b/heuristics/runHeuristics.php
@@ -1,6 +1,32 @@
-<?
-if agency
-if supplier
-if CN
+<?php
+include_once("heuristics.inc.php");
+$query = "SELECT *, agency.abn as agencyABN, IF(supplierABN != '',supplierABN,supplierName) as supplierID
+FROM contractnotice JOIN agency ON contractnotice.agencyName=agency.agencyName";
+
+$query = "SELECT *, agency.abn as agencyABN, IF(supplierABN != '',supplierABN,supplierName) as supplierID
+FROM contractnotice JOIN agency ON contractnotice.agencyName=agency.agencyName
+WHERE  DATE(importDate) = (select * from (SELECT DATE(importDate) 
+FROM contractnotice ORDER BY importDate DESC limit 1) alias)";
+$result = mysql_query($query);
+if (!$result) echo mysql_error().$query;
+while ($cn = mysql_fetch_array($result, MYSQL_BOTH)) {
+	//get each new CN from latest update
+	foreach ($heuristics as $heuristic => $description) {
+		// run all heuristics
+		runHeuristic($heuristic, $cn);
+	}
+        flush();
+}
+/*foreach agency
+
+aggregate agency metrics
+
+foreach supplier
+
+aggreate supplier metrics
+
+foreach CN
+
+aggregate CN metrics */
 ?>
 

--- a/heuristics/valueHeuristics.php
+++ b/heuristics/valueHeuristics.php
@@ -1,1 +1,58 @@
+<?php 
+      /*  - large contract value
+          - standard dev from mean/median
+          - percent of total contracts for supplier/agency*/
+   $heuristics["VALUE_LARGE_CONTRACT_OVERALL"] = Array(
+	"description" => "unusual value for time of year");
+function METADATA_DUPLICATED_DESCRIPTION($cn)
+{
+    	$averageContractPeriod = getAverageContractPeriod();
+	$diff = strtotime($cn['contractStart']) - strtotime($cn['publishDate']);
+	$days = intval($diff / 24);
+	return ($days > 45 ? 1 : 0);
+}
 
+      /*  - peculiar value
+        - Just under 80k, amplified if other contracts with same supplier are just under
+      */
+         $heuristics["VALUE_NEAR_THRESHOLD"] = Array(
+	"description" => "unusual value for time of year");
+      /*
+    - unusual variation amount - absolute value; large reductions as well as large increases
+      */
+           $heuristics["VALUE_LARGE_VARIATION"] = Array(
+	"description" => "unusual value for time of year");
+function METADATA_DUPLICATED_DESCRIPTION($cn)
+{
+    	$averageContractPeriod = getAverageContractPeriod();
+	$diff = strtotime($cn['contractStart']) - strtotime($cn['publishDate']);
+	$days = intval($diff / 24);
+	return ($days > 45 ? 1 : 0);
+}
+
+/*   - unusual value for time of year
+        - compare to all other records in last 2 weeks
+        - ie. many large contracts in june so takes more to standout*/
+$heuristics["VALUE_HIGH_FOR_MONTH"] = Array(
+	"description" => "unusual value for time of year"
+);
+function VALUE_HIGH_FOR_MONTH($cn, $monthAsInt)
+{
+	$averageContractPeriod = getAverageContractPeriod();
+	$diff = strtotime($cn['contractStart']) - strtotime($cn['publishDate']);
+	$days = intval($diff / 24);
+	return ($days > 45 ? 1 : 0);
+}
+$monthlyValueAverage = Array();
+function getAgencyTransactions($agencyName)
+{
+	global $agencyTransactions;
+	if (!$agencyTransactions[$agencyName]) {
+		$query = 'select count(*) from contractnotice where agencyName = "' . $agencyName . '"';
+		$result = mysql_query($query);
+		$r = mysql_fetch_array($result, MYSQL_BOTH);
+		$agencyTransactions[$agencyName] = $r[0];
+	}
+	return $agencyTransactions[$agencyName];
+}
+?>

--- /dev/null
+++ b/heuristics/viewHeuristicsColormap.php
@@ -1,1 +1,60 @@
+<?php    
+  include_once("../lib/common.inc.php");
+  echo '<style>
+  div {
+  padding: 5px;
+  display: inline-block;
+  }
+  </style>';
+// http://www.herethere.net/~samson/php/color_gradient/color_gradient_generator.php.txt
+// return the interpolated value between pBegin and pEnd
+function interpolate($pBegin, $pEnd, $pStep, $pMax)
+{
+	if ($pBegin < $pEnd) {
+		return (($pEnd - $pBegin) * ($pStep / $pMax)) + $pBegin;
+	}
+	else {
+		return (($pBegin - $pEnd) * (1 - ($pStep / $pMax))) + $pEnd;
+	}
+}
+function Gradient($HexFrom, $HexTo, $ColorSteps)
+{
+	$theColorBegin = hexdec($HexFrom);
+	$theColorEnd = hexdec($HexTo);
+	$theNumSteps = intval($ColorSteps);
+	$theR0 = ($theColorBegin & 0xff0000) >> 16;
+	$theG0 = ($theColorBegin & 0x00ff00) >> 8;
+	$theB0 = ($theColorBegin & 0x0000ff) >> 0;
+	$theR1 = ($theColorEnd & 0xff0000) >> 16;
+	$theG1 = ($theColorEnd & 0x00ff00) >> 8;
+	$theB1 = ($theColorEnd & 0x0000ff) >> 0;
+	$GradientColors = array();
+	// generate gradient swathe now
+	for ($i = 0; $i <= $theNumSteps; $i++) {
+		$theR = interpolate($theR0, $theR1, $i, $theNumSteps);
+		$theG = interpolate($theG0, $theG1, $i, $theNumSteps);
+		$theB = interpolate($theB0, $theB1, $i, $theNumSteps);
+		$theVal = ((($theR << 8) | $theG) << 8) | $theB;
+		$GradientColors[] = sprintf("%06X", $theVal);
+	}
+	return $GradientColors;
+}
+$Gradients = Gradient("66FF00" , "FF0000" , 10); 
+  
+$query = "select max(sum) from (SELECT sum(heuristic_value) 
+as sum FROM heuristic_results group by CNID) as a";
+$result = mysql_query($query);
+$r = mysql_fetch_array($result, MYSQL_BOTH);
+$maxVal = $r[0];
+  
+$query = "SELECT sum(heuristic_value) as sum, CNID
+FROM `heuristic_results` group by CNID order by sum DESC LIMIT 300";
+$result = mysql_query($query);
+if (!$result) echo mysql_error().$query;
+while ($r = mysql_fetch_array($result, MYSQL_BOTH)) {
+    echo '<div style="background: #'.$Gradients[floor(($r['sum']/$maxVal) * 10)].';">';
+    echo '<a title="'.$r['sum'].'" href="../displayContract.php?CNID='.$r['CNID'].'">X</a>';
+    echo "</div>";
+}
 
+?>

--- /dev/null
+++ b/heuristics/viewHeuristicsDistribution.php
@@ -1,1 +1,82 @@
+<?php    
 
+/*// most interesting
+SELECT sum(heuristic_value) as sum, CNID
+FROM `heuristic_results` group by CNID order by sum DESC limit 30
+
+// spread of values
+select floor(sum) as val,count(*) from (SELECT sum(heuristic_value) 
+as sum FROM heuristic_results group by CNID) as a group by val*/
+
+ /* CAT:Spline chart */ 
+
+ /* pChart library inclusions */ 
+ include("../lib/pChart2.1.0/class/pData.class.php"); 
+ include("../lib/pChart2.1.0/class/pDraw.class.php"); 
+ include("../lib/pChart2.1.0/class/pImage.class.php"); 
+
+$series = Array();
+
+  include_once("../lib/common.inc.php");
+$query = "select heuristic_name, floor(heuristic_value) as val,count(*) from heuristic_results group by heuristic_name, val";
+$result = mysql_query($query);
+if (!$result) echo mysql_error().$query;
+while ($r = mysql_fetch_array($result, MYSQL_BOTH)) {
+    $series[$r["heuristic_name"]][$r["val"]] = $r[2];
+}
+
+ /* Create and populate the pData object */ 
+ $MyData = new pData();
+ $labels = Array();
+ foreach ($series as $value) {
+    $labels = $labels+array_keys($value);
+ }
+ $labels =  Array(0,1,2,3,4,5);
+foreach ($series as $seriesName => $seriesEntry) {
+    $data;
+ foreach ($labels as $label) {
+    $data[$label] = ($seriesEntry[$label] ? $seriesEntry[$label] : 0);
+ }
+  
+$MyData->addPoints($data,$seriesName); 
+ }
+ $MyData->setAxisName(0,"# of records"); 
+ $MyData->addPoints($labels,"Labels"); 
+ $MyData->setSerieDescription("Labels","Bins"); 
+ $MyData->setAbscissa("Labels"); 
+
+ /* Create the pChart object */ 
+ $myPicture = new pImage(700,230,$MyData); 
+
+ /* Turn of Antialiasing */ 
+ $myPicture->Antialias = FALSE; 
+
+ /* Add a border to the picture */ 
+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0)); 
+  
+ /* Write the chart title */  
+ $myPicture->setFontProperties(array("FontName"=>"../lib/pChart2.1.0/fonts/Forgotte.ttf","FontSize"=>11)); 
+ $myPicture->drawText(150,35,"Record distribution",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); 
+
+ /* Set the default font */ 
+ $myPicture->setFontProperties(array("FontName"=>"../lib/pChart2.1.0/fonts/pf_arma_five.ttf","FontSize"=>6)); 
+
+ /* Define the chart area */ 
+ $myPicture->setGraphArea(60,40,650,200); 
+
+ /* Draw the scale */ 
+ $scaleSettings = array("XMargin"=>10,"YMargin"=>0,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
+ $myPicture->drawScale($scaleSettings); 
+
+ /* Turn on Antialiasing */ 
+ $myPicture->Antialias = TRUE; 
+
+ /* Draw the line chart */ 
+ $myPicture->drawSplineChart(); 
+
+ /* Write the chart legend */ 
+ $myPicture->drawLegend(540,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_VERTICAL)); 
+
+ /* Render the picture (choose the best way) */ 
+ $myPicture->autoOutput("pictures/example.drawSplineChart.simple.png"); 
+?>

--- /dev/null
+++ b/lib/pChart2.1.0/GPLv3.txt
@@ -1,1 +1,676 @@
+                    GNU GENERAL PUBLIC LICENSE

+                       Version 3, 29 June 2007

+

+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>

+ Everyone is permitted to copy and distribute verbatim copies

+ of this license document, but changing it is not allowed.

+

+                            Preamble

+

+  The GNU General Public License is a free, copyleft license for

+software and other kinds of works.

+

+  The licenses for most software and other practical works are designed

+to take away your freedom to share and change the works.  By contrast,

+the GNU General Public License is intended to guarantee your freedom to

+share and change all versions of a program--to make sure it remains free

+software for all its users.  We, the Free Software Foundation, use the

+GNU General Public License for most of our software; it applies also to

+any other work released this way by its authors.  You can apply it to

+your programs, too.

+

+  When we speak of free software, we are referring to freedom, not

+price.  Our General Public Licenses are designed to make sure that you

+have the freedom to distribute copies of free software (and charge for

+them if you wish), that you receive source code or can get it if you

+want it, that you can change the software or use pieces of it in new

+free programs, and that you know you can do these things.

+

+  To protect your rights, we need to prevent others from denying you

+these rights or asking you to surrender the rights.  Therefore, you have

+certain responsibilities if you distribute copies of the software, or if

+you modify it: responsibilities to respect the freedom of others.

+

+  For example, if you distribute copies of such a program, whether

+gratis or for a fee, you must pass on to the recipients the same

+freedoms that you received.  You must make sure that they, too, receive

+or can get the source code.  And you must show them these terms so they

+know their rights.

+

+  Developers that use the GNU GPL protect your rights with two steps:

+(1) assert copyright on the software, and (2) offer you this License

+giving you legal permission to copy, distribute and/or modify it.

+

+  For the developers' and authors' protection, the GPL clearly explains

+that there is no warranty for this free software.  For both users' and

+authors' sake, the GPL requires that modified versions be marked as

+changed, so that their problems will not be attributed erroneously to

+authors of previous versions.

+

+  Some devices are designed to deny users access to install or run

+modified versions of the software inside them, although the manufacturer

+can do so.  This is fundamentally incompatible with the aim of

+protecting users' freedom to change the software.  The systematic

+pattern of such abuse occurs in the area of products for individuals to

+use, which is precisely where it is most unacceptable.  Therefore, we

+have designed this version of the GPL to prohibit the practice for those

+products.  If such problems arise substantially in other domains, we

+stand ready to extend this provision to those domains in future versions

+of the GPL, as needed to protect the freedom of users.

+

+  Finally, every program is threatened constantly by software patents.

+States should not allow patents to restrict development and use of

+software on general-purpose computers, but in those that do, we wish to

+avoid the special danger that patents applied to a free program could

+make it effectively proprietary.  To prevent this, the GPL assures that

+patents cannot be used to render the program non-free.

+

+  The precise terms and conditions for copying, distribution and

+modification follow.

+

+                       TERMS AND CONDITIONS

+

+  0. Definitions.

+

+  "This License" refers to version 3 of the GNU General Public License.

+

+  "Copyright" also means copyright-like laws that apply to other kinds of

+works, such as semiconductor masks.

+

+  "The Program" refers to any copyrightable work licensed under this

+License.  Each licensee is addressed as "you".  "Licensees" and

+"recipients" may be individuals or organizations.

+

+  To "modify" a work means to copy from or adapt all or part of the work

+in a fashion requiring copyright permission, other than the making of an

+exact copy.  The resulting work is called a "modified version" of the

+earlier work or a work "based on" the earlier work.

+

+  A "covered work" means either the unmodified Program or a work based

+on the Program.

+

+  To "propagate" a work means to do anything with it that, without

+permission, would make you directly or secondarily liable for

+infringement under applicable copyright law, except executing it on a

+computer or modifying a private copy.  Propagation includes copying,

+distribution (with or without modification), making available to the

+public, and in some countries other activities as well.

+

+  To "convey" a work means any kind of propagation that enables other

+parties to make or receive copies.  Mere interaction with a user through

+a computer network, with no transfer of a copy, is not conveying.

+

+  An interactive user interface displays "Appropriate Legal Notices"

+to the extent that it includes a convenient and prominently visible

+feature that (1) displays an appropriate copyright notice, and (2)

+tells the user that there is no warranty for the work (except to the

+extent that warranties are provided), that licensees may convey the

+work under this License, and how to view a copy of this License.  If

+the interface presents a list of user commands or options, such as a

+menu, a prominent item in the list meets this criterion.

+

+  1. Source Code.

+

+  The "source code" for a work means the preferred form of the work

+for making modifications to it.  "Object code" means any non-source

+form of a work.

+

+  A "Standard Interface" means an interface that either is an official

+standard defined by a recognized standards body, or, in the case of

+interfaces specified for a particular programming language, one that

+is widely used among developers working in that language.

+

+  The "System Libraries" of an executable work include anything, other

+than the work as a whole, that (a) is included in the normal form of

+packaging a Major Component, but which is not part of that Major

+Component, and (b) serves only to enable use of the work with that

+Major Component, or to implement a Standard Interface for which an

+implementation is available to the public in source code form.  A

+"Major Component", in this context, means a major essential component

+(kernel, window system, and so on) of the specific operating system

+(if any) on which the executable work runs, or a compiler used to

+produce the work, or an object code interpreter used to run it.

+

+  The "Corresponding Source" for a work in object code form means all

+the source code needed to generate, install, and (for an executable

+work) run the object code and to modify the work, including scripts to

+control those activities.  However, it does not include the work's

+System Libraries, or general-purpose tools or generally available free

+programs which are used unmodified in performing those activities but

+which are not part of the work.  For example, Corresponding Source

+includes interface definition files associated with source files for

+the work, and the source code for shared libraries and dynamically

+linked subprograms that the work is specifically designed to require,

+such as by intimate data communication or control flow between those

+subprograms and other parts of the work.

+

+  The Corresponding Source need not include anything that users

+can regenerate automatically from other parts of the Corresponding

+Source.

+

+  The Corresponding Source for a work in source code form is that

+same work.

+

+  2. Basic Permissions.

+

+  All rights granted under this License are granted for the term of

+copyright on the Program, and are irrevocable provided the stated

+conditions are met.  This License explicitly affirms your unlimited

+permission to run the unmodified Program.  The output from running a

+covered work is covered by this License only if the output, given its

+content, constitutes a covered work.  This License acknowledges your

+rights of fair use or other equivalent, as provided by copyright law.

+

+  You may make, run and propagate covered works that you do not

+convey, without conditions so long as your license otherwise remains

+in force.  You may convey covered works to others for the sole purpose

+of having them make modifications exclusively for you, or provide you

+with facilities for running those works, provided that you comply with

+the terms of this License in conveying all material for which you do

+not control copyright.  Those thus making or running the covered works

+for you must do so exclusively on your behalf, under your direction

+and control, on terms that prohibit them from making any copies of

+your copyrighted material outside their relationship with you.

+

+  Conveying under any other circumstances is permitted solely under

+the conditions stated below.  Sublicensing is not allowed; section 10

+makes it unnecessary.

+

+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

+

+  No covered work shall be deemed part of an effective technological

+measure under any applicable law fulfilling obligations under article

+11 of the WIPO copyright treaty adopted on 20 December 1996, or

+similar laws prohibiting or restricting circumvention of such

+measures.

+

+  When you convey a covered work, you waive any legal power to forbid

+circumvention of technological measures to the extent such circumvention

+is effected by exercising rights under this License with respect to

+the covered work, and you disclaim any intention to limit operation or

+modification of the work as a means of enforcing, against the work's

+users, your or third parties' legal rights to forbid circumvention of

+technological measures.

+

+  4. Conveying Verbatim Copies.

+

+  You may convey verbatim copies of the Program's source code as you

+receive it, in any medium, provided that you conspicuously and

+appropriately publish on each copy an appropriate copyright notice;

+keep intact all notices stating that this License and any

+non-permissive terms added in accord with section 7 apply to the code;

+keep intact all notices of the absence of any warranty; and give all

+recipients a copy of this License along with the Program.

+

+  You may charge any price or no price for each copy that you convey,

+and you may offer support or warranty protection for a fee.

+

+  5. Conveying Modified Source Versions.

+

+  You may convey a work based on the Program, or the modifications to

+produce it from the Program, in the form of source code under the

+terms of section 4, provided that you also meet all of these conditions:

+

+    a) The work must carry prominent notices stating that you modified

+    it, and giving a relevant date.

+

+    b) The work must carry prominent notices stating that it is

+    released under this License and any conditions added under section

+    7.  This requirement modifies the requirement in section 4 to

+    "keep intact all notices".

+

+    c) You must license the entire work, as a whole, under this

+    License to anyone who comes into possession of a copy.  This

+    License will therefore apply, along with any applicable section 7

+    additional terms, to the whole of the work, and all its parts,

+    regardless of how they are packaged.  This License gives no

+    permission to license the work in any other way, but it does not

+    invalidate such permission if you have separately received it.

+

+    d) If the work has interactive user interfaces, each must display

+    Appropriate Legal Notices; however, if the Program has interactive

+    interfaces that do not display Appropriate Legal Notices, your

+    work need not make them do so.

+

+  A compilation of a covered work with other separate and independent

+works, which are not by their nature extensions of the covered work,

+and which are not combined with it such as to form a larger program,

+in or on a volume of a storage or distribution medium, is called an

+"aggregate" if the compilation and its resulting copyright are not

+used to limit the access or legal rights of the compilation's users

+beyond what the individual works permit.  Inclusion of a covered work

+in an aggregate does not cause this License to apply to the other

+parts of the aggregate.

+

+  6. Conveying Non-Source Forms.

+

+  You may convey a covered work in object code form under the terms

+of sections 4 and 5, provided that you also convey the

+machine-readable Corresponding Source under the terms of this License,

+in one of these ways:

+

+    a) Convey the object code in, or embodied in, a physical product

+    (including a physical distribution medium), accompanied by the

+    Corresponding Source fixed on a durable physical medium

+    customarily used for software interchange.

+

+    b) Convey the object code in, or embodied in, a physical product

+    (including a physical distribution medium), accompanied by a

+    written offer, valid for at least three years and valid for as

+    long as you offer spare parts or customer support for that product

+    model, to give anyone who possesses the object code either (1) a

+    copy of the Corresponding Source for all the software in the

+    product that is covered by this License, on a durable physical

+    medium customarily used for software interchange, for a price no

+    more than your reasonable cost of physically performing this

+    conveying of source, or (2) access to copy the

+    Corresponding Source from a network server at no charge.

+

+    c) Convey individual copies of the object code with a copy of the

+    written offer to provide the Corresponding Source.  This

+    alternative is allowed only occasionally and noncommercially, and

+    only if you received the object code with such an offer, in accord

+    with subsection 6b.

+

+    d) Convey the object code by offering access from a designated

+    place (gratis or for a charge), and offer equivalent access to the

+    Corresponding Source in the same way through the same place at no

+    further charge.  You need not require recipients to copy the

+    Corresponding Source along with the object code.  If the place to

+    copy the object code is a network server, the Corresponding Source

+    may be on a different server (operated by you or a third party)

+    that supports equivalent copying facilities, provided you maintain

+    clear directions next to the object code saying where to find the

+    Corresponding Source.  Regardless of what server hosts the

+    Corresponding Source, you remain obligated to ensure that it is

+    available for as long as needed to satisfy these requirements.

+

+    e) Convey the object code using peer-to-peer transmission, provided

+    you inform other peers where the object code and Corresponding

+    Source of the work are being offered to the general public at no

+    charge under subsection 6d.

+

+  A separable portion of the object code, whose source code is excluded

+from the Corresponding Source as a System Library, need not be

+included in conveying the object code work.

+

+  A "User Product" is either (1) a "consumer product", which means any

+tangible personal property which is normally used for personal, family,

+or household purposes, or (2) anything designed or sold for incorporation

+into a dwelling.  In determining whether a product is a consumer product,

+doubtful cases shall be resolved in favor of coverage.  For a particular

+product received by a particular user, "normally used" refers to a

+typical or common use of that class of product, regardless of the status

+of the particular user or of the way in which the particular user

+actually uses, or expects or is expected to use, the product.  A product

+is a consumer product regardless of whether the product has substantial

+commercial, industrial or non-consumer uses, unless such uses represent

+the only significant mode of use of the product.

+

+  "Installation Information" for a User Product means any methods,

+procedures, authorization keys, or other information required to install

+and execute modified versions of a covered work in that User Product from

+a modified version of its Corresponding Source.  The information must

+suffice to ensure that the continued functioning of the modified object

+code is in no case prevented or interfered with solely because

+modification has been made.

+

+  If you convey an object code work under this section in, or with, or

+specifically for use in, a User Product, and the conveying occurs as

+part of a transaction in which the right of possession and use of the

+User Product is transferred to the recipient in perpetuity or for a

+fixed term (regardless of how the transaction is characterized), the

+Corresponding Source conveyed under this section must be accompanied

+by the Installation Information.  But this requirement does not apply

+if neither you nor any third party retains the ability to install

+modified object code on the User Product (for example, the work has

+been installed in ROM).

+

+  The requirement to provide Installation Information does not include a

+requirement to continue to provide support service, warranty, or updates

+for a work that has been modified or installed by the recipient, or for

+the User Product in which it has been modified or installed.  Access to a

+network may be denied when the modification itself materially and

+adversely affects the operation of the network or violates the rules and

+protocols for communication across the network.

+

+  Corresponding Source conveyed, and Installation Information provided,

+in accord with this section must be in a format that is publicly

+documented (and with an implementation available to the public in

+source code form), and must require no special password or key for

+unpacking, reading or copying.

+

+  7. Additional Terms.

+

+  "Additional permissions" are terms that supplement the terms of this

+License by making exceptions from one or more of its conditions.

+Additional permissions that are applicable to the entire Program shall

+be treated as though they were included in this License, to the extent

+that they are valid under applicable law.  If additional permissions

+apply only to part of the Program, that part may be used separately

+under those permissions, but the entire Program remains governed by

+this License without regard to the additional permissions.

+

+  When you convey a copy of a covered work, you may at your option

+remove any additional permissions from that copy, or from any part of

+it.  (Additional permissions may be written to require their own

+removal in certain cases when you modify the work.)  You may place

+additional permissions on material, added by you to a covered work,

+for which you have or can give appropriate copyright permission.

+

+  Notwithstanding any other provision of this License, for material you

+add to a covered work, you may (if authorized by the copyright holders of

+that material) supplement the terms of this License with terms:

+

+    a) Disclaiming warranty or limiting liability differently from the

+    terms of sections 15 and 16 of this License; or

+

+    b) Requiring preservation of specified reasonable legal notices or

+    author attributions in that material or in the Appropriate Legal

+    Notices displayed by works containing it; or

+

+    c) Prohibiting misrepresentation of the origin of that material, or

+    requiring that modified versions of such material be marked in

+    reasonable ways as different from the original version; or

+

+    d) Limiting the use for publicity purposes of names of licensors or

+    authors of the material; or

+

+    e) Declining to grant rights under trademark law for use of some

+    trade names, trademarks, or service marks; or

+

+    f) Requiring indemnification of licensors and authors of that

+    material by anyone who conveys the material (or modified versions of

+    it) with contractual assumptions of liability to the recipient, for

+    any liability that these contractual assumptions directly impose on

+    those licensors and authors.

+

+  All other non-permissive additional terms are considered "further

+restrictions" within the meaning of section 10.  If the Program as you

+received it, or any part of it, contains a notice stating that it is

+governed by this License along with a term that is a further

+restriction, you may remove that term.  If a license document contains

+a further restriction but permits relicensing or conveying under this

+License, you may add to a covered work material governed by the terms

+of that license document, provided that the further restriction does

+not survive such relicensing or conveying.

+

+  If you add terms to a covered work in accord with this section, you

+must place, in the relevant source files, a statement of the

+additional terms that apply to those files, or a notice indicating

+where to find the applicable terms.

+

+  Additional terms, permissive or non-permissive, may be stated in the

+form of a separately written license, or stated as exceptions;

+the above requirements apply either way.

+

+  8. Termination.

+

+  You may not propagate or modify a covered work except as expressly

+provided under this License.  Any attempt otherwise to propagate or

+modify it is void, and will automatically terminate your rights under

+this License (including any patent licenses granted under the third

+paragraph of section 11).

+

+  However, if you cease all violation of this License, then your

+license from a particular copyright holder is reinstated (a)

+provisionally, unless and until the copyright holder explicitly and

+finally terminates your license, and (b) permanently, if the copyright

+holder fails to notify you of the violation by some reasonable means

+prior to 60 days after the cessation.

+

+  Moreover, your license from a particular copyright holder is

+reinstated permanently if the copyright holder notifies you of the

+violation by some reasonable means, this is the first time you have

+received notice of violation of this License (for any work) from that

+copyright holder, and you cure the violation prior to 30 days after

+your receipt of the notice.

+

+  Termination of your rights under this section does not terminate the

+licenses of parties who have received copies or rights from you under

+this License.  If your rights have been terminated and not permanently

+reinstated, you do not qualify to receive new licenses for the same

+material under section 10.

+

+  9. Acceptance Not Required for Having Copies.

+

+  You are not required to accept this License in order to receive or

+run a copy of the Program.  Ancillary propagation of a covered work

+occurring solely as a consequence of using peer-to-peer transmission

+to receive a copy likewise does not require acceptance.  However,

+nothing other than this License grants you permission to propagate or

+modify any covered work.  These actions infringe copyright if you do

+not accept this License.  Therefore, by modifying or propagating a

+covered work, you indicate your acceptance of this License to do so.

+

+  10. Automatic Licensing of Downstream Recipients.

+

+  Each time you convey a covered work, the recipient automatically

+receives a license from the original licensors, to run, modify and

+propagate that work, subject to this License.  You are not responsible

+for enforcing compliance by third parties with this License.

+

+  An "entity transaction" is a transaction transferring control of an

+organization, or substantially all assets of one, or subdividing an

+organization, or merging organizations.  If propagation of a covered

+work results from an entity transaction, each party to that

+transaction who receives a copy of the work also receives whatever

+licenses to the work the party's predecessor in interest had or could

+give under the previous paragraph, plus a right to possession of the

+Corresponding Source of the work from the predecessor in interest, if

+the predecessor has it or can get it with reasonable efforts.

+

+  You may not impose any further restrictions on the exercise of the

+rights granted or affirmed under this License.  For example, you may

+not impose a license fee, royalty, or other charge for exercise of

+rights granted under this License, and you may not initiate litigation

+(including a cross-claim or counterclaim in a lawsuit) alleging that

+any patent claim is infringed by making, using, selling, offering for

+sale, or importing the Program or any portion of it.

+

+  11. Patents.

+

+  A "contributor" is a copyright holder who authorizes use under this

+License of the Program or a work on which the Program is based.  The

+work thus licensed is called the contributor's "contributor version".

+

+  A contributor's "essential patent claims" are all patent claims

+owned or controlled by the contributor, whether already acquired or

+hereafter acquired, that would be infringed by some manner, permitted

+by this License, of making, using, or selling its contributor version,

+but do not include claims that would be infringed only as a

+consequence of further modification of the contributor version.  For

+purposes of this definition, "control" includes the right to grant

+patent sublicenses in a manner consistent with the requirements of

+this License.

+

+  Each contributor grants you a non-exclusive, worldwide, royalty-free

+patent license under the contributor's essential patent claims, to

+make, use, sell, offer for sale, import and otherwise run, modify and

+propagate the contents of its contributor version.

+

+  In the following three paragraphs, a "patent license" is any express

+agreement or commitment, however denominated, not to enforce a patent

+(such as an express permission to practice a patent or covenant not to

+sue for patent infringement).  To "grant" such a patent license to a

+party means to make such an agreement or commitment not to enforce a

+patent against the party.

+

+  If you convey a covered work, knowingly relying on a patent license,

+and the Corresponding Source of the work is not available for anyone

+to copy, free of charge and under the terms of this License, through a

+publicly available network server or other readily accessible means,

+then you must either (1) cause the Corresponding Source to be so

+available, or (2) arrange to deprive yourself of the benefit of the

+patent license for this particular work, or (3) arrange, in a manner

+consistent with the requirements of this License, to extend the patent

+license to downstream recipients.  "Knowingly relying" means you have

+actual knowledge that, but for the patent license, your conveying the

+covered work in a country, or your recipient's use of the covered work

+in a country, would infringe one or more identifiable patents in that

+country that you have reason to believe are valid.

+

+  If, pursuant to or in connection with a single transaction or

+arrangement, you convey, or propagate by procuring conveyance of, a

+covered work, and grant a patent license to some of the parties

+receiving the covered work authorizing them to use, propagate, modify

+or convey a specific copy of the covered work, then the patent license

+you grant is automatically extended to all recipients of the covered

+work and works based on it.

+

+  A patent license is "discriminatory" if it does not include within

+the scope of its coverage, prohibits the exercise of, or is

+conditioned on the non-exercise of one or more of the rights that are

+specifically granted under this License.  You may not convey a covered

+work if you are a party to an arrangement with a third party that is

+in the business of distributing software, under which you make payment

+to the third party based on the extent of your activity of conveying

+the work, and under which the third party grants, to any of the

+parties who would receive the covered work from you, a discriminatory

+patent license (a) in connection with copies of the covered work

+conveyed by you (or copies made from those copies), or (b) primarily

+for and in connection with specific products or compilations that

+contain the covered work, unless you entered into that arrangement,

+or that patent license was granted, prior to 28 March 2007.

+

+  Nothing in this License shall be construed as excluding or limiting

+any implied license or other defenses to infringement that may

+otherwise be available to you under applicable patent law.

+

+  12. No Surrender of Others' Freedom.

+

+  If conditions are imposed on you (whether by court order, agreement or

+otherwise) that contradict the conditions of this License, they do not

+excuse you from the conditions of this License.  If you cannot convey a

+covered work so as to satisfy simultaneously your obligations under this

+License and any other pertinent obligations, then as a consequence you may

+not convey it at all.  For example, if you agree to terms that obligate you

+to collect a royalty for further conveying from those to whom you convey

+the Program, the only way you could satisfy both those terms and this

+License would be to refrain entirely from conveying the Program.

+

+  13. Use with the GNU Affero General Public License.

+

+  Notwithstanding any other provision of this License, you have

+permission to link or combine any covered work with a work licensed

+under version 3 of the GNU Affero General Public License into a single

+combined work, and to convey the resulting work.  The terms of this

+License will continue to apply to the part which is the covered work,

+but the special requirements of the GNU Affero General Public License,

+section 13, concerning interaction through a network will apply to the

+combination as such.

+

+  14. Revised Versions of this License.

+

+  The Free Software Foundation may publish revised and/or new versions of

+the GNU General Public License from time to time.  Such new versions will

+be similar in spirit to the present version, but may differ in detail to

+address new problems or concerns.

+

+  Each version is given a distinguishing version number.  If the

+Program specifies that a certain numbered version of the GNU General

+Public License "or any later version" applies to it, you have the

+option of following the terms and conditions either of that numbered

+version or of any later version published by the Free Software

+Foundation.  If the Program does not specify a version number of the

+GNU General Public License, you may choose any version ever published

+by the Free Software Foundation.

+

+  If the Program specifies that a proxy can decide which future

+versions of the GNU General Public License can be used, that proxy's

+public statement of acceptance of a version permanently authorizes you

+to choose that version for the Program.

+

+  Later license versions may give you additional or different

+permissions.  However, no additional obligations are imposed on any

+author or copyright holder as a result of your choosing to follow a

+later version.

+

+  15. Disclaimer of Warranty.

+

+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY

+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT

+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY

+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,

+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR

+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM

+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF

+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

+

+  16. Limitation of Liability.

+

+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING

+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS

+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY

+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE

+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF

+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD

+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),

+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF

+SUCH DAMAGES.

+

+  17. Interpretation of Sections 15 and 16.

+

+  If the disclaimer of warranty and limitation of liability provided

+above cannot be given local legal effect according to their terms,

+reviewing courts shall apply local law that most closely approximates

+an absolute waiver of all civil liability in connection with the

+Program, unless a warranty or assumption of liability accompanies a

+copy of the Program in return for a fee.

+

+                     END OF TERMS AND CONDITIONS

+

+            How to Apply These Terms to Your New Programs

+

+  If you develop a new program, and you want it to be of the greatest

+possible use to the public, the best way to achieve this is to make it

+free software which everyone can redistribute and change under these terms.

+

+  To do so, attach the following notices to the program.  It is safest

+to attach them to the start of each source file to most effectively

+state the exclusion of warranty; and each file should have at least

+the "copyright" line and a pointer to where the full notice is found.

+

+    <one line to give the program's name and a brief idea of what it does.>

+    Copyright (C) <year>  <name of author>

+

+    This program is free software: you can redistribute it and/or modify

+    it under the terms of the GNU General Public License as published by

+    the Free Software Foundation, either version 3 of the License, or

+    (at your option) any later version.

+

+    This program is distributed in the hope that it will be useful,

+    but WITHOUT ANY WARRANTY; without even the implied warranty of

+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

+    GNU General Public License for more details.

+

+    You should have received a copy of the GNU General Public License

+    along with this program.  If not, see <http://www.gnu.org/licenses/>.

+

+Also add information on how to contact you by electronic and paper mail.

+

+  If the program does terminal interaction, make it output a short

+notice like this when it starts in an interactive mode:

+

+    <program>  Copyright (C) <year>  <name of author>

+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.

+    This is free software, and you are welcome to redistribute it

+    under certain conditions; type `show c' for details.

+

+The hypothetical commands `show w' and `show c' should show the appropriate

+parts of the General Public License.  Of course, your program's commands

+might be different; for a GUI interface, you would use an "about box".

+

+  You should also get your employer (if you work as a programmer) or school,

+if any, to sign a "copyright disclaimer" for the program, if necessary.

+For more information on this, and how to apply and follow the GNU GPL, see

+<http://www.gnu.org/licenses/>.

+

+  The GNU General Public License does not permit incorporating your program

+into proprietary programs.  If your program is a subroutine library, you

+may consider it more useful to permit linking proprietary applications with

+the library.  If this is what you want to do, use the GNU Lesser General

+Public License instead of this License.  But first, please read

+<http://www.gnu.org/philosophy/why-not-lgpl.html>.

+

 

 Binary files /dev/null and b/lib/pChart2.1.0/change.log differ
--- /dev/null
+++ b/lib/pChart2.1.0/class/pBarcode128.class.php
@@ -1,1 +1,184 @@
-
+<?php

+ /*

+     pBarcode128 - class to create barcodes (128B)

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ /* pData class definition */

+ class pBarcode128

+  {

+   var $Codes;

+   var $Reverse;

+   var $Result;

+   var $pChartObject;

+   var $CRC;

+

+   /* Class creator */

+   function pBarcode128($BasePath="")

+    {

+     $this->Codes   = "";

+     $this->Reverse = "";

+

+     $FileHandle = @fopen($BasePath."data/128B.db", "r");

+

+     if (!$FileHandle) { die("Cannot find barcode database (".$BasePath."128B.db)."); }

+

+     while (!feof($FileHandle))

+      {

+       $Buffer = fgets($FileHandle,4096);

+       $Buffer = str_replace(chr(10),"",$Buffer);

+       $Buffer = str_replace(chr(13),"",$Buffer);

+       $Values = preg_split("/;/",$Buffer);

+

+       $this->Codes[$Values[1]]["ID"]     = $Values[0];

+       $this->Codes[$Values[1]]["Code"]   = $Values[2];

+       $this->Reverse[$Values[0]]["Code"] = $Values[2];

+       $this->Reverse[$Values[0]]["Asc"]  = $Values[1];

+      }

+     fclose($FileHandle);

+    }

+

+   /* Return the projected size of a barcode */

+   function getSize($TextString,$Format="")

+    {

+     $Angle		= isset($Format["Angle"]) ? $Format["Angle"] : 0;

+     $ShowLegend	= isset($Format["ShowLegend"]) ? $Format["ShowLegend"] : FALSE;

+     $LegendOffset	= isset($Format["LegendOffset"]) ? $Format["LegendOffset"] : 5;

+     $DrawArea		= isset($Format["DrawArea"]) ? $Format["DrawArea"] : FALSE;

+     $FontSize		= isset($Format["FontSize"]) ? $Format["FontSize"] : 12;

+     $Height		= isset($Format["Height"]) ? $Format["Height"] : 30;

+

+     $TextString    = $this->encode128($TextString);

+     $BarcodeLength = strlen($this->Result);

+

+     if ( $DrawArea )   { $WOffset = 20; } else { $WOffset = 0; }

+     if ( $ShowLegend ) { $HOffset = $FontSize+$LegendOffset+$WOffset; } else { $HOffset = 0; }

+

+     $X1 = cos($Angle * PI / 180) * ($WOffset+$BarcodeLength);

+     $Y1 = sin($Angle * PI / 180) * ($WOffset+$BarcodeLength);

+

+     $X2 = $X1 + cos(($Angle+90) * PI / 180) * ($HOffset+$Height);

+     $Y2 = $Y1 + sin(($Angle+90) * PI / 180) * ($HOffset+$Height);

+

+

+     $AreaWidth  = max(abs($X1),abs($X2));

+     $AreaHeight = max(abs($Y1),abs($Y2));

+

+     return(array("Width"=>$AreaWidth,"Height"=>$AreaHeight));

+    }

+

+   function encode128($Value,$Format="")

+    {

+     $this->Result  = "11010010000";

+     $this->CRC     = 104;

+     $TextString    = "";

+

+     for($i=1;$i<=strlen($Value);$i++)

+      {

+       $CharCode = ord($this->mid($Value,$i,1));

+       if ( isset($this->Codes[$CharCode]) )

+        {

+         $this->Result = $this->Result.$this->Codes[$CharCode]["Code"];

+         $this->CRC = $this->CRC + $i*$this->Codes[$CharCode]["ID"];

+         $TextString = $TextString.chr($CharCode);

+        }

+      }

+     $this->CRC = $this->CRC - floor($this->CRC/103)*103;

+

+     $this->Result = $this->Result.$this->Reverse[$this->CRC]["Code"];

+     $this->Result = $this->Result."1100011101011";

+

+     return($TextString);

+    }

+

+   /* Create the encoded string */

+   function draw($Object,$Value,$X,$Y,$Format="")

+    {

+     $this->pChartObject = $Object;

+

+     $R			= isset($Format["R"]) ? $Format["R"] : 0;

+     $G			= isset($Format["G"]) ? $Format["G"] : 0;

+     $B			= isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha		= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $Height		= isset($Format["Height"]) ? $Format["Height"] : 30;

+     $Angle		= isset($Format["Angle"]) ? $Format["Angle"] : 0;

+     $ShowLegend	= isset($Format["ShowLegend"]) ? $Format["ShowLegend"] : FALSE;

+     $LegendOffset	= isset($Format["LegendOffset"]) ? $Format["LegendOffset"] : 5;

+     $DrawArea		= isset($Format["DrawArea"]) ? $Format["DrawArea"] : FALSE;

+     $AreaR		= isset($Format["AreaR"]) ? $Format["AreaR"] : 255;

+     $AreaG		= isset($Format["AreaG"]) ? $Format["AreaG"] : 255;

+     $AreaB		= isset($Format["AreaB"]) ? $Format["AreaB"] : 255;

+     $AreaBorderR	= isset($Format["AreaBorderR"]) ? $Format["AreaBorderR"] : $AreaR;

+     $AreaBorderG	= isset($Format["AreaBorderG"]) ? $Format["AreaBorderG"] : $AreaG;

+     $AreaBorderB	= isset($Format["AreaBorderB"]) ? $Format["AreaBorderB"] : $AreaB;

+

+     $TextString = $this->encode128($Value);

+

+     if ( $DrawArea )

+      {

+       $X1 = $X + cos(($Angle-135) * PI / 180) * 10;

+       $Y1 = $Y + sin(($Angle-135) * PI / 180) * 10;

+

+       $X2 = $X1 + cos($Angle * PI / 180) * (strlen($this->Result)+20);

+       $Y2 = $Y1 + sin($Angle * PI / 180) * (strlen($this->Result)+20);

+

+       if ( $ShowLegend )

+        {

+         $X3 = $X2 + cos(($Angle+90) * PI / 180) * ($Height+$LegendOffset+$this->pChartObject->FontSize+10);

+         $Y3 = $Y2 + sin(($Angle+90) * PI / 180) * ($Height+$LegendOffset+$this->pChartObject->FontSize+10);

+        }

+       else

+        {

+         $X3 = $X2 + cos(($Angle+90) * PI / 180) * ($Height+20);

+         $Y3 = $Y2 + sin(($Angle+90) * PI / 180) * ($Height+20);

+        }

+

+       $X4 = $X3 + cos(($Angle+180) * PI / 180) * (strlen($this->Result)+20);

+       $Y4 = $Y3 + sin(($Angle+180) * PI / 180) * (strlen($this->Result)+20);

+

+       $Polygon  = array($X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4);

+       $Settings = array("R"=>$AreaR,"G"=>$AreaG,"B"=>$AreaB,"BorderR"=>$AreaBorderR,"BorderG"=>$AreaBorderG,"BorderB"=>$AreaBorderB);

+       $this->pChartObject->drawPolygon($Polygon,$Settings);

+      }

+

+     for($i=1;$i<=strlen($this->Result);$i++)

+      {

+       if ( $this->mid($this->Result,$i,1) == 1 )

+        {

+         $X1 = $X + cos($Angle * PI / 180) * $i;

+         $Y1 = $Y + sin($Angle * PI / 180) * $i;

+         $X2 = $X1 + cos(($Angle+90) * PI / 180) * $Height;

+         $Y2 = $Y1 + sin(($Angle+90) * PI / 180) * $Height;

+

+         $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);

+         $this->pChartObject->drawLine($X1,$Y1,$X2,$Y2,$Settings);

+        }

+      }

+

+     if ( $ShowLegend )

+      {

+       $X1 = $X + cos($Angle * PI / 180) * (strlen($this->Result)/2);

+       $Y1 = $Y + sin($Angle * PI / 180) * (strlen($this->Result)/2);

+

+       $LegendX = $X1 + cos(($Angle+90) * PI / 180) * ($Height+$LegendOffset);

+       $LegendY = $Y1 + sin(($Angle+90) * PI / 180) * ($Height+$LegendOffset);

+

+       $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Angle"=>-$Angle,"Align"=>TEXT_ALIGN_TOPMIDDLE);

+       $this->pChartObject->drawText($LegendX,$LegendY,$TextString,$Settings);

+      }

+    }

+

+   function left($value,$NbChar) { return substr($value,0,$NbChar); }  

+   function right($value,$NbChar) { return substr($value,strlen($value)-$NbChar,$NbChar); }  

+   function mid($value,$Depart,$NbChar) { return substr($value,$Depart-1,$NbChar); }  

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/class/pBarcode39.class.php
@@ -1,1 +1,200 @@
-
+<?php

+ /*

+     pBarcode39 - class to create barcodes (39B)

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ /* pData class definition */

+ class pBarcode39

+  {

+   var $Codes;

+   var $Reverse;

+   var $Result;

+   var $pChartObject;

+   var $CRC;

+   var $MOD43;

+

+   /* Class creator */

+   function pBarcode39($BasePath="",$EnableMOD43=FALSE)

+    {

+     $this->MOD43  = $EnableMOD43;

+     $this->Codes   = "";

+     $this->Reverse = "";

+

+     $FileHandle = @fopen($BasePath."data/39.db", "r");

+

+     if (!$FileHandle) { die("Cannot find barcode database (".$BasePath."data/39.db)."); }

+

+     while (!feof($FileHandle))

+      {

+       $Buffer = fgets($FileHandle,4096);

+       $Buffer = str_replace(chr(10),"",$Buffer);

+       $Buffer = str_replace(chr(13),"",$Buffer);

+       $Values = preg_split("/;/",$Buffer);

+

+       $this->Codes[$Values[0]] = $Values[1];

+      }

+     fclose($FileHandle);

+    }

+

+   /* Return the projected size of a barcode */

+   function getSize($TextString,$Format="")

+    {

+     $Angle		= isset($Format["Angle"]) ? $Format["Angle"] : 0;

+     $ShowLegend	= isset($Format["ShowLegend"]) ? $Format["ShowLegend"] : FALSE;

+     $LegendOffset	= isset($Format["LegendOffset"]) ? $Format["LegendOffset"] : 5;

+     $DrawArea		= isset($Format["DrawArea"]) ? $Format["DrawArea"] : FALSE;

+     $FontSize		= isset($Format["FontSize"]) ? $Format["FontSize"] : 12;

+     $Height		= isset($Format["Height"]) ? $Format["Height"] : 30;

+

+     $TextString    = $this->encode39($TextString);

+     $BarcodeLength = strlen($this->Result);

+

+     if ( $DrawArea )   { $WOffset = 20; } else { $WOffset = 0; }

+     if ( $ShowLegend ) { $HOffset = $FontSize+$LegendOffset+$WOffset; } else { $HOffset = 0; }

+

+     $X1 = cos($Angle * PI / 180) * ($WOffset+$BarcodeLength);

+     $Y1 = sin($Angle * PI / 180) * ($WOffset+$BarcodeLength);

+

+     $X2 = $X1 + cos(($Angle+90) * PI / 180) * ($HOffset+$Height);

+     $Y2 = $Y1 + sin(($Angle+90) * PI / 180) * ($HOffset+$Height);

+

+

+     $AreaWidth  = max(abs($X1),abs($X2));

+     $AreaHeight = max(abs($Y1),abs($Y2));

+

+     return(array("Width"=>$AreaWidth,"Height"=>$AreaHeight));

+    }

+

+   /* Create the encoded string */

+   function encode39($Value)

+    {

+     $this->Result = "100101101101"."0";

+     $TextString   = "";

+     for($i=1;$i<=strlen($Value);$i++)

+      {

+       $CharCode = ord($this->mid($Value,$i,1));

+       if ( $CharCode >= 97 && $CharCode <= 122 ) { $CharCode = $CharCode - 32; }

+

+       if ( isset($this->Codes[chr($CharCode)]) )

+        {

+         $this->Result = $this->Result.$this->Codes[chr($CharCode)]."0";

+         $TextString = $TextString.chr($CharCode);

+        }

+      }

+

+     if ( $this->MOD43 )

+      {

+       $Checksum = $this->checksum($TextString);

+       $this->Result = $this->Result.$this->Codes[$Checksum]."0";

+      }

+

+     $this->Result = $this->Result."100101101101";

+     $TextString   = "*".$TextString."*";

+

+     return($TextString);

+    }

+

+   /* Create the encoded string */

+   function draw($Object,$Value,$X,$Y,$Format="")

+    {

+     $this->pChartObject = $Object;

+

+     $R			= isset($Format["R"]) ? $Format["R"] : 0;

+     $G			= isset($Format["G"]) ? $Format["G"] : 0;

+     $B			= isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha		= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $Height		= isset($Format["Height"]) ? $Format["Height"] : 30;

+     $Angle		= isset($Format["Angle"]) ? $Format["Angle"] : 0;

+     $ShowLegend	= isset($Format["ShowLegend"]) ? $Format["ShowLegend"] : FALSE;

+     $LegendOffset	= isset($Format["LegendOffset"]) ? $Format["LegendOffset"] : 5;

+     $DrawArea		= isset($Format["DrawArea"]) ? $Format["DrawArea"] : FALSE;

+     $AreaR		= isset($Format["AreaR"]) ? $Format["AreaR"] : 255;

+     $AreaG		= isset($Format["AreaG"]) ? $Format["AreaG"] : 255;

+     $AreaB		= isset($Format["AreaB"]) ? $Format["AreaB"] : 255;

+     $AreaBorderR	= isset($Format["AreaBorderR"]) ? $Format["AreaBorderR"] : $AreaR;

+     $AreaBorderG	= isset($Format["AreaBorderG"]) ? $Format["AreaBorderG"] : $AreaG;

+     $AreaBorderB	= isset($Format["AreaBorderB"]) ? $Format["AreaBorderB"] : $AreaB;

+

+     $TextString   = $this->encode39($Value);

+

+     if ( $DrawArea )

+      {

+       $X1 = $X + cos(($Angle-135) * PI / 180) * 10;

+       $Y1 = $Y + sin(($Angle-135) * PI / 180) * 10;

+

+       $X2 = $X1 + cos($Angle * PI / 180) * (strlen($this->Result)+20);

+       $Y2 = $Y1 + sin($Angle * PI / 180) * (strlen($this->Result)+20);

+

+       if ( $ShowLegend )

+        {

+         $X3 = $X2 + cos(($Angle+90) * PI / 180) * ($Height+$LegendOffset+$this->pChartObject->FontSize+10);

+         $Y3 = $Y2 + sin(($Angle+90) * PI / 180) * ($Height+$LegendOffset+$this->pChartObject->FontSize+10);

+        }

+       else

+        {

+         $X3 = $X2 + cos(($Angle+90) * PI / 180) * ($Height+20);

+         $Y3 = $Y2 + sin(($Angle+90) * PI / 180) * ($Height+20);

+        }

+

+       $X4 = $X3 + cos(($Angle+180) * PI / 180) * (strlen($this->Result)+20);

+       $Y4 = $Y3 + sin(($Angle+180) * PI / 180) * (strlen($this->Result)+20);

+

+       $Polygon  = array($X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4);

+       $Settings = array("R"=>$AreaR,"G"=>$AreaG,"B"=>$AreaB,"BorderR"=>$AreaBorderR,"BorderG"=>$AreaBorderG,"BorderB"=>$AreaBorderB);

+       $this->pChartObject->drawPolygon($Polygon,$Settings);

+      }

+

+     for($i=1;$i<=strlen($this->Result);$i++)

+      {

+       if ( $this->mid($this->Result,$i,1) == 1 )

+        {

+         $X1 = $X + cos($Angle * PI / 180) * $i;

+         $Y1 = $Y + sin($Angle * PI / 180) * $i;

+         $X2 = $X1 + cos(($Angle+90) * PI / 180) * $Height;

+         $Y2 = $Y1 + sin(($Angle+90) * PI / 180) * $Height;

+

+         $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);

+         $this->pChartObject->drawLine($X1,$Y1,$X2,$Y2,$Settings);

+        }

+      }

+

+     if ( $ShowLegend )

+      {

+       $X1 = $X + cos($Angle * PI / 180) * (strlen($this->Result)/2);

+       $Y1 = $Y + sin($Angle * PI / 180) * (strlen($this->Result)/2);

+

+       $LegendX = $X1 + cos(($Angle+90) * PI / 180) * ($Height+$LegendOffset);

+       $LegendY = $Y1 + sin(($Angle+90) * PI / 180) * ($Height+$LegendOffset);

+

+       $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Angle"=>-$Angle,"Align"=>TEXT_ALIGN_TOPMIDDLE);

+       $this->pChartObject->drawText($LegendX,$LegendY,$TextString,$Settings);

+      }

+    }

+

+   function checksum( $string )

+    {

+     $checksum = 0;

+     $length   = strlen( $string );

+     $charset  = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%';

+

+     for( $i=0; $i < $length; ++$i )

+      $checksum += strpos( $charset, $string[$i] );

+ 

+     return substr( $charset, ($checksum % 43), 1 );

+    }

+

+   function left($value,$NbChar) { return substr($value,0,$NbChar); }  

+   function right($value,$NbChar) { return substr($value,strlen($value)-$NbChar,$NbChar); }  

+   function mid($value,$Depart,$NbChar) { return substr($value,$Depart-1,$NbChar); }  

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/class/pBubble.class.php
@@ -1,1 +1,191 @@
-
+<?php

+ /*

+     pBubble - class to draw bubble charts

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ /* pBubble class definition */

+ class pBubble

+  {

+   var $pChartObject;

+   var $pDataObject;

+

+   /* Class creator */

+   function pBubble($pChartObject,$pDataObject)

+    {

+     $this->pChartObject = $pChartObject;

+     $this->pDataObject  = $pDataObject;

+    }

+

+   /* Prepare the scale */

+   function bubbleScale($DataSeries,$WeightSeries)

+    {

+     if ( !is_array($DataSeries) )	{ $DataSeries = array($DataSeries); }

+     if ( !is_array($WeightSeries) )	{ $WeightSeries = array($WeightSeries); }

+

+     /* Parse each data series to find the new min & max boundaries to scale */

+     $NewPositiveSerie = ""; $NewNegativeSerie = ""; $MaxValues = 0; $LastPositive = 0; $LastNegative = 0;

+     foreach($DataSeries as $Key => $SerieName)

+      {

+       $SerieWeightName = $WeightSeries[$Key];

+

+       $this->pDataObject->setSerieDrawable($SerieWeightName,FALSE);

+

+       if ( count($this->pDataObject->Data["Series"][$SerieName]["Data"]) > $MaxValues ) { $MaxValues = count($this->pDataObject->Data["Series"][$SerieName]["Data"]); }

+

+       foreach($this->pDataObject->Data["Series"][$SerieName]["Data"] as $Key => $Value)

+        {

+         if ( $Value >= 0 )

+          {

+           $BubbleBounds = $Value + $this->pDataObject->Data["Series"][$SerieWeightName]["Data"][$Key];

+

+           if ( !isset($NewPositiveSerie[$Key]) )

+            { $NewPositiveSerie[$Key] = $BubbleBounds; }

+           elseif ( $NewPositiveSerie[$Key] < $BubbleBounds )

+            { $NewPositiveSerie[$Key] = $BubbleBounds; }

+

+           $LastPositive = $BubbleBounds;

+          }

+         else

+          {

+           $BubbleBounds = $Value - $this->pDataObject->Data["Series"][$SerieWeightName]["Data"][$Key];

+

+           if ( !isset($NewNegativeSerie[$Key]) )

+            { $NewNegativeSerie[$Key] = $BubbleBounds; }

+           elseif ( $NewNegativeSerie[$Key] > $BubbleBounds )

+            { $NewNegativeSerie[$Key] = $BubbleBounds; }

+

+           $LastNegative = $BubbleBounds;

+          }

+        }

+      }

+

+     /* Check for missing values and all the fake positive serie */

+     if ( $NewPositiveSerie != "" )

+      {

+       for ($i=0; $i<$MaxValues; $i++) { if (!isset($NewPositiveSerie[$i])) { $NewPositiveSerie[$i] = $LastPositive; } }

+

+       $this->pDataObject->addPoints($NewPositiveSerie,"BubbleFakePositiveSerie");

+      }

+

+     /* Check for missing values and all the fake negative serie */

+     if ( $NewNegativeSerie != "" )

+      {

+       for ($i=0; $i<$MaxValues; $i++) { if (!isset($NewNegativeSerie[$i])) { $NewNegativeSerie[$i] = $LastNegative; } }

+

+       $this->pDataObject->addPoints($NewNegativeSerie,"BubbleFakeNegativeSerie");

+      }

+    }

+

+   function resetSeriesColors()

+    {

+     $Data    = $this->pDataObject->getData();

+     $Palette = $this->pDataObject->getPalette();

+

+     $ID = 0;

+     foreach($Data["Series"] as $SerieName => $SeriesParameters)

+      {

+       if ( $SeriesParameters["isDrawable"] )

+        {

+         $this->pDataObject->Data["Series"][$SerieName]["Color"]["R"]     = $Palette[$ID]["R"];

+         $this->pDataObject->Data["Series"][$SerieName]["Color"]["G"]     = $Palette[$ID]["G"];

+         $this->pDataObject->Data["Series"][$SerieName]["Color"]["B"]     = $Palette[$ID]["B"];

+         $this->pDataObject->Data["Series"][$SerieName]["Color"]["Alpha"] = $Palette[$ID]["Alpha"];

+         $ID++;

+        }

+      }

+    }

+

+   /* Prepare the scale */

+   function drawBubbleChart($DataSeries,$WeightSeries,$Format="")

+    {

+     $DrawBorder	= isset($Format["DrawBorder"]) ? $Format["DrawBorder"] : TRUE;

+     $DrawSquare	= isset($Format["DrawSquare"]) ? $Format["DrawSquare"] : FALSE;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : 0;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : 0;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : 0;

+     $BorderAlpha	= isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30;

+

+     if ( !is_array($DataSeries) )	{ $DataSeries = array($DataSeries); }

+     if ( !is_array($WeightSeries) )	{ $WeightSeries = array($WeightSeries); }

+

+     $Data    = $this->pDataObject->getData();

+     $Palette = $this->pDataObject->getPalette();

+

+     if ( isset($Data["Series"]["BubbleFakePositiveSerie"] ) ) { $this->pDataObject->setSerieDrawable("BubbleFakePositiveSerie",FALSE); }

+     if ( isset($Data["Series"]["BubbleFakeNegativeSerie"] ) ) { $this->pDataObject->setSerieDrawable("BubbleFakeNegativeSerie",FALSE); }

+

+     $this->resetSeriesColors();

+

+     list($XMargin,$XDivs) = $this->pChartObject->scaleGetXSettings();

+

+     foreach($DataSeries as $Key => $SerieName)

+      {

+       $AxisID	= $Data["Series"][$SerieName]["Axis"];

+       $Mode	= $Data["Axis"][$AxisID]["Display"];

+       $Format	= $Data["Axis"][$AxisID]["Format"];

+       $Unit	= $Data["Axis"][$AxisID]["Unit"];

+

+       $XStep	= ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs;

+

+       $X = $this->pChartObject->GraphAreaX1 + $XMargin;

+       $Y = $this->pChartObject->GraphAreaY1 + $XMargin;

+

+       $Color = array("R"=>$Palette[$Key]["R"],"G"=>$Palette[$Key]["G"],"B"=>$Palette[$Key]["B"],"Alpha"=>$Palette[$Key]["Alpha"]);

+

+       if ( $DrawBorder )

+        {

+         $Color["BorderAlpha"] = $BorderAlpha;

+

+         if ( $Surrounding != NULL )

+          { $Color["BorderR"] = $Palette[$Key]["R"]+$Surrounding; $Color["BorderG"] = $Palette[$Key]["G"]+$Surrounding; $Color["BorderB"] = $Palette[$Key]["B"]+$Surrounding; }

+         else

+          { $Color["BorderR"] = $BorderR; $Color["BorderG"] = $BorderG; $Color["BorderB"] = $BorderB; }

+        }

+

+       foreach($Data["Series"][$SerieName]["Data"] as $iKey => $Point)

+        {

+         $Weight = $Point + $Data["Series"][$WeightSeries[$Key]]["Data"][$iKey];

+

+         $PosArray    = $this->pChartObject->scaleComputeY($Point,array("AxisID"=>$AxisID));

+         $WeightArray = $this->pChartObject->scaleComputeY($Weight,array("AxisID"=>$AxisID));

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $Y = floor($PosArray); $CircleRadius = floor(abs($PosArray - $WeightArray)/2);

+

+           if ( $DrawSquare )

+            $this->pChartObject->drawFilledRectangle($X-$CircleRadius,$Y-$CircleRadius,$X+$CircleRadius,$Y+$CircleRadius,$Color);

+           else

+            $this->pChartObject->drawFilledCircle($X,$Y,$CircleRadius,$Color);

+

+           $X = $X + $XStep;

+          }

+         elseif ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM )

+          {

+           if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1-$XMargin*2)/$XDivs; }

+           $X = floor($PosArray); $CircleRadius = floor(abs($PosArray - $WeightArray)/2);

+

+           if ( $DrawSquare )

+            $this->pChartObject->drawFilledRectangle($X-$CircleRadius,$Y-$CircleRadius,$X+$CircleRadius,$Y+$CircleRadius,$Color);

+           else

+            $this->pChartObject->drawFilledCircle($X,$Y,$CircleRadius,$Color);

+

+           $Y = $Y + $XStep;

+          }

+        }

+      }

+    }

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/class/pCache.class.php
@@ -1,1 +1,271 @@
-
+<?php

+ /*

+     pCache - speed up the rendering by caching up the pictures

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ /* pData class definition */

+ class pCache

+  {

+   var $CacheFolder;

+   var $CacheIndex;

+   var $CacheDB;

+

+   /* Class creator */

+   function pCache($Settings="")

+    {

+     $CacheFolder	= isset($Settings["CacheFolder"]) ? $Settings["CacheFolder"] : "cache";

+     $CacheIndex	= isset($Settings["CacheIndex"]) ? $Settings["CacheIndex"] : "index.db";

+     $CacheDB		= isset($Settings["CacheDB"]) ? $Settings["CacheDB"] : "cache.db";

+

+     $this->CacheFolder	= $CacheFolder;

+     $this->CacheIndex	= $CacheIndex;

+     $this->CacheDB	= $CacheDB;

+

+     if (!file_exists($this->CacheFolder."/".$this->CacheIndex)) { touch($this->CacheFolder."/".$this->CacheIndex); }

+     if (!file_exists($this->CacheFolder."/".$this->CacheDB))    { touch($this->CacheFolder."/".$this->CacheDB); }

+    }

+

+   /* Flush the cache contents */

+   function flush()

+    {

+     if (file_exists($this->CacheFolder."/".$this->CacheIndex)) { unlink($this->CacheFolder."/".$this->CacheIndex); touch($this->CacheFolder."/".$this->CacheIndex); }

+     if (file_exists($this->CacheFolder."/".$this->CacheDB))    { unlink($this->CacheFolder."/".$this->CacheDB); touch($this->CacheFolder."/".$this->CacheDB); }

+    }

+

+   /* Return the MD5 of the data array to clearly identify the chart */

+   function getHash($Data,$Marker="")

+    { return(md5($Marker.serialize($Data->Data))); }

+

+   /* Write the generated picture to the cache */

+   function writeToCache($ID,$pChartObject)

+    {

+     /* Compute the paths */

+     $TemporaryFile = $this->CacheFolder."/tmp_".rand(0,1000).".png";

+     $Database      = $this->CacheFolder."/".$this->CacheDB;

+     $Index         = $this->CacheFolder."/".$this->CacheIndex;

+

+     /* Flush the picture to a temporary file */

+     imagepng($pChartObject->Picture ,$TemporaryFile);

+

+     /* Retrieve the files size */

+     $PictureSize = filesize($TemporaryFile);

+     $DBSize      = filesize($Database);

+

+     /* Save the index */

+     $Handle = fopen($Index,"a");

+     fwrite($Handle, $ID.",".$DBSize.",".$PictureSize.",".time().",0      \r\n");

+     fclose($Handle);

+

+     /* Get the picture raw contents */

+     $Handle = fopen($TemporaryFile,"r");

+     $Raw    = fread($Handle,$PictureSize);

+     fclose($Handle);

+

+     /* Save the picture in the solid database file */

+     $Handle = fopen($Database,"a");

+     fwrite($Handle, $Raw);

+     fclose($Handle);

+

+     /* Remove temporary file */

+     unlink($TemporaryFile);

+    }

+

+   /* Remove object older than the specified TS */

+   function removeOlderThan($Expiry)

+    { $this->dbRemoval(array("Expiry"=>$Expiry)); }

+

+   /* Remove an object from the cache */

+   function remove($ID)

+    { $this->dbRemoval(array("Name"=>$ID)); }

+

+   /* Remove with specified criterias */

+   function dbRemoval($Settings)

+    {

+     $ID     = isset($Settings["Name"]) ? $Settings["Name"] : NULL;

+     $Expiry = isset($Settings["Expiry"]) ? $Settings["Expiry"] : -(24*60*60);

+     $TS     = time()-$Expiry;

+

+     /* Compute the paths */

+     $Database     = $this->CacheFolder."/".$this->CacheDB;

+     $Index        = $this->CacheFolder."/".$this->CacheIndex;

+     $DatabaseTemp = $this->CacheFolder."/".$this->CacheDB.".tmp";

+     $IndexTemp    = $this->CacheFolder."/".$this->CacheIndex.".tmp";

+

+     /* Single file removal */

+     if ( $ID != NULL )

+      {

+       /* Retrieve object informations */

+       $Object = $this->isInCache($ID,TRUE);

+

+       /* If it's not in the cache DB, go away */

+       if ( !$Object ) { return(0); }

+      }

+

+     /* Create the temporary files */

+     if (!file_exists($DatabaseTemp)) { touch($DatabaseTemp); }

+     if (!file_exists($IndexTemp))    { touch($IndexTemp); }

+

+     /* Open the file handles */

+     $IndexHandle     = @fopen($Index, "r");

+     $IndexTempHandle = @fopen($IndexTemp, "w");

+     $DBHandle        = @fopen($Database, "r");

+     $DBTempHandle    = @fopen($DatabaseTemp, "w");

+

+     /* Remove the selected ID from the database */

+     while (!feof($IndexHandle))

+      {

+       $Entry    = fgets($IndexHandle, 4096);

+       $Entry    = str_replace("\r","",$Entry);

+       $Entry    = str_replace("\n","",$Entry);

+       $Settings = preg_split("/,/",$Entry);

+

+       if ( $Entry != "" )

+        {

+         $PicID       = $Settings[0];

+         $DBPos       = $Settings[1];

+         $PicSize     = $Settings[2];

+         $GeneratedTS = $Settings[3];

+         $Hits        = $Settings[4];

+

+         if ( $Settings[0] != $ID && $GeneratedTS > $TS)

+          {

+           $CurrentPos  = ftell($DBTempHandle);

+           fwrite($IndexTempHandle, $PicID.",".$CurrentPos.",".$PicSize.",".$GeneratedTS.",".$Hits."\r\n");

+

+           fseek($DBHandle,$DBPos);

+           $Picture = fread($DBHandle,$PicSize);

+           fwrite($DBTempHandle,$Picture);

+          }

+        }

+      }

+

+     /* Close the handles */

+     fclose($IndexHandle);

+     fclose($IndexTempHandle);

+     fclose($DBHandle);

+     fclose($DBTempHandle);

+

+     /* Remove the prod files */

+     unlink($Database);

+     unlink($Index);

+

+     /* Swap the temp & prod DB */

+     rename($DatabaseTemp,$Database);

+     rename($IndexTemp,$Index);

+    }

+

+   function isInCache($ID,$Verbose=FALSE,$UpdateHitsCount=FALSE)

+    {

+     /* Compute the paths */

+     $Index = $this->CacheFolder."/".$this->CacheIndex;

+

+     /* Search the picture in the index file */

+     $Handle = @fopen($Index, "r");

+     while (!feof($Handle))

+      {

+       $IndexPos = ftell($Handle);

+       $Entry = fgets($Handle, 4096);

+       if ( $Entry != "" )

+        {

+         $Settings = preg_split("/,/",$Entry);

+         $PicID    = $Settings[0];

+         if ( $PicID == $ID )

+          {

+           fclose($Handle);

+

+           $DBPos       = $Settings[1];

+           $PicSize     = $Settings[2];

+           $GeneratedTS = $Settings[3];

+           $Hits        = intval($Settings[4]);

+

+           if ( $UpdateHitsCount )

+            {

+             $Hits++;

+             if ( strlen($Hits) < 7 ) { $Hits = $Hits.str_repeat(" ",7-strlen($Hits)); }

+

+             $Handle = @fopen($Index, "r+");

+             fseek($Handle,$IndexPos);

+             fwrite($Handle, $PicID.",".$DBPos.",".$PicSize.",".$GeneratedTS.",".$Hits."\r\n");

+             fclose($Handle);

+            }

+

+           if ($Verbose)

+            { return(array("DBPos"=>$DBPos,"PicSize"=>$PicSize,"GeneratedTS"=>$GeneratedTS,"Hits"=>$Hits)); }

+           else

+            { return(TRUE); }

+          }

+        }

+      }

+     fclose($Handle);

+

+     /* Picture isn't in the cache */

+     return(FALSE);

+    }

+

+   function strokeFromCache($ID)

+    {

+     /* Get the raw picture from the cache */

+     $Picture = $this->getFromCache($ID);

+

+     /* Do we have a hit? */

+     if ( $Picture == NULL ) { return(FALSE); }

+

+     header('Content-type: image/png');

+     echo $Picture;

+

+     return(TRUE);

+    }

+

+   function saveFromCache($ID,$Destination)

+    {

+     /* Get the raw picture from the cache */

+     $Picture = $this->getFromCache($ID);

+

+     /* Do we have a hit? */

+     if ( $Picture == NULL ) { return(FALSE); }

+

+     /* Flush the picture to a file */

+     $Handle = fopen($Destination,"w");

+     fwrite($Handle,$Picture);

+     fclose($Handle);

+

+     /* All went fine */

+     return(TRUE);

+    }

+

+   function getFromCache($ID)

+    {

+     /* Compute the path */

+     $Database = $this->CacheFolder."/".$this->CacheDB;

+

+     /* Lookup for the picture in the cache */

+     $CacheInfo = $this->isInCache($ID,TRUE,TRUE);

+

+     /* Not in the cache */

+     if (!$CacheInfo) { return(NULL); }

+

+     /* Get the database extended information */     

+     $DBPos   = $CacheInfo["DBPos"];

+     $PicSize = $CacheInfo["PicSize"];

+

+     /* Extract the picture from the solid cache file */

+     $Handle = @fopen($Database, "r");

+     fseek($Handle,$DBPos);

+     $Picture = fread($Handle,$PicSize);

+     fclose($Handle);

+

+     /* Return back the raw picture data */

+     return($Picture);

+    }

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/class/pData.class.php
@@ -1,1 +1,555 @@
-
+<?php

+ /*

+     pDraw - class to manipulate data arrays

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ /* Axis configuration */

+ define("AXIS_FORMAT_DEFAULT"	, 680001);

+ define("AXIS_FORMAT_TIME"	, 680002);

+ define("AXIS_FORMAT_DATE"	, 680003);

+ define("AXIS_FORMAT_METRIC"	, 680004);

+ define("AXIS_FORMAT_CURRENCY"	, 680005);

+

+ /* Axis position */

+ define("AXIS_POSITION_LEFT"	, 681001);

+ define("AXIS_POSITION_RIGHT"	, 681002);

+ define("AXIS_POSITION_TOP"	, 681001);

+ define("AXIS_POSITION_BOTTOM"	, 681002);

+

+ /* Axis position */

+ define("AXIS_X"		, 682001);

+ define("AXIS_Y"		, 682002);

+

+ /* Define value limits */

+ define("ABSOLUTE_MIN"          , -10000000000000);

+ define("ABSOLUTE_MAX"          , 10000000000000);

+

+ /* Replacement to the PHP NULL keyword */

+ define("VOID"                  , 0.12345);

+

+ /* pData class definition */

+ class pData

+  {

+   var $Data;

+

+   var $Palette = array("0"=>array("R"=>188,"G"=>224,"B"=>46,"Alpha"=>100),

+                        "1"=>array("R"=>224,"G"=>100,"B"=>46,"Alpha"=>100),

+                        "2"=>array("R"=>224,"G"=>214,"B"=>46,"Alpha"=>100),

+                        "3"=>array("R"=>46,"G"=>151,"B"=>224,"Alpha"=>100),

+                        "4"=>array("R"=>176,"G"=>46,"B"=>224,"Alpha"=>100),

+                        "5"=>array("R"=>224,"G"=>46,"B"=>117,"Alpha"=>100),

+                        "6"=>array("R"=>92,"G"=>224,"B"=>46,"Alpha"=>100),

+                        "7"=>array("R"=>224,"G"=>176,"B"=>46,"Alpha"=>100));

+

+   /* Class creator */

+   function pData()

+    {

+     $this->Data = "";

+     $this->Data["XAxisDisplay"] = AXIS_FORMAT_DEFAULT;

+     $this->Data["XAxisFormat"]  = NULL;

+     $this->Data["XAxisName"]    = NULL;

+     $this->Data["XAxisUnit"]    = NULL;

+     $this->Data["Abscissa"]     = NULL;

+     $this->Data["Axis"][0]["Display"]  = AXIS_FORMAT_DEFAULT;

+     $this->Data["Axis"][0]["Position"] = AXIS_POSITION_LEFT;

+     $this->Data["Axis"][0]["Identity"] = AXIS_Y;

+    }

+

+   /* Add a single point or an array to the given serie */

+   function addPoints($Values,$SerieName="Serie1")

+    {

+     if (!isset($this->Data["Series"][$SerieName]))

+      $this->initialise($SerieName);

+

+     if ( is_array($Values) )

+      {

+       foreach($Values as $Key => $Value)

+        { $this->Data["Series"][$SerieName]["Data"][] = $Value; }

+      }

+     else

+      $this->Data["Series"][$SerieName]["Data"][] = $Values;

+

+     if ( $Values != VOID )

+      {

+       $this->Data["Series"][$SerieName]["Max"] = max($this->stripVOID($this->Data["Series"][$SerieName]["Data"]));

+       $this->Data["Series"][$SerieName]["Min"] = min($this->stripVOID($this->Data["Series"][$SerieName]["Data"]));

+      }

+    }

+

+   /* Strip VOID values */

+   function stripVOID($Values)

+    { $Result = ""; foreach($Values as $Key => $Value) { if ( $Value != VOID ) { $Result[] = $Value; } } return($Result); }

+

+   /* Return the number of values contained in a given serie */

+   function getSerieCount($Serie=NULL)

+    { if (isset($this->Data["Series"][$Serie]["Data"])) { return(sizeof($this->Data["Series"][$Serie]["Data"])); } else { return(0); } }

+

+   /* Remove a serie from the pData object */

+   function removeSerie($Serie=NULL)

+    { if (isset($this->Data["Series"][$Serie])) { unset($this->Data["Series"][$Serie]); } }

+

+   /* Return a value from given serie & index */

+   function getValueAt($Serie,$Index=0)

+    { if (isset($this->Data["Series"][$Serie]["Data"][$Index])) { return($this->Data["Series"][$Serie]["Data"][$Index]); } else { return(NULL); } }

+

+   /* Return the values array */

+   function getValues($Serie=NULL)

+    { if (isset($this->Data["Series"][$Serie]["Data"])) { return($this->Data["Series"][$Serie]["Data"]); } else { return(NULL); } }

+

+   /* Reverse the values in the given serie */

+   function reverseSerie($Serie=NULL)

+    { if (isset($this->Data["Series"][$Serie]["Data"])) { $this->Data["Series"][$Serie]["Data"] = array_reverse($this->Data["Series"][$Serie]["Data"]); } }

+

+   /* Return the sum of the serie values */

+   function getSum($Serie)

+    { if (isset($this->Data["Series"][$Serie])) { return(array_sum($this->Data["Series"][$Serie]["Data"])); } else { return(NULL); } }

+

+   /* Return the max value of a given serie */

+   function getMax($Serie)

+    { if (isset($this->Data["Series"][$Serie]["Max"])) { return($this->Data["Series"][$Serie]["Max"]); } else { return(NULL); } }

+

+   /* Return the min value of a given serie */

+   function getMin($Serie)

+    { if (isset($this->Data["Series"][$Serie]["Min"])) { return($this->Data["Series"][$Serie]["Min"]); } else { return(NULL); } }

+

+   /* Set the description of a given serie */

+   function setSerieDescription($Serie=NULL,$Description="My serie")

+    { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Description"] = $Description; } }

+

+   /* Set a serie as "drawable" while calling a rendering function */

+   function setSerieDrawable($Serie=NULL ,$Drawable=TRUE)

+    { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["isDrawable"] = $Drawable; } }

+

+   /* Set the icon associated to a given serie */

+   function setSeriePicture($Serie=NULL,$Picture=NULL)

+    { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Picture"] = $Picture; } }

+

+   /* Set the name of the X Axis */

+   function setXAxisName($Name=NULL)

+    { $this->Data["XAxisName"] = $Name; }

+

+   /* Set the display mode of the  X Axis */

+   function setXAxisDisplay($Mode,$Format=NULL)

+    { $this->Data["XAxisDisplay"] = $Mode; $this->Data["XAxisFormat"]  = $Format; }

+

+   /* Set the unit that will be displayed on the X axis */

+   function setXAxisUnit($Unit)

+    { $this->Data["XAxisUnit"] = $Unit; }

+

+   /* Set the serie that will be used as abscissa */

+   function setAbscissa($Serie)

+    { if (isset($this->Data["Series"][$Serie])) { $this->Data["Abscissa"] = $Serie; } }

+

+   /* Create a scatter group specifyin X and Y data series */

+   function setScatterSerie($SerieX,$SerieY,$ID=0)

+    { if (isset($this->Data["Series"][$SerieX]) && isset($this->Data["Series"][$SerieY]) ) { $this->initScatterSerie($ID); $this->Data["ScatterSeries"][$ID]["X"] = $SerieX; $this->Data["ScatterSeries"][$ID]["Y"] = $SerieY; } }

+

+   /* Set the description of a given scatter serie */

+   function setScatterSerieDescription($ID,$Description="My serie")

+    { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Description"] = $Description; } }

+

+   /* Set the icon associated to a given scatter serie */

+   function setScatterSeriePicture($ID,$Picture=NULL)

+    { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Picture"] = $Picture; } }

+

+   /* Set a scatter serie as "drawable" while calling a rendering function */

+   function setScatterSerieDrawable($ID ,$Drawable=TRUE)

+    { if (isset($this->Data["ScatterSeries"][ID]) ) { $this->Data["ScatterSeries"][ID]["isDrawable"] = $Drawable; } }

+

+   /* Define if a scatter serie should be draw with ticks */

+   function setScatterSerieTicks($ID,$Width=0)

+    { if ( isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Ticks"] = $Width; } }

+

+   /* Define if a scatter serie should be draw with a special weight */

+   function setScatterSerieWeight($ID,$Weight=0)

+    { if ( isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Weight"] = $Weight; } }

+

+   /* Associate a color to a scatter serie */

+   function setScatterSerieColor($ID,$Format)

+    {

+     $R	    = isset($Format["R"]) ? $Format["R"] : 0;

+     $G	    = isset($Format["G"]) ? $Format["G"] : 0;

+     $B	    = isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+

+     if ( isset($this->Data["ScatterSeries"][$ID]) )

+      {

+       $this->Data["ScatterSeries"][$ID]["Color"]["R"] = $R;

+       $this->Data["ScatterSeries"][$ID]["Color"]["G"] = $G;

+       $this->Data["ScatterSeries"][$ID]["Color"]["B"] = $B;

+       $this->Data["ScatterSeries"][$ID]["Color"]["Alpha"] = $Alpha;

+      }

+    }

+

+   /* Compute the series limits for an individual and global point of view */

+   function limits()

+    {

+     $GlobalMin = ABSOLUTE_MAX;

+     $GlobalMax = ABSOLUTE_MIN;

+

+     foreach($this->Data["Series"] as $Key => $Value)

+      {

+       if ( $this->Data["Abscissa"] != $Key && $this->Data["Series"][$Key]["isDrawable"] == TRUE)

+        {

+         if ( $GlobalMin > $this->Data["Series"][$Key]["Min"] ) { $GlobalMin = $this->Data["Series"][$Key]["Min"]; }

+         if ( $GlobalMax < $this->Data["Series"][$Key]["Max"] ) { $GlobalMax = $this->Data["Series"][$Key]["Max"]; }

+        }

+      }

+     $this->Data["Min"] = $GlobalMin;

+     $this->Data["Max"] = $GlobalMax;

+

+     return(array($GlobalMin,$GlobalMax));

+    }

+

+   /* Mark all series as drawable */

+   function drawAll()

+    { foreach($this->Data["Series"] as $Key => $Value) { if ( $this->Data["Abscissa"] != $Key ) { $this->Data["Series"][$Key]["isDrawable"]=TRUE; } } }    

+

+   /* Return the average value of the given serie */

+   function getSerieAverage($Serie)

+    {

+     if ( isset($this->Data["Series"][$Serie]) )

+      return(array_sum($this->Data["Series"][$Serie]["Data"])/sizeof($this->Data["Series"][$Serie]["Data"]));

+     else

+      return(NULL);

+    }

+

+   /* Return the x th percentil of the given serie */

+   function getSeriePercentile($Serie="Serie1",$Percentil=95)

+    {

+     if (!isset($this->Data["Series"][$Serie]["Data"])) { return(NULL); }

+

+     $Values = count($this->Data["Series"][$Serie]["Data"])-1;

+     if ( $Values < 0 ) { $Values = 0; }

+

+     $PercentilID  = floor(($Values/100)*$Percentil+.5);

+     $SortedValues = $this->Data["Series"][$Serie]["Data"];

+     sort($SortedValues);

+

+     if ( is_numeric($SortedValues[$PercentilID]) )

+      return($SortedValues[$PercentilID]);

+     else

+      return(NULL);

+    }

+

+   /* Add random values to a given serie */

+   function addRandomValues($SerieName="Serie1",$Options="")

+    {

+     $Values    = isset($Options["Values"]) ? $Options["Values"] : 20;

+     $Min       = isset($Options["Min"]) ? $Options["Min"] : 0;

+     $Max       = isset($Options["Max"]) ? $Options["Max"] : 100;

+     $withFloat = isset($Options["withFloat"]) ? $Options["withFloat"] : FALSE;

+

+     for ($i=0;$i<=$Values;$i++)

+      {

+       if ( $withFloat ) { $Value = rand($Min*100,$Max*100)/100; } else { $Value = rand($Min,$Max); }

+       $this->addPoints($Value,$SerieName);

+      }

+    }

+

+   /* Test if we have valid data */

+   function containsData()

+    {

+     if (!isset($this->Data["Series"])) { return(FALSE); }

+

+     $Result = FALSE;

+     foreach($this->Data["Series"] as $Key => $Value)

+      { if ( $this->Data["Abscissa"] != $Key && $this->Data["Series"][$Key]["isDrawable"]==TRUE) { $Result=TRUE; } }

+     return($Result);

+    }

+

+   /* Set the display mode of an Axis */

+   function setAxisDisplay($AxisID,$Mode=AXIS_FORMAT_DEFAULT,$Format=NULL)

+    {

+     if ( isset($this->Data["Axis"][$AxisID] ) )

+      {

+       $this->Data["Axis"][$AxisID]["Display"] = $Mode;

+       if ( $Format != NULL ) { $this->Data["Axis"][$AxisID]["Format"] = $Format; }

+      }

+    }

+

+   /* Set the position of an Axis */

+   function setAxisPosition($AxisID,$Position=AXIS_POSITION_LEFT)

+    { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Position"] = $Position; } }

+

+   /* Associate an unit to an axis */

+   function setAxisUnit($AxisID,$Unit)

+    { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Unit"] = $Unit; } }

+

+   /* Associate a name to an axis */

+   function setAxisName($AxisID,$Name)

+    { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Name"] = $Name; } }

+

+   /* Associate a color to an axis */

+   function setAxisColor($AxisID,$Format)

+    {

+     $R	    = isset($Format["R"]) ? $Format["R"] : 0;

+     $G	    = isset($Format["G"]) ? $Format["G"] : 0;

+     $B	    = isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+

+     if ( isset($this->Data["Axis"][$AxisID] ) )

+      {

+       $this->Data["Axis"][$AxisID]["Color"]["R"] = $R;

+       $this->Data["Axis"][$AxisID]["Color"]["G"] = $G;

+       $this->Data["Axis"][$AxisID]["Color"]["B"] = $B;

+       $this->Data["Axis"][$AxisID]["Color"]["Alpha"] = $Alpha;

+      }

+    }

+

+

+   /* Design an axis as X or Y member */

+   function setAxisXY($AxisID,$Identity=AXIS_Y)

+    { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Identity"] = $Identity; } }

+

+   /* Associate one data serie with one axis */

+   function setSerieOnAxis($Serie,$AxisID)

+    {

+     $PreviousAxis = $this->Data["Series"][$Serie]["Axis"];

+

+     /* Create missing axis */

+     if ( !isset($this->Data["Axis"][$AxisID] ) )

+      { $this->Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_LEFT; $this->Data["Axis"][$AxisID]["Identity"] = AXIS_Y;}

+

+     $this->Data["Series"][$Serie]["Axis"] = $AxisID;

+

+     /* Cleanup unused axis */

+     $Found = FALSE;

+     foreach($this->Data["Series"] as $SerieName => $Values) { if ( $Values["Axis"] == $PreviousAxis ) { $Found = TRUE; } }

+     if (!$Found) { unset($this->Data["Axis"][$PreviousAxis]); }

+    }

+

+   /* Define if a serie should be draw with ticks */

+   function setSerieTicks($Serie,$Width=0)

+    { if ( isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Ticks"] = $Width; } }

+

+  /* Define if a serie should be draw with a special weight */

+   function setSerieWeight($Serie,$Weight=0)

+    { if ( isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Weight"] = $Weight; } }

+

+   /* Set the color of one serie */

+   function setPalette($Serie,$Format=NULL)

+    {

+     $R	    = isset($Format["R"]) ? $Format["R"] : 0;

+     $G	    = isset($Format["G"]) ? $Format["G"] : 0;

+     $B	    = isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+

+     if ( isset($this->Data["Series"][$Serie]) )

+      {

+       $OldR = $this->Data["Series"][$Serie]["Color"]["R"]; $OldG = $this->Data["Series"][$Serie]["Color"]["G"]; $OldB = $this->Data["Series"][$Serie]["Color"]["B"];

+       $this->Data["Series"][$Serie]["Color"]["R"] = $R;

+       $this->Data["Series"][$Serie]["Color"]["G"] = $G;

+       $this->Data["Series"][$Serie]["Color"]["B"] = $B;

+       $this->Data["Series"][$Serie]["Color"]["Alpha"] = $Alpha;

+

+       /* Do reverse processing on the internal palette array */

+       foreach ($this->Palette as $Key => $Value)

+        { if ($Value["R"] == $OldR && $Value["G"] == $OldG && $Value["B"] == $OldB) { $this->Palette[$Key]["R"] = $R; $this->Palette[$Key]["G"] = $G; $this->Palette[$Key]["B"] = $B; $this->Palette[$Key]["Alpha"] = $Alpha;} }

+      }

+    }

+

+   /* Load a palette file */

+   function loadPalette($FileName,$Overwrite=FALSE)

+    {

+     if ( !file_exists($FileName) ) { return(-1); }

+     if ( $Overwrite ) { $this->Palette = ""; }

+

+     $fileHandle = @fopen($FileName, "r");

+     if (!$fileHandle) { return(-1); }

+     while (!feof($fileHandle))

+      {

+       $buffer = fgets($fileHandle, 4096);

+       if ( preg_match("/,/",$buffer) )

+        {

+         list($R,$G,$B,$Alpha) = preg_split("/,/",$buffer);

+         if ( $this->Palette == "" ) { $ID = 0; } else { $ID = count($this->Palette); }

+         $this->Palette[$ID] = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);

+        }

+      }

+     fclose($fileHandle);

+

+     /* Apply changes to current series */

+     $ID = 0;

+     if ( isset($this->Data["Series"]))

+      {

+       foreach($this->Data["Series"] as $Key => $Value)

+        {

+         if ( !isset($this->Palette[$ID]) )

+          $this->Data["Series"][$Key]["Color"] = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>0);

+         else

+          $this->Data["Series"][$Key]["Color"] = $this->Palette[$ID];

+         $ID++;

+        }

+      }

+    }

+

+   /* Initialise a given scatter serie */

+   function initScatterSerie($ID)

+    {

+     if ( isset($this->Data["ScatterSeries"][$ID]) ) { return(0); }

+

+     $this->Data["ScatterSeries"][$ID]["Description"]	= "Scatter ".$ID;

+     $this->Data["ScatterSeries"][$ID]["isDrawable"]	= TRUE;

+     $this->Data["ScatterSeries"][$ID]["Picture"]	= NULL;

+     $this->Data["ScatterSeries"][$ID]["Ticks"]		= 0;

+     $this->Data["ScatterSeries"][$ID]["Weight"]	= 0;

+

+     if ( isset($this->Palette[$ID]) )

+      $this->Data["ScatterSeries"][$ID]["Color"] = $this->Palette[$ID];

+     else

+      {

+       $this->Data["ScatterSeries"][$ID]["Color"]["R"] = rand(0,255);

+       $this->Data["ScatterSeries"][$ID]["Color"]["G"] = rand(0,255);

+       $this->Data["ScatterSeries"][$ID]["Color"]["B"] = rand(0,255);

+       $this->Data["ScatterSeries"][$ID]["Color"]["Alpha"] = 100;

+      }

+    }

+

+   /* Initialise a given serie */

+   function initialise($Serie)

+    {

+     if ( isset($this->Data["Series"]) ) { $ID = count($this->Data["Series"]); } else { $ID = 0; }

+

+     $this->Data["Series"][$Serie]["Description"]	= $Serie;

+     $this->Data["Series"][$Serie]["isDrawable"]	= TRUE;

+     $this->Data["Series"][$Serie]["Picture"]		= NULL;

+     $this->Data["Series"][$Serie]["Max"]		= NULL;

+     $this->Data["Series"][$Serie]["Min"]		= NULL;

+     $this->Data["Series"][$Serie]["Axis"]		= 0;

+     $this->Data["Series"][$Serie]["Ticks"]		= 0;

+     $this->Data["Series"][$Serie]["Weight"]		= 0;

+

+     if ( isset($this->Palette[$ID]) )

+      $this->Data["Series"][$Serie]["Color"] = $this->Palette[$ID];

+     else

+      {

+       $this->Data["Series"][$Serie]["Color"]["R"] = rand(0,255);

+       $this->Data["Series"][$Serie]["Color"]["G"] = rand(0,255);

+       $this->Data["Series"][$Serie]["Color"]["B"] = rand(0,255);

+       $this->Data["Series"][$Serie]["Color"]["Alpha"] = 100;

+      }

+    }

+     

+   function normalize($NormalizationFactor=100,$UnitChange=NULL,$Round=1)

+    {

+     $Abscissa = $this->Data["Abscissa"];

+

+     $SelectedSeries = "";

+     $MaxVal         = 0;

+     foreach($this->Data["Axis"] as $AxisID => $Axis)

+      {

+       if ( $UnitChange != NULL ) { $this->Data["Axis"][$AxisID]["Unit"] = $UnitChange; }

+

+       foreach($this->Data["Series"] as $SerieName => $Serie)

+        {

+         if ($Serie["Axis"] == $AxisID && $Serie["isDrawable"] == TRUE && $SerieName != $Abscissa)

+          {

+           $SelectedSeries[$SerieName] = $SerieName;

+

+           if ( count($Serie["Data"] ) > $MaxVal ) { $MaxVal = count($Serie["Data"]); }

+          }

+        }

+      }

+

+     for($i=0;$i<=$MaxVal-1;$i++)

+      {

+       $Factor = 0;

+       foreach ($SelectedSeries as $Key => $SerieName )

+        {

+         $Value = $this->Data["Series"][$SerieName]["Data"][$i];

+         if ( $Value != VOID )

+          $Factor = $Factor + abs($Value);

+        }

+

+       if ( $Factor != 0 )

+        {

+         $Factor = $NormalizationFactor / $Factor;

+

+         foreach ($SelectedSeries as $Key => $SerieName )

+          {

+           $Value = $this->Data["Series"][$SerieName]["Data"][$i];

+

+           if ( $Value != VOID && $Factor != $NormalizationFactor )

+            $this->Data["Series"][$SerieName]["Data"][$i] = round(abs($Value)*$Factor,$Round);

+           elseif ( $Value == VOID || $Value == 0 )

+            $this->Data["Series"][$SerieName]["Data"][$i] = VOID;

+           elseif ( $Factor == $NormalizationFactor )

+            $this->Data["Series"][$SerieName]["Data"][$i] = $NormalizationFactor;

+          }

+        }

+      }

+

+     foreach ($SelectedSeries as $Key => $SerieName )

+      {

+       $this->Data["Series"][$SerieName]["Max"] = max($this->stripVOID($this->Data["Series"][$SerieName]["Data"]));

+       $this->Data["Series"][$SerieName]["Min"] = min($this->stripVOID($this->Data["Series"][$SerieName]["Data"]));

+      }

+    }

+

+   /* Load data from a CSV (or similar) data source */

+   function importFromCSV($FileName,$Options="")

+    {

+     $Delimiter		= isset($Options["Delimiter"]) ? $Options["Delimiter"] : ",";

+     $GotHeader		= isset($Options["GotHeader"]) ? $Options["GotHeader"] : FALSE;

+     $SkipColumns	= isset($Options["SkipColumns"]) ? $Options["SkipColumns"] : array(-1);

+     $DefaultSerieName	= isset($Options["DefaultSerieName"]) ? $Options["DefaultSerieName"] : "Serie";

+

+     $Handle = @fopen($FileName,"r");

+     if ($Handle)

+      {

+       $HeaderParsed = FALSE; $SerieNames = "";

+       while (!feof($Handle))

+        {

+         $Buffer = fgets($Handle, 4096);

+         $Buffer = str_replace(chr(10),"",$Buffer);

+         $Buffer = str_replace(chr(13),"",$Buffer);

+         $Values = preg_split("/".$Delimiter."/",$Buffer);

+

+         if ( $Buffer != "" )

+          {

+           if ( $GotHeader && !$HeaderParsed )

+            {

+             foreach($Values as $Key => $Name) { if ( !in_array($Key,$SkipColumns) ) { $SerieNames[$Key] = $Name; } }

+             $HeaderParsed = TRUE;

+            }

+           else

+            {

+             if ($SerieNames == "" ) { foreach($Values as $Key => $Name) {  if ( !in_array($Key,$SkipColumns) ) { $SerieNames[$Key] = $DefaultSerieName.$Key; } } }

+             foreach($Values as $Key => $Value) {  if ( !in_array($Key,$SkipColumns) ) { $this->addPoints($Value,$SerieNames[$Key]); } }

+            }

+          }

+        }

+       fclose($Handle);

+      }

+    }

+

+   /* Return the data & configuration of the series */

+   function getData()

+    { return($this->Data); }

+

+   /* Return the palette of the series */

+   function getPalette()

+    { return($this->Palette); }

+

+   /* Called by the scaling algorithm to save the config */

+   function saveAxisConfig($Axis) { $this->Data["Axis"]=$Axis; }

+

+   /* Called by the scaling algorithm to save the orientation of the scale */

+   function saveOrientation($Orientation) { $this->Data["Orientation"]=$Orientation; }

+

+   /* Class string wrapper */

+   function __toString()

+    { return("pData object."); }

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/class/pDraw.class.php
@@ -1,1 +1,4960 @@
-
+<?php

+ /*

+     pDraw - class extension with drawing methods

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ define("DIRECTION_VERTICAL"		, 690001);

+ define("DIRECTION_HORIZONTAL"		, 690002);

+

+ define("SCALE_POS_LEFTRIGHT"		, 690101);

+ define("SCALE_POS_TOPBOTTOM"		, 690102);

+

+ define("SCALE_MODE_FLOATING"		, 690201);

+ define("SCALE_MODE_START0"		, 690202);

+ define("SCALE_MODE_ADDALL"		, 690203);

+ define("SCALE_MODE_ADDALL_START0"	, 690204);

+ define("SCALE_MODE_MANUAL"		, 690205);

+

+ define("SCALE_SKIP_NONE"		, 690301);

+ define("SCALE_SKIP_SAME"		, 690302);

+ define("SCALE_SKIP_NUMBERS"		, 690303);

+

+ define("TEXT_ALIGN_TOPLEFT"		, 690401);

+ define("TEXT_ALIGN_TOPMIDDLE"		, 690402);

+ define("TEXT_ALIGN_TOPRIGHT"		, 690403);

+ define("TEXT_ALIGN_MIDDLELEFT"		, 690404);

+ define("TEXT_ALIGN_MIDDLEMIDDLE"	, 690405);

+ define("TEXT_ALIGN_MIDDLERIGHT"	, 690406);

+ define("TEXT_ALIGN_BOTTOMLEFT"		, 690407);

+ define("TEXT_ALIGN_BOTTOMMIDDLE"	, 690408);

+ define("TEXT_ALIGN_BOTTOMRIGHT"	, 690409);

+

+ define("POSITION_TOP"                  , 690501);

+ define("POSITION_BOTTOM"               , 690502);

+

+ define("LABEL_POS_LEFT"		, 690601);

+ define("LABEL_POS_CENTER"		, 690602);

+ define("LABEL_POS_RIGHT"		, 690603);

+ define("LABEL_POS_TOP"			, 690604);

+ define("LABEL_POS_BOTTOM"		, 690605);

+ define("LABEL_POS_INSIDE"		, 690606);

+ define("LABEL_POS_OUTSIDE"		, 690607);

+

+ define("ORIENTATION_HORIZONTAL"	, 690701);

+ define("ORIENTATION_VERTICAL"		, 690702);

+

+ define("LEGEND_NOBORDER"		, 690800);

+ define("LEGEND_BOX"			, 690801);

+ define("LEGEND_ROUND"			, 690802);

+

+ define("LEGEND_VERTICAL"		, 690901);

+ define("LEGEND_HORIZONTAL"		, 690902);

+

+ define("LEGEND_FAMILY_BOX"		, 691051);

+ define("LEGEND_FAMILY_CIRCLE"		, 691052);

+ define("LEGEND_FAMILY_LINE"		, 691053);

+

+ define("DISPLAY_AUTO"			, 691001);

+ define("DISPLAY_MANUAL"		, 691002);

+

+ define("LABELING_ALL"			, 691011);

+ define("LABELING_DIFFERENT"		, 691012);

+

+ define("BOUND_MIN"			, 691021);

+ define("BOUND_MAX"			, 691022);

+ define("BOUND_BOTH"			, 691023);

+

+ define("BOUND_LABEL_POS_TOP"		, 691031);

+ define("BOUND_LABEL_POS_BOTTOM"	, 691032);

+ define("BOUND_LABEL_POS_AUTO"		, 691033);

+

+ define("CAPTION_LEFT_TOP"		, 691041);

+ define("CAPTION_RIGHT_BOTTOM"		, 691042);

+

+ define("GRADIENT_SIMPLE"		, 691051);

+ define("GRADIENT_EFFECT_CAN"		, 691052);

+

+ define("PI"		, 3.14159265);

+ define("ALL"		, 69);

+ define("NONE"		, 31);

+ define("AUTO"		, 690000);

+ define("OUT_OF_SIGHT"	, -10000000000000);

+

+ class pDraw

+  {

+   /* Returns the number of drawable series */

+   function countDrawableSeries()

+    {

+     $Results = 0;

+     $Data = $this->DataSet->getData();

+

+     foreach($Data["Series"] as $SerieName => $Serie)

+      { if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) { $Results++; } }

+

+     return($Results);

+    }

+

+   /* Fix box coordinates */

+   function fixBoxCoordinates($Xa,$Ya,$Xb,$Yb)

+    {

+     $X1 = min($Xa,$Xb); $Y1 = min($Ya,$Yb);

+     $X2 = max($Xa,$Xb); $Y2 = max($Ya,$Yb);

+

+     return(array($X1,$Y1,$X2,$Y2));

+    }

+

+   /* Draw a polygon */

+   function drawPolygon($Points,$Format="")

+    {

+     $R			= isset($Format["R"]) ? $Format["R"] : 0;

+     $G			= isset($Format["G"]) ? $Format["G"] : 0;

+     $B			= isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha		= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $NoBorder		= isset($Format["NoBorder"]) ? $Format["NoBorder"] : FALSE;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : $R;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : $G;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : $B;

+     $BorderAlpha 	= isset($Format["Alpha"]) ? $Format["Alpha"] : $Alpha / 2;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $SkipX		= isset($Format["SkipX"]) ? $Format["SkipX"] : OUT_OF_SIGHT;

+     $SkipY		= isset($Format["SkipY"]) ? $Format["SkipY"] : OUT_OF_SIGHT;

+

+     /* Calling the ImageFilledPolygon() function over the $Points array will round it */ 	

+     $Backup = $Points;

+

+     if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }

+

+     if ( $SkipX != OUT_OF_SIGHT ) { $SkipX = floor($SkipX); }

+     if ( $SkipY != OUT_OF_SIGHT ) { $SkipY = floor($SkipY); }

+

+     $RestoreShadow = $this->Shadow;

+     if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )

+      {

+       $this->Shadow = FALSE;

+       for($i=0;$i<=count($Points)-1;$i=$i+2)

+        { $Shadow[] = $Points[$i] + $this->ShadowX; $Shadow[] = $Points[$i+1] + $this->ShadowY; }

+       $this->drawPolygon($Shadow,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"NoBorder"=>TRUE));

+      }

+

+     $FillColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);

+

+     if ( count($Points) >= 6 )

+      { ImageFilledPolygon($this->Picture,$Points,count($Points)/2,$FillColor); }

+

+     if ( !$NoBorder )

+      {

+       $Points = $Backup;

+

+       $BorderSettings = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha);

+       for($i=0;$i<=count($Points)-1;$i=$i+2)

+        {

+         if ( isset($Points[$i+2]) )

+          {

+           if ( !($Points[$i] == $Points[$i+2] && $Points[$i] == $SkipX ) && !($Points[$i+1] == $Points[$i+3] && $Points[$i+1] == $SkipY ) )

+            $this->drawLine($Points[$i],$Points[$i+1],$Points[$i+2],$Points[$i+3],$BorderSettings);

+          }

+         else

+          {

+           if ( !($Points[$i] == $Points[0] && $Points[$i] == $SkipX ) && !($Points[$i+1] == $Points[1] && $Points[$i+1] == $SkipY ) )

+            $this->drawLine($Points[$i],$Points[$i+1],$Points[0],$Points[1],$BorderSettings);

+          }

+        }

+      }

+

+     $this->Shadow = $RestoreShadow;

+    }

+

+   /* Apply AALias correction to the rounded box boundaries */

+   function offsetCorrection($Value,$Mode)

+    {

+     $Value = round($Value,1);

+

+     if ( $Value == 0 && $Mode == 1 ) { return(.9); }

+     if ( $Value == 0 ) { return(0); }

+

+     if ( $Mode == 1) 

+      { if ( $Value == 1 ) { return(.9); }; if ( $Value == .1 ) { return(.9); }; if ( $Value == .2 ) { return(.8); }; if ( $Value == .3 ) { return(.8); }; if ( $Value == .4 ) { return(.7); }; if ( $Value == .5 ) { return(.5); }; if ( $Value == .6 ) { return(.8); }; if ( $Value == .7 ) { return(.7); }; if ( $Value == .8 ) { return(.6); }; if ( $Value == .9 ) { return(.9); }; }

+

+     if ( $Mode == 2) 

+      { if ( $Value == 1 ) { return(.9); }; if ( $Value == .1 ) { return(.1); }; if ( $Value == .2 ) { return(.2); }; if ( $Value == .3 ) { return(.3); }; if ( $Value == .4 ) { return(.4); }; if ( $Value == .5 ) { return(.5); }; if ( $Value == .6 ) { return(.8); }; if ( $Value == .7 ) { return(.7); }; if ( $Value == .8 ) { return(.8); }; if ( $Value == .9 ) { return(.9); }; }

+

+     if ( $Mode == 3) 

+      { if ( $Value == 1 ) { return(.1); }; if ( $Value == .1 ) { return(.1); }; if ( $Value == .2 ) { return(.2); }; if ( $Value == .3 ) { return(.3); }; if ( $Value == .4 ) { return(.4); }; if ( $Value == .5 ) { return(.9); }; if ( $Value == .6 ) { return(.6); }; if ( $Value == .7 ) { return(.7); }; if ( $Value == .8 ) { return(.4); }; if ( $Value == .9 ) { return(.5); }; }

+

+     if ( $Mode == 4) 

+      { if ( $Value == 1 ) { return(-1); }; if ( $Value == .1 ) { return(.1); }; if ( $Value == .2 ) { return(.2); }; if ( $Value == .3 ) { return(.3); }; if ( $Value == .4 ) { return(.1); }; if ( $Value == .5 ) { return(-.1); }; if ( $Value == .6 ) { return(.8); }; if ( $Value == .7 ) { return(.1); }; if ( $Value == .8 ) { return(.1); }; if ( $Value == .9 ) { return(.1); }; }

+    }

+

+   /* Draw a rectangle with rounded corners */

+   function drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$Format="")

+    {

+     $R	    = isset($Format["R"]) ? $Format["R"] : 0;

+     $G	    = isset($Format["G"]) ? $Format["G"] : 0;

+     $B	    = isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+

+     list($X1,$Y1,$X2,$Y2) = $this->fixBoxCoordinates($X1,$Y1,$X2,$Y2);

+

+     if ( $X2 - $X1 < $Radius ) { $Radius = floor((($X2-$X1))/2); }

+     if ( $Y2 - $Y1 < $Radius ) { $Radius = floor((($Y2-$Y1))/2); }

+

+     $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"NoBorder"=>TRUE);

+

+     if ( $Radius <= 0 ) { $this->drawRectangle($X1,$Y1,$X2,$Y2,$Color); return(0); }

+

+     if ( $this->Antialias )

+      {

+       $this->drawLine($X1+$Radius,$Y1,$X2-$Radius,$Y1,$Color);

+       $this->drawLine($X2,$Y1+$Radius,$X2,$Y2-$Radius,$Color);

+       $this->drawLine($X2-$Radius,$Y2,$X1+$Radius,$Y2,$Color);

+       $this->drawLine($X1,$Y1+$Radius,$X1,$Y2-$Radius,$Color);

+      }

+     else

+      {

+       $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);

+       imageline($this->Picture,$X1+$Radius,$Y1,$X2-$Radius,$Y1,$Color);

+       imageline($this->Picture,$X2,$Y1+$Radius,$X2,$Y2-$Radius,$Color);

+       imageline($this->Picture,$X2-$Radius,$Y2,$X1+$Radius,$Y2,$Color);

+       imageline($this->Picture,$X1,$Y1+$Radius,$X1,$Y2-$Radius,$Color);

+      }

+

+     $Step = 360 / (2 * PI * $Radius);

+     for($i=0;$i<=90;$i=$i+$Step)

+      {

+       $X = cos(($i+180)*PI/180) * $Radius + $X1 + $Radius;

+       $Y = sin(($i+180)*PI/180) * $Radius + $Y1 + $Radius;

+       $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));

+

+       $X = cos(($i+90)*PI/180) * $Radius + $X1 + $Radius;

+       $Y = sin(($i+90)*PI/180) * $Radius + $Y2 - $Radius;

+       $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));

+

+       $X = cos($i*PI/180) * $Radius + $X2 - $Radius;

+       $Y = sin($i*PI/180) * $Radius + $Y2 - $Radius;

+       $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));

+

+       $X = cos(($i+270)*PI/180) * $Radius + $X2 - $Radius;

+       $Y = sin(($i+270)*PI/180) * $Radius + $Y1 + $Radius;

+       $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));

+      }

+    }

+

+   /* Draw a rectangle with rounded corners */

+   function drawRoundedFilledRectangle($X1,$Y1,$X2,$Y2,$Radius,$Format="")

+    {

+     $R			= isset($Format["R"]) ? $Format["R"] : 0;

+     $G			= isset($Format["G"]) ? $Format["G"] : 0;

+     $B			= isset($Format["B"]) ? $Format["B"] : 0;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : -1;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : -1;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : -1;

+     $Alpha		= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+

+     if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }

+     if ( $BorderR == -1 ) { $BorderR = $R; $BorderG = $G; $BorderB = $B; }

+

+     list($X1,$Y1,$X2,$Y2) = $this->fixBoxCoordinates($X1,$Y1,$X2,$Y2);

+

+     if ( $X2 - $X1 < $Radius ) { $Radius = floor((($X2-$X1))/2); }

+     if ( $Y2 - $Y1 < $Radius ) { $Radius = floor((($Y2-$Y1))/2); }

+

+     $RestoreShadow = $this->Shadow;

+     if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )

+      {

+       $this->Shadow = FALSE;

+       $this->drawRoundedFilledRectangle($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,$Radius,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa));

+      }

+

+     $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"NoBorder"=>TRUE);

+

+     if ( $Radius <= 0 ) { $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Color); return(0); }

+

+     $YTop    = $Y1+$Radius;

+     $YBottom = $Y2-$Radius;

+

+     $Step = 360 / (2 * PI * $Radius);

+     $Positions = ""; $Radius--; $MinY = ""; $MaxY = "";

+     for($i=0;$i<=90;$i=$i+$Step)

+      {

+       $Xp1 = cos(($i+180)*PI/180) * $Radius + $X1 + $Radius;

+       $Xp2 = cos(((90-$i)+270)*PI/180) * $Radius + $X2 - $Radius;

+       $Yp  = floor(sin(($i+180)*PI/180) * $Radius + $YTop);

+       if ( $MinY == "" || $Yp > $MinY ) { $MinY = $Yp; }

+

+       if ( !isset($Positions[$Yp]) )

+        { $Positions[$Yp]["X1"] = $Xp1; $Positions[$Yp]["X2"] = $Xp2; }

+       else

+        { $Positions[$Yp]["X1"] = min($Positions[$Yp]["X1"],$Xp1); $Positions[$Yp]["X2"] = max($Positions[$Yp]["X2"],$Xp2); }

+

+       $Xp1 = cos(($i+90)*PI/180) * $Radius + $X1 + $Radius;

+       $Xp2 = cos((90-$i)*PI/180) * $Radius + $X2 - $Radius;

+       $Yp  = floor(sin(($i+90)*PI/180) * $Radius + $YBottom);

+       if ( $MaxY == "" || $Yp < $MaxY ) { $MaxY = $Yp; }

+

+       if ( !isset($Positions[$Yp]["Bottom"]) )

+        { $Positions[$Yp]["X1"] = $Xp1; $Positions[$Yp]["X2"] = $Xp2; }

+       else

+        { $Positions[$Yp]["X1"] = min($Positions[$Yp]["X1"],$Xp1); $Positions[$Yp]["X2"] = max($Positions[$Yp]["X2"],$Xp2); }

+      }

+

+     $ManualColor  = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);

+     foreach($Positions as $Yp => $Bounds)

+      {

+       $X1 = $Bounds["X1"]; $X1Dec = $this->getFirstDecimal($X1); if ( $X1Dec != 0 ) { $X1 = floor($X1)+1; }

+       $X2 = $Bounds["X2"]; $X2Dec = $this->getFirstDecimal($X2); if ( $X2Dec != 0 ) { $X2 = floor($X2)-1; }

+

+       imageline($this->Picture,$X1,$Yp,$X2,$Yp,$ManualColor);

+      }

+     $this->drawFilledRectangle($X1,$MinY+1,floor($X2),$MaxY-1,$Color);

+

+     $Radius++;

+     $this->drawRoundedRectangle($X1,$Y1,$X2+1,$Y2-1,$Radius,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));

+

+     $this->Shadow = $RestoreShadow;

+    }

+

+   /* Draw a rectangle with rounded corners */

+   function drawRoundedFilledRectangle_deprecated($X1,$Y1,$X2,$Y2,$Radius,$Format="")

+    {

+     $R			= isset($Format["R"]) ? $Format["R"] : 0;

+     $G			= isset($Format["G"]) ? $Format["G"] : 0;

+     $B			= isset($Format["B"]) ? $Format["B"] : 0;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : -1;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : -1;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : -1;

+     $Alpha		= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+

+     if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }

+     if ( $BorderR == -1 ) { $BorderR = $R; $BorderG = $G; $BorderB = $B; }

+

+     list($X1,$Y1,$X2,$Y2) = $this->fixBoxCoordinates($X1,$Y1,$X2,$Y2);

+

+     if ( $X2 - $X1 < $Radius ) { $Radius = floor((($X2-$X1)+2)/2); }

+     if ( $Y2 - $Y1 < $Radius ) { $Radius = floor((($Y2-$Y1)+2)/2); }

+

+     $RestoreShadow = $this->Shadow;

+     if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )

+      {

+       $this->Shadow = FALSE;

+       $this->drawRoundedFilledRectangle($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,$Radius,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa));

+      }

+

+     if ( $this->getFirstDecimal($X2) >= 5 )  { $XOffset2 = 1; } else { $XOffset2 = 0; }

+     if ( $this->getFirstDecimal($X1) <= 5 )  { $XOffset1 = 1; } else { $XOffset1 = 0; }

+

+     if ( !$this->Antialias ) { $XOffset1 = 1; $XOffset2 = 1; }

+

+     $YTop    = floor($Y1+$Radius);

+     $YBottom = floor($Y2-$Radius);

+

+     $this->drawFilledRectangle($X1-$XOffset1,$YTop,$X2+$XOffset2,$YBottom,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"NoBorder"=>TRUE));

+

+     $Step = 360 / (2 * PI * $Radius);

+     $Color  = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);

+     $Color2 = $this->allocateColor($this->Picture,255,0,0,$Alpha);

+     $Drawn = "";

+

+     if ( $Alpha < 100 )  { $Drawn[$YTop] = FALSE; }

+     if ( $Alpha < 100 )  { $Drawn[$YBottom] = TRUE; }

+     

+     for($i=0;$i<=90;$i=$i+$Step)

+      {

+       $Xp1 = cos(($i+180)*PI/180) * $Radius + $X1 + $Radius;

+       $Xp2 = cos(((90-$i)+270)*PI/180) * $Radius + $X2 - $Radius;

+       $Yp  = sin(($i+180)*PI/180) * $Radius + $YTop;

+

+       if ( $this->getFirstDecimal($Xp1) > 5 )  { $XOffset1 = 1; } else { $XOffset1 = 0; }

+       if ( $this->getFirstDecimal($Xp2) > 5 )  { $XOffset2 = 1; } else { $XOffset2 = 0; }

+       if ( $this->getFirstDecimal($Yp) > 5 )  { $YOffset = 1; } else { $YOffset = 0; }

+

+       if ( !isset($Drawn[$Yp+$YOffset]) || $Alpha == 100 )

+        imageline($this->Picture,$Xp1+$XOffset1,$Yp+$YOffset,$Xp2+$XOffset2,$Yp+$YOffset,$Color);

+

+       $Drawn[$Yp+$YOffset] = $Xp2;

+

+       $Xp1 = cos(($i+90)*PI/180) * $Radius + $X1 + $Radius;

+       $Xp2 = cos((90-$i)*PI/180) * $Radius + $X2 - $Radius;

+       $Yp  = sin(($i+90)*PI/180) * $Radius + $YBottom;

+

+       if ( $this->getFirstDecimal($Xp1) > 7 )  { $XOffset1 = 1; } else { $XOffset1 = 0; }

+       if ( $this->getFirstDecimal($Xp2) > 7 )  { $XOffset2 = 1; } else { $XOffset2 = 0; }

+       if ( $this->getFirstDecimal($Yp) > 5 )  { $YOffset = 1; } else { $YOffset = 0; }

+

+       if ( !isset($Drawn[$Yp+$YOffset]) || $Alpha == 100 )

+        imageline($this->Picture,$Xp1+$XOffset1,$Yp+$YOffset,$Xp2+$XOffset2,$Yp+$YOffset,$Color);

+

+       $Drawn[$Yp+$YOffset] = $Xp2;

+      }

+

+     $this->drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));

+

+     $this->Shadow = $RestoreShadow;

+    }

+

+   /* Draw a rectangle */

+   function drawRectangle($X1,$Y1,$X2,$Y2,$Format="")

+    {

+     $R		= isset($Format["R"]) ? $Format["R"] : 0;

+     $G		= isset($Format["G"]) ? $Format["G"] : 0;

+     $B		= isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha	= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $Ticks	= isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;

+     $NoAngle	= isset($Format["NoAngle"]) ? $Format["NoAngle"] : FALSE;

+

+     if ($X1 > $X2) { list($X1, $X2) = array($X2, $X1); }

+     if ($Y1 > $Y2) { list($Y1, $Y2) = array($Y2, $Y1); }

+

+     if ( $this->Antialias )

+      {

+       if ( $NoAngle )

+        {

+         $this->drawLine($X1+1,$Y1,$X2-1,$Y1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+         $this->drawLine($X2,$Y1+1,$X2,$Y2-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+         $this->drawLine($X2-1,$Y2,$X1+1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+         $this->drawLine($X1,$Y1+1,$X1,$Y2-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+        }

+       else

+        {

+         $this->drawLine($X1+1,$Y1,$X2-1,$Y1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+         $this->drawLine($X2,$Y1,$X2,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+         $this->drawLine($X2-1,$Y2,$X1+1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+         $this->drawLine($X1,$Y1,$X1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+        }

+      }

+     else

+      {

+       $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);

+       imagerectangle($this->Picture,$X1,$Y1,$X2,$Y2,$Color);

+      }

+    }

+

+   /* Draw a filled rectangle */

+   function drawFilledRectangle($X1,$Y1,$X2,$Y2,$Format="")

+    {

+     $R			= isset($Format["R"]) ? $Format["R"] : 0;

+     $G			= isset($Format["G"]) ? $Format["G"] : 0;

+     $B			= isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha		= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : -1;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : -1;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : -1;

+     $BorderAlpha	= isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $Ticks		= isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;

+     $NoAngle		= isset($Format["NoAngle"]) ? $Format["NoAngle"] : NULL;

+     $Dash		= isset($Format["Dash"]) ? $Format["Dash"] : FALSE;

+     $DashStep		= isset($Format["DashStep"]) ? $Format["DashStep"] : 4;

+     $DashR		= isset($Format["DashR"]) ? $Format["DashR"] : 0;

+     $DashG		= isset($Format["DashG"]) ? $Format["DashG"] : 0;

+     $DashB		= isset($Format["DashB"]) ? $Format["DashB"] : 0;

+     $NoBorder		= isset($Format["NoBorder"]) ? $Format["NoBorder"] : FALSE;

+

+     if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }

+

+     if ($X1 > $X2) { list($X1, $X2) = array($X2, $X1); }

+     if ($Y1 > $Y2) { list($Y1, $Y2) = array($Y2, $Y1); }

+

+     $RestoreShadow = $this->Shadow;

+     if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )

+      {

+       $this->Shadow = FALSE;

+       $this->drawFilledRectangle($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Ticks"=>$Ticks,"NoAngle"=>$NoAngle));

+      }

+

+     $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);

+     if ( $NoAngle )

+      {

+       imagefilledrectangle($this->Picture,ceil($X1)+1,ceil($Y1),floor($X2)-1,floor($Y2),$Color);

+       imageline($this->Picture,ceil($X1),ceil($Y1)+1,ceil($X1),floor($Y2)-1,$Color);

+       imageline($this->Picture,floor($X2),ceil($Y1)+1,floor($X2),floor($Y2)-1,$Color);

+      }

+     else

+      imagefilledrectangle($this->Picture,ceil($X1),ceil($Y1),floor($X2),floor($Y2),$Color);

+

+     if ( $Dash )

+      {

+       if ( $BorderR != -1 ) { $iX1=$X1+1; $iY1=$Y1+1; $iX2=$X2-1; $iY2=$Y2-1; } else { $iX1=$X1; $iY1=$Y1; $iX2=$X2; $iY2=$Y2; }

+

+       $Color = $this->allocateColor($this->Picture,$DashR,$DashG,$DashB,$Alpha);

+       $Y=$iY1-$DashStep;

+       for($X=$iX1; $X<=$iX2+($iY2-$iY1); $X=$X+$DashStep)

+        {

+         $Y=$Y+$DashStep;

+         if ( $X > $iX2 ) { $Xa = $X-($X-$iX2); $Ya = $iY1+($X-$iX2); } else { $Xa = $X; $Ya = $iY1; }

+         if ( $Y > $iY2 ) { $Xb = $iX1+($Y-$iY2); $Yb = $Y-($Y-$iY2); } else { $Xb = $iX1; $Yb = $Y; }

+         imageline($this->Picture,$Xa,$Ya,$Xb,$Yb,$Color);

+        }

+      }

+

+     if ( $this->Antialias && !$NoBorder )

+      {

+       if ( $X1 < ceil($X1) )

+        {

+         $AlphaA = $Alpha * (ceil($X1) - $X1);

+         $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA);

+         imageline($this->Picture,ceil($X1)-1,ceil($Y1),ceil($X1)-1,floor($Y2),$Color);

+        }

+

+       if ( $Y1 < ceil($Y1) )

+        {

+         $AlphaA = $Alpha * (ceil($Y1) - $Y1);

+         $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA);

+         imageline($this->Picture,ceil($X1),ceil($Y1)-1,floor($X2),ceil($Y1)-1,$Color);

+        }

+

+       if ( $X2 > floor($X2) )

+        {

+         $AlphaA = $Alpha * (.5-($X2 - floor($X2)));

+         $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA);

+         imageline($this->Picture,floor($X2)+1,ceil($Y1),floor($X2)+1,floor($Y2),$Color);

+        } 

+

+       if ( $Y2 > floor($Y2) )

+        {

+         $AlphaA = $Alpha * (.5-($Y2 - floor($Y2)));

+         $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA);

+         imageline($this->Picture,ceil($X1),floor($Y2)+1,floor($X2),floor($Y2)+1,$Color);

+        }

+      }

+

+     if ( $BorderR != -1 )

+      $this->drawRectangle($X1,$Y1,$X2,$Y2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$Ticks,"NoAngle"=>$NoAngle));

+

+     $this->Shadow = $RestoreShadow;

+    }

+

+   /* Draw a rectangular marker of the specified size */

+   function drawRectangleMarker($X,$Y,$Format="")

+    {

+     $Size = isset($Format["Size"]) ? $Format["Size"] : 4;

+

+     $HalfSize = floor($Size/2);

+     $this->drawFilledRectangle($X-$HalfSize,$Y-$HalfSize,$X+$HalfSize,$Y+$HalfSize,$Format);

+    }

+

+   /* Drawn a spline based on the bezier function */

+   function drawSpline($Coordinates,$Format="")

+    {

+     $R		= isset($Format["R"]) ? $Format["R"] : 0;

+     $G		= isset($Format["G"]) ? $Format["G"] : 0;

+     $B		= isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha	= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $Force	= isset($Format["Force"]) ? $Format["Force"] : 30;

+     $Forces	= isset($Format["Forces"]) ? $Format["Forces"] : NULL;

+     $ShowC	= isset($Format["ShowControl"]) ? $Format["ShowControl"] : FALSE;

+     $Ticks	= isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;

+     $PathOnly	= isset($Format["PathOnly"]) ? $Format["PathOnly"] : FALSE;

+     $Weight	= isset($Format["Weight"]) ? $Format["Weight"] : NULL;

+

+     $Cpt = NULL; $Mode = NULL; $Result = "";

+     for($i=1;$i<=count($Coordinates)-1;$i++)

+      {

+       $X1 = $Coordinates[$i-1][0]; $Y1 = $Coordinates[$i-1][1];

+       $X2 = $Coordinates[$i][0];   $Y2 = $Coordinates[$i][1];

+

+       if ( $Forces != NULL ) { $Force = $Forces[$i]; }

+

+       /* First segment */

+       if ( $i == 1 )

+        { $Xv1 = $X1; $Yv1 = $Y1; }

+       else

+        {

+         $Angle1 = $this->getAngle($XLast,$YLast,$X1,$Y1);

+         $Angle2 = $this->getAngle($X1,$Y1,$X2,$Y2);

+         $XOff = cos($Angle2 * PI / 180) * $Force + $X1;

+         $YOff = sin($Angle2 * PI / 180) * $Force + $Y1;

+

+         $Xv1 = cos($Angle1 * PI / 180) * $Force + $XOff;

+         $Yv1 = sin($Angle1 * PI / 180) * $Force + $YOff;

+        }

+

+       /* Last segment */

+       if ( $i == count($Coordinates)-1 )

+        { $Xv2 = $X2; $Yv2 = $Y2; }

+       else

+        {

+         $Angle1 = $this->getAngle($X2,$Y2,$Coordinates[$i+1][0],$Coordinates[$i+1][1]);

+         $Angle2 = $this->getAngle($X1,$Y1,$X2,$Y2);

+         $XOff = cos(($Angle2+180) * PI / 180) * $Force + $X2;

+         $YOff = sin(($Angle2+180) * PI / 180) * $Force + $Y2;

+

+         $Xv2 = cos(($Angle1+180) * PI / 180) * $Force + $XOff;

+         $Yv2 = sin(($Angle1+180) * PI / 180) * $Force + $YOff;

+        }

+

+       $Path = $this->drawBezier($X1,$Y1,$X2,$Y2,$Xv1,$Yv1,$Xv2,$Yv2,$Format);

+       if ($PathOnly) { $Result[] = $Path; }

+

+       $XLast = $X1; $YLast = $Y1;

+      }

+

+     return($Result);

+    }

+

+   /* Draw a bezier curve with two controls points */

+   function drawBezier($X1,$Y1,$X2,$Y2,$Xv1,$Yv1,$Xv2,$Yv2,$Format="")

+    {

+     $R		= isset($Format["R"]) ? $Format["R"] : 0;

+     $G		= isset($Format["G"]) ? $Format["G"] : 0;

+     $B		= isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha	= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $ShowC	= isset($Format["ShowControl"]) ? $Format["ShowControl"] : FALSE;

+     $Segments	= isset($Format["Segments"]) ? $Format["Segments"] : NULL;

+     $Ticks	= isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;

+     $NoDraw    = isset($Format["NoDraw"]) ? $Format["NoDraw"] : FALSE;

+     $PathOnly  = isset($Format["PathOnly"]) ? $Format["PathOnly"] : FALSE;

+     $Weight    = isset($Format["Weight"]) ? $Format["Weight"] : NULL;

+     $DrawArrow		= isset($Format["DrawArrow"]) ? $Format["DrawArrow"] : FALSE;

+     $ArrowSize		= isset($Format["ArrowSize"]) ? $Format["ArrowSize"] : 10;

+     $ArrowRatio	= isset($Format["ArrowRatio"]) ? $Format["ArrowRatio"] : .5;

+     $ArrowTwoHeads	= isset($Format["ArrowTwoHeads"]) ? $Format["ArrowTwoHeads"] : FALSE;

+

+     if ( $Segments == NULL )

+      {

+       $Length    = $this->getLength($X1,$Y1,$X2,$Y2);

+       $Precision = ($Length*125)/1000;

+      }

+     else

+      $Precision = $Segments;

+

+     $P[0]["X"] = $X1;  $P[0]["Y"] = $Y1;

+     $P[1]["X"] = $Xv1; $P[1]["Y"] = $Yv1;

+     $P[2]["X"] = $Xv2; $P[2]["Y"] = $Yv2;

+     $P[3]["X"] = $X2;  $P[3]["Y"] = $Y2;

+

+     /* Compute the bezier points */

+     $Q = ""; $ID = 0; $Path = "";

+     for($i=0;$i<=$Precision;$i=$i+1)

+      {

+       $u = $i / $Precision;

+

+       $C    = "";

+       $C[0] = (1 - $u) * (1 - $u) * (1 - $u);

+       $C[1] = ($u * 3) * (1 - $u) * (1 - $u);

+       $C[2] = 3 * $u * $u * (1 - $u);

+       $C[3] = $u * $u * $u;

+

+       for($j=0;$j<=3;$j++)

+        {

+         if ( !isset($Q[$ID]) ) { $Q[$ID] = ""; }

+         if ( !isset($Q[$ID]["X"]) ) { $Q[$ID]["X"] = 0; }

+         if ( !isset($Q[$ID]["Y"]) ) { $Q[$ID]["Y"] = 0; }

+

+         $Q[$ID]["X"] = $Q[$ID]["X"] + $P[$j]["X"] * $C[$j];

+         $Q[$ID]["Y"] = $Q[$ID]["Y"] + $P[$j]["Y"] * $C[$j];

+        }

+       $ID++;

+      }        

+     $Q[$ID]["X"] = $X2; $Q[$ID]["Y"] = $Y2;

+

+     if ( !$NoDraw )

+      {

+       /* Display the control points */

+       if ( $ShowC && !$PathOnly )

+        {

+         $Xv1 = floor($Xv1); $Yv1 = floor($Yv1); $Xv2 = floor($Xv2); $Yv2 = floor($Yv2);

+

+         $this->drawLine($X1,$Y1,$X2,$Y2,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>30));

+

+         $MyMarkerSettings = array("R"=>255,"G"=>0,"B"=>0,"BorderR"=>255,"BorderB"=>255,"BorderG"=>255,"Size"=>4);

+         $this->drawRectangleMarker($Xv1,$Yv1,$MyMarkerSettings);

+         $this->drawText($Xv1+4,$Yv1,"v1");

+         $MyMarkerSettings = array("R"=>0,"G"=>0,"B"=>255,"BorderR"=>255,"BorderB"=>255,"BorderG"=>255,"Size"=>4);

+         $this->drawRectangleMarker($Xv2,$Yv2,$MyMarkerSettings);

+         $this->drawText($Xv2+4,$Yv2,"v2");

+        }

+

+       /* Draw the bezier */

+       $LastX = NULL; $LastY = NULL; $Cpt = NULL; $Mode = NULL; $ArrowS = NULL;

+       foreach ($Q as $Key => $Point)

+        {

+         $X = $Point["X"]; $Y = $Point["Y"];

+

+         /* Get the first segment */

+         if ( $ArrowS == NULL && $LastX != NULL && $LastY != NULL )

+          { $ArrowS["X2"] = $LastX; $ArrowS["Y2"] = $LastY; $ArrowS["X1"] = $X; $ArrowS["Y1"] = $Y; }

+

+         if ( $LastX != NULL && $LastY != NULL && !$PathOnly)

+          list($Cpt,$Mode) = $this->drawLine($LastX,$LastY,$X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Cpt"=>$Cpt,"Mode"=>$Mode,"Weight"=>$Weight));

+

+         /* Get the last segment */

+         $ArrowE["X1"] = $LastX; $ArrowE["Y1"] = $LastY; $ArrowE["X2"] = $X; $ArrowE["Y2"] = $Y;

+

+         $LastX = $X; $LastY = $Y;

+        }

+

+       if ( $DrawArrow && !$PathOnly )

+        {

+         $ArrowSettings = array("FillR"=>$R,"FillG"=>$G,"FillB"=>$B,"Alpha"=>$Alpha,"Size"=>$ArrowSize,"Ratio"=>$ArrowRatio);

+         if ( $ArrowTwoHeads )

+          $this->drawArrow($ArrowS["X1"],$ArrowS["Y1"],$ArrowS["X2"],$ArrowS["Y2"],$ArrowSettings);

+

+         $this->drawArrow($ArrowE["X1"],$ArrowE["Y1"],$ArrowE["X2"],$ArrowE["Y2"],$ArrowSettings);

+        }

+      }

+     return($Q);

+    }

+

+   /* Draw a line between two points */

+   function drawLine($X1,$Y1,$X2,$Y2,$Format="")

+    {

+     $R	    = isset($Format["R"]) ? $Format["R"] : 0;

+     $G	    = isset($Format["G"]) ? $Format["G"] : 0;

+     $B	    = isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;

+     $Cpt   = isset($Format["Cpt"]) ? $Format["Cpt"] : 1;

+     $Mode  = isset($Format["Mode"]) ? $Format["Mode"] : 1;

+     $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL;

+

+     if ( $this->Antialias == FALSE && $Ticks == NULL )

+      {

+       if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )

+        {

+         $ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$this->Shadowa);

+         imageline($this->Picture,$X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,$ShadowColor);

+        }

+

+       $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);

+       imageline($this->Picture,$X1,$Y1,$X2,$Y2,$Color);

+       return(0);

+      }

+

+     $Distance = sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1));  

+     if ( $Distance == 0 ) { return(-1); }

+

+     /* Derivative algorithm for overweighted lines, re-route to polygons primitives */

+     if ( $Weight != NULL )

+      {

+       $Angle        = $this->getAngle($X1,$Y1,$X2,$Y2);

+       $PolySettings = array ("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderAlpha"=>$Alpha);

+

+       if ( $Ticks == NULL )

+        {

+         $Points   = ""; 

+         $Points[] = cos(deg2rad($Angle-90)) * $Weight + $X1; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Y1;

+         $Points[] = cos(deg2rad($Angle+90)) * $Weight + $X1; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Y1;

+         $Points[] = cos(deg2rad($Angle+90)) * $Weight + $X2; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Y2;

+         $Points[] = cos(deg2rad($Angle-90)) * $Weight + $X2; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Y2;

+

+         $this->drawPolygon($Points,$PolySettings);

+        }

+       else

+        {

+         for($i=0;$i<=$Distance;$i=$i+$Ticks*2)

+          {

+           $Xa = (($X2-$X1)/$Distance) * $i + $X1; $Ya = (($Y2-$Y1)/$Distance) * $i + $Y1;

+           $Xb = (($X2-$X1)/$Distance) * ($i+$Ticks) + $X1; $Yb = (($Y2-$Y1)/$Distance) * ($i+$Ticks) + $Y1;

+

+           $Points   = ""; 

+           $Points[] = cos(deg2rad($Angle-90)) * $Weight + $Xa; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Ya;

+           $Points[] = cos(deg2rad($Angle+90)) * $Weight + $Xa; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Ya;

+           $Points[] = cos(deg2rad($Angle+90)) * $Weight + $Xb; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Yb;

+           $Points[] = cos(deg2rad($Angle-90)) * $Weight + $Xb; $Points[] = sin(deg2rad($Angle-90)) * $Weight 	+ $Yb;

+

+           $this->drawPolygon($Points,$PolySettings);

+          }

+        }

+

+       return(1);

+      }

+

+     $XStep = ($X2-$X1) / $Distance;

+     $YStep = ($Y2-$Y1) / $Distance;

+

+     for($i=0;$i<=$Distance;$i++)

+      {

+       $X = $i * $XStep + $X1;

+       $Y = $i * $YStep + $Y1;

+

+       if ( $Ticks != NULL )

+        {

+         if ( $Cpt % $Ticks == 0 )

+          { $Cpt = 0; if ( $Mode == 1 ) { $Mode = 0; } else { $Mode = 1; } }

+

+         if ( $Mode == 1 )

+          $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));

+

+         $Cpt++;

+        }

+       else

+        $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));

+      }

+     return(array($Cpt,$Mode));

+    }

+

+   /* Draw a circle */

+   function drawCircle($Xc,$Yc,$Height,$Width,$Format="")

+    {

+     $R	    = isset($Format["R"]) ? $Format["R"] : 0;

+     $G	    = isset($Format["G"]) ? $Format["G"] : 0;

+     $B	    = isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;

+

+     $Height	= abs($Height);

+     $Width	= abs($Width);

+

+     if ( $Height == 0 ) { $Height = 1; }

+     if ( $Width == 0 )  { $Width = 1; }

+     $Xc = floor($Xc); $Yc = floor($Yc);

+

+     $RestoreShadow = $this->Shadow;

+     if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )

+      {

+       $this->Shadow = FALSE;

+       $this->drawCircle($Xc+$this->ShadowX,$Yc+$this->ShadowY,$Height,$Width,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Ticks"=>$Ticks));

+      }

+

+     if ( $Width == 0 ) { $Width = $Height; }

+     if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; }

+     if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; }

+     if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; }

+

+     $Step = 360 / (2 * PI * max($Width,$Height));

+     $Mode = 1; $Cpt = 1;

+     for($i=0;$i<=360;$i=$i+$Step)

+      {

+       $X = cos($i*PI/180) * $Height + $Xc;

+       $Y = sin($i*PI/180) * $Width + $Yc;

+

+       if ( $Ticks != NULL )

+        {

+         if ( $Cpt % $Ticks == 0 )

+          { $Cpt = 0; if ( $Mode == 1 ) { $Mode = 0; } else { $Mode = 1; } }

+

+         if ( $Mode == 1 )

+          $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));

+

+         $Cpt++;

+        }

+       else

+        $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));

+

+      }

+     $this->Shadow = $RestoreShadow;

+    }

+

+   /* Draw a filled circle */

+   function drawFilledCircle($X,$Y,$Radius,$Format="")

+    {

+     $R			= isset($Format["R"]) ? $Format["R"] : 0;

+     $G			= isset($Format["G"]) ? $Format["G"] : 0;

+     $B			= isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha		= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : -1;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : -1;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : -1;

+     $BorderAlpha	= isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha;

+     $Ticks     	= isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;

+     $Surrounding 	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+

+     if ( $Radius == 0 ) { $Radius = 1; }

+     if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }

+     $X = floor($X); $Y = floor($Y);

+

+     $Radius = abs($Radius);

+

+     $RestoreShadow = $this->Shadow;

+     if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )

+      {

+       $this->Shadow = FALSE;

+       $this->drawFilledCircle($X+$this->ShadowX,$Y+$this->ShadowY,$Radius,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Ticks"=>$Ticks));

+      }

+

+     $this->Mask  = "";

+     $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);

+     for ($i=0; $i<=$Radius*2; $i++)

+      {

+       $Slice  = sqrt($Radius * $Radius - ($Radius - $i) * ($Radius - $i));

+       $XPos   = floor($Slice);

+       $YPos   = $Y + $i - $Radius;

+       $AAlias = $Slice - floor($Slice);

+

+       $this->Mask[$X-$XPos][$YPos] = TRUE;

+       $this->Mask[$X+$XPos][$YPos] = TRUE;

+       imageline($this->Picture,$X-$XPos,$YPos,$X+$XPos,$YPos,$Color);

+      }

+     if ( $this->Antialias )

+      $this->drawCircle($X,$Y,$Radius,$Radius,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+

+     $this->Mask = "";

+

+     if ( $BorderR != -1 )

+      $this->drawCircle($X,$Y,$Radius,$Radius,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$Ticks));

+

+     $this->Shadow	= $RestoreShadow;

+    }

+

+   /* Write text */

+   function drawText($X,$Y,$Text,$Format="")

+    {

+     $R			= isset($Format["R"]) ? $Format["R"] : $this->FontColorR;

+     $G			= isset($Format["G"]) ? $Format["G"] : $this->FontColorG;

+     $B			= isset($Format["B"]) ? $Format["B"] : $this->FontColorB;

+     $Angle		= isset($Format["Angle"]) ? $Format["Angle"] : 0;

+     $Align		= isset($Format["Align"]) ? $Format["Align"] : TEXT_ALIGN_BOTTOMLEFT;

+     $Alpha		= isset($Format["Alpha"]) ? $Format["Alpha"] : $this->FontColorA;

+     $FontName		= isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName;

+     $FontSize		= isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize;

+     $ShowOrigine	= isset($Format["ShowOrigine"]) ? $Format["ShowOrigine"] : FALSE;

+     $TOffset		= isset($Format["TOffset"]) ? $Format["TOffset"] : 2;

+     $DrawBox		= isset($Format["DrawBox"]) ? $Format["DrawBox"] : FALSE;

+     $DrawBoxBorder	= isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : TRUE;

+     $BorderOffset	= isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 6;

+     $BoxRounded	= isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : FALSE;

+     $RoundedRadius	= isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 6;

+     $BoxR		= isset($Format["BoxR"]) ? $Format["BoxR"] : 255;

+     $BoxG		= isset($Format["BoxG"]) ? $Format["BoxG"] : 255;

+     $BoxB		= isset($Format["BoxB"]) ? $Format["BoxB"] : 255;

+     $BoxAlpha		= isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 50;

+     $BoxSurrounding	= isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : "";

+     $BoxBorderR	= isset($Format["BoxR"]) ? $Format["BoxR"] : 0;

+     $BoxBorderG	= isset($Format["BoxG"]) ? $Format["BoxG"] : 0;

+     $BoxBorderB	= isset($Format["BoxB"]) ? $Format["BoxB"] : 0;

+     $BoxBorderAlpha	= isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 50;

+     $NoShadow		= isset($Format["NoShadow"]) ? $Format["NoShadow"] : FALSE;

+

+     $Shadow = $this->Shadow;

+     if ( $NoShadow ) { $this->Shadow = FALSE; }

+

+     if ( $BoxSurrounding != "" ) { $BoxBorderR = $BoxR - $BoxSurrounding; $BoxBorderG = $BoxG - $BoxSurrounding; $BoxBorderB = $BoxB - $BoxSurrounding; $BoxBorderAlpha = $Boxalpha; }

+

+     if ( $ShowOrigine )

+      {

+       $MyMarkerSettings = array("R"=>255,"G"=>0,"B"=>0,"BorderR"=>255,"BorderB"=>255,"BorderG"=>255,"Size"=>4);

+       $this->drawRectangleMarker($X,$Y,$MyMarkerSettings);

+      }

+

+     $TxtPos = $this->getTextBox($X,$Y,$FontName,$FontSize,$Angle,$Text);

+

+     if ( $DrawBox && ($Angle == 0 || $Angle == 90 || $Angle == 180 || $Angle == 270))

+      {

+       $T[0]["X"]=0;$T[0]["Y"]=0;$T[1]["X"]=0;$T[1]["Y"]=0;$T[2]["X"]=0;$T[2]["Y"]=0;$T[3]["X"]=0;$T[3]["Y"]=0;

+       if ( $Angle == 0 ) { $T[0]["X"]=-$TOffset;$T[0]["Y"]=$TOffset;$T[1]["X"]=$TOffset;$T[1]["Y"]=$TOffset;$T[2]["X"]=$TOffset;$T[2]["Y"]=-$TOffset;$T[3]["X"]=-$TOffset;$T[3]["Y"]=-$TOffset; }

+

+       $X1 = min($TxtPos[0]["X"],$TxtPos[1]["X"],$TxtPos[2]["X"],$TxtPos[3]["X"]) - $BorderOffset + 3;

+       $Y1 = min($TxtPos[0]["Y"],$TxtPos[1]["Y"],$TxtPos[2]["Y"],$TxtPos[3]["Y"]) - $BorderOffset;

+       $X2 = max($TxtPos[0]["X"],$TxtPos[1]["X"],$TxtPos[2]["X"],$TxtPos[3]["X"]) + $BorderOffset + 3;

+       $Y2 = max($TxtPos[0]["Y"],$TxtPos[1]["Y"],$TxtPos[2]["Y"],$TxtPos[3]["Y"]) + $BorderOffset - 3;

+

+       $X1 = $X1 - $TxtPos[$Align]["X"] + $X + $T[0]["X"];

+       $Y1 = $Y1 - $TxtPos[$Align]["Y"] + $Y + $T[0]["Y"];

+       $X2 = $X2 - $TxtPos[$Align]["X"] + $X + $T[0]["X"];

+       $Y2 = $Y2 - $TxtPos[$Align]["Y"] + $Y + $T[0]["Y"];

+

+       $Settings = array("R"=>$BoxR,"G"=>$BoxG,"B"=>$BoxB,"Alpha"=>$BoxAlpha,"BorderR"=>$BoxBorderR,"BorderG"=>$BoxBorderG,"BorderB"=>$BoxBorderB,"BorderAlpha"=>$BoxBorderAlpha);

+

+       if ( $BoxRounded )

+        { $this->drawRoundedFilledRectangle($X1,$Y1,$X2,$Y2,$RoundedRadius,$Settings); }

+       else

+        { $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Settings); }

+      }

+

+     $X = $X - $TxtPos[$Align]["X"] + $X;

+     $Y = $Y - $TxtPos[$Align]["Y"] + $Y;

+

+     if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )

+      {

+       $C_ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$this->Shadowa);

+       imagettftext($this->Picture,$FontSize,$Angle,$X+$this->ShadowX,$Y+$this->ShadowY,$C_ShadowColor,$FontName,$Text);

+      }

+

+     $C_TextColor = $this->AllocateColor($this->Picture,$R,$G,$B,$Alpha);

+     imagettftext($this->Picture,$FontSize,$Angle,$X,$Y,$C_TextColor,$FontName,$Text);

+

+     $this->Shadow = $Shadow;

+

+     return($TxtPos);

+    }

+

+   /* Draw a gradient within a defined area */

+   function drawGradientArea($X1,$Y1,$X2,$Y2,$Direction,$Format="")

+    {

+     $StartR	= isset($Format["StartR"]) ? $Format["StartR"] : 90;

+     $StartG	= isset($Format["StartG"]) ? $Format["StartG"] : 90;

+     $StartB	= isset($Format["StartB"]) ? $Format["StartB"] : 90;

+     $EndR	= isset($Format["EndR"]) ? $Format["EndR"] : 0;

+     $EndG	= isset($Format["EndG"]) ? $Format["EndG"] : 0;

+     $EndB	= isset($Format["EndB"]) ? $Format["EndB"] : 0;

+     $Alpha	= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $Levels	= isset($Format["Levels"]) ? $Format["Levels"] : NULL;

+

+     $Shadow = $this->Shadow;

+     $this->Shadow = FALSE;

+

+     if ( $StartR == $EndR && $StartG == $EndG && $StartB == $EndB )

+      {

+       $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,array("R"=>$StartR,"G"=>$StartG,"B"=>$StartB,"Alpha"=>$Alpha));

+       return(0);

+      }

+

+     if ( $Levels != NULL )

+      { $EndR=$StartR+$Levels; $EndG=$StartG+$Levels; $EndB=$StartB+$Levels; }

+

+     if ($X1 > $X2) { list($X1, $X2) = array($X2, $X1); }

+     if ($Y1 > $Y2) { list($Y1, $Y2) = array($Y2, $Y1); }

+

+     if ( $Direction == DIRECTION_VERTICAL )   { $Width = abs($Y2-$Y1); }

+     if ( $Direction == DIRECTION_HORIZONTAL ) { $Width = abs($X2-$X1); }

+

+     $Step     = max(abs($EndR-$StartR),abs($EndG-$StartG),abs($EndB-$StartB));

+     $StepSize = $Width/$Step;

+     $RStep    = ($EndR-$StartR)/$Step;

+     $GStep    = ($EndG-$StartG)/$Step;

+     $BStep    = ($EndB-$StartB)/$Step;

+

+     $R=$StartR;$G=$StartG;$B=$StartB;

+     switch($Direction)

+      {

+       case DIRECTION_VERTICAL:

+        $StartY = $Y1; $EndY = floor($Y2)+1; $LastY2 = $StartY;

+        for($i=0;$i<=$Step;$i++)

+         {

+          $Y2 = floor($StartY + ($i * $StepSize));

+

+          if ($Y2 > $EndY) { $Y2 = $EndY; }

+          if (($Y1 != $Y2 && $Y1 < $Y2) || $Y2 == $EndY)

+           {

+            $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);

+            $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Color);

+            $LastY2 = max($LastY2,$Y2);

+            $Y1 = $Y2+1;

+           }

+          $R = $R + $RStep; $G = $G + $GStep; $B = $B + $BStep;

+         }

+        if ( $LastY2 < $EndY && isset($Color)) { for ($i=$LastY2+1;$i<=$EndY;$i++) { $this->drawLine($X1,$i,$X2,$i,$Color); } }

+        break;

+

+       case DIRECTION_HORIZONTAL:

+        $StartX = $X1; $EndX = $X2;

+        for($i=0;$i<=$Step;$i++)

+         {

+          $X2 = floor($StartX + ($i * $StepSize));

+

+          if ($X2 > $EndX) { $X2 = $EndX; }

+          if (($X1 != $X2 && $X1 < $X2) || $X2 == $EndX)

+           {

+            $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);

+            $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Color);

+            $X1 = $X2+1;

+           }

+          $R = $R + $RStep; $G = $G + $GStep; $B = $B + $BStep; 

+         }

+        if ( $X2 < $EndX && isset($Color)) { $this->drawFilledRectangle($X2,$Y1,$EndX,$Y2,$Color); }

+        break;

+      }

+

+     $this->Shadow = $Shadow;

+

+    }

+

+   /* Draw an aliased pixel */

+   function drawAntialiasPixel($X,$Y,$Format="")

+    {

+     $R     = isset($Format["R"]) ? $Format["R"] : 0;

+     $G     = isset($Format["G"]) ? $Format["G"] : 0;

+     $B     = isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+

+     if ( $X < 0 || $Y < 0 || $X >= $this->XSize || $Y >= $this->YSize )

+      return(-1);

+

+     if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; }

+     if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; }

+     if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; }

+

+     if ( !$this->Antialias )

+      {

+       if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )

+        {

+         $ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$this->Shadowa);

+         imagesetpixel($this->Picture,$X+$this->ShadowX,$Y+$this->ShadowY,$ShadowColor);

+        }

+

+       $PlotColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);

+       imagesetpixel($this->Picture,$X,$Y,$PlotColor);

+

+       return(0);

+      }

+

+     $Plot = "";

+     $Xi   = floor($X);

+     $Yi   = floor($Y);

+

+     if ( $Xi == $X && $Yi == $Y)

+      {

+       if ( $Alpha == 100 )

+        $this->drawAlphaPixel($X,$Y,100,$R,$G,$B);

+       else

+        $this->drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B);

+      }

+     else

+      {

+       $Alpha1 = (((1 - ($X - floor($X))) * (1 - ($Y - floor($Y))) * 100) / 100) * $Alpha;

+       if ( $Alpha1 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi,$Yi,$Alpha1,$R,$G,$B); }

+

+       $Alpha2 = ((($X - floor($X)) * (1 - ($Y - floor($Y))) * 100) / 100) * $Alpha;

+       if ( $Alpha2 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi+1,$Yi,$Alpha2,$R,$G,$B); }

+

+       $Alpha3 = (((1 - ($X - floor($X))) * ($Y - floor($Y)) * 100) / 100) * $Alpha;

+       if ( $Alpha3 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi,$Yi+1,$Alpha3,$R,$G,$B); }

+

+       $Alpha4 = ((($X - floor($X)) * ($Y - floor($Y)) * 100) / 100) * $Alpha;

+       if ( $Alpha4 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi+1,$Yi+1,$Alpha4,$R,$G,$B); }

+      }

+    }

+

+   /* Draw a semi-transparent pixel */

+   function drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B)

+    {

+     if ( isset($this->Mask[$X])) { if ( isset($this->Mask[$X][$Y]) ) { return(0); } }

+

+     if ( $X < 0 || $Y < 0 || $X >= $this->XSize || $Y >= $this->YSize )

+      return(-1);

+

+     if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; }

+     if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; }

+     if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; }

+

+     if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )

+      {

+       $AlphaFactor = floor(($Alpha / 100) * $this->Shadowa);

+       $ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$AlphaFactor);

+       imagesetpixel($this->Picture,$X+$this->ShadowX,$Y+$this->ShadowY,$ShadowColor);

+      }

+

+     $C_Aliased = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);

+     imagesetpixel($this->Picture,$X,$Y,$C_Aliased);

+    }

+

+   /* Convert apha to base 10 */

+   function convertAlpha($AlphaValue)

+    { return((127/100)*(100-$AlphaValue)); }

+

+   /* Allocate a color with transparency */

+   function allocateColor($Picture,$R,$G,$B,$Alpha=100)

+    {

+     if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; }

+     if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; }

+     if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; }

+     if ( $Alpha < 0 )  { $Alpha = 0; }

+     if ( $Alpha > 100) { $Alpha = 100; }

+

+     $Alpha = $this->convertAlpha($Alpha);

+     return(imagecolorallocatealpha($Picture,$R,$G,$B,$Alpha));

+    }

+

+   /* Load a PNG file and draw it over the chart */

+   function drawFromPNG($X,$Y,$FileName)

+    { $this->drawFromPicture(1,$FileName,$X,$Y); }

+

+   /* Load a GIF file and draw it over the chart */

+   function drawFromGIF($X,$Y,$FileName)

+    { $this->drawFromPicture(2,$FileName,$X,$Y); }

+

+   /* Load a JPEG file and draw it over the chart */

+   function drawFromJPG($X,$Y,$FileName)

+    { $this->drawFromPicture(3,$FileName,$X,$Y); }

+

+   function getPicInfo($FileName)

+    {

+     $Infos  = getimagesize($FileName);

+     $Width  = $Infos[0];

+     $Height = $Infos[1];

+     $Type   = $Infos["mime"];

+

+     if ( $Type == "image/png") { $Type = 1; }

+     if ( $Type == "image/gif") { $Type = 2; }

+     if ( $Type == "image/jpeg ") { $Type = 3; }

+

+     return(array($Width,$Height,$Type));

+    }

+

+   /* Generic loader function for external pictures */

+   function drawFromPicture($PicType,$FileName,$X,$Y)

+    {

+     if ( file_exists($FileName))

+      {

+       list($Width,$Height) = $this->getPicInfo($FileName);

+

+       if ( $PicType == 1 )

+        { $Raster = imagecreatefrompng($FileName); }

+       elseif ( $PicType == 2 )

+        { $Raster = imagecreatefromgif($FileName); }

+       elseif ( $PicType == 3 )

+        { $Raster = imagecreatefromjpeg($FileName); }

+       else

+        { return(0); }

+

+

+       $RestoreShadow = $this->Shadow;

+       if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )

+        {

+         $this->Shadow = FALSE;

+         if ( $PicType == 3 )

+          $this->drawFilledRectangle($X+$this->ShadowX,$Y+$this->ShadowY,$X+$Width+$this->ShadowX,$Y+$Height+$this->ShadowY,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa));

+         else

+          {

+           $TranparentID = imagecolortransparent($Raster);

+           for ($Xc=0;$Xc<=$Width-1;$Xc++)

+            {

+             for ($Yc=0;$Yc<=$Height-1;$Yc++)

+              {

+               $RGBa   = imagecolorat($Raster,$Xc,$Yc);

+               $Values = imagecolorsforindex($Raster,$RGBa);

+               if ( $Values["alpha"] < 120 )

+                {

+                 $AlphaFactor = floor(($this->Shadowa / 100) * ((100 / 127) * (127-$Values["alpha"])));

+                 $this->drawAlphaPixel($X+$Xc+$this->ShadowX,$Y+$Yc+$this->ShadowY,$AlphaFactor,$this->ShadowR,$this->ShadowG,$this->ShadowB);

+                }

+              }

+            }

+          }

+        }

+       $this->Shadow = $RestoreShadow;

+

+       imagecopy($this->Picture,$Raster,$X,$Y,0,0,$Width,$Height);

+       imagedestroy($Raster);

+      }

+    }

+

+   /* Draw an arrow */

+   function drawArrow($X1,$Y1,$X2,$Y2,$Format="")

+    {

+     $FillR	= isset($Format["FillR"]) ? $Format["FillR"] : 0;

+     $FillG	= isset($Format["FillG"]) ? $Format["FillG"] : 0;

+     $FillB	= isset($Format["FillB"]) ? $Format["FillB"] : 0;

+     $BorderR	= isset($Format["BorderR"]) ? $Format["BorderR"] : $FillR;

+     $BorderG	= isset($Format["BorderG"]) ? $Format["BorderG"] : $FillG;

+     $BorderB	= isset($Format["BorderB"]) ? $Format["BorderB"] : $FillB;

+     $Alpha	= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $Size	= isset($Format["Size"]) ? $Format["Size"] : 10;

+     $Ratio	= isset($Format["Ratio"]) ? $Format["Ratio"] : .5;

+     $TwoHeads	= isset($Format["TwoHeads"]) ? $Format["TwoHeads"] : FALSE;

+     $Ticks	= isset($Format["Ticks"]) ? $Format["Ticks"] : FALSE;

+

+     /* Calculate the line angle */

+     $Angle = $this->getAngle($X1,$Y1,$X2,$Y2);

+

+     /* Override Shadow support, this will be managed internally */

+     $RestoreShadow = $this->Shadow;

+     if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )

+      {

+       $this->Shadow = FALSE;

+       $this->drawArrow($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,array("FillR"=>$this->ShadowR,"FillG"=>$this->ShadowG,"FillB"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Size"=>$Size,"Ratio"=>$Ratio,"TwoHeads"=>$TwoHeads,"Ticks"=>$Ticks));

+      }

+

+     /* Draw the 1st Head */

+     $TailX = cos(($Angle-180)*PI/180)*$Size+$X2;

+     $TailY = sin(($Angle-180)*PI/180)*$Size+$Y2;

+

+     $Points	= "";

+     $Points[]  = $X2; $Points[]  = $Y2;

+     $Points[]	= cos(($Angle-90)*PI/180)*$Size*$Ratio+$TailX; $Points[] = sin(($Angle-90)*PI/180)*$Size*$Ratio+$TailY;

+     $Points[]	= cos(($Angle-270)*PI/180)*$Size*$Ratio+$TailX; $Points[] = sin(($Angle-270)*PI/180)*$Size*$Ratio+$TailY;

+     $Points[]  = $X2; $Points[]  = $Y2;

+

+     /* Visual correction */

+     if ($Angle == 180 || $Angle == 360 ) { $Points[4] = $Points[2]; }

+     if ($Angle == 90 || $Angle == 270 ) { $Points[5] = $Points[3]; }

+

+     $ArrowColor = $this->allocateColor($this->Picture,$FillR,$FillG,$FillB,$Alpha);

+     ImageFilledPolygon($this->Picture,$Points,4,$ArrowColor);

+

+     $this->drawLine($Points[0],$Points[1],$Points[2],$Points[3],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));

+     $this->drawLine($Points[2],$Points[3],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));

+     $this->drawLine($Points[0],$Points[1],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));

+

+     /* Draw the second head */

+     if ( $TwoHeads )

+      {

+       $Angle = $this->getAngle($X2,$Y2,$X1,$Y1);

+

+       $TailX2 = cos(($Angle-180)*PI/180)*$Size+$X1;

+       $TailY2 = sin(($Angle-180)*PI/180)*$Size+$Y1;

+

+       $Points   = "";

+       $Points[] = $X1; $Points[]  = $Y1;

+       $Points[] = cos(($Angle-90)*PI/180)*$Size*$Ratio+$TailX2; $Points[] = sin(($Angle-90)*PI/180)*$Size*$Ratio+$TailY2;

+       $Points[] = cos(($Angle-270)*PI/180)*$Size*$Ratio+$TailX2; $Points[] = sin(($Angle-270)*PI/180)*$Size*$Ratio+$TailY2;

+       $Points[] = $X1; $Points[]  = $Y1;

+

+       /* Visual correction */

+       if ($Angle == 180 || $Angle == 360 ) { $Points[4] = $Points[2]; }

+       if ($Angle == 90 || $Angle == 270 ) { $Points[5] = $Points[3]; }

+

+       $ArrowColor = $this->allocateColor($this->Picture,$FillR,$FillG,$FillB,$Alpha);

+       ImageFilledPolygon($this->Picture,$Points,4,$ArrowColor);

+

+       $this->drawLine($Points[0],$Points[1],$Points[2],$Points[3],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));

+       $this->drawLine($Points[2],$Points[3],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));

+       $this->drawLine($Points[0],$Points[1],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));

+

+       $this->drawLine($TailX,$TailY,$TailX2,$TailY2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+      }

+     else

+      $this->drawLine($X1,$Y1,$TailX,$TailY,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+

+     /* Re-enable shadows */

+     $this->Shadow = $RestoreShadow;

+    }

+

+   /* Draw a label with associated arrow */

+   function drawArrowLabel($X1,$Y1,$Text,$Format="")

+    {

+     $FillR    = isset($Format["FillR"]) ? $Format["FillR"] : 0;

+     $FillG    = isset($Format["FillG"]) ? $Format["FillG"] : 0;

+     $FillB    = isset($Format["FillB"]) ? $Format["FillB"] : 0;

+     $BorderR  = isset($Format["BorderR"]) ? $Format["BorderR"] : $FillR;

+     $BorderG  = isset($Format["BorderG"]) ? $Format["BorderG"] : $FillG;

+     $BorderB  = isset($Format["BorderB"]) ? $Format["BorderB"] : $FillB;

+     $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName;

+     $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize;

+     $Alpha    = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $Length   = isset($Format["Length"]) ? $Format["Length"] : 50;

+     $Angle    = isset($Format["Angle"]) ? $Format["Angle"] : 315;

+     $Size     = isset($Format["Size"]) ? $Format["Size"] : 10;

+     $Position = isset($Format["Position"]) ? $Format["Position"] : POSITION_TOP;

+     $RoundPos = isset($Format["RoundPos"]) ? $Format["RoundPos"] : FALSE;

+     $Ticks    = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;

+

+     $Angle = $Angle % 360;

+

+     $X2 = sin(($Angle+180)*PI/180)*$Length+$X1;

+     $Y2 = cos(($Angle+180)*PI/180)*$Length+$Y1;

+

+     if ( $RoundPos && $Angle > 0 && $Angle < 180 ) { $Y2 = ceil($Y2); }

+     if ( $RoundPos && $Angle > 180 ) { $Y2 = floor($Y2); }

+

+     $this->drawArrow($X2,$Y2,$X1,$Y1,$Format);

+

+     $Size	= imagettfbbox($FontSize,0,$FontName,$Text);

+     $TxtWidth	= max(abs($Size[2]-$Size[0]),abs($Size[0]-$Size[6]));

+     $TxtHeight	= max(abs($Size[1]-$Size[7]),abs($Size[3]-$Size[1]));

+

+     if ( $Angle > 0 && $Angle < 180 )

+      {

+       $this->drawLine($X2,$Y2,$X2-$TxtWidth,$Y2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+       if ( $Position == POSITION_TOP )

+        $this->drawText($X2,$Y2-2,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Align"=>TEXT_ALIGN_BOTTOMRIGHT));

+       else

+        $this->drawText($X2,$Y2+4,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Align"=>TEXT_ALIGN_TOPRIGHT));

+      }

+     else

+      {

+       $this->drawLine($X2,$Y2,$X2+$TxtWidth,$Y2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+       if ( $Position == POSITION_TOP )

+        $this->drawText($X2,$Y2-2,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));

+       else

+        $this->drawText($X2,$Y2+4,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Align"=>TEXT_ALIGN_TOPLEFT));

+      }

+    }

+

+   /* Draw a progress bar filled with specified % */

+   function drawProgress($X,$Y,$Percent,$Format="")

+    {

+     if ( $Percent > 100 ) { $Percent = 100; }

+     if ( $Percent < 0 ) { $Percent = 0; }

+

+     $Width	= isset($Format["Width"]) ? $Format["Width"] : 200;

+     $Height	= isset($Format["Height"]) ? $Format["Height"] : 20;

+     $Orientation = isset($Format["Orientation"]) ? $Format["Orientation"] : ORIENTATION_HORIZONTAL;

+     $ShowLabel = isset($Format["ShowLabel"]) ? $Format["ShowLabel"] : FALSE;

+     $LabelPos	= isset($Format["LabelPos"]) ? $Format["LabelPos"] : LABEL_POS_INSIDE;

+     $Margin    = isset($Format["Margin"]) ? $Format["Margin"] : 10;

+     $R		= isset($Format["R"]) ? $Format["R"] : 130;

+     $G		= isset($Format["G"]) ? $Format["G"] : 130;

+     $B		= isset($Format["B"]) ? $Format["B"] : 130;

+     $RFade	= isset($Format["RFade"]) ? $Format["RFade"] : -1;

+     $GFade	= isset($Format["GFade"]) ? $Format["GFade"] : -1;

+     $BFade	= isset($Format["BFade"]) ? $Format["BFade"] : -1;

+     $BorderR	= isset($Format["BorderR"]) ? $Format["BorderR"] : $R;

+     $BorderG	= isset($Format["BorderG"]) ? $Format["BorderG"] : $G;

+     $BorderB	= isset($Format["BorderB"]) ? $Format["BorderB"] : $B;

+     $BoxBorderR = isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 0;

+     $BoxBorderG = isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 0;

+     $BoxBorderB = isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 0;

+     $BoxBackR	= isset($Format["BoxBackR"]) ? $Format["BoxBackR"] : 255;

+     $BoxBackG	= isset($Format["BoxBackG"]) ? $Format["BoxBackG"] : 255;

+     $BoxBackB	= isset($Format["BoxBackB"]) ? $Format["BoxBackB"] : 255;

+     $Alpha	= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : NULL;

+     $NoAngle	= isset($Format["NoAngle"]) ? $Format["NoAngle"] : FALSE;

+

+     if ( $RFade != -1 && $GFade != -1 && $BFade != -1 )

+      {

+       $RFade = (($RFade-$R)/100)*$Percent+$R;

+       $GFade = (($GFade-$G)/100)*$Percent+$G;

+       $BFade = (($BFade-$B)/100)*$Percent+$B;

+      }

+

+     if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; }

+     if ( $BoxSurrounding != NULL ) { $BoxBorderR = $BoxBackR + $Surrounding; $BoxBorderG = $BoxBackG + $Surrounding; $BoxBorderB = $BoxBackB + $Surrounding; }

+

+     if ( $Orientation == ORIENTATION_VERTICAL )

+      {

+       $InnerHeight = (($Height-2)/100)*$Percent;

+       $this->drawFilledRectangle($X,$Y,$X+$Width,$Y-$Height,array("R"=>$BoxBackR,"G"=>$BoxBackG,"B"=>$BoxBackB,"BorderR"=>$BoxBorderR,"BorderG"=>$BoxBorderG,"BorderB"=>$BoxBorderB,"NoAngle"=>$NoAngle));

+

+       $RestoreShadow = $this->Shadow; $this->Shadow  = FALSE;

+       if ( $RFade != -1 && $GFade != -1 && $BFade != -1 )

+        {

+         $GradientOptions = array("StartR"=>$RFade,"StartG"=>$GFade,"StartB"=>$BFade,"EndR"=>$R,"EndG"=>$G,"EndB"=>$B);

+         $this->drawGradientArea($X+1,$Y-1,$X+$Width-1,$Y-$InnerHeight,DIRECTION_VERTICAL,$GradientOptions);

+

+         if ( $Surrounding )

+          $this->drawRectangle($X+1,$Y-1,$X+$Width-1,$Y-$InnerHeight,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>$Surrounding));

+        }

+       else

+        $this->drawFilledRectangle($X+1,$Y-1,$X+$Width-1,$Y-$InnerHeight,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));

+

+       $this->Shadow = $RestoreShadow;

+

+       if ( $ShowLabel && $LabelPos == LABEL_POS_BOTTOM )	{ $this->drawText($X+($Width/2),$Y+$Margin,$Percent."%",array("Align"=>TEXT_ALIGN_TOPMIDDLE)); }

+       if ( $ShowLabel && $LabelPos == LABEL_POS_TOP )		{ $this->drawText($X+($Width/2),$Y-$Height-$Margin,$Percent."%",array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); }

+       if ( $ShowLabel && $LabelPos == LABEL_POS_INSIDE )	{ $this->drawText($X+($Width/2),$Y-$InnerHeight-$Margin,$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLELEFT,"Angle"=>90)); }

+       if ( $ShowLabel && $LabelPos == LABEL_POS_CENTER )	{ $this->drawText($X+($Width/2),$Y-($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"Angle"=>90)); }

+      }

+     else

+      {

+       if ( $Percent == 100 )

+        $InnerWidth = $Width-1;

+       else

+        $InnerWidth = (($Width-2)/100)*$Percent;

+

+       $this->drawFilledRectangle($X,$Y,$X+$Width,$Y+$Height,array("R"=>$BoxBackR,"G"=>$BoxBackG,"B"=>$BoxBackB,"BorderR"=>$BoxBorderR,"BorderG"=>$BoxBorderG,"BorderB"=>$BoxBorderB,"NoAngle"=>$NoAngle));

+

+       $RestoreShadow = $this->Shadow; $this->Shadow  = FALSE;

+       if ( $RFade != -1 && $GFade != -1 && $BFade != -1 )

+        {

+         $GradientOptions = array("StartR"=>$R,"StartG"=>$G,"StartB"=>$B,"EndR"=>$RFade,"EndG"=>$GFade,"EndB"=>$BFade);

+         $this->drawGradientArea($X+1,$Y+1,$X+$InnerWidth,$Y+$Height-1,DIRECTION_HORIZONTAL,$GradientOptions);

+

+         if ( $Surrounding )

+          $this->drawRectangle($X+1,$Y+1,$X+$InnerWidth,$Y+$Height-1,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>$Surrounding));

+        }

+       else

+        $this->drawFilledRectangle($X+1,$Y+1,$X+$InnerWidth,$Y+$Height-1,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));

+ 

+       $this->Shadow = $RestoreShadow;

+

+       if ( $ShowLabel && $LabelPos == LABEL_POS_LEFT )		{ $this->drawText($X-$Margin,$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); }

+       if ( $ShowLabel && $LabelPos == LABEL_POS_RIGHT )	{ $this->drawText($X+$Width+$Margin,$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLELEFT)); }

+       if ( $ShowLabel && $LabelPos == LABEL_POS_CENTER )	{ $this->drawText($X+($Width/2),$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE)); }

+       if ( $ShowLabel && $LabelPos == LABEL_POS_INSIDE )	{ $this->drawText($X+$InnerWidth+$Margin,$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLELEFT)); }

+      }

+    }

+

+   /* Get the legend box size */

+   function getLegendSize($Format="")

+    {

+     $FontName		= isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName;

+     $FontSize		= isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize;

+     $BoxSize		= isset($Format["BoxSize"]) ? $Format["BoxSize"] : 5;

+     $Margin		= isset($Format["Margin"]) ? $Format["Margin"] : 5;

+     $Style		= isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND;

+     $Mode		= isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL;

+     $BoxWidth		= isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 5;

+     $BoxHeight		= isset($Format["BoxHeight"]) ? $Format["BoxHeight"] : 5;

+     $IconAreaWidth	= isset($Format["IconAreaWidth"]) ? $Format["IconAreaWidth"] : $BoxWidth;

+     $IconAreaHeight	= isset($Format["IconAreaHeight"]) ? $Format["IconAreaHeight"] : $BoxHeight;

+     $XSpacing		= isset($Format["XSpacing"]) ? $Format["XSpacing"] : 5;

+

+     $Data = $this->DataSet->getData();

+

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] && isset($Serie["Picture"]))

+        {

+         list($PicWidth,$PicHeight) = $this->getPicInfo($Serie["Picture"]);

+         if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; }

+         if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; }

+        }

+      }

+

+     $YStep = max($this->FontSize,$IconAreaHeight) + 5;

+     $XStep = $IconAreaWidth + 5;

+     $XStep = $XSpacing;

+

+     $X=100; $Y=100;

+

+     $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X;

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         if ( $Mode == LEGEND_VERTICAL )

+          {

+           $BoxArray = $this->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Serie["Description"]);

+

+           if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }

+           if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }

+           if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }

+

+           $Lines = preg_split("/\n/",$Serie["Description"]);

+           $vY = $vY + max($this->FontSize*count($Lines),$IconAreaHeight) + 5;

+          }

+         elseif ( $Mode == LEGEND_HORIZONTAL )

+          {

+           $Lines = preg_split("/\n/",$Serie["Description"]);

+           $Width = "";

+           foreach($Lines as $Key => $Value)

+            {

+             $BoxArray = $this->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$FontName,$FontSize,0,$Value);

+

+             if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }

+             if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }

+             if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }

+

+             $Width[] = $BoxArray[1]["X"];

+            }

+

+           $vX=max($Width)+$XStep;

+          }

+        }

+      }

+     $vY=$vY-$YStep; $vX=$vX-$XStep;

+

+     $TopOffset  = $Y - $Boundaries["T"];

+     if ( $Boundaries["B"]-($vY+$IconAreaHeight) < $TopOffset ) { $Boundaries["B"] = $vY+$IconAreaHeight+$TopOffset; }

+

+     $Width  = ($Boundaries["R"]+$Margin) - ($Boundaries["L"]-$Margin);

+     $Height = ($Boundaries["B"]+$Margin) - ($Boundaries["T"]-$Margin);

+

+     return(array("Width"=>$Width,"Height"=>$Height));

+    }

+

+   /* Draw the legend of the active series */

+   function drawLegend($X,$Y,$Format="")

+    {

+     $Family	= isset($Format["Family"]) ? $Format["Family"] : LEGEND_FAMILY_BOX;

+     $FontName	= isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName;

+     $FontSize	= isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize;

+     $FontR	= isset($Format["FontR"]) ? $Format["FontR"] : $this->FontColorR;

+     $FontG	= isset($Format["FontG"]) ? $Format["FontG"] : $this->FontColorG;

+     $FontB	= isset($Format["FontB"]) ? $Format["FontB"] : $this->FontColorB;

+     $BoxWidth	= isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 5;

+     $BoxHeight	= isset($Format["BoxHeight"]) ? $Format["BoxHeight"] : 5;

+     $IconAreaWidth	= isset($Format["IconAreaWidth"]) ? $Format["IconAreaWidth"] : $BoxWidth;

+     $IconAreaHeight	= isset($Format["IconAreaHeight"]) ? $Format["IconAreaHeight"] : $BoxHeight;

+     $XSpacing	= isset($Format["XSpacing"]) ? $Format["XSpacing"] : 5;

+     $Margin	= isset($Format["Margin"]) ? $Format["Margin"] : 5;

+     $R		= isset($Format["R"]) ? $Format["R"] : 200;

+     $G		= isset($Format["G"]) ? $Format["G"] : 200;

+     $B		= isset($Format["B"]) ? $Format["B"] : 200;

+     $Alpha	= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $BorderR	= isset($Format["BorderR"]) ? $Format["BorderR"] : 255;

+     $BorderG	= isset($Format["BorderG"]) ? $Format["BorderG"] : 255;

+     $BorderB	= isset($Format["BorderB"]) ? $Format["BorderB"] : 255;

+     $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $Style	= isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND;

+     $Mode	= isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL;

+

+     if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; }

+

+     $Data = $this->DataSet->getData();

+

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] && isset($Serie["Picture"]))

+        {

+         list($PicWidth,$PicHeight) = $this->getPicInfo($Serie["Picture"]);

+         if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; }

+         if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; }

+        }

+      }

+

+

+     $YStep = max($this->FontSize,$IconAreaHeight) + 5;

+     $XStep = $IconAreaWidth + 5;

+     $XStep = $XSpacing;

+

+     $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X;

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         if ( $Mode == LEGEND_VERTICAL )

+          {

+           $BoxArray = $this->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Serie["Description"]);

+

+           if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }

+           if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }

+           if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }

+

+           $Lines = preg_split("/\n/",$Serie["Description"]);

+           $vY = $vY + max($this->FontSize*count($Lines),$IconAreaHeight) + 5;

+          }

+         elseif ( $Mode == LEGEND_HORIZONTAL )

+          {

+           $Lines = preg_split("/\n/",$Serie["Description"]);

+           $Width = "";

+           foreach($Lines as $Key => $Value)

+            {

+             $BoxArray = $this->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$FontName,$FontSize,0,$Value);

+

+             if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }

+             if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }

+             if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }

+

+             $Width[] = $BoxArray[1]["X"];

+            }

+

+           $vX=max($Width)+$XStep;

+          }

+        }

+      }

+     $vY=$vY-$YStep; $vX=$vX-$XStep;

+

+     $TopOffset  = $Y - $Boundaries["T"];

+     if ( $Boundaries["B"]-($vY+$IconAreaHeight) < $TopOffset ) { $Boundaries["B"] = $vY+$IconAreaHeight+$TopOffset; }

+

+     if ( $Style == LEGEND_ROUND )

+      $this->drawRoundedFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));

+     elseif ( $Style == LEGEND_BOX )

+      $this->drawFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));

+

+     $RestoreShadow = $this->Shadow; $this->Shadow = FALSE;

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"];

+         $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];

+

+         if ( isset($Serie["Picture"]) )

+          {

+           $Picture = $Serie["Picture"];

+           list($PicWidth,$PicHeight) = $this->getPicInfo($Picture);

+           $PicX = $X+$IconAreaWidth/2; $PicY = $Y+$IconAreaHeight/2; 

+

+           $this->drawFromPNG($PicX-$PicWidth/2,$PicY-$PicHeight/2,$Picture);

+          }

+         else

+          {

+           if ( $Family == LEGEND_FAMILY_BOX )

+            {

+             if ( $BoxWidth != $IconAreaWidth ) { $XOffset = floor(($IconAreaWidth-$BoxWidth)/2); } else { $XOffset = 0; }

+             if ( $BoxHeight != $IconAreaHeight ) { $YOffset = floor(($IconAreaHeight-$BoxHeight)/2); } else { $YOffset = 0; }

+

+             $this->drawFilledRectangle($X+1+$XOffset,$Y+1+$YOffset,$X+$BoxWidth+$XOffset+1,$Y+$BoxHeight+1+$YOffset,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+             $this->drawFilledRectangle($X+$XOffset,$Y+$YOffset,$X+$BoxWidth+$XOffset,$Y+$BoxHeight+$YOffset,array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20));

+            }

+           elseif ( $Family == LEGEND_FAMILY_CIRCLE )

+            {

+             $this->drawFilledCircle($X+1+$IconAreaWidth/2,$Y+1+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+             $this->drawFilledCircle($X+$IconAreaWidth/2,$Y+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20));

+            }

+           elseif ( $Family == LEGEND_FAMILY_LINE )

+            {

+             $this->drawLine($X+1,$Y+1+$IconAreaHeight/2,$X+1+$IconAreaWidth,$Y+1+$IconAreaHeight/2,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20,"Ticks"=>$Ticks,"Weight"=>$Weight));

+             $this->drawLine($X,$Y+$IconAreaHeight/2,$X+$IconAreaWidth,$Y+$IconAreaHeight/2,array("R"=>$R,"G"=>$G,"B"=>$B,"Ticks"=>$Ticks,"Weight"=>$Weight));

+            }

+          }

+

+         if ( $Mode == LEGEND_VERTICAL )

+          {

+           $Lines = preg_split("/\n/",$Serie["Description"]);

+           foreach($Lines as $Key => $Value)

+            $this->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT));

+

+           $Y=$Y+max($this->FontSize*count($Lines),$IconAreaHeight) + 5;

+          }

+         elseif ( $Mode == LEGEND_HORIZONTAL )

+          {

+           $Lines = preg_split("/\n/",$Serie["Description"]);

+           $Width = "";

+           foreach($Lines as $Key => $Value)

+            {

+             $BoxArray = $this->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT));

+             $Width[] = $BoxArray[1]["X"];

+            }

+           $X=max($Width)+2+$XStep;

+          }

+        }

+      }

+

+

+     $this->Shadow = $RestoreShadow;

+    }

+

+   function drawScale($Format="")

+    {

+     $Pos		= isset($Format["Pos"]) ? $Format["Pos"] : SCALE_POS_LEFTRIGHT;

+     $Floating		= isset($Format["Floating"]) ? $Format["Floating"] : FALSE;

+     $Mode		= isset($Format["Mode"]) ? $Format["Mode"] : SCALE_MODE_FLOATING;

+     $MinDivHeight	= isset($Format["MinDivHeight"]) ? $Format["MinDivHeight"] : 20;

+     $Factors		= isset($Format["Factors"]) ? $Format["Factors"] : array(1,2,5);

+     $ManualScale	= isset($Format["ManualScale"]) ? $Format["ManualScale"] : array("0"=>array("Min"=>-100,"Max"=>100));

+     $XMargin		= isset($Format["XMargin"]) ? $Format["XMargin"] : AUTO;

+     $YMargin		= isset($Format["YMargin"]) ? $Format["YMargin"] : 0;

+     $ScaleSpacing	= isset($Format["ScaleSpacing"]) ? $Format["ScaleSpacing"] : 15;

+     $InnerTickWidth	= isset($Format["InnerTickWidth"]) ? $Format["InnerTickWidth"] : 2;

+     $OuterTickWidth	= isset($Format["OuterTickWidth"]) ? $Format["OuterTickWidth"] : 2;

+     $DrawXLines	= isset($Format["DrawXLines"]) ? $Format["DrawXLines"] : TRUE;

+     $DrawYLines	= isset($Format["DrawYLines"]) ? $Format["DrawYLines"] : ALL;

+     $GridTicks		= isset($Format["GridTicks"]) ? $Format["GridTicks"] : 4;

+     $GridR		= isset($Format["GridR"]) ? $Format["GridR"] : 255;

+     $GridG		= isset($Format["GridG"]) ? $Format["GridG"] : 255;

+     $GridB		= isset($Format["GridB"]) ? $Format["GridB"] : 255;

+     $GridAlpha		= isset($Format["GridAlpha"]) ? $Format["GridAlpha"] : 40;

+     $AxisRo		= isset($Format["AxisR"]) ? $Format["AxisR"] : 0;

+     $AxisGo		= isset($Format["AxisG"]) ? $Format["AxisG"] : 0;

+     $AxisBo		= isset($Format["AxisB"]) ? $Format["AxisB"] : 0;

+     $AxisAlpha		= isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 100;

+     $TickRo		= isset($Format["TickR"]) ? $Format["TickR"] : 0;

+     $TickGo		= isset($Format["TickG"]) ? $Format["TickG"] : 0;

+     $TickBo		= isset($Format["TickB"]) ? $Format["TickB"] : 0;

+     $TickAlpha		= isset($Format["TickAlpha"]) ? $Format["TickAlpha"] : 100;

+     $DrawSubTicks	= isset($Format["DrawSubTicks"]) ? $Format["DrawSubTicks"] : FALSE;

+     $InnerSubTickWidth	= isset($Format["InnerSubTickWidth"]) ? $Format["InnerSubTickWidth"] : 0;

+     $OuterSubTickWidth	= isset($Format["OuterSubTickWidth"]) ? $Format["OuterSubTickWidth"] : 2;

+     $SubTickR		= isset($Format["SubTickR"]) ? $Format["SubTickR"] : 255;

+     $SubTickG		= isset($Format["SubTickG"]) ? $Format["SubTickG"] : 0;

+     $SubTickB		= isset($Format["SubTickB"]) ? $Format["SubTickB"] : 0;

+     $SubTickAlpha	= isset($Format["SubTickAlpha"]) ? $Format["SubTickAlpha"] : 100;

+     $AutoAxisLabels	= isset($Format["AutoAxisLabels"]) ? $Format["AutoAxisLabels"] : TRUE;

+     $XReleasePercent	= isset($Format["XReleasePercent"]) ? $Format["XReleasePercent"] : 1;

+     $DrawArrows	= isset($Format["DrawArrows"]) ? $Format["DrawArrows"] : FALSE;

+     $ArrowSize         = isset($Format["ArrowSize"]) ? $Format["ArrowSize"] : 8;

+     $CycleBackground	= isset($Format["CycleBackground"]) ? $Format["CycleBackground"] : FALSE;

+     $BackgroundR1	= isset($Format["BackgroundR1"]) ? $Format["BackgroundR1"] : 255;

+     $BackgroundG1	= isset($Format["BackgroundG1"]) ? $Format["BackgroundG1"] : 255;

+     $BackgroundB1	= isset($Format["BackgroundB1"]) ? $Format["BackgroundB1"] : 255;

+     $BackgroundAlpha1	= isset($Format["BackgroundAlpha1"]) ? $Format["BackgroundAlpha1"] : 20;

+     $BackgroundR2	= isset($Format["BackgroundR2"]) ? $Format["BackgroundR2"] : 230;

+     $BackgroundG2	= isset($Format["BackgroundG2"]) ? $Format["BackgroundG2"] : 230;

+     $BackgroundB2	= isset($Format["BackgroundB2"]) ? $Format["BackgroundB2"] : 230;

+     $BackgroundAlpha2	= isset($Format["BackgroundAlpha2"]) ? $Format["BackgroundAlpha2"] : 20;

+     $LabelingMethod	= isset($Format["LabelingMethod"]) ? $Format["LabelingMethod"] : LABELING_ALL;

+     $LabelSkip		= isset($Format["LabelSkip"]) ? $Format["LabelSkip"] : 1;

+     $LabelRotation	= isset($Format["LabelRotation"]) ? $Format["LabelRotation"] : 0;

+     $SkippedAxisTicks	= isset($Format["SkippedAxisTicks"]) ? $Format["SkippedAxisTicks"] : $GridTicks+2;

+     $SkippedAxisR	= isset($Format["SkippedAxisR"]) ? $Format["SkippedAxisR"] : $GridR;

+     $SkippedAxisG	= isset($Format["SkippedAxisG"]) ? $Format["SkippedAxisG"] : $GridG;

+     $SkippedAxisB	= isset($Format["SkippedAxisB"]) ? $Format["SkippedAxisB"] : $GridB;

+     $SkippedAxisAlpha	= isset($Format["SkippedAxisAlpha"]) ? $Format["SkippedAxisAlpha"] : $GridAlpha-30;

+     $SkippedTickR	= isset($Format["SkippedTickR"]) ? $Format["SkippedTickR"] : $TickRo;

+     $SkippedTickG	= isset($Format["SkippedTickG"]) ? $Format["SkippedTickG"] : $TickGo;

+     $SkippedTickB	= isset($Format["SkippedTicksB"]) ? $Format["SkippedTickB"] : $TickBo;

+     $SkippedTickAlpha	= isset($Format["SkippedTickAlpha"]) ? $Format["SkippedTickAlpha"] : $TickAlpha-80;

+     $SkippedInnerTickWidth	= isset($Format["SkippedInnerTickWidth"]) ? $Format["SkippedInnerTickWidth"] : 0;

+     $SkippedOuterTickWidth	= isset($Format["SkippedOuterTickWidth"]) ? $Format["SkippedOuterTickWidth"] : 2;

+

+     /* Floating scale require X & Y margins to be set manually */

+     if ( $Floating && ( $XMargin == AUTO || $YMargin == 0 ) ) { $Floating = FALSE; }

+

+     /* Skip a NOTICE event in case of an empty array */

+     if ( $DrawYLines == NONE || $DrawYLines == FALSE ) { $DrawYLines = array("zarma"=>"31"); }

+

+     /* Define the color for the skipped elements */

+     $SkippedAxisColor = array("R"=>$SkippedAxisR,"G"=>$SkippedAxisG,"B"=>$SkippedAxisB,"Alpha"=>$SkippedAxisAlpha,"Ticks"=>$SkippedAxisTicks);

+     $SkippedTickColor = array("R"=>$SkippedTickR,"G"=>$SkippedTickG,"B"=>$SkippedTickB,"Alpha"=>$SkippedTickAlpha);

+

+     $Data = $this->DataSet->getData();

+     if ( isset($Data["Abscissa"]) ) { $Abscissa = $Data["Abscissa"]; } else { $Abscissa = NULL; }

+

+     /* Unset the abscissa axis, needed if we display multiple charts on the same picture */

+     if ( $Abscissa != NULL )

+      {

+       foreach($Data["Axis"] as $AxisID => $Parameters)

+        { if ($Parameters["Identity"] == AXIS_X) { unset($Data["Axis"][$AxisID]); } }

+      }

+

+     /* Build the scale settings */

+     $GotXAxis = FALSE;

+     foreach($Data["Axis"] as $AxisID => $AxisParameter)

+      {

+       if ( $AxisParameter["Identity"] == AXIS_X ) { $GotXAxis = TRUE; }

+

+       if ( $Pos == SCALE_POS_LEFTRIGHT && $AxisParameter["Identity"] == AXIS_Y)

+        { $Height = $this->GraphAreaY2-$this->GraphAreaY1 - $YMargin*2; }

+       elseif ( $Pos == SCALE_POS_LEFTRIGHT && $AxisParameter["Identity"] == AXIS_X)

+        { $Height = $this->GraphAreaX2-$this->GraphAreaX1; }

+       elseif ( $Pos == SCALE_POS_TOPBOTTOM && $AxisParameter["Identity"] == AXIS_Y)

+        { $Height = $this->GraphAreaX2-$this->GraphAreaX1 - $YMargin*2;; }

+       else

+        { $Height = $this->GraphAreaY2-$this->GraphAreaY1; }

+

+       $AxisMin = ABSOLUTE_MAX; $AxisMax = OUT_OF_SIGHT;

+       if ( $Mode == SCALE_MODE_FLOATING || $Mode == SCALE_MODE_START0 )

+        {

+         foreach($Data["Series"] as $SerieID => $SerieParameter)

+          {

+           if ( $SerieParameter["Axis"] == $AxisID && $Data["Series"][$SerieID]["isDrawable"] && $Data["Abscissa"] != $SerieID)

+            {

+             $AxisMax = max($AxisMax,$Data["Series"][$SerieID]["Max"]);

+             $AxisMin = min($AxisMin,$Data["Series"][$SerieID]["Min"]);

+            }

+          }

+         $AutoMargin = (($AxisMax-$AxisMin)/100)*$XReleasePercent;

+

+         $Data["Axis"][$AxisID]["Min"] = $AxisMin-$AutoMargin; $Data["Axis"][$AxisID]["Max"] = $AxisMax+$AutoMargin;

+         if ( $Mode == SCALE_MODE_START0 ) { $Data["Axis"][$AxisID]["Min"] = 0; }

+        }

+       elseif ( $Mode == SCALE_MODE_MANUAL )

+        {

+         if ( isset($ManualScale[$AxisID]["Min"]) && isset($ManualScale[$AxisID]["Max"]) )

+          {

+           $Data["Axis"][$AxisID]["Min"] = $ManualScale[$AxisID]["Min"];

+           $Data["Axis"][$AxisID]["Max"] = $ManualScale[$AxisID]["Max"];

+          }

+         else

+          { echo "Manual scale boundaries not set."; exit(); }

+        }

+       elseif ( $Mode == SCALE_MODE_ADDALL || $Mode == SCALE_MODE_ADDALL_START0 )

+        {

+         $Series = "";

+         foreach($Data["Series"] as $SerieID => $SerieParameter)

+          { if ( $SerieParameter["Axis"] == $AxisID && $SerieParameter["isDrawable"] && $Data["Abscissa"] != $SerieID ) { $Series[$SerieID] = count($Data["Series"][$SerieID]["Data"]); } }

+

+         for ($ID=0;$ID<=max($Series)-1;$ID++)

+          {

+           $PointMin = 0; $PointMax = 0;

+           foreach($Series as $SerieID => $ValuesCount )

+            {

+             if (isset($Data["Series"][$SerieID]["Data"][$ID]) && $Data["Series"][$SerieID]["Data"][$ID] != NULL )

+              {

+               $Value = $Data["Series"][$SerieID]["Data"][$ID];

+               if ( $Value > 0 ) { $PointMax = $PointMax + $Value; } else { $PointMin = $PointMin + $Value; }

+              }

+            }

+           $AxisMax = max($AxisMax,$PointMax);

+           $AxisMin = min($AxisMin,$PointMin);

+          }

+         $AutoMargin = (($AxisMax-$AxisMin)/100)*$XReleasePercent;

+         $Data["Axis"][$AxisID]["Min"] = $AxisMin-$AutoMargin; $Data["Axis"][$AxisID]["Max"] = $AxisMax+$AutoMargin;

+        }

+       $MaxDivs = floor($Height/$MinDivHeight);

+

+       if ( $Mode == SCALE_MODE_ADDALL_START0 ) { $Data["Axis"][$AxisID]["Min"] = 0; }

+

+       $Scale   = $this->computeScale($Data["Axis"][$AxisID]["Min"],$Data["Axis"][$AxisID]["Max"],$MaxDivs,$Factors,$AxisID);

+

+       $Data["Axis"][$AxisID]["Margin"]    = $AxisParameter["Identity"] == AXIS_X ? $XMargin : $YMargin;

+       $Data["Axis"][$AxisID]["ScaleMin"]  = $Scale["XMin"];

+       $Data["Axis"][$AxisID]["ScaleMax"]  = $Scale["XMax"];

+       $Data["Axis"][$AxisID]["Rows"]      = $Scale["Rows"];

+       $Data["Axis"][$AxisID]["RowHeight"] = $Scale["RowHeight"];

+

+       if ( isset($Scale["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = $Scale["Format"]; }

+

+       if ( !isset($Data["Axis"][$AxisID]["Display"]) ) { $Data["Axis"][$AxisID]["Display"] = NULL; }

+       if ( !isset($Data["Axis"][$AxisID]["Format"]) )  { $Data["Axis"][$AxisID]["Format"] = NULL; }

+       if ( !isset($Data["Axis"][$AxisID]["Unit"]) )    { $Data["Axis"][$AxisID]["Unit"] = NULL; }

+      }

+

+     /* Still no X axis */

+     if ( $GotXAxis == FALSE )

+      {

+       if ( $Abscissa != NULL )

+        {

+         $Points = count($Data["Series"][$Abscissa]["Data"]);

+         if ( $AutoAxisLabels )

+          $AxisName = isset($Data["Series"][$Abscissa]["Description"]) ? $Data["Series"][$Abscissa]["Description"] : NULL;

+         else

+          $AxisName = NULL;

+        }

+       else

+        {

+         $Points = 0;

+         $AxisName = isset($Data["XAxisName"]) ? $Data["XAxisName"] : NULL;

+         foreach($Data["Series"] as $SerieID => $SerieParameter)

+          { if ( $SerieParameter["isDrawable"] ) { $Points = max($Points,count($SerieParameter["Data"])); } }

+        }

+

+       $AxisID = count($Data["Axis"]);

+       $Data["Axis"][$AxisID]["Identity"] = AXIS_X;

+       if ( $Pos == SCALE_POS_LEFTRIGHT ) { $Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_BOTTOM; } else { $Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_LEFT; }

+       if ( $AxisName != NULL ) { $Data["Axis"][$AxisID]["Name"] = $AxisName; }

+       if ( $XMargin == AUTO )

+        {

+         if ( $Pos == SCALE_POS_LEFTRIGHT )

+          { $Height = $this->GraphAreaX2-$this->GraphAreaX1; }

+         else

+          { $Height = $this->GraphAreaY2-$this->GraphAreaY1; }

+

+         if ( $Points == 1 )

+          $Data["Axis"][$AxisID]["Margin"] = $Height / 2;

+         else

+          $Data["Axis"][$AxisID]["Margin"] = ($Height/$Points) / 2;

+        }

+       else

+        { $Data["Axis"][$AxisID]["Margin"] = $XMargin; }

+       $Data["Axis"][$AxisID]["Rows"] = $Points-1;

+       if ( !isset($Data["Axis"][$AxisID]["Display"]) ) { $Data["Axis"][$AxisID]["Display"] = NULL; }

+       if ( !isset($Data["Axis"][$AxisID]["Format"]) )  { $Data["Axis"][$AxisID]["Format"] = NULL; }

+       if ( !isset($Data["Axis"][$AxisID]["Unit"]) )    { $Data["Axis"][$AxisID]["Unit"] = NULL; }

+      }

+

+     $this->DataSet->saveOrientation($Pos);

+     $this->DataSet->saveAxisConfig($Data["Axis"]);

+

+     $FontColorRo = $this->FontColorR; $FontColorGo = $this->FontColorG; $FontColorBo = $this->FontColorB;

+

+     $AxisPos["L"] = $this->GraphAreaX1; $AxisPos["R"] = $this->GraphAreaX2; $AxisPos["T"] = $this->GraphAreaY1; $AxisPos["B"] = $this->GraphAreaY2;

+     foreach($Data["Axis"] as $AxisID => $Parameters)

+      {

+       if ( isset($Parameters["Color"]) )

+        {

+         $AxisR = $Parameters["Color"]["R"]; $AxisG = $Parameters["Color"]["G"]; $AxisB = $Parameters["Color"]["B"];

+         $TickR = $Parameters["Color"]["R"]; $TickG = $Parameters["Color"]["G"]; $TickB = $Parameters["Color"]["B"];

+         $this->setFontProperties(array("R"=>$Parameters["Color"]["R"],"G"=>$Parameters["Color"]["G"],"B"=>$Parameters["Color"]["B"]));

+        }

+       else

+        {

+         $AxisR = $AxisRo; $AxisG = $AxisGo; $AxisB = $AxisBo;

+         $TickR = $TickRo; $TickG = $TickGo; $TickB = $TickBo;

+         $this->setFontProperties(array("R"=>$FontColorRo,"G"=>$FontColorGo,"B"=>$FontColorBo));

+        }

+

+       $LastValue = "w00t"; $ID = 1;

+       if ( $Parameters["Identity"] == AXIS_X )

+        {

+         if ( $Pos == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $Parameters["Position"] == AXIS_POSITION_BOTTOM )

+            {

+             if ( $LabelRotation == 0 )					{ $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $YLabelOffset = 2; }

+             if ( $LabelRotation > 0 && $LabelRotation < 190 )		{ $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $YLabelOffset = 5; }

+             if ( $LabelRotation == 180 )				{ $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $YLabelOffset = 5; }

+             if ( $LabelRotation > 180 && $LabelRotation < 360 )	{ $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $YLabelOffset = 2; }

+

+             if ( $Floating )

+              { $FloatingOffset = $YMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+             else

+              { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["B"],$this->GraphAreaX2,$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+             if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["B"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+             $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2;

+

+             if ($Parameters["Rows"] == 0 ) { $Step  = $Width; } else { $Step  = $Width / ($Parameters["Rows"]); }

+             

+             $MaxBottom = $AxisPos["B"];

+             for($i=0;$i<=$Parameters["Rows"];$i++)

+              {

+               $XPos  = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i;

+               $YPos  = $AxisPos["B"];

+

+               if ( $Abscissa != NULL )

+                { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } }

+               else

+                {

+                 if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) )

+                  $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]);

+                 else

+                  $Value = $i;

+                }

+

+               $ID++; $Skipped = TRUE;

+               if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) )

+                {

+                 $Bounds    = $this->drawText($XPos,$YPos+$OuterTickWidth+$YLabelOffset,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign));

+                 $TxtBottom = $YPos+$OuterTickWidth+2+($Bounds[0]["Y"]-$Bounds[2]["Y"]);

+                 $MaxBottom = max($MaxBottom,$TxtBottom);

+                 $LastValue = $Value;

+                 $Skipped   = FALSE;

+                }

+

+               if ( $Skipped )

+                {

+                 if ( $DrawXLines ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$SkippedAxisColor); }

+                 if ( $SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0 ) { $this->drawLine($XPos,$YPos-$SkippedInnerTickWidth,$XPos,$YPos+$SkippedOuterTickWidth,$SkippedTickColor); }

+                }

+               else

+                {

+                 if ( $DrawXLines && ($XPos != $this->GraphAreaX1 && $XPos != $this->GraphAreaX2) ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+                 if ( $InnerTickWidth !=0 || $OuterTickWidth != 0 ) { $this->drawLine($XPos,$YPos-$InnerTickWidth,$XPos,$YPos+$OuterTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); }

+                }

+

+              }

+             if ( isset($Parameters["Name"]) )

+              {

+               $YPos   = $MaxBottom+2;

+               $XPos   = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2;

+               $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_TOPMIDDLE));

+               $MaxBottom = $Bounds[0]["Y"];

+

+               $this->DataSet->Data["GraphArea"]["Y2"] = $MaxBottom + $this->FontSize;

+              }

+

+             $AxisPos["B"] = $MaxBottom + $ScaleSpacing;

+            }

+           elseif ( $Parameters["Position"] == AXIS_POSITION_TOP )

+            {

+             if ( $LabelRotation == 0 )					{ $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $YLabelOffset = 2; }

+             if ( $LabelRotation > 0 && $LabelRotation < 190 )		{ $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $YLabelOffset = 2; }

+             if ( $LabelRotation == 180 )				{ $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $YLabelOffset = 5; }

+             if ( $LabelRotation > 180 && $LabelRotation < 360 )	{ $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $YLabelOffset = 5; }

+

+             if ( $Floating )

+              { $FloatingOffset = $YMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+             else

+              { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["T"],$this->GraphAreaX2,$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+             if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["T"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+             $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2;

+

+             if ($Parameters["Rows"] == 0 ) { $Step  = $Width; } else { $Step  = $Width / $Parameters["Rows"]; }

+             

+             $MinTop = $AxisPos["T"];

+             for($i=0;$i<=$Parameters["Rows"];$i++)

+              {

+               $XPos  = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i;

+               $YPos  = $AxisPos["T"];

+

+               if ( $Abscissa != NULL )

+                { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } }

+               else

+                {

+                 if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) )

+                  $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]);

+                 else

+                  $Value = $i;

+                }

+

+               $ID++; $Skipped = TRUE;

+               if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) )

+                {

+                 $Bounds = $this->drawText($XPos,$YPos-$OuterTickWidth-$YLabelOffset,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign));

+                 $TxtBox = $YPos-$OuterTickWidth-2-($Bounds[0]["Y"]-$Bounds[2]["Y"]);

+                 $MinTop = min($MinTop,$TxtBox);

+                 $LastValue = $Value;

+                 $Skipped   = FALSE;

+                }

+

+               if ( $Skipped )

+                {

+                 if ( $DrawXLines ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$SkippedAxisColor); }

+                 if ( $SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0 ) { $this->drawLine($XPos,$YPos+$SkippedInnerTickWidth,$XPos,$YPos-$SkippedOuterTickWidth,$SkippedTickColor); }

+                }

+               else

+                {

+                 if ( $DrawXLines ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+                 if ( $InnerTickWidth !=0 || $OuterTickWidth != 0 ) { $this->drawLine($XPos,$YPos+$InnerTickWidth,$XPos,$YPos-$OuterTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); }

+                }

+

+              }

+             if ( isset($Parameters["Name"]) )

+              {

+               $YPos   = $MinTop-2;

+               $XPos   = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2;

+               $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+               $MinTop = $Bounds[2]["Y"];

+

+               $this->DataSet->Data["GraphArea"]["Y1"] = $MinTop;

+              }

+

+             $AxisPos["T"] = $MinTop - $ScaleSpacing;

+            }

+          }

+         elseif ( $Pos == SCALE_POS_TOPBOTTOM )

+          {

+           if ( $Parameters["Position"] == AXIS_POSITION_LEFT )

+            {

+             if ( $LabelRotation == 0 )					{ $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = -2; }

+             if ( $LabelRotation > 0 && $LabelRotation < 190 )		{ $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = -6; }

+             if ( $LabelRotation == 180 )				{ $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = -2; }

+             if ( $LabelRotation > 180 && $LabelRotation < 360 )	{ $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = -5; }

+

+             if ( $Floating )

+              { $FloatingOffset = $YMargin; $this->drawLine($AxisPos["L"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+             else

+              { $FloatingOffset = 0; $this->drawLine($AxisPos["L"],$this->GraphAreaY1,$AxisPos["L"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+             if ( $DrawArrows ) { $this->drawArrow($AxisPos["L"],$this->GraphAreaY2-$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY2+($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+             $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2;

+

+             if ($Parameters["Rows"] == 0 ) { $Step  = $Height; } else { $Step   = $Height / $Parameters["Rows"]; }

+

+             $MinLeft = $AxisPos["L"];

+             for($i=0;$i<=$Parameters["Rows"];$i++)

+              {

+               $YPos  = $this->GraphAreaY1 + $Parameters["Margin"] + $Step*$i;

+               $XPos  = $AxisPos["L"];

+

+               if ( $Abscissa != NULL )

+                { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } }

+               else

+                {

+                 if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) )

+                  $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]);

+                 else

+                  $Value = $i;

+                }

+

+               $ID++; $Skipped = TRUE;

+               if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) )

+                {

+                 $Bounds  = $this->drawText($XPos-$OuterTickWidth+$XLabelOffset,$YPos,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign));

+                 $TxtBox  = $XPos-$OuterTickWidth-2-($Bounds[1]["X"]-$Bounds[0]["X"]);

+                 $MinLeft = min($MinLeft,$TxtBox);

+                 $LastValue = $Value;

+                 $Skipped   = FALSE;

+                }

+

+               if ( $Skipped )

+                {

+                 if ( $DrawXLines ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,$SkippedAxisColor); }

+                 if ( $SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0 ) { $this->drawLine($XPos-$SkippedOuterTickWidth,$YPos,$XPos+$SkippedInnerTickWidth,$YPos,$SkippedTickColor); }

+                }

+               else

+                {

+                 if ( $DrawXLines && ($YPos != $this->GraphAreaY1 && $YPos != $this->GraphAreaY2) ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+                 if ( $InnerTickWidth !=0 || $OuterTickWidth != 0 ) { $this->drawLine($XPos-$OuterTickWidth,$YPos,$XPos+$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); }

+                }

+

+              }

+             if ( isset($Parameters["Name"]) )

+              {

+               $XPos   = $MinLeft-2;

+               $YPos   = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2;

+               $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>90));

+               $MinLeft = $Bounds[0]["X"];

+

+               $this->DataSet->Data["GraphArea"]["X1"] = $MinLeft;

+              }

+

+             $AxisPos["L"] = $MinLeft - $ScaleSpacing;

+            }

+           elseif ( $Parameters["Position"] == AXIS_POSITION_RIGHT )

+            {

+             if ( $LabelRotation == 0 )					{ $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = 2; }

+             if ( $LabelRotation > 0 && $LabelRotation < 190 )		{ $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = 6; }

+             if ( $LabelRotation == 180 )				{ $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = 5; }

+             if ( $LabelRotation > 180 && $LabelRotation < 360 )	{ $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = 7; }

+

+             if ( $Floating )

+              { $FloatingOffset = $YMargin; $this->drawLine($AxisPos["R"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+             else

+              { $FloatingOffset = 0; $this->drawLine($AxisPos["R"],$this->GraphAreaY1,$AxisPos["R"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+             if ( $DrawArrows ) { $this->drawArrow($AxisPos["R"],$this->GraphAreaY2-$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY2+($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+             $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2;

+

+             if ($Parameters["Rows"] == 0 ) { $Step  = $Height; } else { $Step   = $Height / $Parameters["Rows"]; }

+             

+             $MaxRight = $AxisPos["R"];

+             for($i=0;$i<=$Parameters["Rows"];$i++)

+              {

+               $YPos  = $this->GraphAreaY1 + $Parameters["Margin"] + $Step*$i;

+               $XPos  = $AxisPos["R"];

+

+               if ( $Abscissa != NULL )

+                { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } }

+               else

+                {

+                 if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) )

+                  $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]);

+                 else

+                  $Value = $i;

+                }

+

+               $ID++; $Skipped = TRUE;

+               if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) )

+                {

+                 $Bounds   = $this->drawText($XPos+$OuterTickWidth+$XLabelOffset,$YPos,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign));

+                 $TxtBox   = $XPos+$OuterTickWidth+2+($Bounds[1]["X"]-$Bounds[0]["X"]);

+                 $MaxRight = max($MaxRight,$TxtBox);

+                 $LastValue = $Value;

+                 $Skipped   = FALSE;

+                }

+

+               if ( $Skipped )

+                {

+                 if ( $DrawXLines ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,$SkippedAxisColor); }

+                 if ( $SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0 ) { $this->drawLine($XPos+$SkippedOuterTickWidth,$YPos,$XPos-$SkippedInnerTickWidth,$YPos,$SkippedTickColor); }

+                }

+               else

+                {

+                 if ( $DrawXLines ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+                 if ( $InnerTickWidth !=0 || $OuterTickWidth != 0 ) { $this->drawLine($XPos+$OuterTickWidth,$YPos,$XPos-$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); }

+                }

+

+              }

+             if ( isset($Parameters["Name"]) )

+              {

+               $XPos   = $MaxRight+4;

+               $YPos   = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2;

+               $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>270));

+               $MaxRight = $Bounds[1]["X"];

+

+               $this->DataSet->Data["GraphArea"]["X2"] = $MaxRight + $this->FontSize;

+              }

+

+             $AxisPos["R"] = $MaxRight + $ScaleSpacing;

+            }

+          }

+        }

+

+

+

+       if ( $Parameters["Identity"] == AXIS_Y )

+        {

+         if ( $Pos == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $Parameters["Position"] == AXIS_POSITION_LEFT )

+            {

+

+             if ( $Floating )

+              { $FloatingOffset = $XMargin; $this->drawLine($AxisPos["L"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+             else

+              { $FloatingOffset = 0; $this->drawLine($AxisPos["L"],$this->GraphAreaY1,$AxisPos["L"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+             if ( $DrawArrows ) { $this->drawArrow($AxisPos["L"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+             $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2;

+             $Step   = $Height / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MinLeft = $AxisPos["L"];

+             $LastY  = NULL;

+             for($i=0;$i<=$Parameters["Rows"];$i++)

+              {

+               $YPos  = $this->GraphAreaY2 - $Parameters["Margin"] - $Step*$i;

+               $XPos  = $AxisPos["L"];

+               $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]);

+

+               if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }

+               if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($this->GraphAreaX1+$FloatingOffset,$LastY,$this->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); }

+

+               if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+

+               if ( $DrawSubTicks && $i != $Parameters["Rows"] )

+                $this->drawLine($XPos-$OuterSubTickWidth,$YPos-$SubTicksSize,$XPos+$InnerSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));

+

+               $this->drawLine($XPos-$OuterTickWidth,$YPos,$XPos+$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));

+               $Bounds  = $this->drawText($XPos-$OuterTickWidth-2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLERIGHT));

+               $TxtLeft = $XPos-$OuterTickWidth-2-($Bounds[1]["X"]-$Bounds[0]["X"]);

+               $MinLeft = min($MinLeft,$TxtLeft);

+

+               $LastY = $YPos;

+              }

+

+             if ( isset($Parameters["Name"]) )

+              {

+               $XPos    = $MinLeft-2;

+               $YPos    = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2;

+               $Bounds  = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>90));

+               $MinLeft = $Bounds[2]["X"];

+

+               $this->DataSet->Data["GraphArea"]["X1"] = $MinLeft;

+              }

+

+             $AxisPos["L"] = $MinLeft - $ScaleSpacing;

+            }

+           elseif ( $Parameters["Position"] == AXIS_POSITION_RIGHT )

+            {

+             if ( $Floating )

+              { $FloatingOffset = $XMargin; $this->drawLine($AxisPos["R"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+             else

+              { $FloatingOffset = 0; $this->drawLine($AxisPos["R"],$this->GraphAreaY1,$AxisPos["R"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+             if ( $DrawArrows ) { $this->drawArrow($AxisPos["R"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+             $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2;

+             $Step   = $Height / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MaxLeft = $AxisPos["R"];

+             $LastY  = NULL;

+             for($i=0;$i<=$Parameters["Rows"];$i++)

+              {

+               $YPos  = $this->GraphAreaY2 - $Parameters["Margin"] - $Step*$i;

+               $XPos  = $AxisPos["R"];

+               $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]);

+

+               if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }

+               if ( $LastY != NULL && $CycleBackground  && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($this->GraphAreaX1+$FloatingOffset,$LastY,$this->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); }

+

+               if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+

+               if ( $DrawSubTicks && $i != $Parameters["Rows"] )

+                $this->drawLine($XPos-$OuterSubTickWidth,$YPos-$SubTicksSize,$XPos+$InnerSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));

+

+               $this->drawLine($XPos-$InnerTickWidth,$YPos,$XPos+$OuterTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));

+               $Bounds  = $this->drawText($XPos+$OuterTickWidth+2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLELEFT));

+               $TxtLeft = $XPos+$OuterTickWidth+2+($Bounds[1]["X"]-$Bounds[0]["X"]);

+               $MaxLeft = max($MaxLeft,$TxtLeft);

+

+               $LastY = $YPos;

+              }

+

+             if ( isset($Parameters["Name"]) )

+              {

+               $XPos    = $MaxLeft+6;

+               $YPos    = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2;

+               $Bounds  = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>270));

+               $MaxLeft = $Bounds[2]["X"];

+

+               $this->DataSet->Data["GraphArea"]["X2"] = $MaxLeft + $this->FontSize;

+              }

+             $AxisPos["R"] = $MaxLeft + $ScaleSpacing;

+            }

+          }

+         elseif ( $Pos == SCALE_POS_TOPBOTTOM )

+          {

+           if ( $Parameters["Position"] == AXIS_POSITION_TOP )

+            {

+             if ( $Floating )

+              { $FloatingOffset = $XMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+             else

+              { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["T"],$this->GraphAreaX2,$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+             if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["T"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+             $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2;

+             $Step   = $Width / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MinTop = $AxisPos["T"];

+             $LastX  = NULL;

+             for($i=0;$i<=$Parameters["Rows"];$i++)

+              {

+               $XPos  = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i;

+               $YPos  = $AxisPos["T"];

+               $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]);

+

+               if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }

+               if ( $LastX != NULL && $CycleBackground  && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($LastX,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$BGColor); }

+

+               if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+

+               if ( $DrawSubTicks && $i != $Parameters["Rows"] )

+                $this->drawLine($XPos+$SubTicksSize,$YPos-$OuterSubTickWidth,$XPos+$SubTicksSize,$YPos+$InnerSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));

+

+               $this->drawLine($XPos,$YPos-$OuterTickWidth,$XPos,$YPos+$InnerTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));

+               $Bounds    = $this->drawText($XPos,$YPos-$OuterTickWidth-2,$Value,array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+               $TxtHeight = $YPos-$OuterTickWidth-2-($Bounds[1]["Y"]-$Bounds[2]["Y"]);

+               $MinTop    = min($MinTop,$TxtHeight);

+

+               $LastX = $XPos;

+              }

+

+             if ( isset($Parameters["Name"]) )

+              {

+               $YPos   = $MinTop-2;

+               $XPos   = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2;

+               $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+               $MinTop = $Bounds[2]["Y"];

+

+               $this->DataSet->Data["GraphArea"]["Y1"] = $MinTop;

+              }

+

+             $AxisPos["T"] = $MinTop - $ScaleSpacing;

+            }

+           elseif ( $Parameters["Position"] == AXIS_POSITION_BOTTOM )

+            {

+             if ( $Floating )

+              { $FloatingOffset = $XMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+             else

+              { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["B"],$this->GraphAreaX2,$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+             if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["B"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+             $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2;

+             $Step   = $Width / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MaxBottom = $AxisPos["B"];

+             $LastX  = NULL;

+             for($i=0;$i<=$Parameters["Rows"];$i++)

+              {

+               $XPos  = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i;

+               $YPos  = $AxisPos["B"];

+               $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]);

+

+               if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }

+               if ( $LastX != NULL && $CycleBackground  && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($LastX,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$BGColor); }

+

+               if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+

+               if ( $DrawSubTicks && $i != $Parameters["Rows"] )

+                $this->drawLine($XPos+$SubTicksSize,$YPos-$OuterSubTickWidth,$XPos+$SubTicksSize,$YPos+$InnerSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));

+

+               $this->drawLine($XPos,$YPos-$OuterTickWidth,$XPos,$YPos+$InnerTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));

+               $Bounds    = $this->drawText($XPos,$YPos+$OuterTickWidth+2,$Value,array("Align"=>TEXT_ALIGN_TOPMIDDLE));

+               $TxtHeight = $YPos+$OuterTickWidth+2+($Bounds[1]["Y"]-$Bounds[2]["Y"]);

+               $MaxBottom = max($MaxBottom,$TxtHeight);

+

+               $LastX = $XPos;

+              }

+

+             if ( isset($Parameters["Name"]) )

+              {

+               $YPos   = $MaxBottom+2;

+               $XPos   = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2;

+               $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_TOPMIDDLE));

+               $MaxBottom = $Bounds[0]["Y"];

+

+               $this->DataSet->Data["GraphArea"]["Y2"] = $MaxBottom + $this->FontSize;

+              }

+

+             $AxisPos["B"] = $MaxBottom + $ScaleSpacing;

+            }

+          }

+        }

+      }

+    }

+

+   function isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip)

+    {

+     if ( $LabelingMethod == LABELING_DIFFERENT && $Value != $LastValue ) { return(TRUE); }

+     if ( $LabelingMethod == LABELING_DIFFERENT && $Value == $LastValue ) { return(FALSE); }

+     if ( $LabelingMethod == LABELING_ALL && $LabelSkip == 1 ) { return(TRUE); }

+     if ( $LabelingMethod == LABELING_ALL && ($ID+$LabelSkip) % ($LabelSkip+1) != 1 ) { return(FALSE); }

+

+     return(TRUE);

+    }

+

+   /* Compute the scale, check for the best visual factors */

+   function computeScale($XMin,$XMax,$MaxDivs,$Factors,$AxisID=0)

+    {

+     /* Compute each factors */

+     $Results = "";

+     foreach ($Factors as $Key => $Factor)

+      $Results[$Factor] = $this->processScale($XMin,$XMax,$MaxDivs,array($Factor),$AxisID);

+

+     /* Remove scales that are creating to much decimals */

+     $GoodScaleFactors = "";

+     foreach ($Results as $Key => $Result)

+      {

+       $Decimals = preg_split("/\./",$Result["RowHeight"]);

+       if ( (!isset($Decimals[1])) || (strlen($Decimals[1]) < 6) ) { $GoodScaleFactors[] = $Key; }

+      }

+

+     /* Found no correct scale, shame,... returns the 1st one as default */

+     if ( $GoodScaleFactors == "" ) { return($Results[$Factors[0]]); }

+

+     /* Find the factor that cause the maximum number of Rows */

+     $MaxRows = 0; $BestFactor = 0;

+     foreach($GoodScaleFactors as $Key => $Factor)

+      { if ( $Results[$Factor]["Rows"] > $MaxRows ) { $MaxRows = $Results[$Factor]["Rows"]; $BestFactor = $Factor; } }

+

+     /* Return the best visual scale */

+     return($Results[$BestFactor]);

+    }

+

+   /* Compute the best matching scale based on size & factors */

+   function processScale($XMin,$XMax,$MaxDivs,$Factors,$AxisID)

+    {

+     $ScaleHeight = abs(ceil($XMax)-floor($XMin));

+

+     if ( isset($this->DataSet->Data["Axis"][$AxisID]["Display"]) )

+      $Mode = $this->DataSet->Data["Axis"][$AxisID]["Display"];

+     else

+      $Mode = AXIS_FORMAT_DEFAULT;

+

+     $Scale = "";

+     if ( $XMin != $XMax )

+      {

+       $Found = FALSE; $Rescaled = FALSE; $Scaled10Factor = .0001; $Result = 0;

+       while(!$Found)

+        {

+         foreach($Factors as $Key => $Factor)

+          {

+           if ( !$Found )

+            {

+             if ( !($this->modulo($XMin,$Factor*$Scaled10Factor) == 0) || ($XMin != floor($XMin))) { $XMinRescaled = floor($XMin/($Factor*$Scaled10Factor))*$Factor*$Scaled10Factor; } else { $XMinRescaled = $XMin; }

+             if ( !($this->modulo($XMax,$Factor*$Scaled10Factor) == 0) || ($XMax != floor($XMax))) { $XMaxRescaled = floor($XMax/($Factor*$Scaled10Factor))*$Factor*$Scaled10Factor+($Factor*$Scaled10Factor); } else { $XMaxRescaled = $XMax; }

+             $ScaleHeightRescaled = abs($XMaxRescaled-$XMinRescaled);

+

+             if ( !$Found && floor($ScaleHeightRescaled/($Factor*$Scaled10Factor)) <= $MaxDivs ) { $Found = TRUE; $Rescaled = TRUE; $Result = $Factor * $Scaled10Factor; }

+            }

+          }

+         $Scaled10Factor = $Scaled10Factor * 10;

+        }

+

+       /* ReCall Min / Max / Height */

+       if ( $Rescaled ) { $XMin = $XMinRescaled; $XMax = $XMaxRescaled; $ScaleHeight = $ScaleHeightRescaled; }

+

+       /* Compute rows size */

+       $Rows      = floor($ScaleHeight / $Result);

+       $RowHeight = $ScaleHeight / $Rows;

+

+       /* Return the results */

+       $Scale["Rows"] = $Rows; $Scale["RowHeight"] = $RowHeight; $Scale["XMin"] = $XMin;  $Scale["XMax"] = $XMax;

+

+       /* Compute the needed decimals for the metric view to avoid repetition of the same X Axis labels */

+       if ( $Mode == AXIS_FORMAT_METRIC )

+        {

+         $Done = FALSE; $GoodDecimals = 0;

+         for($Decimals=0;$Decimals<=10;$Decimals++)

+          {

+           if ( !$Done )

+            {

+             $LastLabel = "zob"; $ScaleOK = TRUE;

+             for($i=0;$i<=$Rows;$i++)

+              {

+               $Value = $XMin + $i*$RowHeight;

+               $Label = $this->scaleFormat($Value,AXIS_FORMAT_METRIC,$Decimals);

+

+               if ( $LastLabel == $Label ) { $ScaleOK = FALSE; }

+               $LastLabel = $Label;

+              }

+             if ( $ScaleOK ) { $Done = TRUE; $GoodDecimals = $Decimals; }

+            }

+          }

+

+         $Scale["Format"] = $GoodDecimals;

+        }

+      }

+     else

+      {

+       /* If all values are the same we keep a +1/-1 scale */

+       $Rows = 2; $XMin = $XMax-1; $XMax = $XMax+1; $RowHeight = 1;

+

+       /* Return the results */

+       $Scale["Rows"] = $Rows; $Scale["RowHeight"] = $RowHeight; $Scale["XMin"] = $XMin;  $Scale["XMax"] = $XMax;

+      }

+

+     return($Scale);

+    }

+

+   function modulo($Value1,$Value2)

+    {

+     if (floor($Value2) == 0) { return(0); }

+     if (floor($Value2) != 0) { return($Value1 % $Value2); }

+

+     $MinValue = min($Value1,$Value2); $Factor = 10;

+     while ( floor($MinValue*$Factor) == 0 )

+      { $Factor = $Factor * 10; }

+

+     return(($Value1*$Factor) % ($Value2*$Factor));

+    }

+

+   /* Draw a threshold with the computed scale */

+   function drawThreshold($Value,$Format="")

+    {

+     $AxisID		= isset($Format["AxisID"]) ? $Format["AxisID"] : 0;

+     $R			= isset($Format["R"]) ? $Format["R"] : 255;

+     $G			= isset($Format["G"]) ? $Format["G"] : 0;

+     $B			= isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha		= isset($Format["Alpha"]) ? $Format["Alpha"] : 50;

+     $Weight		= isset($Format["Weight"]) ? $Format["Weight"] : NULL;

+     $Ticks		= isset($Format["Ticks"]) ? $Format["Ticks"] : 6;

+     $Wide		= isset($Format["Wide"]) ? $Format["Wide"] : FALSE;

+     $WideFactor	= isset($Format["WideFactor"]) ? $Format["WideFactor"] : 5;

+     $WriteCaption	= isset($Format["WriteCaption"]) ? $Format["WriteCaption"] : FALSE;

+     $Caption		= isset($Format["Caption"]) ? $Format["Caption"] : NULL;

+     $CaptionAlign	= isset($Format["CaptionAlign"]) ? $Format["CaptionAlign"] : CAPTION_LEFT_TOP;

+     $CaptionOffset     = isset($Format["CaptionOffset"]) ? $Format["CaptionOffset"] : 10;

+     $CaptionR		= isset($Format["CaptionR"]) ? $Format["CaptionR"] : 255;

+     $CaptionG		= isset($Format["CaptionG"]) ? $Format["CaptionG"] : 255;

+     $CaptionB		= isset($Format["CaptionB"]) ? $Format["CaptionB"] : 255;

+     $CaptionAlpha	= isset($Format["CaptionAlpha"]) ? $Format["CaptionAlpha"] : 100;

+     $DrawBox		= isset($Format["DrawBox"]) ? $Format["DrawBox"] : TRUE;

+     $DrawBoxBorder	= isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : FALSE;

+     $BorderOffset	= isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 3;

+     $BoxRounded	= isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : TRUE;

+     $RoundedRadius	= isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 3;

+     $BoxR		= isset($Format["BoxR"]) ? $Format["BoxR"] : 0;

+     $BoxG		= isset($Format["BoxG"]) ? $Format["BoxG"] : 0;

+     $BoxB		= isset($Format["BoxB"]) ? $Format["BoxB"] : 0;

+     $BoxAlpha		= isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 30;

+     $BoxSurrounding	= isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : "";

+     $BoxBorderR	= isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 255;

+     $BoxBorderG	= isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 255;

+     $BoxBorderB	= isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 255;

+     $BoxBorderAlpha	= isset($Format["BoxBorderAlpha"]) ? $Format["BoxBorderAlpha"] : 100;

+

+     $CaptionSettings = array("DrawBox"=>$DrawBox,"DrawBoxBorder"=>$DrawBoxBorder,"BorderOffset"=>$BorderOffset,"BoxRounded"=>$BoxRounded,"RoundedRadius"=>$RoundedRadius,

+                              "BoxR"=>$BoxR,"BoxG"=>$BoxG,"BoxB"=>$BoxB,"BoxAlpha"=>$BoxAlpha,"BoxSurrounding"=>$BoxSurrounding,

+                              "BoxBorderR"=>$BoxBorderR,"BoxBorderG"=>$BoxBorderG,"BoxBorderB"=>$BoxBorderB,"BoxBorderAlpha"=>$BoxBorderAlpha,

+                              "R"=>$CaptionR,"G"=>$CaptionG,"B"=>$CaptionB,"Alpha"=>$CaptionAlpha);

+

+     if ( $Caption == NULL ) { $Caption = $Value; }

+

+     $Data = $this->DataSet->getData();

+     if ( !isset($Data["Axis"][$AxisID]) ) { return(-1); }

+

+     if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+      {

+       $YPos = $this->scaleComputeY($Value,array("AxisID"=>$AxisID));

+       if ( $YPos >= $this->GraphAreaY1 && $YPos <= $this->GraphAreaY2 )

+        {

+         $this->drawLine($this->GraphAreaX1,$YPos,$this->GraphAreaX2,$YPos,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight));

+

+         if ( $Wide )

+          {

+           $this->drawLine($this->GraphAreaX1,$YPos-1,$this->GraphAreaX2,$YPos-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks));

+           $this->drawLine($this->GraphAreaX1,$YPos+1,$this->GraphAreaX2,$YPos+1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks));

+          }

+

+         if ( $WriteCaption )

+          {

+           if ( $CaptionAlign == CAPTION_LEFT_TOP )

+            { $X = $this->GraphAreaX1 + $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_MIDDLELEFT; }

+           else 

+            { $X = $this->GraphAreaX2 - $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_MIDDLERIGHT; }

+           

+           $this->drawText($X,$YPos,$Caption,$CaptionSettings);

+          }

+        }

+

+       return(array("Y"=>$YPos));

+      }

+

+     if ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM )

+      {

+       $XPos = $this->scaleComputeY($Value,array("AxisID"=>$AxisID));

+       if ( $XPos >= $this->GraphAreaX1 && $XPos <= $this->GraphAreaX2 )

+        {

+         $this->drawLine($XPos,$this->GraphAreaY1,$XPos,$this->GraphAreaY2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight));

+

+         if ( $Wide )

+          {

+           $this->drawLine($XPos-1,$this->GraphAreaY1,$XPos-1,$this->GraphAreaY2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks));

+           $this->drawLine($XPos+1,$this->GraphAreaY1,$XPos+1,$this->GraphAreaY2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks));

+          }

+

+         if ( $WriteCaption )

+          {

+           if ( $CaptionAlign == CAPTION_LEFT_TOP )

+            { $Y = $this->GraphAreaY1 + $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_TOPMIDDLE; }

+           else 

+            { $Y = $this->GraphAreaY2 - $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_BOTTOMMIDDLE; }

+

+           $CaptionSettings["Align"] = TEXT_ALIGN_TOPMIDDLE;

+           $this->drawText($XPos,$Y,$Caption,$CaptionSettings);

+          }

+        }

+

+       return(array("Y"=>$XPos));

+      }

+    }

+

+   /* Draw a threshold with the computed scale */

+   function drawThresholdArea($Value1,$Value2,$Format="")

+    {

+     $AxisID	= isset($Format["AxisID"]) ? $Format["AxisID"] : 0;

+     $R		= isset($Format["R"]) ? $Format["R"] : 255;

+     $G		= isset($Format["G"]) ? $Format["G"] : 0;

+     $B		= isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha	= isset($Format["Alpha"]) ? $Format["Alpha"] : 20;

+     $Border    = isset($Format["Border"]) ? $Format["Border"] : TRUE;

+     $BorderR   = isset($Format["BorderR"]) ? $Format["BorderR"] : $R;

+     $BorderG   = isset($Format["BorderG"]) ? $Format["BorderG"] : $G;

+     $BorderB   = isset($Format["BorderB"]) ? $Format["BorderB"] : $B;

+     $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha + 20;

+     $BorderTicks = isset($Format["BorderTicks"]) ? $Format["BorderTicks"] : 2;

+

+     if ($BorderAlpha >100) { $BorderAlpha = 100;}

+

+     $Data = $this->DataSet->getData();

+     if ( !isset($Data["Axis"][$AxisID]) ) { return(-1); }

+

+     if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+      {

+       $YPos1 = $this->scaleComputeY($Value1,array("AxisID"=>$AxisID));

+       $YPos2 = $this->scaleComputeY($Value2,array("AxisID"=>$AxisID));

+

+       if ( $YPos1 > $this->GraphAreaY2 ) { $YPos1 = $this->GraphAreaY2; } if ( $YPos1 < $this->GraphAreaY1 ) { $YPos1 = $this->GraphAreaY1; }

+       if ( $YPos2 > $this->GraphAreaY2 ) { $YPos2 = $this->GraphAreaY2; } if ( $YPos2 < $this->GraphAreaY1 ) { $YPos2 = $this->GraphAreaY1; }

+

+       $this->drawFilledRectangle($this->GraphAreaX1+1,$YPos1,$this->GraphAreaX2-1,$YPos2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));

+       if ( $Border )

+        {

+         $this->drawLine($this->GraphAreaX1+1,$YPos1,$this->GraphAreaX2-1,$YPos1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks));

+         $this->drawLine($this->GraphAreaX1+1,$YPos2,$this->GraphAreaX2-1,$YPos2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks));

+        }

+       return(array("Y1"=>$YPos1,"Y2"=>$YPos2));

+      }

+

+     if ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM )

+      {

+       $XPos1 = $this->scaleComputeY($Value1,array("AxisID"=>$AxisID));

+       $XPos2 = $this->scaleComputeY($Value2,array("AxisID"=>$AxisID));

+

+       if ( $XPos1 > $this->GraphAreaX2 ) { $XPos1 = $this->GraphAreaX2; } if ( $XPos1 < $this->GraphAreaX1 ) { $XPos1 = $this->GraphAreaX1; }

+       if ( $XPos2 > $this->GraphAreaX2 ) { $XPos2 = $this->GraphAreaX2; } if ( $XPos2 < $this->GraphAreaX1 ) { $XPos2 = $this->GraphAreaX1; }

+

+       $this->drawFilledRectangle($XPos1,$this->GraphAreaY1+1,$XPos2,$this->GraphAreaY2-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));

+       if ( $Border )

+        {

+         $this->drawLine($XPos1,$this->GraphAreaY1+1,$XPos1,$this->GraphAreaY2-1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks));

+         $this->drawLine($XPos2,$this->GraphAreaY1+1,$XPos2,$this->GraphAreaY2-1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks));

+        }

+       return(array("Y1"=>$XPos1,"Y2"=>$XPos2));

+      }

+    }

+

+   function scaleGetXSettings()

+    {

+     $Data = $this->DataSet->getData();

+     foreach($Data["Axis"] as $AxisID => $Settings)

+      {

+       if ( $Settings["Identity"] == AXIS_X )

+        {

+         $Rows = $Settings["Rows"];

+

+         return(array($Settings["Margin"],$Rows));

+        }

+      }

+    }

+

+   function scaleComputeY($Values,$Option="",$ReturnOnly0Height=FALSE)

+    {

+     $AxisID	= isset($Option["AxisID"]) ? $Option["AxisID"] : 0;

+     $SerieName	= isset($Option["SerieName"]) ? $Option["SerieName"] : NULL;

+

+     $Data = $this->DataSet->getData();

+     if ( !isset($Data["Axis"][$AxisID]) ) { return(-1); }

+

+     if ( $SerieName != NULL ) { $AxisID = $Data["Series"][$SerieName]["Axis"]; }

+     if ( !is_array($Values) ) { $tmp = $Values; $Values = ""; $Values[0] = $tmp; }

+

+     $Result = "";

+     if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+      {

+       $Height      = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Data["Axis"][$AxisID]["Margin"]*2;

+       $ScaleHeight = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"];

+       $Step        = $Height / $ScaleHeight;

+

+       if ( $ReturnOnly0Height )

+        { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $Step * $Value; } } }

+       else

+        { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $this->GraphAreaY2 - $Data["Axis"][$AxisID]["Margin"] - ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"])); } } }

+      }

+     else

+      {

+       $Width      = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Data["Axis"][$AxisID]["Margin"]*2;

+       $ScaleWidth = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"];

+       $Step       = $Width / $ScaleWidth;

+

+       if ( $ReturnOnly0Height )

+        { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $Step * $Value; } } }

+       else

+        { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $this->GraphAreaX1 + $Data["Axis"][$AxisID]["Margin"] + ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"])); } } }

+      }

+

+     if ( count($Result) == 1 )

+      return($Result[0]);

+     else

+      return($Result);

+    }

+

+   /* Format the axis values */

+   function scaleFormat($Value,$Mode=NULL,$Format=NULL,$Unit=NULL)

+    {

+     if ( $Mode == AXIS_FORMAT_DATE )

+      { if ( $Format == NULL ) { $Pattern = "d/m/Y"; } else { $Pattern = $Format; } return(date($Pattern,$Value)); }

+

+     if ( $Mode == AXIS_FORMAT_TIME )

+      { if ( $Format == NULL ) { $Pattern = "H:i:s"; } else { $Pattern = $Format; } return(date($Pattern,$Value)); }

+

+     if ( $Mode == AXIS_FORMAT_CURRENCY )

+      { return($Format.number_format($Value,2)); }

+

+     if ( $Mode == AXIS_FORMAT_METRIC )

+      {

+       if (abs($Value) > 1000000000)

+        return(round($Value/1000000000,$Format)."g".$Unit);

+       if (abs($Value) > 1000000)

+        return(round($Value/1000000,$Format)."m".$Unit);

+       elseif (abs($Value) >= 1000)

+        return(round($Value/1000,$Format)."k".$Unit);

+       

+      }

+     return($Value.$Unit);

+    }

+

+   /* Write Max value on a chart */

+   function writeBounds($Type=BOUND_BOTH,$Format=NULL)

+    {

+     $MaxLabelTxt	= isset($Format["MaxLabelTxt"]) ? $Format["MaxLabelTxt"] : "max=";

+     $MinLabelTxt	= isset($Format["MinLabelTxt"]) ? $Format["MinLabelTxt"] : "min=";

+     $Decimals		= isset($Format["Decimals"]) ? $Format["Decimals"] : 1;

+     $ExcludedSeries	= isset($Format["ExcludedSeries"]) ? $Format["ExcludedSeries"] : "";

+     $DisplayOffset	= isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 4;

+     $DisplayColor	= isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;

+     $MaxDisplayR	= isset($Format["MaxDisplayR"]) ? $Format["MaxDisplayR"] : 0;

+     $MaxDisplayG	= isset($Format["MaxDisplayG"]) ? $Format["MaxDisplayG"] : 0;

+     $MaxDisplayB	= isset($Format["MaxDisplayB"]) ? $Format["MaxDisplayB"] : 0;

+     $MinDisplayR	= isset($Format["MinDisplayR"]) ? $Format["MinDisplayR"] : 255;

+     $MinDisplayG	= isset($Format["MinDisplayG"]) ? $Format["MinDisplayG"] : 255;

+     $MinDisplayB	= isset($Format["MinDisplayB"]) ? $Format["MinDisplayB"] : 255;

+     $MinLabelPos	= isset($Format["MinLabelPos"]) ? $Format["MinLabelPos"] : BOUND_LABEL_POS_AUTO;

+     $MaxLabelPos	= isset($Format["MaxLabelPos"]) ? $Format["MaxLabelPos"] : BOUND_LABEL_POS_AUTO;

+     $DrawBox		= isset($Format["DrawBox"]) ? $Format["DrawBox"] : TRUE;

+     $DrawBoxBorder	= isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : FALSE;

+     $BorderOffset	= isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 3;

+     $BoxRounded	= isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : TRUE;

+     $RoundedRadius	= isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 3;

+     $BoxR		= isset($Format["BoxR"]) ? $Format["BoxR"] : 0;

+     $BoxG		= isset($Format["BoxG"]) ? $Format["BoxG"] : 0;

+     $BoxB		= isset($Format["BoxB"]) ? $Format["BoxB"] : 0;

+     $BoxAlpha		= isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 20;

+     $BoxSurrounding	= isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : "";

+     $BoxBorderR	= isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 255;

+     $BoxBorderG	= isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 255;

+     $BoxBorderB	= isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 255;

+     $BoxBorderAlpha	= isset($Format["BoxBorderAlpha"]) ? $Format["BoxBorderAlpha"] : 100;

+

+     $CaptionSettings = array("DrawBox"=>$DrawBox,"DrawBoxBorder"=>$DrawBoxBorder,"BorderOffset"=>$BorderOffset,"BoxRounded"=>$BoxRounded,"RoundedRadius"=>$RoundedRadius,

+                              "BoxR"=>$BoxR,"BoxG"=>$BoxG,"BoxB"=>$BoxB,"BoxAlpha"=>$BoxAlpha,"BoxSurrounding"=>$BoxSurrounding,

+                              "BoxBorderR"=>$BoxBorderR,"BoxBorderG"=>$BoxBorderG,"BoxBorderB"=>$BoxBorderB,"BoxBorderAlpha"=>$BoxBorderAlpha);

+

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+

+     $Data = $this->DataSet->getData();

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] && !isset($ExcludedSeries[$SerieName]))

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];

+         if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }

+

+         $MinValue = $this->DataSet->getMin($SerieName);

+         $MaxValue = $this->DataSet->getMax($SerieName);

+

+         $MinPos = VOID; $MaxPos = VOID;

+         foreach($Serie["Data"] as $Key => $Value)

+          { 

+           if ( $Value == $MinValue && $MinPos == VOID ) { $MinPos = $Key; }

+           if ( $Value == $MaxValue ) { $MaxPos = $Key; }

+          }

+

+         $AxisID	= $Serie["Axis"];

+         $Mode		= $Data["Axis"][$AxisID]["Display"];

+         $Format	= $Data["Axis"][$AxisID]["Format"];

+         $Unit		= $Data["Axis"][$AxisID]["Unit"];

+

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           $XStep       = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs;

+           $X           = $this->GraphAreaX1 + $XMargin;

+           $SerieOffset = isset($Serie["XOffset"]) ? $Serie["XOffset"] : 0;

+

+           if ( $Type == BOUND_MAX || $Type == BOUND_BOTH )

+            {

+             if ( $MaxLabelPos == BOUND_LABEL_POS_TOP    || ( $MaxLabelPos ==  BOUND_LABEL_POS_AUTO && $MaxValue >= 0) ) { $YPos  = $PosArray[$MaxPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_BOTTOMMIDDLE; }

+             if ( $MaxLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MaxLabelPos ==  BOUND_LABEL_POS_AUTO && $MaxValue < 0) ) { $YPos  = $PosArray[$MaxPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_TOPMIDDLE; }

+

+             $XPos  = $X + $MaxPos*$XStep + $SerieOffset;

+             $Label = $MaxLabelTxt.$this->scaleFormat(round($MaxValue,$Decimals),$Mode,$Format,$Unit);

+

+             $TxtPos  = $this->getTextBox($XPos,$YPos,$this->FontName,$this->FontSize,0,$Label);

+             $XOffset = 0; $YOffset = 0;

+             if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = (($this->GraphAreaX1 - $TxtPos[0]["X"])/2); }

+             if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -(($TxtPos[1]["X"] - $this->GraphAreaX2)/2); }

+             if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = $this->GraphAreaY1 - $TxtPos[2]["Y"]; }

+             if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -($TxtPos[0]["Y"] - $this->GraphAreaY2); }

+

+             $CaptionSettings["R"] = $MaxDisplayR; $CaptionSettings["G"] = $MaxDisplayG;

+             $CaptionSettings["B"] = $MaxDisplayB; $CaptionSettings["Align"] = $Align;

+

+             $this->drawText($XPos+$XOffset,$YPos+$YOffset,$Label,$CaptionSettings);

+            }

+

+           if ( $Type == BOUND_MIN || $Type == BOUND_BOTH )

+            {

+             if ( $MinLabelPos == BOUND_LABEL_POS_TOP    || ( $MinLabelPos ==  BOUND_LABEL_POS_AUTO && $MinValue >= 0) ) { $YPos  = $PosArray[$MinPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_BOTTOMMIDDLE; }

+             if ( $MinLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MinLabelPos ==  BOUND_LABEL_POS_AUTO && $MinValue < 0) ) { $YPos  = $PosArray[$MinPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_TOPMIDDLE; }

+

+             $XPos  = $X + $MinPos*$XStep + $SerieOffset;

+             $Label = $MinLabelTxt.$this->scaleFormat(round($MinValue,$Decimals),$Mode,$Format,$Unit);

+

+             $TxtPos  = $this->getTextBox($XPos,$YPos,$this->FontName,$this->FontSize,0,$Label);

+             $XOffset = 0; $YOffset = 0;

+             if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = (($this->GraphAreaX1 - $TxtPos[0]["X"])/2); }

+             if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -(($TxtPos[1]["X"] - $this->GraphAreaX2)/2); }

+             if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = $this->GraphAreaY1 - $TxtPos[2]["Y"]; }

+             if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -($TxtPos[0]["Y"] - $this->GraphAreaY2); }

+

+             $CaptionSettings["R"] = $MinDisplayR; $CaptionSettings["G"] = $MinDisplayG;

+             $CaptionSettings["B"] = $MinDisplayB; $CaptionSettings["Align"] = $Align;

+

+             $this->drawText($XPos+$XOffset,$YPos-$DisplayOffset+$YOffset,$Label,$CaptionSettings);

+            }

+          }

+         else

+          {

+           $XStep       = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs;

+           $X           = $this->GraphAreaY1 + $XMargin;

+           $SerieOffset = isset($Serie["XOffset"]) ? $Serie["XOffset"] : 0;

+

+           if ( $Type == BOUND_MAX || $Type == BOUND_BOTH )

+            {

+             if ( $MaxLabelPos == BOUND_LABEL_POS_TOP    || ( $MaxLabelPos ==  BOUND_LABEL_POS_AUTO && $MaxValue >= 0) ) { $YPos  = $PosArray[$MaxPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLELEFT; }

+             if ( $MaxLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MaxLabelPos ==  BOUND_LABEL_POS_AUTO && $MaxValue < 0) ) { $YPos  = $PosArray[$MaxPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLERIGHT; }

+

+             $XPos  = $X + $MaxPos*$XStep + $SerieOffset;

+             $Label = $MaxLabelTxt.$this->scaleFormat($MaxValue,$Mode,$Format,$Unit);

+

+             $TxtPos  = $this->getTextBox($YPos,$XPos,$this->FontName,$this->FontSize,0,$Label);

+             $XOffset = 0; $YOffset = 0;

+             if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = $this->GraphAreaX1 - $TxtPos[0]["X"]; }

+             if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -($TxtPos[1]["X"] - $this->GraphAreaX2); }

+             if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = ($this->GraphAreaY1 - $TxtPos[2]["Y"])/2; }

+             if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -(($TxtPos[0]["Y"] - $this->GraphAreaY2)/2);}

+

+             $CaptionSettings["R"] = $MaxDisplayR; $CaptionSettings["G"] = $MaxDisplayG;

+             $CaptionSettings["B"] = $MaxDisplayB; $CaptionSettings["Align"] = $Align;

+

+             $this->drawText($YPos+$XOffset,$XPos+$YOffset,$Label,$CaptionSettings);

+            }

+

+           if ( $Type == BOUND_MIN || $Type == BOUND_BOTH )

+            {

+             if ( $MinLabelPos == BOUND_LABEL_POS_TOP    || ( $MinLabelPos ==  BOUND_LABEL_POS_AUTO && $MinValue >= 0) ) { $YPos  = $PosArray[$MinPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLELEFT; }

+             if ( $MinLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MinLabelPos ==  BOUND_LABEL_POS_AUTO && $MinValue < 0) ) { $YPos  = $PosArray[$MinPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLERIGHT; }

+

+             $XPos  = $X + $MinPos*$XStep + $SerieOffset;

+             $Label = $MinLabelTxt.$this->scaleFormat($MinValue,$Mode,$Format,$Unit);

+

+             $TxtPos  = $this->getTextBox($YPos,$XPos,$this->FontName,$this->FontSize,0,$Label);

+             $XOffset = 0; $YOffset = 0;

+             if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = $this->GraphAreaX1 - $TxtPos[0]["X"]; }

+             if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -($TxtPos[1]["X"] - $this->GraphAreaX2); }

+             if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = ($this->GraphAreaY1 - $TxtPos[2]["Y"])/2; }

+             if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -(($TxtPos[0]["Y"] - $this->GraphAreaY2)/2);}

+

+             $CaptionSettings["R"] = $MinDisplayR; $CaptionSettings["G"] = $MinDisplayG;

+             $CaptionSettings["B"] = $MinDisplayB; $CaptionSettings["Align"] = $Align;

+

+             $this->drawText($YPos+$XOffset,$XPos+$YOffset,$Label,$CaptionSettings);

+            }

+          }

+        }

+      }

+    }

+

+   /* Draw a plot chart */

+   function drawPlotChart($Format=NULL)

+    {

+     $PlotSize		= isset($Format["PlotSize"]) ? $Format["PlotSize"] : 3;

+     $PlotBorder	= isset($Format["PlotBorder"]) ? $Format["PlotBorder"] : FALSE;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : 50;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : 50;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : 50;

+     $BorderAlpha	= isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30;

+     $BorderSize	= isset($Format["BorderSize"]) ? $Format["BorderSize"] : 2;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $DisplayValues	= isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;

+     $DisplayOffset	= isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 4;

+     $DisplayColor	= isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;

+     $DisplayR		= isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;

+     $DisplayG		= isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;

+     $DisplayB		= isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;

+

+     $Data = $this->DataSet->getData();

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];

+         if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; }

+         if ( isset($Serie["Picture"]) )

+          { $Picture = $Serie["Picture"]; list($PicWidth,$PicHeight,$PicType) = $this->getPicInfo($Picture); }

+         else { $Picture = NULL; $PicOffset = 0; }

+

+         if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }

+

+         $AxisID	= $Serie["Axis"];

+         $Mode		= $Data["Axis"][$AxisID]["Display"];

+         $Format	= $Data["Axis"][$AxisID]["Format"];

+         $Unit		= $Data["Axis"][$AxisID]["Unit"];

+

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));

+

+         $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }

+           if ( $Picture != NULL ) { $PicOffset = $PicHeight / 2; $PlotSize = 0; }

+           $X = $this->GraphAreaX1 + $XMargin;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           foreach($PosArray as $Key => $Y)

+            {

+             if ( $DisplayValues ) 

+              $this->drawText($X,$Y-$DisplayOffset-$PlotSize-$BorderSize-$PicOffset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+             if ( $Y != VOID )

+              {

+               if ( $Picture != NULL )

+                { $this->drawFromPicture($PicType,$Picture,$X-$PicWidth/2,$Y-$PicHeight/2); }

+               else

+                {

+                 if ( $PlotBorder ) { $this->drawFilledCircle($X,$Y,$PlotSize+$BorderSize,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); }

+                 $this->drawFilledCircle($X,$Y,$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+                }

+              }

+             $X = $X + $XStep;

+            }

+          }

+         else

+          {

+           if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }

+           if ( $Picture != NULL ) { $PicOffset = $PicWidth / 2; $PlotSize = 0; }

+           $Y = $this->GraphAreaY1 + $XMargin;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           foreach($PosArray as $Key => $X)

+            {

+             if ( $DisplayValues ) 

+              $this->drawText($X+$DisplayOffset+$PlotSize+$BorderSize+$PicOffset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+             if ( $X != VOID )

+              {

+               if ( $Picture != NULL )

+                { $this->drawFromPicture($PicType,$Picture,$X-$PicWidth/2,$Y-$PicHeight/2); }

+               else

+                {

+                 if ( $PlotBorder ) { $this->drawFilledCircle($X,$Y,$PlotSize+$BorderSize,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); }

+                 $this->drawFilledCircle($X,$Y,$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+                }

+              }

+             $Y = $Y + $YStep;

+            }

+          }

+        }

+      }

+    }

+

+   /* Draw a spline chart */

+   function drawSplineChart($Format=NULL)

+    {

+     $BreakVoid		= isset($Format["BreakVoid"]) ? $Format["BreakVoid"] : TRUE;

+     $VoidTicks		= isset($Format["VoidTicks"]) ? $Format["VoidTicks"] : 4;

+     $BreakR		= isset($Format["BreakR"]) ? $Format["BreakR"] : NULL; // 234

+     $BreakG		= isset($Format["BreakG"]) ? $Format["BreakG"] : NULL; // 55

+     $BreakB		= isset($Format["BreakB"]) ? $Format["BreakB"] : NULL; // 26

+     $DisplayValues	= isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;

+     $DisplayOffset	= isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;

+     $DisplayColor	= isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;

+     $DisplayR		= isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;

+     $DisplayG		= isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;

+     $DisplayB		= isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;

+

+     $Data = $this->DataSet->getData();

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];

+

+         if ( $BreakR == NULL )

+          $BreakSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks);

+         else

+          $BreakSettings = array("R"=>$BreakR,"G"=>$BreakG,"B"=>$BreakB,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight);

+

+         if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }

+

+         $AxisID	= $Serie["Axis"];

+         $Mode		= $Data["Axis"][$AxisID]["Display"];

+         $Format	= $Data["Axis"][$AxisID]["Format"];

+         $Unit		= $Data["Axis"][$AxisID]["Unit"];

+

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));

+

+         $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $X     = $this->GraphAreaX1 + $XMargin; $WayPoints = "";

+           $Force = $XStep / 5;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           $LastGoodY = NULL; $LastGoodX = NULL; $LastX = 1; $LastY = 1;

+           foreach($PosArray as $Key => $Y)

+            {

+             if ( $DisplayValues ) 

+              $this->drawText($X,$Y-$DisplayOffset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+	

+             if ( $Y == VOID && $LastY != NULL )

+              { $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); $WayPoints = ""; }

+

+             if ( $Y != VOID && $LastY == NULL && $LastGoodY != NULL && !$BreakVoid )

+              { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); }

+

+             if ( $Y != VOID )

+              $WayPoints[] = array($X,$Y);

+

+             if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }

+             if ( $Y == VOID ) { $Y = NULL; }

+

+             $LastX = $X; $LastY = $Y;

+             $X = $X + $XStep;

+            }

+           $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight));

+          }

+         else

+          {

+           if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }

+           $Y     = $this->GraphAreaY1 + $XMargin; $WayPoints = "";

+           $Force = $YStep / 5;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           $LastGoodY = NULL; $LastGoodX = NULL; $LastX = 1; $LastY = 1;

+           foreach($PosArray as $Key => $X)

+            {

+             if ( $DisplayValues ) 

+              $this->drawText($X+$DisplayOffset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+             if ( $X == VOID && $LastX != NULL )

+              { $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); $WayPoints = ""; }

+

+             if ( $X != VOID && $LastX == NULL && $LastGoodX != NULL && !$BreakVoid )

+              { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); }

+

+             if ( $X != VOID )

+              $WayPoints[] = array($X,$Y);

+

+             if ( $X != VOID ) { $LastGoodX = $X; $LastGoodY = $Y; }

+             if ( $X == VOID ) { $X = NULL; }

+

+             $LastX = $X; $LastY = $Y;

+             $Y = $Y + $YStep;

+            }

+           $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight));

+          }

+        }

+      }

+    }

+

+   /* Draw a filled spline chart */

+   function drawFilledSplineChart($Format=NULL)

+    {

+     $DisplayValues	= isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;

+     $DisplayOffset	= isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;

+     $DisplayColor	= isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;

+     $DisplayR		= isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;

+     $DisplayG		= isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;

+     $DisplayB		= isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;

+     $AroundZero	= isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE;

+

+     $Data = $this->DataSet->getData();

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];

+         if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }

+

+         $AxisID	= $Serie["Axis"];

+         $Mode		= $Data["Axis"][$AxisID]["Display"];

+         $Format	= $Data["Axis"][$AxisID]["Format"];

+         $Unit		= $Data["Axis"][$AxisID]["Unit"];

+

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));

+         if ( $AroundZero ) { $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); }

+

+         $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $X     = $this->GraphAreaX1 + $XMargin; $WayPoints = "";

+           $Force = $XStep / 5;

+

+           if ( !$AroundZero ) { $YZero = $this->GraphAreaY2-1; }

+           if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }

+           if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; }

+

+           $LastX = ""; $LastY = "";

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           foreach($PosArray as $Key => $Y)

+            {

+             if ( $DisplayValues ) 

+              $this->drawText($X,$Y-$DisplayOffset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+             if ( $Y == VOID )

+              {

+               $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE));

+

+               if ( $Area != "" )

+                {

+                 foreach ($Area as $key => $Points)

+                  {

+                   $Corners = ""; $Corners[] = $Area[$key][0]["X"]; $Corners[] = $YZero;

+                   foreach($Points as $subKey => $Point)

+                    {

+                     if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; }

+                     $Corners[] = $Point["Y"]+1;

+                    }

+                   $Corners[] = $Points[$subKey]["X"]-1; $Corners[] = $YZero;

+

+                   $this->drawPolygon($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE));

+                  }

+                 $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+                }

+

+               $WayPoints = "";

+              }

+             else

+              $WayPoints[] = array($X,$Y-.5); /* -.5 for AA visual fix */

+

+             $X = $X + $XStep;

+            }

+           $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE));

+

+           if ( $Area != "" )

+            {

+             foreach ($Area as $key => $Points)

+              {

+               $Corners = ""; $Corners[] = $Area[$key][0]["X"]; $Corners[] = $YZero;

+               foreach($Points as $subKey => $Point)

+                {

+                 if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; }

+                 $Corners[] = $Point["Y"]+1;

+                }

+               $Corners[] = $Points[$subKey]["X"]-1; $Corners[] = $YZero;

+

+               $this->drawPolygon($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE));

+              }

+             $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+            }

+          }

+         else

+          {

+           if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }

+           $Y     = $this->GraphAreaY1 + $XMargin; $WayPoints = "";

+           $Force = $YStep / 5;

+

+           if ( !$AroundZero ) { $YZero = $this->GraphAreaX1+1; }

+           if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }

+           if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           foreach($PosArray as $Key => $X)

+            {

+             if ( $DisplayValues ) 

+              $this->drawText($X+$DisplayOffset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+             if ( $X == VOID )

+              {

+               $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE));

+

+               if ( $Area != "" )

+                {

+                 foreach ($Area as $key => $Points)

+                  {

+                   $Corners = ""; $Corners[] = $YZero; $Corners[] = $Area[$key][0]["Y"];

+                   foreach($Points as $subKey => $Point)

+                    {

+                     if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; }

+                     $Corners[] = $Point["Y"];

+                    }

+                   $Corners[] = $YZero; $Corners[] = $Points[$subKey]["Y"]-1;

+

+                   $this->drawPolygon($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE));

+                  }

+                 $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+                }

+

+               $WayPoints = "";

+              }

+             else

+              $WayPoints[] = array($X,$Y);

+

+             $Y = $Y + $YStep;

+            }

+           $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE));

+

+           if ( $Area != "" )

+            {

+             foreach ($Area as $key => $Points)

+              {

+               $Corners = ""; $Corners[] = $YZero; $Corners[] = $Area[$key][0]["Y"];

+               foreach($Points as $subKey => $Point)

+                {

+                 if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; }

+                 $Corners[] = $Point["Y"];

+                }

+               $Corners[] = $YZero; $Corners[] = $Points[$subKey]["Y"]-1;

+

+               $this->drawPolygon($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE));

+              }

+             $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));

+            }

+

+          }

+        }

+      }

+    }

+

+   /* Draw a line chart */

+   function drawLineChart($Format=NULL)

+    {

+     $BreakVoid		= isset($Format["BreakVoid"]) ? $Format["BreakVoid"] : TRUE;

+     $VoidTicks		= isset($Format["VoidTicks"]) ? $Format["VoidTicks"] : 4;

+     $BreakR		= isset($Format["BreakR"]) ? $Format["BreakR"] : NULL;

+     $BreakG		= isset($Format["BreakG"]) ? $Format["BreakG"] : NULL;

+     $BreakB		= isset($Format["BreakB"]) ? $Format["BreakB"] : NULL;

+     $DisplayValues	= isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;

+     $DisplayOffset	= isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;

+     $DisplayColor	= isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;

+     $DisplayR		= isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;

+     $DisplayG		= isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;

+     $DisplayB		= isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;

+

+     $Data = $this->DataSet->getData();

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];

+

+         if ( $BreakR == NULL )

+          $BreakSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight);

+         else

+          $BreakSettings = array("R"=>$BreakR,"G"=>$BreakG,"B"=>$BreakB,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight);

+

+         if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }

+

+         $AxisID	= $Serie["Axis"];

+         $Mode		= $Data["Axis"][$AxisID]["Display"];

+         $Format	= $Data["Axis"][$AxisID]["Format"];

+         $Unit		= $Data["Axis"][$AxisID]["Unit"];

+

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));

+

+         $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           $LastGoodY = NULL; $LastGoodX = NULL;

+           foreach($PosArray as $Key => $Y)

+            {

+             if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) 

+              {

+               if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; }

+               $this->drawText($X,$Y-$Offset-$Weight,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align));

+              }

+

+             if ( $Y != VOID && $LastX != NULL && $LastY != NULL )

+              $this->drawLine($LastX,$LastY,$X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight));

+

+             if ( $Y != VOID && $LastY == NULL && $LastGoodY != NULL && !$BreakVoid )

+              { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); $LastGoodY = NULL; }

+

+             if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }

+             if ( $Y == VOID ) { $Y = NULL; }

+

+             $LastX = $X; $LastY = $Y;

+             $X = $X + $XStep;

+            }

+          }

+         else

+          {

+           if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }

+           $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           $LastGoodY = NULL; $LastGoodX = NULL;

+           foreach($PosArray as $Key => $X)

+            {

+             if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) 

+              { $this->drawText($X+$DisplayOffset+$Weight,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); }

+

+             if ( $X != VOID && $LastX != NULL && $LastY != NULL )

+              $this->drawLine($LastX,$LastY,$X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight));

+

+             if ( $X != VOID && $LastX == NULL && $LastGoodY != NULL && !$BreakVoid )

+              { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); $LastGoodY = NULL; }

+

+             if ( $X != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }

+             if ( $X == VOID ) { $X = NULL; }

+

+             $LastX = $X; $LastY = $Y;

+             $Y = $Y + $YStep;

+            }

+          }

+        }

+      }

+    }

+

+   /* Draw a step chart */

+   function drawStepChart($Format=NULL)

+    {

+     $BreakVoid		= isset($Format["BreakVoid"]) ? $Format["BreakVoid"] : FALSE;

+     $ReCenter		= isset($Format["ReCenter"]) ? $Format["ReCenter"] : TRUE;

+     $VoidTicks		= isset($Format["VoidTicks"]) ? $Format["VoidTicks"] : 4;

+     $BreakR		= isset($Format["BreakR"]) ? $Format["BreakR"] : NULL;

+     $BreakG		= isset($Format["BreakG"]) ? $Format["BreakG"] : NULL;

+     $BreakB		= isset($Format["BreakB"]) ? $Format["BreakB"] : NULL;

+     $DisplayValues	= isset($Format["DisplayValues"]) ? $Format["DisplayValues"] :FALSE;

+     $DisplayOffset	= isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;

+     $DisplayColor	= isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;

+     $DisplayR		= isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;

+     $DisplayG		= isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;

+     $DisplayB		= isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;

+

+     $Data = $this->DataSet->getData();

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];

+

+         if ( $BreakR == NULL )

+          $BreakSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight);

+         else

+          $BreakSettings = array("R"=>$BreakR,"G"=>$BreakG,"B"=>$BreakB,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight);

+

+         if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }

+

+         $AxisID	= $Serie["Axis"];

+         $Mode		= $Data["Axis"][$AxisID]["Display"];

+         $Format	= $Data["Axis"][$AxisID]["Format"];

+         $Unit		= $Data["Axis"][$AxisID]["Unit"];

+         $Color		= array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight);

+

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));

+

+         $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           $LastGoodY = NULL; $LastGoodX = NULL; $Init = FALSE;

+           foreach($PosArray as $Key => $Y)

+            {

+             if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) 

+              {

+               if ( $Y <= $LastY ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; }

+               $this->drawText($X,$Y-$Offset-$Weight,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align));

+              }

+

+             if ( $Y != VOID && $LastX != NULL && $LastY != NULL )

+              {

+               $this->drawLine($LastX,$LastY,$X,$LastY,$Color);

+               $this->drawLine($X,$LastY,$X,$Y,$Color);

+               if ( $ReCenter && $X+$XStep < $this->GraphAreaX2 - $XMargin ) { $this->drawLine($X,$Y,$X+$XStep,$Y,$Color); }

+              }

+

+             if ( $Y != VOID && $LastY == NULL && $LastGoodY != NULL && !$BreakVoid )

+              { 

+               if ( $ReCenter )

+                $this->drawLine($LastGoodX+$XStep,$LastGoodY,$X,$LastGoodY,$BreakSettings);

+               else

+                $this->drawLine($LastGoodX,$LastGoodY,$X,$LastGoodY,$BreakSettings);

+

+               $this->drawLine($X,$LastGoodY,$X,$Y,$BreakSettings);

+               $LastGoodY = NULL;

+              }

+             elseif( !$BreakVoid && $LastGoodY == NULL && $Y != VOID )

+              $this->drawLine($this->GraphAreaX1 + $XMargin,$Y,$X,$Y,$BreakSettings);

+

+             if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }

+             if ( $Y == VOID ) { $Y = NULL; }

+

+             if ( !$Init && $ReCenter ) { $X = $X - $XStep/2; $Init = TRUE; }

+             $LastX = $X; $LastY = $Y;

+             if ( $LastX < $this->GraphAreaX1 + $XMargin ) { $LastX = $this->GraphAreaX1 + $XMargin; }

+             $X = $X + $XStep;

+            }

+           if ( $ReCenter ) { $this->drawLine($LastX,$LastY,$this->GraphAreaX2 - $XMargin,$LastY,$Color); }

+          }

+         else

+          {

+           if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }

+           $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           $LastGoodY = NULL; $LastGoodX = NULL; $Init = FALSE;

+           foreach($PosArray as $Key => $X)

+            {

+             if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) 

+              {

+               if ( $X >= $LastX ) { $Align = TEXT_ALIGN_MIDDLELEFT; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_MIDDLERIGHT; $Offset = -$DisplayOffset; }

+               $this->drawText($X+$Offset+$Weight,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align));

+              }

+

+             if ( $X != VOID && $LastX != NULL && $LastY != NULL )

+              {

+               $this->drawLine($LastX,$LastY,$LastX,$Y,$Color);

+               $this->drawLine($LastX,$Y,$X,$Y,$Color);

+              }

+

+             if ( $X != VOID && $LastX == NULL && $LastGoodY != NULL && !$BreakVoid )

+              {

+               $this->drawLine($LastGoodX,$LastGoodY,$LastGoodX,$LastGoodY+$YStep,$Color);

+

+               $this->drawLine($LastGoodX,$LastGoodY+$YStep,$LastGoodX,$Y,$BreakSettings);

+               $this->drawLine($LastGoodX,$Y,$X,$Y,$BreakSettings);

+               $LastGoodY = NULL;

+              }

+             elseif ( $X != VOID && $LastGoodY == NULL && !$BreakVoid )

+              $this->drawLine($X,$this->GraphAreaY1 + $XMargin,$X,$Y,$BreakSettings);

+

+             if ( $X != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }

+             if ( $X == VOID ) { $X = NULL; }

+

+             if ( !$Init && $ReCenter ) { $Y = $Y - $YStep/2; $Init = TRUE; }

+             $LastX = $X; $LastY = $Y;

+             if ( $LastY < $this->GraphAreaY1 + $XMargin ) { $LastY = $this->GraphAreaY1 + $XMargin; }

+             $Y = $Y + $YStep;

+            }

+           if ( $ReCenter ) { $this->drawLine($LastX,$LastY,$LastX,$this->GraphAreaY2 - $XMargin,$Color); }

+          }

+        }

+      }

+    }

+

+   /* Draw a step chart */

+   function drawFilledStepChart($Format=NULL)

+    {

+     $ReCenter		= isset($Format["ReCenter"]) ? $Format["ReCenter"] : TRUE;

+     $DisplayValues	= isset($Format["DisplayValues"]) ? $Format["DisplayValues"] :FALSE;

+     $DisplayOffset	= isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;

+     $DisplayColor	= isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;

+     $ForceTransparency	= isset($Format["ForceTransparency"]) ? $Format["ForceTransparency"] : NULL;

+     $DisplayR		= isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;

+     $DisplayG		= isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;

+     $DisplayB		= isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;

+     $AroundZero	= isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE;

+

+     $Data = $this->DataSet->getData();

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];

+

+         if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }

+

+         $AxisID	= $Serie["Axis"];

+         $Mode		= $Data["Axis"][$AxisID]["Display"];

+         $Format	= $Data["Axis"][$AxisID]["Format"];

+         $Unit		= $Data["Axis"][$AxisID]["Unit"];

+

+         $Color		= array("R"=>$R,"G"=>$G,"B"=>$B);

+         if ( $ForceTransparency != NULL ) { $Color["Alpha"] = $ForceTransparency; } else { $Color["Alpha"] = $Alpha; }

+

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));

+         $YZero    = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"]));

+

+         $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }

+           if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; }

+

+           if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL;

+

+           if ( !$AroundZero ) { $YZero = $this->GraphAreaY2-1; }

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           $LastGoodY = NULL; $LastGoodX = NULL; $Points = ""; $Init = FALSE;

+           foreach($PosArray as $Key => $Y)

+            {

+             if ( $Y == VOID && $LastX != NULL && $LastY != NULL && $Points !="" )

+              {

+               $Points[] = $LastX; $Points[] = $LastY;

+               $Points[] = $X; $Points[] = $LastY;

+               $Points[] = $X; $Points[] = $YZero;

+               $this->drawPolygon($Points,$Color);

+               $Points = "";

+              }

+

+             if ( $Y != VOID && $LastX != NULL && $LastY != NULL )

+              {

+               if ( $Points == "") { $Points[] = $LastX; $Points[] = $YZero; }

+               $Points[] = $LastX; $Points[] = $LastY;

+               $Points[] = $X; $Points[] = $LastY;

+               $Points[] = $X; $Points[] = $Y;

+              }

+

+             if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }

+             if ( $Y == VOID ) { $Y = NULL; }

+

+             if ( !$Init && $ReCenter ) { $X = $X - $XStep/2; $Init = TRUE; }

+             $LastX = $X; $LastY = $Y;

+             if ( $LastX < $this->GraphAreaX1 + $XMargin ) { $LastX = $this->GraphAreaX1 + $XMargin; }

+             $X = $X + $XStep;

+            }

+

+           if ( $ReCenter )

+            {

+             $Points[] = $LastX+$XStep/2; $Points[] = $LastY;

+             $Points[] = $LastX+$XStep/2; $Points[] = $YZero;

+            }

+           else

+            { $Points[] = $LastX; $Points[] = $YZero; }

+

+           $this->drawPolygon($Points,$Color);

+          }

+         else

+          {

+           if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }

+           if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }

+

+           if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }

+           $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           $LastGoodY = NULL; $LastGoodX = NULL; $Points = "";

+           foreach($PosArray as $Key => $X)

+            {

+             if ( $X == VOID && $LastX != NULL && $LastY != NULL && $Points !="" )

+              {

+               $Points[] = $LastX; $Points[] = $LastY;

+               $Points[] = $LastX; $Points[] = $Y;

+               $Points[] = $YZero; $Points[] = $Y;

+               $this->drawPolygon($Points,$Color);

+               $Points = "";

+              }

+

+             if ( $X != VOID && $LastX != NULL && $LastY != NULL )

+              {

+               if ( $Points == "") { $Points[] = $YZero; $Points[] = $LastY; }

+               $Points[] = $LastX; $Points[] = $LastY;

+               $Points[] = $LastX; $Points[] = $Y;

+               $Points[] = $X; $Points[] = $Y;

+              }

+

+             if ( $X != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }

+             if ( $X == VOID ) { $X = NULL; }

+

+             if ( $LastX == NULL && $ReCenter ) { $Y = $Y - $YStep/2; }

+             $LastX = $X; $LastY = $Y;

+             if ( $LastY < $this->GraphAreaY1 + $XMargin ) { $LastY = $this->GraphAreaY1 + $XMargin; }

+             $Y = $Y + $YStep;

+            }

+

+           if ( $ReCenter )

+            {

+             $Points[] = $LastX; $Points[] = $LastY+$YStep/2;

+             $Points[] = $YZero; $Points[] = $LastY+$YStep/2;

+            }

+           else

+            { $Points[] = $YZero; $Points[] = $LastY; }

+

+           $this->drawPolygon($Points,$Color);

+          }

+        }

+      }

+    }

+

+   /* Draw an area chart */

+   function drawAreaChart($Format=NULL)

+    {

+     $DisplayValues	= isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;

+     $DisplayOffset	= isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;

+     $DisplayColor	= isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;

+     $DisplayR		= isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;

+     $DisplayG		= isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;

+     $DisplayB		= isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;

+     $ForceTransparency	= isset($Format["ForceTransparency"]) ? $Format["ForceTransparency"] : 50;

+     $AroundZero	= isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE;

+

+     $Data  = $this->DataSet->getData();

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];

+         if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }

+

+         $AxisID	= $Serie["Axis"];

+         $Mode		= $Data["Axis"][$AxisID]["Display"];

+         $Format	= $Data["Axis"][$AxisID]["Format"];

+         $Unit		= $Data["Axis"][$AxisID]["Unit"];

+

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));

+         $YZero    = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"]));

+

+         $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }

+

+           $Areas = ""; $AreaID = 0; 

+           $Areas[$AreaID][] = $this->GraphAreaX1 + $XMargin;

+           if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; }

+

+           if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $X     = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           foreach($PosArray as $Key => $Y)

+            {

+             if ( $DisplayValues && $Serie["Data"][$Key] != VOID )

+              {

+               if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; }

+               $this->drawText($X,$Y-$Offset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align));

+              }

+

+             if ( $Y == VOID && isset($Areas[$AreaID]) )

+              {

+               $Areas[$AreaID][] = $LastX;

+               if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; }

+

+               $AreaID++;

+              }

+             elseif ($Y != VOID)

+              {

+               if ( !isset($Areas[$AreaID]) )

+                {

+                 $Areas[$AreaID][] = $X;

+                 if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; }

+                }

+

+               $Areas[$AreaID][] = $X;

+               $Areas[$AreaID][] = $Y;

+              }

+

+             $LastX = $X;

+             $X = $X + $XStep;

+            }

+           $Areas[$AreaID][] = $LastX;

+           if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; }

+

+           $Alpha = $ForceTransparency != NULL ? $ForceTransparency : $Alpha;

+           $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);

+           foreach($Areas as $Key => $Points)

+            $this->drawPolygon($Points,$Color);

+          }

+         else

+          {

+           if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }

+           if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }

+

+           $Areas = ""; $AreaID = 0; 

+           if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; }

+           $Areas[$AreaID][] = $this->GraphAreaY1 + $XMargin;

+

+           if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }

+           $Y     = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           foreach($PosArray as $Key => $X)

+            {

+             if ( $DisplayValues && $Serie["Data"][$Key] != VOID )

+              {

+               if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; }

+               $this->drawText($X+$Offset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align));

+              }

+

+

+             if ( $X == VOID && isset($Areas[$AreaID]) )

+              {

+               if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; }

+               $Areas[$AreaID][] = $LastY;

+

+               $AreaID++;

+              }

+             elseif ($X != VOID)

+              {

+               if ( !isset($Areas[$AreaID]) )

+                {

+                 if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; }

+                 $Areas[$AreaID][] = $Y;

+                }

+

+               $Areas[$AreaID][] = $X;

+               $Areas[$AreaID][] = $Y;

+              }

+

+             $LastX = $X; $LastY = $Y;

+             $Y = $Y + $YStep;

+            }

+           if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; }

+           $Areas[$AreaID][] = $LastY;

+

+           $Alpha = $ForceTransparency != NULL ? $ForceTransparency : $Alpha;

+           $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);

+           foreach($Areas as $Key => $Points)

+            $this->drawPolygon($Points,$Color);

+          }

+        }

+      }

+    }

+

+

+   /* Draw a bar chart */

+   function drawBarChart($Format=NULL)

+    {

+     $Floating0Serie	= isset($Format["Floating0Serie"]) ? $Format["Floating0Serie"] : NULL;

+     $Floating0Value	= isset($Format["Floating0Value"]) ? $Format["Floating0Value"] : NULL;

+     $Draw0Line		= isset($Format["Draw0Line"]) ? $Format["Draw0Line"] : FALSE;

+     $DisplayValues	= isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;

+     $DisplayOffset	= isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;

+     $DisplayColor	= isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;

+     $DisplayFont	= isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontName;

+     $DisplaySize	= isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontSize;

+     $DisplayPos	= isset($Format["DisplayPos"]) ? $Format["DisplayPos"] : LABEL_POS_OUTSIDE;

+     $DisplayShadow	= isset($Format["DisplayShadow"]) ? $Format["DisplayShadow"] : TRUE;

+     $DisplayR		= isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;

+     $DisplayG		= isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;

+     $DisplayB		= isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;

+     $AroundZero	= isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE;

+     $Interleave	= isset($Format["Interleave"]) ? $Format["Interleave"] : .5;

+     $Rounded		= isset($Format["Rounded"]) ? $Format["Rounded"] : FALSE;

+     $RoundRadius	= isset($Format["RoundRadius"]) ? $Format["RoundRadius"] : 4;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : -1;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : -1;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : -1;

+     $Gradient		= isset($Format["Gradient"]) ? $Format["Gradient"] : FALSE;

+     $GradientMode	= isset($Format["GradientMode"]) ? $Format["GradientMode"] : GRADIENT_SIMPLE;

+     $GradientAlpha	= isset($Format["GradientAlpha"]) ? $Format["GradientAlpha"] : 20;

+     $GradientStartR	= isset($Format["GradientStartR"]) ? $Format["GradientStartR"] : 255;

+     $GradientStartG	= isset($Format["GradientStartG"]) ? $Format["GradientStartG"] : 255;

+     $GradientStartB	= isset($Format["GradientStartB"]) ? $Format["GradientStartB"] : 255;

+     $GradientEndR	= isset($Format["GradientEndR"]) ? $Format["GradientEndR"] : 0;

+     $GradientEndG	= isset($Format["GradientEndG"]) ? $Format["GradientEndG"] : 0;

+     $GradientEndB	= isset($Format["GradientEndB"]) ? $Format["GradientEndB"] : 0;

+     $TxtMargin		= isset($Format["TxtMargin"]) ? $Format["TxtMargin"] : 6;

+     $OverrideColors	= isset($Format["OverrideColors"]) ? $Format["OverrideColors"] : NULL;

+     $OverrideSurrounding = isset($Format["OverrideSurrounding"]) ? $Format["OverrideSurrounding"] : 30;

+

+     if ( $OverrideColors != NULL ) { $OverrideColors = $this->validatePalette($OverrideColors,$OverrideSurrounding); }

+

+     $Data = $this->DataSet->getData();

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+

+     $RestoreShadow = $this->Shadow;

+

+     $SeriesCount  = $this->countDrawableSeries();

+     $CurrentSerie = 0;

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];

+         if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }

+         if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }

+

+         $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB);

+

+         $AxisID	= $Serie["Axis"];

+         $Mode		= $Data["Axis"][$AxisID]["Display"];

+         $Format	= $Data["Axis"][$AxisID]["Format"];

+         $Unit		= $Data["Axis"][$AxisID]["Unit"];

+

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));

+

+         if ( $Floating0Value != NULL )

+          { $YZero = $this->scaleComputeY($Floating0Value,array("AxisID"=>$Serie["Axis"])); }

+         else

+          { $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); }

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }

+           if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; }

+

+           if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $X = $this->GraphAreaX1 + $XMargin;

+

+           if ( $AroundZero ) { $Y1 = $YZero; } else { $Y1 = $this->GraphAreaY2-1; }

+           if ( $XDivs == 0 ) { $XSize = ($this->GraphAreaX2-$this->GraphAreaX1)/($SeriesCount+$Interleave); } else { $XSize   = ($XStep / ($SeriesCount+$Interleave) ); }

+           

+           $XOffset = -($XSize*$SeriesCount)/2 + $CurrentSerie * $XSize;

+           $this->DataSet->Data["Series"][$SerieName]["XOffset"] = $XOffset + $XSize / 2;

+

+

+           if ( $Rounded || $BorderR != -1) { $XSpace = 1; } else { $XSpace = 0; }

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+

+           $ID = 0;

+           foreach($PosArray as $Key => $Y2)

+            {

+             if ( $Floating0Serie != NULL )

+              {

+               if ( isset($Data["Series"][$Floating0Serie]["Data"][$Key]) )

+                $Value = $Data["Series"][$Floating0Serie]["Data"][$Key];

+               else { $Value = 0; }

+

+               $YZero = $this->scaleComputeY($Value,array("AxisID"=>$Serie["Axis"]));

+               if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }

+               if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; }

+

+               if ( $AroundZero ) { $Y1 = $YZero; } else { $Y1 = $this->GraphAreaY2-1; }

+              }

+

+             if ( $OverrideColors != NULL )

+              { if ( isset($OverrideColors[$ID]) ) { $Color = array("R"=>$OverrideColors[$ID]["R"],"G"=>$OverrideColors[$ID]["G"],"B"=>$OverrideColors[$ID]["B"],"Alpha"=>$OverrideColors[$ID]["Alpha"],"BorderR"=>$OverrideColors[$ID]["BorderR"],"BorderG"=>$OverrideColors[$ID]["BorderG"],"BorderB"=>$OverrideColors[$ID]["BorderB"]); } else { $Color = $this->getRandomColor(); } }

+

+             if ( $Y2 != VOID )

+              {

+               $BarHeight = $Y1 - $Y2;

+

+               if ( $Serie["Data"][$Key] == 0 )

+                $this->drawLine($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y1,$Color);

+               else

+                {

+                 if ( $Rounded )

+                  $this->drawRoundedFilledRectangle($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,$RoundRadius,$Color);

+                 else

+                  {

+                   $this->drawFilledRectangle($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,$Color);

+

+                   if ( $Gradient )

+                    {

+                     $this->Shadow  = FALSE;

+

+                     if ( $GradientMode == GRADIENT_SIMPLE )

+                      {

+                       if ( $Serie["Data"][$Key] >= 0 )

+                        $GradienColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);

+                       else

+                        $GradienColor = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha);

+

+                       $this->drawGradientArea($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,DIRECTION_VERTICAL,$GradienColor);

+                      }

+                     elseif ( $GradientMode == GRADIENT_EFFECT_CAN )

+                      {

+                       $GradienColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha);

+                       $GradienColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);

+                       $XSpan = floor($XSize / 3);

+

+                       $this->drawGradientArea($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSpan-$XSpace,$Y2,DIRECTION_HORIZONTAL,$GradienColor1);

+                       $this->drawGradientArea($X+$XOffset+$XSpan+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,DIRECTION_HORIZONTAL,$GradienColor2);

+                      }

+                     $this->Shadow = $RestoreShadow;

+                    }

+                  }

+

+                 if ( $Draw0Line )

+                  {

+                   $Line0Color = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20);

+

+                   if ( abs($Y1 - $Y2) > 3 ) { $Line0Width = 3; } else { $Line0Width = 1; }

+                   if ( $Y1 - $Y2 < 0 ) { $Line0Width = -$Line0Width; }

+

+                   $this->drawFilledRectangle($X+$XOffset+$XSpace,floor($Y1),$X+$XOffset+$XSize-$XSpace,floor($Y1)-$Line0Width,$Line0Color);

+                   $this->drawLine($X+$XOffset+$XSpace,floor($Y1),$X+$XOffset+$XSize-$XSpace,floor($Y1),$Line0Color);

+                  }

+                }

+

+               if ( $DisplayValues && $Serie["Data"][$Key] != VOID )

+                {

+                 if ( $DisplayShadow ) { $this->Shadow = TRUE; }

+

+                 $Caption    = $this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit);

+                 $TxtPos     = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,90,$Caption);

+                 $TxtHeight  = $TxtPos[0]["Y"] - $TxtPos[1]["Y"] + $TxtMargin;

+

+                 if ( $DisplayPos == LABEL_POS_INSIDE && abs($TxtHeight) < abs($BarHeight) )

+                  {

+                   $CenterX = (($X+$XOffset+$XSize-$XSpace)-($X+$XOffset+$XSpace))/2 + $X+$XOffset+$XSpace;

+                   $CenterY = ($Y2-$Y1)/2 + $Y1;

+

+                   $this->drawText($CenterX,$CenterY,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"Angle"=>90));

+                  }

+                 else

+                  {

+                   if ( $Serie["Data"][$Key] >= 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; }

+                   $this->drawText($X+$XOffset+$XSize/2,$Y2-$Offset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align,"FontSize"=>$DisplaySize));

+                  }

+

+                 $this->Shadow = $RestoreShadow;

+                }

+              }

+

+             $X = $X + $XStep;

+             $ID++;

+            }

+          }

+         else

+          {

+           if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }

+           if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }

+

+           if ( $XDivs == 0 ) { $YStep = 0; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }

+           

+           $Y = $this->GraphAreaY1 + $XMargin;

+

+           if ( $AroundZero ) { $X1 = $YZero; } else { $X1 = $this->GraphAreaX1+1; }

+           if ( $XDivs == 0 ) { $YSize = ($this->GraphAreaY2-$this->GraphAreaY1)/($SeriesCount+$Interleave); } else { $YSize   = ($YStep / ($SeriesCount+$Interleave) ); }

+           

+           $YOffset = -($YSize*$SeriesCount)/2 + $CurrentSerie * $YSize;

+           $this->DataSet->Data["Series"][$SerieName]["XOffset"] = $YOffset + $YSize / 2;

+

+           if ( $Rounded || $BorderR != -1 ) { $YSpace = 1; } else { $YSpace = 0; }

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+

+           $ID = 0 ;

+           foreach($PosArray as $Key => $X2)

+            {

+             if ( $Floating0Serie != NULL )

+              {

+               if ( isset($Data["Series"][$Floating0Serie]["Data"][$Key]) )

+                $Value = $Data["Series"][$Floating0Serie]["Data"][$Key];

+               else { $Value = 0; }

+

+               $YZero = $this->scaleComputeY($Value,array("AxisID"=>$Serie["Axis"]));

+               if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }

+               if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }

+               if ( $AroundZero ) { $X1 = $YZero; } else { $X1 = $this->GraphAreaX1+1; }

+              }

+

+             if ( $OverrideColors != NULL )

+              { if ( isset($OverrideColors[$ID]) ) { $Color = array("R"=>$OverrideColors[$ID]["R"],"G"=>$OverrideColors[$ID]["G"],"B"=>$OverrideColors[$ID]["B"],"Alpha"=>$OverrideColors[$ID]["Alpha"],"BorderR"=>$OverrideColors[$ID]["BorderR"],"BorderG"=>$OverrideColors[$ID]["BorderG"],"BorderB"=>$OverrideColors[$ID]["BorderB"]); } else { $Color = $this->getRandomColor(); } }

+

+             if ( $X2 != VOID )

+              {

+               $BarWidth = $X2 - $X1;

+

+               if ( $Serie["Data"][$Key] == 0 )

+                $this->drawLine($X1,$Y+$YOffset+$YSpace,$X1,$Y+$YOffset+$YSize-$YSpace,$Color);

+               else

+                {

+                 if ( $Rounded )

+                  $this->drawRoundedFilledRectangle($X1+1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSize-$YSpace,$RoundRadius,$Color);

+                 else

+                  {

+                   $this->drawFilledRectangle($X1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSize-$YSpace,$Color);

+

+                   if ( $Gradient )

+                    {

+                     $this->Shadow  = FALSE;

+

+                     if ( $GradientMode == GRADIENT_SIMPLE )

+                      {

+                       if ( $Serie["Data"][$Key] >= 0 )

+                        $GradienColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);

+                       else

+                        $GradienColor = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha);

+

+                       $this->drawGradientArea($X1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSize-$YSpace,DIRECTION_HORIZONTAL,$GradienColor);

+                      }

+                     elseif ( $GradientMode == GRADIENT_EFFECT_CAN )

+                      {

+                       $GradienColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha);

+                       $GradienColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);

+                       $YSpan = floor($YSize / 3);

+

+                       $this->drawGradientArea($X1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSpan-$YSpace,DIRECTION_VERTICAL,$GradienColor1);

+                       $this->drawGradientArea($X1,$Y+$YOffset+$YSpan,$X2,$Y+$YOffset+$YSize-$YSpace,DIRECTION_VERTICAL,$GradienColor2);

+                      }

+                     $this->Shadow = $RestoreShadow;

+                    }

+                  }

+

+                 if ( $Draw0Line )

+                  {

+                   $Line0Color = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20);

+

+                   if ( abs($X1 - $X2) > 3 ) { $Line0Width = 3; } else { $Line0Width = 1; }

+                   if ( $X2 - $X1 < 0 ) { $Line0Width = -$Line0Width; }

+

+                   $this->drawFilledRectangle(floor($X1),$Y+$YOffset+$YSpace,floor($X1)+$Line0Width,$Y+$YOffset+$YSize-$YSpace,$Line0Color);

+                   $this->drawLine(floor($X1),$Y+$YOffset+$YSpace,floor($X1),$Y+$YOffset+$YSize-$YSpace,$Line0Color);

+                  }

+                }

+

+               if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) 

+                {

+                 if ( $DisplayShadow ) { $this->Shadow = TRUE; }

+

+                 $Caption   = $this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit);

+                 $TxtPos    = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);

+                 $TxtWidth  = $TxtPos[1]["X"] - $TxtPos[0]["X"] + $TxtMargin;

+

+                 if ( $DisplayPos == LABEL_POS_INSIDE && abs($TxtWidth) < abs($BarWidth) )

+                  {

+                   $CenterX = ($X2-$X1)/2 + $X1;

+                   $CenterY = (($Y+$YOffset+$YSize-$YSpace)-($Y+$YOffset+$YSpace))/2 + ($Y+$YOffset+$YSpace);

+

+                   $this->drawText($CenterX,$CenterY,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize));

+                  }

+                 else

+                  {

+                   if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_MIDDLELEFT; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_MIDDLERIGHT; $Offset = -$DisplayOffset; }

+                   $this->drawText($X2+$Offset,$Y+$YOffset+$YSize/2,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align,"FontSize"=>$DisplaySize));

+                  }

+

+                 $this->Shadow = $RestoreShadow;

+                }

+              }

+             $Y = $Y + $YStep;

+             $ID++;

+            }

+          }

+         $CurrentSerie++;

+        }

+      }

+    }

+

+   /* Draw a bar chart */

+   function drawStackedBarChart($Format=NULL)

+    {

+     $DisplayValues	= isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;

+     $DisplayRound      = isset($Format["DisplayRound"]) ? $Format["DisplayRound"] : 0;

+     $DisplayColor	= isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;

+     $DisplayFont	= isset($Format["DisplayFont"]) ? $Format["DisplayFont"] : $this->FontName;

+     $DisplaySize	= isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontSize;

+     $DisplayR		= isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;

+     $DisplayG		= isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;

+     $DisplayB		= isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;

+     $Interleave	= isset($Format["Interleave"]) ? $Format["Interleave"] : .5;

+     $Rounded		= isset($Format["Rounded"]) ? $Format["Rounded"] : FALSE;

+     $RoundRadius	= isset($Format["RoundRadius"]) ? $Format["RoundRadius"] : 4;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : -1;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : -1;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : -1;

+     $Gradient		= isset($Format["Gradient"]) ? $Format["Gradient"] : FALSE;

+     $GradientMode	= isset($Format["GradientMode"]) ? $Format["GradientMode"] : GRADIENT_SIMPLE;

+     $GradientAlpha	= isset($Format["GradientAlpha"]) ? $Format["GradientAlpha"] : 20;

+     $GradientStartR	= isset($Format["GradientStartR"]) ? $Format["GradientStartR"] : 255;

+     $GradientStartG	= isset($Format["GradientStartG"]) ? $Format["GradientStartG"] : 255;

+     $GradientStartB	= isset($Format["GradientStartB"]) ? $Format["GradientStartB"] : 255;

+     $GradientEndR	= isset($Format["GradientEndR"]) ? $Format["GradientEndR"] : 0;

+     $GradientEndG	= isset($Format["GradientEndG"]) ? $Format["GradientEndG"] : 0;

+     $GradientEndB	= isset($Format["GradientEndB"]) ? $Format["GradientEndB"] : 0;

+

+     $Data = $this->DataSet->getData();

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+

+     $RestoreShadow = $this->Shadow;

+

+     $LastX = ""; $LastY = "";

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];

+         if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = 255; $DisplayG = 255; $DisplayB = 255; }

+         if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }

+

+         $AxisID	= $Serie["Axis"];

+         $Mode		= $Data["Axis"][$AxisID]["Display"];

+         $Format	= $Data["Axis"][$AxisID]["Format"];

+         $Unit		= $Data["Axis"][$AxisID]["Unit"];

+

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]),TRUE);

+         $YZero    = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"]));

+

+         $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;

+

+         $Color = array("TransCorner"=>TRUE,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB);

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }

+           if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }

+

+           if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $X     = $this->GraphAreaX1 + $XMargin;

+

+           $XSize   = ($XStep / (1+$Interleave) );

+           $XOffset = -($XSize/2);

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           foreach($PosArray as $Key => $Height)

+            {

+             if ( $Height != VOID && $Serie["Data"][$Key] != 0 )

+              {

+               if ( $Serie["Data"][$Key] > 0 ) { $Pos = "+"; } else { $Pos = "-"; }

+

+               if ( !isset($LastY[$Key] ) ) { $LastY[$Key] = ""; }

+               if ( !isset($LastY[$Key][$Pos] ) ) { $LastY[$Key][$Pos] = $YZero; }

+

+               $Y1 = $LastY[$Key][$Pos];

+               $Y2 = $Y1 - $Height;

+

+               if ( ($Rounded || $BorderR != -1) && ($Pos == "+" && $Y1 != $YZero) ) { $YSpaceUp = 1; } else { $YSpaceUp = 0; }

+               if ( ($Rounded || $BorderR != -1) && ($Pos == "-" && $Y1 != $YZero) ) { $YSpaceDown = 1; } else { $YSpaceDown = 0; }

+

+               if ( $Rounded )

+                $this->drawRoundedFilledRectangle($X+$XOffset,$Y1-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2,$RoundRadius,$Color);

+               else

+                {

+                 $this->drawFilledRectangle($X+$XOffset,$Y1-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2,$Color);

+

+                 if ( $Gradient )

+                  {

+                   $this->Shadow  = FALSE;

+

+                   if ( $GradientMode == GRADIENT_SIMPLE )

+                    {

+                     $GradientColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);

+                     $this->drawGradientArea($X+$XOffset-.5,$Y1-.5-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2+.5,DIRECTION_VERTICAL,$GradientColor);

+                    }

+                   elseif ( $GradientMode == GRADIENT_EFFECT_CAN )

+                    {

+                     $GradientColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha);

+                     $GradientColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);

+                     $XSpan = floor($XSize / 3);

+

+                     $this->drawGradientArea($X+$XOffset-.5,$Y1-.5-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSpan,$Y2+.5,DIRECTION_HORIZONTAL,$GradientColor1);

+                     $this->drawGradientArea($X+$XSpan+$XOffset-.5,$Y1-.5-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2+.5,DIRECTION_HORIZONTAL,$GradientColor2);

+                    }

+                   $this->Shadow = $RestoreShadow;

+                  }

+                }

+

+               if ( $DisplayValues )

+                {

+                 $BarHeight = abs($Y2-$Y1);

+

+                 $Caption   = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit);

+                 $TxtPos    = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);

+                 $TxtHeight = abs($TxtPos[2]["Y"] - $TxtPos[0]["Y"]);

+

+                 if ( $BarHeight > $TxtHeight )

+                  {

+                   $XCenter = ( ($X+$XOffset+$XSize) - ($X+$XOffset) ) / 2 + $X+$XOffset;

+                   $YCenter = ( ($Y2) - ($Y1-$YSpaceUp+$YSpaceDown) ) / 2 + $Y1-$YSpaceUp+$YSpaceDown;

+

+                   $this->drawText($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont));

+                  }

+                }

+

+               $LastY[$Key][$Pos] = $Y2;

+              }

+

+             $X = $X + $XStep;

+            }

+          }

+         else

+          {

+           if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }

+           if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }

+

+           if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }

+           $Y     = $this->GraphAreaY1 + $XMargin;

+

+           $YSize   = $YStep / (1+$Interleave);

+           $YOffset = -($YSize/2);

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           foreach($PosArray as $Key => $Width)

+            {

+             if ( $Width != VOID && $Serie["Data"][$Key] != 0 )

+              {

+               if ( $Serie["Data"][$Key] > 0 ) { $Pos = "+"; } else { $Pos = "-"; }

+

+               if ( !isset($LastX[$Key] ) ) { $LastX[$Key] = ""; }

+               if ( !isset($LastX[$Key][$Pos] ) ) { $LastX[$Key][$Pos] = $YZero; }

+

+               $X1 = $LastX[$Key][$Pos];

+               $X2 = $X1 + $Width;

+

+               if ( ($Rounded || $BorderR != -1) && ($Pos == "+" && $X1 != $YZero) ) { $XSpaceLeft = 2; } else { $XSpaceLeft = 0; }

+               if ( ($Rounded || $BorderR != -1) && ($Pos == "-" && $X1 != $YZero) ) { $XSpaceRight = 2; } else { $XSpaceRight = 0; }

+

+               if ( $Rounded )

+                $this->drawRoundedFilledRectangle($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSize,$RoundRadius,$Color);

+               else

+                {

+                 $this->drawFilledRectangle($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSize,$Color);

+

+                 if ( $Gradient )

+                  {

+                   $this->Shadow  = FALSE;

+

+                   if ( $GradientMode == GRADIENT_SIMPLE )

+                    {

+                     $GradientColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);

+                     $this->drawGradientArea($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSize,DIRECTION_HORIZONTAL,$GradientColor);

+                    }

+                   elseif ( $GradientMode == GRADIENT_EFFECT_CAN )

+                    {

+                     $GradientColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha);

+                     $GradientColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);

+                     $YSpan = floor($YSize / 3);

+

+                     $this->drawGradientArea($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSpan,DIRECTION_VERTICAL,$GradientColor1);

+                     $this->drawGradientArea($X1+$XSpaceLeft,$Y+$YOffset+$YSpan,$X2-$XSpaceRight,$Y+$YOffset+$YSize,DIRECTION_VERTICAL,$GradientColor2);

+                    }

+                   $this->Shadow = $RestoreShadow;

+                  }

+                }

+

+               if ( $DisplayValues )

+                {

+                 $BarWidth = abs($X2-$X1);

+

+                 $Caption   = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit);

+                 $TxtPos    = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);

+                 $TxtWidth  = abs($TxtPos[1]["X"] - $TxtPos[0]["X"]);

+

+                 if ( $BarWidth > $TxtWidth )

+                  {

+                   $XCenter  = ( $X2 - $X1 ) / 2 + $X1;

+                   $YCenter  = ( ($Y+$YOffset+$YSize) - ($Y+$YOffset) ) / 2 + $Y+$YOffset;

+

+                   $this->drawText($XCenter,$YCenter,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont));

+                  }

+                }

+

+               $LastX[$Key][$Pos] = $X2;

+              }

+

+             $Y = $Y + $YStep;

+            }

+          }

+        }

+      }

+    }

+

+   /* Draw a bar chart */

+   function drawStackedAreaChart($Format=NULL)

+    {

+     $DisplayValues	= isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;

+     $DisplayRound      = isset($Format["DisplayRound"]) ? $Format["DisplayRound"] : 0;

+     $DisplayColor	= isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;

+     $DisplayFont	= isset($Format["DisplayFont"]) ? $Format["DisplayFont"] : $this->FontName;

+     $DisplaySize	= isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontSize;

+     $DisplayR		= isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;

+     $DisplayG		= isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;

+     $DisplayB		= isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : -1;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : -1;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : -1;

+     $ForceTransparency	= isset($Format["ForceTransparency"]) ? $Format["ForceTransparency"] : 80;

+

+     $Data = $this->DataSet->getData();

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+

+     $RestoreShadow = $this->Shadow;

+

+     /* Determine if we only have positive or negatives values */

+     $Sign["+"] = 0; $Sign["-"] = 0;

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        { foreach($Serie["Data"] as $Key => $Value) { if ($Value > 0) { $Sign["+"]++; } elseif ($Value < 0) { $Sign["-"]++; } } }

+      } 

+     if ( $Sign["+"] == 0 || $Sign["-"] == 0 ) { $SingleWay = TRUE; } else { $SingleWay = FALSE; }

+

+     $LastX = ""; $LastY = "";

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];

+

+         if ( $ForceTransparency != NULL ) { $Alpha = $ForceTransparency; }

+         if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = 255; $DisplayG = 255; $DisplayB = 255; }

+         if ( $Surrounding != NULL )

+          { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }

+         else

+          { $BorderR = $R; $BorderG = $G; $BorderB = $B; }

+

+         $AxisID	= $Serie["Axis"];

+         $Mode		= $Data["Axis"][$AxisID]["Display"];

+         $Format	= $Data["Axis"][$AxisID]["Format"];

+         $Unit		= $Data["Axis"][$AxisID]["Unit"];

+

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]),TRUE);

+         $YZero    = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"]));

+

+         $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }

+           if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }

+

+           $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB,"SkipY"=>$YZero);

+

+           if ( $SingleWay ) { unset($Color["SkipY"]); }

+

+           if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $X = $this->GraphAreaX1 + $XMargin;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+

+           $PointsTop = ""; $PointsBottom = ""; $Labels = ""; $Pos = "+";

+           foreach($PosArray as $Key => $Height)

+            {

+             if ( !isset($LastY[$Key] ) )       { $LastY[$Key] = ""; }

+             if ( !isset($LastY[$Key][$Pos] ) ) { $LastY[$Key][$Pos] = $YZero; }

+

+             if ( $Height != VOID && $Serie["Data"][$Key] >= 0)

+              {

+               $Y1 = $LastY[$Key][$Pos];

+               $Y2 = $Y1 - $Height;

+

+               $PointsTop[]    = $X; $PointsTop[]    = $Y2;

+               $PointsBottom[] = $X; $PointsBottom[] = $Y1;

+

+               if ( $DisplayValues )

+                {

+                 $BarHeight = abs($Y2-$Y1);

+

+                 $Caption   = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit);

+                 $TxtPos    = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);

+                 $TxtHeight = abs($TxtPos[2]["Y"] - $TxtPos[0]["Y"]);

+

+                 if ( $BarHeight > $TxtHeight )

+                  {

+                   $XCenter = $X;

+                   $YCenter = $Y1- $BarHeight / 2;

+

+                   $Labels[] = array($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont));

+                  }

+                }

+

+               $LastY[$Key][$Pos] = $Y2;

+              }

+             else

+              { $PointsTop[] = $X; $PointsTop[] = $LastY[$Key][$Pos]; $PointsBottom[] = $X; $PointsBottom[] = $LastY[$Key][$Pos]; }

+

+             $X = $X + $XStep;

+            }

+           $Points = $PointsTop;

+           for($i=count($PointsBottom)-2;$i>=0;$i-=2) { $Points[] = $PointsBottom[$i]; $Points[] = $PointsBottom[$i+1]; }

+           $this->drawPolygon($Points,$Color);

+

+           /* Reset the X axis parser for the negative values pass */

+           $X = $this->GraphAreaX1 + $XMargin;

+

+           $PointsTop = ""; $PointsBottom = ""; $Pos = "-";

+           foreach($PosArray as $Key => $Height)

+            {

+             if ( !isset($LastY[$Key] ) )       { $LastY[$Key] = ""; }

+             if ( !isset($LastY[$Key][$Pos] ) ) { $LastY[$Key][$Pos] = $YZero; }

+

+             if ( $Height != VOID && $Serie["Data"][$Key] < 0)

+              {

+               $Y1 = $LastY[$Key][$Pos];

+               $Y2 = $Y1 - $Height;

+

+               $PointsTop[]    = $X; $PointsTop[]    = $Y2;

+               $PointsBottom[] = $X; $PointsBottom[] = $Y1;

+

+               if ( $DisplayValues )

+                {

+                 $BarHeight = abs($Y2-$Y1);

+

+                 $Caption   = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit);

+                 $TxtPos    = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);

+                 $TxtHeight = abs($TxtPos[2]["Y"] - $TxtPos[0]["Y"]);

+

+                 if ( $BarHeight > $TxtHeight )

+                  {

+                   $XCenter = $X;

+                   $YCenter = $BarHeight / 2 + $Y1;

+

+                   $Labels[] = array($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont));

+                  }

+                }

+

+               $LastY[$Key][$Pos] = $Y2;

+              }

+             else

+              { $PointsTop[] = $X; $PointsTop[] = $LastY[$Key][$Pos]; $PointsBottom[] = $X; $PointsBottom[] = $LastY[$Key][$Pos]; }

+

+             $X = $X + $XStep;

+            }

+           $Points = $PointsTop;

+           for($i=count($PointsBottom)-2;$i>=0;$i-=2) { $Points[] = $PointsBottom[$i]; $Points[] = $PointsBottom[$i+1]; }

+           $this->drawPolygon($Points,$Color);

+

+           if ( $DisplayValues ) { foreach($Labels as $Key => $Value) { $this->drawText($Value[0],$Value[1],$Value[2],$Value[3]);} }

+          }

+         else

+          {

+           if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }

+           if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }

+

+           $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB,"SkipX"=>$YZero);

+

+           if ( $SingleWay ) { unset($Color["SkipX"]); }

+

+           if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }

+           $Y = $this->GraphAreaY1 + $XMargin;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+

+           $PointsTop = ""; $PointsBottom = ""; $Labels = ""; $Pos = "+";

+           foreach($PosArray as $Key => $Width)

+            {

+             if ( !isset($LastX[$Key] ) )       { $LastX[$Key] = ""; }

+             if ( !isset($LastX[$Key][$Pos] ) ) { $LastX[$Key][$Pos] = $YZero; }

+

+             if ( $Width != VOID && $Serie["Data"][$Key] >= 0)

+              {

+               $X1 = $LastX[$Key][$Pos];

+               $X2 = $X1 + $Width;

+

+               $PointsTop[]    = $X1; $PointsTop[]    = $Y;

+               $PointsBottom[] = $X2; $PointsBottom[] = $Y;

+

+               if ( $DisplayValues )

+                {

+                 $BarWidth = abs($X2-$X1);

+

+                 $Caption   = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit);

+                 $TxtPos    = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);

+                 $TxtWidth  = abs($TxtPos[1]["X"] - $TxtPos[0]["X"]);

+

+                 if ( $BarWidth > $TxtWidth )

+                  {

+                   $XCenter  = $X1 + $BarWidth / 2;

+                   $YCenter  = $Y;

+

+                   $Labels[] = array($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont));

+                  }

+                }

+

+               $LastX[$Key][$Pos] = $X2;

+              }

+             else

+              { $PointsTop[] = $LastX[$Key][$Pos]; $PointsTop[] = $Y; $PointsBottom[] = $LastX[$Key][$Pos]; $PointsBottom[] = $Y; }

+

+             $Y = $Y + $YStep;

+            }

+           $Points = $PointsTop;

+           for($i=count($PointsBottom)-2;$i>=0;$i-=2) { $Points[] = $PointsBottom[$i]; $Points[] = $PointsBottom[$i+1]; }

+           $this->drawPolygon($Points,$Color);

+

+

+           /* Reset the X axis parser for the negative values pass */

+           $Y = $this->GraphAreaY1 + $XMargin;

+

+

+           $PointsTop = ""; $PointsBottom = ""; $Pos = "-";

+           foreach($PosArray as $Key => $Width)

+            {

+             if ( !isset($LastX[$Key] ) )       { $LastX[$Key] = ""; }

+             if ( !isset($LastX[$Key][$Pos] ) ) { $LastX[$Key][$Pos] = $YZero; }

+

+             if ( $Width != VOID && $Serie["Data"][$Key] < 0)

+              {

+               $X1 = $LastX[$Key][$Pos];

+               $X2 = $X1 + $Width;

+

+               $PointsTop[]    = $X1; $PointsTop[]    = $Y;

+               $PointsBottom[] = $X2; $PointsBottom[] = $Y;

+

+               if ( $DisplayValues )

+                {

+                 $BarWidth = abs($X2-$X1);

+

+                 $Caption   = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit);

+                 $TxtPos    = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);

+                 $TxtWidth  = abs($TxtPos[1]["X"] - $TxtPos[0]["X"]);

+

+                 if ( $BarWidth > $TxtWidth )

+                  {

+                   $XCenter  = $X1 - $BarWidth / 2;

+                   $YCenter  = $Y;

+

+                   $Labels[] = array($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont));

+                  }

+                }

+

+               $LastX[$Key][$Pos] = $X2;

+              }

+             else

+              { $PointsTop[] = $LastX[$Key][$Pos]; $PointsTop[] = $Y; $PointsBottom[] = $LastX[$Key][$Pos]; $PointsBottom[] = $Y; }

+

+             $Y = $Y + $YStep;

+            }

+           $Points = $PointsTop;

+           for($i=count($PointsBottom)-2;$i>=0;$i-=2) { $Points[] = $PointsBottom[$i]; $Points[] = $PointsBottom[$i+1]; }

+           $this->drawPolygon($Points,$Color);

+

+           if ( $DisplayValues ) { foreach($Labels as $Key => $Value) { $this->drawText($Value[0],$Value[1],$Value[2],$Value[3]);} }

+          }

+        }

+      }

+    }

+

+   /* Returns a random color */

+   function getRandomColor($Alpha=100)

+    { return(array("R"=>rand(0,255),"G"=>rand(0,255),"B"=>rand(0,255),"Alpha"=>$Alpha)); }

+ 

+   /* Validate a palette */

+   function validatePalette($Colors,$Surrounding=NULL)

+    {

+     $Result = "";

+

+     if ( !is_array($Colors) ) { return($this->getRandomColor()); }

+

+     foreach($Colors as $Key => $Values)

+      {

+       if ( isset($Values["R"]) ) { $Result[$Key]["R"] = $Values["R"]; } else { $Result[$Key]["R"] = rand(0,255); }

+       if ( isset($Values["G"]) ) { $Result[$Key]["G"] = $Values["G"]; } else { $Result[$Key]["G"] = rand(0,255); }

+       if ( isset($Values["B"]) ) { $Result[$Key]["B"] = $Values["B"]; } else { $Result[$Key]["B"] = rand(0,255); }

+       if ( isset($Values["Alpha"]) ) { $Result[$Key]["Alpha"] = $Values["Alpha"]; } else { $Result[$Key]["Alpha"] = 100; }

+

+       if ( $Surrounding != NULL )

+        {

+         $Result[$Key]["BorderR"] = $Result[$Key]["R"] + $Surrounding;

+         $Result[$Key]["BorderG"] = $Result[$Key]["G"] + $Surrounding;

+         $Result[$Key]["BorderB"] = $Result[$Key]["B"] + $Surrounding;

+        }

+       else

+        {

+         if ( isset($Values["BorderR"]) )     { $Result[$Key]["BorderR"] = $Values["BorderR"]; } else { $Result[$Key]["BorderR"] = $Result[$Key]["R"]; }

+         if ( isset($Values["BorderG"]) )     { $Result[$Key]["BorderG"] = $Values["BorderG"]; } else { $Result[$Key]["BorderG"] = $Result[$Key]["G"]; }

+         if ( isset($Values["BorderB"]) )     { $Result[$Key]["BorderB"] = $Values["BorderB"]; } else { $Result[$Key]["BorderB"] = $Result[$Key]["B"]; }

+         if ( isset($Values["BorderAlpha"]) ) { $Result[$Key]["BorderAlpha"] = $Values["BorderAlpha"]; } else { $Result[$Key]["BorderAlpha"] = $Result[$Key]["Alpha"]; }

+        }

+      }

+

+     return($Result);

+    }

+

+   /* Draw the derivative chart associated to the data series */

+   function drawDerivative($Format=NULL)

+    {

+     $Offset		= isset($Format["Offset"]) ? $Format["Offset"] : 10;

+     $SerieSpacing	= isset($Format["SerieSpacing"]) ? $Format["SerieSpacing"] : 3;

+     $DerivativeHeight	= isset($Format["DerivativeHeight"]) ? $Format["DerivativeHeight"] : 4;

+     $ShadedSlopeBox	= isset($Format["ShadedSlopeBox"]) ? $Format["ShadedSlopeBox"] : FALSE;

+     $DrawBackground	= isset($Format["DrawBackground"]) ? $Format["DrawBackground"] : TRUE;

+     $BackgroundR	= isset($Format["BackgroundR"]) ? $Format["BackgroundR"] : 255;

+     $BackgroundG	= isset($Format["BackgroundG"]) ? $Format["BackgroundG"] : 255;

+     $BackgroundB	= isset($Format["BackgroundB"]) ? $Format["BackgroundB"] : 255;

+     $BackgroundAlpha	= isset($Format["BackgroundAlpha"]) ? $Format["BackgroundAlpha"] : 20;

+     $DrawBorder	= isset($Format["DrawBorder"]) ? $Format["DrawBorder"] : TRUE;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : 0;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : 0;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : 0;

+     $BorderAlpha	= isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 100;

+     $Caption		= isset($Format["Caption"]) ? $Format["Caption"] : TRUE;

+     $CaptionHeight	= isset($Format["CaptionHeight"]) ? $Format["CaptionHeight"] : 10;

+     $CaptionWidth	= isset($Format["CaptionWidth"]) ? $Format["CaptionWidth"] : 20;

+     $CaptionMargin	= isset($Format["CaptionMargin"]) ? $Format["CaptionMargin"] : 4;

+     $CaptionLine	= isset($Format["CaptionLine"]) ? $Format["CaptionLine"] : FALSE;

+     $CaptionBox	= isset($Format["CaptionBox"]) ? $Format["CaptionBox"] : FALSE;

+     $CaptionBorderR	= isset($Format["CaptionBorderR"]) ? $Format["CaptionBorderR"] : 0;

+     $CaptionBorderG	= isset($Format["CaptionBorderG"]) ? $Format["CaptionBorderG"] : 0;

+     $CaptionBorderB	= isset($Format["CaptionBorderB"]) ? $Format["CaptionBorderB"] : 0;

+     $CaptionFillR	= isset($Format["CaptionFillR"]) ? $Format["CaptionFillR"] : 255;

+     $CaptionFillG	= isset($Format["CaptionFillG"]) ? $Format["CaptionFillG"] : 255;

+     $CaptionFillB	= isset($Format["CaptionFillB"]) ? $Format["CaptionFillB"] : 255;

+     $CaptionFillAlpha	= isset($Format["CaptionFillAlpha"]) ? $Format["CaptionFillAlpha"] : 80;

+     $PositiveSlopeStartR	= isset($Format["PositiveSlopeStartR"]) ? $Format["PositiveSlopeStartR"] : 184;

+     $PositiveSlopeStartG	= isset($Format["PositiveSlopeStartG"]) ? $Format["PositiveSlopeStartG"] : 234;

+     $PositiveSlopeStartB	= isset($Format["PositiveSlopeStartB"]) ? $Format["PositiveSlopeStartB"] : 88;

+     $PositiveSlopeEndR		= isset($Format["PositiveSlopeStartR"]) ? $Format["PositiveSlopeStartR"] : 239;

+     $PositiveSlopeEndG		= isset($Format["PositiveSlopeStartG"]) ? $Format["PositiveSlopeStartG"] : 31;

+     $PositiveSlopeEndB		= isset($Format["PositiveSlopeStartB"]) ? $Format["PositiveSlopeStartB"] : 36;

+     $NegativeSlopeStartR	= isset($Format["NegativeSlopeStartR"]) ? $Format["NegativeSlopeStartR"] : 184;

+     $NegativeSlopeStartG	= isset($Format["NegativeSlopeStartG"]) ? $Format["NegativeSlopeStartG"] : 234;

+     $NegativeSlopeStartB	= isset($Format["NegativeSlopeStartB"]) ? $Format["NegativeSlopeStartB"] : 88;

+     $NegativeSlopeEndR		= isset($Format["NegativeSlopeStartR"]) ? $Format["NegativeSlopeStartR"] : 67;

+     $NegativeSlopeEndG		= isset($Format["NegativeSlopeStartG"]) ? $Format["NegativeSlopeStartG"] : 124;

+     $NegativeSlopeEndB		= isset($Format["NegativeSlopeStartB"]) ? $Format["NegativeSlopeStartB"] : 227;

+

+     $Data = $this->DataSet->getData();

+

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+

+     if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+      $YPos = $this->DataSet->Data["GraphArea"]["Y2"] + $Offset;

+     else

+      $XPos = $this->DataSet->Data["GraphArea"]["X2"] + $Offset;

+

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];

+

+         $AxisID   = $Serie["Axis"];

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $Caption )

+            {

+             if ( $CaptionLine ) 

+              {

+               $StartX = floor($this->GraphAreaX1-$CaptionWidth+$XMargin-$CaptionMargin);

+               $EndX   = floor($this->GraphAreaX1-$CaptionMargin+$XMargin);

+

+               $CaptionSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight);

+               if ( $CaptionBox ) { $this->drawFilledRectangle($StartX,$YPos,$EndX,$YPos+$CaptionHeight,array("R"=>$CaptionFillR,"G"=>$CaptionFillG,"B"=>$CaptionFillB,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB,"Alpha"=>$CaptionFillAlpha)); }

+               $this->drawLine($StartX+2,$YPos+($CaptionHeight/2),$EndX-2,$YPos+($CaptionHeight/2),$CaptionSettings);

+              }

+             else

+              $this->drawFilledRectangle($this->GraphAreaX1-$CaptionWidth+$XMargin-$CaptionMargin,$YPos,$this->GraphAreaX1-$CaptionMargin+$XMargin,$YPos+$CaptionHeight,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB));

+            }

+

+           if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $X = $this->GraphAreaX1 + $XMargin;

+

+           $TopY    = $YPos + ($CaptionHeight/2) - ($DerivativeHeight/2);

+           $BottomY = $YPos + ($CaptionHeight/2) + ($DerivativeHeight/2);

+

+           $StartX  = floor($this->GraphAreaX1+$XMargin);

+           $EndX    = floor($this->GraphAreaX2-$XMargin);

+

+           if ( $DrawBackground ) { $this->drawFilledRectangle($StartX-1,$TopY-1,$EndX+1,$BottomY+1,array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha)); }

+           if ( $DrawBorder ) { $this->drawRectangle($StartX-1,$TopY-1,$EndX+1,$BottomY+1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); }

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+

+           $RestoreShadow = $this->Shadow;

+           $this->Shadow  = FALSE;

+

+           /* Determine the Max slope index */

+           $LastX = NULL; $LastY = NULL; $MinSlope = 0; $MaxSlope = 1;

+           foreach($PosArray as $Key => $Y)

+            {

+             if ( $Y != VOID && $LastX != NULL )

+              { $Slope = ($LastY - $Y); if ( $Slope > $MaxSlope ) { $MaxSlope = $Slope; } if ( $Slope < $MinSlope ) { $MinSlope = $Slope; } }

+

+             if ( $Y == VOID )

+              { $LastX = NULL; $LastY = NULL; }

+             else

+              { $LastX = $X; $LastY = $Y; }

+            }

+

+           $LastX = NULL; $LastY = NULL; $LastColor = NULL;

+           foreach($PosArray as $Key => $Y)

+            {

+             if ( $Y != VOID && $LastY != NULL )

+              {

+               $Slope = ($LastY - $Y);

+

+               if ( $Slope >= 0 )

+                {

+                 $SlopeIndex = (100 / $MaxSlope) * $Slope;

+                 $R = (($PositiveSlopeEndR - $PositiveSlopeStartR)/100)*$SlopeIndex+$PositiveSlopeStartR;

+                 $G = (($PositiveSlopeEndG - $PositiveSlopeStartG)/100)*$SlopeIndex+$PositiveSlopeStartG;

+                 $B = (($PositiveSlopeEndB - $PositiveSlopeStartB)/100)*$SlopeIndex+$PositiveSlopeStartB;

+                }

+               elseif ( $Slope < 0 )

+                {

+                 $SlopeIndex = (100 / abs($MinSlope)) * abs($Slope);

+                 $R = (($NegativeSlopeEndR - $NegativeSlopeStartR)/100)*$SlopeIndex+$NegativeSlopeStartR;

+                 $G = (($NegativeSlopeEndG - $NegativeSlopeStartG)/100)*$SlopeIndex+$NegativeSlopeStartG;

+                 $B = (($NegativeSlopeEndB - $NegativeSlopeStartB)/100)*$SlopeIndex+$NegativeSlopeStartB;

+                }

+

+               $Color = array("R"=>$R,"G"=>$G,"B"=>$B);

+

+               if ( $ShadedSlopeBox && $LastColor != NULL ) // && $Slope != 0

+                {

+                 $GradientSettings = array("StartR"=>$LastColor["R"],"StartG"=>$LastColor["G"],"StartB"=>$LastColor["B"],"EndR"=>$R,"EndG"=>$G,"EndB"=>$B);

+                 $this->drawGradientArea($LastX,$TopY,$X,$BottomY,DIRECTION_HORIZONTAL,$GradientSettings);

+                }

+               elseif ( !$ShadedSlopeBox || $LastColor == NULL ) // || $Slope == 0

+                $this->drawFilledRectangle(floor($LastX),$TopY,floor($X),$BottomY,$Color);

+

+               $LastColor = $Color;

+              }

+

+             if ( $Y == VOID )

+              { $LastY = NULL; }

+             else

+              { $LastX = $X; $LastY = $Y; }

+

+             $X = $X + $XStep;

+            }

+

+           $YPos = $YPos + $CaptionHeight + $SerieSpacing;

+          }

+         else

+          {

+           if ( $Caption )

+            {

+             $StartY = floor($this->GraphAreaY1-$CaptionWidth+$XMargin-$CaptionMargin);

+             $EndY   = floor($this->GraphAreaY1-$CaptionMargin+$XMargin);

+             if ( $CaptionLine ) 

+              {

+               $CaptionSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight);

+               if ( $CaptionBox ) { $this->drawFilledRectangle($XPos,$StartY,$XPos+$CaptionHeight,$EndY,array("R"=>$CaptionFillR,"G"=>$CaptionFillG,"B"=>$CaptionFillB,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB,"Alpha"=>$CaptionFillAlpha)); }

+               $this->drawLine($XPos+($CaptionHeight/2),$StartY+2,$XPos+($CaptionHeight/2),$EndY-2,$CaptionSettings);

+              }

+             else

+              $this->drawFilledRectangle($XPos,$StartY,$XPos+$CaptionHeight,$EndY,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB));

+            }

+

+

+           if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $XStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }

+           $Y = $this->GraphAreaY1 + $XMargin;

+

+           $TopX    = $XPos + ($CaptionHeight/2) - ($DerivativeHeight/2);

+           $BottomX = $XPos + ($CaptionHeight/2) + ($DerivativeHeight/2);

+

+           $StartY  = floor($this->GraphAreaY1+$XMargin);

+           $EndY    = floor($this->GraphAreaY2-$XMargin);

+

+           if ( $DrawBackground ) { $this->drawFilledRectangle($TopX-1,$StartY-1,$BottomX+1,$EndY+1,array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha)); }

+           if ( $DrawBorder ) { $this->drawRectangle($TopX-1,$StartY-1,$BottomX+1,$EndY+1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); }

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+

+           $RestoreShadow = $this->Shadow;

+           $this->Shadow  = FALSE;

+

+           /* Determine the Max slope index */

+           $LastX = NULL; $LastY = NULL; $MinSlope = 0; $MaxSlope = 1;

+           foreach($PosArray as $Key => $X)

+            {

+             if ( $X != VOID && $LastX != NULL )

+              { $Slope = ($X - $LastX); if ( $Slope > $MaxSlope ) { $MaxSlope = $Slope; } if ( $Slope < $MinSlope ) { $MinSlope = $Slope; } }

+

+             if ( $X == VOID )

+              { $LastX = NULL; }

+             else

+              { $LastX = $X; }

+            }

+

+           $LastX = NULL; $LastY = NULL; $LastColor = NULL;

+           foreach($PosArray as $Key => $X)

+            {

+             if ( $X != VOID && $LastX != NULL )

+              {

+               $Slope = ($X - $LastX);

+

+               if ( $Slope >= 0 )

+                {

+                 $SlopeIndex = (100 / $MaxSlope) * $Slope;

+                 $R = (($PositiveSlopeEndR - $PositiveSlopeStartR)/100)*$SlopeIndex+$PositiveSlopeStartR;

+                 $G = (($PositiveSlopeEndG - $PositiveSlopeStartG)/100)*$SlopeIndex+$PositiveSlopeStartG;

+                 $B = (($PositiveSlopeEndB - $PositiveSlopeStartB)/100)*$SlopeIndex+$PositiveSlopeStartB;

+                }

+               elseif ( $Slope < 0 )

+                {

+                 $SlopeIndex = (100 / abs($MinSlope)) * abs($Slope);

+                 $R = (($NegativeSlopeEndR - $NegativeSlopeStartR)/100)*$SlopeIndex+$NegativeSlopeStartR;

+                 $G = (($NegativeSlopeEndG - $NegativeSlopeStartG)/100)*$SlopeIndex+$NegativeSlopeStartG;

+                 $B = (($NegativeSlopeEndB - $NegativeSlopeStartB)/100)*$SlopeIndex+$NegativeSlopeStartB;

+                }

+

+               $Color = array("R"=>$R,"G"=>$G,"B"=>$B);

+

+               if ( $ShadedSlopeBox && $LastColor != NULL )

+                {

+                 $GradientSettings = array("StartR"=>$LastColor["R"],"StartG"=>$LastColor["G"],"StartB"=>$LastColor["B"],"EndR"=>$R,"EndG"=>$G,"EndB"=>$B);

+

+                 $this->drawGradientArea($TopX,$LastY,$BottomX,$Y,DIRECTION_VERTICAL,$GradientSettings);

+                }

+               elseif ( !$ShadedSlopeBox || $LastColor == NULL ) 

+                $this->drawFilledRectangle($TopX,floor($LastY),$BottomX,floor($Y),$Color);

+

+               $LastColor = $Color;

+              }

+

+             if ( $X == VOID )

+              { $LastX = NULL; }

+             else

+              { $LastX = $X; $LastY = $Y; }

+

+             $Y = $Y + $XStep;

+            }

+

+           $XPos = $XPos + $CaptionHeight + $SerieSpacing;

+          }

+

+         $this->Shadow = $RestoreShadow;

+        }

+      }

+    }

+

+   /* Draw the line of best fit */

+   function drawBestFit($Format="")

+    {

+     $Data = $this->DataSet->getData();

+     list($XMargin,$XDivs) = $this->scaleGetXSettings();

+

+     foreach($Data["Series"] as $SerieName => $Serie)

+      {

+       if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )

+        {

+         $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];

+

+         $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight);

+

+         $AxisID   = $Serie["Axis"];

+         $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $X = $this->GraphAreaX1 + $XMargin;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           $Sxy = 0; $Sx = 0; $Sy = 0; $Sxx = 0;

+           foreach($PosArray as $Key => $Y)

+            {

+             $Sxy = $Sxy + $X*$Y;

+             $Sx  = $Sx + $X;

+             $Sy  = $Sy + $Y;

+             $Sxx = $Sxx + $X*$X;

+

+             $X = $X + $XStep;

+            }

+           $n = count($PosArray);

+           $M = (($n*$Sxy)-($Sx*$Sy)) / (($n*$Sxx)-($Sx*$Sx));

+           $B = (($Sy)-($M*$Sx))/($n);

+

+           $X1 = $this->GraphAreaX1 + $XMargin;

+           $Y1 = $M * $X1 + $B;

+           $X2 = $this->GraphAreaX2 - $XMargin;

+           $Y2 = $M * $X2 + $B;

+

+           if ( $Y1 < $this->GraphAreaY1 ) { $X1 = $X1 + ($this->GraphAreaY1-$Y1); $Y1 = $this->GraphAreaY1; }

+           if ( $Y1 > $this->GraphAreaY2 ) { $X1 = $X1 + ($Y1-$this->GraphAreaY2); $Y1 = $this->GraphAreaY2; }

+           if ( $Y2 < $this->GraphAreaY1 ) { $X2 = $X2 - ($this->GraphAreaY1-$Y2); $Y2 = $this->GraphAreaY1; }

+           if ( $Y2 > $this->GraphAreaY2 ) { $X2 = $X2 - ($Y2-$this->GraphAreaY2); $Y2 = $this->GraphAreaY2; }

+

+           $this->drawLine($X1,$Y1,$X2,$Y2,$Color);

+          }

+         else

+          {

+           if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }

+           $Y = $this->GraphAreaY1 + $XMargin;

+

+           if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }

+           $Sxy = 0; $Sx = 0; $Sy = 0; $Sxx = 0;

+           foreach($PosArray as $Key => $X)

+            {

+             $Sxy = $Sxy + $X*$Y;

+             $Sx  = $Sx + $Y;

+             $Sy  = $Sy + $X;

+             $Sxx = $Sxx + $Y*$Y;

+

+             $Y = $Y + $YStep;

+            }

+           $n = count($PosArray);

+           $M = (($n*$Sxy)-($Sx*$Sy)) / (($n*$Sxx)-($Sx*$Sx));

+           $B = (($Sy)-($M*$Sx))/($n);

+

+           $Y1 = $this->GraphAreaY1 + $XMargin;

+           $X1 = $M * $Y1 + $B;

+           $Y2 = $this->GraphAreaY2 - $XMargin;

+           $X2 = $M * $Y2 + $B;

+

+           if ( $X1 < $this->GraphAreaX1 ) { $Y1 = $Y1 + ($this->GraphAreaX1-$X1); $X1 = $this->GraphAreaX1; }

+           if ( $X1 > $this->GraphAreaX2 ) { $Y1 = $Y1 + ($X1-$this->GraphAreaX2); $X1 = $this->GraphAreaX2; }

+           if ( $X2 < $this->GraphAreaX1 ) { $Y2 = $Y2 - ($this->GraphAreaY1-$X2); $X2 = $this->GraphAreaX1; }

+           if ( $X2 > $this->GraphAreaX2 ) { $Y2 = $Y2 - ($X2-$this->GraphAreaX2); $X2 = $this->GraphAreaX2; }

+

+           $this->drawLine($X1,$Y1,$X2,$Y2,$Color);

+          }

+        }

+      }

+    }

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/class/pImage.class.php
@@ -1,1 +1,243 @@
-
+<?php

+ /*

+     pDraw - pChart core class

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ /* The GD extension is mandatory */

+ if (!extension_loaded('gd') && !extension_loaded('gd2'))

+  {

+   echo "GD extension must be loaded. \r\n";

+   exit();

+  }

+

+ class pImage extends pDraw

+  {

+   /* Image settings, size, quality, .. */

+   var $XSize             = NULL;			// Width of the picture

+   var $YSize             = NULL;			// Height of the picture

+   var $Picture           = NULL;			// GD picture object

+   var $Antialias         = TRUE;			// Turn antialias on or off

+   var $AntialiasQuality  = 0;				// Quality of the antialiasing implementation (0-1)

+   var $Mask              = "";				// Already drawn pixels mask (Filled circle implementation)

+   var $TransparentBackground = FALSE;			// Just to know if we need to flush the alpha channels when rendering

+

+   /* Graph area settings */

+   var $GraphAreaX1       = NULL;			// Graph area X origin

+   var $GraphAreaY1       = NULL;			// Graph area Y origin

+   var $GraphAreaX2       = NULL;			// Graph area bottom right X position

+   var $GraphAreaY2       = NULL;			// Graph area bottom right Y position

+

+   /* Scale settings */

+   var $ScaleMinDivHeight = 20;				// Minimum height for scame divs

+

+   /* Font properties */

+   var $FontName          = "fonts/GeosansLight.ttf";	// Default font file

+   var $FontSize          = 12;				// Default font size

+   var $FontBox           = NULL;			// Return the bounding box of the last written string

+   var $FontColorR        = 0;				// Default color settings

+   var $FontColorG        = 0;				// Default color settings

+   var $FontColorB        = 0;				// Default color settings

+   var $FontColorA        = 100;			// Default transparency

+

+   /* Shadow properties */

+   var $Shadow            = TRUE;			// Turn shadows on or off

+   var $ShadowX           = NULL;			// X Offset of the shadow

+   var $ShadowY           = NULL;			// Y Offset of the shadow

+   var $ShadowR           = NULL;			// R component of the shadow

+   var $ShadowG           = NULL;			// G component of the shadow

+   var $ShadowB           = NULL;			// B component of the shadow

+   var $Shadowa           = NULL;			// Alpha level of the shadow

+

+   /* Data Set */

+   var $DataSet           = NULL;			// Attached dataset

+

+   /* Class constructor */

+   function pImage($XSize,$YSize,$DataSet=NULL,$TransparentBackground=FALSE)

+    {

+     $this->TransparentBackground = $TransparentBackground;

+

+     if ( $DataSet != NULL ) { $this->DataSet = $DataSet; }

+

+     $this->XSize   = $XSize;

+     $this->YSize   = $YSize;

+     $this->Picture = imagecreatetruecolor($XSize,$YSize);

+

+     if ( $this->TransparentBackground )

+      {

+       imagealphablending($this->Picture,FALSE);

+       imagefilledrectangle($this->Picture, 0,0,$XSize, $YSize, imagecolorallocatealpha($this->Picture, 255, 255, 255, 127));

+       imagealphablending($this->Picture,TRUE);

+       imagesavealpha($this->Picture,true); 

+      }

+     else

+      {

+       $C_White = $this->AllocateColor($this->Picture,255,255,255);

+       imagefilledrectangle($this->Picture,0,0,$XSize,$YSize,$C_White);

+      }

+    }

+

+   /* Enable / Disable and set shadow properties */

+   function setShadow($Enabled=TRUE,$Format="")

+    {

+     $X	    = isset($Format["X"]) ? $Format["X"] : 2;

+     $Y	    = isset($Format["Y"]) ? $Format["Y"] : 2;

+     $R	    = isset($Format["R"]) ? $Format["R"] : 0;

+     $G	    = isset($Format["G"]) ? $Format["G"] : 0;

+     $B	    = isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 10;

+

+     $this->Shadow  = $Enabled;

+     $this->ShadowX = $X;

+     $this->ShadowY = $Y;

+     $this->ShadowR = $R;

+     $this->ShadowG = $G;

+     $this->ShadowB = $B;

+     $this->Shadowa = $Alpha;

+    }

+

+   /* Set the graph area position */

+   function setGraphArea($X1,$Y1,$X2,$Y2)

+    {

+     if ( $X2 < $X1 || $X1 == $X2 || $Y2 < $Y1 || $Y1 == $Y2 ) { return(-1); }

+

+     $this->GraphAreaX1 = $X1; $this->DataSet->Data["GraphArea"]["X1"] = $X1;

+     $this->GraphAreaY1 = $Y1; $this->DataSet->Data["GraphArea"]["Y1"] = $Y1;

+     $this->GraphAreaX2 = $X2; $this->DataSet->Data["GraphArea"]["X2"] = $X2;

+     $this->GraphAreaY2 = $Y2; $this->DataSet->Data["GraphArea"]["Y2"] = $Y2;

+    }

+

+   /* Return the width of the picture */

+   function getWidth()

+    { return($this->XSize); }

+

+   /* Return the heigth of the picture */

+   function getHeight()

+    { return($this->YSize); }

+

+   /* Render the picture to a file */

+   function render($FileName)

+    {

+     if ( $this->TransparentBackground ) { imagealphablending($this->Picture,false); imagesavealpha($this->Picture,true); }

+     imagepng($this->Picture,$FileName);

+    }

+

+   /* Render the picture to a web browser stream */

+   function stroke()

+    {

+     if ( $this->TransparentBackground ) { imagealphablending($this->Picture,false); imagesavealpha($this->Picture,true); }

+

+     header('Content-type: image/png');

+     imagepng($this->Picture);

+    }

+

+   /* Automatic output method based on the calling interface */

+   function autoOutput($FileName="output.png")

+    {

+     if (php_sapi_name() == "cli")

+      $this->Render($FileName);

+     else

+      $this->Stroke();

+    }

+

+   /* Return the length between two points */

+   function getLength($X1,$Y1,$X2,$Y2)

+    { return(sqrt(pow(max($X1,$X2)-min($X1,$X2),2)+pow(max($Y1,$Y2)-min($Y1,$Y2),2))); }

+

+   /* Return the orientation of a line */

+   function getAngle($X1,$Y1,$X2,$Y2)

+    {

+     $Opposite = $Y2 - $Y1; $Adjacent = $X2 - $X1;$Angle = rad2deg(atan2($Opposite,$Adjacent));

+     if ($Angle > 0) { return($Angle); } else { return(360-abs($Angle)); }

+    }

+

+   /* Return the surrounding box of text area */

+   function getTextBox_deprecated($X,$Y,$FontName,$FontSize,$Angle,$Text)

+    {

+     $Size    = imagettfbbox($FontSize,$Angle,$FontName,$Text);

+     $Width   = $this->getLength($Size[0],$Size[1],$Size[2],$Size[3])+1;

+     $Height  = $this->getLength($Size[2],$Size[3],$Size[4],$Size[5])+1;

+

+     $RealPos[0]["X"] = $X; $RealPos[0]["Y"] = $Y;

+     $RealPos[1]["X"] = cos((360-$Angle)*PI/180)*$Width + $RealPos[0]["X"]; $RealPos[1]["Y"] = sin((360-$Angle)*PI/180)*$Width + $RealPos[0]["Y"];

+     $RealPos[2]["X"] = cos((270-$Angle)*PI/180)*$Height + $RealPos[1]["X"]; $RealPos[2]["Y"] = sin((270-$Angle)*PI/180)*$Height + $RealPos[1]["Y"];

+     $RealPos[3]["X"] = cos((180-$Angle)*PI/180)*$Width + $RealPos[2]["X"]; $RealPos[3]["Y"] = sin((180-$Angle)*PI/180)*$Width + $RealPos[2]["Y"];

+

+     $RealPos[TEXT_ALIGN_BOTTOMLEFT]["X"] = $RealPos[0]["X"];	$RealPos[TEXT_ALIGN_BOTTOMLEFT]["Y"] = $RealPos[0]["Y"];

+     $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["X"] = $RealPos[1]["X"];	$RealPos[TEXT_ALIGN_BOTTOMRIGHT]["Y"] = $RealPos[1]["Y"];

+

+     return($RealPos);

+    }

+

+   /* Return the surrounding box of text area */

+   function getTextBox($X,$Y,$FontName,$FontSize,$Angle,$Text)

+    {

+     $coords = imagettfbbox($FontSize, 0, $FontName, $Text);

+

+     $a = deg2rad($Angle); $ca = cos($a); $sa = sin($a); $RealPos = array();

+     for($i = 0; $i < 7; $i += 2)

+      {

+       $RealPos[$i/2]["X"] = $X + round($coords[$i] * $ca + $coords[$i+1] * $sa);

+       $RealPos[$i/2]["Y"] = $Y + round($coords[$i+1] * $ca - $coords[$i] * $sa);

+      }

+

+     $RealPos[TEXT_ALIGN_BOTTOMLEFT]["X"]	= $RealPos[0]["X"];	$RealPos[TEXT_ALIGN_BOTTOMLEFT]["Y"]	= $RealPos[0]["Y"];

+     $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["X"]	= $RealPos[1]["X"];	$RealPos[TEXT_ALIGN_BOTTOMRIGHT]["Y"]	= $RealPos[1]["Y"];

+     $RealPos[TEXT_ALIGN_TOPLEFT]["X"]		= $RealPos[3]["X"];	$RealPos[TEXT_ALIGN_TOPLEFT]["Y"]	= $RealPos[3]["Y"];

+     $RealPos[TEXT_ALIGN_TOPRIGHT]["X"]		= $RealPos[2]["X"];	$RealPos[TEXT_ALIGN_TOPRIGHT]["Y"]	= $RealPos[2]["Y"];

+     $RealPos[TEXT_ALIGN_BOTTOMMIDDLE]["X"]	= ($RealPos[1]["X"]-$RealPos[0]["X"])/2+$RealPos[0]["X"];	$RealPos[TEXT_ALIGN_BOTTOMMIDDLE]["Y"]	= ($RealPos[0]["Y"]-$RealPos[1]["Y"])/2+$RealPos[1]["Y"];

+     $RealPos[TEXT_ALIGN_TOPMIDDLE]["X"]	= ($RealPos[2]["X"]-$RealPos[3]["X"])/2+$RealPos[3]["X"];	$RealPos[TEXT_ALIGN_TOPMIDDLE]["Y"]	= ($RealPos[3]["Y"]-$RealPos[2]["Y"])/2+$RealPos[2]["Y"];

+     $RealPos[TEXT_ALIGN_MIDDLELEFT]["X"]	= ($RealPos[0]["X"]-$RealPos[3]["X"])/2+$RealPos[3]["X"];	$RealPos[TEXT_ALIGN_MIDDLELEFT]["Y"]	= ($RealPos[0]["Y"]-$RealPos[3]["Y"])/2+$RealPos[3]["Y"];

+     $RealPos[TEXT_ALIGN_MIDDLERIGHT]["X"]	= ($RealPos[1]["X"]-$RealPos[2]["X"])/2+$RealPos[2]["X"];	$RealPos[TEXT_ALIGN_MIDDLERIGHT]["Y"]	= ($RealPos[1]["Y"]-$RealPos[2]["Y"])/2+$RealPos[2]["Y"];

+     $RealPos[TEXT_ALIGN_MIDDLEMIDDLE]["X"]	= ($RealPos[1]["X"]-$RealPos[3]["X"])/2+$RealPos[3]["X"];	$RealPos[TEXT_ALIGN_MIDDLEMIDDLE]["Y"]	= ($RealPos[0]["Y"]-$RealPos[2]["Y"])/2+$RealPos[2]["Y"];

+

+     return($RealPos);

+    }

+

+   /* Set current font properties */

+   function setFontProperties($Format="")

+    {

+     $R		= isset($Format["R"]) ? $Format["R"] : -1;

+     $G		= isset($Format["G"]) ? $Format["G"] : -1;

+     $B		= isset($Format["B"]) ? $Format["B"] : -1;

+     $Alpha	= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $FontName	= isset($Format["FontName"]) ? $Format["FontName"] : NULL;

+     $FontSize	= isset($Format["FontSize"]) ? $Format["FontSize"] : NULL;

+

+     if ( $R != -1)       {  $this->FontColorR = $R; }

+     if ( $G != -1)       {  $this->FontColorG = $G; }

+     if ( $B != -1)       {  $this->FontColorB = $B; }

+     if ( $Alpha != NULL) {  $this->FontColorA = $Alpha; }

+

+     if ( $FontName != NULL  )

+      $this->FontName = $FontName;

+ 

+     if ( $FontSize != NULL  )

+      $this->FontSize = $FontSize;

+    }

+

+   /* Returns the 1st decimal values (used to correct AA bugs) */

+   function getFirstDecimal($Value)

+    {

+     $Values = preg_split("/\./",$Value);

+     if ( isset($Values[1]) ) { return(substr($Values[1],0,1)); } else { return(0); }

+    }

+

+   /* Attach a dataset to your pChart Object */

+   function setDataSet(&$DataSet)

+    { $this->DataSet = $DataSet; }

+

+   /* Print attached dataset contents to STDOUT */

+   function printDataSet()

+    { print_r($this->DataSet); }

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/class/pPie.class.php
@@ -1,1 +1,715 @@
-
+<?php

+ /*

+     pPie - class to draw pie charts

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ /* Class return codes */

+ define("PIE_NO_ABSCISSA"	, 140001);

+ define("PIE_NO_DATASERIE"	, 140002);

+ define("PIE_SUMISNULL"		, 140003);

+ define("PIE_RENDERED"		, 140000);

+

+ define("PIE_LABEL_COLOR_AUTO"	, 140010);

+ define("PIE_LABEL_COLOR_MANUAL", 140011);

+

+ define("PIE_VALUE_NATURAL"	, 140020);

+ define("PIE_VALUE_PERCENTAGE"	, 140021);

+

+ /* pPie class definition */

+ class pPie

+  {

+   var $pChartObject;

+   var $pDataObject;

+

+   /* Class creator */

+   function pPie($Object,$pDataObject)

+    {

+     /* Cache the pChart object reference */

+     $this->pChartObject = $Object;

+

+     /* Cache the pData object reference */

+     $this->pDataObject  = $pDataObject;

+    }

+

+   /* Draw a pie chart */

+   function draw2DPie($X,$Y,$Format="")

+    {

+     /* Rendering layout */

+     $Radius		= isset($Format["Radius"]) ? $Format["Radius"] : 60;

+     $DataGapAngle	= isset($Format["DataGapAngle"]) ? $Format["DataGapAngle"] : 0;

+     $DataGapRadius	= isset($Format["DataGapRadius"]) ? $Format["DataGapRadius"] : 0;

+     $SecondPass	= isset($Format["SecondPass"]) ? $Format["SecondPass"] : TRUE;

+     $Border		= isset($Format["Border"]) ? $Format["Border"] : FALSE;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : 255;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : 255;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : 255;

+     $Shadow		= isset($Format["Shadow"]) ? $Format["Shadow"] : FALSE;

+     $DrawLabels	= isset($Format["DrawLabels"]) ? $Format["DrawLabels"] : FALSE;

+     $LabelColor	= isset($Format["LabelColor"]) ? $Format["LabelColor"] : PIE_LABEL_COLOR_MANUAL;

+     $LabelR		= isset($Format["LabelR"]) ? $Format["LabelR"] : 0;

+     $LabelG		= isset($Format["LabelG"]) ? $Format["LabelG"] : 0;

+     $LabelB		= isset($Format["LabelB"]) ? $Format["LabelB"] : 0;

+     $LabelAlpha	= isset($Format["LabelAlpha"]) ? $Format["LabelAlpha"] : 100;

+

+     /* Data Processing */

+     $Data    = $this->pDataObject->getData();

+     $Palette = $this->pDataObject->getPalette();

+

+     /* Do we have an abscissa serie defined? */

+     if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); }

+

+     /* Try to find the data serie */

+     $DataSerie = "";

+     foreach ($Data["Series"] as $SerieName => $SerieData)

+      { if ( $SerieName != $Data["Abscissa"]) { $DataSerie = $SerieName; } }

+

+     /* Do we have data to compute? */

+     if ( $DataSerie == "" ) { return(PIE_NO_DATASERIE); }

+

+     /* Compute the pie sum */

+     $SerieSum = $this->pDataObject->getSum($DataSerie);

+

+     /* Do we have data to draw? */

+     if ( $SerieSum == 0 ) { return(PIE_SUMISNULL); }

+

+     /* Dump the real number of data to draw */

+     $Values = "";

+     foreach ($Data["Series"][$DataSerie]["Data"] as $Key => $Value)

+      { if ($Value != 0) { $Values[] = $Value; } }

+

+     /* Compute the wasted angular space between series */

+     if (count($Values)==1) { $WastedAngular = 0; } else { $WastedAngular = count($Values) * $DataGapAngle; }

+

+     /* Compute the scale */

+     $ScaleFactor = (360 - $WastedAngular) / $SerieSum;

+

+     $RestoreShadow = $this->pChartObject->Shadow;

+     if ( $this->pChartObject->Shadow )

+      {

+       $this->pChartObject->Shadow = FALSE;

+

+       $ShadowFormat = $Format; $ShadowFormat["Shadow"] = TRUE;

+       $this->draw2DPie($X+$this->pChartObject->ShadowX,$Y+$this->pChartObject->ShadowY,$ShadowFormat);

+      }

+

+     /* Draw the polygon pie elements */

+     $Step = 360 / (2 * PI * $Radius);

+     $Offset = 0; $ID = 0;

+     foreach($Values as $Key => $Value)

+      {

+       if ( $Shadow )

+        $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa);

+       else

+        $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);

+

+       if ( !$SecondPass && !$Shadow )

+        {

+         if ( !$Border )

+          $Settings["Surrounding"] = 10;

+         else

+          { $Settings["BorderR"] = $BorderR; $Settings["BorderG"] = $BorderG; $Settings["BorderB"] = $BorderB; }

+        }

+

+       $Plots = "";

+       $EndAngle = $Offset+($Value*$ScaleFactor); if ( $EndAngle > 360 ) { $EndAngle = 360; }

+

+       $Angle = ($EndAngle - $Offset)/2 + $Offset;

+       if ($DataGapAngle == 0)

+        { $X0 = $X; $Y0 = $Y; }

+       else

+        {

+         $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X;

+         $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius + $Y;

+        }

+

+       $Plots[] = $X0; $Plots[] = $Y0;

+

+

+       for($i=$Offset;$i<=$EndAngle;$i=$i+$Step)

+        {

+         $Xc = cos(($i-90)*PI/180) * $Radius + $X;

+         $Yc = sin(($i-90)*PI/180) * $Radius + $Y;

+

+         if ( $SecondPass && ( $i<90 )) { $Yc++; }

+         if ( $SecondPass && ( $i>180 && $i<270 )) { $Xc++; }

+         if ( $SecondPass && ( $i>=270 )) { $Xc++; $Yc++; }

+

+         $Plots[] = $Xc; $Plots[] = $Yc;

+        }

+

+       $this->pChartObject->drawPolygon($Plots,$Settings);

+

+       if ( $DrawLabels && !$Shadow && !$SecondPass )

+        {

+         if ( $LabelColor == PIE_LABEL_COLOR_AUTO )

+          { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);}

+         else

+          { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); }

+

+         $Angle = ($EndAngle - $Offset)/2 + $Offset;

+         $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;

+         $Yc = sin(($Angle-90)*PI/180) * $Radius + $Y;

+

+         $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$Key];

+

+         $Settings["Angle"]  = 360-$Angle;

+         $Settings["Length"] = 25;

+         $Settings["Size"]   = 8;

+         $this->pChartObject->drawArrowLabel($Xc,$Yc," ".$Label." ",$Settings);

+        }

+

+       $Offset = $i + $DataGapAngle; $ID++;

+      }

+

+     /* Second pass to smooth the angles */

+     if ( $SecondPass )

+      {

+       $Step = 360 / (2 * PI * $Radius);

+       $Offset = 0; $ID = 0;

+       foreach($Values as $Key => $Value)

+        {

+         $FirstPoint = TRUE;

+         if ( $Shadow )

+          $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa);

+         else

+          {

+           if ( $Border )

+            $Settings = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB);

+           else

+            $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);

+          }

+

+         $EndAngle = $Offset+($Value*$ScaleFactor); if ( $EndAngle > 360 ) { $EndAngle = 360; }

+

+         if ($DataGapAngle == 0)

+          { $X0 = $X; $Y0 = $Y; }

+         else

+          {

+           $Angle = ($EndAngle - $Offset)/2 + $Offset;

+           $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X;

+           $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius + $Y;

+          }

+         $Plots[] = $X0; $Plots[] = $Y0;

+

+         for($i=$Offset;$i<=$EndAngle;$i=$i+$Step)

+          {

+           $Xc = cos(($i-90)*PI/180) * $Radius + $X;

+           $Yc = sin(($i-90)*PI/180) * $Radius + $Y;

+

+           if ( $FirstPoint ) { $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings); } { $FirstPoint = FALSE; }

+  

+           $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings);

+          }

+         $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings);

+

+         if ( $DrawLabels && !$Shadow )

+          {

+           if ( $LabelColor == PIE_LABEL_COLOR_AUTO )

+            { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);}

+           else

+            { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); }

+

+           $Angle = ($EndAngle - $Offset)/2 + $Offset;

+           $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;

+           $Yc = sin(($Angle-90)*PI/180) * $Radius + $Y;

+

+           $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$Key];

+

+           $Settings["Angle"]  = 360-$Angle;

+           $Settings["Length"] = 25;

+           $Settings["Size"]   = 8;

+

+           $this->pChartObject->drawArrowLabel($Xc,$Yc," ".$Label." ",$Settings);

+          }

+  

+         $Offset = $i + $DataGapAngle; $ID++;

+        }

+      }

+

+     $this->pChartObject->Shadow = $RestoreShadow;

+

+     return(PIE_RENDERED);

+    }

+

+   /* Draw a 3D pie chart */

+   function draw3DPie($X,$Y,$Format="")

+    {

+     /* Rendering layout */

+     $Radius		= isset($Format["Radius"]) ? $Format["Radius"] : 80;

+     $SkewFactor	= isset($Format["SkewFactor"]) ? $Format["SkewFactor"] : .5;

+     $SliceHeight	= isset($Format["SliceHeight"]) ? $Format["SliceHeight"] : 20;

+     $DataGapAngle	= isset($Format["DataGapAngle"]) ? $Format["DataGapAngle"] : 0;

+     $DataGapRadius	= isset($Format["DataGapRadius"]) ? $Format["DataGapRadius"] : 0;

+     $SecondPass	= isset($Format["SecondPass"]) ? $Format["SecondPass"] : TRUE;

+     $Border		= isset($Format["Border"]) ? $Format["Border"] : FALSE;

+     $Shadow		= isset($Format["Shadow"]) ? $Format["Shadow"] : FALSE;

+     $DrawLabels	= isset($Format["DrawLabels"]) ? $Format["DrawLabels"] : FALSE;

+     $LabelColor	= isset($Format["LabelColor"]) ? $Format["LabelColor"] : PIE_LABEL_COLOR_MANUAL;

+     $LabelR		= isset($Format["LabelR"]) ? $Format["LabelR"] : 0;

+     $LabelG		= isset($Format["LabelG"]) ? $Format["LabelG"] : 0;

+     $LabelB		= isset($Format["LabelB"]) ? $Format["LabelB"] : 0;

+     $LabelAlpha	= isset($Format["LabelAlpha"]) ? $Format["LabelAlpha"] : 100;

+     $WriteValues	= isset($Format["WriteValues"]) ? $Format["WriteValues"] : PIE_VALUE_PERCENTAGE;

+     $ValueSuffix	= isset($Format["ValueSuffix"]) ? $Format["ValueSuffix"] : "";

+     $ValueR		= isset($Format["ValueR"]) ? $Format["ValueR"] : 255;

+     $ValueG		= isset($Format["ValueG"]) ? $Format["ValueG"] : 255;

+     $ValueB		= isset($Format["ValueB"]) ? $Format["ValueB"] : 255;

+     $ValueAlpha	= isset($Format["ValueAlpha"]) ? $Format["ValueAlpha"] : 100;

+

+     /* Error correction for overlaying rounded corners */

+     if ( $SkewFactor < .5 ) { $SkewFactor = .5; }

+

+     /* Data Processing */

+     $Data    = $this->pDataObject->getData();

+     $Palette = $this->pDataObject->getPalette();

+

+     /* Do we have an abscissa serie defined? */

+     if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); }

+

+     /* Try to find the data serie */

+     $DataSerie = "";

+     foreach ($Data["Series"] as $SerieName => $SerieData)

+      { if ( $SerieName != $Data["Abscissa"]) { $DataSerie = $SerieName; } }

+

+     /* Do we have data to compute? */

+     if ( $DataSerie == "" ) { return(PIE_NO_DATASERIE); }

+

+     /* Compute the pie sum */

+     $SerieSum = $this->pDataObject->getSum($DataSerie);

+

+     /* Do we have data to draw? */

+     if ( $SerieSum == 0 ) { return(PIE_SUMISNULL); }

+

+     /* Dump the real number of data to draw */

+     $Values = "";

+     foreach ($Data["Series"][$DataSerie]["Data"] as $Key => $Value)

+      { if ($Value != 0) { $Values[] = $Value; } }

+

+     /* Compute the wasted angular space between series */

+     if (count($Values)==1) { $WastedAngular = 0; } else { $WastedAngular = count($Values) * $DataGapAngle; }

+

+     /* Compute the scale */

+     $ScaleFactor = (360 - $WastedAngular) / $SerieSum;

+

+     $RestoreShadow = $this->pChartObject->Shadow;

+     if ( $this->pChartObject->Shadow ) { $this->pChartObject->Shadow = FALSE; }

+

+     /* Draw the polygon pie elements */

+     $Step   = 360 / (2 * PI * $Radius);

+     $Offset = 360; $ID = count($Values)-1;

+     $Values = array_reverse($Values);

+     $Slice  = 0; $Slices = ""; $SliceColors = ""; $Visible = ""; $SliceAngle = "";

+     foreach($Values as $Key => $Value)

+      {

+       $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);

+       $SliceColors[$Slice] = $Settings;

+

+       $StartAngle = $Offset;

+       $EndAngle   = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; }

+

+       if ( $StartAngle > 180 ) { $Visible[$Slice]["Start"] = TRUE; } else { $Visible[$Slice]["Start"] = TRUE; }

+       if ( $EndAngle < 180 )   { $Visible[$Slice]["End"] = FALSE; } else { $Visible[$Slice]["End"] = TRUE; }

+

+       if ($DataGapAngle == 0)

+        { $X0 = $X; $Y0 = $Y; }

+       else

+        {

+         $Angle = ($EndAngle - $Offset)/2 + $Offset;

+         $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X;

+         $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius*$SkewFactor + $Y;

+        }

+       $Slices[$Slice][] = $X0; $Slices[$Slice][] = $Y0; $SliceAngle[$Slice][] = 0;

+

+       for($i=$Offset;$i>=$EndAngle;$i=$i-$Step)

+        {

+         $Xc = cos(($i-90)*PI/180) * $Radius + $X;

+         $Yc = sin(($i-90)*PI/180) * $Radius*$SkewFactor + $Y;

+

+         if ( ($SecondPass || $RestoreShadow ) && ( $i<90 )) { $Yc++; }

+         if ( ($SecondPass || $RestoreShadow ) && ( $i>90 && $i<180 )) { $Xc++; }

+         if ( ($SecondPass || $RestoreShadow ) && ( $i>180 && $i<270 )) { $Xc++; }

+         if ( ($SecondPass || $RestoreShadow ) && ( $i>=270 )) { $Xc++; $Yc++; }

+

+         $Slices[$Slice][] = $Xc; $Slices[$Slice][] = $Yc; $SliceAngle[$Slice][] = $i;

+        }

+

+       $Offset = $i - $DataGapAngle; $ID--; $Slice++;

+      }

+

+     /* Draw the bottom shadow if needed */

+     if ( $RestoreShadow && ($this->pChartObject->ShadowX != 0 || $this->pChartObject->ShadowY !=0 ))

+      {

+       foreach($Slices as $SliceID => $Plots)

+        {

+         $ShadowPie = "";

+         for($i=0;$i<count($Plots);$i=$i+2)

+          { $ShadowPie[] = $Plots[$i]+$this->pChartObject->ShadowX; $ShadowPie[] = $Plots[$i+1]+$this->pChartObject->ShadowY; }

+

+         $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa,"NoBorder"=>TRUE);

+         $this->pChartObject->drawPolygon($ShadowPie,$Settings);

+        }

+

+       $Step = 360 / (2 * PI * $Radius);

+       $Offset = 360;

+       foreach($Values as $Key => $Value)

+        {

+         $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; }

+

+         for($i=$Offset;$i>=$EndAngle;$i=$i-$Step)

+          {

+           $Xc = cos(($i-90)*PI/180) * $Radius + $X + $this->pChartObject->ShadowX;

+           $Yc = sin(($i-90)*PI/180) * $Radius*$SkewFactor + $Y + $this->pChartObject->ShadowY;

+

+           $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings);

+          }

+

+         $Offset = $i - $DataGapAngle; $ID--;

+        }

+      }

+

+     /* Draw the bottom pie splice */

+     foreach($Slices as $SliceID => $Plots)

+      {

+       $Settings = $SliceColors[$SliceID];  $Settings["NoBorder"] = TRUE;

+       $this->pChartObject->drawPolygon($Plots,$Settings);

+

+       if ( $SecondPass )

+        {

+         $Settings = $SliceColors[$SliceID];

+         if ( $Border )

+          { $Settings["R"]+= 30; $Settings["G"]+= 30; $Settings["B"]+= 30;; }

+  

+         $Angle = $SliceAngle[$SliceID][1];

+         $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;

+         $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y;

+         $this->pChartObject->drawLine($Plots[0],$Plots[1],$Xc,$Yc,$Settings);

+

+         $Angle = $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1];

+         $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;

+         $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y;

+         $this->pChartObject->drawLine($Plots[0],$Plots[1],$Xc,$Yc,$Settings);

+        }

+      }

+

+     /* Draw the two vertical edges */

+     $Slices      = array_reverse($Slices);

+     $SliceColors = array_reverse($SliceColors);

+     foreach($Slices as $SliceID => $Plots)

+      {

+       $Settings = $SliceColors[$SliceID];

+       $Settings["R"]+= 10; $Settings["G"]+= 10; $Settings["B"]+= 10; $Settings["NoBorder"] = TRUE;

+

+       if ( $Visible[$SliceID]["Start"] )

+        {

+         $this->pChartObject->drawLine($Plots[2],$Plots[3],$Plots[2],$Plots[3]- $SliceHeight,array("R"=>255,"G"=>255,"B"=>255));

+         $Border = "";

+         $Border[] = $Plots[0]; $Border[] = $Plots[1]; $Border[] = $Plots[0]; $Border[] = $Plots[1] - $SliceHeight;

+         $Border[] = $Plots[2]; $Border[] = $Plots[3] - $SliceHeight; $Border[] = $Plots[2]; $Border[] = $Plots[3]; 

+         $this->pChartObject->drawPolygon($Border,$Settings);

+        }

+      }

+

+     $Slices      = array_reverse($Slices);

+     $SliceColors = array_reverse($SliceColors);

+     foreach($Slices as $SliceID => $Plots)

+      {

+       $Settings = $SliceColors[$SliceID];

+       $Settings["R"]+= 10; $Settings["G"]+= 10; $Settings["B"]+= 10; $Settings["NoBorder"] = TRUE;

+       if ( $Visible[$SliceID]["End"] )

+        {

+         $this->pChartObject->drawLine($Plots[count($Plots)-2],$Plots[count($Plots)-1],$Plots[count($Plots)-2],$Plots[count($Plots)-1]- $SliceHeight,array("R"=>255,"G"=>255,"B"=>255));

+

+         $Border = "";

+         $Border[] = $Plots[0]; $Border[] = $Plots[1]; $Border[] = $Plots[0]; $Border[] = $Plots[1] - $SliceHeight;

+         $Border[] = $Plots[count($Plots)-2]; $Border[] = $Plots[count($Plots)-1] - $SliceHeight; $Border[] = $Plots[count($Plots)-2]; $Border[] = $Plots[count($Plots)-1]; 

+         $this->pChartObject->drawPolygon($Border,$Settings);

+        }

+      }

+

+     /* Draw the rounded edges */

+     foreach($Slices as $SliceID => $Plots)

+      {

+       $Settings = $SliceColors[$SliceID];

+       $Settings["R"]+= 10; $Settings["G"]+= 10; $Settings["B"]+= 10; $Settings["NoBorder"] = TRUE;

+

+       for ($j=2;$j<count($Plots)-2;$j=$j+2)

+        {

+         $Angle = $SliceAngle[$SliceID][$j/2];

+         if ( $Angle < 270 && $Angle > 90 )

+          {

+           $Border = "";

+           $Border[] = $Plots[$j];   $Border[] = $Plots[$j+1];

+           $Border[] = $Plots[$j+2]; $Border[] = $Plots[$j+3];

+           $Border[] = $Plots[$j+2]; $Border[] = $Plots[$j+3] - $SliceHeight;

+           $Border[] = $Plots[$j];   $Border[] = $Plots[$j+1] - $SliceHeight;

+           $this->pChartObject->drawPolygon($Border,$Settings);

+          }

+        }

+

+       if ( $SecondPass )

+        {

+         $Settings = $SliceColors[$SliceID];

+         if ( $Border )

+          { $Settings["R"]+= 30; $Settings["G"]+= 30; $Settings["B"]+= 30; }

+  

+         $Angle = $SliceAngle[$SliceID][1];

+         if ( $Angle < 270 && $Angle > 90 )

+          {

+           $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;

+           $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y;

+           $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings);

+          }

+

+         $Angle = $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1];

+         if ( $Angle < 270 && $Angle > 90 )

+          {

+           $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;

+           $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y;

+           $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings);

+          }

+

+         if ( $SliceAngle[$SliceID][1] > 270 && $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1] < 270 )

+          {

+           $Xc = cos((270-90)*PI/180) * $Radius + $X;

+           $Yc = sin((270-90)*PI/180) * $Radius*$SkewFactor + $Y;

+           $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings);

+          }

+

+         if ( $SliceAngle[$SliceID][1] > 90 && $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1] < 90 )

+          {

+           $Xc = cos((0)*PI/180) * $Radius + $X;

+           $Yc = sin((0)*PI/180) * $Radius*$SkewFactor + $Y;

+           $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings);

+          }

+

+        }

+      }

+

+     /* Draw the top splice */

+     foreach($Slices as $SliceID => $Plots)

+      {

+       $Settings = $SliceColors[$SliceID];

+       $Settings["R"]+= 20; $Settings["G"]+= 20; $Settings["B"]+= 20;

+

+       $Top = "";

+       for($j=0;$j<count($Plots);$j=$j+2) { $Top[] = $Plots[$j]; $Top[] = $Plots[$j+1]- $SliceHeight; }

+       $this->pChartObject->drawPolygon($Top,$Settings);

+      }

+

+

+     /* Second pass to smooth the angles */

+     if ( $SecondPass )

+      {

+       $Step = 360 / (2 * PI * $Radius);

+       $Offset = 360; $ID = count($Values)-1;

+       foreach($Values as $Key => $Value)

+        {

+         $FirstPoint = TRUE;

+         if ( $Shadow )

+          $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa);

+         else

+          {

+           if ( $Border )

+            { $Settings = array("R"=>$Palette[$ID]["R"]+30,"G"=>$Palette[$ID]["G"]+30,"B"=>$Palette[$ID]["B"]+30,"Alpha"=>$Palette[$ID]["Alpha"]); }

+           else

+            $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);

+          }

+

+         $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; }

+

+         if ($DataGapAngle == 0)

+          { $X0 = $X; $Y0 = $Y- $SliceHeight; }

+         else

+          {

+           $Angle = ($EndAngle - $Offset)/2 + $Offset;

+           $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X;

+           $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius*$SkewFactor + $Y - $SliceHeight;

+          }

+         $Plots[] = $X0; $Plots[] = $Y0;

+

+         for($i=$Offset;$i>=$EndAngle;$i=$i-$Step)

+          {

+           $Xc = cos(($i-90)*PI/180) * $Radius + $X;

+           $Yc = sin(($i-90)*PI/180) * $Radius*$SkewFactor + $Y - $SliceHeight;

+

+           if ( $FirstPoint ) { $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings); } { $FirstPoint = FALSE; }

+  

+           $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings);

+           if ($i < 270 && $i > 90 ) { $this->pChartObject->drawAntialiasPixel($Xc,$Yc+$SliceHeight,$Settings); }

+          }

+         $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings);

+

+         $Offset = $i - $DataGapAngle; $ID--;

+        }

+      }

+

+     if ( $WriteValues != NULL )

+      {

+       $Step = 360 / (2 * PI * $Radius);

+       $Offset = 360; $ID = count($Values)-1;

+       $Settings = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"R"=>$ValueR,"G"=>$ValueG,"B"=>$ValueB,"Alpha"=>$ValueAlpha);

+       foreach($Values as $Key => $Value)

+        {

+         $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; }

+

+         $Angle = ($EndAngle - $Offset)/2 + $Offset;

+         $Xc = cos(($Angle-90)*PI/180) * ($Radius)/2 + $X;

+         $Yc = sin(($Angle-90)*PI/180) * ($Radius*$SkewFactor)/2 + $Y - $SliceHeight;

+

+         if ( $WriteValues == PIE_VALUE_PERCENTAGE )

+          $Display = round(( 100 / $SerieSum ) * $Value)."%";

+         elseif ( $WriteValues == PIE_VALUE_NATURAL )

+          $Display = $Value.$ValueSuffix;

+

+         $this->pChartObject->drawText($Xc,$Yc,$Display,$Settings);

+

+         $Offset = $EndAngle - $DataGapAngle; $ID--;

+        }

+      }

+

+     if ( $DrawLabels )

+      {

+       $Step = 360 / (2 * PI * $Radius);

+       $Offset = 360; $ID = count($Values)-1;

+       foreach($Values as $Key => $Value)

+        {

+         if ( $LabelColor == PIE_LABEL_COLOR_AUTO )

+          { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);}

+         else

+          { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); }

+

+         $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; }

+

+         $Angle = ($EndAngle - $Offset)/2 + $Offset;

+         $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;

+         $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y - $SliceHeight;

+

+         if ( isset($Data["Series"][$Data["Abscissa"]]["Data"][$ID]) )

+          {

+           $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$ID];

+

+           $Settings["Angle"]  = 360-$Angle;

+           $Settings["Length"] = 25;

+           $Settings["Size"]   = 8;

+           $this->pChartObject->drawArrowLabel($Xc,$Yc," ".$Label." ",$Settings);

+          }

+

+         $Offset = $EndAngle - $DataGapAngle; $ID--;

+        }

+      }

+

+     $this->pChartObject->Shadow = $RestoreShadow;

+

+     return(PIE_RENDERED);

+    }

+

+   /* Draw the legend of pie chart */

+   function drawPieLegend($X,$Y,$Format="")

+    {

+     $FontName		= isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName;

+     $FontSize		= isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize;

+     $FontR		= isset($Format["FontR"]) ? $Format["FontR"] : $this->pChartObject->FontColorR;

+     $FontG		= isset($Format["FontG"]) ? $Format["FontG"] : $this->pChartObject->FontColorG;

+     $FontB		= isset($Format["FontB"]) ? $Format["FontB"] : $this->pChartObject->FontColorB;

+     $BoxSize		= isset($Format["BoxSize"]) ? $Format["BoxSize"] : 5;

+     $Margin		= isset($Format["Margin"]) ? $Format["Margin"] : 5;

+     $R			= isset($Format["R"]) ? $Format["R"] : 200;

+     $G			= isset($Format["G"]) ? $Format["G"] : 200;

+     $B			= isset($Format["B"]) ? $Format["B"] : 200;

+     $Alpha		= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : 255;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : 255;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : 255;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $Style		= isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND;

+     $Mode		= isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL;

+

+     if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; }

+

+     $YStep = max($this->pChartObject->FontSize,$BoxSize) + 5;

+     $XStep = $BoxSize + 5;

+

+     /* Data Processing */

+     $Data    = $this->pDataObject->getData();

+     $Palette = $this->pDataObject->getPalette();

+

+     /* Do we have an abscissa serie defined? */

+     if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); }

+

+     $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X;

+     foreach($Data["Series"][$Data["Abscissa"]]["Data"] as $Key => $Value)

+      {

+       $BoxArray = $this->pChartObject->getTextBox($vX+$BoxSize+4,$vY+$BoxSize/2,$FontName,$FontSize,0,$Value);

+

+       if ( $Mode == LEGEND_VERTICAL )

+        {

+         if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$BoxSize/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$BoxSize/2; }

+         if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }

+         if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$BoxSize/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$BoxSize/2; }

+         $vY=$vY+$YStep;

+        }

+       elseif ( $Mode == LEGEND_HORIZONTAL )

+        {

+         if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$BoxSize/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$BoxSize/2; }

+         if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }

+         if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$BoxSize/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$BoxSize/2; }

+         $vX=$Boundaries["R"]+$XStep;

+        }

+      }

+     $vY=$vY-$YStep; $vX=$vX-$XStep;

+

+     $TopOffset  = $Y - $Boundaries["T"];

+     if ( $Boundaries["B"]-($vY+$BoxSize) < $TopOffset ) { $Boundaries["B"] = $vY+$BoxSize+$TopOffset; }

+

+     if ( $Style == LEGEND_ROUND )

+      $this->pChartObject->drawRoundedFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));

+     elseif ( $Style == LEGEND_BOX )

+      $this->pChartObject->drawFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));

+

+     $RestoreShadow = $this->pChartObject->Shadow; $this->pChartObject->Shadow = FALSE;

+     foreach($Data["Series"][$Data["Abscissa"]]["Data"] as $Key => $Value)

+      {

+       $R = $Palette[$Key]["R"]; $G = $Palette[$Key]["G"]; $B = $Palette[$Key]["B"];

+

+       $this->pChartObject->drawFilledRectangle($X+1,$Y+1,$X+$BoxSize+1,$Y+$BoxSize+1,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+       $this->pChartObject->drawFilledRectangle($X,$Y,$X+$BoxSize,$Y+$BoxSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20));

+       if ( $Mode == LEGEND_VERTICAL )

+        {

+         $this->pChartObject->drawText($X+$BoxSize+4,$Y+$BoxSize/2,$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT));

+         $Y=$Y+$YStep;

+        }

+       elseif ( $Mode == LEGEND_HORIZONTAL )

+        {

+         $BoxArray = $this->pChartObject->drawText($X+$BoxSize+4,$Y+$BoxSize/2,$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT));

+         $X=$BoxArray[1]["X"]+2+$XStep;

+        }

+      }

+

+     $this->Shadow = $RestoreShadow;

+    }

+

+   /* Set the color of the specified slice */

+   function setSliceColor($SliceID,$Format="")

+    {

+     $R		= isset($Format["R"]) ? $Format["R"] : 0;

+     $G		= isset($Format["G"]) ? $Format["G"] : 0;

+     $B		= isset($Format["B"]) ? $Format["B"] : 0;

+     $Alpha	= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+

+     $this->pDataObject->Palette[$SliceID]["R"]     = $R;

+     $this->pDataObject->Palette[$SliceID]["G"]     = $G;

+     $this->pDataObject->Palette[$SliceID]["B"]     = $B;

+     $this->pDataObject->Palette[$SliceID]["Alpha"] = $Alpha;

+    }

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/class/pRadar.class.php
@@ -1,1 +1,598 @@
-
+<?php

+ /*

+     pRadar - class to draw radar charts

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ define("SEGMENT_HEIGHT_AUTO"		, 690001);

+

+ define("RADAR_LAYOUT_STAR"		, 690011);

+ define("RADAR_LAYOUT_CIRCLE"		, 690012);

+

+ define("RADAR_LABELS_ROTATED"		, 690021);

+ define("RADAR_LABELS_HORIZONTAL"	, 690022);

+

+ /* pRadar class definition */

+ class pRadar

+  {

+   var $pChartObject;

+

+   /* Class creator */

+   function pRadar()

+    { }

+

+   /* Draw a radar chart */

+   function drawRadar($Object,$Values,$Format="")

+    {

+     $this->pChartObject = $Object;

+

+     $AxisR		= isset($Format["AxisR"]) ? $Format["AxisR"] : 60;

+     $AxisG		= isset($Format["AxisG"]) ? $Format["AxisG"] : 60;

+     $AxisB		= isset($Format["AxisB"]) ? $Format["AxisB"] : 60;

+     $AxisAlpha		= isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 50;

+     $AxisRotation      = isset($Format["AxisRotation"]) ? $Format["AxisRotation"] : 0;

+     $DrawTicks		= isset($Format["DrawTicks"]) ? $Format["DrawTicks"] : TRUE;

+     $TicksLength	= isset($Format["TicksLength"]) ? $Format["TicksLength"] : 2;

+     $DrawAxisValues	= isset($Format["DrawAxisValues"]) ? $Format["DrawAxisValues"] : TRUE;

+     $AxisBoxRounded	= isset($Format["AxisBoxRounded"]) ? $Format["AxisBoxRounded"] : TRUE;

+     $AxisFontName	= isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName;

+     $AxisFontSize	= isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize;

+     $DrawBackground	= isset($Format["DrawBackground"]) ? $Format["DrawBackground"] : TRUE;

+     $BackgroundR	= isset($Format["BackgroundR"]) ? $Format["BackgroundR"] : 255;

+     $BackgroundG	= isset($Format["BackgroundG"]) ? $Format["BackgroundG"] : 255;

+     $BackgroundB	= isset($Format["BackgroundB"]) ? $Format["BackgroundB"] : 255;

+     $BackgroundAlpha	= isset($Format["BackgroundAlpha"]) ? $Format["BackgroundAlpha"] : 50;

+     $BackgroundGradient= isset($Format["BackgroundGradient"]) ? $Format["BackgroundGradient"] : NULL;

+     $Layout		= isset($Format["Layout"]) ? $Format["Layout"] : RADAR_LAYOUT_STAR;

+     $SegmentHeight	= isset($Format["SegmentHeight"]) ? $Format["SegmentHeight"] : SEGMENT_HEIGHT_AUTO;

+     $Segments		= isset($Format["Segments"]) ? $Format["Segments"] : 4;

+     $WriteLabels	= isset($Format["WriteLabels"]) ? $Format["WriteLabels"] : TRUE;

+     $SkipLabels	= isset($Format["SkipLabels"]) ? $Format["SkipLabels"] : 1;

+     $LabelMiddle	= isset($Format["LabelMiddle"]) ? $Format["LabelMiddle"] : FALSE;

+     $LabelsBackground	= isset($Format["LabelsBackground"]) ? $Format["LabelsBackground"] : TRUE;

+     $LabelsBGR		= isset($Format["LabelsBGR"]) ? $Format["LabelsBGR"] : 255;

+     $LabelsBGG		= isset($Format["LabelsBGR"]) ? $Format["LabelsBGG"] : 255;

+     $LabelsBGB		= isset($Format["LabelsBGR"]) ? $Format["LabelsBGB"] : 255;

+     $LabelsBGAlpha	= isset($Format["LabelsBGAlpha"]) ? $Format["LabelsBGAlpha"] : 50;

+     $LabelPos		= isset($Format["LabelPos"]) ? $Format["LabelPos"] : RADAR_LABELS_ROTATED;

+     $LabelPadding	= isset($Format["LabelPadding"]) ? $Format["LabelPadding"] : 4;

+     $DrawPoints	= isset($Format["DrawPoints"]) ? $Format["DrawPoints"] : TRUE;

+     $PointRadius	= isset($Format["PointRadius"]) ? $Format["PointRadius"] : 4;

+     $PointSurrounding	= isset($Format["PointRadius"]) ? $Format["PointRadius"] : -30;

+     $DrawLines		= isset($Format["DrawLines"]) ? $Format["DrawLines"] : TRUE;

+     $LineLoopStart	= isset($Format["LineLoopStart"]) ? $Format["LineLoopStart"] : TRUE;

+     $DrawPoly		= isset($Format["DrawPoly"]) ? $Format["DrawPoly"] : FALSE;

+     $PolyAlpha		= isset($Format["PolyAlpha"]) ? $Format["PolyAlpha"] : 40;

+     $FontSize		= $Object->FontSize;

+     $X1		= $Object->GraphAreaX1;

+     $Y1		= $Object->GraphAreaY1;

+     $X2		= $Object->GraphAreaX2;

+     $Y2		= $Object->GraphAreaY2;

+

+     // if ( $AxisBoxRounded ) { $DrawAxisValues = TRUE; }

+

+     /* Cancel default tick length if ticks not enabled */

+     if ( $DrawTicks == FALSE ) { $TicksLength = 0; }

+

+     /* Data Processing */

+     $Data    = $Values->getData();

+     $Palette = $Values->getPalette();

+

+     /* Catch the number of required axis */

+     $LabelSerie = $Data["Abscissa"];

+     if ( $LabelSerie != "" )

+      { $Points = count($Data["Series"][$LabelSerie]["Data"]); }

+     else

+      {

+       $Points = 0;

+       foreach($Data["Series"] as $SerieName => $DataArray)

+        { if ( count($DataArray["Data"]) > $Points ) { $Points = count($DataArray["Data"]); } }

+      }

+

+     /* Draw the axis */

+     $CenterX = ($X2-$X1)/2 + $X1;

+     $CenterY = ($Y2-$Y1)/2 + $Y1;

+

+     $EdgeHeight = min(($X2-$X1)/2,($Y2-$Y1)/2);

+     if ( $WriteLabels )

+      $EdgeHeight = $EdgeHeight - $FontSize - $LabelPadding - $TicksLength;

+

+     /* Determine the scale if set to automatic */

+     if ( $SegmentHeight == SEGMENT_HEIGHT_AUTO)

+      {

+       $Max = 0;

+       foreach($Data["Series"] as $SerieName => $DataArray)

+        {

+         if ( $SerieName != $LabelSerie )

+          {

+           if ( max($DataArray["Data"]) > $Max ) { $Max = max($DataArray["Data"]); }

+          }

+        }

+       $MaxSegments = $EdgeHeight/20;

+       $Scale = $Object->computeScale(0,$Max,$MaxSegments,array(1,2,5));

+

+       $Segments      = $Scale["Rows"];

+       $SegmentHeight = $Scale["RowHeight"];

+      }

+

+     if ( $LabelMiddle && $SkipLabels == 1 )

+      { $Axisoffset = (360/$Points)/2; }

+     elseif ( $LabelMiddle && $SkipLabels != 1 )

+      { $Axisoffset = (360/($Points/$SkipLabels))/2; }

+     elseif ( !$LabelMiddle )

+      { $Axisoffset = 0; }

+

+     /* Background processing */

+     if ( $DrawBackground )

+      {

+       $RestoreShadow = $Object->Shadow;

+       $Object->Shadow = FALSE;

+

+       if ($BackgroundGradient == NULL)

+        {

+         if ( $Layout == RADAR_LAYOUT_STAR )

+          {

+           $Color      = array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha);

+           $PointArray = "";

+           for($i=0;$i<=360;$i=$i+(360/$Points))

+            {

+             $PointArray[] = cos(deg2rad($i+$AxisRotation)) * $EdgeHeight + $CenterX;

+             $PointArray[] = sin(deg2rad($i+$AxisRotation)) * $EdgeHeight + $CenterY;

+            }

+           $Object->drawPolygon($PointArray,$Color);

+          }

+         elseif ( $Layout == RADAR_LAYOUT_CIRCLE )

+          {

+           $Color = array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha);

+           $Object->drawFilledCircle($CenterX,$CenterY,$EdgeHeight,$Color);

+          }

+        }

+       else

+        {

+         $GradientROffset	= ($BackgroundGradient["EndR"] - $BackgroundGradient["StartR"]) / $Segments;

+         $GradientGOffset	= ($BackgroundGradient["EndG"] - $BackgroundGradient["StartG"]) / $Segments;

+         $GradientBOffset	= ($BackgroundGradient["EndB"] - $BackgroundGradient["StartB"]) / $Segments;

+         $GradientAlphaOffset	= ($BackgroundGradient["EndAlpha"] - $BackgroundGradient["StartAlpha"]) / $Segments;

+

+         if ( $Layout == RADAR_LAYOUT_STAR )

+          {

+           for($j=$Segments;$j>=1;$j--)

+            {

+             $Color      = array("R"=>$BackgroundGradient["StartR"]+$GradientROffset*$j,"G"=>$BackgroundGradient["StartG"]+$GradientGOffset*$j,"B"=>$BackgroundGradient["StartB"]+$GradientBOffset*$j,"Alpha"=>$BackgroundGradient["StartAlpha"]+$GradientAlphaOffset*$j);

+             $PointArray = "";

+

+             for($i=0;$i<=360;$i=$i+(360/$Points))

+              {

+               $PointArray[] = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX;

+               $PointArray[] = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY;

+              }

+             $Object->drawPolygon($PointArray,$Color);

+            }

+          }

+         elseif ( $Layout == RADAR_LAYOUT_CIRCLE )

+          {

+           for($j=$Segments;$j>=1;$j--)

+            {

+             $Color = array("R"=>$BackgroundGradient["StartR"]+$GradientROffset*$j,"G"=>$BackgroundGradient["StartG"]+$GradientGOffset*$j,"B"=>$BackgroundGradient["StartB"]+$GradientBOffset*$j,"Alpha"=>$BackgroundGradient["StartAlpha"]+$GradientAlphaOffset*$j);

+             $Object->drawFilledCircle($CenterX,$CenterY,($EdgeHeight/$Segments)*$j,$Color);

+            }

+          }

+        }

+       $Object->Shadow = $RestoreShadow;

+      }

+

+     /* Axis to axis lines */

+     $Color = array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha);

+     $ColorDotted = array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha*.8, "Ticks"=>2);

+     if ( $Layout == RADAR_LAYOUT_STAR )

+      {

+       for($j=1;$j<=$Segments;$j++)

+        {

+         for($i=0;$i<360;$i=$i+(360/$Points))

+          {

+           $EdgeX1 = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX;

+           $EdgeY1 = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY;

+           $EdgeX2 = cos(deg2rad($i+$AxisRotation+(360/$Points))) * ($EdgeHeight/$Segments)*$j + $CenterX;

+           $EdgeY2 = sin(deg2rad($i+$AxisRotation+(360/$Points))) * ($EdgeHeight/$Segments)*$j + $CenterY;

+

+           $Object->drawLine($EdgeX1,$EdgeY1,$EdgeX2,$EdgeY2,$Color);

+          }

+        }

+      }

+     elseif ( $Layout == RADAR_LAYOUT_CIRCLE )

+      {

+       for($j=1;$j<=$Segments;$j++)

+        {

+         $Radius = ($EdgeHeight/$Segments)*$j;

+         $Object->drawCircle($CenterX,$CenterY,$Radius,$Radius,$Color);

+        }

+      }

+

+     if ( $DrawAxisValues )

+      {

+       if ( $LabelsBackground )

+        $Options = array("DrawBox"=>TRUE, "Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"BoxR"=>$LabelsBGR,"BoxG"=>$LabelsBGG,"BoxB"=>$LabelsBGB,"BoxAlpha"=>$LabelsBGAlpha);

+       else

+        $Options = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE);

+

+       if ( $AxisBoxRounded ) { $Options["BoxRounded"] = TRUE; }

+

+       $Options["FontName"] = $AxisFontName;

+       $Options["FontSize"] = $AxisFontSize;

+

+       $Angle  = 360 / ($Points*2);

+       for($j=1;$j<=$Segments;$j++)

+        {

+         $Label  = $j * $SegmentHeight;

+

+         if ( $Layout == RADAR_LAYOUT_CIRCLE )

+          {

+           $EdgeX1 = cos(deg2rad($Angle+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX;

+           $EdgeY1 = sin(deg2rad($Angle+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY;

+          }

+         elseif ( $Layout == RADAR_LAYOUT_STAR )

+          {

+           $EdgeX1 = cos(deg2rad($AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX;

+           $EdgeY1 = sin(deg2rad($AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY;

+           $EdgeX2 = cos(deg2rad((360 / $Points) + $AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX;

+           $EdgeY2 = sin(deg2rad((360 / $Points) + $AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY;

+

+           $EdgeX1 = ($EdgeX2 - $EdgeX1)/2 + $EdgeX1;

+           $EdgeY1 = ($EdgeY2 - $EdgeY1)/2 + $EdgeY1;

+          }

+

+         $Object->drawText($EdgeX1,$EdgeY1,$Label,$Options);

+        }

+      }

+

+     /* Axis lines */

+     $ID = 0;

+     for($i=0;$i<360;$i=$i+(360/$Points))

+      {

+       $EdgeX = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$TicksLength) + $CenterX;

+       $EdgeY = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$TicksLength) + $CenterY;

+

+       if ($ID % $SkipLabels == 0)

+        { $Object->drawLine($CenterX,$CenterY,$EdgeX,$EdgeY,$Color); }

+       else

+        { $Object->drawLine($CenterX,$CenterY,$EdgeX,$EdgeY,$ColorDotted); }

+

+       if ( $WriteLabels )

+        {

+         $LabelX = cos(deg2rad($i+$AxisRotation+$Axisoffset)) * ($EdgeHeight+$LabelPadding+$TicksLength) + $CenterX;

+         $LabelY = sin(deg2rad($i+$AxisRotation+$Axisoffset)) * ($EdgeHeight+$LabelPadding+$TicksLength) + $CenterY;

+

+         if ( $LabelSerie != "" )

+          { $Label = isset($Data["Series"][$LabelSerie]["Data"][$ID]) ? $Data["Series"][$LabelSerie]["Data"][$ID] : ""; }

+         else

+          $Label = $ID;

+

+         if ($ID % $SkipLabels == 0)

+          {

+           if ( $LabelPos == RADAR_LABELS_ROTATED )

+            $Object->drawText($LabelX,$LabelY,$Label,array("Angle"=>(360-($i+$AxisRotation+$Axisoffset))-90,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+           else

+            {

+             if ( (floor($LabelX) == floor($CenterX)) && (floor($LabelY) <  floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); }

+             if ( (floor($LabelX) >  floor($CenterX)) && (floor($LabelY) <  floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMLEFT)); }

+             if ( (floor($LabelX) >  floor($CenterX)) && (floor($LabelY) == floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_MIDDLELEFT)); }

+             if ( (floor($LabelX) >  floor($CenterX)) && (floor($LabelY) >  floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPLEFT)); }

+             if ( (floor($LabelX) <  floor($CenterX)) && (floor($LabelY) <  floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMRIGHT)); }

+             if ( (floor($LabelX) <  floor($CenterX)) && (floor($LabelY) == floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); }

+             if ( (floor($LabelX) <  floor($CenterX)) && (floor($LabelY) >  floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPRIGHT)); }

+             if ( (floor($LabelX) == floor($CenterX)) && (floor($LabelY) >  floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPMIDDLE)); }

+            }

+          }

+        }

+       $ID++;

+      }

+

+     /* Compute the plots position */

+     $ID = 0; $Plot = "";

+     foreach($Data["Series"] as $SerieName => $Data)

+      {

+       if ( $SerieName != $LabelSerie )

+        {

+         $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding);

+         foreach($Data["Data"] as $Key => $Value)

+          {

+           $Angle  = (360/$Points) * $Key;

+           $Length = ($EdgeHeight/($Segments*$SegmentHeight))*$Value;

+

+           $X = cos(deg2rad($Angle+$AxisRotation)) * $Length  + $CenterX;

+           $Y = sin(deg2rad($Angle+$AxisRotation)) * $Length  + $CenterY;

+

+           $Plot[$ID][] = array($X,$Y);

+          }

+         $ID++;

+        }

+      }

+

+     /* Draw all that stuff! */

+     foreach($Plot as $ID => $Points)

+      {

+       $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding);

+

+       /* Draw the polygons */

+       if ( $DrawPoly )

+        {

+         if ($PolyAlpha != NULL)

+          $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$PolyAlpha,"Surrounding"=>$PointSurrounding);

+

+         $PointsArray = "";

+         for($i=0; $i<count($Points);$i++) 

+          { $PointsArray[] = $Points[$i][0]; $PointsArray[] = $Points[$i][1]; }

+         $Object->drawPolygon($PointsArray,$Color);

+        }

+

+       $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding);

+

+       /* Draw the lines & points */

+       for($i=0; $i<count($Points);$i++) 

+        {

+         if ( $DrawLines && $i < count($Points)-1)

+          $Object->drawLine($Points[$i][0],$Points[$i][1],$Points[$i+1][0],$Points[$i+1][1],$Color);

+

+         if ( $DrawPoints )

+          $Object->drawFilledCircle($Points[$i][0],$Points[$i][1],$PointRadius,$Color);

+        }

+

+       /* Loop to the starting points if asked */

+       if ( $LineLoopStart && $DrawLines )

+        $Object->drawLine($Points[$i-1][0],$Points[$i-1][1],$Points[0][0],$Points[0][1],$Color);

+

+      }

+    }

+

+

+

+   /* Draw a radar chart */

+   function drawPolar($Object,$Values,$Format="")

+    {

+     $this->pChartObject = $Object;

+

+     $AxisR		= isset($Format["AxisR"]) ? $Format["AxisR"] : 60;

+     $AxisG		= isset($Format["AxisG"]) ? $Format["AxisG"] : 60;

+     $AxisB		= isset($Format["AxisB"]) ? $Format["AxisB"] : 60;

+     $AxisAlpha		= isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 50;

+     $AxisRotation      = isset($Format["AxisRotation"]) ? $Format["AxisRotation"] : -90;

+     $DrawTicks		= isset($Format["DrawTicks"]) ? $Format["DrawTicks"] : TRUE;

+     $TicksLength	= isset($Format["TicksLength"]) ? $Format["TicksLength"] : 2;

+     $DrawAxisValues	= isset($Format["DrawAxisValues"]) ? $Format["DrawAxisValues"] : TRUE;

+     $AxisBoxRounded	= isset($Format["AxisBoxRounded"]) ? $Format["AxisBoxRounded"] : TRUE;

+     $AxisFontName	= isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName;

+     $AxisFontSize	= isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize;

+     $DrawBackground	= isset($Format["DrawBackground"]) ? $Format["DrawBackground"] : TRUE;

+     $BackgroundR	= isset($Format["BackgroundR"]) ? $Format["BackgroundR"] : 255;

+     $BackgroundG	= isset($Format["BackgroundG"]) ? $Format["BackgroundG"] : 255;

+     $BackgroundB	= isset($Format["BackgroundB"]) ? $Format["BackgroundB"] : 255;

+     $BackgroundAlpha	= isset($Format["BackgroundAlpha"]) ? $Format["BackgroundAlpha"] : 50;

+     $BackgroundGradient= isset($Format["BackgroundGradient"]) ? $Format["BackgroundGradient"] : NULL;

+     $AxisSteps		= isset($Format["AxisSteps"]) ? $Format["AxisSteps"] : 20;

+     $SegmentHeight	= isset($Format["SegmentHeight"]) ? $Format["SegmentHeight"] : SEGMENT_HEIGHT_AUTO;

+     $Segments		= isset($Format["Segments"]) ? $Format["Segments"] : 4;

+     $WriteLabels	= isset($Format["WriteLabels"]) ? $Format["WriteLabels"] : TRUE;

+     $LabelsBackground	= isset($Format["LabelsBackground"]) ? $Format["LabelsBackground"] : TRUE;

+     $LabelsBGR		= isset($Format["LabelsBGR"]) ? $Format["LabelsBGR"] : 255;

+     $LabelsBGG		= isset($Format["LabelsBGR"]) ? $Format["LabelsBGG"] : 255;

+     $LabelsBGB		= isset($Format["LabelsBGR"]) ? $Format["LabelsBGB"] : 255;

+     $LabelsBGAlpha	= isset($Format["LabelsBGAlpha"]) ? $Format["LabelsBGAlpha"] : 50;

+     $LabelPos		= isset($Format["LabelPos"]) ? $Format["LabelPos"] : RADAR_LABELS_ROTATED;

+     $LabelPadding	= isset($Format["LabelPadding"]) ? $Format["LabelPadding"] : 4;

+     $DrawPoints	= isset($Format["DrawPoints"]) ? $Format["DrawPoints"] : TRUE;

+     $PointRadius	= isset($Format["PointRadius"]) ? $Format["PointRadius"] : 4;

+     $PointSurrounding	= isset($Format["PointRadius"]) ? $Format["PointRadius"] : -30;

+     $DrawLines		= isset($Format["DrawLines"]) ? $Format["DrawLines"] : TRUE;

+     $LineLoopStart	= isset($Format["LineLoopStart"]) ? $Format["LineLoopStart"] : FALSE;

+     $DrawPoly		= isset($Format["DrawPoly"]) ? $Format["DrawPoly"] : FALSE;

+     $PolyAlpha		= isset($Format["PolyAlpha"]) ? $Format["PolyAlpha"] : NULL;

+     $FontSize		= $Object->FontSize;

+     $X1		= $Object->GraphAreaX1;

+     $Y1		= $Object->GraphAreaY1;

+     $X2		= $Object->GraphAreaX2;

+     $Y2		= $Object->GraphAreaY2;

+

+     if ( $AxisBoxRounded ) { $DrawAxisValues = TRUE; }

+

+     /* Cancel default tick length if ticks not enabled */

+     if ( $DrawTicks == FALSE ) { $TicksLength = 0; }

+

+     /* Data Processing */

+     $Data    = $Values->getData();

+     $Palette = $Values->getPalette();

+

+     /* Catch the number of required axis */

+     $LabelSerie = $Data["Abscissa"];

+     if ( $LabelSerie != "" )

+      { $Points = count($Data["Series"][$LabelSerie]["Data"]); }

+     else

+      {

+       $Points = 0;

+       foreach($Data["Series"] as $SerieName => $DataArray)

+        { if ( count($DataArray["Data"]) > $Points ) { $Points = count($DataArray["Data"]); } }

+      }

+

+     /* Draw the axis */

+     $CenterX = ($X2-$X1)/2 + $X1;

+     $CenterY = ($Y2-$Y1)/2 + $Y1;

+

+     $EdgeHeight = min(($X2-$X1)/2,($Y2-$Y1)/2);

+     if ( $WriteLabels )

+      $EdgeHeight = $EdgeHeight - $FontSize - $LabelPadding - $TicksLength;

+

+     /* Determine the scale if set to automatic */

+     if ( $SegmentHeight == SEGMENT_HEIGHT_AUTO)

+      {

+       $Max = 0;

+       foreach($Data["Series"] as $SerieName => $DataArray)

+        {

+         if ( $SerieName != $LabelSerie )

+          {

+           if ( max($DataArray["Data"]) > $Max ) { $Max = max($DataArray["Data"]); }

+          }

+        }

+       $MaxSegments = $EdgeHeight/20;

+       $Scale = $Object->computeScale(0,$Max,$MaxSegments,array(1,2,5));

+

+       $Segments      = $Scale["Rows"];

+       $SegmentHeight = $Scale["RowHeight"];

+      }

+

+

+     /* Background processing */

+     if ( $DrawBackground )

+      {

+       $RestoreShadow = $Object->Shadow;

+       $Object->Shadow = FALSE;

+

+       if ($BackgroundGradient == NULL)

+        {

+         $Color = array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha);

+         $Object->drawFilledCircle($CenterX,$CenterY,$EdgeHeight,$Color);

+        }

+       else

+        {

+         $GradientROffset	= ($BackgroundGradient["EndR"] - $BackgroundGradient["StartR"]) / $Segments;

+         $GradientGOffset	= ($BackgroundGradient["EndG"] - $BackgroundGradient["StartG"]) / $Segments;

+         $GradientBOffset	= ($BackgroundGradient["EndB"] - $BackgroundGradient["StartB"]) / $Segments;

+         $GradientAlphaOffset	= ($BackgroundGradient["EndAlpha"] - $BackgroundGradient["StartAlpha"]) / $Segments;

+

+         for($j=$Segments;$j>=1;$j--)

+          {

+           $Color      = array("R"=>$BackgroundGradient["StartR"]+$GradientROffset*$j,"G"=>$BackgroundGradient["StartG"]+$GradientGOffset*$j,"B"=>$BackgroundGradient["StartB"]+$GradientBOffset*$j,"Alpha"=>$BackgroundGradient["StartAlpha"]+$GradientAlphaOffset*$j);

+           $Object->drawFilledCircle($CenterX,$CenterY,($EdgeHeight/$Segments)*$j,$Color);

+          }

+        }

+       $Object->Shadow = $RestoreShadow;

+      }

+

+     /* Axis to axis lines */

+     $Color = array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha);

+     for($j=1;$j<=$Segments;$j++)

+      {

+       $Radius = ($EdgeHeight/$Segments)*$j;

+       $Object->drawCircle($CenterX,$CenterY,$Radius,$Radius,$Color);

+      }

+

+     if ( $DrawAxisValues )

+      {

+       if ( $LabelsBackground )

+        $Options = array("DrawBox"=>TRUE, "Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"BoxR"=>$LabelsBGR,"BoxG"=>$LabelsBGG,"BoxB"=>$LabelsBGB,"BoxAlpha"=>$LabelsBGAlpha);

+       else

+        $Options = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE);

+

+       if ( $AxisBoxRounded ) { $Options["BoxRounded"] = TRUE; }

+

+       $Options["FontName"] = $AxisFontName;

+       $Options["FontSize"] = $AxisFontSize;

+

+       $Angle  = 360 / ($Points*2);

+       for($j=1;$j<=$Segments;$j++)

+        {

+         $EdgeX1 = cos(deg2rad($Angle+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX;

+         $EdgeY1 = sin(deg2rad($Angle+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY;

+         $Label  = $j*$SegmentHeight;

+

+         $Object->drawText($EdgeX1,$EdgeY1,$Label,$Options);

+        }

+      }

+

+     /* Axis lines */

+     $ID = 0;

+     for($i=0;$i<=359;$i=$i+$AxisSteps)

+      {

+       $EdgeX = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$TicksLength) + $CenterX;

+       $EdgeY = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$TicksLength) + $CenterY;

+

+       $Object->drawLine($CenterX,$CenterY,$EdgeX,$EdgeY,$Color);

+

+       if ( $WriteLabels )

+        {

+         $LabelX = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$LabelPadding+$TicksLength) + $CenterX;

+         $LabelY = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$LabelPadding+$TicksLength) + $CenterY;


+

+         if ( $LabelPos == RADAR_LABELS_ROTATED )

+          $Object->drawText($LabelX,$LabelY,$Label,array("Angle"=>(360-$i),"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+         else

+          {

+           if ( (floor($LabelX) == floor($CenterX)) && (floor($LabelY) <  floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); }

+           if ( (floor($LabelX) >  floor($CenterX)) && (floor($LabelY) <  floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMLEFT)); }

+           if ( (floor($LabelX) >  floor($CenterX)) && (floor($LabelY) == floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_MIDDLELEFT)); }

+           if ( (floor($LabelX) >  floor($CenterX)) && (floor($LabelY) >  floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPLEFT)); }

+           if ( (floor($LabelX) <  floor($CenterX)) && (floor($LabelY) <  floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMRIGHT)); }

+           if ( (floor($LabelX) <  floor($CenterX)) && (floor($LabelY) == floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); }

+           if ( (floor($LabelX) <  floor($CenterX)) && (floor($LabelY) >  floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPRIGHT)); }

+           if ( (floor($LabelX) == floor($CenterX)) && (floor($LabelY) >  floor($CenterY)) )	{ $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPMIDDLE)); }

+          }

+        }

+       $ID++;

+      }

+

+     /* Compute the plots position */

+     $ID = 0; $Plot = "";

+     foreach($Data["Series"] as $SerieName => $DataSet)

+      {

+       if ( $SerieName != $LabelSerie )

+        {

+         $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding);

+         foreach($DataSet["Data"] as $Key => $Value)

+          {

+           $Angle  = $Data["Series"][$LabelSerie]["Data"][$Key];

+           $Length = ($EdgeHeight/($Segments*$SegmentHeight))*$Value;

+

+           $X = cos(deg2rad($Angle+$AxisRotation)) * $Length  + $CenterX;

+           $Y = sin(deg2rad($Angle+$AxisRotation)) * $Length  + $CenterY;

+

+           $Plot[$ID][] = array($X,$Y);

+          }

+         $ID++;

+        }

+      }

+

+     /* Draw all that stuff! */

+     foreach($Plot as $ID => $Points)

+      {

+       $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding);

+

+       /* Draw the polygons */

+       if ( $DrawPoly )

+        {

+         if ($PolyAlpha != NULL)

+          $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$PolyAlpha,"Surrounding"=>$PointSurrounding);

+

+         $PointsArray = "";

+         for($i=0; $i<count($Points);$i++) 

+          { $PointsArray[] = $Points[$i][0]; $PointsArray[] = $Points[$i][1]; }

+

+         $Object->drawPolygon($PointsArray,$Color);

+        }

+

+       $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding);

+       

+       /* Draw the lines & points */

+       for($i=0; $i<count($Points);$i++) 

+        {

+         if ( $DrawLines && $i < count($Points)-1)

+          $Object->drawLine($Points[$i][0],$Points[$i][1],$Points[$i+1][0],$Points[$i+1][1],$Color);

+

+         if ( $DrawPoints )

+          $Object->drawFilledCircle($Points[$i][0],$Points[$i][1],$PointRadius,$Color);

+        }

+

+       /* Loop to the starting points if asked */

+       if ( $LineLoopStart && $DrawLines )

+        $Object->drawLine($Points[$i-1][0],$Points[$i-1][1],$Points[0][0],$Points[0][1],$Color);

+      }

+    }

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/class/pScatter.class.php
@@ -1,1 +1,828 @@
-
+<?php

+ /*

+     pScatter - class to draw scatter charts

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ define("SCATTER_MISSING_X_SERIE"	, 190001);

+ define("SCATTER_MISSING_Y_SERIE"	, 190002);

+

+ /* pScatter class definition */

+ class pScatter

+  {

+   var $pChartObject;

+   var $pDataObject;

+

+   /* Class creator */

+   function pScatter($pChartObject,$pDataObject)

+    {

+     $this->pChartObject = $pChartObject;

+     $this->pDataObject  = $pDataObject;

+    }

+

+   /* Prepare the scale */

+   function drawScatterScale($Format="")

+    {

+     $Mode		= isset($Format["Mode"]) ? $Format["Mode"] : SCALE_MODE_FLOATING;

+     $Floating		= isset($Format["Floating"]) ? $Format["Floating"] : FALSE;

+     $XLabelsRotation	= isset($Format["XLabelsRotation"]) ? $Format["XLabelsRotation"] : 90;

+     $MinDivHeight	= isset($Format["MinDivHeight"]) ? $Format["MinDivHeight"] : 20;

+     $Factors		= isset($Format["Factors"]) ? $Format["Factors"] : array(1,2,5);

+     $ManualScale	= isset($Format["ManualScale"]) ? $Format["ManualScale"] : array("0"=>array("Min"=>-100,"Max"=>100));

+     $XMargin		= isset($Format["XMargin"]) ? $Format["XMargin"] : 0;

+     $YMargin		= isset($Format["YMargin"]) ? $Format["YMargin"] : 0;

+     $ScaleSpacing	= isset($Format["ScaleSpacing"]) ? $Format["ScaleSpacing"] : 15;

+     $InnerTickWidth	= isset($Format["InnerTickWidth"]) ? $Format["InnerTickWidth"] : 2;

+     $OuterTickWidth	= isset($Format["OuterTickWidth"]) ? $Format["OuterTickWidth"] : 2;

+     $DrawXLines	= isset($Format["DrawXLines"]) ? $Format["DrawXLines"] : ALL;

+     $DrawYLines	= isset($Format["DrawYLines"]) ? $Format["DrawYLines"] : ALL;

+     $GridTicks		= isset($Format["GridTicks"]) ? $Format["GridTicks"] : 4;

+     $GridR		= isset($Format["GridR"]) ? $Format["GridR"] : 255;

+     $GridG		= isset($Format["GridG"]) ? $Format["GridG"] : 255;

+     $GridB		= isset($Format["GridB"]) ? $Format["GridB"] : 255;

+     $GridAlpha		= isset($Format["GridAlpha"]) ? $Format["GridAlpha"] : 40;

+     $AxisRo		= isset($Format["AxisR"]) ? $Format["AxisR"] : 0;

+     $AxisGo		= isset($Format["AxisG"]) ? $Format["AxisG"] : 0;

+     $AxisBo		= isset($Format["AxisB"]) ? $Format["AxisB"] : 0;

+     $AxisAlpha		= isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 100;

+     $TickRo		= isset($Format["TickR"]) ? $Format["TickR"] : 0;

+     $TickGo		= isset($Format["TickG"]) ? $Format["TickG"] : 0;

+     $TickBo		= isset($Format["TickB"]) ? $Format["TickB"] : 0;

+     $TickAlpha		= isset($Format["TickAlpha"]) ? $Format["TickAlpha"] : 100;

+     $DrawSubTicks	= isset($Format["DrawSubTicks"]) ? $Format["DrawSubTicks"] : FALSE;

+     $InnerSubTickWidth	= isset($Format["InnerSubTickWidth"]) ? $Format["InnerSubTickWidth"] : 0;

+     $OuterSubTickWidth	= isset($Format["OuterSubTickWidth"]) ? $Format["OuterSubTickWidth"] : 2;

+     $SubTickR		= isset($Format["SubTickR"]) ? $Format["SubTickR"] : 255;

+     $SubTickG		= isset($Format["SubTickG"]) ? $Format["SubTickG"] : 0;

+     $SubTickB		= isset($Format["SubTickB"]) ? $Format["SubTickB"] : 0;

+     $SubTickAlpha	= isset($Format["SubTickAlpha"]) ? $Format["SubTickAlpha"] : 100;

+     $XReleasePercent	= isset($Format["XReleasePercent"]) ? $Format["XReleasePercent"] : 1;

+     $DrawArrows	= isset($Format["DrawArrows"]) ? $Format["DrawArrows"] : FALSE;

+     $ArrowSize         = isset($Format["ArrowSize"]) ? $Format["ArrowSize"] : 8;

+     $CycleBackground	= isset($Format["CycleBackground"]) ? $Format["CycleBackground"] : FALSE;

+     $BackgroundR1	= isset($Format["BackgroundR1"]) ? $Format["BackgroundR1"] : 255;

+     $BackgroundG1	= isset($Format["BackgroundG1"]) ? $Format["BackgroundG1"] : 255;

+     $BackgroundB1	= isset($Format["BackgroundB1"]) ? $Format["BackgroundB1"] : 255;

+     $BackgroundAlpha1	= isset($Format["BackgroundAlpha1"]) ? $Format["BackgroundAlpha1"] : 10;

+     $BackgroundR2	= isset($Format["BackgroundR2"]) ? $Format["BackgroundR2"] : 230;

+     $BackgroundG2	= isset($Format["BackgroundG2"]) ? $Format["BackgroundG2"] : 230;

+     $BackgroundB2	= isset($Format["BackgroundB2"]) ? $Format["BackgroundB2"] : 230;

+     $BackgroundAlpha2	= isset($Format["BackgroundAlpha2"]) ? $Format["BackgroundAlpha2"] : 10;

+

+     /* Check if we have at least both one X and Y axis */

+     $GotXAxis = FALSE; $GotYAxis = FALSE;

+     foreach($this->pDataObject->Data["Axis"] as $AxisID => $AxisSettings)

+      {

+       if ( $AxisSettings["Identity"] == AXIS_X ) { $GotXAxis = TRUE; }

+       if ( $AxisSettings["Identity"] == AXIS_Y ) { $GotYAxis = TRUE; }

+      }

+     if ( !$GotXAxis ) { return(SCATTER_MISSING_X_SERIE); }

+     if ( !$GotYAxis ) { return(SCATTER_MISSING_Y_SERIE); }

+

+     /* Skip a NOTICE event in case of an empty array */

+     if ( $DrawYLines == NONE ) { $DrawYLines = array("zarma"=>"31"); }

+

+     $Data = $this->pDataObject->getData();

+

+     foreach($Data["Axis"] as $AxisID => $AxisSettings)

+      {

+       if ( $AxisSettings["Identity"] == AXIS_X)

+        { $Width = $this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1 - $XMargin*2; }

+       else

+        { $Width = $this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1 - $YMargin*2; }

+

+       $AxisMin = ABSOLUTE_MAX; $AxisMax = OUT_OF_SIGHT;

+       if ( $Mode == SCALE_MODE_FLOATING )

+        {

+         foreach($Data["Series"] as $SerieID => $SerieParameter)

+          {

+           if ( $SerieParameter["Axis"] == $AxisID && $Data["Series"][$SerieID]["isDrawable"] )

+            {

+             $AxisMax = max($AxisMax,$Data["Series"][$SerieID]["Max"]);

+             $AxisMin = min($AxisMin,$Data["Series"][$SerieID]["Min"]);

+            }

+          }

+         $AutoMargin = (($AxisMax-$AxisMin)/100)*$XReleasePercent;

+

+         $Data["Axis"][$AxisID]["Min"] = $AxisMin-$AutoMargin; $Data["Axis"][$AxisID]["Max"] = $AxisMax+$AutoMargin;

+        }

+       elseif ( $Mode == SCALE_MODE_MANUAL )

+        {

+         if ( isset($ManualScale[$AxisID]["Min"]) && isset($ManualScale[$AxisID]["Max"]) )

+          {

+           $Data["Axis"][$AxisID]["Min"] = $ManualScale[$AxisID]["Min"];

+           $Data["Axis"][$AxisID]["Max"] = $ManualScale[$AxisID]["Max"];

+          }

+         else

+          { echo "Manual scale boundaries not set."; exit(); }

+        }

+

+       /* Full manual scale */

+       if ( isset($ManualScale[$AxisID]["Rows"]) && isset($ManualScale[$AxisID]["RowHeight"]) )

+        $Scale = array("Rows"=>$ManualScale[$AxisID]["Rows"],"RowHeight"=>$ManualScale[$AxisID]["RowHeight"],"XMin"=>$ManualScale[$AxisID]["Min"],"XMax"=>$ManualScale[$AxisID]["Max"]);

+       else

+        {

+         $MaxDivs = floor($Width/$MinDivHeight);

+         $Scale   = $this->pChartObject->computeScale($Data["Axis"][$AxisID]["Min"],$Data["Axis"][$AxisID]["Max"],$MaxDivs,$Factors,$AxisID);

+        }

+

+       $Data["Axis"][$AxisID]["Margin"]    = $AxisSettings["Identity"] == AXIS_X ? $XMargin : $YMargin;

+       $Data["Axis"][$AxisID]["ScaleMin"]  = $Scale["XMin"];

+       $Data["Axis"][$AxisID]["ScaleMax"]  = $Scale["XMax"];

+       $Data["Axis"][$AxisID]["Rows"]      = $Scale["Rows"];

+       $Data["Axis"][$AxisID]["RowHeight"] = $Scale["RowHeight"];

+

+       if ( isset($Scale["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = $Scale["Format"]; }

+

+       if ( !isset($Data["Axis"][$AxisID]["Display"]) ) { $Data["Axis"][$AxisID]["Display"] = NULL; }

+       if ( !isset($Data["Axis"][$AxisID]["Format"]) )  { $Data["Axis"][$AxisID]["Format"] = NULL; }

+       if ( !isset($Data["Axis"][$AxisID]["Unit"]) )    { $Data["Axis"][$AxisID]["Unit"] = NULL; }

+      }

+

+     /* Get the default font color */

+     $FontColorRo = $this->pChartObject->FontColorR; $FontColorGo = $this->pChartObject->FontColorG; $FontColorBo = $this->pChartObject->FontColorB;

+

+     /* Set the original boundaries */

+     $AxisPos["L"] = $this->pChartObject->GraphAreaX1; $AxisPos["R"] = $this->pChartObject->GraphAreaX2; $AxisPos["T"] = $this->pChartObject->GraphAreaY1; $AxisPos["B"] = $this->pChartObject->GraphAreaY2;

+

+     foreach($Data["Axis"] as $AxisID => $AxisSettings)

+      {

+       if ( isset($AxisSettings["Color"]) )

+        {

+         $AxisR = $AxisSettings["Color"]["R"]; $AxisG = $AxisSettings["Color"]["G"]; $AxisB = $AxisSettings["Color"]["B"];

+         $TickR = $AxisSettings["Color"]["R"]; $TickG = $AxisSettings["Color"]["G"]; $TickB = $AxisSettings["Color"]["B"];

+         $this->pChartObject->setFontProperties(array("R"=>$AxisSettings["Color"]["R"],"G"=>$AxisSettings["Color"]["G"],"B"=>$AxisSettings["Color"]["B"]));

+        }

+       else

+        {

+         $AxisR = $AxisRo; $AxisG = $AxisGo; $AxisB = $AxisBo;

+         $TickR = $TickRo; $TickG = $TickGo; $TickB = $TickBo;

+         $this->pChartObject->setFontProperties(array("R"=>$FontColorRo,"G"=>$FontColorGo,"B"=>$FontColorBo));

+        }

+

+       $LastValue = "w00t"; $ID = 1;

+       if ( $AxisSettings["Identity"] == AXIS_X )

+        {

+         if ( $AxisSettings["Position"] == AXIS_POSITION_BOTTOM )

+          {

+           if ( $XLabelsRotation == 0 )				   { $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $LabelOffset = 2; }

+           if ( $XLabelsRotation > 0 && $XLabelsRotation < 190 )   { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $LabelOffset = 5; }

+           if ( $XLabelsRotation == 180 )			   { $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $LabelOffset = 5; }

+           if ( $XLabelsRotation > 180 && $XLabelsRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $LabelOffset = 2; }

+

+           if ( $Floating )

+            { $FloatingOffset = $YMargin; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$AxisSettings["Margin"],$AxisPos["B"],$this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+           else

+            { $FloatingOffset = 0; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1,$AxisPos["B"],$this->pChartObject->GraphAreaX2,$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+           if ( $DrawArrows ) { $this->pChartObject->drawArrow($this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["B"],$this->pChartObject->GraphAreaX2+($ArrowSize*2),$AxisPos["B"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+           $Width = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) - $AxisSettings["Margin"]*2;

+           $Step   = $Width / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MaxBottom = $AxisPos["B"];

+           $LastX  = NULL;

+           for($i=0;$i<=$AxisSettings["Rows"];$i++)

+            {

+             $XPos  = $this->pChartObject->GraphAreaX1 + $AxisSettings["Margin"] + $Step*$i;

+             $YPos  = $AxisPos["B"];

+             $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]);

+

+             if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }

+             if ( $LastX != NULL && $CycleBackground  && ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) )) { $this->pChartObject->drawFilledRectangle($LastX,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,$BGColor); }

+

+             if ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) ) { $this->pChartObject->drawLine($XPos,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+             if ( $DrawSubTicks && $i != $AxisSettings["Rows"] )

+              $this->pChartObject->drawLine($XPos+$SubTicksSize,$YPos-$InnerSubTickWidth,$XPos+$SubTicksSize,$YPos+$OuterSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));

+

+             $this->pChartObject->drawLine($XPos,$YPos-$InnerTickWidth,$XPos,$YPos+$OuterTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));

+             $Bounds    = $this->pChartObject->drawText($XPos,$YPos+$OuterTickWidth+$LabelOffset,$Value,array("Angle"=>$XLabelsRotation,"Align"=>$LabelAlign));

+             $TxtBottom = $YPos+2+$OuterTickWidth+2+($Bounds[0]["Y"]-$Bounds[2]["Y"]);

+             $MaxBottom = max($MaxBottom,$TxtBottom);

+

+             $LastX = $XPos;

+            }

+

+           if ( isset($AxisSettings["Name"]) )

+            {

+             $YPos   = $MaxBottom+2;

+             $XPos   = $this->pChartObject->GraphAreaX1+($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1)/2;

+             $Bounds = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_TOPMIDDLE));

+             $MaxBottom = $Bounds[0]["Y"];

+

+             $this->pDataObject->Data["GraphArea"]["Y2"] = $MaxBottom + $this->pChartObject->FontSize;

+            }

+

+           $AxisPos["B"] = $MaxBottom + $ScaleSpacing;

+          }

+         elseif ( $AxisSettings["Position"] == AXIS_POSITION_TOP )

+          {

+           if ( $XLabelsRotation == 0 )					{ $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $LabelOffset = 2; }

+           if ( $XLabelsRotation > 0 && $XLabelsRotation < 190 )	{ $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $LabelOffset = 2; }

+           if ( $XLabelsRotation == 180 )				{ $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $LabelOffset = 5; }

+           if ( $XLabelsRotation > 180 && $SLabelxRotation < 360 )	{ $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $LabelOffset = 5; }

+

+           if ( $Floating )

+            { $FloatingOffset = $YMargin; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$AxisSettings["Margin"],$AxisPos["T"],$this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+           else

+            { $FloatingOffset = 0; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1,$AxisPos["T"],$this->pChartObject->GraphAreaX2,$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+           if ( $DrawArrows ) { $this->pChartObject->drawArrow($this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["T"],$this->pChartObject->GraphAreaX2+($ArrowSize*2),$AxisPos["T"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+           $Width = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) - $AxisSettings["Margin"]*2;

+           $Step   = $Width / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MinTop = $AxisPos["T"];

+           $LastX  = NULL;

+           for($i=0;$i<=$AxisSettings["Rows"];$i++)

+            {

+             $XPos  = $this->pChartObject->GraphAreaX1 + $AxisSettings["Margin"] + $Step*$i;

+             $YPos  = $AxisPos["T"];

+             $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]);

+

+             if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }

+             if ( $LastX != NULL && $CycleBackground  && ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) )) { $this->pChartObject->drawFilledRectangle($LastX,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,$BGColor); }

+

+             if ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) ) { $this->pChartObject->drawLine($XPos,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+

+             if ( $DrawSubTicks && $i != $AxisSettings["Rows"] )

+              $this->pChartObject->drawLine($XPos+$SubTicksSize,$YPos-$OuterSubTickWidth,$XPos+$SubTicksSize,$YPos+$InnerSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));

+

+             $this->pChartObject->drawLine($XPos,$YPos-$OuterTickWidth,$XPos,$YPos+$InnerTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));

+             $Bounds = $this->pChartObject->drawText($XPos,$YPos-$OuterTickWidth-$LabelOffset,$Value,array("Angle"=>$XLabelsRotation,"Align"=>$LabelAlign));

+             $TxtBox = $YPos-$OuterTickWidth-4-($Bounds[0]["Y"]-$Bounds[2]["Y"]);

+             $MinTop = min($MinTop,$TxtBox);

+

+             $LastX = $XPos;

+            }

+

+           if ( isset($AxisSettings["Name"]) )

+            {

+             $YPos   = $MinTop-2;

+             $XPos   = $this->pChartObject->GraphAreaX1+($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1)/2;

+             $Bounds = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+             $MinTop = $Bounds[2]["Y"];

+

+             $this->pDataObject->Data["GraphArea"]["Y1"] = $MinTop;

+            }

+

+           $AxisPos["T"] = $MinTop - $ScaleSpacing;

+          }

+        }

+       elseif ( $AxisSettings["Identity"] == AXIS_Y )

+        {

+         if ( $AxisSettings["Position"] == AXIS_POSITION_LEFT )

+          {

+

+           if ( $Floating )

+            { $FloatingOffset = $XMargin; $this->pChartObject->drawLine($AxisPos["L"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["L"],$this->pChartObject->GraphAreaY2-$AxisSettings["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+           else

+            { $FloatingOffset = 0; $this->pChartObject->drawLine($AxisPos["L"],$this->pChartObject->GraphAreaY1,$AxisPos["L"],$this->pChartObject->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+           if ( $DrawArrows ) { $this->pChartObject->drawArrow($AxisPos["L"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["L"],$this->pChartObject->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+           $Height = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) - $AxisSettings["Margin"]*2;

+           $Step   = $Height / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MinLeft = $AxisPos["L"];

+           $LastY  = NULL;

+           for($i=0;$i<=$AxisSettings["Rows"];$i++)

+            {

+             $YPos  = $this->pChartObject->GraphAreaY2 - $AxisSettings["Margin"] - $Step*$i;

+             $XPos  = $AxisPos["L"];

+             $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]);

+

+             if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }

+             if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->pChartObject->drawFilledRectangle($this->pChartObject->GraphAreaX1+$FloatingOffset,$LastY,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); }

+

+             if ( ($YPos != $this->pChartObject->GraphAreaY1 && $YPos != $this->pChartObject->GraphAreaY2) && ($DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$FloatingOffset,$YPos,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+

+             if ( $DrawSubTicks && $i != $AxisSettings["Rows"] )

+              $this->pChartObject->drawLine($XPos-$OuterSubTickWidth,$YPos-$SubTicksSize,$XPos+$InnerSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));

+

+             $this->pChartObject->drawLine($XPos-$OuterTickWidth,$YPos,$XPos+$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));

+             $Bounds  = $this->pChartObject->drawText($XPos-$OuterTickWidth-2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLERIGHT));

+             $TxtLeft = $XPos-$OuterTickWidth-2-($Bounds[1]["X"]-$Bounds[0]["X"]);

+             $MinLeft = min($MinLeft,$TxtLeft);

+

+             $LastY = $YPos;

+            }

+

+           if ( isset($AxisSettings["Name"]) )

+            {

+             $XPos    = $MinLeft-2;

+             $YPos    = $this->pChartObject->GraphAreaY1+($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1)/2;

+             $Bounds  = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>90));

+             $MinLeft = $Bounds[2]["X"];

+

+             $this->pDataObject->Data["GraphArea"]["X1"] = $MinLeft;

+            }

+

+           $AxisPos["L"] = $MinLeft - $ScaleSpacing;

+          }

+         elseif ( $AxisSettings["Position"] == AXIS_POSITION_RIGHT )

+          {

+

+           if ( $Floating )

+            { $FloatingOffset = $XMargin; $this->pChartObject->drawLine($AxisPos["R"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["R"],$this->pChartObject->GraphAreaY2-$AxisSettings["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+           else

+            { $FloatingOffset = 0; $this->pChartObject->drawLine($AxisPos["R"],$this->pChartObject->GraphAreaY1,$AxisPos["R"],$this->pChartObject->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+           if ( $DrawArrows ) { $this->pChartObject->drawArrow($AxisPos["R"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["R"],$this->pChartObject->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+           $Height = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) - $AxisSettings["Margin"]*2;

+           $Step   = $Height / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MaxLeft = $AxisPos["R"];

+           $LastY  = NULL;

+           for($i=0;$i<=$AxisSettings["Rows"];$i++)

+            {

+             $YPos  = $this->pChartObject->GraphAreaY2 - $AxisSettings["Margin"] - $Step*$i;

+             $XPos  = $AxisPos["R"];

+             $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]);

+

+             if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }

+             if ( $LastY != NULL && $CycleBackground  && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->pChartObject->drawFilledRectangle($this->pChartObject->GraphAreaX1+$FloatingOffset,$LastY,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); }

+

+             if ( ($YPos != $this->pChartObject->GraphAreaY1 && $YPos != $this->pChartObject->GraphAreaY2) && ($DrawYLines == ALL || in_array($AxisID,$DrawYLines)) ) { $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$FloatingOffset,$YPos,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+

+             if ( $DrawSubTicks && $i != $AxisSettings["Rows"] )

+              $this->pChartObject->drawLine($XPos-$InnerSubTickWidth,$YPos-$SubTicksSize,$XPos+$OuterSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));

+

+             $this->pChartObject->drawLine($XPos-$InnerTickWidth,$YPos,$XPos+$OuterTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));

+             $Bounds  = $this->pChartObject->drawText($XPos+$OuterTickWidth+2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLELEFT));

+             $TxtLeft = $XPos+$OuterTickWidth+2+($Bounds[1]["X"]-$Bounds[0]["X"]);

+             $MaxLeft = max($MaxLeft,$TxtLeft);

+

+             $LastY = $YPos;

+            }

+

+           if ( isset($AxisSettings["Name"]) )

+            {

+             $XPos    = $MaxLeft+6;

+             $YPos    = $this->pChartObject->GraphAreaY1+($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1)/2;

+             $Bounds  = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>270));

+             $MaxLeft = $Bounds[2]["X"];

+

+             $this->pDataObject->Data["GraphArea"]["X2"] = $MaxLeft + $this->pChartObject->FontSize;

+            }

+

+           $AxisPos["R"] = $MaxLeft + $ScaleSpacing;

+          }

+        }

+      }

+

+     $this->pDataObject->saveAxisConfig($Data["Axis"]);

+    }

+

+   /* Draw a scatter plot chart */

+   function drawScatterPlotChart($Format=NULL)

+    {

+     $PlotSize		= isset($Format["PlotSize"]) ? $Format["PlotSize"] : 3;

+     $PlotBorder	= isset($Format["PlotBorder"]) ? $Format["PlotBorder"] : FALSE;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : 250;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : 250;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : 250;

+     $BorderAlpha	= isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30;

+     $BorderSize	= isset($Format["BorderSize"]) ? $Format["BorderSize"] : 1;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+

+     $Data    = $this->pDataObject->getData();

+     $Palette = $this->pDataObject->getPalette();

+

+     $BorderColor = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha);

+

+     foreach($Data["ScatterSeries"] as $Key => $Series)

+      {

+       $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"];

+       $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"];

+

+       if ( isset($Series["Picture"]) && $Series["Picture"] != "" )

+        { $Picture = $Series["Picture"]; list($PicWidth,$PicHeight,$PicType) = $this->pChartObject->getPicInfo($Picture); }

+       else

+        { $Picture = NULL; }

+

+       $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis);

+       if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; }

+       $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis);

+       if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; }

+

+       $Color = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]);

+

+       foreach($PosArrayX as $Key => $Value)

+        {

+         $X = $Value; $Y = $PosArrayY[$Key];

+

+         if ( $X != VOID && $Y != VOID )

+          {

+           if ( $Picture == NULL )

+            {

+             if ( $PlotBorder ) { $this->pChartObject->drawFilledCircle($X,$Y,$PlotSize+$BorderSize,$BorderColor); }

+             $this->pChartObject->drawFilledCircle($X,$Y,$PlotSize,$Color);

+            }

+           else

+            { $this->pChartObject->drawFromPicture($PicType,$Picture,$X-$PicWidth/2,$Y-$PicHeight/2); }

+          }

+        }

+      }

+    }

+

+   /* Draw a scatter line chart */

+   function drawScatterLineChart($Format=NULL)

+    {

+     $Data    = $this->pDataObject->getData();

+     $Palette = $this->pDataObject->getPalette();

+

+     /* Parse all the series to draw */

+     foreach($Data["ScatterSeries"] as $Key => $Series)

+      {

+       $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"];

+       $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"];

+       $Ticks  = $Series["Ticks"];

+       $Weight = $Series["Weight"];

+

+       $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis);

+       if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; }

+       $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis);

+       if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; }

+

+       $Color = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]);

+       if ( $Ticks != 0 )  { $Color["Ticks"]  = $Ticks; }

+       if ( $Weight != 0 ) { $Color["Weight"] = $Weight; }

+

+       $LastX = VOID; $LastY = VOID;

+       foreach($PosArrayX as $Key => $Value)

+        {

+         $X = $Value; $Y = $PosArrayY[$Key];

+

+         if ( $X != VOID && $Y != VOID && $LastX != VOID && $LastY != VOID)

+          $this->pChartObject->drawLine($LastX,$LastY,$X,$Y,$Color);

+

+         $LastX = $X; $LastY = $Y;

+        }

+      }

+    }

+

+   /* Draw a scatter spline chart */

+   function drawScatterSplineChart($Format=NULL)

+    {

+     $Data    = $this->pDataObject->getData();

+     $Palette = $this->pDataObject->getPalette();

+

+     foreach($Data["ScatterSeries"] as $Key => $Series)

+      {

+       $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"];

+       $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"];

+       $Ticks  = $Series["Ticks"];

+       $Weight = $Series["Weight"];

+

+       $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis);

+       if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; }

+       $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis);

+       if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; }

+

+       $SplineSettings = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]);

+       if ( $Ticks != 0 )  { $SplineSettings["Ticks"]  = $Ticks; }

+       if ( $Weight != 0 ) { $SplineSettings["Weight"] = $Weight; }

+

+       $LastX = VOID; $LastY = VOID; $WayPoints = ""; $Forces = "";

+       foreach($PosArrayX as $Key => $Value)

+        {

+         $X = $Value; $Y = $PosArrayY[$Key];

+

+         $Force = $this->pChartObject->getLength($LastX,$LastY,$X,$Y)/5;

+

+         if ( $X != VOID && $Y != VOID )

+          { $WayPoints[] = array($X,$Y); $Forces[] = $Force; }

+

+         if ( $Y == VOID && $LastY != NULL )

+          { $SplineSettings["Forces"] = $Forces; $this->pChartObject->drawSpline($WayPoints,$SplineSettings); $WayPoints = ""; $Forces = "";}

+

+         $LastX = $X; $LastY = $Y;

+        }

+       $SplineSettings["Forces"] = $Forces; 

+       $this->pChartObject->drawSpline($WayPoints,$SplineSettings);

+      }

+    }

+

+   /* Return the scaled plot position */

+   function getPosArray($Values,$AxisID)

+    {

+     $Data = $this->pDataObject->getData();

+

+     if ( !is_array($Values) ) { $Values = array($Values); }

+

+     if ( $Data["Axis"][$AxisID]["Identity"] == AXIS_X )

+      {

+       $Height      = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) - $Data["Axis"][$AxisID]["Margin"]*2;

+       $ScaleHeight = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"];

+       $Step        = $Height / $ScaleHeight;

+

+       $Result = "";

+       foreach($Values as $Key => $Value)

+        {

+         if ( $Value == VOID ) 

+          $Result[] = VOID;

+         else

+          $Result[] = $this->pChartObject->GraphAreaX1 + $Data["Axis"][$AxisID]["Margin"] + ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"]));

+        }

+

+       if ( count($Result) == 1 ) { return($Result[0]); } else { return($Result); }

+      }

+     else

+      {

+       $Height      = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) - $Data["Axis"][$AxisID]["Margin"]*2;

+       $ScaleHeight = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"];

+       $Step        = $Height / $ScaleHeight;

+

+       $Result = "";

+       foreach($Values as $Key => $Value)

+        {

+         if ( $Value == VOID ) 

+          $Result[] = VOID;

+         else

+          $Result[] = $this->pChartObject->GraphAreaY2 - $Data["Axis"][$AxisID]["Margin"] - ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"]));

+        }

+

+       if ( count($Result) == 1 ) { return($Result[0]); } else { return($Result); }

+      }

+    }

+

+   /* Draw the legend of the active series */

+   function drawScatterLegend($X,$Y,$Format="")

+    {

+     $Family		= isset($Format["Family"]) ? $Format["Family"] : LEGEND_FAMILY_BOX;

+     $FontName		= isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName;

+     $FontSize		= isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize;

+     $FontR		= isset($Format["FontR"]) ? $Format["FontR"] : $this->pChartObject->FontColorR;

+     $FontG		= isset($Format["FontG"]) ? $Format["FontG"] : $this->pChartObject->FontColorG;

+     $FontB		= isset($Format["FontB"]) ? $Format["FontB"] : $this->pChartObject->FontColorB;

+     $BoxWidth		= isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 5;

+     $BoxHeight		= isset($Format["BoxHeight"]) ? $Format["BoxHeight"] : 5;

+     $IconAreaWidth	= isset($Format["IconAreaWidth"]) ? $Format["IconAreaWidth"] : $BoxWidth;

+     $IconAreaHeight	= isset($Format["IconAreaHeight"]) ? $Format["IconAreaHeight"] : $BoxHeight;

+     $XSpacing		= isset($Format["XSpacing"]) ? $Format["XSpacing"] : 5;

+     $Margin		= isset($Format["Margin"]) ? $Format["Margin"] : 5;

+     $R			= isset($Format["R"]) ? $Format["R"] : 200;

+     $G			= isset($Format["G"]) ? $Format["G"] : 200;

+     $B			= isset($Format["B"]) ? $Format["B"] : 200;

+     $Alpha		= isset($Format["Alpha"]) ? $Format["Alpha"] : 100;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : 255;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : 255;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : 255;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $Style		= isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND;

+     $Mode		= isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL;

+

+     if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; }

+

+     $Data = $this->pDataObject->getData();

+

+     foreach($Data["ScatterSeries"] as $Key => $Series)

+      {

+       if ( $Series["isDrawable"] == TRUE && isset($Series["Picture"]))

+        {

+         list($PicWidth,$PicHeight) = $this->pChartObject->getPicInfo($Series["Picture"]);

+         if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; }

+         if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; }

+        }

+      }

+

+     $YStep = max($this->pChartObject->FontSize,$IconAreaHeight) + 5;

+     $XStep = $IconAreaWidth + 5;

+     $XStep = $XSpacing;

+

+     $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X;

+     foreach($Data["ScatterSeries"] as $Key => $Series)

+      {

+       if ( $Series["isDrawable"] == TRUE )

+        {

+         if ( $Mode == LEGEND_VERTICAL )

+          {

+           $BoxArray = $this->pChartObject->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Series["Description"]);

+

+           if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }

+           if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }

+           if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }

+

+           $Lines = preg_split("/\n/",$Series["Description"]);

+           $vY = $vY + max($this->pChartObject->FontSize*count($Lines),$IconAreaHeight) + 5;

+          }

+         elseif ( $Mode == LEGEND_HORIZONTAL )

+          {

+           $Lines = preg_split("/\n/",$Series["Description"]);

+           $Width = "";

+           foreach($Lines as $Key => $Value)

+            {

+             $BoxArray = $this->pChartObject->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->pChartObject->FontSize+3)*$Key),$FontName,$FontSize,0,$Value);

+

+             if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }

+             if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }

+             if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }

+

+             $Width[] = $BoxArray[1]["X"];

+            }

+

+           $vX=max($Width)+$XStep;

+          }

+        }

+      }

+     $vY=$vY-$YStep; $vX=$vX-$XStep;

+

+     $TopOffset  = $Y - $Boundaries["T"];

+     if ( $Boundaries["B"]-($vY+$IconAreaHeight) < $TopOffset ) { $Boundaries["B"] = $vY+$IconAreaHeight+$TopOffset; }

+

+     if ( $Style == LEGEND_ROUND )

+      $this->pChartObject->drawRoundedFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));

+     elseif ( $Style == LEGEND_BOX )

+      $this->pChartObject->drawFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));

+

+     $RestoreShadow = $this->pChartObject->Shadow; $this->Shadow = FALSE;

+     foreach($Data["ScatterSeries"] as $Key => $Series)

+      {

+       if ( $Series["isDrawable"] == TRUE )

+        {

+         $R = $Series["Color"]["R"]; $G = $Series["Color"]["G"]; $B = $Series["Color"]["B"];

+         $Ticks = $Series["Ticks"]; $Weight = $Series["Weight"];

+

+         if ( isset($Series["Picture"]) )

+          {

+           $Picture = $Series["Picture"];

+           list($PicWidth,$PicHeight) = $this->pChartObject->getPicInfo($Picture);

+           $PicX = $X+$IconAreaWidth/2; $PicY = $Y+$IconAreaHeight/2; 

+

+           $this->pChartObject->drawFromPNG($PicX-$PicWidth/2,$PicY-$PicHeight/2,$Picture);

+          }

+         else

+          {

+           if ( $Family == LEGEND_FAMILY_BOX )

+            {

+             if ( $BoxWidth != $IconAreaWidth ) { $XOffset = floor(($IconAreaWidth-$BoxWidth)/2); } else { $XOffset = 0; }

+             if ( $BoxHeight != $IconAreaHeight ) { $YOffset = floor(($IconAreaHeight-$BoxHeight)/2); } else { $YOffset = 0; }

+

+             $this->pChartObject->drawFilledRectangle($X+1+$XOffset,$Y+1+$YOffset,$X+$BoxWidth+$XOffset+1,$Y+$BoxHeight+1+$YOffset,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+             $this->pChartObject->drawFilledRectangle($X+$XOffset,$Y+$YOffset,$X+$BoxWidth+$XOffset,$Y+$BoxHeight+$YOffset,array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20));

+            }

+           elseif ( $Family == LEGEND_FAMILY_CIRCLE )

+            {

+             $this->pChartObject->drawFilledCircle($X+1+$IconAreaWidth/2,$Y+1+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+             $this->pChartObject->drawFilledCircle($X+$IconAreaWidth/2,$Y+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20));

+            }

+           elseif ( $Family == LEGEND_FAMILY_LINE )

+            {

+             $this->pChartObject->drawLine($X+1,$Y+1+$IconAreaHeight/2,$X+1+$IconAreaWidth,$Y+1+$IconAreaHeight/2,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20,"Ticks"=>$Ticks,"Weight"=>$Weight));

+             $this->pChartObject->drawLine($X,$Y+$IconAreaHeight/2,$X+$IconAreaWidth,$Y+$IconAreaHeight/2,array("R"=>$R,"G"=>$G,"B"=>$B,"Ticks"=>$Ticks,"Weight"=>$Weight));

+            }

+          }

+

+         if ( $Mode == LEGEND_VERTICAL )

+          {

+           $Lines = preg_split("/\n/",$Series["Description"]);

+           foreach($Lines as $Key => $Value)

+            $this->pChartObject->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->pChartObject->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT));

+

+           $Y=$Y+max($this->pChartObject->FontSize*count($Lines),$IconAreaHeight) + 5;

+          }

+         elseif ( $Mode == LEGEND_HORIZONTAL )

+          {

+           $Lines = preg_split("/\n/",$Series["Description"]);

+           $Width = "";

+           foreach($Lines as $Key => $Value)

+            {

+             $BoxArray = $this->pChartObject->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->pChartObject->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT));

+             $Width[] = $BoxArray[1]["X"];

+            }

+           $X=max($Width)+2+$XStep;

+          }

+        }

+      }

+

+     $this->Shadow = $RestoreShadow;

+    }

+

+   /* Get the legend box size */

+   function getScatterLegendSize($Format="")

+    {

+     $FontName	= isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName;

+     $FontSize	= isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize;

+     $BoxSize	= isset($Format["BoxSize"]) ? $Format["BoxSize"] : 5;

+     $Margin	= isset($Format["Margin"]) ? $Format["Margin"] : 5;

+     $Style	= isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND;

+     $Mode	= isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL;

+

+     $YStep = max($this->pChartObject->FontSize,$BoxSize) + 5;

+     $XStep = $BoxSize + 5;

+

+     $X=100; $Y=100;

+

+     $Data = $this->pDataObject->getData();

+

+     foreach($Data["ScatterSeries"] as $Key => $Series)

+      {

+       if ( $Series["isDrawable"] == TRUE && isset($Series["Picture"]))

+        {

+         list($PicWidth,$PicHeight) = $this->pChartObject->getPicInfo($Series["Picture"]);

+         if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; }

+         if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; }

+        }

+      }

+

+     $YStep = max($this->pChartObject->FontSize,$IconAreaHeight) + 5;

+     $XStep = $IconAreaWidth + 5;

+     $XStep = $XSpacing;

+

+     $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X;

+     foreach($Data["ScatterSeries"] as $Key => $Series)

+      {

+       if ( $Series["isDrawable"] == TRUE )

+        {

+         if ( $Mode == LEGEND_VERTICAL )

+          {

+           $BoxArray = $this->pChartObject->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Series["Description"]);

+

+           if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }

+           if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }

+           if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }

+

+           $Lines = preg_split("/\n/",$Series["Description"]);

+           $vY = $vY + max($this->pChartObject->FontSize*count($Lines),$IconAreaHeight) + 5;

+          }

+         elseif ( $Mode == LEGEND_HORIZONTAL )

+          {

+           $Lines = preg_split("/\n/",$Series["Description"]);

+           $Width = "";

+           foreach($Lines as $Key => $Value)

+            {

+             $BoxArray = $this->pChartObject->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->pChartObject->FontSize+3)*$Key),$FontName,$FontSize,0,$Value);

+

+             if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }

+             if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }

+             if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }

+

+             $Width[] = $BoxArray[1]["X"];

+            }

+

+           $vX=max($Width)+$XStep;

+          }

+        }

+      }

+     $vY=$vY-$YStep; $vX=$vX-$XStep;

+

+     $TopOffset  = $Y - $Boundaries["T"];

+     if ( $Boundaries["B"]-($vY+$BoxSize) < $TopOffset ) { $Boundaries["B"] = $vY+$BoxSize+$TopOffset; }

+

+     $Width  = ($Boundaries["R"]+$Margin) - ($Boundaries["L"]-$Margin);

+     $Height = ($Boundaries["B"]+$Margin) - ($Boundaries["T"]-$Margin);

+

+     return(array("Width"=>$Width,"Height"=>$Height));

+    }

+

+   /* Draw the line of best fit */

+   function drawScatterBestFit($Format="")

+    {

+     $Ticks	= isset($Format["Ticks"]) ? $Format["Ticks"] : 0;

+

+     $Data    = $this->pDataObject->getData();

+

+     foreach($Data["ScatterSeries"] as $Key => $Series)

+      {

+       $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"];

+       $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"];

+

+       $Color = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]);

+       $Color["Ticks"] = $Ticks;

+

+       $PosArrayX = $Data["Series"][$Series["X"]]["Data"];

+       $PosArrayY = $Data["Series"][$Series["Y"]]["Data"];

+

+       $Sxy = 0; $Sx = 0; $Sy = 0; $Sxx = 0;

+       foreach($PosArrayX as $Key => $Value)

+        {

+         $X = $Value; $Y = $PosArrayY[$Key];

+

+         $Sxy = $Sxy + $X*$Y;

+         $Sx  = $Sx + $X;

+         $Sy  = $Sy + $Y;

+         $Sxx = $Sxx + $X*$X;

+        }

+

+       $n = count($PosArrayX);

+       $M = (($n*$Sxy)-($Sx*$Sy)) / (($n*$Sxx)-($Sx*$Sx));

+       $B = (($Sy)-($M*$Sx))/($n);

+

+       $X1 = $this->getPosArray($Data["Axis"][$SerieXAxis]["ScaleMin"],$SerieXAxis);

+       $Y1 = $this->getPosArray($M * $Data["Axis"][$SerieXAxis]["ScaleMin"] + $B,$SerieYAxis);

+       $X2 = $this->getPosArray($Data["Axis"][$SerieXAxis]["ScaleMax"],$SerieXAxis);

+       $Y2 = $this->getPosArray($M * $Data["Axis"][$SerieXAxis]["ScaleMax"] + $B,$SerieYAxis);

+

+       if ( $Y1 < $this->pChartObject->GraphAreaY1 ) { $X1 = $X1 + ($this->pChartObject->GraphAreaY1-$Y1); $Y1 = $this->pChartObject->GraphAreaY1; }

+       if ( $Y1 > $this->pChartObject->GraphAreaY2 ) { $X1 = $X1 + ($Y1-$this->pChartObject->GraphAreaY2); $Y1 = $this->pChartObject->GraphAreaY2; }

+       if ( $Y2 < $this->pChartObject->GraphAreaY1 ) { $X2 = $X2 - ($this->pChartObject->GraphAreaY1-$Y2); $Y2 = $this->pChartObject->GraphAreaY1; }

+       if ( $Y2 > $this->pChartObject->GraphAreaY2 ) { $X2 = $X2 - ($Y2-$this->pChartObject->GraphAreaY2); $Y2 = $this->pChartObject->GraphAreaY2; }

+

+       $this->pChartObject->drawLine($X1,$Y1,$X2,$Y2,$Color);

+      }

+    }

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/class/pSplit.class.php
@@ -1,1 +1,131 @@
-
+<?php

+ /*

+     pSplit - class to draw spline splitted charts

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ define("TEXT_POS_TOP"		, 690001);

+ define("TEXT_POS_RIGHT"	, 690002);

+

+ /* pSplit class definition */

+ class pSplit

+  {

+   var $pChartObject;

+

+   /* Class creator */

+   function pSplit()

+    { }

+

+   /* Create the encoded string */

+   function drawSplitPath($Object,$Values,$Format="")

+    {

+     $this->pChartObject = $Object;

+

+     $Spacing		= isset($Format["Spacing"]) ? $Format["Spacing"] : 20;

+     $TextPadding	= isset($Format["TextPadding"]) ? $Format["TextPadding"] : 2;

+     $TextPos		= isset($Format["TextPos"]) ? $Format["TextPos"] : TEXT_POS_TOP;

+     $Surrounding       = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $Force		= isset($Format["Force"]) ? $Format["Force"] : 70;

+     $Segments		= isset($Format["Segments"]) ? $Format["Segments"] : 15;

+     $FontSize		= $Object->FontSize;

+     $X1		= $Object->GraphAreaX1;

+     $Y1		= $Object->GraphAreaY1;

+     $X2		= $Object->GraphAreaX2;

+     $Y2		= $Object->GraphAreaY2;

+

+     /* Data Processing */

+     $Data    = $Values->getData();

+     $Palette = $Values->getPalette();

+

+     $LabelSerie = $Data["Abscissa"];

+     $DataSerie  = "";

+

+     foreach($Data["Series"] as $SerieName => $Value)

+      { if ( $SerieName != $LabelSerie && $DataSerie == "" ) { $DataSerie = $SerieName; } }

+

+     $DataSerieSum   = array_sum($Data["Series"][$DataSerie]["Data"]);

+     $DataSerieCount = count($Data["Series"][$DataSerie]["Data"]);

+

+     /* Scale Processing */

+     if ( $TextPos == TEXT_POS_RIGHT )

+      $YScale     = (($Y2-$Y1) - (($DataSerieCount+1)*$Spacing)) / $DataSerieSum;

+     else

+      $YScale     = (($Y2-$Y1) - ($DataSerieCount*$Spacing)) / $DataSerieSum;

+     $LeftHeight = $DataSerieSum * $YScale;

+

+     /* Re-compute graph width depending of the text mode choosen */

+     if ( $TextPos == TEXT_POS_RIGHT )

+      {

+       $MaxWidth = 0;

+       foreach($Data["Series"][$LabelSerie]["Data"] as $Key => $Label)

+        {

+         $Boundardies = $Object->getTextBox(0,0,$Object->FontName,$Object->FontSize,0,$Label);

+         if ( $Boundardies[1]["X"] > $MaxWidth ) { $MaxWidth = $Boundardies[1]["X"] + $TextPadding*2; }

+        }

+       $X2 = $X2 - $MaxWidth;

+      }

+

+     /* Drawing */

+     $LeftY    = ((($Y2-$Y1) / 2) + $Y1) - ($LeftHeight/2);

+     $RightY   = $Y1;

+     $VectorX  = (($X2-$X1) / 2);

+

+     foreach($Data["Series"][$DataSerie]["Data"] as $Key => $Value)

+      {

+       if ( isset($Data["Series"][$LabelSerie]["Data"][$Key]) )

+        $Label = $Data["Series"][$LabelSerie]["Data"][$Key];

+       else

+        $Label = "-";

+

+       $LeftY1 = $LeftY;

+       $LeftY2 = $LeftY + $Value * $YScale;

+

+       $RightY1 = $RightY + $Spacing;

+       $RightY2 = $RightY + $Spacing + $Value * $YScale;;

+

+       $Settings = array("R"=>$Palette[$Key]["R"],"G"=>$Palette[$Key]["G"],"B"=>$Palette[$Key]["B"],"Alpha"=>$Palette[$Key]["Alpha"],"NoDraw"=>TRUE,"Segments"=>$Segments,"Surrounding"=>$Surrounding);

+

+       $PolyGon = "";

+

+       $Angle    = $Object->getAngle($X2,$RightY1,$X1,$LeftY1);

+       $VectorX1 = cos(deg2rad($Angle+90)) * $Force + ($X2-$X1)/2 + $X1;

+       $VectorY1 = sin(deg2rad($Angle+90)) * $Force + ($RightY1-$LeftY1)/2 + $LeftY1;

+       $VectorX2 = cos(deg2rad($Angle-90)) * $Force + ($X2-$X1)/2 + $X1;

+       $VectorY2 = sin(deg2rad($Angle-90)) * $Force + ($RightY1-$LeftY1)/2 + $LeftY1;

+

+       $Points = $Object->drawBezier($X1,$LeftY1,$X2,$RightY1,$VectorX1,$VectorY1,$VectorX2,$VectorY2,$Settings);

+       foreach($Points as $Key => $Pos) { $PolyGon[] = $Pos["X"]; $PolyGon[] = $Pos["Y"]; }

+

+

+       $Angle    = $Object->getAngle($X2,$RightY2,$X1,$LeftY2);

+       $VectorX1 = cos(deg2rad($Angle+90)) * $Force + ($X2-$X1)/2 +$X1;

+       $VectorY1 = sin(deg2rad($Angle+90)) * $Force + ($RightY2-$LeftY2)/2 + $LeftY2;

+       $VectorX2 = cos(deg2rad($Angle-90)) * $Force + ($X2-$X1)/2 +$X1;

+       $VectorY2 = sin(deg2rad($Angle-90)) * $Force + ($RightY2-$LeftY2)/2 + $LeftY2;

+

+       $Points = $Object->drawBezier($X1,$LeftY2,$X2,$RightY2,$VectorX1,$VectorY1,$VectorX2,$VectorY2,$Settings);

+       $Points = array_reverse($Points);

+       foreach($Points as $Key => $Pos) { $PolyGon[] = $Pos["X"]; $PolyGon[] = $Pos["Y"]; }

+

+       $Object->drawPolygon($PolyGon,$Settings);

+

+       if ( $TextPos == TEXT_POS_RIGHT )

+        $Object->drawText($X2+$TextPadding,($RightY2-$RightY1)/2+$RightY1,$Label,array("Align"=>TEXT_ALIGN_MIDDLELEFT));

+       else

+        $Object->drawText($X2,$RightY1-$TextPadding,$Label,array("Align"=>TEXT_ALIGN_BOTTOMRIGHT));

+

+       $LeftY  = $LeftY2;

+       $RightY = $RightY2;

+      }

+    }

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/class/pSpring.class.php
@@ -1,1 +1,868 @@
-
+<?php

+ /*

+     pSpring - class to draw spring graphs

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ define("NODE_TYPE_FREE"	, 690001);

+ define("NODE_TYPE_CENTRAL"	, 690002);

+

+ define("NODE_SHAPE_CIRCLE"	, 690011);

+ define("NODE_SHAPE_TRIANGLE"	, 690012);

+ define("NODE_SHAPE_SQUARE"	, 690013);

+

+ define("ALGORITHM_RANDOM"	, 690021);

+ define("ALGORITHM_WEIGHTED"	, 690022);

+ define("ALGORITHM_CIRCULAR"	, 690023);

+ define("ALGORITHM_CENTRAL"	, 690024);

+

+ define("LABEL_CLASSIC"		, 690031);

+ define("LABEL_LIGHT"		, 690032);

+

+ /* pSpring class definition */

+ class pSpring

+  {

+   var $History;

+   var $pChartObject;

+   var $Data;

+   var $Links;

+   var $X1;

+   var $Y1;

+   var $X2;

+   var $Y2;

+   var $AutoComputeFreeZone;

+   var $Labels;

+

+   /* Class creator */

+   function pSpring()

+    {

+     /* Initialise data arrays */

+     $this->Data = "";

+     $this->Links = "";

+

+     /* Set nodes defaults */

+     $this->Default["R"]		= 255;

+     $this->Default["G"]		= 255;

+     $this->Default["B"]		= 255;

+     $this->Default["Alpha"]		= 100;

+     $this->Default["BorderR"]		= 0;

+     $this->Default["BorderG"]		= 0;

+     $this->Default["BorderB"]		= 0;

+     $this->Default["BorderAlpha"]	= 100;

+     $this->Default["Surrounding"]	= NULL;

+     $this->Default["BackgroundR"]	= 255;

+     $this->Default["BackgroundG"]	= 255;

+     $this->Default["BackgroundB"]	= 255;

+     $this->Default["BackgroundAlpha"]	= 0;

+     $this->Default["Force"]		= 1;

+     $this->Default["NodeType"]		= NODE_TYPE_FREE;

+     $this->Default["Size"]		= 5;

+     $this->Default["Shape"]		= NODE_SHAPE_CIRCLE;

+     $this->Default["FreeZone"]		= 40;

+     $this->Default["LinkR"]		= 0;

+     $this->Default["LinkG"]		= 0;

+     $this->Default["LinkB"]		= 0;

+     $this->Default["LinkAlpha"]	= 0;

+

+     $this->Labels["Type"]		= LABEL_CLASSIC;

+     $this->Labels["R"]			= 0;

+     $this->Labels["G"]			= 0;

+     $this->Labels["B"]			= 0;

+     $this->Labels["Alpha"]		= 100;

+

+     $this->AutoComputeFreeZone         = FALSE;

+    }

+

+   /* Set default links options */

+   function setLinkDefaults($Settings="")

+    {

+     if ( isset($Settings["R"]) )     { $this->Default["LinkR"] = $Settings["R"]; }

+     if ( isset($Settings["G"]) )     { $this->Default["LinkG"] = $Settings["G"]; }

+     if ( isset($Settings["B"]) )     { $this->Default["LinkB"] = $Settings["B"]; }

+     if ( isset($Settings["Alpha"]) ) { $this->Default["LinkAlpha"] = $Settings["Alpha"]; }

+    }

+

+   /* Set default links options */

+   function setLabelsSettings($Settings="")

+    {

+     if ( isset($Settings["Type"]) )  { $this->Labels["Type"] = $Settings["Type"]; }

+     if ( isset($Settings["R"]) )     { $this->Labels["R"] = $Settings["R"]; }

+     if ( isset($Settings["G"]) )     { $this->Labels["G"] = $Settings["G"]; }

+     if ( isset($Settings["B"]) )     { $this->Labels["B"] = $Settings["B"]; }

+     if ( isset($Settings["Alpha"]) ) { $this->Labels["Alpha"] = $Settings["Alpha"]; }

+    }

+

+   /* Auto compute the FreeZone size based on the number of connections */

+   function autoFreeZone()

+    {

+     /* Check connections reciprocity */

+     foreach($this->Data as $Key => $Settings)

+      {

+       if ( isset($Settings["Connections"]) )

+        { $this->Data[$Key]["FreeZone"] = count($Settings["Connections"])*10 + 20; }

+       else

+        { $this->Data[$Key]["FreeZone"] = 20; }

+      }

+

+    }

+

+   /* Set link properties */

+   function linkProperties($FromNode,$ToNode,$Settings)

+    {

+     if ( !isset($this->Data[$FromNode]) ) { return(0); }

+     if ( !isset($this->Data[$ToNode]) )   { return(0); }

+

+     $R			= isset($Settings["R"]) ? $Settings["R"] : 0;

+     $G			= isset($Settings["G"]) ? $Settings["G"] : 0;

+     $B			= isset($Settings["B"]) ? $Settings["B"] : 0;

+     $Alpha		= isset($Settings["Alpha"]) ? $Settings["Alpha"] : 100;

+     $Name		= isset($Settings["Name"]) ? $Settings["Name"] : NULL;

+     $Ticks		= isset($Settings["Ticks"]) ? $Settings["Ticks"] : NULL;

+

+     $this->Links[$FromNode][$ToNode]["R"] = $R;         $this->Links[$ToNode][$FromNode]["R"] = $R;

+     $this->Links[$FromNode][$ToNode]["G"] = $G;         $this->Links[$ToNode][$FromNode]["G"] = $G;

+     $this->Links[$FromNode][$ToNode]["B"] = $B;         $this->Links[$ToNode][$FromNode]["B"] = $B;

+     $this->Links[$FromNode][$ToNode]["Alpha"] = $Alpha; $this->Links[$ToNode][$FromNode]["Alpha"] = $Alpha;

+     $this->Links[$FromNode][$ToNode]["Name"] = $Name;   $this->Links[$ToNode][$FromNode]["Name"] = $Name;

+     $this->Links[$FromNode][$ToNode]["Ticks"] = $Ticks; $this->Links[$ToNode][$FromNode]["Ticks"] = $Ticks;

+    }

+

+   function setNodeDefaults($Settings="")

+    {

+     if ( isset($Settings["R"]) ) { $this->Default["R"]					= $Settings["R"]; }

+     if ( isset($Settings["G"]) ) { $this->Default["G"]					= $Settings["G"]; }

+     if ( isset($Settings["B"]) ) { $this->Default["B"]					= $Settings["B"]; }

+     if ( isset($Settings["Alpha"]) ) { $this->Default["Alpha"]				= $Settings["Alpha"]; }

+     if ( isset($Settings["BorderR"]) ) { $this->Default["BorderR"]			= $Settings["BorderR"]; }

+     if ( isset($Settings["BorderG"]) ) { $this->Default["BorderG"]			= $Settings["BorderG"]; }

+     if ( isset($Settings["BorderB"]) ) { $this->Default["BorderB"]			= $Settings["BorderB"]; }

+     if ( isset($Settings["BorderAlpha"]) ) { $this->Default["BorderAlpha"]		= $Settings["BorderAlpha"]; }

+     if ( isset($Settings["Surrounding"]) ) { $this->Default["Surrounding"]		= $Settings["Surrounding"]; }

+     if ( isset($Settings["BackgroundR"]) ) { $this->Default["BackgroundR"]		= $Settings["BackgroundR"]; }

+     if ( isset($Settings["BackgroundG"]) ) { $this->Default["BackgroundG"]		= $Settings["BackgroundG"]; }

+     if ( isset($Settings["BackgroundB"]) ) { $this->Default["BackgroundB"]		= $Settings["BackgroundB"]; }

+     if ( isset($Settings["BackgroundAlpha"]) ) { $this->Default["BackgroundAlpha"]	= $Settings["BackgroundAlpha"]; }

+     if ( isset($Settings["NodeType"]) ) { $this->Default["NodeType"]			= $Settings["NodeType"]; }

+     if ( isset($Settings["Size"]) ) { $this->Default["Size"]				= $Settings["Size"]; }

+     if ( isset($Settings["Shape"]) ) { $this->Default["Shape"]				= $Settings["Shape"]; }

+     if ( isset($Settings["FreeZone"]) ) { $this->Default["FreeZone"]			= $Settings["FreeZone"]; }

+    }

+

+   /* Add a node */

+   function addNode($NodeID,$Settings="")

+    {

+     /* if the node already exists, ignore */

+     if (isset($this->Data[$NodeID])) { return(0); }

+

+     $Name		= isset($Settings["Name"]) ? $Settings["Name"] : "Node ".$NodeID;

+     $Connections	= isset($Settings["Connections"]) ? $Settings["Connections"] : NULL;

+

+     $R			= isset($Settings["R"]) ? $Settings["R"] : $this->Default["R"];

+     $G			= isset($Settings["G"]) ? $Settings["G"] : $this->Default["G"];

+     $B			= isset($Settings["B"]) ? $Settings["B"] : $this->Default["B"];

+     $Alpha		= isset($Settings["Alpha"]) ? $Settings["Alpha"] : $this->Default["Alpha"];

+     $BorderR		= isset($Settings["BorderR"]) ? $Settings["BorderR"] : $this->Default["BorderR"];

+     $BorderG		= isset($Settings["BorderG"]) ? $Settings["BorderG"] : $this->Default["BorderG"];

+     $BorderB		= isset($Settings["BorderB"]) ? $Settings["BorderB"] : $this->Default["BorderB"];

+     $BorderAlpha	= isset($Settings["BorderAlpha"]) ? $Settings["BorderAlpha"] : $this->Default["BorderAlpha"];

+     $Surrounding	= isset($Settings["Surrounding"]) ? $Settings["Surrounding"] : $this->Default["Surrounding"];

+     $BackgroundR	= isset($Settings["BackgroundR"]) ? $Settings["BackgroundR"] : $this->Default["BackgroundR"];

+     $BackgroundG	= isset($Settings["BackgroundG"]) ? $Settings["BackgroundG"] : $this->Default["BackgroundG"];

+     $BackgroundB	= isset($Settings["BackgroundB"]) ? $Settings["BackgroundB"] : $this->Default["BackgroundB"];

+     $BackgroundAlpha	= isset($Settings["BackgroundAlpha"]) ? $Settings["BackgroundAlpha"] : $this->Default["BackgroundAlpha"];

+     $Force		= isset($Settings["Force"]) ? $Settings["Force"] :  $this->Default["Force"];

+     $NodeType		= isset($Settings["NodeType"]) ? $Settings["NodeType"] : $this->Default["NodeType"];

+     $Size		= isset($Settings["Size"]) ? $Settings["Size"] : $this->Default["Size"];

+     $Shape		= isset($Settings["Shape"]) ? $Settings["Shape"] : $this->Default["Shape"];

+     $FreeZone		= isset($Settings["FreeZone"]) ? $Settings["FreeZone"] : $this->Default["FreeZone"];

+

+     if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; }

+

+     $this->Data[$NodeID]["R"] = $R; $this->Data[$NodeID]["G"] = $G; $this->Data[$NodeID]["B"] = $B; $this->Data[$NodeID]["Alpha"] = $Alpha;

+     $this->Data[$NodeID]["BorderR"] = $BorderR; $this->Data[$NodeID]["BorderG"] = $BorderG; $this->Data[$NodeID]["BorderB"] = $BorderB; $this->Data[$NodeID]["BorderAlpha"] = $BorderAlpha;

+     $this->Data[$NodeID]["BackgroundR"]	= $BackgroundR; $this->Data[$NodeID]["BackgroundG"] = $BackgroundG; $this->Data[$NodeID]["BackgroundB"] = $BackgroundB; $this->Data[$NodeID]["BackgroundAlpha"] = $BackgroundAlpha;

+     $this->Data[$NodeID]["Name"]		= $Name;

+     $this->Data[$NodeID]["Force"]		= $Force;

+     $this->Data[$NodeID]["Type"]		= $NodeType;

+     $this->Data[$NodeID]["Size"]		= $Size;

+     $this->Data[$NodeID]["Shape"]		= $Shape;

+     $this->Data[$NodeID]["FreeZone"]		= $FreeZone;

+     if ( $Connections != NULL )

+      {

+       if ( is_array($Connections ) )

+        {

+         foreach($Connections as $Key => $Value)

+          $this->Data[$NodeID]["Connections"][] = $Value;

+        }

+       else

+        $this->Data[$NodeID]["Connections"][] = $Connections;

+      }

+    }

+

+   /* Set color attribute for a list of nodes */

+   function setNodesColor($Nodes,$Settings="")

+    {

+     if ( is_array($Nodes) )

+      {

+       foreach ($Nodes as $Key => $NodeID)

+        {

+         if (isset($this->Data[$NodeID]) )

+          {

+           if ( isset($Settings["R"]) ) { $this->Data[$NodeID]["R"] = $Settings["R"]; }

+           if ( isset($Settings["G"]) ) { $this->Data[$NodeID]["G"] = $Settings["G"]; }

+           if ( isset($Settings["B"]) ) { $this->Data[$NodeID]["B"] = $Settings["B"]; }

+           if ( isset($Settings["Alpha"]) ) { $this->Data[$NodeID]["Alpha"] = $Settings["Alpha"]; }

+           if ( isset($Settings["BorderR"]) ) { $this->Data[$NodeID]["BorderR"] = $Settings["BorderR"]; }

+           if ( isset($Settings["BorderG"]) ) { $this->Data[$NodeID]["BorderG"] = $Settings["BorderG"]; }

+           if ( isset($Settings["BorderB"]) ) { $this->Data[$NodeID]["BorderB"] = $Settings["BorderB"]; }

+           if ( isset($Settings["BorderAlpha"]) ) { $this->Data[$NodeID]["BorderAlpha"] = $Settings["BorderAlpha"]; }

+           if ( isset($Settings["Surrounding"]) ) { $this->Data[$NodeID]["BorderR"] = $this->Data[$NodeID]["R"] + $Settings["Surrounding"]; $this->Data[$NodeID]["BorderG"] = $this->Data[$NodeID]["G"] + $Settings["Surrounding"]; $this->Data[$NodeID]["BorderB"] = $this->Data[$NodeID]["B"] + $Settings["Surrounding"]; }

+          }

+        }

+      }

+     else

+      {

+       if ( isset($Settings["R"]) ) { $this->Data[$Nodes]["R"] = $Settings["R"]; }

+       if ( isset($Settings["G"]) ) { $this->Data[$Nodes]["G"] = $Settings["G"]; }

+       if ( isset($Settings["B"]) ) { $this->Data[$Nodes]["B"] = $Settings["B"]; }

+       if ( isset($Settings["Alpha"]) ) { $this->Data[$Nodes]["Alpha"] = $Settings["Alpha"]; }

+       if ( isset($Settings["BorderR"]) ) { $this->Data[$Nodes]["BorderR"] = $Settings["BorderR"]; }

+       if ( isset($Settings["BorderG"]) ) { $this->Data[$Nodes]["BorderG"] = $Settings["BorderG"]; }

+       if ( isset($Settings["BorderB"]) ) { $this->Data[$Nodes]["BorderB"] = $Settings["BorderB"]; }

+       if ( isset($Settings["BorderAlpha"]) ) { $this->Data[$Nodes]["BorderAlpha"] = $Settings["BorderAlpha"]; }

+       if ( isset($Settings["Surrounding"]) ) { $this->Data[$Nodes]["BorderR"] = $this->Data[$NodeID]["R"] + $Settings["Surrounding"]; $this->Data[$NodeID]["BorderG"] = $this->Data[$NodeID]["G"] + $Settings["Surrounding"]; $this->Data[$NodeID]["BorderB"] = $this->Data[$NodeID]["B"] + $Settings["Surrounding"]; }

+      }

+    }

+

+   /* Returns all the nodes details */

+   function dumpNodes()

+    { return($this->Data); }

+

+   /* Check if a connection exists and create it if required */

+   function checkConnection($SourceID, $TargetID)

+    {

+     if ( isset($this->Data[$SourceID]["Connections"]) )

+      {

+       foreach ($this->Data[$SourceID]["Connections"] as $Key => $ConnectionID)

+        { if ( $TargetID == $ConnectionID ) { return(TRUE); } }

+      }

+     $this->Data[$SourceID]["Connections"][] = $TargetID;

+    }

+   /* Get the median linked nodes position */

+   function getMedianOffset($Key,$X,$Y)

+    {

+     $Cpt = 1;

+     if ( isset($this->Data[$Key]["Connections"]) )

+      {

+       foreach($this->Data[$Key]["Connections"] as $ID => $NodeID)

+        {

+         if ( isset($this->Data[$NodeID]["X"]) && isset($this->Data[$NodeID]["Y"]) )

+          {

+           $X = $X + $this->Data[$NodeID]["X"];

+           $Y = $Y + $this->Data[$NodeID]["Y"];

+           $Cpt++;

+          }

+        }

+      }

+     return(array("X"=>$X/$Cpt,"Y"=>$Y/$Cpt));

+    }

+

+   /* Return the ID of the attached partner with the biggest weight */

+   function getBiggestPartner($Key)

+    {

+     if ( !isset($this->Data[$Key]["Connections"]) ) { return(""); }

+

+     $MaxWeight = 0; $Result = "";

+     foreach($this->Data[$Key]["Connections"] as $Key => $PeerID)

+      {

+       if ( $this->Data[$PeerID]["Weight"] > $MaxWeight )

+        { $MaxWeight = $this->Data[$PeerID]["Weight"]; $Result = $PeerID; }

+      }

+     return($Result);

+    }

+

+   /* Do the initial node positions computing pass */

+   function firstPass($Algorithm)

+    {

+     $CenterX = ($this->X2 - $this->X1) / 2 + $this->X1;

+     $CenterY = ($this->Y2 - $this->Y1) / 2 + $this->Y1;

+

+     /* Check connections reciprocity */

+     foreach($this->Data as $Key => $Settings)

+      {

+       if ( isset($Settings["Connections"]) )

+        {

+         foreach($Settings["Connections"] as $ID => $ConnectionID)

+          $this->checkConnection($ConnectionID,$Key);

+        }

+      }

+

+     if ( $this->AutoComputeFreeZone ) { $this->autoFreeZone(); }

+

+     /* Get the max number of connections */

+     $MaxConnections = 0;

+     foreach($this->Data as $Key => $Settings)

+      { if ( isset($Settings["Connections"]) ) { if ( $MaxConnections < count($Settings["Connections"] ) ) { $MaxConnections = count($Settings["Connections"]); } } }

+

+     if ( $Algorithm == ALGORITHM_WEIGHTED )

+      {

+       foreach($this->Data as $Key => $Settings)

+        {

+         if ( $Settings["Type"] == NODE_TYPE_CENTRAL ) { $this->Data[$Key]["X"] = $CenterX; $this->Data[$Key]["Y"] = $CenterY; }

+         if ( $Settings["Type"] == NODE_TYPE_FREE )

+          {

+           if ( isset($Settings["Connections"]) )

+            { $Connections = count($Settings["Connections"]); }

+           else

+            { $Connections = 0; }

+

+           $Ring  = $MaxConnections - $Connections;

+           $Angle = rand(0,360);

+           

+           $this->Data[$Key]["X"] = cos(deg2rad($Angle)) * ($Ring*$this->RingSize) + $CenterX;

+           $this->Data[$Key]["Y"] = sin(deg2rad($Angle)) * ($Ring*$this->RingSize) + $CenterY;

+          }

+        }

+      }

+     elseif ( $Algorithm == ALGORITHM_CENTRAL )

+      {

+       /* Put a weight on each nodes */

+       foreach($this->Data as $Key => $Settings)

+        {

+         if ( isset($Settings["Connections"]) )

+          $this->Data[$Key]["Weight"] = count($Settings["Connections"]);

+         else

+          $this->Data[$Key]["Weight"] = 0;

+        }

+

+       $MaxConnections = $MaxConnections + 1;

+       for($i=$MaxConnections;$i>=0;$i--)

+        {

+         foreach($this->Data as $Key => $Settings)

+          {

+           if ( $Settings["Type"] == NODE_TYPE_CENTRAL ) { $this->Data[$Key]["X"] = $CenterX; $this->Data[$Key]["Y"] = $CenterY; }

+           if ( $Settings["Type"] == NODE_TYPE_FREE )

+            {

+             if ( isset($Settings["Connections"]) )

+              { $Connections = count($Settings["Connections"]); }

+             else

+              { $Connections = 0; }

+

+             if ( $Connections == $i )

+              {

+               $BiggestPartner = $this->getBiggestPartner($Key);

+               if ( $BiggestPartner != "" )

+                {

+                 $Ring          = $this->Data[$BiggestPartner]["FreeZone"];

+                 $Weight        = $this->Data[$BiggestPartner]["Weight"];

+                 $AngleDivision = 360 / $this->Data[$BiggestPartner]["Weight"];

+                 $Done          = FALSE; $Tries = 0;

+                 while (!$Done && $Tries <= $Weight*2)

+                  {

+                   $Tries++;

+                   $Angle = floor(rand(0,$Weight)*$AngleDivision);

+                   if ( !isset($this->Data[$BiggestPartner]["Angular"][$Angle]) || !isset($this->Data[$BiggestPartner]["Angular"]) )

+                    {

+                     $this->Data[$BiggestPartner]["Angular"][$Angle] = $Angle;

+                     $Done = TRUE; 

+                    }

+                  }

+                 if ( !$Done )

+                  { $Angle = rand(0,360); $this->Data[$BiggestPartner]["Angular"][$Angle] = $Angle; }

+

+                 $X = cos(deg2rad($Angle)) * ($Ring) + $this->Data[$BiggestPartner]["X"];

+                 $Y = sin(deg2rad($Angle)) * ($Ring) + $this->Data[$BiggestPartner]["Y"];

+

+                 $this->Data[$Key]["X"] = $X;

+                 $this->Data[$Key]["Y"] = $Y;

+                }

+              }

+            }

+          }

+        }

+      }

+     elseif ( $Algorithm == ALGORITHM_CIRCULAR )

+      {

+       $MaxConnections = $MaxConnections + 1;

+       for($i=$MaxConnections;$i>=0;$i--)

+        {

+         foreach($this->Data as $Key => $Settings)

+          {

+           if ( $Settings["Type"] == NODE_TYPE_CENTRAL ) { $this->Data[$Key]["X"] = $CenterX; $this->Data[$Key]["Y"] = $CenterY; }

+           if ( $Settings["Type"] == NODE_TYPE_FREE )

+            {

+             if ( isset($Settings["Connections"]) )

+              { $Connections = count($Settings["Connections"]); }

+             else

+              { $Connections = 0; }

+

+             if ( $Connections == $i )

+              {

+               $Ring  = $MaxConnections - $Connections;

+               $Angle = rand(0,360);

+

+               $X = cos(deg2rad($Angle)) * ($Ring*$this->RingSize) + $CenterX;

+               $Y = sin(deg2rad($Angle)) * ($Ring*$this->RingSize) + $CenterY;

+

+               $MedianOffset = $this->getMedianOffset($Key,$X,$Y);

+

+               $this->Data[$Key]["X"] = $MedianOffset["X"];

+               $this->Data[$Key]["Y"] = $MedianOffset["Y"];

+              }

+            }

+          }

+        }

+      }

+     elseif ( $Algorithm == ALGORITHM_RANDOM )

+      {

+       foreach($this->Data as $Key => $Settings)

+        {

+         if ( $Settings["Type"] == NODE_TYPE_FREE )

+          {

+           $this->Data[$Key]["X"] = $CenterX + rand(-20,20);

+           $this->Data[$Key]["Y"] = $CenterY + rand(-20,20);

+          }

+         if ( $Settings["Type"] == NODE_TYPE_CENTRAL ) { $this->Data[$Key]["X"] = $CenterX; $this->Data[$Key]["Y"] = $CenterY; }

+        }

+      }

+    }

+

+   /* Compute one pass */

+   function doPass()

+    {

+     /* Compute vectors */

+     foreach($this->Data as $Key => $Settings)

+      {

+       if ( $Settings["Type"] != NODE_TYPE_CENTRAL )

+        {

+         unset($this->Data[$Key]["Vectors"]);

+

+         $X1 = $Settings["X"];

+         $Y1 = $Settings["Y"];

+

+         /* Repulsion vectors */

+         foreach($this->Data as $Key2 => $Settings2)

+          {

+           if ( $Key != $Key2 )

+            {

+             $X2 = $this->Data[$Key2]["X"];

+             $Y2 = $this->Data[$Key2]["Y"];

+             $FreeZone = $this->Data[$Key2]["FreeZone"];

+

+             $Distance = $this->getDistance($X1,$Y1,$X2,$Y2);

+             $Angle    = $this->getAngle($X1,$Y1,$X2,$Y2) + 180;

+

+             /* Nodes too close, repulsion occurs */

+             if ( $Distance < $FreeZone )

+              {

+               $Force = log(pow(2,$FreeZone-$Distance));

+               if ( $Force > 1 )

+                { $this->Data[$Key]["Vectors"][] = array("Type"=>"R","Angle"=>$Angle % 360,"Force"=>$Force); }

+              }

+            }

+          }

+

+         /* Attraction vectors */

+         if ( isset($Settings["Connections"]) )

+          {

+           foreach($Settings["Connections"] as $ID => $NodeID)

+            {

+             if ( isset($this->Data[$NodeID]) )

+              {

+               $X2 = $this->Data[$NodeID]["X"];

+               $Y2 = $this->Data[$NodeID]["Y"];

+               $FreeZone = $this->Data[$Key2]["FreeZone"];

+

+               $Distance = $this->getDistance($X1,$Y1,$X2,$Y2);

+               $Angle    = $this->getAngle($X1,$Y1,$X2,$Y2);

+

+               if ( $Distance > $FreeZone )

+                $Force = log(($Distance-$FreeZone)+1);

+               else

+                { $Force = log(($FreeZone-$Distance)+1); ($Angle = $Angle + 180); }

+

+               if ( $Force > 1 )

+                $this->Data[$Key]["Vectors"][] = array("Type"=>"A","Angle"=>$Angle % 360,"Force"=>$Force);

+              }

+            }

+          }

+        }

+      }

+

+     /* Move the nodes accoding to the vectors */

+     foreach($this->Data as $Key => $Settings)

+      {

+       $X = $Settings["X"];

+       $Y = $Settings["Y"];

+

+       if ( isset($Settings["Vectors"]) && $Settings["Type"] != NODE_TYPE_CENTRAL )

+        {

+         foreach($Settings["Vectors"] as $ID => $Vector)

+          {

+           $Type  = $Vector["Type"];

+           $Force = $Vector["Force"];

+           $Angle = $Vector["Angle"];

+           $Factor = $Type == "A" ? $this->MagneticForceA : $this->MagneticForceR;

+

+           $X = cos(deg2rad($Angle)) * $Force * $Factor + $X;

+           $Y = sin(deg2rad($Angle)) * $Force * $Factor + $Y;

+          }

+        }

+

+       $this->Data[$Key]["X"] = $X;

+       $this->Data[$Key]["Y"] = $Y;

+      }

+    }

+

+   function lastPass()

+    {

+     /* Put everything inside the graph area */

+     foreach($this->Data as $Key => $Settings)

+      {

+       $X = $Settings["X"];

+       $Y = $Settings["Y"];

+

+       if ( $X < $this->X1 ) { $X = $this->X1; }

+       if ( $X > $this->X2 ) { $X = $this->X2; }

+       if ( $Y < $this->Y1 ) { $Y = $this->Y1; }

+       if ( $Y > $this->Y2 ) { $Y = $this->Y2; }

+

+       $this->Data[$Key]["X"] = $X;

+       $this->Data[$Key]["Y"] = $Y;

+      }

+

+     /* Dump all links */

+     $Links = "";

+     foreach($this->Data as $Key => $Settings)

+      {

+       $X1 = $Settings["X"];

+       $Y1 = $Settings["Y"];

+

+       if ( isset($Settings["Connections"]) )

+        {

+         foreach ($Settings["Connections"] as $ID => $NodeID)

+          {

+           if ( isset($this->Data[$NodeID]) )

+            {

+             $X2 = $this->Data[$NodeID]["X"];

+             $Y2 = $this->Data[$NodeID]["Y"];

+

+             $Links[] = array("X1"=>$X1,"Y1"=>$Y1,"X2"=>$X2,"Y2"=>$Y2,"Source"=>$Settings["Name"],"Destination"=>$this->Data[$NodeID]["Name"]);

+            }

+          }

+        }

+      }

+

+     /* Check collisions */

+     $Conflicts = 0;

+     foreach($this->Data as $Key => $Settings)

+      {

+       $X1 = $Settings["X"];

+       $Y1 = $Settings["Y"];

+

+       if ( isset($Settings["Connections"]) )

+        {

+         foreach ($Settings["Connections"] as $ID => $NodeID)

+          {

+           if ( isset($this->Data[$NodeID]) )

+            {

+             $X2 = $this->Data[$NodeID]["X"];

+             $Y2 = $this->Data[$NodeID]["Y"];

+

+             foreach($Links as $IDLinks => $Link)

+              {

+               $X3 = $Link["X1"]; $Y3 = $Link["Y1"]; $X4 = $Link["X2"]; $Y4 = $Link["Y2"];

+

+               if ( !($X1 == $X3 && $X2 == $X4 && $Y1 == $Y3 && $Y2 == $Y4 ) )

+                {

+                 if ( $this->intersect($X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4) )

+                  {

+                   if ( $Link["Source"] != $Settings["Name"] && $Link["Source"] != $this->Data[$NodeID]["Name"] && $Link["Destination"] != $Settings["Name"] && $Link["Destination"] != $this->Data[$NodeID]["Name"] )

+                    { $Conflicts++; }

+                  }

+                }

+              }

+            }

+          }

+        }

+      }

+     return($Conflicts/2);

+    }

+

+   /* Center the graph */

+   function center()

+    {

+     /* Determine the real center */

+     $TargetCenterX = ($this->X2 - $this->X1) / 2 + $this->X1;

+     $TargetCenterY = ($this->Y2 - $this->Y1) / 2 + $this->Y1;

+

+     /* Get current boundaries */

+     $XMin = $this->X2; $XMax = $this->X1;

+     $YMin = $this->Y2; $YMax = $this->Y1;

+     foreach($this->Data as $Key => $Settings)

+      {

+       $X = $Settings["X"];

+       $Y = $Settings["Y"];

+

+       if ( $X < $XMin) { $XMin = $X; }

+       if ( $X > $XMax) { $XMax = $X; }

+       if ( $Y < $YMin) { $YMin = $Y; }

+       if ( $Y > $YMax) { $YMax = $Y; }

+      }

+     $CurrentCenterX = ($XMax - $XMin) / 2 + $XMin;

+     $CurrentCenterY = ($YMax - $YMin) / 2 + $YMin;

+

+     /* Compute the offset to apply */

+     $XOffset = $TargetCenterX - $CurrentCenterX;

+     $YOffset = $TargetCenterY - $CurrentCenterY;

+

+     /* Correct the points position */

+     foreach($this->Data as $Key => $Settings)

+      {

+       $this->Data[$Key]["X"] = $Settings["X"] + $XOffset;

+       $this->Data[$Key]["Y"] = $Settings["Y"] + $YOffset;

+      }

+    }

+

+   /* Create the encoded string */

+   function drawSpring($Object,$Settings="")

+    {

+     $this->pChartObject = $Object;

+

+     $Pass			= isset($Settings["Pass"]) ? $Settings["Pass"] : 50;

+     $Retries			= isset($Settings["Retry"]) ? $Settings["Retry"] : 10;

+     $this->MagneticForceA	= isset($Settings["MagneticForceA"]) ? $Settings["MagneticForceA"] : 1.5;

+     $this->MagneticForceR	= isset($Settings["MagneticForceR"]) ? $Settings["MagneticForceR"] : 2;

+     $this->RingSize		= isset($Settings["RingSize"]) ? $Settings["RingSize"] : 40;

+     $DrawVectors		= isset($Settings["DrawVectors"]) ? $Settings["DrawVectors"] : FALSE;

+     $DrawQuietZone		= isset($Settings["DrawQuietZone"]) ? $Settings["DrawQuietZone"] : FALSE;

+     $CenterGraph		= isset($Settings["CenterGraph"]) ? $Settings["CenterGraph"] : TRUE;

+     $TextPadding		= isset($Settings["TextPadding"]) ? $Settings["TextPadding"] : 4;

+     $Algorithm			= isset($Settings["Algorithm"]) ? $Settings["Algorithm"] : ALGORITHM_WEIGHTED;

+

+     $FontSize		= $Object->FontSize;

+     $this->X1		= $Object->GraphAreaX1;

+     $this->Y1		= $Object->GraphAreaY1;

+     $this->X2		= $Object->GraphAreaX2;

+     $this->Y2		= $Object->GraphAreaY2;

+

+     $Conflicts = 1; $Jobs = 0; $this->History["MinimumConflicts"] = -1;

+     while ($Conflicts != 0 && $Jobs < $Retries )

+      {

+       $Jobs++;

+

+       /* Compute the initial settings */

+       $this->firstPass($Algorithm);

+

+       /* Apply the vectors */

+       if ( $Pass > 0 ) 

+        {

+         for ($i=0; $i<=$Pass; $i++) { $this->doPass(); }

+        }

+

+       $Conflicts = $this->lastPass();

+       if ( $this->History["MinimumConflicts"] == -1 || $Conflicts < $this->History["MinimumConflicts"] )

+        { $this->History["MinimumConflicts"] = $Conflicts; $this->History["Result"] = $this->Data; }

+      }

+

+     $Conflicts  = $this->History["MinimumConflicts"];

+     $this->Data = $this->History["Result"];

+

+     if ( $CenterGraph ) { $this->center(); }

+

+     /* Draw the connections */

+     $Drawn = "";

+     foreach($this->Data as $Key => $Settings)

+      {

+       $X	= $Settings["X"];

+       $Y	= $Settings["Y"];

+

+       if ( isset($Settings["Connections"]) )

+        {

+         foreach ($Settings["Connections"] as $ID => $NodeID)

+          {

+           if ( !isset($Drawn[$Key]) )    { $Drawn[$Key] = ""; }

+           if ( !isset($Drawn[$NodeID]) ) { $Drawn[$NodeID] = ""; }

+

+           if ( isset($this->Data[$NodeID]) && !isset($Drawn[$Key][$NodeID]) && !isset($Drawn[$NodeID][$Key]) )

+            {

+             $Color = array("R"=>$this->Default["LinkR"],"G"=>$this->Default["LinkG"],"B"=>$this->Default["LinkB"],"Alpha"=>$this->Default["Alpha"]);

+

+             if ( $this->Links != "" )

+              {

+               if ( isset($this->Links[$Key][$NodeID]["R"]) )

+                { $Color = array("R"=>$this->Links[$Key][$NodeID]["R"],"G"=>$this->Links[$Key][$NodeID]["G"],"B"=>$this->Links[$Key][$NodeID]["B"],"Alpha"=>$this->Links[$Key][$NodeID]["Alpha"]); }

+

+               if ( isset($this->Links[$Key][$NodeID]["Ticks"]) )

+                 { $Color["Ticks"] = $this->Links[$Key][$NodeID]["Ticks"]; }

+              }

+

+             $X2 = $this->Data[$NodeID]["X"];

+             $Y2 = $this->Data[$NodeID]["Y"];

+             $this->pChartObject->drawLine($X,$Y,$X2,$Y2,$Color);

+             $Drawn[$Key][$NodeID] = TRUE;

+

+             if ( isset($this->Links) && $this->Links != "" )

+              {

+               if ( isset($this->Links[$Key][$NodeID]["Name"]) || isset($this->Links[$NodeID][$Key]["Name"]) )

+                {

+                 $Name  = isset($this->Links[$Key][$NodeID]["Name"]) ? $this->Links[$Key][$NodeID]["Name"] : $this->Links[$NodeID][$Key]["Name"];

+                 $TxtX  = ($X2 - $X)/2 + $X;

+                 $TxtY  = ($Y2 - $Y)/2 + $Y;

+

+                 if ( $X <= $X2 )

+                  $Angle = (360-$this->getAngle($X,$Y,$X2,$Y2)) % 360;

+                 else

+                  $Angle = (360-$this->getAngle($X2,$Y2,$X,$Y)) % 360;

+

+                 $Settings          = $Color;

+                 $Settings["Angle"] = $Angle;

+                 $Settings["Align"] = TEXT_ALIGN_BOTTOMMIDDLE;

+                 $this->pChartObject->drawText($TxtX,$TxtY,$Name,$Settings);

+                }

+              }

+            }

+          }

+        }

+      }

+

+     /* Draw the quiet zones */

+     if ( $DrawQuietZone )

+      {

+       foreach($this->Data as $Key => $Settings)

+        {

+         $X	 = $Settings["X"];

+         $Y	 = $Settings["Y"];

+         $FreeZone = $Settings["FreeZone"];

+

+         $this->pChartObject->drawFilledCircle($X,$Y,$FreeZone,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>2));

+        }

+      }

+

+

+     /* Draw the nodes */

+     foreach($this->Data as $Key => $Settings)

+      {

+       $X	 = $Settings["X"];

+       $Y	 = $Settings["Y"];

+       $Name	 = $Settings["Name"];

+       $FreeZone = $Settings["FreeZone"];

+       $Shape    = $Settings["Shape"];

+       $Size     = $Settings["Size"];

+

+       $Color	 = array("R"=>$Settings["R"],"G"=>$Settings["G"],"B"=>$Settings["B"],"Alpha"=>$Settings["Alpha"],"BorderR"=>$Settings["BorderR"],"BorderG"=>$Settings["BorderG"],"BorderB"=>$Settings["BorderB"],"BorderApha"=>$Settings["BorderAlpha"]);

+

+       if ( $Shape == NODE_SHAPE_CIRCLE )

+        {

+         $this->pChartObject->drawFilledCircle($X,$Y,$Size,$Color);

+        }

+       elseif ( $Shape == NODE_SHAPE_TRIANGLE )

+        {

+         $Points = "";

+         $Points[] = cos(deg2rad(270)) * $Size + $X; $Points[] = sin(deg2rad(270)) * $Size + $Y;

+         $Points[] = cos(deg2rad(45)) * $Size + $X;  $Points[] = sin(deg2rad(45)) * $Size + $Y;

+         $Points[] = cos(deg2rad(135)) * $Size + $X; $Points[] = sin(deg2rad(135)) * $Size + $Y;

+         $this->pChartObject->drawPolygon($Points,$Color);

+        }

+       elseif ( $Shape == NODE_SHAPE_SQUARE )

+        {

+         $Offset = $Size/2; $Size = $Size / 2;

+         $this->pChartObject->drawFilledRectangle($X-$Offset,$Y-$Offset,$X+$Offset,$Y+$Offset,$Color);

+        }

+

+       if ( $Name != "" )

+        {

+         $LabelOptions = array("R"=>$this->Labels["R"],"G"=>$this->Labels["G"],"B"=>$this->Labels["B"],"Alpha"=>$this->Labels["Alpha"]);

+

+         if ( $this->Labels["Type"] == LABEL_LIGHT )

+          {

+           $LabelOptions["Align"] = TEXT_ALIGN_BOTTOMLEFT;

+           $this->pChartObject->drawText($X,$Y,$Name,$LabelOptions);

+          }

+         elseif ( $this->Labels["Type"] == LABEL_CLASSIC )

+          {

+           $LabelOptions["Align"]         = TEXT_ALIGN_TOPMIDDLE;

+           $LabelOptions["DrawBox"]       = TRUE;

+           $LabelOptions["BoxAlpha"]      = 50;

+           $LabelOptions["BorderOffset"]  = 4;

+           $LabelOptions["RoundedRadius"] = 3;

+           $LabelOptions["BoxRounded"]    = TRUE;

+           $LabelOptions["NoShadow"]      = TRUE;

+

+           $this->pChartObject->drawText($X,$Y+$Size+$TextPadding,$Name,$LabelOptions);

+          }

+        }

+      }

+

+     /* Draw the vectors */

+     if ( $DrawVectors )

+      {

+       foreach($this->Data as $Key => $Settings)

+        {

+         $X1 = $Settings["X"];

+         $Y1 = $Settings["Y"];

+

+         if ( isset($Settings["Vectors"]) && $Settings["Type"] != NODE_TYPE_CENTRAL )

+          {

+           foreach($Settings["Vectors"] as $ID => $Vector)

+            {

+             $Type  = $Vector["Type"];

+             $Force = $Vector["Force"];

+             $Angle = $Vector["Angle"];

+             $Factor = $Type == "A" ? $this->MagneticForceA : $this->MagneticForceR;

+             $Color  = $Type == "A" ? array("FillR"=>255,"FillG"=>0,"FillB"=>0) : array("FillR"=>0,"FillG"=>255,"FillB"=>0);

+

+             $X2 = cos(deg2rad($Angle)) * $Force * $Factor + $X1;

+             $Y2 = sin(deg2rad($Angle)) * $Force * $Factor + $Y1;

+

+             $this->pChartObject->drawArrow($X1,$Y1,$X2,$Y2,$Color);

+            }

+          }

+        }

+      }

+

+     return(array("Pass"=>$Jobs,"Conflicts"=>$Conflicts));

+    }

+

+   /* Return the distance between two points */

+   function getDistance($X1,$Y1,$X2,$Y2)

+    { return (sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1))); }

+

+   /* Return the angle made by a line and the X axis */

+   function getAngle($X1,$Y1,$X2,$Y2)

+    {

+     $Opposite = $Y2 - $Y1; $Adjacent = $X2 - $X1;$Angle = rad2deg(atan2($Opposite,$Adjacent));

+     if ($Angle > 0) { return($Angle); } else { return(360-abs($Angle)); }

+    }

+

+   function intersect($X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4)

+    {

+     $A = (($X3 * $Y4 - $X4 * $Y3) * ($X1 - $X2) - ($X1 * $Y2 - $X2 * $Y1) * ($X3 - $X4));

+     $B = (($Y1 - $Y2) * ($X3 - $X4) - ($Y3 - $Y4) * ($X1 - $X2));

+

+     if ( $B == 0 ) { return(FALSE); }

+     $Xi = $A / $B;

+

+     $C = ($X1 - $X2);

+     if ( $C == 0 ) { return(FALSE); }

+     $Yi = $Xi * (($Y1 - $Y2)/$C) + (($X1 * $Y2 - $X2 * $Y1)/$C);

+

+     if ( $Xi >= min($X1,$X2) && $Xi >= min($X3,$X4) && $Xi <= max($X1,$X2) && $Xi <= max($X3,$X4))

+      {

+       if ( $Yi >= min($Y1,$Y2) && $Yi >= min($Y3,$Y4) && $Yi <= max($Y1,$Y2) && $Yi <= max($Y3,$Y4))

+        { return(TRUE); }

+      }

+

+      return(FALSE);   

+    }

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/class/pStock.class.php
@@ -1,1 +1,184 @@
-
+<?php

+ /*

+     pStock - class to draw stock charts

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ define("STOCK_MISSING_SERIE"	, 180001);

+

+ /* pStock class definition */

+ class pStock

+  {

+   var $pChartObject;

+   var $pDataObject;

+

+   /* Class creator */

+   function pStock($pChartObject,$pDataObject)

+    {

+     $this->pChartObject = $pChartObject;

+     $this->pDataObject  = $pDataObject;

+    }

+

+   /* Draw a stock chart */

+   function drawStockChart($Format="")

+    {

+     $SerieOpen		= isset($Format["SerieOpen"]) ? $Format["SerieOpen"] : "Open";

+     $SerieClose	= isset($Format["SerieClose"]) ? $Format["SerieClose"] : "Close";

+     $SerieMin		= isset($Format["SerieMin"]) ? $Format["SerieMin"] : "Min";

+     $SerieMax		= isset($Format["SerieMax"]) ? $Format["SerieMax"] : "Max";

+     $LineWidth		= isset($Format["LineWidth"]) ? $Format["LineWidth"] : 1;

+     $LineR		= isset($Format["LineR"]) ? $Format["LineR"] : 0;

+     $LineG		= isset($Format["LineG"]) ? $Format["LineG"] : 0;

+     $LineB		= isset($Format["LineB"]) ? $Format["LineB"] : 0;

+     $LineAlpha		= isset($Format["LineAlpha"]) ? $Format["LineAlpha"] : 100;

+     $ExtremityWidth	= isset($Format["ExtremityWidth"]) ? $Format["ExtremityWidth"] : 1;

+     $ExtremityLength	= isset($Format["ExtremityLength"]) ? $Format["ExtremityLength"] : 3;

+     $ExtremityR	= isset($Format["ExtremityR"]) ? $Format["ExtremityR"] : 0;

+     $ExtremityG	= isset($Format["ExtremityG"]) ? $Format["ExtremityG"] : 0;

+     $ExtremityB	= isset($Format["ExtremityB"]) ? $Format["ExtremityB"] : 0;

+     $ExtremityAlpha	= isset($Format["ExtremityAlpha"]) ? $Format["ExtremityAlpha"] : 100;

+     $BoxWidth		= isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 8;

+     $BoxUpR		= isset($Format["BoxUpR"]) ? $Format["BoxUpR"] : 188;

+     $BoxUpG		= isset($Format["BoxUpG"]) ? $Format["BoxUpG"] : 224;

+     $BoxUpB		= isset($Format["BoxUpB"]) ? $Format["BoxUpB"] : 46;

+     $BoxUpAlpha	= isset($Format["BoxUpAlpha"]) ? $Format["BoxUpAlpha"] : 100;

+     $BoxUpSurrounding	= isset($Format["BoxUpSurrounding"]) ? $Format["BoxUpSurrounding"] : NULL;

+     $BoxUpBorderR	= isset($Format["BoxUpBorderR"]) ? $Format["BoxUpBorderR"] : $BoxUpR-20;

+     $BoxUpBorderG	= isset($Format["BoxUpBorderG"]) ? $Format["BoxUpBorderG"] : $BoxUpG-20;

+     $BoxUpBorderB	= isset($Format["BoxUpBorderB"]) ? $Format["BoxUpBorderB"] : $BoxUpB-20;

+     $BoxUpBorderAlpha	= isset($Format["BoxUpBorderAlpha"]) ? $Format["BoxUpBorderAlpha"] : 100;

+     $BoxDownR		= isset($Format["BoxDownR"]) ? $Format["BoxDownR"] : 224;

+     $BoxDownG		= isset($Format["BoxDownG"]) ? $Format["BoxDownG"] : 100;

+     $BoxDownB		= isset($Format["BoxDownB"]) ? $Format["BoxDownB"] : 46;

+     $BoxDownAlpha	= isset($Format["BoxDownAlpha"]) ? $Format["BoxDownAlpha"] : 100;

+     $BoxDownSurrounding= isset($Format["BoxDownSurrounding"]) ? $Format["BoxDownSurrounding"] : NULL;

+     $BoxDownBorderR	= isset($Format["BoxDownBorderR"]) ? $Format["BoxDownBorderR"] : $BoxDownR-20;

+     $BoxDownBorderG	= isset($Format["BoxDownBorderG"]) ? $Format["BoxDownBorderG"] : $BoxDownG-20;

+     $BoxDownBorderB	= isset($Format["BoxDownBorderB"]) ? $Format["BoxDownBorderB"] : $BoxDownB-20;

+     $BoxDownBorderAlpha= isset($Format["BoxDownBorderAlpha"]) ? $Format["BoxDownBorderAlpha"] : 100;

+     $ShadowOnBoxesOnly	= isset($Format["ShadowOnBoxesOnly"]) ? $Format["ShadowOnBoxesOnly"] : TRUE;

+

+     /* Data Processing */

+     $Data    = $this->pDataObject->getData();

+     $Palette = $this->pDataObject->getPalette();

+

+     if ( $BoxUpSurrounding != NULL )	{ $BoxUpBorderR = $BoxUpR + $BoxUpSurrounding; $BoxUpBorderG = $BoxUpG + $BoxUpSurrounding; $BoxUpBorderB = $BoxUpB + $BoxUpSurrounding; }

+     if ( $BoxDownSurrounding != NULL )	{ $BoxDownBorderR = $BoxDownR + $BoxDownSurrounding; $BoxDownBorderG = $BoxDownG + $BoxDownSurrounding; $BoxDownBorderB = $BoxDownB + $BoxDownSurrounding; }

+

+     if ( $LineWidth != 1 ) { $LineOffset = $LineWidth / 2; }

+     $BoxOffset = $BoxWidth / 2;

+

+     $Data = $this->pChartObject->DataSet->getData();

+     list($XMargin,$XDivs) = $this->pChartObject->scaleGetXSettings();

+

+     if ( !isset($Data["Series"][$SerieOpen]) || !isset($Data["Series"][$SerieClose]) || !isset($Data["Series"][$SerieMin]) || !isset($Data["Series"][$SerieMax]) )

+      return(STOCK_MISSING_SERIE);

+

+     $Plots = "";

+     foreach($Data["Series"][$SerieOpen]["Data"] as $Key => $Value)

+      {

+       if ( isset($Data["Series"][$SerieClose]["Data"][$Key]) || isset($Data["Series"][$SerieMin]["Data"][$Key]) || isset($Data["Series"][$SerieMax]["Data"][$Key]) )

+        $Plots[] = array($Value,$Data["Series"][$SerieClose]["Data"][$Key],$Data["Series"][$SerieMin]["Data"][$Key],$Data["Series"][$SerieMax]["Data"][$Key]);

+      }

+

+     $AxisID	= $Data["Series"][$SerieOpen]["Axis"];

+     $Mode	= $Data["Axis"][$AxisID]["Display"];

+     $Format	= $Data["Axis"][$AxisID]["Format"];

+     $Unit	= $Data["Axis"][$AxisID]["Unit"];

+

+     $YZero	= $this->pChartObject->scaleComputeY(0,array("AxisID"=>$AxisID));

+     $XStep	= ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs;

+

+     $X = $this->pChartObject->GraphAreaX1 + $XMargin;

+     $Y = $this->pChartObject->GraphAreaY1 + $XMargin;

+

+     $LineSettings	= array("R"=>$LineR,"G"=>$LineG,"B"=>$LineB,"Alpha"=>$LineAlpha);

+     $ExtremitySettings	= array("R"=>$ExtremityR,"G"=>$ExtremityG,"B"=>$ExtremityB,"Alpha"=>$ExtremityAlpha);

+     $BoxUpSettings	= array("R"=>$BoxUpR,"G"=>$BoxUpG,"B"=>$BoxUpB,"Alpha"=>$BoxUpAlpha,"BorderR"=>$BoxUpBorderR,"BorderG"=>$BoxUpBorderG,"BorderB"=>$BoxUpBorderB,"BorderAlpha"=>$BoxUpBorderAlpha);

+     $BoxDownSettings	= array("R"=>$BoxDownR,"G"=>$BoxDownG,"B"=>$BoxDownB,"Alpha"=>$BoxDownAlpha,"BorderR"=>$BoxDownBorderR,"BorderG"=>$BoxDownBorderG,"BorderB"=>$BoxDownBorderB,"BorderAlpha"=>$BoxDownBorderAlpha);

+

+     foreach($Plots as $Key =>$Points)

+      {

+       $PosArray = $this->pChartObject->scaleComputeY($Points,array("AxisID"=>$AxisID));

+

+       if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+        {

+         if ( $YZero > $this->pChartObject->GraphAreaY2-1 ) { $YZero = $this->pChartObject->GraphAreaY2-1; }

+         if ( $YZero < $this->pChartObject->GraphAreaY1+1 ) { $YZero = $this->pChartObject->GraphAreaY1+1; }

+

+         if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs; }

+

+         if ( $ShadowOnBoxesOnly ) { $RestoreShadow = $this->pChartObject->Shadow; $this->pChartObject->Shadow = FALSE; }

+

+         if ( $LineWidth == 1 )

+          $this->pChartObject->drawLine($X,$PosArray[2],$X,$PosArray[3],$LineSettings);

+         else

+          $this->pChartObject->drawFilledRectangle($X-$LineOffset,$PosArray[2],$X+$LineOffset,$PosArray[3],$LineSettings);

+

+         if ( $ExtremityWidth == 1 )

+          {

+           $this->pChartObject->drawLine($X-$ExtremityLength,$PosArray[2],$X+$ExtremityLength,$PosArray[2],$ExtremitySettings);

+           $this->pChartObject->drawLine($X-$ExtremityLength,$PosArray[3],$X+$ExtremityLength,$PosArray[3],$ExtremitySettings);

+          }

+         else

+          {

+           $this->pChartObject->drawFilledRectangle($X-$ExtremityLength,$PosArray[2],$X+$ExtremityLength,$PosArray[2]-$ExtremityWidth,$ExtremitySettings);

+           $this->pChartObject->drawFilledRectangle($X-$ExtremityLength,$PosArray[3],$X+$ExtremityLength,$PosArray[3]+$ExtremityWidth,$ExtremitySettings);

+          }

+

+         if ( $ShadowOnBoxesOnly ) { $this->pChartObject->Shadow = $RestoreShadow; }

+

+         if ( $PosArray[0] > $PosArray[1] )

+          $this->pChartObject->drawFilledRectangle($X-$BoxOffset,$PosArray[0],$X+$BoxOffset,$PosArray[1],$BoxUpSettings);

+         else

+          $this->pChartObject->drawFilledRectangle($X-$BoxOffset,$PosArray[0],$X+$BoxOffset,$PosArray[1],$BoxDownSettings);

+

+         $X = $X + $XStep;

+        }

+       elseif ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM )

+        {

+         if ( $YZero > $this->pChartObject->GraphAreaX2-1 ) { $YZero = $this->pChartObject->GraphAreaX2-1; }

+         if ( $YZero < $this->pChartObject->GraphAreaX1+1 ) { $YZero = $this->pChartObject->GraphAreaX1+1; }

+

+         if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1-$XMargin*2)/$XDivs; }

+

+         if ( $LineWidth == 1 )

+          $this->pChartObject->drawLine($PosArray[2],$Y,$PosArray[3],$Y,$LineSettings);

+         else

+          $this->pChartObject->drawFilledRectangle($PosArray[2],$Y-$LineOffset,$PosArray[3],$Y+$LineOffset,$LineSettings);

+

+         if ( $ShadowOnBoxesOnly ) { $RestoreShadow = $this->pChartObject->Shadow; $this->pChartObject->Shadow = FALSE; }

+

+         if ( $ExtremityWidth == 1 )

+          {

+           $this->pChartObject->drawLine($PosArray[2],$Y-$ExtremityLength,$PosArray[2],$Y+$ExtremityLength,$ExtremitySettings);

+           $this->pChartObject->drawLine($PosArray[3],$Y-$ExtremityLength,$PosArray[3],$Y+$ExtremityLength,$ExtremitySettings);

+          }

+         else

+          {

+           $this->pChartObject->drawFilledRectangle($PosArray[2],$Y-$ExtremityLength,$PosArray[2]-$ExtremityWidth,$Y+$ExtremityLength,$ExtremitySettings);

+           $this->pChartObject->drawFilledRectangle($PosArray[3],$Y-$ExtremityLength,$PosArray[3]+$ExtremityWidth,$Y+$ExtremityLength,$ExtremitySettings);

+          }

+

+         if ( $ShadowOnBoxesOnly ) { $this->pChartObject->Shadow = $RestoreShadow; }

+

+         if ( $PosArray[0] < $PosArray[1] )

+          $this->pChartObject->drawFilledRectangle($PosArray[0],$Y-$BoxOffset,$PosArray[1],$Y+$BoxOffset,$BoxUpSettings);

+         else

+          $this->pChartObject->drawFilledRectangle($PosArray[0],$Y-$BoxOffset,$PosArray[1],$Y+$BoxOffset,$BoxDownSettings);

+

+         $Y = $Y + $XStep;

+        }

+      }

+    }

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/data/128B.db
@@ -1,1 +1,107 @@
-
+0;32;11011001100

+1;33;11001101100

+2;34;11001100110

+3;35;10010011000

+4;36;10010001100

+5;37;10001001100

+6;38;10011001000

+7;39;10011000100

+8;40;10001100100

+9;41;11001001000

+10;42;11001000100

+11;43;11000100100

+12;44;10110011100

+13;45;10011011100

+14;46;10011001110

+15;47;10111001100

+16;48;10011101100

+17;49;10011100110

+18;50;11001110010

+19;51;11001011100

+20;52;11001001110

+21;53;11011100100

+22;54;11001110100

+23;55;11101101110

+24;56;11101001100

+25;57;11100101100

+26;58;11100100110

+27;59;11101100100

+28;60;11100110100

+29;61;11100110010

+30;62;11011011000

+31;63;11011000110

+32;64;11000110110

+33;65;10100011000

+34;66;10001011000

+35;67;10001000110

+36;68;10110001000

+37;69;10001101000

+38;70;10001100010

+39;71;11010001000

+40;72;11000101000

+41;73;11000100010

+42;74;10110111000

+43;75;10110001110

+44;76;10001101110

+45;77;10111011000

+46;78;10111000110

+47;79;10001110110

+48;80;11101110110

+49;81;11010001110

+50;82;11000101110

+51;83;11011101000

+52;84;11011100010

+53;85;11011101110

+54;86;11101011000

+55;87;11101000110

+56;88;11100010110

+57;89;11101101000

+58;90;11101100010

+59;91;11100011010

+60;92;11101111010

+61;93;11001000010

+62;94;11110001010

+63;95;10100110000

+64;96;10100001100

+65;97;10010110000

+66;98;10010000110

+67;99;10000101100

+68;100;10000100110

+69;101;10110010000

+70;102;10110000100

+71;103;10011010000

+72;104;10011000010

+73;105;10000110100

+74;106;10000110010

+75;107;11000010010

+76;108;11001010000

+77;109;11110111010

+78;110;11000010100

+79;111;10001111010

+80;112;10100111100

+81;113;10010111100

+82;114;10010011110

+83;115;10111100100

+84;116;10011110100

+85;117;10011110010

+86;118;11110100100

+87;119;11110010100

+88;120;11110010010

+89;121;11011011110

+90;122;11011110110

+91;123;11110110110

+92;124;10101111000

+93;125;10100011110

+94;126;10001011110

+95;200;10111101000

+96;201;10111100010

+97;202;11110101000

+98;203;11110100010

+99;204;10111011110

+100;205;10111101110

+101;206;11101011110

+102;207;11110101110

+103;208;11010000100

+104;209;11010010000

+105;210;11010011100

+106;211;1100011101011

--- /dev/null
+++ b/lib/pChart2.1.0/data/39.db
@@ -1,1 +1,44 @@
-
+0;101001101101

+1;110100101011

+2;101100101011

+3;110110010101

+4;101001101011

+5;110100110101

+6;101100110101

+7;101001011011

+8;110100101101

+9;101100101101

+A;110101001011

+B;101101001011

+C;110110100101

+D;101011001011

+E;110101100101

+F;101101100101

+G;101010011011

+H;110101001101

+I;101101001101

+J;101011001101

+K;110101010011

+L;101101010011

+M;110110101001

+N;101011010011

+O;110101101001

+P;101101101001

+Q;101010110011

+R;110101011001

+S;101101011001

+T;101011011001

+U;110010101011

+V;100110101011

+W;110011010101

+X;100101101011

+Y;110010110101

+Z;100110110101

+-;100101011011

+.;110010101101

+ ;100110101101

+$;100100100101

+/;100100101001

++;100101001001

+%;101001001001

+*;100101101101

--- /dev/null
+++ b/lib/pChart2.1.0/examples/buildAll.cmd
@@ -1,1 +1,51 @@
-
+ECHO OFF

+setlocal ENABLEDELAYEDEXPANSION

+

+CLS

+ECHO.






+ECHO.

+

+php -v 1>NUL 2>NUL

+IF %ERRORLEVEL% == 0 GOTO getVersion

+GOTO noPHP

+

+:getVersion

+FOR /F "tokens=1,2 delims= " %%G IN ('php -v') DO (

+ IF %%G==PHP SET PHPVersion=%%H

+ )

+

+:render

+ECHO     The PHP binaries (%PHPVersion%) have been located in your system PATH

+ECHO.

+ECHO. >resources\errors.log

+

+REM SET /P Var="   Progress : "<NUL

+

+FOR %%f IN (*.*) DO (

+   set t=%%f

+   if !t:~-3! == php (


+     php -q "%~dp0%%f" 1>NUL 2>>resources\errors.log

+    )

+)

+

+ECHO.

+ECHO.

+ECHO     All the example have been rendered in the following folder :

+ECHO.

+ECHO       %~dp0pictures\

+GOTO end

+

+:noPHP

+

+ECHO     The PHP binaries can't be found. We strongly advise you to put it in

+ECHO     the system path variable.

+ECHO.

+ECHO     Examples rendering has been aborded.

+:end

+PAUSE >NUL

--- /dev/null
+++ b/lib/pChart2.1.0/examples/delayedLoader/delayedLoading.js
@@ -1,1 +1,229 @@
+ /*

+     delayedLoader - JS to delay out of sight pictures rendering

+

+     Version     : 2.0.2

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 10/12/10

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ var PictureCache  = new Array();

+ var PictureCount  = 0;

+ var WaitPicture   = "wait.gif";

+ var DivClassName  = "pChart";

+ var DefaultWidth  = 70;

+ var DefaultHeight = 230;

+ var DefaultAlt    = "pChart rendered picture";

+

+

+ /* Do the DOM document processing */

+ function loaderInit()

+  {

+   WindowSize   = getWindowSize();

+   WindowHeight = WindowSize[1];

+   Offset       = getScrollXY();

+   HeightOffset = Offset[1];

+

+   /* Enumerate the tags */

+   Links = document.getElementsByTagName("a");   

+   for (i = 0; i < Links.length; i++)   

+    {   

+     className = Links[i].className;   

+

+     if ( className == DivClassName )   

+      {   

+       ObjectWidth  = Links[i].getAttribute("data-pchart-width");

+       ObjectHeight = Links[i].getAttribute("data-pchart-height");

+       ObjectID     = Links[i].id;

+       ObjectTop    = Links[i].offsetTop;

+       ObjectURL    = Links[i].href;

+       ObjectAlt    = Links[i].getAttribute("data-pchart-alt");

+

+       if ( ObjectWidth == null )  { ObjectWidth  = DefaultWidth; }

+       if ( ObjectHeight == null ) { ObjectHeight = DefaultHeight; }

+       if ( ObjectAlt == null )    { ObjectAlt    = DefaultAlt; }

+

+       if (ObjectID == "") { ObjectID = "pChart-"+i; Links[i].id = ObjectID; }

+

+       PictureCache[PictureCount]    = new Array();

+       PictureCache[PictureCount][0] = ObjectID;

+       PictureCache[PictureCount][1] = ObjectTop;

+       PictureCache[PictureCount][2] = ObjectURL;

+       PictureCache[PictureCount][3] = ObjectAlt;

+       PictureCache[PictureCount][4] = ObjectWidth;

+       PictureCache[PictureCount][5] = ObjectHeight;

+

+       PictureCount++;

+      }   

+    }   

+

+   /* Replace the <A> tags by <DIV> ones and attach the loader */

+   for(i=0;i<PictureCount;i++)

+    {

+     ATag    = document.getElementById(PictureCache[i][0]);

+     DivTag  = document.createElement("div");

+     DivID   = "pChart-Div"+i; PictureCache[i][0] = DivID;

+

+     DivTag.setAttribute("id", DivID);

+     DivTag.style.width  = PictureCache[i][4];

+     DivTag.style.height = PictureCache[i][5];

+     DivTag.style.backgroundColor = "#E0E0E0";

+

+     DivTag2  = ATag.parentNode.replaceChild(DivTag, ATag);

+

+     DivTop = DivTag.offsetTop;

+     PictureCache[i][1] = DivTop;

+

+     changeOpac(50, i);

+     changeContent("<img src='"+WaitPicture+"' width=24 height=24 alt=''/>",i);

+

+     if ( HeightOffset + WindowHeight > PictureCache[i][1] ) { triggerVisible(i); }

+    }

+  }

+

+ /* Replace the contents of the delayed loading DIV */

+ function changeContent(html, id)

+  { DivID = PictureCache[id][0]; document.getElementById(DivID).innerHTML = html; }

+

+ /* Trigger the picture rendering when the pChart DIV became visible */

+ function triggerVisible(PictureID)

+  {

+   if ( !PictureCache[PictureID][6] == true )

+    {

+     PictureCache[PictureID][6] = true;

+     ajaxRender(PictureCache[PictureID][2],PictureID);

+    }

+  }

+

+ /* Catch the navigator window scrolling event */

+ function scrollEvent()

+  {

+   WindowSize   = getWindowSize();

+   WindowHeight = WindowSize[1];

+   Offset       = getScrollXY();

+   HeightOffset = Offset[1];

+

+   for(i=0;i<=PictureCount-1;i++) { if ( HeightOffset + WindowHeight > PictureCache[i][1] ) { triggerVisible(i); } }

+  }

+

+ /* Cross browser X/Y window offset gatherer */

+ function getScrollXY()

+  {

+   var scrOfX = 0, scrOfY = 0;

+

+   if( typeof( window.pageYOffset ) == 'number' )

+    { scrOfY = window.pageYOffset; scrOfX = window.pageXOffset; }

+   else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) )

+    { scrOfY = document.body.scrollTop; scrOfX = document.body.scrollLeft; }

+   else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) )

+    { scrOfY = document.documentElement.scrollTop; scrOfX = document.documentElement.scrollLeft; }

+

+   return [ scrOfX, scrOfY ];

+  }

+

+ /* Cross browser X/Y window size gatherer */

+ function getWindowSize()

+  {

+   var myWidth = 0, myHeight = 0;

+

+   if( typeof( window.innerWidth ) == 'number' )

+    { myWidth = window.innerWidth; myHeight = window.innerHeight; }

+   else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )

+    { myWidth = document.documentElement.clientWidth; myHeight = document.documentElement.clientHeight; }

+   else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )

+    { myWidth = document.body.clientWidth; myHeight = document.body.clientHeight; }

+

+   return [ myWidth, myHeight ];

+  }

+

+ /* Cross browser alpha transparency changer */

+ function changeOpac(opacity, id)   

+  {

+   DivID = PictureCache[id][0];

+

+   var object = document.getElementById(DivID).style;   

+   object.opacity = (opacity / 100);   

+   object.MozOpacity = (opacity / 100);   

+   object.KhtmlOpacity = (opacity / 100);   

+   object.filter = "alpha(opacity=" + opacity + ")";   

+  }   

+

+ /* Shade in-out function */

+ function opacity(id, opacStart, opacEnd, millisec)

+  {

+   var speed = Math.round(millisec / 100);

+   var timer = 0;

+

+   if(opacStart > opacEnd)

+    {

+     for(i = opacStart; i >= opacEnd; i--)

+      {

+       setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));

+       timer++;

+      }

+    }

+   else if(opacStart < opacEnd)

+    {

+     for(i = opacStart; i <= opacEnd; i++)

+      {

+       setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));

+       timer++;

+      }

+    }

+  }

+

+ /* Start the loader */

+ function StartFade(PictureID)

+  {

+   Loader     = new Image();

+   URL        = PictureCache[PictureID][2];

+   Loader.src = URL;   

+   setTimeout("CheckLoadingStatus("+PictureID+")", 200);   

+  }

+

+ /* check the picture loading status */

+ function CheckLoadingStatus(PictureID)   

+  {

+   DivID = PictureCache[PictureID][0];

+   URL   = PictureCache[PictureID][2];

+   Alt   = PictureCache[PictureID][3];

+

+   if ( Loader.complete == true )   

+    {

+     changeOpac(0, PictureID);

+     HTMLResult = "<center><img src='" + URL + "' alt='"+Alt+"'/></center>";

+     document.getElementById(DivID).innerHTML = HTMLResult;

+

+     opacity(PictureID,0,100,100);

+    }

+   else  

+    setTimeout("CheckLoadingStatus("+PictureID+")", 200);   

+  }   

+

+ /* Compute the pChart picture in background */

+ function ajaxRender(URL,PictureID)

+  {

+   var xmlhttp=false;   

+   /*@cc_on @*/  

+   /*@if (@_jscript_version >= 5)  

+    try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } }  

+   @end @*/  

+  

+   if (!xmlhttp && typeof XMLHttpRequest!='undefined')   

+    { try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp=false; } }   

+  

+   if (!xmlhttp && window.createRequest)   

+    { try { xmlhttp = window.createRequest(); } catch (e) { xmlhttp=false; } }   

+  

+   xmlhttp.open("GET", URL,true);

+

+   xmlhttp.onreadystatechange=function()

+    { if (xmlhttp.readyState==4) { StartFade(PictureID); } }   

+   xmlhttp.send(null)   

+  }

 

--- /dev/null
+++ b/lib/pChart2.1.0/examples/delayedLoader/draw.php
@@ -1,1 +1,34 @@
-
+<?php   

+ if ( !isset($_GET["Seed"]) )

+  { $Seed = "Unknown"; }

+ else

+  { $Seed = $_GET["Seed"]; }

+

+ /* pChart library inclusions */

+ include("../../class/pDraw.class.php");

+ include("../../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>220,"StartG"=>220,"StartB"=>220,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>220,"StartG"=>220,"StartB"=>220,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>50));

+ $RectangleSettings = array("R"=>180,"G"=>180,"B"=>180,"Alpha"=>100);

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>150,"G"=>150,"B"=>150));

+

+ /* Write the title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../../fonts/advent_light.ttf","FontSize"=>40));

+ $myPicture->drawText(130,130,"Delayed loading script",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the seed # */ 

+ $myPicture->setFontProperties(array("FontName"=>"../../fonts/advent_light.ttf","FontSize"=>10));

+ $myPicture->drawText(130,140,"Seed # : ".$Seed,array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Draw a bezier curve */ 

+ $BezierSettings = array("R"=>255,"G"=>255,"B"=>255,"Ticks"=>4,"DrawArrow"=>TRUE,"ArrowTwoHeads"=>TRUE);

+ $myPicture->drawBezier(360,170,670,120,430,100,560,190,$BezierSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("draw.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/delayedLoader/index.php
@@ -1,1 +1,88 @@
-
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

+<head>

+ <script src='delayedLoading.js' type="text/javascript"></script>

+ <title>pChart 2.x - Delayed loading</title>

+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>

+ <style>

+  html       { height: 100%; }

+  body       { background-color: #F0F0F0; font-family: tahoma; font-size: 14px; height: 100%;}

+  td  	     { font-family: tahoma; font-size: 11px; }

+  div.txt    { font-family: tahoma; font-size: 11px; width: 660px; padding: 15px; }

+  a.smallLink:link    { text-decoration: none; color: #6A6A6A; }

+  a.smallLink:visited { text-decoration: none; color: #6A6A6A; }

+  a.smallLink:hover   { text-decoration: underline; color: #6A6A6A; }

+  a.pChart { text-decoration: none; color: #6A6A6A; }

+ </style>

+</head>

+<body onscroll="scrollEvent();" onload="loaderInit();">

+

+ <table style='border: 2px solid #FFFFFF;'><tr><td>

+  <div style='font-size: 11px; padding: 2px; color: #FFFFFF; background-color: #666666; border-bottom: 3px solid #484848; width: 361px;'>&nbsp;Navigation</div>

+  <table style='padding: 1px; background-color: #E0E0E0; border: 1px solid #D0D0D0; border-top: 1px solid #FFFFFF;'><tr>

+   <td width=16><img src='../resources/application_view_tile.png' width=16 height=16 alt=''/></td>

+   <td width=95>&nbsp;<a class=smallLink href='../'>Examples</a></td>

+   <td width=16><img src='../resources/application_view_list.png' width=16 height=16 alt=''/></td>

+   <td width=95>&nbsp;<a class=smallLink href='../sandbox/'>Sandbox</a></td>

+   <td width=16><img src='../resources/application_view_list.png' width=16 height=16 alt=''/></td>

+   <td width=95>&nbsp;<b>Delayed loader</b></td>

+  </tr></table>

+ </td></tr></table>

+

+ <br/>

+

+ <div class=txt>

+  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna

+  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint

+  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ </div>

+ <a class='pChart' href='draw.php?Seed=1' data-pchart-alt='Picture1' data-pchart-width='700' data-pchart-height='230'>Picture 1</a>

+ <div class=txt>

+  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna

+  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint

+  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ </div>

+ <a class='pChart' href='draw.php?Seed=2' data-pchart-alt='Picture2'>Picture 2</a>

+ <div class=txt>

+  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna

+  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint

+  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ </div>

+ <a class='pChart' href='draw.php?Seed=3' data-pchart-alt='Picture3'>Picture 3</a>

+ <div class=txt>

+  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna

+  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint

+  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ </div>

+ <a class='pChart' href='draw.php?Seed=4' data-pchart-alt='Picture4'>Picture 4</a>

+ <div class=txt>

+  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna

+  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint

+  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ </div>

+ <a class='pChart' href='draw.php?Seed=5' data-pchart-alt='Picture5'>Picture 5</a>

+ <div class=txt>

+  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna

+  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint

+  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ </div>

+ <a class='pChart' href='draw.php?Seed=6' data-pchart-alt='Picture6'>Picture 6</a>

+ <div class=txt>

+  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna

+  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint

+  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ </div>

+ <a class='pChart' href='draw.php?Seed=7' data-pchart-alt='Picture7'>Picture 7</a>

+ <div class=txt>

+  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna

+  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint

+  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ </div>

+</body>

 Binary files /dev/null and b/lib/pChart2.1.0/examples/delayedLoader/wait.gif differ
--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.addRandomValues.php
@@ -1,1 +1,56 @@
-
+<?php   

+ /* CAT:Misc */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pData object with some random values*/

+ $MyData = new pData();  

+ $MyData->addRandomValues("Probe 1",array("Values"=>30,"Min"=>0,"Max"=>4));

+ $MyData->addRandomValues("Probe 2",array("Values"=>30,"Min"=>6,"Max"=>10));

+ $MyData->addRandomValues("Probe 3",array("Values"=>30,"Min"=>12,"Max"=>16));

+ $MyData->addRandomValues("Probe 4",array("Values"=>30,"Min"=>18,"Max"=>22));

+ $MyData->setAxisName(0,"Probes");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Create a solid background */

+ $Settings = array("R"=>179, "G"=>217, "B"=>91, "Dash"=>1, "DashR"=>199, "DashG"=>237, "DashB"=>111);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Do a gradient overlay */

+ $Settings = array("StartR"=>194, "StartG"=>231, "StartB"=>44, "EndR"=>43, "EndG"=>107, "EndB"=>58, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"addRandomValues() :: assess your scales",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Draw the scale */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->setGraphArea(50,60,670,190);

+ $myPicture->drawFilledRectangle(50,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("CycleBackground"=>TRUE,"LabelSkip"=>4,"DrawSubTicks"=>TRUE));

+

+ /* Graph title */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawText(50,52,"Magnetic noise",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMLEFT));

+

+ /* Draw the data series */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawSplineChart();

+ $myPicture->setShadow(FALSE);

+

+ /* Write the legend */

+ $myPicture->drawLegend(475,50,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.addRandomValues.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.barcode.php
@@ -1,1 +1,78 @@
-
+<?php   

+ /* CAT:Barcode */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pBarcode39.class.php");

+ include("../class/pBarcode128.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(600,310);

+ $myPicture->drawFilledRectangle(0,0,600,310,array("R"=>240,"G"=>240,"B"=>240));

+

+ /* Draw the rounded box */

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>30));  

+ $Settings = array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0);

+ $myPicture->drawRoundedFilledRectangle(10,10,590,300,10,$Settings);

+

+ /* Draw the cell divisions */

+ $myPicture->setShadow(FALSE);  

+ $Settings = array("R"=>0,"G"=>0,"B"=>0);

+ $myPicture->drawLine(10,110,590,110,$Settings);

+ $myPicture->drawLine(200,10,200,110,$Settings);

+ $myPicture->drawLine(400,10,400,110,$Settings);

+ $myPicture->drawLine(10,160,590,160,$Settings);

+ $myPicture->drawLine(220,160,220,200,$Settings);

+ $myPicture->drawLine(320,160,320,200,$Settings);

+ $myPicture->drawLine(10,200,590,200,$Settings);

+ $myPicture->drawLine(400,220,400,300,$Settings);

+

+ /* Write the fields labels */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10)); 

+ $Settings = array("R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPLEFT);

+ $myPicture->drawText(20,20,"FROM",$Settings); 

+ $myPicture->drawText(210,20,"TO",$Settings); 

+ $myPicture->drawText(20,120,"ACCT.\r\nNUMBER",$Settings); 

+ $myPicture->drawText(20,166,"QUANTITY",$Settings); 

+ $myPicture->drawText(230,166,"SHIPMENT CODE",$Settings); 

+ $myPicture->drawText(330,166,"SENDER CODE",$Settings); 

+ $myPicture->drawText(410,220,"MFG DATE",$Settings); 

+ $myPicture->drawText(410,260,"NET WEIGTH",$Settings); 

+

+ /* Filling the fields values */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>16)); 

+ $myPicture->drawText(70,20,"BEBEER INC\r\n342, MAIN STREET\r\n33000 BORDEAUX\r\nFRANCE",$Settings); 

+ $myPicture->drawText(250,20,"MUSTAFA'S BAR\r\n18, CAPITOL STREET\r\n31000 TOULOUSE\r\nFRANCE",$Settings); 

+

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>35)); 

+ $myPicture->drawText(100,120,"2342355552340",$Settings); 

+

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>20)); 

+ $Settings = array("R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPRIGHT);

+ $myPicture->drawText(210,180,"75 CANS",$Settings); 

+ $myPicture->drawText(310,180,"TLSE",$Settings); 

+ $myPicture->drawText(580,180,"WAREHOUSE#SLOT#B15",$Settings); 

+

+ $Settings = array("R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPLEFT);

+ $myPicture->drawText(410,236,"06/06/2010",$Settings); 

+ $myPicture->drawText(410,276,"12.340 Kg",$Settings); 

+

+ /* Create the barcode 39 object */ 

+ $Barcode39 = new pBarcode39("../"); 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6)); 

+ $Settings = array("ShowLegend"=>TRUE,"Height"=>55,"DrawArea"=>TRUE,"DrawArea"=>FALSE); 

+ $Barcode39->draw($myPicture,"12250000234502",30,220,$Settings); 

+

+ $Settings = array("ShowLegend"=>TRUE,"Height"=>14,"DrawArea"=>TRUE,"DrawArea"=>FALSE); 

+ $Barcode39->draw($myPicture,"75 cans",260,220,$Settings); 

+ $Barcode39->draw($myPicture,"06062010",260,260,$Settings); 

+

+ /* Create the barcode 128 object */ 

+ $Barcode128 = new pBarcode128("../"); 

+ $Settings = array("ShowLegend"=>TRUE,"Height"=>65,"DrawArea"=>TRUE,"DrawArea"=>FALSE); 

+ $Barcode128->draw($myPicture,"TLSE",450,25,$Settings); 

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.barcode.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.barcode128.php
@@ -1,1 +1,48 @@
-
+<?php   

+ /* CAT:Barcode */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pBarcode128.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Draw the border */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the title */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"Barcode 128 - Add barcode to your pictures",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Create the barcode 128 object */

+ $Barcode = new pBarcode128("../");

+

+ /* Draw a simple barcode */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $Settings = array("ShowLegend"=>TRUE,"DrawArea"=>TRUE);

+ $Barcode->draw($myPicture,"pChart Rocks!",50,50,$Settings);

+

+ /* Draw a rotated barcode */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>12));

+ $Settings = array("ShowLegend"=>TRUE,"DrawArea"=>TRUE,"Angle"=>90);

+ $Barcode->draw($myPicture,"Turn me on",650,50,$Settings);

+

+ /* Draw a rotated barcode */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>12));

+ $Settings = array("R"=>255,"G"=>255,"B"=>255,"AreaR"=>150,"AreaG"=>30,"AreaB"=>27,"ShowLegend"=>TRUE,"DrawArea"=>TRUE,"Angle"=>350,"AreaBorderR"=>70,"AreaBorderG"=>20,"AreaBorderB"=>20);

+ $Barcode->draw($myPicture,"Do what you want !",290,140,$Settings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawbarcode128.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.barcode39.php
@@ -1,1 +1,48 @@
-
+<?php   

+ /* CAT:Barcode */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pBarcode39.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Draw the picture border */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the title */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"Barcode 39 - Add barcode to your pictures",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Create the barcode 39 object */

+ $Barcode = new pBarcode39("../");

+

+ /* Draw a simple barcode */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $Settings = array("ShowLegend"=>TRUE,"DrawArea"=>TRUE);

+ $Barcode->draw($myPicture,"pChart Rocks!",50,50,$Settings);

+

+ /* Draw a rotated barcode */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>12));

+ $Settings = array("ShowLegend"=>TRUE,"DrawArea"=>TRUE,"Angle"=>90);

+ $Barcode->draw($myPicture,"Turn me on",650,50,$Settings);

+

+ /* Draw a rotated barcode */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>12));

+ $Settings = array("R"=>255,"G"=>255,"B"=>255,"AreaR"=>150,"AreaG"=>30,"AreaB"=>27,"ShowLegend"=>TRUE,"DrawArea"=>TRUE,"Angle"=>350,"AreaBorderR"=>70,"AreaBorderG"=>20,"AreaBorderB"=>20);

+ $Barcode->draw($myPicture,"Do what you want !",290,140,$Settings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.barcode39.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.basic.php
@@ -1,1 +1,32 @@
-
+<?php

+ /* CAT:Misc */

+

+ /* Include all the classes */ 

+ include("../class/pDraw.class.php"); 

+ include("../class/pImage.class.php"); 

+ include("../class/pData.class.php");

+

+ /* Create your dataset object */ 

+ $myData = new pData(); 

+ 

+ /* Add data in your dataset */ 

+ $myData->addPoints(array(1,3,4,3,5));

+

+ /* Create a pChart object and associate your dataset */ 

+ $myPicture = new pImage(700,230,$myData);

+

+ /* Choose a nice font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+

+ /* Define the boundaries of the graph area */

+ $myPicture->setGraphArea(60,40,670,190);

+

+ /* Draw the scale, keep everything automatic */ 

+ $myPicture->drawScale();

+

+ /* Draw the scale, keep everything automatic */ 

+ $myPicture->drawSplineChart();

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.basic.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.cache.php
@@ -1,1 +1,56 @@
-
+<?php

+ /* CAT:Misc */

+

+ /* Include all the classes */ 

+ include("../class/pDraw.class.php"); 

+ include("../class/pImage.class.php"); 

+ include("../class/pData.class.php");

+ include("../class/pCache.class.php");

+

+ /* Create your dataset object */ 

+ $myData = new pData(); 

+ 

+ /* Add data in your dataset */ 

+ $myData->addPoints(array(1,3,4,3,5));

+

+ /* Create the cache object */

+ $myCache = new pCache(array("CacheFolder"=>"../cache"));

+

+ /* Compute the hash linked to the chart data */

+ $ChartHash = $myCache->getHash($myData);

+

+ /* Test if we got this hash in our cache already */

+ if ( $myCache->isInCache($ChartHash))

+  {

+   /* If we have it, get the picture from the cache! */

+   $myCache->saveFromCache($ChartHash,"pictures/example.cache.png");

+  }

+ else

+  {

+   /* Create a pChart object and associate your dataset */ 

+   $myPicture = new pImage(700,230,$myData);

+

+   /* Choose a nice font */

+   $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+

+   /* Define the boundaries of the graph area */

+   $myPicture->setGraphArea(60,40,670,190);

+

+   /* Draw the scale, keep everything automatic */ 

+   $myPicture->drawScale();

+

+   /* Draw the scale, keep everything automatic */ 

+   $myPicture->drawSplineChart();

+

+   /* Do some cosmetics */

+   $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

+   $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+   $myPicture->drawText(10,13,"Test of the pCache class",array("R"=>255,"G"=>255,"B"=>255));

+

+   /* Push the rendered picture to the cache */

+   $myCache->writeToCache($ChartHash,$myPicture);

+

+   /* Render the picture */

+   $myPicture->render("pictures/example.cache.png");

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.combo.php
@@ -1,1 +1,65 @@
-
+<?php

+ /* CAT:Misc */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pData object with some random values*/

+ $MyData = new pData(); 

+ $MyData->addPoints(array(30,24,32),"This year");

+ $MyData->addPoints(array(28,20,27),"Last year");

+ $MyData->addPoints(array("Year","Month","Day"),"Labels");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Create a solid background */

+ $Settings = array("R"=>179, "G"=>217, "B"=>91, "Dash"=>1, "DashR"=>199, "DashG"=>237, "DashB"=>111);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Do a gradient overlay */

+ $Settings = array("StartR"=>194, "StartG"=>231, "StartB"=>44, "EndR"=>43, "EndG"=>107, "EndB"=>58, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"Chart title",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Draw the scale */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->setGraphArea(50,60,670,190);

+ $myPicture->drawFilledRectangle(50,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("CycleBackground"=>TRUE));

+

+ /* Graph title */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawText(50,52,"Chart subtitle",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMLEFT));

+

+ /* Draw the bar chart chart */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $MyData->setSerieDrawable("Last year",FALSE);

+ $myPicture->drawBarChart();

+

+ /* Draw the line and plot chart */

+ $MyData->setSerieDrawable("Last year",TRUE);

+ $MyData->setSerieDrawable("This year",FALSE);

+ $myPicture->drawSplineChart();

+ $myPicture->drawPlotChart();

+

+ /* Make sure all series are drawable before writing the scale */

+ $MyData->drawAll();

+

+ /* Write the legend */

+ $myPicture->drawLegend(580,35,array("Style"=>LEGEND_ROUND,"Alpha"=>20,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.combo.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.draw2DPie.php
@@ -1,1 +1,68 @@
-
+<?php   

+ /* CAT:Pie charts */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pPie.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();   

+ $MyData->addPoints(array(40,60,15,10,6,4),"ScoreA");  

+ $MyData->setSerieDescription("ScoreA","Application A");

+

+ /* Define the absissa serie */

+ $MyData->addPoints(array("<10","10<>20","20<>40","40<>60","60<>80",">80"),"Labels");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw a solid background */

+ $Settings = array("R"=>173, "G"=>152, "B"=>217, "Dash"=>1, "DashR"=>193, "DashG"=>172, "DashB"=>237);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Draw a gradient overlay */

+ $Settings = array("StartR"=>209, "StartG"=>150, "StartB"=>231, "EndR"=>111, "EndG"=>3, "EndB"=>138, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"pPie - Draw 2D pie charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font properties */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>50));

+

+ /* Create the pPie object */ 

+ $PieChart = new pPie($myPicture,$MyData);

+

+ /* Draw a simple pie chart */ 

+ $PieChart->draw2DPie(120,125,array("SecondPass"=>FALSE));

+

+ /* Draw an AA pie chart */ 

+ $PieChart->draw2DPie(340,125,array("DrawLabels"=>TRUE,"Border"=>TRUE));

+

+ /* Draw a splitted pie chart */ 

+ $PieChart->draw2DPie(560,125,array("DataGapAngle"=>10,"DataGapRadius"=>6,"Border"=>TRUE,"BorderR"=>255,"BorderG"=>255,"BorderB"=>255));

+

+ /* Write the legend */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+ $myPicture->drawText(120,200,"Single AA pass",array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPMIDDLE));

+ $myPicture->drawText(440,200,"Extended AA pass / Splitted",array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPMIDDLE));

+

+ /* Write the legend box */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6,"R"=>255,"G"=>255,"B"=>255));

+ $PieChart->drawPieLegend(380,8,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.draw2DPie.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.draw3DPie.php
@@ -1,1 +1,73 @@
-
+<?php   

+ /* CAT:Pie charts */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pPie.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();   

+ $MyData->addPoints(array(40,30,20),"ScoreA");  

+ $MyData->setSerieDescription("ScoreA","Application A");

+

+ /* Define the absissa serie */

+ $MyData->addPoints(array("A","B","C"),"Labels");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData,TRUE);

+

+ /* Draw a solid background */

+ $Settings = array("R"=>173, "G"=>152, "B"=>217, "Dash"=>1, "DashR"=>193, "DashG"=>172, "DashB"=>237);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Draw a gradient overlay */

+ $Settings = array("StartR"=>209, "StartG"=>150, "StartB"=>231, "EndR"=>111, "EndG"=>3, "EndB"=>138, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"pPie - Draw 3D pie charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font properties */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));

+

+ /* Create the pPie object */ 

+ $PieChart = new pPie($myPicture,$MyData);

+

+ /* Define the slice color */

+ $PieChart->setSliceColor(0,array("R"=>143,"G"=>197,"B"=>0));

+ $PieChart->setSliceColor(1,array("R"=>97,"G"=>77,"B"=>63));

+ $PieChart->setSliceColor(2,array("R"=>97,"G"=>113,"B"=>63));

+

+ /* Draw a simple pie chart */ 

+ $PieChart->draw3DPie(120,125,array("SecondPass"=>FALSE));

+

+ /* Draw an AA pie chart */ 

+ $PieChart->draw3DPie(340,125,array("DrawLabels"=>TRUE,"Border"=>TRUE));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>3,"Y"=>3,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw a splitted pie chart */ 

+ $PieChart->draw3DPie(560,125,array("DataGapAngle"=>10,"DataGapRadius"=>6,"Border"=>TRUE));

+

+ /* Write the legend */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+ $myPicture->drawText(120,200,"Single AA pass",array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPMIDDLE));

+ $myPicture->drawText(440,200,"Extended AA pass / Splitted",array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPMIDDLE));

+

+ /* Write the legend box */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6,"R"=>255,"G"=>255,"B"=>255));

+ $PieChart->drawPieLegend(600,8,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.draw3DPie.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.draw3DPie.transparent.php
@@ -1,1 +1,40 @@
-
+<?php   

+ /* CAT:Pie charts */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pPie.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();   

+ $MyData->addPoints(array(40,30,20),"ScoreA");  

+ $MyData->setSerieDescription("ScoreA","Application A");

+

+ /* Define the absissa serie */

+ $MyData->addPoints(array("A","B","C"),"Labels");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(240,180,$MyData,TRUE);

+

+ /* Set the default font properties */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));

+

+ /* Create the pPie object */ 

+ $PieChart = new pPie($myPicture,$MyData);

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>3,"Y"=>3,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw a splitted pie chart */ 

+ $PieChart->draw3DPie(120,90,array("Radius"=>100,"DataGapAngle"=>10,"DataGapRadius"=>6,"Border"=>TRUE));

+

+ /* Write the legend box */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6,"R"=>0,"G"=>0,"B"=>0));

+ $PieChart->drawPieLegend(140,160,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.draw3DPie.transparent.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawAntialiasPixel.php
@@ -1,1 +1,35 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>180,"StartG"=>193,"StartB"=>91,"EndR"=>120,"EndG"=>137,"EndB"=>72,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>180,"StartG"=>193,"StartB"=>91,"EndR"=>120,"EndG"=>137,"EndB"=>72,"Alpha"=>20));

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawAntialiasPixel() - Drawing antialiased pixel with transparency",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Draw some alpha pixels */ 

+ for($X=0;$X<=160;$X++)

+  {

+   for($Y=0;$Y<=160;$Y++)

+    {

+     $PixelSettings = array("R"=>128,"G"=>255-$Y,"B"=>$X,"Alpha"=>cos(deg2rad($X*2))*50+50);

+

+     $myPicture->drawAntialiasPixel($X*2+20.4,$Y+45,$PixelSettings);

+     $myPicture->drawAntialiasPixel($X+400,$Y+45,$PixelSettings);

+    }

+  }

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawantialiaspixel.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawAreaChart.php
@@ -1,1 +1,65 @@
-
+<?php   

+ /* CAT:Area Chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");

+ $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");

+ $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");

+ $MyData->setSerieTicks("Probe 2",4);

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawAreaChart() - draw an area chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw the scale and the 1st chart */

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawAreaChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));

+ $myPicture->setShadow(FALSE);

+

+ /* Draw the scale and the 2nd chart */

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawAreaChart();

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawAreaChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawAreaChart.simple.php
@@ -1,1 +1,55 @@
-
+<?php   

+ /* CAT:Area Chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(4,2,10,12,8,3),"Probe 1");

+ $MyData->addPoints(array(3,12,15,8,5,5),"Probe 2");

+ $MyData->addPoints(array(2,7,5,18,15,22),"Probe 3");

+ $MyData->setSerieTicks("Probe 2",4);

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Turn of Antialiasing */

+ $myPicture->Antialias = FALSE;

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(150,35,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Define the chart area */

+ $myPicture->setGraphArea(60,40,650,200);

+

+ /* Draw the scale */

+ $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);

+ $myPicture->drawScale($scaleSettings);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(540,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Turn on Antialiasing */

+ $myPicture->Antialias = TRUE;

+

+ /* Draw the area chart */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawAreaChart();

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawAreaChart.simple.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawArrow.php
@@ -1,1 +1,40 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawArrow() - Arrows on your charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw some arrows */ 

+ for($i=1;$i<=100;$i=$i+8)

+  {

+   $arrowSettings = array("FillR"=>$i*2.5,"FillG"=>$i*2.5,"FillB"=>$i*2.5,"Ticks"=>$i % 5);

+

+   $myPicture->drawArrow($i+5,215,$i*7+5,30,$arrowSettings);

+  }

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawArrow.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawArrowLabel.php
@@ -1,1 +1,48 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawArrowLabel() - Adaptative label positionning",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw an arrow with a 45 degree angle */ 

+ $ArrowSettings = array("FillR"=>37,"FillG"=>78,"FillB"=>117,"Length"=>40,"Angle"=>45);

+ $myPicture->drawArrowLabel(348,113,"Blue",$ArrowSettings);

+

+ /* Draw an arrow with a 135 degree angle */ 

+ $ArrowSettings = array("FillR"=>188,"FillG"=>49,"FillB"=>42,"Length"=>40,"Angle"=>135,"Position"=>POSITION_BOTTOM,"Ticks"=>2);

+ $myPicture->drawArrowLabel(348,117,"Red",$ArrowSettings);

+

+ /* Draw an arrow with a 225 degree angle */ 

+ $ArrowSettings = array("FillR"=>51,"FillG"=>119,"FillB"=>35,"Length"=>40,"Angle"=>225,"Position"=>POSITION_BOTTOM,"Ticks"=>3);

+ $myPicture->drawArrowLabel(352,117,"Green",$ArrowSettings);

+

+ /* Draw an arrow with a 315 degree angle */ 

+ $ArrowSettings = array("FillR"=>239,"FillG"=>231,"FillB"=>97,"Length"=>40,"Angle"=>315,"Ticks"=>4);

+ $myPicture->drawArrowLabel(352,113,"Yellow",$ArrowSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawArrowLabel.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawBarChart.can.php
@@ -1,1 +1,40 @@
-
+<?php   

+ /* CAT:Bar Chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(150,220,300,-250,-420,-200,300,200,100),"Server A");

+ $MyData->addPoints(array(140,0,340,-300,-320,-300,200,100,50),"Server B");

+ $MyData->setAxisName(0,"Hits");

+ $MyData->addPoints(array("January","February","March","April","May","Juin","July","August","September"),"Months");

+ $MyData->setSerieDescription("Months","Month");

+ $MyData->setAbscissa("Months");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the scale  */

+ $myPicture->setGraphArea(50,30,680,200);

+ $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10));

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw the chart */

+ $settings = array("Gradient"=>TRUE,"GradientMode"=>GRADIENT_EFFECT_CAN,"DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"DisplayR"=>255,"DisplayG"=>255,"DisplayB"=>255,"DisplayShadow"=>TRUE,"Surrounding"=>10);

+ $myPicture->drawBarChart($settings);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(580,12,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawBarChart.can.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawBarChart.floating.php
@@ -1,1 +1,44 @@
-
+<?php   

+ /* CAT:Bar Chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(150,220,300,250,420,200,300,200,100),"Server A");

+ $MyData->addPoints(array(140,0,340,300,320,300,200,100,50),"Server B");

+ $MyData->setAxisName(0,"Hits");

+ $MyData->addPoints(array("January","February","March","April","May","Juin","July","August","September"),"Months");

+ $MyData->setSerieDescription("Months","Month");

+ $MyData->setAbscissa("Months");

+

+ /* Create the floating 0 data serie */

+ $MyData->addPoints(array(60,80,20,40,0,50,90,30,100),"Floating 0");

+ $MyData->setSerieDrawable("Floating 0",FALSE);

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the scale  */

+ $myPicture->setGraphArea(50,30,680,200);

+ $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10));

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw the chart */

+ $settings = array("Floating0Serie"=>"Floating 0","Draw0Line"=>TRUE,"Gradient"=>TRUE,"DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"DisplayR"=>255,"DisplayG"=>255,"DisplayB"=>255,"DisplayShadow"=>TRUE,"Surrounding"=>10);

+ $myPicture->drawBarChart($settings);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(580,12,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawBarChart.floating.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawBarChart.palette.php
@@ -1,1 +1,48 @@
-
+<?php   

+ /* CAT:Bar Chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(13251,4118,3087,1460,1248,156,26,9,8),"Hits");

+ $MyData->setAxisName(0,"Hits");

+ $MyData->addPoints(array("Firefox","Chrome","Internet Explorer","Opera","Safari","Mozilla","SeaMonkey","Camino","Lunascape"),"Browsers");

+ $MyData->setSerieDescription("Browsers","Browsers");

+ $MyData->setAbscissa("Browsers");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(500,500,$MyData);

+ $myPicture->drawGradientArea(0,0,500,500,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,500,500,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the chart scale */ 

+ $myPicture->setGraphArea(100,30,480,480);

+ $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10,"Pos"=>SCALE_POS_TOPBOTTOM)); // 

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Create the per bar palette */

+ $Palette = array("0"=>array("R"=>188,"G"=>224,"B"=>46,"Alpha"=>100),

+                  "1"=>array("R"=>224,"G"=>100,"B"=>46,"Alpha"=>100),

+                  "2"=>array("R"=>224,"G"=>214,"B"=>46,"Alpha"=>100),

+                  "3"=>array("R"=>46,"G"=>151,"B"=>224,"Alpha"=>100),

+                  "4"=>array("R"=>176,"G"=>46,"B"=>224,"Alpha"=>100),

+                  "5"=>array("R"=>224,"G"=>46,"B"=>117,"Alpha"=>100),

+                  "6"=>array("R"=>92,"G"=>224,"B"=>46,"Alpha"=>100),

+                  "7"=>array("R"=>224,"G"=>176,"B"=>46,"Alpha"=>100));

+

+ /* Draw the chart */ 

+ $myPicture->drawBarChart(array("DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"Rounded"=>TRUE,"Surrounding"=>30,"OverrideColors"=>$Palette));

+

+ /* Write the legend */ 

+ $myPicture->drawLegend(570,215,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawBarChart.palette.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawBarChart.php
@@ -1,1 +1,65 @@
-
+<?php

+ /* CAT:Bar Chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");

+ $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");

+ $MyData->addPoints(array(2,0,5,18,19,22),"Probe 3");

+ $MyData->setSerieTicks("Probe 2",4);

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawBarChart() - draw a bar chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw the scale and the 1st chart */

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawBarChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Rounded"=>TRUE,"Surrounding"=>60));

+ $myPicture->setShadow(FALSE);

+

+ /* Draw the scale and the 2nd chart */

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawBarChart();

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawBarChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawBarChart.shaded.php
@@ -1,1 +1,40 @@
-
+<?php   

+ /* CAT:Bar Chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(150,220,300,-250,-420,-200,300,200,100),"Server A");

+ $MyData->addPoints(array(140,0,340,-300,-320,-300,200,100,50),"Server B");

+ $MyData->setAxisName(0,"Hits");

+ $MyData->addPoints(array("January","February","March","April","May","Juin","July","August","September"),"Months");

+ $MyData->setSerieDescription("Months","Month");

+ $MyData->setAbscissa("Months");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the scale  */

+ $myPicture->setGraphArea(50,30,680,200);

+ $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10));

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw the chart */

+ $settings = array("Gradient"=>TRUE,"DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"DisplayR"=>255,"DisplayG"=>255,"DisplayB"=>255,"DisplayShadow"=>TRUE,"Surrounding"=>10);

+ $myPicture->drawBarChart($settings);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(580,12,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawBarChart.shaded.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawBarChart.simple.php
@@ -1,1 +1,50 @@
-
+<?php   

+ /* CAT:Bar Chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(150,220,300,-250,-420,-200,300,200,100),"Server A");

+ $MyData->addPoints(array(140,0,340,-300,-320,-300,200,100,50),"Server B");

+ $MyData->setAxisName(0,"Hits");

+ $MyData->addPoints(array("January","February","March","April","May","Juin","July","August","September"),"Months");

+ $MyData->setSerieDescription("Months","Month");

+ $MyData->setAbscissa("Months");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Turn of Antialiasing */

+ $myPicture->Antialias = FALSE;

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Define the chart area */

+ $myPicture->setGraphArea(60,40,650,200);

+

+ /* Draw the scale */

+ $scaleSettings = array("GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);

+ $myPicture->drawScale($scaleSettings);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(580,12,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw the chart */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $settings = array("Gradient"=>TRUE,"GradientMode"=>GRADIENT_EFFECT_CAN,"DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"DisplayR"=>255,"DisplayG"=>255,"DisplayB"=>255,"DisplayShadow"=>TRUE,"Surrounding"=>10);

+ $myPicture->drawBarChart();

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawBarChart.simple.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawBarChart.vertical.php
@@ -1,1 +1,38 @@
-
+<?php   

+ /* CAT:Bar Chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(13251,4118,3087,1460,1248,156,26,9,8),"Hits");

+ $MyData->setAxisName(0,"Hits");

+ $MyData->addPoints(array("Firefox","Chrome","Internet Explorer","Opera","Safari","Mozilla","SeaMonkey","Camino","Lunascape"),"Browsers");

+ $MyData->setSerieDescription("Browsers","Browsers");

+ $MyData->setAbscissa("Browsers");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(500,500,$MyData);

+ $myPicture->drawGradientArea(0,0,500,500,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,500,500,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the chart scale */ 

+ $myPicture->setGraphArea(100,30,480,480);

+ $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10,"Pos"=>SCALE_POS_TOPBOTTOM)); // 

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw the chart */ 

+ $myPicture->drawBarChart(array("DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"Rounded"=>TRUE,"Surrounding"=>30));

+

+ /* Write the legend */ 

+ $myPicture->drawLegend(570,215,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawBarChart.vertical.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawBestfit.php
@@ -1,1 +1,55 @@
-
+<?php   

+ /* CAT:Mathematical */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ for($i=0;$i<=20;$i++) { $MyData->addPoints(rand(10,30)+$i,"Probe 1"); }

+ for($i=0;$i<=20;$i++) { $MyData->addPoints(rand(0,10)+$i,"Probe 2"); }

+ $MyData->setAxisName(0,"Temperatures");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Turn of Antialiasing */

+ $myPicture->Antialias = FALSE;

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(150,35,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Define the chart area */

+ $myPicture->setGraphArea(60,40,650,200);

+

+ /* Draw the scale */

+ $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);

+ $myPicture->drawScale($scaleSettings);

+

+ /* Turn on Antialiasing */

+ $myPicture->Antialias = TRUE;

+

+ /* Draw the line of best fit */

+ $myPicture->drawBestFit();

+

+ /* Turn on shadows */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw the line chart */

+ $myPicture->drawPlotChart();

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(580,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawBestFit.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawBezier.php
@@ -1,1 +1,40 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawBezier() - some cubic curves",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw one bezier curve */ 

+ $BezierSettings = array("R"=>255,"G"=>255,"B"=>255,"ShowControl"=>TRUE);

+ $myPicture->drawBezier(20,40,280,170,130,160,160,60,$BezierSettings);

+

+ /* Draw one bezier curve */ 

+ $BezierSettings = array("R"=>255,"G"=>255,"B"=>255,"ShowControl"=>TRUE,"Ticks"=>4,"DrawArrow"=>TRUE,"ArrowTwoHeads"=>TRUE);

+ $myPicture->drawBezier(360,120,630,120,430,50,560,190,$BezierSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawBezier.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawBubbleChart.php
@@ -1,1 +1,78 @@
-
+<?php

+ /* CAT:Bubble chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+ include("../class/pBubble.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(34,55,15,62,38,42),"Probe1");

+ $MyData->addPoints(array(5,10,8,9,15,10),"Probe1Weight");

+ $MyData->addPoints(array(5,10,-5,-1,0,-10),"Probe2");

+ $MyData->addPoints(array(6,10,14,10,14,6),"Probe2Weight");

+ $MyData->setSerieDescription("Probe1","This year");

+ $MyData->setSerieDescription("Probe2","Last year");

+ $MyData->setAxisName(0,"Current stock");

+ $MyData->addPoints(array("Apple","Banana","Orange","Lemon","Peach","Strawberry"),"Product");

+ $MyData->setAbscissa("Product");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawBubbleChart() - draw a linear bubble chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the title */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(40,55,"Current Stock / Needs chart",array("FontSize"=>14,"Align"=>TEXT_ALIGN_BOTTOMLEFT));

+

+ /* Change the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Create the Bubble chart object and scale up */

+ $myBubbleChart = new pBubble($myPicture,$MyData);

+

+ /* Scale up for the bubble chart */

+ $bubbleDataSeries   = array("Probe1","Probe2");

+ $bubbleWeightSeries = array("Probe1Weight","Probe2Weight");

+ $myBubbleChart->bubbleScale($bubbleDataSeries,$bubbleWeightSeries);

+

+ /* Draw the 1st chart */

+ $myPicture->setGraphArea(40,60,430,190);

+ $myPicture->drawFilledRectangle(40,60,430,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-50,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>30));

+ $myBubbleChart->drawBubbleChart($bubbleDataSeries,$bubbleWeightSeries);

+

+ /* Draw the 2nd scale */

+ $myPicture->setShadow(FALSE);

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));

+

+ /* Draw the 2nd stock chart */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>30));

+ $myBubbleChart->drawbubbleChart($bubbleDataSeries,$bubbleWeightSeries,array("DrawBorder"=>TRUE,"Surrounding"=>60,"BorderAlpha"=>100));

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(550,215,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawBubbleChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawBubbleChart.simple.php
@@ -1,1 +1,57 @@
-
+<?php

+ /* CAT:Bubble chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+ include("../class/pBubble.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(34,55,15,62,38,42),"Probe1");

+ $MyData->addPoints(array(5,10,8,9,15,10),"Probe1Weight");

+ $MyData->addPoints(array(5,10,-5,-1,0,-10),"Probe2");

+ $MyData->addPoints(array(6,10,14,10,14,6),"Probe2Weight");

+ $MyData->setSerieDescription("Probe1","This year");

+ $MyData->setSerieDescription("Probe2","Last year");

+ $MyData->setAxisName(0,"Current stock");

+ $MyData->addPoints(array("Apple","Banana","Orange","Lemon","Peach","Strawberry"),"Product");

+ $MyData->setAbscissa("Product");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Turn of AAliasing */

+ $myPicture->Antialias = FALSE;

+

+ /* Draw the border */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Define the chart area */

+ $myPicture->setGraphArea(60,30,650,190);

+

+ /* Draw the scale */

+ $scaleSettings = array("GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);

+ $myPicture->drawScale($scaleSettings);

+

+ /* Create the Bubble chart object and scale up */

+ $myPicture->Antialias = TRUE;

+ $myBubbleChart = new pBubble($myPicture,$MyData);

+

+ /* Scale up for the bubble chart */

+ $bubbleDataSeries   = array("Probe1","Probe2");

+ $bubbleWeightSeries = array("Probe1Weight","Probe2Weight");

+ $myBubbleChart->bubbleScale($bubbleDataSeries,$bubbleWeightSeries);

+

+ /* Draw the bubble chart */

+ $myBubbleChart->drawBubbleChart($bubbleDataSeries,$bubbleWeightSeries);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(570,13,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawBubbleChart.simple.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawCircle.php
@@ -1,1 +1,54 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawCircle() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Draw some circles */ 

+ $myPicture->drawCircle(100,125,50,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>100));

+ $myPicture->drawCircle(140,125,50,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>70));

+ $myPicture->drawCircle(180,125,50,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>40));

+ $myPicture->drawCircle(220,125,50,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>20));

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a customized circles */ 

+ $CircleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>100);

+ $myPicture->drawCircle(480,60,20,20,$CircleSettings);

+

+ /* Draw a customized circles */ 

+ $CircleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>100);

+ $myPicture->drawCircle(480,100,30,20,$CircleSettings);

+

+ /* Draw a customized circles */ 

+ $CircleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100,"Ticks"=>4);

+ $myPicture->drawCircle(480,140,40,20,$CircleSettings);

+

+ /* Draw a customized circles */ 

+ $CircleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>100,"Ticks"=>4);

+ $myPicture->drawCircle(480,180,50,20,$CircleSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawCircle.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawDerivative.php
@@ -1,1 +1,60 @@
-
+<?php   

+ /* CAT:Mathematical */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3,4,5,0,4,6,10),"Probe 1");

+ $MyData->addPoints(array(3,12,15,8,5,-5,5,-5,-3,4,5,10),"Probe 2");

+ $MyData->addPoints(array(2,7,5,18,19,22,10,2,6,10,5,6),"Probe 3");

+ $MyData->setSerieTicks("Probe 2",4);

+ $MyData->setSerieWeight("Probe 3",2);

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawDerivative() - draw the series slope",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the scale and the 1st chart */

+ $myPicture->setGraphArea(60,40,680,150);

+ $myPicture->drawFilledRectangle(60,40,680,150,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawLineChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));

+

+ /* Draw the series derivative graph */

+ $myPicture->drawDerivative(array("ShadedSlopeBox"=>TRUE,"CaptionLine"=>TRUE));

+

+ /* Write the chart legend */

+ $myPicture->setFontProperties(array("R"=>255,"G"=>255,"B"=>255));

+ $myPicture->drawLegend(560,8,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawDerivative.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawDerivative.simple.php
@@ -1,1 +1,46 @@
-
+<?php   

+ /* CAT:Mathematical */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(3,12,15,8,5,-5,5,-5,-3,4,5,10),"Probe");

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Turn of AAliasing */

+ $myPicture->Antialias = FALSE;

+

+ /* Set the default font */ 

+ $myPicture->setFontProperties(array("R"=>0,"G"=>0,"B"=>0,"FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Define the chart area */

+ $myPicture->setGraphArea(50,40,680,170);

+

+ /* Draw the scale */

+ $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>100,"GridG"=>100,"GridB"=>100,"GridAlpha"=>15);

+ $myPicture->drawScale($scaleSettings);

+

+ /* Draw the chart */

+ $myPicture->Antialias = TRUE;

+ $myPicture->drawSplineChart();

+ $myPicture->Antialias = FALSE;

+

+ /* Draw the series derivative graph */

+ $myPicture->drawDerivative(array("Caption"=>FALSE));

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(640,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawDerivative.simple.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawFilledCircle.php
@@ -1,1 +1,54 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawCircle() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Draw some filled circles */ 

+ $myPicture->drawFilledCircle(100,125,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>100));

+ $myPicture->drawFilledCircle(140,125,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>70));

+ $myPicture->drawFilledCircle(180,125,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>40));

+ $myPicture->drawFilledCircle(220,125,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>20));

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a customized filled circles */ 

+ $CircleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>100,"Surrounding"=>30);

+ $myPicture->drawFilledCircle(480,60,19,$CircleSettings);

+

+ /* Draw a customized filled circles */ 

+ $CircleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>100,"Surrounding"=>30);

+ $myPicture->drawFilledCircle(480,100,19,$CircleSettings);

+

+ /* Draw a customized filled circles */ 

+ $CircleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100,"Surrounding"=>30,"Ticks"=>4);

+ $myPicture->drawFilledCircle(480,140,19,$CircleSettings);

+

+ /* Draw a customized filled circles */ 

+ $CircleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>100,"Surrounding"=>30,"Ticks"=>4);

+ $myPicture->drawFilledCircle(480,180,19,$CircleSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawFilledCircle.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawFilledRectangle.php
@@ -1,1 +1,57 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawFilledRectangle() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a customized filled rectangle */ 

+ $RectangleSettings = array("R"=>150,"G"=>200,"B"=>170,"Dash"=>TRUE,"DashR"=>170,"DashG"=>220,"DashB"=>190,"BorderR"=>255,"BorderG"=>255,"BorderB"=>255);

+ $myPicture->drawFilledRectangle(20,60,400,170,$RectangleSettings);

+

+ /* Draw a customized filled rectangle */ 

+ $RectangleSettings = array("R"=>209,"G"=>134,"B"=>27,"Alpha"=>30);

+ $myPicture->drawFilledRectangle(30,30,200,200,$RectangleSettings);

+

+ /* Draw a customized filled rectangle */ 

+ $RectangleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>100,"Surrounding"=>30);

+ $myPicture->drawFilledRectangle(480,50,650,80,$RectangleSettings);

+

+ /* Draw a customized filled rectangle */ 

+ $RectangleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>100,"Surrounding"=>30);

+ $myPicture->drawFilledRectangle(480,90,650,120,$RectangleSettings);

+

+ /* Draw a customized filled rectangle */ 

+ $RectangleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100,"Surrounding"=>30,"Ticks"=>2);

+ $myPicture->drawFilledRectangle(480,130,650,160,$RectangleSettings);

+

+ /* Draw a customized filled rectangle */ 

+ $RectangleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>100,"Surrounding"=>30,"Ticks"=>2);

+ $myPicture->drawFilledRectangle(480,170,650,200,$RectangleSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawFilledRectangle.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawFilledSplineChart.php
@@ -1,1 +1,74 @@
-
+<?php   

+ /* CAT:Spline chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();

+ $MyData->setAxisName(0,"Strength");

+ for($i=0;$i<=720;$i=$i+20)

+  {

+   $MyData->addPoints(cos(deg2rad($i))*100,"Probe 1");

+   $MyData->addPoints(cos(deg2rad($i+90))*60,"Probe 2");

+  }

+

+ /* Create the pChart object */

+ $myPicture = new pImage(847,304,$MyData);

+ $myPicture->drawGradientArea(0,0,847,304,DIRECTION_VERTICAL,array("StartR"=>47,"StartG"=>47,"StartB"=>47,"EndR"=>17,"EndG"=>17,"EndB"=>17,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,250,847,304,DIRECTION_VERTICAL,array("StartR"=>47,"StartG"=>47,"StartB"=>47,"EndR"=>27,"EndG"=>27,"EndB"=>27,"Alpha"=>100));

+ $myPicture->drawLine(0,249,847,249,array("R"=>0,"G"=>0,"B"=>0));

+ $myPicture->drawLine(0,250,847,250,array("R"=>70,"G"=>70,"B"=>70));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,846,303,array("R"=>204,"G"=>204,"B"=>204));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawText(423,14,"Cyclic magnetic field strength",array("R"=>255,"G"=>255,"B"=>255,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE));

+

+ /* Define the chart area */

+ $myPicture->setGraphArea(58,27,816,228);

+

+ /* Draw a rectangle */

+ $myPicture->drawFilledRectangle(58,27,816,228,array("R"=>0,"G"=>0,"B"=>0,"Dash"=>TRUE,"DashR"=>0,"DashG"=>51,"DashB"=>51,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0));

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+ 

+ /* Draw the scale */

+ $myPicture->setFontProperties(array("R"=>255,"G"=>255,"B"=>255));

+ $ScaleSettings = array("XMargin"=>4,"DrawSubTicks"=>TRUE,"GridR"=>255,"GridG"=>255,"GridB"=>255,"AxisR"=>255,"AxisG"=>255,"AxisB"=>255,"GridAlpha"=>30,"CycleBackground"=>TRUE);

+ $myPicture->drawScale($ScaleSettings);

+

+ /* Draw the spline chart */

+ $myPicture->drawFilledSplineChart();

+

+ /* Write the chart boundaries */

+ $BoundsSettings = array("MaxDisplayR"=>237,"MaxDisplayG"=>23,"MaxDisplayB"=>48,"MinDisplayR"=>23,"MinDisplayG"=>144,"MinDisplayB"=>237);

+ $myPicture->writeBounds(BOUND_BOTH,$BoundsSettings);

+

+ /* Write the 0 line */

+ $myPicture->drawThreshold(0,array("WriteCaption"=>TRUE));

+

+ /* Write the chart legend */

+ $myPicture->setFontProperties(array("R"=>255,"G"=>255,"B"=>255));

+ $myPicture->drawLegend(560,266,array("Style"=>LEGEND_NOBORDER));

+

+ /* Write the 1st data series statistics */

+ $Settings = array("R"=>188,"G"=>224,"B"=>46,"Align"=>TEXT_ALIGN_BOTTOMLEFT);

+ $myPicture->drawText(620,270,"Max : ".ceil($MyData->getMax("Probe 1")),$Settings);

+ $myPicture->drawText(680,270,"Min : ".ceil($MyData->getMin("Probe 1")),$Settings);

+ $myPicture->drawText(740,270,"Avg : ".ceil($MyData->getSerieAverage("Probe 1")),$Settings);

+

+ /* Write the 2nd data series statistics */

+ $Settings = array("R"=>224,"G"=>100,"B"=>46,"Align"=>TEXT_ALIGN_BOTTOMLEFT);

+ $myPicture->drawText(620,283,"Max : ".ceil($MyData->getMax("Probe 2")),$Settings);

+ $myPicture->drawText(680,283,"Min : ".ceil($MyData->getMin("Probe 2")),$Settings);

+ $myPicture->drawText(740,283,"Avg : ".ceil($MyData->getSerieAverage("Probe 2")),$Settings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawFilledSplineChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawFilledStepChart.php
@@ -1,1 +1,65 @@
-
+<?php   

+ /* CAT:Step chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,2,VOID,12,8,3),"Probe 1");

+ $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");

+ $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");

+ $MyData->setSerieTicks("Probe 2",4);

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawFilledStepChart() - draw a filled step chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw the scale and the 1st chart */

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawFilledStepChart(array("ForceTransparency"=>40,"DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));

+ $myPicture->setShadow(FALSE);

+

+ /* Draw the scale and the 2nd chart */

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>-1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawFilledStepChart(array("ForceTransparency"=>40));

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawFilledStepChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawFromGIF.php
@@ -1,1 +1,47 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawFromGIF() - add pictures to your charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Turn off shadow computing */ 

+ $myPicture->setShadow(FALSE);

+

+ /* Draw a GIF object */

+ $myPicture->drawFromGIF(180,50,"resources/computer.gif");

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a GIF object */

+ $myPicture->drawFromGIF(400,50,"resources/computer.gif");

+

+ /* Write the legend */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+ $TextSettings = array("R"=>255,"G"=>255,"B"=>255,"FontSize"=>10,"FontName"=>"../fonts/calibri.ttf","Align"=>TEXT_ALIGN_BOTTOMMIDDLE);

+ $myPicture->drawText(240,200,"Without shadow",$TextSettings);

+ $myPicture->drawText(460,200,"With enhanced shadow",$TextSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawFromGIF.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawFromJPG.php
@@ -1,1 +1,47 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawFromJPG() - add pictures to your charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Turn off shadow computing */ 

+ $myPicture->setShadow(FALSE);

+

+ /* Draw a JPG object */

+ $myPicture->drawFromJPG(100,45,"resources/landscape1.jpg");

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a JPG object */

+ $myPicture->drawFromJPG(380,45,"resources/landscape2.jpg");

+

+ /* Write the legend */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+ $TextSettings = array("R"=>255,"G"=>255,"B"=>255,"FontSize"=>10,"FontName"=>"../fonts/calibri.ttf","Align"=>TEXT_ALIGN_BOTTOMMIDDLE);

+ $myPicture->drawText(220,210,"Without shadow",$TextSettings);

+ $myPicture->drawText(490,210,"With enhanced shadow",$TextSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawFromJPG.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawFromPNG.php
@@ -1,1 +1,47 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawFromPNG() - add pictures to your charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Turn off shadow computing */ 

+ $myPicture->setShadow(FALSE);

+

+ /* Draw a PNG object */

+ $myPicture->drawFromPNG(180,50,"resources/hologram.png");

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a PNG object */

+ $myPicture->drawFromPNG(400,50,"resources/blocnote.png");

+

+ /* Write the legend */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+ $TextSettings = array("R"=>255,"G"=>255,"B"=>255,"FontSize"=>10,"FontName"=>"../fonts/calibri.ttf","Align"=>TEXT_ALIGN_BOTTOMMIDDLE);

+ $myPicture->drawText(240,190,"          Without shadow\r\n(only PNG alpha channels)",$TextSettings);

+ $myPicture->drawText(460,200,"With enhanced shadow",$TextSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawFromPNG.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawGradientArea.php
@@ -1,1 +1,53 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawGradientArea() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Draw a gradient area */ 

+ $GradientSettings = array("StartR"=>181,"StartG"=>209,"StartB"=>27,"Alpha"=>100,"Levels"=>-50);

+ $myPicture->drawGradientArea(20,60,400,170,DIRECTION_HORIZONTAL,$GradientSettings);

+

+ /* Draw a gradient area */ 

+ $GradientSettings = array("StartR"=>209,"StartG"=>134,"StartB"=>27,"Alpha"=>30,"Levels"=>-50);

+ $myPicture->drawGradientArea(30,30,200,200,DIRECTION_VERTICAL,$GradientSettings);

+

+ /* Draw a gradient area */ 

+ $GradientSettings = array("StartR"=>209,"StartG"=>31,"StartB"=>27,"Alpha"=>100,"Levels"=>50);

+ $myPicture->drawGradientArea(480,50,650,80,DIRECTION_HORIZONTAL,$GradientSettings);

+

+ /* Draw a gradient area */ 

+ $GradientSettings = array("StartR"=>209,"StartG"=>125,"StartB"=>27,"Alpha"=>100,"Levels"=>50);

+ $myPicture->drawGradientArea(480,90,650,120,DIRECTION_VERTICAL,$GradientSettings);

+

+ /* Draw a gradient area */ 

+ $GradientSettings = array("StartR"=>209,"StartG"=>198,"StartB"=>27,"Alpha"=>100,"Levels"=>50);

+ $myPicture->drawGradientArea(480,130,650,160,DIRECTION_HORIZONTAL,$GradientSettings);

+

+ /* Draw a gradient area */ 

+ $GradientSettings = array("StartR"=>134,"StartG"=>209,"StartB"=>27,"Alpha"=>100,"Levels"=>50);

+ $myPicture->drawGradientArea(480,170,650,200,DIRECTION_HORIZONTAL,$GradientSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawGradientArea.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawLegend.php
@@ -1,1 +1,76 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(24,25,26,25,25),"My Serie 1");

+ $MyData->addPoints(array(80,85,84,81,82),"My Serie 2");

+ $MyData->addPoints(array(17,16,18,18,15),"My Serie 3");

+ $MyData->setSerieTicks("My Serie 1",4);

+ $MyData->setSerieWeight("My Serie 2",2);

+ $MyData->setSerieDescription("My Serie 1","Temperature");

+ $MyData->setSerieDescription("My Serie 2","Humidity\n(in percentage)");

+ $MyData->setSerieDescription("My Serie 3","Pressure");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Draw the picture border */ 

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawLegend() - Write your chart legend",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write a legend box */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawLegend(70,60);

+

+ /* Write a legend box */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/MankSans.ttf","FontSize"=>10,"R"=>30,"G"=>30,"B"=>30));

+ $myPicture->drawLegend(230,60,array("BoxSize"=>4,"R"=>173,"G"=>163,"B"=>83,"Surrounding"=>20,"Family"=>LEGEND_FAMILY_CIRCLE));

+

+ /* Write a legend box */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>9,"R"=>80,"G"=>80,"B"=>80));

+ $myPicture->drawLegend(400,60,array("Style"=>LEGEND_BOX,"BoxSize"=>4,"R"=>200,"G"=>200,"B"=>200,"Surrounding"=>20,"Alpha"=>30));

+

+ /* Write a legend box */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawLegend(70,150,array("Mode"=>LEGEND_HORIZONTAL, "Family"=>LEGEND_FAMILY_CIRCLE));

+

+ /* Write a legend box */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawLegend(400,150,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL, "BoxWidth"=>30,"Family"=>LEGEND_FAMILY_LINE));

+

+ /* Write a legend box */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawFilledRectangle(1,200,698,228,array("Alpha"=>30,"R"=>255,"G"=>255,"B"=>255));

+ $myPicture->drawLegend(10,208,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Define series icons */

+ $MyData->setSeriePicture("My Serie 1","resources/application_view_list.png");

+ $MyData->setSeriePicture("My Serie 2","resources/application_view_tile.png");

+ $MyData->setSeriePicture("My Serie 3","resources/chart_bar.png");

+

+ /* Write a legend box */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawLegend(540,50,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_VERTICAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawLegend.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawLine.php
@@ -1,1 +1,42 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Draw the picture border */ 

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawLine() - Basis",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Turn on shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw some lines */ 

+ for($i=1;$i<=100;$i=$i+4)

+  $myPicture->drawLine($i+5,215,$i*7+5,30,array("R"=>rand(0,255),"G"=>rand(0,255),"B"=>rand(0,255),"Ticks"=>rand(0,4)));

+

+ /* Draw an horizontal dashed line with extra weight */

+ $myPicture->drawLine(370,160,650,160,array("R"=>0,"G"=>0,"B"=>0,"Ticks"=>4,"Weight"=>3));

+

+ /* Another example of extra weight */

+ $myPicture->drawLine(370,180,650,200,array("R"=>255,"G"=>255,"B"=>255,"Ticks"=>15,"Weight"=>1));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawLine.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawLineChart.php
@@ -1,1 +1,66 @@
-
+<?php   

+ /* CAT:Line chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");

+ $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");

+ $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");

+ $MyData->setSerieTicks("Probe 2",4);

+ $MyData->setSerieWeight("Probe 3",2);

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawPlotChart() - draw a plot chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw the scale and the 1st chart */

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawLineChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));

+ $myPicture->setShadow(FALSE);

+

+ /* Draw the scale and the 2nd chart */

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>-1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawLineChart();

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawLineChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawLineChart.simple.php
@@ -1,1 +1,55 @@
-
+<?php   

+ /* CAT:Line chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");

+ $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");

+ $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");

+ $MyData->setSerieTicks("Probe 2",4);

+ $MyData->setSerieWeight("Probe 3",2);

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Turn of Antialiasing */

+ $myPicture->Antialias = FALSE;

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(150,35,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Define the chart area */

+ $myPicture->setGraphArea(60,40,650,200);

+

+ /* Draw the scale */

+ $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);

+ $myPicture->drawScale($scaleSettings);

+

+ /* Turn on Antialiasing */

+ $myPicture->Antialias = TRUE;

+

+ /* Draw the line chart */

+ $myPicture->drawLineChart();

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(540,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawLineChart.simple.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawPieLegend.php
@@ -1,1 +1,67 @@
-
+<?php   

+ /* CAT:Pie charts */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pPie.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();   

+ $MyData->addPoints(array(40,60,15,10,6,4),"ScoreA");  

+ $MyData->setSerieDescription("ScoreA","Application A");

+

+ /* Define the absissa serie */

+ $MyData->addPoints(array("<10","10<>20","20<>40","40<>60","60<>80",">80"),"Labels");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawPieLegend - Draw pie charts legend",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font properties */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>150,"G"=>150,"B"=>150,"Alpha"=>100));

+

+ /* Create the pPie object */ 

+ $PieChart = new pPie($myPicture,$MyData);

+

+ /* Draw two AA pie chart */ 

+ $PieChart->draw2DPie(200,100,array("Border"=>TRUE));

+ $PieChart->draw2DPie(440,115,array("Border"=>TRUE));

+

+ /* Write down the legend next to the 2nd chart*/

+ $PieChart->drawPieLegend(550,70);

+

+ /* Write a legend box under the 1st chart */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $PieChart->drawPieLegend(90,176,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Write the bottom legend box */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawGradientArea(1,200,698,228,DIRECTION_VERTICAL,array("StartR"=>247,"StartG"=>247,"StartB"=>247,"EndR"=>217,"EndG"=>217,"EndB"=>217,"Alpha"=>20));

+ $myPicture->drawLine(1,199,698,199,array("R"=>100,"G"=>100,"B"=>100,"Alpha"=>20));

+ $myPicture->drawLine(1,200,698,200,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>20));

+ $PieChart->drawPieLegend(10,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawPieLegend.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawPlotChart.icon.php
@@ -1,1 +1,69 @@
-
+<?php   

+ /* CAT:Plot chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(3,4,7,4,2,5),"User");

+ $MyData->addPoints(array(12,17,15,18,19,22),"Group");

+ $MyData->setSeriePicture("User","resources/serie1.png");

+ $MyData->setSeriePicture("Group","resources/serie2.png");

+ $MyData->setSerieWeight("Group",1);

+ $MyData->setSerieTicks("Group",4);

+

+ $MyData->setAxisName(0,"Hours");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawPlotChart() - draw a plot chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(250,55,"Average time spent on projects",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw the scale and the 1st chart */

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawSplineChart();

+ $myPicture->drawPlotChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));

+ $myPicture->setShadow(FALSE);

+

+ /* Draw the scale and the 2nd chart */

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawPlotChart();

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(590,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawPlotChart.icon.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawPlotChart.php
@@ -1,1 +1,64 @@
-
+<?php   

+ /* CAT:Plot chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");

+ $MyData->addPoints(array(3,12,15,4,2,-5),"Probe 2");

+ $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawPlotChart() - draw a plot chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw the scale and the 1st chart */

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawPlotChart(array("BorderSize"=>1,"Surrounding"=>40,"BorderAlpha"=>100,"PlotSize"=>2,"PlotBorder"=>TRUE,"DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));

+ $myPicture->setShadow(FALSE);

+

+ /* Draw the scale and the 2nd chart */

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawPlotChart(array("PlotSize"=>1,"PlotBorder"=>TRUE,"BorderSize"=>1));

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawPlotChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawPlotChart.simple.php
@@ -1,1 +1,50 @@
-
+<?php   

+ /* CAT:Plot chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ for($i=0;$i<=20;$i++) { $MyData->addPoints(rand(0,20),"Probe 1"); }

+ for($i=0;$i<=20;$i++) { $MyData->addPoints(rand(0,20),"Probe 2"); }

+ $MyData->setAxisName(0,"Temperatures");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Turn of Antialiasing */

+ $myPicture->Antialias = FALSE;

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(150,35,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Define the chart area */

+ $myPicture->setGraphArea(60,40,650,200);

+

+ /* Draw the scale */

+ $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);

+ $myPicture->drawScale($scaleSettings);

+

+ /* Turn on Antialiasing */

+ $myPicture->Antialias = TRUE;

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw the line chart */

+ $myPicture->drawPlotChart();

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(580,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawPlotChart.simple.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawPolygon.php
@@ -1,1 +1,48 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawPolygon - Draw polygons",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Enable shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw some polygons */

+ $Step  = 8;

+ $White = array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200);

+ for($i=1;$i<=4;$i++)

+  {

+   $Points = "";

+   for($j=0;$j<=360;$j=$j+(360/$Step))

+    {

+     $Points[] = cos(deg2rad($j))*50+($i*140);

+     $Points[] = sin(deg2rad($j))*50+120;

+    }

+   $myPicture->drawPolygon($Points,$White);

+   $Step = $Step * 2;

+  }

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawPolygon.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawProgress.php
@@ -1,1 +1,65 @@
-
+<?php   

+ /* CAT:Progress bars */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0, "G"=>0, "B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf", "FontSize"=>6));

+ $myPicture->drawText(10,13, "drawProgress() - Simple progress bars",array("R"=>255, "G"=>255, "B"=>255));

+

+ /* Set the font & shadow options */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf", "FontSize"=>10));

+ $myPicture->setShadow(TRUE,array("X"=>1, "Y"=>1, "R"=>0, "G"=>0, "B"=>0, "Alpha"=>20));

+

+ /* Draw a progress bar */ 

+ $progressOptions = array("R"=>209, "G"=>31, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255, "RFade"=>206, "GFade"=>133, "BFade"=>30, "ShowLabel"=>TRUE);

+ $myPicture->drawProgress(40,60,77,$progressOptions);

+

+ /* Draw a progress bar */ 

+ $progressOptions = array("Width"=>165, "R"=>209, "G"=>125, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255,"NoAngle"=>TRUE, "ShowLabel"=>TRUE, "LabelPos"=>LABEL_POS_RIGHT);

+ $myPicture->drawProgress(40,100,50,$progressOptions);

+

+ /* Draw a progress bar */ 

+ $progressOptions = array("Width"=>165, "R"=>209, "G"=>198, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255, "ShowLabel"=>TRUE, "LabelPos"=>LABEL_POS_LEFT);

+ $myPicture->drawProgress(75,140,25,$progressOptions);

+

+ /* Draw a progress bar */ 

+ $progressOptions = array("Width"=>400, "R"=>134, "G"=>209, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255, "RFade"=>206, "GFade"=>133, "BFade"=>30, "ShowLabel"=>TRUE, "LabelPos"=>LABEL_POS_CENTER);

+ $myPicture->drawProgress(40,180,80,$progressOptions);

+

+ /* Draw a progress bar */ 

+ $progressOptions = array("Width"=>20, "Height"=>150, "R"=>209, "G"=>31, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255, "RFade"=>206, "GFade"=>133, "BFade"=>30, "ShowLabel"=>TRUE, "Orientation"=>ORIENTATION_VERTICAL, "LabelPos"=>LABEL_POS_BOTTOM);

+ $myPicture->drawProgress(500,200,77,$progressOptions);

+

+ /* Draw a progress bar */ 

+ $progressOptions = array("Width"=>20, "Height"=>150, "R"=>209, "G"=>125, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255,"NoAngle"=>TRUE, "ShowLabel"=>TRUE, "Orientation"=>ORIENTATION_VERTICAL, "LabelPos"=>LABEL_POS_TOP);

+ $myPicture->drawProgress(540,200,50,$progressOptions);

+

+ /* Draw a progress bar */ 

+ $progressOptions = array("Width"=>20, "Height"=>150, "R"=>209, "G"=>198, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255, "ShowLabel"=>TRUE, "Orientation"=>ORIENTATION_VERTICAL, "LabelPos"=>LABEL_POS_INSIDE);

+ $myPicture->drawProgress(580,200,25,$progressOptions);

+

+ /* Draw a progress bar */ 

+ $progressOptions = array("Width"=>20, "Height"=>150, "R"=>134, "G"=>209, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255, "RFade"=>206, "GFade"=>133, "BFade"=>30, "ShowLabel"=>TRUE, "Orientation"=>ORIENTATION_VERTICAL, "LabelPos"=>LABEL_POS_CENTER);

+ $myPicture->drawProgress(620,200,80,$progressOptions);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawProgress.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawRectangle.php
@@ -1,1 +1,56 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawRectangle() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Enable shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a rectangle */

+ $RectangleSettings = array("R"=>181,"G"=>209,"B"=>27,"Alpha"=>100);

+ $myPicture->drawRectangle(20,60,400,170,$RectangleSettings);

+

+ /* Draw a rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>134,"B"=>27,"Alpha"=>30);

+ $myPicture->drawRectangle(30,30,200,200,$RectangleSettings);

+

+ /* Draw a rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>100);

+ $myPicture->drawRectangle(480,50,650,80,$RectangleSettings);

+

+ /* Draw a rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>100);

+ $myPicture->drawRectangle(480,90,650,120,$RectangleSettings);

+

+ /* Draw a rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100,"Ticks"=>2);

+ $myPicture->drawRectangle(480,130,650,160,$RectangleSettings);

+

+ /* Draw a rectangle */

+ $RectangleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>100,"Ticks"=>2);

+ $myPicture->drawRectangle(480,170,650,200,$RectangleSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawRectangle.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawRoundedFilledRectangle.php
@@ -1,1 +1,62 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawRoundedFilledRectangle() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Enable shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a rounded filled rectangle */

+ $RectangleSettings = array("R"=>181,"G"=>209,"B"=>27,"Alpha"=>100);

+ $myPicture->drawRoundedFilledRectangle(20,60,400,170,10,$RectangleSettings);

+

+ /* Enable shadow computing */

+ $myPicture->setShadow(FALSE);

+

+ /* Draw a rounded filled rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>134,"B"=>27,"Alpha"=>30);

+ $myPicture->drawRoundedFilledRectangle(30,30,200,200,10,$RectangleSettings);

+

+ /* Enable shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a rounded filled rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>100,"Surrounding"=>30);

+ $myPicture->drawRoundedFilledRectangle(480,50,650,80,5,$RectangleSettings);

+

+ /* Draw a rounded filled rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>100,"Surrounding"=>30);

+ $myPicture->drawRoundedFilledRectangle(480,90,650,120,5,$RectangleSettings);

+

+ /* Draw a rounded filled rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100,"Surrounding"=>30);

+ $myPicture->drawRoundedFilledRectangle(480,130,650,160,5,$RectangleSettings);

+

+ /* Draw a rounded filled rectangle */

+ $RectangleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>100,"Surrounding"=>30);

+ $myPicture->drawRoundedFilledRectangle(480,170,650,200,5,$RectangleSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawRoundedFilledRectangle.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawRoundedRectangle.php
@@ -1,1 +1,56 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawRoundedRectangle() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Enable shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a rounded rectangle */

+ $RectangleSettings = array("R"=>181,"G"=>209,"B"=>27,"Alpha"=>100);

+ $myPicture->drawRoundedRectangle(20,60,400,170,10,$RectangleSettings);

+

+ /* Draw a rounded rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>134,"B"=>27,"Alpha"=>30);

+ $myPicture->drawRoundedRectangle(30,30,200,200,10,$RectangleSettings);

+

+ /* Draw a rounded rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>100);

+ $myPicture->drawRoundedRectangle(480,50,650,80,5,$RectangleSettings);

+

+ /* Draw a rounded rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>100);

+ $myPicture->drawRoundedRectangle(480,90,650,120,5,$RectangleSettings);

+

+ /* Draw a rounded rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100);

+ $myPicture->drawRoundedRectangle(480,130,650,160,5,$RectangleSettings);

+

+ /* Draw a rounded rectangle */

+ $RectangleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>100);

+ $myPicture->drawRoundedRectangle(480,170,650,200,5,$RectangleSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawRoundedRectangle.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScale.color.php
@@ -1,1 +1,68 @@
-
+<?php   

+ /* CAT:Scaling */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(24,-25,26,25,25),"Temperature");

+ $MyData->addPoints(array(1,2,VOID,9,10),"Humidity 1");

+ $MyData->addPoints(array(1,VOID,7,-9,0),"Humidity 2");

+ $MyData->addPoints(array(-1,-1,-1,-1,-1),"Humidity 3");

+ $MyData->addPoints(array(0,0,0,0,0),"Vide");

+ $MyData->setSerieOnAxis("Temperature",0);

+ $MyData->setSerieOnAxis("Humidity 1",1);

+ $MyData->setSerieOnAxis("Humidity 2",1);

+ $MyData->setSerieOnAxis("Humidity 3",1);

+ $MyData->setSerieOnAxis("Vide",2);

+ $MyData->setAxisPosition(2,AXIS_POSITION_RIGHT);

+ $MyData->setAxisName(0,"Temperature");

+ $MyData->setAxisName(1,"Humidity");

+ $MyData->setAxisName(2,"Empty value");

+

+ /* Associate a color to each axis */

+ $MyData->setAxisColor(0,array("R"=>102,"G"=>129,"B"=>63));

+ $MyData->setAxisColor(1,array("R"=>129,"G"=>72,"B"=>63));

+ $MyData->setAxisColor(2,array("R"=>63,"G"=>89,"B"=>129));

+

+ /* Create the abscissa serie */

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","My labels");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+

+ /* Write the chart title */

+ $myPicture->setGraphArea(90,60,660,190);

+ $myPicture->drawText(350,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+ $myPicture->drawFilledRectangle(90,60,660,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+

+ /* Draw the scale */

+ $myPicture->drawScale(array("DrawYLines"=>array(0),"Pos"=>SCALE_POS_LEFTRIGHT));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScale.color.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScale.dates.php
@@ -1,1 +1,54 @@
-
+<?php   

+ /* CAT:Scaling */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(1700,2500,7800,4500,3150),"Distance");

+ $MyData->setAxisName(0,"Maximum distance");

+ $MyData->setAxisUnit(0,"m");

+ $MyData->setAxisDisplay(0,AXIS_FORMAT_METRIC);

+

+ /* Create the abscissa serie */

+ $MyData->addPoints(array(1230768000,1233446400,1235865600,1238544000,1241136000,1243814400),"Timestamp");

+ $MyData->setSerieDescription("Timestamp","Sampled Dates");

+ $MyData->setAbscissa("Timestamp");

+ $MyData->setXAxisDisplay(AXIS_FORMAT_DATE);

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+

+ /* Write the chart title */

+ $myPicture->setGraphArea(60,60,660,190);

+ $myPicture->drawText(350,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+ $myPicture->drawFilledRectangle(60,60,660,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+

+ /* Draw the scale */

+ $myPicture->drawScale();

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScale.dates.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScale.floating.php
@@ -1,1 +1,52 @@
-
+<?php   

+ /* CAT:Scaling */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(8,10,24,25,25,24,23,22,20,12,10),"Temperature");

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+

+ /* Write the chart title */

+ $myPicture->setGraphArea(60,50,660,200);

+ $myPicture->drawText(350,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the scale */

+ $scaleSettings = array("XMargin"=>15,"YMargin"=>15,"Floating"=>TRUE,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);

+ $myPicture->drawScale($scaleSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScale.floating.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScale.manual.php
@@ -1,1 +1,54 @@
-
+<?php   

+ /* CAT:Scaling */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(24,-25,26,25,25),"Temperature");

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+

+ /* Write the chart title */

+ $myPicture->setGraphArea(60,60,660,190);

+ $myPicture->drawText(350,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+ $myPicture->drawFilledRectangle(60,60,660,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the scale */

+ $AxisBoundaries = array(0=>array("Min"=>0,"Max"=>100));

+ $ScaleSettings  = array("Mode"=>SCALE_MODE_MANUAL,"ManualScale"=>$AxisBoundaries,"DrawSubTicks"=>TRUE,"DrawArrows"=>TRUE,"ArrowSize"=>6);

+ $myPicture->drawScale($ScaleSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScale.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScale.multiple.php
@@ -1,1 +1,63 @@
-
+<?php   

+ /* CAT:Scaling */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(24,-25,26,25,25),"Temperature");

+ $MyData->addPoints(array(1,2,VOID,9,10),"Humidity 1");

+ $MyData->addPoints(array(1,VOID,7,-9,0),"Humidity 2");

+ $MyData->addPoints(array(-1,-1,-1,-1,-1),"Humidity 3");

+ $MyData->addPoints(array(0,0,0,0,0),"Vide");

+ $MyData->setSerieOnAxis("Temperature",0);

+ $MyData->setSerieOnAxis("Humidity 1",1);

+ $MyData->setSerieOnAxis("Humidity 2",1);

+ $MyData->setSerieOnAxis("Humidity 3",1);

+ $MyData->setSerieOnAxis("Vide",2);

+ $MyData->setAxisPosition(2,AXIS_POSITION_RIGHT);

+ $MyData->setAxisName(0,"Temperature");

+ $MyData->setAxisName(1,"Humidity");

+ $MyData->setAxisName(2,"Empty value");

+

+ /* Create the abscissa serie */

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","My labels");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+

+ /* Write the chart title */

+ $myPicture->setGraphArea(90,60,660,190);

+ $myPicture->drawText(350,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+ $myPicture->drawFilledRectangle(90,60,660,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+

+ /* Draw the scale */

+ $myPicture->drawScale(array("DrawYLines"=>array(0),"Pos"=>SCALE_POS_LEFTRIGHT));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScale.multiple.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScale.php
@@ -1,1 +1,52 @@
-
+<?php   

+ /* CAT:Scaling */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(24,-25,26,25,25),"Temperature");

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+

+ /* Write the chart title */

+ $myPicture->setGraphArea(60,60,660,190);

+ $myPicture->drawText(350,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+ $myPicture->drawFilledRectangle(60,60,660,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the scale */

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"DrawArrows"=>TRUE,"ArrowSize"=>6));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScale.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScale.reverse.php
@@ -1,1 +1,48 @@
-
+<?php   

+ /* CAT:Scaling */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(24,13,14),"Temperature");

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Sample #1","Sample #2","Sample #3"),"Labels");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+

+ /* Write the chart title */

+ $myPicture->setGraphArea(60,90,660,210);

+ $myPicture->drawText(360,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+ $myPicture->drawFilledRectangle(60,90,660,210,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+

+ /* Draw the scale */

+ $myPicture->drawScale(array("AutoAxisLabels"=>FALSE,"Pos"=>SCALE_POS_TOPBOTTOM));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScale.reverse.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScatter.simple.php
@@ -1,1 +1,67 @@
-
+<?php   

+ /* CAT:Scatter chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+ include("../class/pScatter.class.php");

+

+ /* Create the pData object */

+ $myData = new pData();  

+

+ /* Create the X axis and the binded series */

+ for ($i=0;$i<=10;$i=$i+1) { $myData->addPoints(rand(1,20),"Probe 1"); }

+ for ($i=0;$i<=10;$i=$i+1) { $myData->addPoints(rand(1,20),"Probe 2"); }

+ $myData->setAxisName(0,"X-Index");

+ $myData->setAxisXY(0,AXIS_X);

+ $myData->setAxisPosition(0,AXIS_POSITION_TOP);

+

+ /* Create the Y axis and the binded series */

+ for ($i=0;$i<=10;$i=$i+1) { $myData->addPoints(rand(1,20),"Probe 3"); }

+ $myData->setSerieOnAxis("Probe 3",1);

+ $myData->setAxisName(1,"Y-Index");

+ $myData->setAxisXY(1,AXIS_Y);

+ $myData->setAxisPosition(1,AXIS_POSITION_LEFT);

+

+ /* Create the 1st scatter chart binding */

+ $myData->setScatterSerie("Probe 1","Probe 3",0);

+ $myData->setScatterSerieDescription(0,"This year");

+ $myData->setScatterSerieColor(0,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Create the 2nd scatter chart binding */

+ $myData->setScatterSerie("Probe 2","Probe 3",1);

+ $myData->setScatterSerieDescription(1,"Last Year");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(400,400,$myData);

+

+ /* Turn of Anti-aliasing */

+ $myPicture->Antialias = FALSE;

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ 

+ /* Set the graph area */

+ $myPicture->setGraphArea(40,40,370,370);

+

+ /* Create the Scatter chart object */

+ $myScatter = new pScatter($myPicture,$myData);

+

+ /* Draw the scale */

+ $scaleSettings = array("XMargin"=>15,"YMargin"=>15,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);

+ $myScatter->drawScatterScale($scaleSettings);

+

+ /* Draw the legend */

+ $myScatter->drawScatterLegend(280,380,array("Mode"=>LEGEND_HORIZONTAL,"Style"=>LEGEND_NOBORDER));

+

+ /* Draw a scatter plot chart */

+ $myPicture->Antialias = TRUE;

+ $myScatter->drawScatterPlotChart();

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.example.drawScatterBestFit.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScatterBestFit.php
@@ -1,1 +1,81 @@
-
+<?php   

+ /* CAT:Mathematical */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+ include("../class/pScatter.class.php");

+

+ /* Create the pData object */

+ $myData = new pData();  

+

+ /* Create the X axis and the binded series */

+ for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(rand(1,20)*10+rand(0,$i),"Probe 1"); }

+ for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(rand(1,2)*10+rand(0,$i),"Probe 2"); }

+ $myData->setAxisName(0,"X-Index");

+ $myData->setAxisXY(0,AXIS_X);

+ $myData->setAxisPosition(0,AXIS_POSITION_TOP);

+

+ /* Create the Y axis and the binded series */

+ for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints($i,"Probe 3"); }

+ $myData->setSerieOnAxis("Probe 3",1);

+ $myData->setAxisName(1,"Y-Index");

+ $myData->setAxisXY(1,AXIS_Y);

+ $myData->setAxisPosition(1,AXIS_POSITION_LEFT);

+

+ /* Create the 1st scatter chart binding */

+ $myData->setScatterSerie("Probe 1","Probe 3",0);

+ $myData->setScatterSerieDescription(0,"This year");

+ $myData->setScatterSerieColor(0,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Create the 2nd scatter chart binding */

+ $myData->setScatterSerie("Probe 2","Probe 3",1);

+ $myData->setScatterSerieDescription(1,"Last Year");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(400,400,$myData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,400,400,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScatterBestFit() - Linear regression",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ 

+ /* Set the graph area */

+ $myPicture->setGraphArea(50,60,350,360);

+

+ /* Create the Scatter chart object */

+ $myScatter = new pScatter($myPicture,$myData);

+

+ /* Draw the scale */

+ $myScatter->drawScatterScale();

+

+ /* Turn on shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw a scatter plot chart */

+ $myScatter->drawScatterPlotChart();

+

+ /* Draw the legend */

+ $myScatter->drawScatterLegend(280,380,array("Mode"=>LEGEND_HORIZONTAL,"Style"=>LEGEND_NOBORDER));

+

+ /* Draw the line of best fit */

+ $myScatter->drawScatterBestFit();

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScatterBestFit.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScatterLineChart.php
@@ -1,1 +1,80 @@
-
+<?php   

+ /* CAT:Scatter chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+ include("../class/pScatter.class.php");

+

+ /* Create the pData object */

+ $myData = new pData();  

+

+ /* Create the X axis and the binded series */

+ for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(cos(deg2rad($i))*20,"Probe 1"); }

+ for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(sin(deg2rad($i))*20,"Probe 2"); }

+ $myData->setAxisName(0,"Index");

+ $myData->setAxisXY(0,AXIS_X);

+ $myData->setAxisPosition(0,AXIS_POSITION_BOTTOM);

+

+ /* Create the Y axis and the binded series */

+ for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints($i,"Probe 3"); }

+ $myData->setSerieOnAxis("Probe 3",1);

+ $myData->setAxisName(1,"Degree");

+ $myData->setAxisXY(1,AXIS_Y);


+ $myData->setAxisPosition(1,AXIS_POSITION_RIGHT);

+

+ /* Create the 1st scatter chart binding */

+ $myData->setScatterSerie("Probe 1","Probe 3",0);

+ $myData->setScatterSerieDescription(0,"This year");

+ $myData->setScatterSerieTicks(0,4);

+ $myData->setScatterSerieColor(0,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Create the 2nd scatter chart binding */

+ $myData->setScatterSerie("Probe 2","Probe 3",1);

+ $myData->setScatterSerieDescription(1,"Last Year");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(400,400,$myData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,400,400,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScatterLineChart() - Draw a scatter line chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ 

+ /* Set the graph area */

+ $myPicture->setGraphArea(50,50,350,350);

+

+ /* Create the Scatter chart object */

+ $myScatter = new pScatter($myPicture,$myData);

+

+ /* Draw the scale */

+ $myScatter->drawScatterScale();

+

+ /* Turn on shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw a scatter plot chart */

+ $myScatter->drawScatterLineChart();

+

+ /* Draw the legend */

+ $myScatter->drawScatterLegend(280,380,array("Mode"=>LEGEND_HORIZONTAL,"Style"=>LEGEND_NOBORDER));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScatterLineChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScatterLineChart.trigo.php
@@ -1,1 +1,75 @@
-
+<?php   

+ /* CAT:Scatter chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+ include("../class/pScatter.class.php");

+

+ /* Create the pData object */

+ $myData = new pData();  

+

+ /* Create the X axis and the binded series */

+ for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(cos(deg2rad($i))*20,"Probe 1"); }

+ $myData->setAxisName(0,"X-Index");

+ $myData->setAxisXY(0,AXIS_X);

+ $myData->setAxisPosition(0,AXIS_POSITION_BOTTOM);

+

+ /* Create the Y axis and the binded series */

+ for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(sin(deg2rad(30-$i))*20,"Probe 2"); }

+ $myData->setSerieOnAxis("Probe 2",1);

+ $myData->setAxisName(1,"Y-Index");

+ $myData->setAxisXY(1,AXIS_Y);

+ $myData->setAxisPosition(1,AXIS_POSITION_RIGHT);

+

+ /* Create the 1st scatter chart binding */

+ $myData->setScatterSerie("Probe 1","Probe 2",0);

+ $myData->setScatterSerieDescription(0,"Trigonometric function");

+ $myData->setScatterSerieTicks(0,4);

+ $myData->setScatterSerieColor(0,array("R"=>180,"G"=>0,"B"=>0));

+ $myData->setScatterSeriePicture(0,"resources/chart_line.png");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(400,400,$myData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,400,400,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScatterLineChart() - Draw a scatter line chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ 

+ /* Set the graph area */

+ $myPicture->setGraphArea(50,50,350,350);

+

+ /* Create the Scatter chart object */

+ $myScatter = new pScatter($myPicture,$myData);

+

+ /* Draw the scale */

+ $myScatter->drawScatterScale();

+

+ /* Turn on shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw a scatter plot chart */

+ $myScatter->drawScatterLineChart();

+

+ /* Draw the legend */

+ $myScatter->drawScatterLegend(270,375,array("Mode"=>LEGEND_HORIZONTAL,"Style"=>LEGEND_NOBORDER));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScatterLineChart.trigo.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScatterPlotChart.php
@@ -1,1 +1,80 @@
-
+<?php   

+ /* CAT:Scatter chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+ include("../class/pScatter.class.php");

+

+ /* Create the pData object */

+ $myData = new pData();  

+

+ /* Create the X axis and the binded series */

+ for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(cos(deg2rad($i))*20,"Probe 1"); }

+ for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(sin(deg2rad($i))*20,"Probe 2"); }

+ $myData->setAxisName(0,"Index");

+ $myData->setAxisXY(0,AXIS_X);

+ $myData->setAxisPosition(0,AXIS_POSITION_BOTTOM);

+

+ /* Create the Y axis and the binded series */

+ for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints($i,"Probe 3"); }

+ $myData->setSerieOnAxis("Probe 3",1);

+ $myData->setAxisName(1,"Degree");

+ $myData->setAxisXY(1,AXIS_Y);


+ $myData->setAxisPosition(1,AXIS_POSITION_RIGHT);

+

+ /* Create the 1st scatter chart binding */

+ $myData->setScatterSerie("Probe 1","Probe 3",0);

+ $myData->setScatterSerieDescription(0,"This year");

+ $myData->setScatterSerieColor(0,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Create the 2nd scatter chart binding */

+ $myData->setScatterSerie("Probe 2","Probe 3",1);

+ $myData->setScatterSerieDescription(1,"Last Year");

+ $myData->setScatterSeriePicture(1,"resources/accept.png");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(400,400,$myData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,400,400,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScatterPlotChart() - Draw a scatter plot chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ 

+ /* Set the graph area */

+ $myPicture->setGraphArea(50,50,350,350);

+

+ /* Create the Scatter chart object */

+ $myScatter = new pScatter($myPicture,$myData);

+

+ /* Draw the scale */

+ $myScatter->drawScatterScale();

+

+ /* Turn on shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw a scatter plot chart */

+ $myScatter->drawScatterPlotChart();

+

+ /* Draw the legend */

+ $myScatter->drawScatterLegend(260,375,array("Mode"=>LEGEND_HORIZONTAL,"Style"=>LEGEND_NOBORDER));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScatterPlotChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScatterScale.manual.php
@@ -1,1 +1,61 @@
-
+<?php   

+ /* CAT:Scatter chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+ include("../class/pScatter.class.php");

+

+ /* Create the pData object */

+ $myData = new pData();  

+

+ /* Create the X axis and the binded series */

+ $myData->addPoints(array(3,12,15,8,5,-5),"X Values");

+ $myData->setAxisName(0,"X Values");

+ $myData->setAxisXY(0,AXIS_X);

+ $myData->setAxisDisplay(0,AXIS_FORMAT_TIME,"i:s");

+ $myData->setAxisPosition(0,AXIS_POSITION_BOTTOM);

+

+ /* Create the Y axis and the binded series */

+ $myData->addPoints(array(2,7,5,18,19,22),"Y Values");

+ $myData->setSerieOnAxis("Y Values",1);

+ $myData->setAxisName(1,"Y Values");

+ $myData->setAxisXY(1,AXIS_Y);

+

+ /* Create the pChart object */

+ $myPicture = new pImage(400,400,$myData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,400,400,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScatterScale() - Draw the scatter chart scale",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ 

+ /* Set the graph area */

+ $myPicture->setGraphArea(50,50,350,350);

+

+ /* Create the Scatter chart object */

+ $myScatter = new pScatter($myPicture,$myData);

+

+ /* Draw the scale */

+ $AxisBoundaries = array(0=>array("Min"=>0,"Max"=>3600,"Rows"=>12,"RowHeight"=>300),1=>array("Min"=>0,"Max"=>100));

+ $ScaleSettings  = array("Mode"=>SCALE_MODE_MANUAL,"ManualScale"=>$AxisBoundaries,"DrawSubTicks"=>TRUE);

+ $myScatter->drawScatterScale($ScaleSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScatterScale.manual.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScatterScale.php
@@ -1,1 +1,62 @@
-
+<?php   

+ /* CAT:Scatter chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+ include("../class/pScatter.class.php");

+

+ /* Create the pData object */

+ $myData = new pData();  

+

+ /* Create the X axis and the binded series */

+ $myData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");

+ $myData->addPoints(array(3,12,15,8,5,-5),"Probe 2");

+ $myData->setAxisName(0,"Temperatures");

+ $myData->setAxisXY(0,AXIS_X);


+ $myData->setAxisPosition(0,AXIS_POSITION_BOTTOM);

+

+ /* Create the Y axis and the binded series */

+ $myData->addPoints(array(2,7,5,18,19,22),"Probe 3");

+ $myData->setSerieOnAxis("Probe 3",1);

+ $myData->setAxisName(1,"Humidity");

+ $myData->setAxisXY(1,AXIS_Y);

+ $myData->setAxisUnit(1,"%");

+ $myData->setAxisPosition(1,AXIS_POSITION_RIGHT);

+

+ /* Create the pChart object */

+ $myPicture = new pImage(400,400,$myData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,400,400,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScatterScale() - Draw the scatter chart scale",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ 

+ /* Set the graph area */

+ $myPicture->setGraphArea(50,50,350,350);

+

+ /* Create the Scatter chart object */

+ $myScatter = new pScatter($myPicture,$myData);

+

+ /* Draw the scale */

+ $myScatter->drawScatterScale();

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScatterScale.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawScatterSplineChart.php
@@ -1,1 +1,81 @@
-
+<?php   

+ /* CAT:Scatter chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+ include("../class/pScatter.class.php");

+

+ /* Create the pData object */

+ $myData = new pData();  

+

+ /* Create the X axis and the binded series */

+ for ($i=0;$i<=360;$i=$i+90) { $myData->addPoints(rand(1,30),"Probe 1"); }

+ for ($i=0;$i<=360;$i=$i+90) { $myData->addPoints(rand(1,30),"Probe 2"); }

+ $myData->setAxisName(0,"Index");

+ $myData->setAxisXY(0,AXIS_X);

+ $myData->setAxisPosition(0,AXIS_POSITION_BOTTOM);

+

+ /* Create the Y axis and the binded series */

+ for ($i=0;$i<=360;$i=$i+90) { $myData->addPoints($i,"Probe 3"); }

+ $myData->setSerieOnAxis("Probe 3",1);

+ $myData->setAxisName(1,"Degree");

+ $myData->setAxisXY(1,AXIS_Y);


+ $myData->setAxisPosition(1,AXIS_POSITION_RIGHT);

+

+ /* Create the 1st scatter chart binding */

+ $myData->setScatterSerie("Probe 1","Probe 3",0);

+ $myData->setScatterSerieDescription(0,"This year");

+ $myData->setScatterSerieTicks(0,4);

+ $myData->setScatterSerieColor(0,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Create the 2nd scatter chart binding */

+ $myData->setScatterSerie("Probe 2","Probe 3",1);

+ $myData->setScatterSerieDescription(1,"Last Year");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(400,400,$myData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,400,400,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawScatterSplineChart() - Draw a scatter spline chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ 

+ /* Set the graph area */

+ $myPicture->setGraphArea(50,50,350,350);

+

+ /* Create the Scatter chart object */

+ $myScatter = new pScatter($myPicture,$myData);

+

+ /* Draw the scale */

+ $myScatter->drawScatterScale();

+

+ /* Turn on shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw a scatter plot chart */

+ $myScatter->drawScatterSplineChart();

+ $myScatter->drawScatterPlotChart();

+

+ /* Draw the legend */

+ $myScatter->drawScatterLegend(280,380,array("Mode"=>LEGEND_HORIZONTAL,"Style"=>LEGEND_NOBORDER));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawScatterSplineChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawSimple.php
@@ -1,1 +1,42 @@
-
+<?php   

+ /* CAT:Misc */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(2,7,5,18,19,22,23,25,22,12,10,10),"DEFCA");

+ $MyData->setAxisName(0,"$ Incomes");

+ $MyData->setAxisDisplay(0,AXIS_FORMAT_CURRENCY);

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aou","Sep","Oct","Nov","Dec"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+ $MyData->setPalette("DEFCA",array("R"=>55,"G"=>91,"B"=>127));

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>220,"StartG"=>220,"StartB"=>220,"EndR"=>255,"EndG"=>255,"EndB"=>255,"Alpha"=>100));

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>200,"G"=>200,"B"=>200));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(60,35,"2k9 Average Incomes",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMLEFT));

+

+ /* Do some cosmetic and draw the chart */

+ $myPicture->setGraphArea(60,40,670,190);

+ $myPicture->drawFilledRectangle(60,40,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("GridR"=>180,"GridG"=>180,"GridB"=>180));

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawSplineChart();

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */ 

+ $myPicture->drawLegend(643,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawSimple.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawSpline.php
@@ -1,1 +1,42 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawSpline() - for smooth line drawing",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Enable shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a spline */

+ $SplineSettings = array("R"=>255,"G"=>255,"B"=>255,"ShowControl"=>TRUE);

+ $Coordinates = array(array(40,80),array(280,60),array(340,166),array(590,120));

+ $myPicture->drawSpline($Coordinates,$SplineSettings);

+

+ /* Draw a spline */

+ $SplineSettings = array("R"=>255,"G"=>255,"B"=>255,"ShowControl"=>TRUE,"Ticks"=>4);

+ $Coordinates = array(array(250,50),array(250,180),array(350,180),array(350,50));

+ $myPicture->drawSpline($Coordinates,$SplineSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawSpline.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawSplineChart.php
@@ -1,1 +1,66 @@
-
+<?php   

+ /* CAT:Spline chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");

+ $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");

+ $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");

+ $MyData->setSerieTicks("Probe 2",4);

+ $MyData->setAxisName(0,"Temperatures");


+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawSplineChart() - draw a spline chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw the scale and the 1st chart */

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawSplineChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));

+ $myPicture->setShadow(FALSE);

+

+ /* Draw the scale and the 2nd chart */

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawSplineChart();

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawSplineChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawSplineChart.simple.php
@@ -1,1 +1,55 @@
-
+<?php   

+ /* CAT:Spline chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");

+ $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");

+ $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");

+ $MyData->setSerieTicks("Probe 2",4);

+ $MyData->setSerieWeight("Probe 3",2);

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Turn of Antialiasing */

+ $myPicture->Antialias = FALSE;

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(150,35,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Define the chart area */

+ $myPicture->setGraphArea(60,40,650,200);

+

+ /* Draw the scale */

+ $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);

+ $myPicture->drawScale($scaleSettings);

+

+ /* Turn on Antialiasing */

+ $myPicture->Antialias = TRUE;

+

+ /* Draw the line chart */

+ $myPicture->drawSplineChart();

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(540,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawSplineChart.simple.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawStackedAreaChart.normalized.php
@@ -1,1 +1,43 @@
-
+<?php   

+ /* CAT:Stacked chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(4,0,0,12,8,3,0,12,8),"Frontend #1");

+ $MyData->addPoints(array(3,12,15,8,5,5,12,15,8),"Frontend #2");

+ $MyData->addPoints(array(2,7,5,18,19,22,7,5,18),"Frontend #3");

+ $MyData->setAxisName(0,"Average Usage");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jui","Aug","Sep"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Normalize the data series to 100% */

+ $MyData->normalize(100,"%");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));

+

+ /* Set the default font properties */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the scale and the chart */ 

+ $myPicture->setGraphArea(60,20,680,190);

+ $myPicture->drawScale(array("XMargin"=>2,"DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_ADDALL));

+ $myPicture->drawStackedAreaChart(array("Surrounding"=>60));

+

+ /* Turn on shadow processing */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Write the chart legend */ 

+ $myPicture->drawLegend(480,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawStackedAreaChart.normalized.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawStackedAreaChart.php
@@ -1,1 +1,63 @@
-
+<?php   

+ /* CAT:Stacked chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(1,-2,-1,2,1,0),"Probe 1");

+ $MyData->addPoints(array(1,-2,-3,2,1,8),"Probe 2");

+ $MyData->addPoints(array(2,4,2,0,4,2),"Probe 3");

+ $MyData->setSerieTicks("Probe 2",4);

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawStackedAreaChart() - draw a stacked area chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw the scale and the 1st chart */

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_ADDALL));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->setShadow(FALSE);

+ $myPicture->drawStackedAreaChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Surrounding"=>20));

+

+ /* Draw the scale and the 2nd chart */

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"Mode"=>SCALE_MODE_ADDALL,"DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(FALSE);

+ $myPicture->drawStackedAreaChart(array("Surrounding"=>10));

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawStackedAreaChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawStackedBarChart.can.php
@@ -1,1 +1,42 @@
-
+<?php   

+ /* CAT:Stacked chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Frontend #1");

+ $MyData->addPoints(array(3,12,15,8,5,-5),"Frontend #2");

+ $MyData->addPoints(array(2,7,5,18,19,22),"Frontend #3");

+ $MyData->setAxisName(0,"Average Usage");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Normalize all the data series to 100% */

+ $MyData->normalize(100,"%");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));

+

+ /* Set the default font properties */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the scale and the chart */

+ $myPicture->setGraphArea(60,20,680,190);

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_ADDALL));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawStackedBarChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Gradient"=>TRUE,"GradientMode"=>GRADIENT_EFFECT_CAN,"Surrounding"=>30));

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(480,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawStackedBarChart.can.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawStackedBarChart.php
@@ -1,1 +1,65 @@
-
+<?php   

+ /* CAT:Stacked chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");

+ $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");

+ $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");

+ $MyData->setSerieTicks("Probe 2",4);

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawStackedBarChart() - draw a stacked bar chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw the scale and the 1st chart */

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_ADDALL));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawStackedBarChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Rounded"=>TRUE,"Surrounding"=>60));

+ $myPicture->setShadow(FALSE);

+

+ /* Draw the scale and the 2nd chart */

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"Mode"=>SCALE_MODE_ADDALL,"DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawStackedBarChart();

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawStackedBarChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawStackedBarChart.rounded.php
@@ -1,1 +1,53 @@
-
+<?php   

+ /* CAT:Stacked chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-7,-8,-15,-20,-18,-12,8,-19,9,16,-20,8,10,-10,-14,-20,8,-9,-19),"Probe 3");

+ $MyData->addPoints(array(19,0,-8,8,-8,12,-19,-10,5,12,-20,-8,10,-11,-12,8,-17,-14,0),"Probe 4");

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array(4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22),"Time");

+ $MyData->setSerieDescription("Time","Hour of the day");

+ $MyData->setAbscissa("Time");

+ $MyData->setXAxisUnit("h");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+

+ /* Set the default font properties */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the scale */

+ $myPicture->setGraphArea(60,30,650,190);

+ $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10,"Mode"=>SCALE_MODE_ADDALL));

+

+ /* Turn on shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Draw some thresholds */

+ $myPicture->setShadow(FALSE);

+ $myPicture->drawThreshold(-40,array("WriteCaption"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Ticks"=>4));

+ $myPicture->drawThreshold(28,array("WriteCaption"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Ticks"=>4));

+

+ /* Draw the chart */

+ $myPicture->drawStackedBarChart(array("Rounded"=>TRUE,"DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"DisplaySize"=>6,"BorderR"=>255,"BorderG"=>255,"BorderB"=>255));

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(570,212,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawStackedBarChart.rounded.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawStackedBarChart.shaded.php
@@ -1,1 +1,42 @@
-
+<?php   

+ /* CAT:Stacked chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Frontend #1");

+ $MyData->addPoints(array(3,12,15,8,5,-5),"Frontend #2");

+ $MyData->addPoints(array(2,7,5,18,19,22),"Frontend #3");

+ $MyData->setAxisName(0,"Average Usage");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Normalize all the data series to 100% */

+ $MyData->normalize(100,"%");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));

+

+ /* Set the default font properties */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the scale and the chart */

+ $myPicture->setGraphArea(60,20,680,190);

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_ADDALL));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawStackedBarChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Gradient"=>TRUE,"Surrounding"=>30));

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(480,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawStackedBarChart.shaded.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawStepChart.php
@@ -1,1 +1,65 @@
-
+<?php   

+ /* CAT:Step chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");

+ $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");

+ $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");

+ $MyData->setSerieTicks("Probe 2",4);

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawStepChart() - draw a step chart",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw the scale and the 1st chart */

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawStepChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));

+ $myPicture->setShadow(FALSE);

+

+ /* Draw the scale and the 2nd chart */

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>-1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawStepChart();

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawStepChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawStepChart.simple.php
@@ -1,1 +1,44 @@
-
+<?php

+ /* CAT:Step chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(VOID,VOID,VOID,2,6,3),"Probe 1");

+ $MyData->addPoints(array(13,12,15,18,15,10),"Probe 2");

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Turn of AAliasing */

+ $myPicture->Antialias = FALSE;

+

+ /* Draw the border */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Define the chart area */

+ $myPicture->setGraphArea(60,30,650,190);

+

+ /* Draw the scale */

+ $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);

+ $myPicture->drawScale($scaleSettings);

+

+ /* Draw the step chart */

+ $myPicture->drawStepChart();

+

+ /* Write the chart legend */

+ $myPicture->drawLegend(590,17,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawStepChart.simple.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawStockChart.php
@@ -1,1 +1,65 @@
-
+<?php

+ /* CAT:Stock chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+ include("../class/pStock.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(34,55,15,62,38,42),"Open");

+ $MyData->addPoints(array(42,25,40,38,49,36),"Close");

+ $MyData->addPoints(array(27,14,12,25,32,32),"Min");

+ $MyData->addPoints(array(45,59,47,65,64,48),"Max");

+ $MyData->setAxisDisplay(0,AXIS_FORMAT_CURRENCY,"$");

+

+ $MyData->addPoints(array("8h","10h","12h","14h","16h","18h"),"Time");

+ $MyData->setAbscissa("Time");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+

+ /* Draw the border */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the title */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(60,45,"Stock price",array("FontSize"=>28,"Align"=>TEXT_ALIGN_BOTTOMLEFT));

+

+ /* Draw the 1st scale */

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE));

+

+ /* Draw the 1st stock chart */

+ $mystockChart = new pStock($myPicture,$MyData);

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>30));

+ $mystockChart->drawStockChart();

+

+ /* Reset the display mode because of the graph small size */

+ $MyData->setAxisDisplay(0,AXIS_FORMAT_DEFAULT);

+

+ /* Draw the 2nd scale */

+ $myPicture->setShadow(FALSE);

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));

+

+ /* Draw the 2nd stock chart */

+ $mystockChart = new pStock($myPicture,$MyData);

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>30));

+ $mystockChart->drawStockChart();

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawStockChart.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawStockChart.simple.php
@@ -1,1 +1,48 @@
-
+<?php

+ /* CAT:Stock chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+ include("../class/pStock.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(35,28,17,27,12,12,20,15,20,28),"Open");

+ $MyData->addPoints(array(20,17,25,20,25,23,16,29,26,17),"Close");

+ $MyData->addPoints(array(10,11,14,11,9,4,3,7,9,5),"Min");

+ $MyData->addPoints(array(37,32,33,29,29,25,22,34,29,31),"Max");

+ $MyData->setAxisDisplay(0,AXIS_FORMAT_CURRENCY,"$");

+

+ $MyData->addPoints(array("Dec 13","Dec 14","Dec 15","Dec 16","Dec 17", "Dec 20","Dec 21","Dec 22","Dec 23","Dec 24"),"Time");

+ $MyData->setAbscissa("Time");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Turn of AAliasing */

+ $myPicture->Antialias = FALSE;

+

+ /* Draw the border */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Define the chart area */

+ $myPicture->setGraphArea(60,30,650,190);

+

+ /* Draw the scale */

+ $scaleSettings = array("GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);

+ $myPicture->drawScale($scaleSettings);

+

+ /* Create the pStock object */

+ $mystockChart = new pStock($myPicture,$MyData);

+

+ /* Draw the stock chart */

+ $stockSettings = array("BoxUpR"=>255,"BoxUpG"=>255,"BoxUpB"=>255,"BoxDownR"=>0,"BoxDownG"=>0,"BoxDownB"=>0);

+ $mystockChart->drawStockChart($stockSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawStockChart.simple.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawText.php
@@ -1,1 +1,55 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawText() - add some text to your charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Write some text */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/advent_light.ttf","FontSize"=>20));

+ $TextSettings = array("R"=>255,"G"=>255,"B"=>255,"Angle"=>10);

+ $myPicture->drawText(60,115,"10 degree text",$TextSettings);

+

+ /* Write some text */ 

+ $TextSettings = array("R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>40);

+ $myPicture->drawText(220,130,"Simple text",$TextSettings);

+

+ /* Write some text */ 

+ $TextSettings = array("R"=>200,"G"=>100,"B"=>0,"Angle"=>90,"FontSize"=>14);

+ $myPicture->drawText(500,170,"Vertical Text",$TextSettings);

+

+ /* Write some text */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Bedizen.ttf","FontSize"=>6));

+ $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>10);

+ $myPicture->drawText(220,160,"Encapsulated text",$TextSettings);

+

+ /* Write some text */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>6));

+ $TextSettings = array("DrawBox"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>10);

+ $myPicture->drawText(220,195,"Text in a box",$TextSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawText.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawThreshold.labels.php
@@ -1,1 +1,53 @@
-
+<?php   

+ /* CAT:Misc */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(2,7,5,18,VOID,12,10,15,8,5,6,9),"Help Desk");

+ $MyData->setAxisName(0,"Incidents");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jui","Aou","Sep","Oct","Nov","Dec"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>100,"StartG"=>100,"StartB"=>100,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>100,"StartG"=>100,"StartB"=>100,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>20));

+ $myPicture->drawGradientArea(0,0,60,230,DIRECTION_HORIZONTAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

+

+ /* Do some cosmetics */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawLine(60,0,60,230,array("R"=>70,"G"=>70,"B"=>70));

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(35,115,"Recorded cases",array("R"=>255,"G"=>255,"B"=>255,"FontSize"=>20,"Angle"=>90,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Prepare the chart area */

+ $myPicture->setGraphArea(100,30,680,190);

+ $myPicture->drawFilledRectangle(100,30,680,190,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>20));

+ $myPicture->setFontProperties(array("R"=>255,"G"=>255,"B"=>255,"FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawScale(array("AxisR"=>255,"AxisG"=>255,"AxisB"=>255,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE));

+

+ /* Write two thresholds over the chart */

+ $myPicture->drawThreshold(10,array("WriteCaption"=>TRUE,"Caption"=>"Agreed SLA"));

+ $myPicture->drawThreshold(15,array("WriteCaption"=>TRUE,"Caption"=>"Best effort"));

+

+ /* Draw the chart */

+ $myPicture->drawSplineChart();

+ $myPicture->drawPlotChart();

+

+

+ /* Write the data bounds */

+ $myPicture->writeBounds();

+

+ /* Write the chart legend */ 

+ $myPicture->drawLegend(630,215,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawThreshold.labels.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawThreshold.php
@@ -1,1 +1,69 @@
-
+<?php   

+ /* CAT:Misc */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(24,-25,26,25,25),"Temperature");

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawThreshold() - draw a treshold in the charting area",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(250,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw the scale and do some cosmetics */ 

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); 

+

+ /* Draw one static threshold */ 

+ $myPicture->drawThreshold(5,array("Alpha"=>70,"Ticks"=>1));

+

+ /* Draw one static threshold */ 

+ $myPicture->drawThreshold(15,array("Alpha"=>70,"Ticks"=>2,"R"=>0,"G"=>0,"B"=>255));

+

+ /* Disable shadow computing */ 

+ $myPicture->setShadow(FALSE);

+

+ /* Draw the scale and do some cosmetics */ 

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); 

+

+ /* Draw one static threshold */ 

+ $myPicture->drawThreshold(5,array("Alpha"=>70,"Ticks"=>1));

+

+ /* Draw one static threshold */ 

+ $myPicture->drawThreshold(15,array("Alpha"=>70,"Ticks"=>2,"R"=>0,"G"=>0,"B"=>255));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawThreshold.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawThresholdArea.php
@@ -1,1 +1,58 @@
-
+<?php   

+ /* CAT:Misc */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(24,-25,26,25,25),"Temperature");

+ $MyData->setAxisName(0,"Temperatures");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"drawThresholdArea() - draw treshold areas in the charting area",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Write the chart title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(250,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw the scale and do some cosmetics */ 

+ $myPicture->setGraphArea(60,60,450,190);

+ $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE));

+

+ /* Draw one static threshold area */

+ $myPicture->drawThresholdArea(5,15,array("R"=>226,"G"=>194,"B"=>54,"Alpha"=>40));

+

+ /* Draw the scale and do some cosmetics */ 

+ $myPicture->setGraphArea(500,60,670,190);

+ $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));

+ $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));

+

+ /* Draw one static threshold area */

+ $myPicture->drawThresholdArea(5,15,array("R"=>206,"G"=>231,"B"=>64,"Alpha"=>20));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawThresholdArea.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.drawingObjects.php
@@ -1,1 +1,50 @@
-
+<?php   

+ /* CAT:Misc */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Define default font settings */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>14)); 

+

+ /* Create the background */

+ $myPicture->drawGradientArea(0,0,500,230,DIRECTION_HORIZONTAL,array("StartR"=>217,"StartG"=>250,"StartB"=>116,"EndR"=>181,"EndG"=>209,"EndB"=>27,"Alpha"=>100));

+ $RectangleSettings = array("R"=>181,"G"=>209,"B"=>27,"Alpha"=>100);

+ $myPicture->drawFilledRectangle(500,0,700,230,$RectangleSettings);

+

+ /* Enable shadow computing on a (+1,+1) basis */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw the left area */

+ $RectangleSettings = array("R"=>181,"G"=>209,"B"=>27,"Alpha"=>100);

+ $myPicture->drawRoundedFilledRectangle(-5,0,20,240,10,$RectangleSettings); 

+ $TextSettings = array("R"=>255,"G"=>255,"B"=>255,"Angle"=>90,"Align"=>TEXT_ALIGN_MIDDLELEFT); 

+ $myPicture->drawText(10,220,"My first chart",$TextSettings);

+

+ /* Draw the right area */

+ $RectangleSettings = array("R"=>191,"G"=>219,"B"=>37,"Alpha"=>100,"Surrounding"=>20,"Ticks"=>2);

+ $myPicture->drawFilledRectangle(510,10,689,219,$RectangleSettings);

+

+ /* Write the legend */

+ $TextSettings = array("R"=>255,"G"=>255,"B"=>255,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE); 

+ $myPicture->drawText(600,30,"Weather data",$TextSettings);

+ $TextSettings = array("R"=>106,"G"=>125,"B"=>3,"Align"=>TEXT_ALIGN_TOPLEFT,"FontSize"=>11); 

+ $myPicture->drawText(520,45,"The   data  shown  here   has   been",$TextSettings);

+ $myPicture->drawText(520,60,"collected from European locations",$TextSettings);

+ $myPicture->drawText(520,75,"by the French NAVI system.",$TextSettings);

+ $myPicture->drawFromPNG(540,90,"resources/blocnote.png");

+

+ /* Disable shadow computing  */

+ $myPicture->setShadow(FALSE);

+

+ /* Draw the picture border */

+ $RectangleSettings = array("R"=>181,"G"=>209,"B"=>27,"Alpha"=>100);

+ $myPicture->drawRectangle(0,0,699,229,$RectangleSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.drawingObjects.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.normalize.php
@@ -1,1 +1,42 @@
-
+<?php   

+ /* CAT:Mathematical */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Frontend #1");

+ $MyData->addPoints(array(3,12,15,8,5,-5),"Frontend #2");

+ $MyData->addPoints(array(2,7,5,18,19,22),"Frontend #3");

+ $MyData->setAxisName(0,"Average Usage");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Normalize the data series to 100% */

+ $MyData->normalize(100,"%");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));

+

+ /* Set the default font properties */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+

+ /* Draw the scale and the chart */ 

+ $myPicture->setGraphArea(60,20,680,190);

+ $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_ADDALL));

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawStackedBarChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Rounded"=>FALSE,"Surrounding"=>60));

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */ 

+ $myPicture->drawLegend(480,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.normalize.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.pData.php
@@ -1,1 +1,46 @@
-
+<?php   

+ /* CAT:Misc */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(24,25,26,25,25),"My Serie 1");

+ $MyData->addPoints(array(12,13,14,16,18),"My Serie 2");

+ $MyData->addPoints(array(80,76,73,71,33),"My Serie 3");

+ $MyData->addPoints(array(47,67,78,76,54),"My Serie 4");

+ 

+ /* Define the series name */

+ $MyData->setSerieDescription("My Serie 1","Temperature");

+ $MyData->setSerieDescription("My Serie 2","Humidity");

+

+ /* Dispatche the series on different axis */

+ $MyData->setSerieOnAxis("My Serie 1",1);

+ $MyData->setSerieOnAxis("My Serie 2",1);

+ $MyData->setSerieOnAxis("My Serie 3",2);

+ $MyData->setSerieOnAxis("My Serie 4",2);

+

+ /* Set the format of the axis */

+ $MyData->setAxisDisplay(1,AXIS_FORMAT_DEFAULT);

+ $MyData->setAxisDisplay(2,AXIS_FORMAT_DEFAULT);

+ $MyData->setAxisDisplay(1,AXIS_FORMAT_TIME,"H:i");

+

+ /* Set the unit of the axis */


+ $MyData->setAxisUnit(2,"%");

+

+ /* Set the name of the axis */

+ $MyData->setAxisName(1,"Temperature");

+ $MyData->setAxisName(2,"Humidity");

+

+ /* Change the color of one serie */

+ $serieSettings = array("R"=>229,"G"=>11,"B"=>11,"Alpha"=>80); 

+ $MyData->setPalette("My Serie 4",$serieSettings);

+

+ /* Load a palette file */

+ $MyData->loadPalette("resources/palette.txt",FALSE);

+ 

+ /* Output the data structure */

+ print_r($MyData->getData());

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.polar.php
@@ -1,1 +1,65 @@
-
+<?php   

+ /* CAT:Polar and radars */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pRadar.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();   

+ $MyData->addPoints(array(10,20,30,40,50,60,70,80,90),"ScoreA"); 

+ $MyData->addPoints(array(20,40,50,12,10,30,40,50,60),"ScoreB"); 

+ $MyData->setSerieDescription("ScoreA","Coverage A");

+ $MyData->setSerieDescription("ScoreB","Coverage B");

+

+ /* Define the absissa serie */

+ $MyData->addPoints(array(40,80,120,160,200,240,280,320,360),"Coord");

+ $MyData->setAbscissa("Coord");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw a solid background */

+ $Settings = array("R"=>179, "G"=>217, "B"=>91, "Dash"=>1, "DashR"=>199, "DashG"=>237, "DashB"=>111);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay some gradient areas */

+ $Settings = array("StartR"=>194, "StartG"=>231, "StartB"=>44, "EndR"=>43, "EndG"=>107, "EndB"=>58, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"pRadar - Draw polar charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font properties */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Create the pRadar object */ 

+ $SplitChart = new pRadar();

+

+ /* Draw a polar chart */ 

+ $myPicture->setGraphArea(10,25,340,225);

+ $Options = array("BackgroundGradient"=>array("StartR"=>255,"StartG"=>255,"StartB"=>255,"StartAlpha"=>100,"EndR"=>207,"EndG"=>227,"EndB"=>125,"EndAlpha"=>50), "FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6);

+ $SplitChart->drawPolar($myPicture,$MyData,$Options);

+

+ /* Draw a polar chart */ 

+ $myPicture->setGraphArea(350,25,690,225);

+ $Options = array("LabelPos"=>RADAR_LABELS_HORIZONTAL,"BackgroundGradient"=>array("StartR"=>255,"StartG"=>255,"StartB"=>255,"StartAlpha"=>50,"EndR"=>32,"EndG"=>109,"EndB"=>174,"EndAlpha"=>30),"AxisRotation"=>0,"DrawPoly"=>TRUE,"PolyAlpha"=>50, "FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6);

+ $SplitChart->drawPolar($myPicture,$MyData,$Options);

+

+ /* Write the chart legend */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawLegend(270,205,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.polar.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.radar.labels.php
@@ -1,1 +1,50 @@
-
+<?php   

+ /* CAT:Polar and radars */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pRadar.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();   

+ $MyData->addPoints(array(4,4,10,10,4,4,15,15,4,4,10,10,4,4,15,15,4,4,10,10,4,4,15,15),"ScoreA");  

+ $MyData->setSerieDescription("ScoreA","Application A");

+ $MyData->setPalette("ScoreA",array("R"=>150,"G"=>5,"B"=>217));

+

+ /* Define the absissa serie */

+ $MyData->addPoints(array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24),"Time");

+ $MyData->setAbscissa("Time");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(300,300,$MyData);

+ $myPicture->drawGradientArea(0,0,300,300,DIRECTION_VERTICAL,array("StartR"=>200,"StartG"=>200,"StartB"=>200,"EndR"=>240,"EndG"=>240,"EndB"=>240,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,300,20,DIRECTION_HORIZONTAL,array("StartR"=>30,"StartG"=>30,"StartB"=>30,"EndR"=>100,"EndG"=>100,"EndB"=>100,"Alpha"=>100));

+ $myPicture->drawLine(0,20,300,20,array("R"=>255,"G"=>255,"B"=>255));

+ $RectangleSettings = array("R"=>180,"G"=>180,"B"=>180,"Alpha"=>100);

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,299,299,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"pRadar - Draw radar charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font properties */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Create the pRadar object */ 

+ $SplitChart = new pRadar();

+

+ /* Draw a radar chart */ 

+ $myPicture->setGraphArea(10,25,290,290);

+ $Options = array("SkipLabels"=>3,"LabelMiddle"=>TRUE,"Layout"=>RADAR_LAYOUT_STAR,"BackgroundGradient"=>array("StartR"=>255,"StartG"=>255,"StartB"=>255,"StartAlpha"=>100,"EndR"=>207,"EndG"=>227,"EndB"=>125,"EndAlpha"=>50));

+ $SplitChart->drawRadar($myPicture,$MyData,$Options);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.radar.labels.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.radar.php
@@ -1,1 +1,67 @@
-
+<?php   

+ /* CAT:Polar and radars */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pRadar.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();   

+ $MyData->addPoints(array(40,20,15,10,8,4),"ScoreA");  

+ $MyData->addPoints(array(8,10,12,20,30,15),"ScoreB"); 

+ $MyData->addPoints(array(4,8,16,32,16,8),"ScoreC"); 

+ $MyData->setSerieDescription("ScoreA","Application A");

+ $MyData->setSerieDescription("ScoreB","Application B");

+ $MyData->setSerieDescription("ScoreC","Application C");

+

+ /* Define the absissa serie */

+ $MyData->addPoints(array("Size","Speed","Reliability","Functionalities","Ease of use","Weight"),"Labels");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+

+ /* Draw a solid background */

+ $Settings = array("R"=>179, "G"=>217, "B"=>91, "Dash"=>1, "DashR"=>199, "DashG"=>237, "DashB"=>111);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay some gradient areas */

+ $Settings = array("StartR"=>194, "StartG"=>231, "StartB"=>44, "EndR"=>43, "EndG"=>107, "EndB"=>58, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"pRadar - Draw radar charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font properties */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Create the pRadar object */ 

+ $SplitChart = new pRadar();

+

+ /* Draw a radar chart */ 

+ $myPicture->setGraphArea(10,25,300,225);

+ $Options = array("Layout"=>RADAR_LAYOUT_STAR,"BackgroundGradient"=>array("StartR"=>255,"StartG"=>255,"StartB"=>255,"StartAlpha"=>100,"EndR"=>207,"EndG"=>227,"EndB"=>125,"EndAlpha"=>50), "FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6);

+ $SplitChart->drawRadar($myPicture,$MyData,$Options);

+

+ /* Draw a radar chart */ 

+ $myPicture->setGraphArea(390,25,690,225);

+ $Options = array("Layout"=>RADAR_LAYOUT_CIRCLE,"LabelPos"=>RADAR_LABELS_HORIZONTAL,"BackgroundGradient"=>array("StartR"=>255,"StartG"=>255,"StartB"=>255,"StartAlpha"=>50,"EndR"=>32,"EndG"=>109,"EndB"=>174,"EndAlpha"=>30), "FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6);

+ $SplitChart->drawRadar($myPicture,$MyData,$Options);

+

+ /* Write the chart legend */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawLegend(235,205,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.radar.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.setFontProperties.php
@@ -1,1 +1,56 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"setFontProperties() - set default font properties",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Write some text */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/advent_light.ttf","FontSize"=>20));

+ $myPicture->drawText(60,115,"10 degree text",array("Angle"=>10));

+

+ /* Write some text */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/calibri.ttf","FontSize"=>20));

+ $myPicture->drawText(75,130,"10 degree text",array("Angle"=>10));

+

+ /* Write some text */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/GeosansLight.ttf","FontSize"=>20));

+ $myPicture->drawText(90,145,"10 degree text",array("Angle"=>10));

+

+ /* Write some text */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/MankSans.ttf","FontSize"=>20));

+ $myPicture->drawText(105,160,"10 degree text",array("Angle"=>10));

+

+ /* Write some text */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/MankSans.ttf","FontSize"=>30,"R"=>231,"G"=>50,"B"=>36));

+ $myPicture->drawText(340,90,"Some big red text");

+

+ /* Write some text */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6,"R"=>29,"G"=>70,"B"=>111));

+ $myPicture->drawText(340,100,"Some blue text");

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.setFontProperties.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.setShadow.php
@@ -1,1 +1,44 @@
-
+<?php   

+ /* CAT:Drawing */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ 

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"setShadow() - Add shadows",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a filled circle */ 

+ $formSettings = array("R"=>201,"G"=>230,"B"=>40,"Alpha"=>100,"Surrounding"=>30);

+ $myPicture->drawFilledCircle(90,120,30,$formSettings);

+

+ /* Draw a filled rectangle */ 

+ $formSettings = array("R"=>231,"G"=>197,"B"=>40,"Alpha"=>100,"Surrounding"=>30);

+ $myPicture->drawFilledRectangle(160,90,280,150,$formSettings);

+

+ /* Draw a filled rounded rectangle */ 

+ $formSettings = array("R"=>231,"G"=>102,"B"=>40,"Alpha"=>100,"Surrounding"=>70);

+ $myPicture->drawRoundedFilledRectangle(320,90,440,150,5,$formSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.setShadow.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.singlebarcode128.php
@@ -1,1 +1,30 @@
-
+<?php   

+ /* CAT:Barcode */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pBarcode128.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the barcode 128 object */

+ $Barcode = new pBarcode128("../");

+

+ /* String to be written on the barcode */

+ $String = "This is a test";

+

+ /* Retrieve the barcode projected size */

+ $Settings = array("ShowLegend"=>TRUE,"DrawArea"=>TRUE);

+ $Size = $Barcode->getSize($String,$Settings);

+

+ /* Create the pChart object */

+ $myPicture = new pImage($Size["Width"],$Size["Height"]);

+

+ /* Set the font to use */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/GeosansLight.ttf"));

+

+ /* Render the barcode */

+ $Barcode->draw($myPicture,$String,10,10,$Settings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.singlebarcode128.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.singlebarcode39.php
@@ -1,1 +1,30 @@
-
+<?php   

+ /* CAT:Barcode */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pBarcode39.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the barcode 39 object */

+ $Barcode = new pBarcode39("../");

+

+ /* String to be written on the barcode */

+ $String = "This is a test";

+

+ /* Retrieve the barcode projected size */

+ $Settings = array("ShowLegend"=>TRUE,"DrawArea"=>TRUE);

+ $Size = $Barcode->getSize($String,$Settings);

+

+ /* Create the pChart object */

+ $myPicture = new pImage($Size["Width"],$Size["Height"]);

+

+ /* Set the font to use */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/GeosansLight.ttf"));

+

+ /* Render the barcode */

+ $Barcode->draw($myPicture,$String,10,10,$Settings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.singlebarcode39.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.split.php
@@ -1,1 +1,62 @@
-
+<?php   

+ /* CAT:Split chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pSplit.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,700,230,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"pSplit - Draw splitted path charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the default font properties */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Create and populate the pData object */

+ $MyData = new pData();   

+ $MyData->addPoints(array(30,20,15,10,8,4),"Score"); 

+ $MyData->addPoints(array("End of visit","Home Page","Product Page","Sales","Statistics","Prints"),"Labels");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pSplit object */

+ $SplitChart = new pSplit();

+

+ /* Draw the split chart */

+ $Settings = array("TextPos"=>TEXT_POS_RIGHT,"TextPadding"=>10,"Spacing"=>20,"Surrounding"=>40);

+ $myPicture->setGraphArea(10,20,340,230);

+ $SplitChart->drawSplitPath($myPicture,$MyData,$Settings);

+

+ /* Create and populate the pData object */

+ $MyData2 = new pData();   

+ $MyData2->addPoints(array(30,20,15),"Score"); 

+ $MyData2->addPoints(array("UK","FR","ES"),"Labels");

+ $MyData2->setAbscissa("Labels");

+

+ /* Draw the split chart */

+ $Settings = array("TextPadding"=>4,"Spacing"=>30,"Surrounding"=>20);

+ $myPicture->setGraphArea(350,50,690,200);

+ $SplitChart->drawSplitPath($myPicture,$MyData2,$Settings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.split.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.spring.complex.php
@@ -1,1 +1,66 @@
-
+<?php   

+ /* CAT:Spring chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pSpring.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(600,600);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,600,600,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,600,600,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,600,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>100,"EndG"=>100,"EndB"=>100,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,599,599,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"pSpring - Draw spring charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the graph area boundaries*/ 

+ $myPicture->setGraphArea(20,20,580,580);

+

+ /* Set the default font properties */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>9,"R"=>80,"G"=>80,"B"=>80));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Create the pSpring object */ 

+ $SpringChart = new pSpring();

+

+ /* Set the default parameters for newly added nodes */ 

+ $SpringChart->setNodeDefaults(array("FreeZone"=>70));

+

+ /* Create 11 random nodes */ 

+ for($i=0;$i<=10;$i++)

+  {

+   $Connections = ""; $RdCx = rand(0,1);

+   for($j=0;$j<=$RdCx;$j++)

+    {

+     $RandCx = rand(0,10);

+     if ( $RandCx != $j )

+      { $Connections[] = $RandCx; }

+    }

+

+   $SpringChart->addNode($i,array("Name"=>"Node ".$i,"Connections"=>$Connections));

+  }

+

+ /* Draw the spring chart */ 

+ $Result = $SpringChart->drawSpring($myPicture,array("DrawQuietZone"=>TRUE,"Algorithm"=>ALGORITHM_CIRCULAR,"RingSize"=>100)); //WEIGHTED

+

+ /* Output the statistics */ 

+ // print_r($Result);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.spring.complex.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.spring.labels.php
@@ -1,1 +1,67 @@
-
+<?php   

+ /* CAT:Spring chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pSpring.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(300,300);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,300,300,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,300,300,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,300,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>100,"EndG"=>100,"EndB"=>100,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,299,299,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"pSpring - Draw spring charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the graph area boundaries*/ 

+ $myPicture->setGraphArea(20,20,280,280);

+

+ /* Set the default font properties */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>9,"R"=>80,"G"=>80,"B"=>80));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Create the pSpring object */ 

+ $SpringChart = new pSpring();

+

+ /* Set the default parameters for newly added nodes */ 

+ $SpringChart->setNodeDefaults(array("FreeZone"=>100));

+

+ /* Create some nodes */ 

+ $SpringChart->addNode(0,array("Shape"=>NODE_SHAPE_TRIANGLE,"FreeZone"=>60,"Size"=>20,"NodeType"=>NODE_TYPE_CENTRAL));

+ $SpringChart->addNode(1,array("Connections"=>"0"));

+ $SpringChart->addNode(2,array("Connections"=>"0"));

+ $SpringChart->addNode(3,array("Connections"=>"2"));

+

+ /* Set the nodes color */ 

+ $SpringChart->setNodesColor(0,array("R"=>215,"G"=>163,"B"=>121,"BorderR"=>166,"BorderG"=>115,"BorderB"=>74));

+ $SpringChart->setNodesColor(array(1,2,3),array("R"=>150,"G"=>215,"B"=>121,"Surrounding"=>-30));

+

+ /* Set the link properties */ 

+ $SpringChart->linkProperties(0,1,array("Name"=>"Synchronous","R"=>255,"G"=>0,"B"=>0));

+ $SpringChart->linkProperties(0,2,array("Name"=>"Asynchronous","R"=>255,"G"=>0,"B"=>0,"Ticks"=>2));

+ $SpringChart->linkProperties(3,2,array("Name"=>"Mixed","Ticks"=>4));

+

+ /* Draw the spring chart */ 

+ $Result = $SpringChart->drawSpring($myPicture);

+

+ /* Output the statistics */ 

+ // print_r($Result);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.spring.labels.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.spring.php
@@ -1,1 +1,65 @@
-
+<?php   

+ /* CAT:Spring chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pSpring.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(300,300);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,300,300,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,300,300,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,300,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>100,"EndG"=>100,"EndB"=>100,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,299,299,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"pSpring - Draw spring charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the graph area boundaries*/ 

+ $myPicture->setGraphArea(20,20,280,280);

+

+ /* Set the default font properties */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>9,"R"=>80,"G"=>80,"B"=>80));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Create the pSpring object */ 

+ $SpringChart = new pSpring();

+

+ /* Create some nodes */ 

+ $SpringChart->addNode("0",array("Name"=>"","Shape"=>NODE_SHAPE_SQUARE,"FreeZone"=>60,"Size"=>20,"NodeType"=>NODE_TYPE_CENTRAL));

+ $SpringChart->addNode("1",array("Name"=>"Johanna","Connections"=>array("0")));

+ $SpringChart->addNode("2",array("Name"=>"Martin","Connections"=>array("0")));

+ $SpringChart->addNode("3",array("Name"=>"Kevin","Connections"=>array("1")));

+ $SpringChart->addNode("4",array("Name"=>"Alex","Connections"=>array("1")));

+ $SpringChart->addNode("5",array("Name"=>"Julia","Connections"=>array("1")));

+ $SpringChart->addNode("6",array("Name"=>"Lena","Connections"=>array("2")));

+ $SpringChart->addNode("7",array("Name"=>"Elisa","Connections"=>array("2")));

+ $SpringChart->addNode("8",array("Name"=>"Omar","Connections"=>array("2")));

+

+ /* Set the nodes color */ 

+ $SpringChart->setNodesColor(array(0),array("R"=>215,"G"=>163,"B"=>121,"BorderR"=>166,"BorderG"=>115,"BorderB"=>74));

+ $SpringChart->setNodesColor(array(1,5,6,7),array("R"=>245,"G"=>183,"B"=>241,"Surrounding"=>-30));

+ $SpringChart->setNodesColor(array(2,3,4,8),array("R"=>183,"G"=>224,"B"=>245,"Surrounding"=>-30));

+

+ /* Draw the spring chart */ 

+ $Result = $SpringChart->drawSpring($myPicture,array("DrawQuietZone"=>TRUE));

+

+ /* Output the statistics */ 

+ // print_r($Result);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.spring.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.spring.relations.php
@@ -1,1 +1,70 @@
-
+<?php   

+ /* CAT:Spring chart */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pSpring.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(300,300);

+

+ /* Draw the background */

+ $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);

+ $myPicture->drawFilledRectangle(0,0,300,300,$Settings);

+

+ /* Overlay with a gradient */

+ $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,300,300,DIRECTION_VERTICAL,$Settings);

+ $myPicture->drawGradientArea(0,0,300,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>100,"EndG"=>100,"EndB"=>100,"Alpha"=>80));

+

+ /* Add a border to the picture */

+ $myPicture->drawRectangle(0,0,299,299,array("R"=>0,"G"=>0,"B"=>0));

+

+ /* Write the picture title */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));

+ $myPicture->drawText(10,13,"pSpring - Draw spring charts",array("R"=>255,"G"=>255,"B"=>255));

+

+ /* Set the graph area boundaries*/ 

+ $myPicture->setGraphArea(20,20,280,280);

+

+ /* Set the default font properties */ 

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>9,"R"=>80,"G"=>80,"B"=>80));

+

+ /* Enable shadow computing */ 

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+

+ /* Create the pSpring object */ 

+ $SpringChart = new pSpring();

+

+ /* Create some nodes */ 

+ $SpringChart->addNode(0,array("Shape"=>NODE_SHAPE_SQUARE,"FreeZone"=>60,"Size"=>20,"NodeType"=>NODE_TYPE_CENTRAL));

+ $SpringChart->addNode(1,array("Connections"=>"0"));

+ $SpringChart->addNode(2,array("Connections"=>"0"));

+ $SpringChart->addNode(3,array("Shape"=>NODE_SHAPE_TRIANGLE,"Connections"=>"1"));

+ $SpringChart->addNode(4,array("Shape"=>NODE_SHAPE_TRIANGLE,"Connections"=>"1"));

+ $SpringChart->addNode(5,array("Shape"=>NODE_SHAPE_TRIANGLE,"Connections"=>"1"));

+ $SpringChart->addNode(6,array("Connections"=>"2"));

+ $SpringChart->addNode(7,array("Connections"=>"2"));

+ $SpringChart->addNode(8,array("Connections"=>"2"));

+

+ /* Set the nodes color */ 

+ $SpringChart->setNodesColor(0,array("R"=>215,"G"=>163,"B"=>121,"BorderR"=>166,"BorderG"=>115,"BorderB"=>74));

+ $SpringChart->setNodesColor(array(1,2),array("R"=>150,"G"=>215,"B"=>121,"Surrounding"=>-30));

+ $SpringChart->setNodesColor(array(3,4,5),array("R"=>216,"G"=>166,"B"=>14,"Surrounding"=>-30));

+ $SpringChart->setNodesColor(array(6,7,8),array("R"=>179,"G"=>121,"B"=>215,"Surrounding"=>-30));

+

+ /* Set the link properties */ 

+ $SpringChart->linkProperties(0,1,array("R"=>255,"G"=>0,"B"=>0,"Ticks"=>2));

+ $SpringChart->linkProperties(0,2,array("R"=>255,"G"=>0,"B"=>0,"Ticks"=>2));

+

+ /* Draw the spring chart */ 

+ $Result = $SpringChart->drawSpring($myPicture);

+

+ /* Output the statistics */ 

+ // print_r($Result);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.spring.relations.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.text.alignment.php
@@ -1,1 +1,67 @@
-
+<?php

+ /* CAT:Misc */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(550,175);

+

+ /* Create a solid background */

+ $Settings = array("R"=>183, "G"=>161, "B"=>71, "Dash"=>1, "DashR"=>203, "DashG"=>181, "DashB"=>91);

+ $myPicture->drawFilledRectangle(0,0,550,175,$Settings);

+

+ /* Do a gradient overlay */

+ $Settings = array("StartR"=>231, "StartG"=>228, "StartB"=>155, "EndR"=>138, "EndG"=>91, "EndB"=>10, "Alpha"=>50);

+ $myPicture->drawGradientArea(0,0,550,175,DIRECTION_VERTICAL,$Settings);

+ 

+ /* Set the default font */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/calibri.ttf","FontSize"=>20));

+

+ /* Draw the text box */

+ $myPicture->setShadow(FALSE);

+ $myPicture->drawFilledRectangle(141,77,393,126,array("Alpha"=>20,"R"=>230,"G"=>230,"B"=>230));

+ $myPicture->drawRectangle(141,77,393,126,array("R"=>50,"G"=>50,"B"=>50));

+

+ /* Write the text */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+ $TextSettings = array("R"=>201,"G"=>230,"B"=>40,"FontSize"=>40);

+ $myPicture->drawText(144,125,"My text box",$TextSettings);

+

+ /* Prepare and draw the markers */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+ $MyMarkerSettings = array("R"=>255,"G"=>0,"B"=>0,"BorderR"=>0,"BorderB"=>0,"BorderG"=>0,"Size"=>4);

+

+ $myPicture->drawRectangleMarker(141,77,$MyMarkerSettings);

+ $myPicture->drawRectangleMarker(141,101,$MyMarkerSettings);

+ $myPicture->drawRectangleMarker(141,126,$MyMarkerSettings);

+

+ $myPicture->drawRectangleMarker(260,77,$MyMarkerSettings);

+ $myPicture->drawRectangleMarker(260,101,$MyMarkerSettings);

+ $myPicture->drawRectangleMarker(260,126,$MyMarkerSettings);

+

+ $myPicture->drawRectangleMarker(393,77,$MyMarkerSettings);

+ $myPicture->drawRectangleMarker(393,101,$MyMarkerSettings);

+ $myPicture->drawRectangleMarker(393,126,$MyMarkerSettings);

+

+ /* Change the font settings */

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/calibri.ttf","FontSize"=>7));

+ $myPicture->setShadow(FALSE);

+

+ /* Write the arrows */

+ $myPicture->drawArrowLabel(139,75,"TEXT_ALIGN_TOPLEFT",array("Length"=>20,"Angle"=>45,"RoundPos"=>TRUE));

+ $myPicture->drawArrowLabel(139,101,"TEXT_ALIGN_MIDDLELEFT",array("Length"=>20,"Angle"=>90,"RoundPos"=>TRUE));

+ $myPicture->drawArrowLabel(139,128,"TEXT_ALIGN_BOTTOMLEFT",array("Length"=>20,"Angle"=>135,"RoundPos"=>TRUE));

+

+ $myPicture->drawArrowLabel(260,75,"TEXT_ALIGN_TOPMIDDLE",array("Length"=>20,"Angle"=>45,"RoundPos"=>TRUE));

+ $myPicture->drawArrowLabel(260,101,"TEXT_ALIGN_MIDDLEMIDDLE",array("Length"=>90,"Angle"=>315,"RoundPos"=>TRUE));

+ $myPicture->drawArrowLabel(260,128,"TEXT_ALIGN_BOTTOMMIDDLE",array("Length"=>20,"Angle"=>225,"RoundPos"=>TRUE));

+

+ $myPicture->drawArrowLabel(395,75,"TEXT_ALIGN_TOPRIGHT",array("Length"=>20,"Angle"=>315,"RoundPos"=>TRUE));

+ $myPicture->drawArrowLabel(395,101,"TEXT_ALIGN_MIDDLERIGHT",array("Length"=>20,"Angle"=>270,"RoundPos"=>TRUE));

+ $myPicture->drawArrowLabel(395,128,"TEXT_ALIGN_BOTTOMRIGHT",array("Length"=>20,"Angle"=>225,"RoundPos"=>TRUE));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.spring.relations.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.transparent.background.php
@@ -1,1 +1,36 @@
-
+<?php   

+ /* CAT:Misc */

+

+ /* pChart library inclusions */

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,NULL,TRUE);

+

+ /* Draw a rounded filled rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>50,"Surrounding"=>30);

+ $myPicture->drawRoundedFilledRectangle(10,25,70,55,5,$RectangleSettings);

+

+ /* Draw a rounded filled rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>50,"Surrounding"=>30);

+ $myPicture->drawRoundedFilledRectangle(10,85,70,115,5,$RectangleSettings);

+

+ /* Draw a rounded filled rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>50,"Surrounding"=>30);

+ $myPicture->drawRoundedFilledRectangle(10,135,70,165,5,$RectangleSettings);

+

+ /* Draw a rounded filled rectangle */

+ $RectangleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>50,"Surrounding"=>30);

+ $myPicture->drawRoundedFilledRectangle(10,185,70,215,5,$RectangleSettings);

+

+ /* Enable shadow computing */

+ $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));

+

+ /* Draw a rounded filled rectangle */

+ $RectangleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100,"Surrounding"=>30,"Radius"=>20);

+ $myPicture->drawRoundedFilledRectangle(100,20,680,210,20,$RectangleSettings);

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.transparent.background.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/example.writeBounds.php
@@ -1,1 +1,46 @@
-
+<?php   

+ /* CAT:Misc */

+

+ /* pChart library inclusions */

+ include("../class/pData.class.php");

+ include("../class/pDraw.class.php");

+ include("../class/pImage.class.php");

+

+ /* Create and populate the pData object */

+ $MyData = new pData();  

+ $MyData->addPoints(array(2,7,5,18,VOID,12,10,15,8,5,6,9),"Help Desk");

+ $MyData->setAxisName(0,"Incidents");

+ $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jui","Aou","Sep","Oct","Nov","Dec"),"Labels");

+ $MyData->setSerieDescription("Labels","Months");

+ $MyData->setAbscissa("Labels");

+

+ /* Create the pChart object */

+ $myPicture = new pImage(700,230,$MyData);

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>100,"StartG"=>100,"StartB"=>100,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

+ $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>100,"StartG"=>100,"StartB"=>100,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>20));

+ $myPicture->drawGradientArea(0,0,60,230,DIRECTION_HORIZONTAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

+

+ /* Do some cosmetics */

+ $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));

+ $myPicture->drawLine(60,0,60,230,array("R"=>70,"G"=>70,"B"=>70));

+ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));

+ $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));

+ $myPicture->drawText(35,115,"Recorded cases",array("R"=>255,"G"=>255,"B"=>255,"FontSize"=>20,"Angle"=>90,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+

+ /* Draw a spline chart */

+ $myPicture->setGraphArea(100,30,680,190);

+ $myPicture->drawFilledRectangle(100,30,680,190,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>20));

+ $myPicture->setFontProperties(array("R"=>255,"G"=>255,"B"=>255,"FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));

+ $myPicture->drawScale(array("AxisR"=>255,"AxisG"=>255,"AxisB"=>255,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE));

+ $myPicture->drawSplineChart();

+

+ /* Write the data bounds */

+ $myPicture->writeBounds();

+ $myPicture->setShadow(FALSE);

+

+ /* Write the chart legend */ 

+ $myPicture->drawLegend(630,215,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

+

+ /* Render the picture (choose the best way) */

+ $myPicture->autoOutput("pictures/example.writeBounds.png");

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/index.php
@@ -1,1 +1,317 @@
-
+<?php if ( isset($_GET["Action"])) { $Script = $_GET["Script"]; highlight_file($Script); exit(); } ?>

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

+<head>

+ <title>pChart 2.x - examples rendering</title>

+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>

+ <style>

+  body       { background-color: #F0F0F0; font-family: tahoma; font-size: 14px; height: 100%; overflow: auto;}

+  table      { margin: 0px; padding: 0px; border: 0px; }

+  tr         { margin: 0px; padding: 0px; border: 0px; }

+  td         { font-family: tahoma; font-size: 11px; margin: 0px; padding: 0px; border: 0px; }

+  div.folder { cursor: hand; cursor: pointer; }

+  a.smallLinkGrey:link     { text-decoration: none; color: #6A6A6A; }

+  a.smallLinkGrey:visited  { text-decoration: none; color: #6A6A6A; }

+  a.smallLinkGrey:hover    { text-decoration: underline; color: #6A6A6A; }

+  a.smallLinkBlack:link    { text-decoration: none; color: #000000; }

+  a.smallLinkBlack:visited { text-decoration: none; color: #000000; }

+  a.smallLinkBlack:hover   { text-decoration: underline; color: #000000; }

+ </style>

+</head>

+<body>

+

+<?php

+ /* Files that we don't want to see in the tree */

+ $Exclusion = array(".","..","index.php","buildAll.cmd","pictures","resources","delayedLoader","sandbox");

+

+ /* Determine the current package version */

+ $FileHandle  = fopen("../readme.txt", "r");

+ for ($i=0; $i<=5; $i++) { $buffer = fgets($FileHandle, 4096); }

+ fclose($FileHandle);

+ $Values  = preg_split("/:/",$buffer);

+ $Values  = preg_split("/ /",$Values[1]);

+ $Version = strip_tags($Values[1]);

+

+ /* Build a list of the examples & categories */

+ $DirectoryHandle = opendir(".");

+  {

+   $Tree = "";

+   while (($FileName = readdir($DirectoryHandle)) !== false)

+   {

+    if ( !in_array($FileName,$Exclusion))

+     {

+      $FileHandle  = fopen($FileName, "r");

+      $buffer      = fgets($FileHandle, 4096);

+      $buffer      = fgets($FileHandle, 4096);

+      fclose($FileHandle);

+

+      if ( preg_match("/CAT:/",$buffer) )

+       {

+        $Categorie = str_replace(" /* CAT:","",$buffer);

+        $Categorie = str_replace("*/","",$Categorie);

+        $Categorie = trim($Categorie);

+       }

+      else

+       { $Categorie = "z_root"; }

+

+      $FileShortName = str_replace("example.","",$FileName);

+      $FileShortName = str_replace(".php","",$FileShortName);

+      $FileShortName = trim($FileShortName);

+

+      $Tree[$Categorie][]=array("FileName"=>$FileName,"FileShortName"=>$FileShortName);

+     }

+   }

+  closedir($DirectoryHandle);

+

+  ksort($Tree);

+?>

+

+<table style='border: 2px solid #FFFFFF;'><tr><td>

+<div style='font-size: 11px; padding: 2px; color: #FFFFFF; background-color: #666666; border-bottom: 3px solid #484848; width: 362px;'>&nbsp;Navigation</div>

+<table style='padding: 1px; background-color: #E0E0E0; border: 1px solid #D0D0D0; border-top: 1px solid #FFFFFF;'><tr>

+ <td width=16><img src='resources/application_view_tile.png' width=16 height=16 alt=''/></td>

+ <td width=100>&nbsp;<b>Examples</b></td>

+ <td width=16><img src='resources/application_view_list.png' width=16 height=16 alt=''/></td>

+ <td width=100>&nbsp;<a class=smallLinkGrey href='sandbox/'>Sandbox</a></td>

+ <td width=16><img src='resources/application_view_list.png' width=16 height=16 alt=''/></td>

+ <td width=100>&nbsp;<a class=smallLinkGrey href='delayedLoader/'>Delayed loader</a></td>

+</tr></table>

+</td></tr></table>

+

+<br/>

+<table><tr><td valign='top'>

+

+<table style='border: 2px solid #FFFFFF;'><tr><td>

+<div style='font-size: 11px; padding: 2px; color: #FFFFFF; background-color: #666666; border-bottom: 3px solid #484848; width: 222px;'>&nbsp;Release <?php echo $Version; ?></div>

+<div style='border: 3px solid #D0D0D0; border-top: 1px solid #FFFFFF; background-color: #FAFAFA; width: 220px; overflow: auto'>

+<div style='padding: 1px; padding-bottom: 3px; color: #000000; background-color:#D0D0D0;'>

+ <table><tr>

+  <td><img src='resources/application_view_list.png' width=16 height=16 alt=''/></td>

+  <td>&nbsp;Examples folder contents</td>

+ </tr></table>

+</div>

+<?php

+  $ID = 1; if ( isset($Tree["z_root"]) ) { $ID = 2; }

+  foreach($Tree as $Key => $Elements)

+   {

+    if ( $ID == count($Tree) ) { $Icon = "dash-explorer-last.png"; $SubIcon = "dash-explorer-blank.png"; } else { $Icon = "dash-explorer.png"; $SubIcon = "dash-explorer-noleaf.png"; }

+    if ( $Key != "z_root" )

+     {

+      echo "<table  noborder cellpadding=0 cellspacing=0>\r\n";

+      echo " <tr valign=middle>\r\n";

+      echo "  <td><img src='resources/".$Icon."' width=16 height=20 alt=''/></td>\r\n";

+      echo "  <td><img src='resources/folder.png' width=16 height=16 alt=''/></td>\r\n";

+      echo "  <td><div class=folder id='".$Key."_main' onclick='showHideMenu(".chr(34).$Key.chr(34).");'>&nbsp;".$Key."</div></td>\r\n";

+      echo " </tr>\r\n";

+      echo "</table>\r\n";

+

+      echo "<table id='".$Key."' style='display: none;' noborder cellpadding=0 cellspacing=0><tr>\r\n";

+      foreach($Elements as $SubKey => $Element)

+       {

+        $FileName      = $Element["FileName"];

+        $FileShortName = $Element["FileShortName"];

+

+        if ( $SubKey == count($Elements)-1 ) { $Icon = "dash-explorer-last.png"; } else { $Icon = "dash-explorer.png"; }

+

+        echo " <tr valign=middle>\r\n";

+        echo "  <td><img src='resources/".$SubIcon."' width=16 height=20 alt=''/></td>\r\n";

+        echo "  <td><img src='resources/".$Icon."' width=16 height=20 alt=''/></td>\r\n";

+        echo "  <td><img src='resources/application_view_tile.png' width=16 height=16 alt=''/></td>\r\n";

+        echo "  <td>&nbsp;<a class=smallLinkGrey href='#' onclick='render(".chr(34).$FileName.chr(34).");'>".$FileShortName."</a></td>\r\n";

+        echo " </tr>\r\n";

+       }

+      echo "</table>\r\n";

+

+     }

+    $ID++;

+   }

+ }

+?>

+</div>

+</td></tr></table>

+

+</td><td width=20></td><td valign='top' style='padding-top: 5px; font-size: 12px;'>

+

+<table><tr>

+ <td><img src='resources/chart_bar.png' width=16 height=16 alt=''/></td>

+ <td>&nbsp;Rendering area</td>

+</tr></table>

+

+<div style='display:table-cell; padding: 10px; border: 2px solid #FFFFFF; vertical-align: middle; overflow: auto; background-image: url("resources/dash.png");'>

+ <div style='font-size: 10px;' id=render>

+  <table><tr><td><img src='resources/accept.png' width=16 height=16 alt=""/></td><td>Click on an example to render it!</td></tr></table>

+ </div>

+</div>

+

+<br/><br/>

+

+<table><tr>

+ <td><img src='resources/application_view_list.png' width=16 height=16 alt=''/></td>

+ <td>&nbsp;Source area</td>

+</tr></table>

+

+<div style='display:table-cell; padding: 10px;  border: 2px solid #FFFFFF; vertical-align: middle; overflow: auto; background-image: url("resources/dash.png");'>

+ <div style='font-size: 10px;' id=source style='width: 700px;'>

+  <table><tr><td><img src='resources/accept.png' width=16 height=16 alt=""/></td><td>Click on an example to get its source!</td></tr></table>

+ </div>

+</div>

+

+</td></tr></table>

+</body>

+<script>

+ URL        = "";

+ SourceURL  = "";

+ LastOpened = "";

+

+ function showHideMenu(Element)

+  {

+   status = document.getElementById(Element).style.display;

+   if ( status == "none" )

+    {

+     if ( LastOpened != "" && LastOpened != Element ) { showHideMenu(LastOpened); }

+

+     document.getElementById(Element).style.display = "inline";

+     document.getElementById(Element+"_main").style.fontWeight = "bold";

+     LastOpened = Element;

+    }

+   else

+    {

+     document.getElementById(Element).style.display = "none";

+     document.getElementById(Element+"_main").style.fontWeight = "normal";

+     LastOpened = "";

+    }

+  }

+

+ function render(PictureName)

+  {

+   opacity("render",100,0,100);

+

+   RandomKey = Math.random(100);

+   URL       = PictureName + "?Seed=" + RandomKey;

+   SourceURL = PictureName;

+

+   ajaxRender(URL);

+  }

+

+ function StartFade()

+  {

+   Loader     = new Image();   

+   Loader.src = URL;   

+   setTimeout("CheckLoadingStatus()", 200);   

+  }

+

+ function CheckLoadingStatus()   

+  {   

+   if ( Loader.complete == true )   

+    {

+     changeOpac(0, "render");

+     HTMLResult = "<center><img src='" + URL + "' alt=''/></center>";

+     document.getElementById("render").innerHTML = HTMLResult;

+

+     opacity("render",0,100,100);

+     view(SourceURL);

+    }

+   else  

+    setTimeout("CheckLoadingStatus()", 200);   

+  }   

+

+ function changeOpac(opacity, id)   

+  {   

+   var object = document.getElementById(id).style;   

+   object.opacity = (opacity / 100);   

+   object.MozOpacity = (opacity / 100);   

+   object.KhtmlOpacity = (opacity / 100);   

+   object.filter = "alpha(opacity=" + opacity + ")";   

+  }   

+

+ function wait()

+  {

+   HTMLResult = "<center><img src='resources/wait.gif' width=24 height=24 alt=''/><br>Rendering</center>";

+   document.getElementById("render").innerHTML = HTMLResult;

+   changeOpac(20, "render");

+  }

+

+ function opacity(id, opacStart, opacEnd, millisec)

+  {

+   var speed = Math.round(millisec / 100);

+   var timer = 0;

+

+   if(opacStart > opacEnd)

+    {

+     for(i = opacStart; i >= opacEnd; i--)

+      {

+       setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));

+       timer++;

+      }

+     setTimeout("wait()",(timer * speed));

+    }

+   else if(opacStart < opacEnd)

+    {

+     for(i = opacStart; i <= opacEnd; i++)

+      {

+       setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));

+       timer++;

+      }

+    }

+  }

+

+ function ajaxRender(URL)

+  {

+   var xmlhttp=false;   

+   /*@cc_on @*/  

+   /*@if (@_jscript_version >= 5)  

+    try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } }  

+   @end @*/  

+  

+   if (!xmlhttp && typeof XMLHttpRequest!='undefined')   

+    { try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp=false; } }   

+  

+   if (!xmlhttp && window.createRequest)   

+    { try { xmlhttp = window.createRequest(); } catch (e) { xmlhttp=false; } }   

+  

+   xmlhttp.open("GET", URL,true);

+

+   xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4) { StartFade();  } }   

+   xmlhttp.send(null)   

+  }

+

+ function view(URL)

+  {

+   var xmlhttp=false;   

+   /*@cc_on @*/  

+   /*@if (@_jscript_version >= 5)  

+    try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } }  

+   @end @*/  

+  

+   URL = "index.php?Action=View&Script=" + URL;

+

+   if (!xmlhttp && typeof XMLHttpRequest!='undefined')   

+    { try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp=false; } }   

+  

+   if (!xmlhttp && window.createRequest)   

+    { try { xmlhttp = window.createRequest(); } catch (e) { xmlhttp=false; } }   

+  

+   xmlhttp.open("GET", URL,true);

+

+   xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4) { Result = xmlhttp.responseText; document.getElementById("source").innerHTML = Result.replace("/\<BR\>/");  } }   

+   xmlhttp.send(null)   

+  }

+</script>

+</html>

+<?php

+ function size($Value)

+  {

+   if ( $Value < 1024 ) { return($Value." o."); }

+   if ( $Value >= 1024 && $Value < 1024000 ) { return(floor($Value/1024)." ko."); }

+   return(floor($Value/1024000))." mo.";

+  }

+

+ function left($value,$NbChar)  

+  { return substr($value,0,$NbChar); }  

+ 

+ function right($value,$NbChar)  

+  { return substr($value,strlen($value)-$NbChar,$NbChar); }  

+ 

+ function mid($value,$Depart,$NbChar)  

+  { return substr($value,$Depart-1,$NbChar); }  

+?>

 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/accept.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/application_view_list.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/application_view_tile.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/blocnote.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/chart_bar.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/chart_line.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/computer.gif differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/dash-explorer-blank.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/dash-explorer-last.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/dash-explorer-noleaf.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/dash-explorer.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/dash.png differ
--- /dev/null
+++ b/lib/pChart2.1.0/examples/resources/dataset.txt
@@ -1,1 +1,25 @@
-
+Hour,Temperature,Humidity

+0,10,40

+1,9,41

+2,8,44

+3,8,42

+4,9,40

+5,9,38

+6,10,39

+7,11,35

+8,12,33

+9,14,32

+10,16,30

+11,18,30

+12,20,30

+13,21,31

+14,22,33

+15,23,34

+16,22,36

+17,20,37

+18,16,38

+19,14,38

+20,12,39

+21,11,40

+22,11,44

+23,10,40

 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/folder.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/hologram.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/landscape1.jpg differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/landscape2.jpg differ
--- /dev/null
+++ b/lib/pChart2.1.0/examples/resources/palette.txt
@@ -1,1 +1,7 @@
+239,210,121,100

+149,203,233,100

+2,71,105,100

+175,215,117,100

+44,87,0,100

+222,157,127,100

 

 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/serie1.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/serie2.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/wait.gif differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/accept.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/application_form.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/background.console.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/chart_bar.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/chart_bar_edit.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/chart_curve.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/chart_line.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/cog.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/color_swatch.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/comment.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/database_table.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/layout_edit.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/page_edit.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/paintcan.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/shape_flip_vertical.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/tab.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/vector.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/wait.gif differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/wand.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/wrench.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/includes/arrow.gif differ
--- /dev/null
+++ b/lib/pChart2.1.0/examples/sandbox/includes/constants.txt
@@ -1,1 +1,61 @@
-
+0.12345,VOID

+680001,AXIS_FORMAT_DEFAULT

+680002,AXIS_FORMAT_TIME

+680003,AXIS_FORMAT_DATE

+680004,AXIS_FORMAT_METRIC

+680005,AXIS_FORMAT_CURRENCY

+681001,AXIS_POSITION_LEFT

+681002,AXIS_POSITION_RIGHT

+682001,AXIS_X

+682002,AXIS_Y

+690001,DIRECTION_VERTICAL

+690002,DIRECTION_HORIZONTAL

+690101,SCALE_POS_LEFTRIGHT

+690102,SCALE_POS_TOPBOTTOM

+690201,SCALE_MODE_FLOATING

+690202,SCALE_MODE_START0

+690203,SCALE_MODE_ADDALL

+690204,SCALE_MODE_ADDALL_START0

+690301,SCALE_SKIP_NONE

+690302,SCALE_SKIP_SAME

+690303,SCALE_SKIP_NUMBERS

+690401,TEXT_ALIGN_TOPLEFT

+690402,TEXT_ALIGN_TOPMIDDLE

+690403,TEXT_ALIGN_TOPRIGHT

+690404,TEXT_ALIGN_MIDDLELEFT

+690405,TEXT_ALIGN_MIDDLEMIDDLE

+690406,TEXT_ALIGN_MIDDLERIGHT

+690407,TEXT_ALIGN_BOTTOMLEFT

+690408,TEXT_ALIGN_BOTTOMMIDDLE

+690409,TEXT_ALIGN_BOTTOMRIGHT

+690501,POSITION_TOP

+690502,POSITION_BOTTOM

+690601,LABEL_POS_LEFT

+690602,LABEL_POS_CENTER

+690603,LABEL_POS_RIGHT

+690604,LABEL_POS_TOP

+690605,LABEL_POS_BOTTOM

+690606,LABEL_POS_INSIDE

+690607,LABEL_POS_OUTSIDE

+690701,ORIENTATION_HORIZONTAL

+690702,ORIENTATION_VERTICAL

+690800,LEGEND_NOBORDER

+690801,LEGEND_BOX

+690802,LEGEND_ROUND

+690901,LEGEND_VERTICAL

+690902,LEGEND_HORIZONTAL

+691051,LEGEND_FAMILY_BOX

+691052,LEGEND_FAMILY_CIRCLE

+691053,LEGEND_FAMILY_LINE

+691001,DISPLAY_AUTO

+691002,DISPLAY_MANUAL

+691011,LABELING_ALL

+691012,LABELING_DIFFERENT

+691021,BOUND_MIN

+691022,BOUND_MAX

+691023,BOUND_BOTH

+691031,BOUND_LABEL_POS_TOP

+691032,BOUND_LABEL_POS_BOTTOM

+691033,BOUND_LABEL_POS_AUTO

+691041,CAPTION_LEFT_TOP

+691042,CAPTION_RIGHT_BOTTOM

 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/includes/cross.gif differ
--- /dev/null
+++ b/lib/pChart2.1.0/examples/sandbox/includes/functions.js
@@ -1,1 +1,656 @@
-
+ /*

+     functions.js - Sandbox JS

+

+     Version     : 1.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 18/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ Action = "Render";

+

+ function toggleAuto()

+  {

+   if ( document.getElementById("g_autopos").checked ) { Automatic  = true; } else { Automatic  = false; }

+  }

+

+ function doLayout()

+  {

+   if ( !Automatic ) { return(0); }

+

+   g_width   = document.getElementById("g_width").value;

+   g_height  = document.getElementById("g_height").value;

+

+   document.getElementById("g_title_x").value = g_width/2;

+

+   checkEnabledAxis();

+  }

+

+ /* Apply curvy corners */

+ function applyCorners()

+  {

+   settings = {tl: { radius: 10 },tr: { radius: 10 },bl: { radius: 10 },br: { radius: 10 },antiAlias: true,autoPad: true,validTags: ["div"]}

+   var myBoxObject = new curvyCorners(settings, "roundedCorner");

+   myBoxObject.applyCornersToAll();

+  }

+

+ /* Set or remove the focus */

+ function setFocus(Object,Mode)

+  {

+   if (Mode == true)

+    { Object.style.borderColor = "#808080"; }

+   else

+    { Object.style.borderColor = "#D0D0D0"; }

+  }

+

+ function highlightDIV(ID)

+  {

+   if ( ID == CurrentDiv ) { return(0); }

+   document.getElementById("menu"+ID).style.backgroundColor = "#F4F4F4";

+  }

+

+ function clearDIV(ID)

+  {

+   if ( ID == CurrentDiv ) { return(0); }

+   document.getElementById("menu"+ID).style.backgroundColor = "#EAEAEA";

+  }

+

+ function toggleDIV(ID)

+  {

+   /* reset the tab styles */

+   for (i=1;i<=6;i++)

+    { if ( i != ID ) { document.getElementById("menu"+i).style.backgroundColor = "#EAEAEA"; document.getElementById("menu"+i).style.borderColor = "#FEFEFE"; } }

+

+   /* hide the curently displayed tab */

+   if ( CurrentDiv != ID ) { document.getElementById("tab"+CurrentDiv).style.display = "none"; }

+

+   document.getElementById("tab"+ID).style.display = "block";

+

+   CurrentDiv = ID;

+   document.getElementById("menu"+ID).style.backgroundColor = "#D0D0D0";

+   document.getElementById("menu"+ID).style.borderColor = "#B0B0B0";

+  }

+

+ function render()

+  {

+   Action = "Render";

+   saveToSession();

+  }

+

+ function code()

+  {

+   Action = "Code";

+   saveToSession();

+  }

+

+ function saveToSession()

+  {

+   saveGeneral();

+  }

+

+ function saveGeneral()

+  {

+   document.getElementById("result_area").innerHTML = "<img src='graphix/wait.gif' width='24' height='24' alt=''><br/>Saving configuration (General)";

+

+   g_width   = document.getElementById("g_width").value;

+   g_height  = document.getElementById("g_height").value;

+   g_border  = document.getElementById("g_border").checked;

+   g_aa      = document.getElementById("g_aa").checked;

+   g_shadow  = document.getElementById("g_shadow").checked;

+   g_transparent = document.getElementById("g_transparent").checked;

+   g_autopos = document.getElementById("g_autopos").checked;

+

+   g_title_enabled      = document.getElementById("g_title_enabled").checked;

+   g_title              = document.getElementById("g_title").value;

+   g_title_align        = document.getElementById("g_title_align").options[document.getElementById("g_title_align").selectedIndex].value;

+   g_title_x            = document.getElementById("g_title_x").value;

+   g_title_y            = document.getElementById("g_title_y").value;

+   g_title_color        = document.getElementById("g_title_color").value;

+   g_title_font         = document.getElementById("g_title_font").options[document.getElementById("g_title_font").selectedIndex].value;

+   g_title_font_size    = document.getElementById("g_title_font_size").value;

+   g_title_box		= document.getElementById("g_title_box").checked;

+

+   g_solid_enabled      = document.getElementById("g_solid_enabled").checked;

+   g_solid_color        = document.getElementById("g_solid_color").value;

+   g_solid_dashed       = document.getElementById("g_solid_dashed").checked;

+

+   g_gradient_enabled   = document.getElementById("g_gradient_enabled").checked;

+   g_gradient_start     = document.getElementById("g_gradient_start").value;

+   g_gradient_end       = document.getElementById("g_gradient_end").value;

+   g_gradient_direction = document.getElementById("g_gradient_direction").options[document.getElementById("g_gradient_direction").selectedIndex].value;

+   g_gradient_alpha     = document.getElementById("g_gradient_alpha").value;

+

+   var reg=new RegExp("(#)", "g");

+   g_title_color    = g_title_color.replace(reg,"");

+   g_solid_color    = g_solid_color.replace(reg,"");

+   g_gradient_start = g_gradient_start.replace(reg,"");

+   g_gradient_end   = g_gradient_end.replace(reg,"");

+

+   URL = "script/session.php?g_width="+g_width+"&g_height="+g_height+"&g_border="+g_border+"&g_aa="+g_aa+"&g_shadow="+g_shadow+"&g_autopos="+g_autopos

+    +"&g_title_enabled="+g_title_enabled+"&g_title="+g_title+"&g_title_align="+g_title_align+"&g_title_x="+g_title_x

+    +"&g_title_y="+g_title_y+"&g_title_color="+g_title_color+"&g_title_font="+g_title_font+"&g_title_font_size="+g_title_font_size+"&g_title_box="+g_title_box

+    +"&g_solid_enabled="+g_solid_enabled+"&g_solid_color="+g_solid_color+"&g_solid_dashed="+g_solid_dashed

+    +"&g_gradient_enabled="+g_gradient_enabled+"&g_gradient_start="+g_gradient_start+"&g_gradient_end="+g_gradient_end

+    +"&g_gradient_direction="+g_gradient_direction+"&g_gradient_alpha="+g_gradient_alpha+"&g_transparent="+g_transparent

+    +"&Seed="+Math.random(100);

+

+   push(URL,1);

+  }

+

+ function saveData()

+  {

+   document.getElementById("result_area").innerHTML = "<img src='graphix/wait.gif' width='24' height='24' alt=''><br/>Saving configuration (Data)";

+

+   d_serie1_enabled	= document.getElementById("d_serie1_enabled").checked;

+   d_serie2_enabled	= document.getElementById("d_serie2_enabled").checked;

+   d_serie3_enabled	= document.getElementById("d_serie3_enabled").checked;

+   d_absissa_enabled	= document.getElementById("d_absissa_enabled").checked;

+

+   d_serie1_name	= document.getElementById("d_serie1_name").value;

+   d_serie2_name	= document.getElementById("d_serie2_name").value;

+   d_serie3_name	= document.getElementById("d_serie3_name").value;

+

+   d_serie1_axis	= document.getElementById("d_serie1_axis").options[document.getElementById("d_serie1_axis").selectedIndex].value;

+   d_serie2_axis	= document.getElementById("d_serie2_axis").options[document.getElementById("d_serie2_axis").selectedIndex].value;

+   d_serie3_axis	= document.getElementById("d_serie3_axis").options[document.getElementById("d_serie3_axis").selectedIndex].value;

+

+   data0 = ""; data1 = ""; data2 = ""; absissa = "";

+   for(i=0;i<8;i++)

+    {

+     data0 = data0 + "!" + document.getElementById("d_serie1_data"+i).value;

+     data1 = data1 + "!" + document.getElementById("d_serie2_data"+i).value;

+     data2 = data2 + "!" + document.getElementById("d_serie3_data"+i).value;

+     absissa = absissa + "!" + document.getElementById("d_absissa_data"+i).value;

+    }

+

+   d_normalize_enabled	= document.getElementById("d_normalize_enabled").checked;

+

+   d_axis0_name		= document.getElementById("d_axis0_name").value;

+   d_axis1_name		= document.getElementById("d_axis1_name").value;

+   d_axis2_name		= document.getElementById("d_axis2_name").value;

+

+   d_axis0_unit		= document.getElementById("d_axis0_unit").value;

+   d_axis1_unit		= document.getElementById("d_axis1_unit").value;

+   d_axis2_unit		= document.getElementById("d_axis2_unit").value;

+

+   d_axis0_position	= document.getElementById("d_axis0_position").options[document.getElementById("d_axis0_position").selectedIndex].value;

+   d_axis1_position	= document.getElementById("d_axis1_position").options[document.getElementById("d_axis1_position").selectedIndex].value;

+   d_axis2_position	= document.getElementById("d_axis2_position").options[document.getElementById("d_axis2_position").selectedIndex].value;

+

+   d_axis0_format	= document.getElementById("d_axis0_format").options[document.getElementById("d_axis0_format").selectedIndex].value;

+   d_axis1_format	= document.getElementById("d_axis1_format").options[document.getElementById("d_axis1_format").selectedIndex].value;

+   d_axis2_format	= document.getElementById("d_axis2_format").options[document.getElementById("d_axis2_format").selectedIndex].value;

+

+   URL = "script/session.php?d_serie1_enabled="+d_serie1_enabled+"&d_serie2_enabled="+d_serie2_enabled+"&d_serie3_enabled="+d_serie3_enabled

+        +"&d_absissa_enabled="+d_absissa_enabled+"&d_serie1_axis="+d_serie1_axis+"&d_serie2_axis="+d_serie2_axis+"&d_serie3_axis="+d_serie3_axis

+        +"&data0="+data0+"&data1="+data1+"&data2="+data2+"&absissa="+absissa+"&d_axis0_name="+d_axis0_name+"&d_axis1_name="+d_axis1_name

+        +"&d_axis2_name="+d_axis2_name+"&d_axis0_unit="+d_axis0_unit+"&d_axis1_unit="+d_axis1_unit+"&d_axis2_unit="+d_axis2_unit

+        +"&d_axis0_position="+d_axis0_position+"&d_axis1_position="+d_axis1_position+"&d_axis2_position="+d_axis2_position

+        +"&d_normalize_enabled="+d_normalize_enabled+"&d_serie1_name="+d_serie1_name+"&d_serie2_name="+d_serie2_name+"&d_serie3_name="+d_serie3_name

+        +"&d_axis0_format="+d_axis0_format+"&d_axis1_format="+d_axis1_format+"&d_axis2_format="+d_axis2_format;

+

+   push(URL,2);

+  }

+

+ function saveScale()

+  {

+   document.getElementById("result_area").innerHTML = "<img src='graphix/wait.gif' width='24' height='24' alt=''><br/>Saving configuration (Scale)";

+

+   s_x			= document.getElementById("s_x").value;

+   s_y			= document.getElementById("s_y").value;

+   s_width		= document.getElementById("s_width").value;

+   s_height		= document.getElementById("s_height").value;

+   s_direction		= document.getElementById("s_direction").options[document.getElementById("s_direction").selectedIndex].value;

+   s_arrows_enabled	= document.getElementById("s_arrows_enabled").checked;

+   s_mode		= document.getElementById("s_mode").options[document.getElementById("s_mode").selectedIndex].value;

+   s_cycle_enabled	= document.getElementById("s_cycle_enabled").checked;

+   s_x_margin		= document.getElementById("s_x_margin").value;

+   s_y_margin		= document.getElementById("s_y_margin").value;

+   s_automargin_enabled	= document.getElementById("s_automargin_enabled").checked;

+   s_font		= document.getElementById("s_font").options[document.getElementById("s_font").selectedIndex].value;

+   s_font_size		= document.getElementById("s_font_size").value;

+   s_font_color		= document.getElementById("s_font_color").value;

+

+   s_x_labeling		= document.getElementById("s_x_labeling").options[document.getElementById("s_x_labeling").selectedIndex].value;

+   s_x_skip		= document.getElementById("s_x_skip").value;

+   s_x_label_rotation	= document.getElementById("s_x_label_rotation").value;

+

+   s_grid_color		= document.getElementById("s_grid_color").value;

+   s_grid_alpha		= document.getElementById("s_grid_alpha").value;

+   s_grid_x_enabled	= document.getElementById("s_grid_x_enabled").checked;

+   s_grid_y_enabled	= document.getElementById("s_grid_y_enabled").checked;

+

+   s_ticks_color	= document.getElementById("s_ticks_color").value;

+   s_ticks_alpha	= document.getElementById("s_ticks_alpha").value;

+   s_subticks_color	= document.getElementById("s_subticks_color").value;

+   s_subticks_alpha	= document.getElementById("s_subticks_alpha").value;

+   s_subticks_enabled	= document.getElementById("s_subticks_enabled").checked;

+

+   URL = "script/session.php?s_x="+s_x+"&s_y="+s_y+"&s_width="+s_width+"&s_height="+s_height+"&s_direction="+s_direction

+        +"&s_arrows_enabled="+s_arrows_enabled+"&s_mode="+s_mode+"&s_cycle_enabled="+s_cycle_enabled+"&s_x_margin="+s_x_margin

+        +"&s_y_margin="+s_y_margin+"&s_automargin_enabled="+s_automargin_enabled+"&s_x_labeling="+s_x_labeling+"&s_x_skip="+s_x_skip

+        +"&s_x_label_rotation="+s_x_label_rotation+"&s_grid_color="+s_grid_color+"&s_grid_alpha="+s_grid_alpha+"&s_grid_x_enabled="+s_grid_x_enabled

+        +"&s_grid_y_enabled="+s_grid_y_enabled+"&s_ticks_color="+s_ticks_color+"&s_ticks_alpha="+s_ticks_alpha+"&s_subticks_color="+s_subticks_color

+        +"&s_subticks_alpha="+s_subticks_alpha+"&s_subticks_enabled="+s_subticks_enabled+"&s_font="+s_font+"&s_font_size="+s_font_size

+        +"&s_font_color="+s_font_color+"&Seed="+Math.random(100);

+

+   push(URL,3);

+  }

+

+ function saveChart()

+  {

+   document.getElementById("result_area").innerHTML = "<img src='graphix/wait.gif' width='24' height='24' alt=''><br/>Saving configuration (Chart)";

+

+   c_family			= document.getElementById("c_family").options[document.getElementById("c_family").selectedIndex].value;

+   c_display_values		= document.getElementById("c_display_values").checked;

+   c_break_color		= document.getElementById("c_break_color").value;

+   c_break			= document.getElementById("c_break").checked;

+

+   c_plot_size			= document.getElementById("c_plot_size").value;

+   c_border_size		= document.getElementById("c_border_size").value;

+   c_border_enabled		= document.getElementById("c_border_enabled").checked;

+

+   c_bar_classic		= document.getElementById("c_bar_classic").checked;

+   c_bar_rounded		= document.getElementById("c_bar_rounded").checked;

+   c_bar_gradient		= document.getElementById("c_bar_gradient").checked;

+   c_around_zero1		= document.getElementById("c_around_zero1").checked;

+

+   c_transparency		= document.getElementById("c_transparency").value;

+   c_forced_transparency	= document.getElementById("c_forced_transparency").checked;

+   c_around_zero2		= document.getElementById("c_around_zero2").checked;

+

+   URL = "script/session.php?c_family="+c_family+"&c_display_values="+c_display_values+"&c_plot_size="+c_plot_size+"&c_border_size="+c_border_size+"&c_border_enabled="+c_border_enabled

+        +"&c_bar_classic="+c_bar_classic+"&c_bar_rounded="+c_bar_rounded+"&c_bar_gradient="+c_bar_gradient+"&c_around_zero1="+c_around_zero1

+        +"&c_transparency="+c_transparency+"&c_forced_transparency="+c_forced_transparency+"&c_around_zero2="+c_around_zero2

+        +"&c_break="+c_break+"&c_break_color="+c_break_color;

+

+   push(URL,4);

+  }

+

+ function saveLegend()

+  {

+   document.getElementById("result_area").innerHTML = "<img src='graphix/wait.gif' width='24' height='24' alt=''><br/>Saving configuration (Legend and Thresholds)";

+

+   l_enabled		= document.getElementById("l_enabled").checked;

+

+   l_font		= document.getElementById("l_font").options[document.getElementById("l_font").selectedIndex].value;

+   l_font_size		= document.getElementById("l_font_size").value;

+   l_font_color		= document.getElementById("l_font_color").value;

+

+   l_margin		= document.getElementById("l_margin").value;

+   l_alpha		= document.getElementById("l_alpha").value;

+   l_format		= document.getElementById("l_format").options[document.getElementById("l_format").selectedIndex].value;

+

+   l_orientation	= document.getElementById("l_orientation").options[document.getElementById("l_orientation").selectedIndex].value;

+   l_box_size		= document.getElementById("l_box_size").value;

+

+   l_position		= document.getElementById("l_position").options[document.getElementById("l_position").selectedIndex].value;

+   l_x			= document.getElementById("l_x").value;

+   l_y			= document.getElementById("l_y").value;

+

+   l_family		= document.getElementById("l_family").options[document.getElementById("l_family").selectedIndex].value;

+

+   t_enabled		= document.getElementById("t_enabled").checked;

+

+   t_value		= document.getElementById("t_value").value;

+   t_axis0		= document.getElementById("t_axis0").checked;

+   t_axis1		= document.getElementById("t_axis1").checked;

+   t_axis2		= document.getElementById("t_axis2").checked;

+

+   t_color		= document.getElementById("t_color").value;

+   t_alpha		= document.getElementById("t_alpha").value;

+   t_ticks		= document.getElementById("t_ticks").checked;

+

+   t_caption		= document.getElementById("t_caption").value;

+   t_box		= document.getElementById("t_box").checked;

+   t_caption_enabled	= document.getElementById("t_caption_enabled").checked;

+

+   sl_enabled		= document.getElementById("sl_enabled").checked;

+   sl_shaded		= document.getElementById("sl_shaded").checked;

+   sl_caption_enabled	= document.getElementById("sl_caption_enabled").checked;

+   sl_caption_line	= document.getElementById("sl_caption_line").checked;

+

+   p_template		= document.getElementById("p_template").options[document.getElementById("p_template").selectedIndex].value;

+

+   if ( t_axis0 ) { t_axis = 0; }

+   if ( t_axis1 ) { t_axis = 1; }

+   if ( t_axis2 ) { t_axis = 2; }

+

+   URL = "script/session.php?l_enabled="+l_enabled+"&l_font="+l_font+"&l_font_size="+l_font_size+"&l_font_color="+l_font_color

+        +"&l_margin="+l_margin+"&l_alpha="+l_alpha+"&l_format="+l_format+"&l_orientation="+l_orientation+"&l_box_size="+l_box_size

+        +"&t_enabled="+t_enabled+"&t_value="+t_value+"&t_axis="+t_axis+"&t_color="+t_color+"&t_alpha="+t_alpha+"&t_ticks="+t_ticks

+        +"&t_caption="+t_caption+"&t_box="+t_box+"&t_caption_enabled="+t_caption_enabled+"&l_position="+l_position+"&l_x="+l_x+"&l_y="+l_y

+        +"&p_template="+p_template+"&l_family="+l_family+"&sl_enabled="+sl_enabled+"&sl_shaded="+sl_shaded+"&sl_caption_enabled="+sl_caption_enabled

+        +"&sl_caption_line="+sl_caption_line;

+

+   push(URL,5);

+  }

+

+ function randomize()

+  {

+   for(i=0;i<8;i++)

+    {

+     document.getElementById("d_serie1_data"+i).value = Math.ceil(Math.random()*100-50);

+     document.getElementById("d_serie2_data"+i).value = Math.ceil(Math.random()*100-50);

+     document.getElementById("d_serie3_data"+i).value = Math.ceil(Math.random()*100-50);

+    }

+  }

+

+ function setColors()

+  {

+   applyColor("g_title_color","g_title_color_show");

+   applyColor("g_solid_color","g_solid_color_show");

+   applyColor("g_gradient_start","g_gradient_start_show");

+   applyColor("g_gradient_end","g_gradient_end_show");

+   applyColor("s_font_color","s_font_color_show");

+   applyColor("s_grid_color","s_grid_color_show");

+   applyColor("s_ticks_color","s_ticks_color_show");

+   applyColor("s_subticks_color","s_subticks_color_show");

+   applyColor("l_font_color","l_font_color_show");

+   applyColor("t_color","t_color_show");

+   applyColor("c_break_color","c_break_color_show");

+  }

+

+ function applyColor(SourceID,TargetID)

+  {

+   color = document.getElementById(SourceID).value;

+   color = color.replace("#","");

+   document.getElementById(TargetID).style.backgroundColor = "#"+color;

+  }

+

+ function checkChartSettings()

+  {

+   ChartFamily = document.getElementById("c_family").options[document.getElementById("c_family").selectedIndex].value;

+

+   disableItem("c_plot_size"); disableItem("c_border_size"); disableCheck("c_border_enabled");

+   disableRadio("c_bar_classic"); disableRadio("c_bar_rounded"); disableRadio("c_bar_gradient"); disableCheck("c_around_zero1");

+   disableItem("c_transparency"); disableCheck("c_forced_transparency"); disableCheck("c_around_zero2");

+

+   if ( ChartFamily == "plot" )

+    { enableItem("c_plot_size"); enableItem("c_border_size"); enableCheck("c_border_enabled"); checkPlotBorder(); }

+

+   if ( ChartFamily == "bar" || ChartFamily == "sbar" )

+    { enableRadio("c_bar_classic"); enableRadio("c_bar_rounded"); enableRadio("c_bar_gradient"); enableCheck("c_around_zero1"); }

+

+   if ( ChartFamily == "fspline" || ChartFamily == "area" || ChartFamily == "sarea" || ChartFamily == "fstep" )

+    { enableItem("c_transparency"); enableCheck("c_forced_transparency"); enableCheck("c_around_zero2"); checkAreaChart(); }

+

+   if ( Automatic )

+    {

+     if ( ChartFamily == "sbar" || ChartFamily == "sarea" )

+      document.getElementById("s_mode").value = "SCALE_MODE_ADDALL";

+     else

+      document.getElementById("s_mode").value = "SCALE_MODE_FLOATING";

+    }

+  }

+

+ function checkLegend()

+  {

+   l_position = document.getElementById("l_position").options[document.getElementById("l_position").selectedIndex].value;

+

+   if ( l_position == "Manual" )

+    { enableItem("l_x"); enableItem("l_y"); }

+   else

+    { disableItem("l_x"); disableItem("l_y"); }

+  }

+

+ function checkPlotBorder()

+  {

+   borderEnabled = document.getElementById("c_border_enabled").checked;

+   if ( borderEnabled ) { enableItem("c_border_size"); } else { disableItem("c_border_size"); }

+  }

+

+ function checkAreaChart()

+  {

+   c_forced_transparency = document.getElementById("c_forced_transparency").checked;

+   if ( c_forced_transparency ) { enableItem("c_transparency"); } else { disableItem("c_transparency"); }

+  }

+

+ function toggleSubTicks()

+  {

+   if ( !document.getElementById("s_subticks_enabled").checked )

+    { disableItem("s_subticks_color"); disableItem("s_subticks_alpha"); }

+   else

+    { enableItem("s_subticks_color"); enableItem("s_subticks_alpha"); }

+  }

+

+ function toggleAutoMargins()

+  {

+   if ( document.getElementById("s_automargin_enabled").checked )

+    { disableItem("s_x_margin"); disableItem("s_y_margin"); }

+   else

+    { enableItem("s_x_margin"); enableItem("s_y_margin"); }

+  }

+

+ function checkEnabledAxis()

+  {

+   Serie1Enabled = document.getElementById("d_serie1_enabled").checked;

+   Serie2Enabled = document.getElementById("d_serie2_enabled").checked;

+   Serie3Enabled = document.getElementById("d_serie3_enabled").checked;

+   Serie1Binding = document.getElementById("d_serie1_axis").options[document.getElementById("d_serie1_axis").selectedIndex].value;

+   Serie2Binding = document.getElementById("d_serie2_axis").options[document.getElementById("d_serie2_axis").selectedIndex].value;

+   Serie3Binding = document.getElementById("d_serie3_axis").options[document.getElementById("d_serie3_axis").selectedIndex].value;

+

+   Series = 0;

+   if ( Serie1Enabled ) { Series++; }

+   if ( Serie2Enabled ) { Series++; }

+   if ( Serie3Enabled ) { Series++; }

+

+   if ( (Serie1Binding != 0 || !Serie1Enabled) && (Serie2Binding != 0 || !Serie2Enabled) && (Serie3Binding != 0 || !Serie3Enabled) )

+    { disableItem("d_axis0_name"); disableItem("d_axis0_unit"); disableItem("d_axis0_position"); disableItem("d_axis0_format"); }

+   else

+    { enableItem("d_axis0_name"); enableItem("d_axis0_unit"); enableItem("d_axis0_position"); enableItem("d_axis0_format"); }

+

+   if ( (Serie1Binding != 1 || !Serie1Enabled) && (Serie2Binding != 1 || !Serie2Enabled) && (Serie3Binding != 1 || !Serie3Enabled) )

+    { disableItem("d_axis1_name"); disableItem("d_axis1_unit"); disableItem("d_axis1_position"); disableItem("d_axis1_format"); }

+   else

+    { enableItem("d_axis1_name"); enableItem("d_axis1_unit"); enableItem("d_axis1_position"); enableItem("d_axis1_format"); }

+

+   if ( (Serie1Binding != 2 || !Serie1Enabled) && (Serie2Binding != 2 || !Serie2Enabled) && (Serie3Binding != 2 || !Serie3Enabled) )

+    { disableItem("d_axis2_name"); disableItem("d_axis2_unit"); disableItem("d_axis2_position"); disableItem("d_axis2_format"); }

+   else

+    { enableItem("d_axis2_name"); enableItem("d_axis2_unit"); enableItem("d_axis2_position"); enableItem("d_axis2_format"); }

+

+   if ( Automatic )

+    {

+     sl_enabled  = document.getElementById("sl_enabled").checked;

+     g_width     = document.getElementById("g_width").value;

+     g_height    = document.getElementById("g_height").value;

+     s_direction = document.getElementById("s_direction").options[document.getElementById("s_direction").selectedIndex].value;

+

+     leftSeries = 0; rightSeries = 0;

+

+     if ( !document.getElementById("d_axis0_position").disabled && document.getElementById("d_axis0_position").options[document.getElementById("d_axis0_position").selectedIndex].value == "left" ) { leftSeries++; }

+     if ( !document.getElementById("d_axis0_position").disabled && document.getElementById("d_axis0_position").options[document.getElementById("d_axis0_position").selectedIndex].value == "right" ) { rightSeries++; }

+     if ( !document.getElementById("d_axis1_position").disabled && document.getElementById("d_axis1_position").options[document.getElementById("d_axis1_position").selectedIndex].value == "left" ) { leftSeries++; }

+     if ( !document.getElementById("d_axis1_position").disabled && document.getElementById("d_axis1_position").options[document.getElementById("d_axis1_position").selectedIndex].value == "right" ) { rightSeries++; }

+     if ( !document.getElementById("d_axis2_position").disabled && document.getElementById("d_axis2_position").options[document.getElementById("d_axis2_position").selectedIndex].value == "left" ) { leftSeries++; }

+     if ( !document.getElementById("d_axis2_position").disabled && document.getElementById("d_axis2_position").options[document.getElementById("d_axis2_position").selectedIndex].value == "right" ) { rightSeries++; }

+

+     if ( s_direction == "SCALE_POS_LEFTRIGHT" )

+      {

+       if ( leftSeries == 0 ) { leftOffset = 20; } else { leftOffset = 10; }

+       if ( rightSeries == 0 ) { rightOffset = 25; } else { rightOffset = 15; }

+

+       leftMargin = leftOffset + 40 * leftSeries;

+       width = g_width - leftMargin - 40 * rightSeries - rightOffset;

+

+       if ( sl_enabled ) { BottomOffset = Series*15; } else { BottomOffset = 0; }

+

+       document.getElementById("s_x").value = leftMargin;

+       document.getElementById("s_y").value = 50;

+       document.getElementById("s_width").value = width;

+       document.getElementById("s_height").value = g_height - 50 - 40 - BottomOffset;

+      }

+     else

+      {

+       if ( leftSeries == 0 ) { topOffset = 40; } else { topOffset = 40; }

+       if ( rightSeries == 0 ) { bottomOffset = 25; } else { bottomOffset = 15; }

+

+       topMargin = topOffset + 30 * leftSeries;

+       height = g_height - topMargin - 30 * rightSeries - bottomOffset;

+

+       if ( sl_enabled ) { RightOffset = Series*15; } else { RightBottomOffset = 0; }

+

+       document.getElementById("s_x").value = 70;

+       document.getElementById("s_y").value = topMargin;

+       document.getElementById("s_width").value = g_width - 70 - 40 - RightOffset;

+       document.getElementById("s_height").value = height;

+      }

+    }

+  }

+

+ function disableItem(ID)

+  {

+   document.getElementById(ID).style.backgroundColor = "#E0E0E0";

+   document.getElementById(ID).style.color = "#A0A0A0";

+   document.getElementById(ID).disabled = true;

+  }

+

+ function disableCheck(ID)

+  {

+   document.getElementById(ID).style.color = "#A0A0A0";

+   document.getElementById(ID).disabled = true;

+  }

+

+ function disableRadio(ID)

+  {

+   document.getElementById(ID).disabled = true;

+  }

+

+ function enableItem(ID)

+  {

+   document.getElementById(ID).style.backgroundColor = "#FFFFFF";

+   document.getElementById(ID).style.color = "#707070";

+   document.getElementById(ID).disabled = false;

+  }

+

+ function enableCheck(ID)

+  {

+   document.getElementById(ID).style.color = "#707070";

+   document.getElementById(ID).disabled = false;

+  }

+

+ function enableRadio(ID)

+  {

+   document.getElementById(ID).disabled = false;

+  }

+

+ function setDefaultAbsissa()

+  {

+   document.getElementById("d_absissa_data0").value = "January";

+   document.getElementById("d_absissa_data1").value = "February";

+   document.getElementById("d_absissa_data2").value = "March";

+   document.getElementById("d_absissa_data3").value = "April";

+   document.getElementById("d_absissa_data4").value = "May";

+   document.getElementById("d_absissa_data5").value = "June";

+   document.getElementById("d_absissa_data6").value = "July";

+   document.getElementById("d_absissa_data7").value = "August";

+  }

+

+ function push(URL,nextStep)

+  {

+   var xmlhttp=false;   

+   /*@cc_on @*/  

+   /*@if (@_jscript_version >= 5)  

+    try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } }  

+   @end @*/  

+  

+   if (!xmlhttp && typeof XMLHttpRequest!='undefined')   

+    { try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp=false; } }   

+  

+   if (!xmlhttp && window.createRequest)   

+    { try { xmlhttp = window.createRequest(); } catch (e) { xmlhttp=false; } }   

+  

+   xmlhttp.open("GET", URL,true);

+

+   xmlhttp.onreadystatechange=function() {   

+    if (xmlhttp.readyState==4)

+     {

+      if ( nextStep == 1 ) { saveData(); }

+      if ( nextStep == 2 ) { saveScale(); }

+      if ( nextStep == 3 ) { saveChart(); }

+      if ( nextStep == 4 ) { saveLegend(); }

+      if ( nextStep == 5 )

+       {

+        if ( Action == "Render" )

+         doRender();

+        else

+         push("script/render.php?Mode=Source&Seed="+Math.random(100),6);

+       }

+      if ( nextStep == 6 )

+       {

+        document.getElementById("result_area").innerHTML = "<pre name='code'>"+xmlhttp.responseText+"</pre>";

+       }

+     }

+    }   

+   xmlhttp.send(null)   

+  }

+

+ function doRender()

+  {

+   document.getElementById("result_area").innerHTML = "<img src='graphix/wait.gif' width='24' height='24' alt=''><br/>Rendering";

+

+   RandomKey = Math.random(100);

+   URL       = "script/render.php?Seed=" + RandomKey;

+ 

+   StartFade();

+  }

+

+ function StartFade()

+  {

+   Loader     = new Image();   

+   Loader.src = URL;   

+   setTimeout("CheckLoadingStatus()", 200);   

+  }

+

+ function CheckLoadingStatus()   

+  {   

+   if ( Loader.complete == true )   

+    {

+     changeOpac(0, "result_area");

+     HTMLResult = "<center><img src='" + URL + "' alt=''/></center>";

+     document.getElementById("result_area").innerHTML = HTMLResult;

+

+     opacity("result_area",0,100,500);

+    }

+   else  

+    setTimeout("CheckLoadingStatus()", 200);   

+  }   

+

+ function changeOpac(opacity, id)   

+  {   

+   var object = document.getElementById(id).style;   

+   object.opacity = (opacity / 100);   

+   object.MozOpacity = (opacity / 100);   

+   object.KhtmlOpacity = (opacity / 100);   

+   object.filter = "alpha(opacity=" + opacity + ")";   

+  }   

+

+ function opacity(id, opacStart, opacEnd, millisec)

+  {

+   var speed = Math.round(millisec / 100);

+   var timer = 0;

+

+   if(opacStart > opacEnd)

+    {

+     for(i = opacStart; i >= opacEnd; i--)

+      {

+       setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));

+       timer++;

+      }

+    }

+   else if(opacStart < opacEnd)

+    {

+     for(i = opacStart; i <= opacEnd; i++)

+      {

+       setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));

+       timer++;

+      }

+    }

+  }

 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/includes/hs.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/includes/hv.png differ
--- /dev/null
+++ b/lib/pChart2.1.0/examples/sandbox/includes/jscolor.js
@@ -1,1 +1,842 @@
+/**

+ * jscolor, JavaScript Color Picker

+ *

+ * @version 1.3.1

+ * @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html

+ * @author  Jan Odvarko, http://odvarko.cz

+ * @created 2008-06-15

+ * @updated 2010-01-23

+ * @link    http://jscolor.com

+ */

+

+

+var jscolor = {

+

+

+	dir : '', // location of jscolor directory (leave empty to autodetect)

+	bindClass : 'color', // class name

+	binding : true, // automatic binding via <input class="...">

+	preloading : true, // use image preloading?

+

+

+	install : function() {

+		jscolor.addEvent(window, 'load', jscolor.init);

+	},

+

+

+	init : function() {

+		if(jscolor.binding) {

+			jscolor.bind();

+		}

+		if(jscolor.preloading) {

+			jscolor.preload();

+		}

+	},

+

+

+	getDir : function() {

+		if(!jscolor.dir) {

+			var detected = jscolor.detectDir();

+			jscolor.dir = detected!==false ? detected : 'jscolor/';

+		}

+		return jscolor.dir;

+	},

+

+

+	detectDir : function() {

+		var base = location.href;

+

+		var e = document.getElementsByTagName('base');

+		for(var i=0; i<e.length; i+=1) {

+			if(e[i].href) { base = e[i].href; }

+		}

+

+		var e = document.getElementsByTagName('script');

+		for(var i=0; i<e.length; i+=1) {

+			if(e[i].src && /(^|\/)jscolor\.js([?#].*)?$/i.test(e[i].src)) {

+				var src = new jscolor.URI(e[i].src);

+				var srcAbs = src.toAbsolute(base);

+				srcAbs.path = srcAbs.path.replace(/[^\/]+$/, ''); // remove filename

+				srcAbs.query = null;

+				srcAbs.fragment = null;

+				return srcAbs.toString();

+			}

+		}

+		return false;

+	},

+

+

+	bind : function() {

+		var matchClass = new RegExp('(^|\\s)('+jscolor.bindClass+')\\s*(\\{[^}]*\\})?', 'i');

+		var e = document.getElementsByTagName('input');

+		for(var i=0; i<e.length; i+=1) {

+			var m;

+			if(!e[i].color && e[i].className && (m = e[i].className.match(matchClass))) {

+				var prop = {};

+				if(m[3]) {

+					try {

+						eval('prop='+m[3]);

+					} catch(eInvalidProp) {}

+				}

+				e[i].color = new jscolor.color(e[i], prop);

+			}

+		}

+	},

+

+

+	preload : function() {

+		for(var fn in jscolor.imgRequire) {

+			if(jscolor.imgRequire.hasOwnProperty(fn)) {

+				jscolor.loadImage(fn);

+			}

+		}

+	},

+

+

+	images : {

+		pad : [ 181, 101 ],

+		sld : [ 16, 101 ],

+		cross : [ 15, 15 ],

+		arrow : [ 7, 11 ]

+	},

+

+

+	imgRequire : {},

+	imgLoaded : {},

+

+

+	requireImage : function(filename) {

+		jscolor.imgRequire[filename] = true;

+	},

+

+

+	loadImage : function(filename) {

+		if(!jscolor.imgLoaded[filename]) {

+			jscolor.imgLoaded[filename] = new Image();

+			jscolor.imgLoaded[filename].src = jscolor.getDir()+filename;

+		}

+	},

+

+

+	fetchElement : function(mixed) {

+		return typeof mixed === 'string' ? document.getElementById(mixed) : mixed;

+	},

+

+

+	addEvent : function(el, evnt, func) {

+		if(el.addEventListener) {

+			el.addEventListener(evnt, func, false);

+		} else if(el.attachEvent) {

+			el.attachEvent('on'+evnt, func);

+		}

+	},

+

+

+	fireEvent : function(el, evnt) {

+		if(!el) {

+			return;

+		}

+		if(document.createEventObject) {

+			var ev = document.createEventObject();

+			el.fireEvent('on'+evnt, ev);

+		} else if(document.createEvent) {

+			var ev = document.createEvent('HTMLEvents');

+			ev.initEvent(evnt, true, true);

+			el.dispatchEvent(ev);

+		} else if(el['on'+evnt]) { // alternatively use the traditional event model (IE5)

+			el['on'+evnt]();

+		}

+	},

+

+

+	getElementPos : function(e) {

+		var e1=e, e2=e;

+		var x=0, y=0;

+		if(e1.offsetParent) {

+			do {

+				x += e1.offsetLeft;

+				y += e1.offsetTop;

+			} while(e1 = e1.offsetParent);

+		}

+		while((e2 = e2.parentNode) && e2.nodeName.toUpperCase() !== 'BODY') {

+			x -= e2.scrollLeft;

+			y -= e2.scrollTop;

+		}

+		return [x, y];

+	},

+

+

+	getElementSize : function(e) {

+		return [e.offsetWidth, e.offsetHeight];

+	},

+

+

+	getMousePos : function(e) {

+		if(!e) { e = window.event; }

+		if(typeof e.pageX === 'number') {

+			return [e.pageX, e.pageY];

+		} else if(typeof e.clientX === 'number') {

+			return [

+				e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft,

+				e.clientY + document.body.scrollTop + document.documentElement.scrollTop

+			];

+		}

+	},

+

+

+	getViewPos : function() {

+		if(typeof window.pageYOffset === 'number') {

+			return [window.pageXOffset, window.pageYOffset];

+		} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {

+			return [document.body.scrollLeft, document.body.scrollTop];

+		} else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {

+			return [document.documentElement.scrollLeft, document.documentElement.scrollTop];

+		} else {

+			return [0, 0];

+		}

+	},

+

+

+	getViewSize : function() {

+		if(typeof window.innerWidth === 'number') {

+			return [window.innerWidth, window.innerHeight];

+		} else if(document.body && (document.body.clientWidth || document.body.clientHeight)) {

+			return [document.body.clientWidth, document.body.clientHeight];

+		} else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {

+			return [document.documentElement.clientWidth, document.documentElement.clientHeight];

+		} else {

+			return [0, 0];

+		}

+	},

+

+

+	URI : function(uri) { // See RFC3986

+

+		this.scheme = null;

+		this.authority = null;

+		this.path = '';

+		this.query = null;

+		this.fragment = null;

+

+		this.parse = function(uri) {

+			var m = uri.match(/^(([A-Za-z][0-9A-Za-z+.-]*)(:))?((\/\/)([^\/?#]*))?([^?#]*)((\?)([^#]*))?((#)(.*))?/);

+			this.scheme = m[3] ? m[2] : null;

+			this.authority = m[5] ? m[6] : null;

+			this.path = m[7];

+			this.query = m[9] ? m[10] : null;

+			this.fragment = m[12] ? m[13] : null;

+			return this;

+		};

+

+		this.toString = function() {

+			var result = '';

+			if(this.scheme !== null) { result = result + this.scheme + ':'; }

+			if(this.authority !== null) { result = result + '//' + this.authority; }

+			if(this.path !== null) { result = result + this.path; }

+			if(this.query !== null) { result = result + '?' + this.query; }

+			if(this.fragment !== null) { result = result + '#' + this.fragment; }

+			return result;

+		};

+

+		this.toAbsolute = function(base) {

+			var base = new jscolor.URI(base);

+			var r = this;

+			var t = new jscolor.URI;

+

+			if(base.scheme === null) { return false; }

+

+			if(r.scheme !== null && r.scheme.toLowerCase() === base.scheme.toLowerCase()) {

+				r.scheme = null;

+			}

+

+			if(r.scheme !== null) {

+				t.scheme = r.scheme;

+				t.authority = r.authority;

+				t.path = removeDotSegments(r.path);

+				t.query = r.query;

+			} else {

+				if(r.authority !== null) {

+					t.authority = r.authority;

+					t.path = removeDotSegments(r.path);

+					t.query = r.query;

+				} else {

+					if(r.path === '') { // TODO: == or === ?

+						t.path = base.path;

+						if(r.query !== null) {

+							t.query = r.query;

+						} else {

+							t.query = base.query;

+						}

+					} else {

+						if(r.path.substr(0,1) === '/') {

+							t.path = removeDotSegments(r.path);

+						} else {

+							if(base.authority !== null && base.path === '') { // TODO: == or === ?

+								t.path = '/'+r.path;

+							} else {

+								t.path = base.path.replace(/[^\/]+$/,'')+r.path;

+							}

+							t.path = removeDotSegments(t.path);

+						}

+						t.query = r.query;

+					}

+					t.authority = base.authority;

+				}

+				t.scheme = base.scheme;

+			}

+			t.fragment = r.fragment;

+

+			return t;

+		};

+

+		function removeDotSegments(path) {

+			var out = '';

+			while(path) {

+				if(path.substr(0,3)==='../' || path.substr(0,2)==='./') {

+					path = path.replace(/^\.+/,'').substr(1);

+				} else if(path.substr(0,3)==='/./' || path==='/.') {

+					path = '/'+path.substr(3);

+				} else if(path.substr(0,4)==='/../' || path==='/..') {

+					path = '/'+path.substr(4);

+					out = out.replace(/\/?[^\/]*$/, '');

+				} else if(path==='.' || path==='..') {

+					path = '';

+				} else {

+					var rm = path.match(/^\/?[^\/]*/)[0];

+					path = path.substr(rm.length);

+					out = out + rm;

+				}

+			}

+			return out;

+		}

+

+		if(uri) {

+			this.parse(uri);

+		}

+

+	},

+

+

+	/*

+	 * Usage example:

+	 * var myColor = new jscolor.color(myInputElement)

+	 */

+

+	color : function(target, prop) {

+

+

+		this.required = true; // refuse empty values?

+		this.adjust = true; // adjust value to uniform notation?

+		this.hash = false; // prefix color with # symbol?

+		this.caps = true; // uppercase?

+		this.valueElement = target; // value holder

+		this.styleElement = target; // where to reflect current color

+		this.hsv = [0, 0, 1]; // read-only  0-6, 0-1, 0-1

+		this.rgb = [1, 1, 1]; // read-only  0-1, 0-1, 0-1

+

+		this.pickerOnfocus = true; // display picker on focus?

+		this.pickerMode = 'HSV'; // HSV | HVS

+		this.pickerPosition = 'bottom'; // left | right | top | bottom

+		this.pickerFace = 10; // px

+		this.pickerFaceColor = 'ThreeDFace'; // CSS color

+		this.pickerBorder = 1; // px

+		this.pickerBorderColor = 'ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight'; // CSS color

+		this.pickerInset = 1; // px

+		this.pickerInsetColor = 'ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow'; // CSS color

+		this.pickerZIndex = 10000;

+

+

+		for(var p in prop) {

+			if(prop.hasOwnProperty(p)) {

+				this[p] = prop[p];

+			}

+		}

+

+

+		this.hidePicker = function() {

+			if(isPickerOwner()) {

+				removePicker();

+			}

+		};

+

+

+		this.showPicker = function() {

+			if(!isPickerOwner()) {

+				var tp = jscolor.getElementPos(target); // target pos

+				var ts = jscolor.getElementSize(target); // target size

+				var vp = jscolor.getViewPos(); // view pos

+				var vs = jscolor.getViewSize(); // view size

+				var ps = [ // picker size

+					2*this.pickerBorder + 4*this.pickerInset + 2*this.pickerFace + jscolor.images.pad[0] + 2*jscolor.images.arrow[0] + jscolor.images.sld[0],

+					2*this.pickerBorder + 2*this.pickerInset + 2*this.pickerFace + jscolor.images.pad[1]

+				];

+				var a, b, c;

+				switch(this.pickerPosition.toLowerCase()) {

+					case 'left': a=1; b=0; c=-1; break;

+					case 'right':a=1; b=0; c=1; break;

+					case 'top':  a=0; b=1; c=-1; break;

+					default:     a=0; b=1; c=1; break;

+				}

+				var l = (ts[b]+ps[b])/2;

+				var pp = [ // picker pos

+					-vp[a]+tp[a]+ps[a] > vs[a] ?

+						(-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) :

+						tp[a],

+					-vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ?

+						(-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) :

+						(tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c)

+				];

+				drawPicker(pp[a], pp[b]);

+			}

+		};

+

+

+		this.importColor = function() {

+			if(!valueElement) {

+				this.exportColor();

+			} else {

+				if(!this.adjust) {

+					if(!this.fromString(valueElement.value, leaveValue)) {

+						styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;

+						styleElement.style.color = styleElement.jscStyle.color;

+						this.exportColor(leaveValue | leaveStyle);

+					}

+				} else if(!this.required && /^\s*$/.test(valueElement.value)) {

+					valueElement.value = '';

+					styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;

+					styleElement.style.color = styleElement.jscStyle.color;

+					this.exportColor(leaveValue | leaveStyle);

+

+				} else if(this.fromString(valueElement.value)) {

+					// OK

+				} else {

+					this.exportColor();

+				}

+			}

+		};

+

+

+		this.exportColor = function(flags) {

+			if(!(flags & leaveValue) && valueElement) {

+				var value = this.toString();

+				if(this.caps) { value = value.toUpperCase(); }

+				if(this.hash) { value = '#'+value; }

+				valueElement.value = value;

+			}

+			if(!(flags & leaveStyle) && styleElement) {

+/*

+				styleElement.style.backgroundColor = '#'+this.toString();

+				styleElement.style.color =

+					0.213 * this.rgb[0] +

+					0.715 * this.rgb[1] +

+					0.072 * this.rgb[2]

+					< 0.5 ? '#FFF' : '#000';

+*/

+			}

+			if(!(flags & leavePad) && isPickerOwner()) {

+				redrawPad();

+			}

+			if(!(flags & leaveSld) && isPickerOwner()) {

+				redrawSld();

+			}

+		};

+

+

+		this.fromHSV = function(h, s, v, flags) { // null = don't change

+			h<0 && (h=0) || h>6 && (h=6);

+			s<0 && (s=0) || s>1 && (s=1);

+			v<0 && (v=0) || v>1 && (v=1);

+			this.rgb = HSV_RGB(

+				h===null ? this.hsv[0] : (this.hsv[0]=h),

+				s===null ? this.hsv[1] : (this.hsv[1]=s),

+				v===null ? this.hsv[2] : (this.hsv[2]=v)

+			);

+			this.exportColor(flags);

+		};

+

+

+		this.fromRGB = function(r, g, b, flags) { // null = don't change

+			r<0 && (r=0) || r>1 && (r=1);

+			g<0 && (g=0) || g>1 && (g=1);

+			b<0 && (b=0) || b>1 && (b=1);

+			var hsv = RGB_HSV(

+				r===null ? this.rgb[0] : (this.rgb[0]=r),

+				g===null ? this.rgb[1] : (this.rgb[1]=g),

+				b===null ? this.rgb[2] : (this.rgb[2]=b)

+			);

+			if(hsv[0] !== null) {

+				this.hsv[0] = hsv[0];

+			}

+			if(hsv[2] !== 0) {

+				this.hsv[1] = hsv[1];

+			}

+			this.hsv[2] = hsv[2];

+			this.exportColor(flags);

+		};

+

+

+		this.fromString = function(hex, flags) {

+			var m = hex.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i);

+			if(!m) {

+				return false;

+			} else {

+				if(m[1].length === 6) { // 6-char notation

+					this.fromRGB(

+						parseInt(m[1].substr(0,2),16) / 255,

+						parseInt(m[1].substr(2,2),16) / 255,

+						parseInt(m[1].substr(4,2),16) / 255,

+						flags

+					);

+				} else { // 3-char notation

+					this.fromRGB(

+						parseInt(m[1].charAt(0)+m[1].charAt(0),16) / 255,

+						parseInt(m[1].charAt(1)+m[1].charAt(1),16) / 255,

+						parseInt(m[1].charAt(2)+m[1].charAt(2),16) / 255,

+						flags

+					);

+				}

+				return true;

+			}

+		};

+

+

+		this.toString = function() {

+			return (

+				(0x100 | Math.round(255*this.rgb[0])).toString(16).substr(1) +

+				(0x100 | Math.round(255*this.rgb[1])).toString(16).substr(1) +

+				(0x100 | Math.round(255*this.rgb[2])).toString(16).substr(1)

+			);

+		};

+

+

+		function RGB_HSV(r, g, b) {

+			var n = Math.min(Math.min(r,g),b);

+			var v = Math.max(Math.max(r,g),b);

+			var m = v - n;

+			if(m === 0) { return [ null, 0, v ]; }

+			var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m);

+			return [ h===6?0:h, m/v, v ];

+		}

+

+

+		function HSV_RGB(h, s, v) {

+			if(h === null) { return [ v, v, v ]; }

+			var i = Math.floor(h);

+			var f = i%2 ? h-i : 1-(h-i);

+			var m = v * (1 - s);

+			var n = v * (1 - s*f);

+			switch(i) {

+				case 6:

+				case 0: return [v,n,m];

+				case 1: return [n,v,m];

+				case 2: return [m,v,n];

+				case 3: return [m,n,v];

+				case 4: return [n,m,v];

+				case 5: return [v,m,n];

+			}

+		}

+

+

+		function removePicker() {

+			delete jscolor.picker.owner;

+			document.getElementsByTagName('body')[0].removeChild(jscolor.picker.boxB);

+		}

+

+

+		function drawPicker(x, y) {

+			if(!jscolor.picker) {

+				jscolor.picker = {

+					box : document.createElement('div'),

+					boxB : document.createElement('div'),

+					pad : document.createElement('div'),

+					padB : document.createElement('div'),

+					padM : document.createElement('div'),

+					sld : document.createElement('div'),

+					sldB : document.createElement('div'),

+					sldM : document.createElement('div')

+				};

+				for(var i=0,segSize=4; i<jscolor.images.sld[1]; i+=segSize) {

+					var seg = document.createElement('div');

+					seg.style.height = segSize+'px';

+					seg.style.fontSize = '1px';

+					seg.style.lineHeight = '0';

+					jscolor.picker.sld.appendChild(seg);

+				}

+				jscolor.picker.sldB.appendChild(jscolor.picker.sld);

+				jscolor.picker.box.appendChild(jscolor.picker.sldB);

+				jscolor.picker.box.appendChild(jscolor.picker.sldM);

+				jscolor.picker.padB.appendChild(jscolor.picker.pad);

+				jscolor.picker.box.appendChild(jscolor.picker.padB);

+				jscolor.picker.box.appendChild(jscolor.picker.padM);

+				jscolor.picker.boxB.appendChild(jscolor.picker.box);

+			}

+

+			var p = jscolor.picker;

+

+			// recompute controls positions

+			posPad = [

+				x+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset,

+				y+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset ];

+			posSld = [

+				null,

+				y+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset ];

+

+			// controls interaction

+			p.box.onmouseup =

+			p.box.onmouseout = function() { target.focus(); };

+			p.box.onmousedown = function() { abortBlur=true; };

+			p.box.onmousemove = function(e) { holdPad && setPad(e); holdSld && setSld(e); };

+			p.padM.onmouseup =

+			p.padM.onmouseout = function() { if(holdPad) { holdPad=false; jscolor.fireEvent(valueElement,'change'); } };

+			p.padM.onmousedown = function(e) { holdPad=true; setPad(e); };

+			p.sldM.onmouseup =

+			p.sldM.onmouseout = function() { if(holdSld) { holdSld=false; jscolor.fireEvent(valueElement,'change'); } };

+			p.sldM.onmousedown = function(e) { holdSld=true; setSld(e); };

+

+			// picker

+			p.box.style.width = 4*THIS.pickerInset + 2*THIS.pickerFace + jscolor.images.pad[0] + 2*jscolor.images.arrow[0] + jscolor.images.sld[0] + 'px';

+			p.box.style.height = 2*THIS.pickerInset + 2*THIS.pickerFace + jscolor.images.pad[1] + 'px';

+

+			// picker border

+			p.boxB.style.position = 'absolute';

+			p.boxB.style.clear = 'both';

+			p.boxB.style.left = x+'px';

+			p.boxB.style.top = y+'px';

+			p.boxB.style.zIndex = THIS.pickerZIndex;

+			p.boxB.style.border = THIS.pickerBorder+'px solid';

+			p.boxB.style.borderColor = THIS.pickerBorderColor;

+			p.boxB.style.background = THIS.pickerFaceColor;

+

+			// pad image

+			p.pad.style.width = jscolor.images.pad[0]+'px';

+			p.pad.style.height = jscolor.images.pad[1]+'px';

+

+			// pad border

+			p.padB.style.position = 'absolute';

+			p.padB.style.left = THIS.pickerFace+'px';

+			p.padB.style.top = THIS.pickerFace+'px';

+			p.padB.style.border = THIS.pickerInset+'px solid';

+			p.padB.style.borderColor = THIS.pickerInsetColor;

+

+			// pad mouse area

+			p.padM.style.position = 'absolute';

+			p.padM.style.left = '0';

+			p.padM.style.top = '0';

+			p.padM.style.width = THIS.pickerFace + 2*THIS.pickerInset + jscolor.images.pad[0] + jscolor.images.arrow[0] + 'px';

+			p.padM.style.height = p.box.style.height;

+			p.padM.style.cursor = 'crosshair';

+

+			// slider image

+			p.sld.style.overflow = 'hidden';

+			p.sld.style.width = jscolor.images.sld[0]+'px';

+			p.sld.style.height = jscolor.images.sld[1]+'px';

+

+			// slider border

+			p.sldB.style.position = 'absolute';

+			p.sldB.style.right = THIS.pickerFace+'px';

+			p.sldB.style.top = THIS.pickerFace+'px';

+			p.sldB.style.border = THIS.pickerInset+'px solid';

+			p.sldB.style.borderColor = THIS.pickerInsetColor;

+

+			// slider mouse area

+			p.sldM.style.position = 'absolute';

+			p.sldM.style.right = '0';

+			p.sldM.style.top = '0';

+			p.sldM.style.width = jscolor.images.sld[0] + jscolor.images.arrow[0] + THIS.pickerFace + 2*THIS.pickerInset + 'px';

+			p.sldM.style.height = p.box.style.height;

+			try {

+				p.sldM.style.cursor = 'pointer';

+			} catch(eOldIE) {

+				p.sldM.style.cursor = 'hand';

+			}

+

+			// load images in optimal order

+			switch(modeID) {

+				case 0: var padImg = 'hs.png'; break;

+				case 1: var padImg = 'hv.png'; break;

+			}

+			p.padM.style.background = "url('"+jscolor.getDir()+"cross.gif') no-repeat";

+			p.sldM.style.background = "url('"+jscolor.getDir()+"arrow.gif') no-repeat";

+			p.pad.style.background = "url('"+jscolor.getDir()+padImg+"') 0 0 no-repeat";

+

+			// place pointers

+			redrawPad();

+			redrawSld();

+

+			jscolor.picker.owner = THIS;

+			document.getElementsByTagName('body')[0].appendChild(p.boxB);

+		}

+

+

+		function redrawPad() {

+			// redraw the pad pointer

+			switch(modeID) {

+				case 0: var yComponent = 1; break;

+				case 1: var yComponent = 2; break;

+			}

+			var x = Math.round((THIS.hsv[0]/6) * (jscolor.images.pad[0]-1));

+			var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.pad[1]-1));

+			jscolor.picker.padM.style.backgroundPosition =

+				(THIS.pickerFace+THIS.pickerInset+x - Math.floor(jscolor.images.cross[0]/2)) + 'px ' +

+				(THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.cross[1]/2)) + 'px';

+

+			// redraw the slider image

+			var seg = jscolor.picker.sld.childNodes;

+

+			switch(modeID) {

+				case 0:

+					var rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 1);

+					for(var i=0; i<seg.length; i+=1) {

+						seg[i].style.backgroundColor = 'rgb('+

+							(rgb[0]*(1-i/seg.length)*100)+'%,'+

+							(rgb[1]*(1-i/seg.length)*100)+'%,'+

+							(rgb[2]*(1-i/seg.length)*100)+'%)';

+					}

+					break;

+				case 1:

+					var rgb, s, c = [ THIS.hsv[2], 0, 0 ];

+					var i = Math.floor(THIS.hsv[0]);

+					var f = i%2 ? THIS.hsv[0]-i : 1-(THIS.hsv[0]-i);

+					switch(i) {

+						case 6:

+						case 0: rgb=[0,1,2]; break;

+						case 1: rgb=[1,0,2]; break;

+						case 2: rgb=[2,0,1]; break;

+						case 3: rgb=[2,1,0]; break;

+						case 4: rgb=[1,2,0]; break;

+						case 5: rgb=[0,2,1]; break;

+					}

+					for(var i=0; i<seg.length; i+=1) {

+						s = 1 - 1/(seg.length-1)*i;

+						c[1] = c[0] * (1 - s*f);

+						c[2] = c[0] * (1 - s);

+						seg[i].style.backgroundColor = 'rgb('+

+							(c[rgb[0]]*100)+'%,'+

+							(c[rgb[1]]*100)+'%,'+

+							(c[rgb[2]]*100)+'%)';

+					}

+					break;

+			}

+		}

+

+

+		function redrawSld() {

+			// redraw the slider pointer

+			switch(modeID) {

+				case 0: var yComponent = 2; break;

+				case 1: var yComponent = 1; break;

+			}

+			var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.sld[1]-1));

+			jscolor.picker.sldM.style.backgroundPosition =

+				'0 ' + (THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.arrow[1]/2)) + 'px';

+		}

+

+

+		function isPickerOwner() {

+			return jscolor.picker && jscolor.picker.owner === THIS;

+		}

+

+

+		function blurTarget() {

+			if(valueElement === target) {

+				THIS.importColor();

+			}

+			if(THIS.pickerOnfocus) {

+				THIS.hidePicker();

+			}

+		}

+

+

+		function blurValue() {

+			if(valueElement !== target) {

+				THIS.importColor();

+			}

+		}

+

+

+		function setPad(e) {

+			var posM = jscolor.getMousePos(e);

+			var x = posM[0]-posPad[0];

+			var y = posM[1]-posPad[1];

+			switch(modeID) {

+				case 0: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), 1 - y/(jscolor.images.pad[1]-1), null, leaveSld); break;

+				case 1: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), null, 1 - y/(jscolor.images.pad[1]-1), leaveSld); break;

+			}

+		}

+

+

+		function setSld(e) {

+			var posM = jscolor.getMousePos(e);

+			var y = posM[1]-posPad[1];

+			switch(modeID) {

+				case 0: THIS.fromHSV(null, null, 1 - y/(jscolor.images.sld[1]-1), leavePad); break;

+				case 1: THIS.fromHSV(null, 1 - y/(jscolor.images.sld[1]-1), null, leavePad); break;

+			}

+		}

+

+

+		var THIS = this;

+		var modeID = this.pickerMode.toLowerCase()==='hvs' ? 1 : 0;

+		var abortBlur = false;

+		var

+			valueElement = jscolor.fetchElement(this.valueElement),

+			styleElement = jscolor.fetchElement(this.styleElement);

+		var

+			holdPad = false,

+			holdSld = false;

+		var

+			posPad,

+			posSld;

+		var

+			leaveValue = 1<<0,

+			leaveStyle = 1<<1,

+			leavePad = 1<<2,

+			leaveSld = 1<<3;

+

+		// target

+		jscolor.addEvent(target, 'focus', function() {

+			if(THIS.pickerOnfocus) { THIS.showPicker(); }

+		});

+		jscolor.addEvent(target, 'blur', function() {

+			if(!abortBlur) {

+				window.setTimeout(function(){ abortBlur || blurTarget(); abortBlur=false; }, 0);

+			} else {

+				abortBlur = false;

+			}

+		});

+

+		// valueElement

+		if(valueElement) {

+			var updateField = function() {

+				THIS.fromString(valueElement.value, leaveValue);

+			};

+			jscolor.addEvent(valueElement, 'keyup', updateField);

+			jscolor.addEvent(valueElement, 'input', updateField);

+			jscolor.addEvent(valueElement, 'blur', blurValue);

+			valueElement.setAttribute('autocomplete', 'off');

+		}

+

+		// styleElement

+		if(styleElement) {

+			styleElement.jscStyle = {

+				backgroundColor : styleElement.style.backgroundColor,

+				color : styleElement.style.color

+			};

+		}

+

+		// require images

+		switch(modeID) {

+			case 0: jscolor.requireImage('hs.png'); break;

+			case 1: jscolor.requireImage('hv.png'); break;

+		}

+		jscolor.requireImage('cross.gif');

+		jscolor.requireImage('arrow.gif');

+

+		this.importColor();

+	}

+

+};

+

+

+jscolor.install();

 

--- /dev/null
+++ b/lib/pChart2.1.0/examples/sandbox/includes/rounded_corners_lite.inc.js
@@ -1,1 +1,286 @@
 
+ /****************************************************************
+  *                                                              *
+  *  curvyCorners                                                *
+  *  ------------                                                *
+  *                                                              *
+  *  This script generates rounded corners for your divs.        *
+  *                                                              *
+  *  Version 1.2.9                                               *
+  *  Copyright (c) 2006 Cameron Cooke                            *
+  *  By: Cameron Cooke and Tim Hutchison.                        *
+  *                                                              *
+  *                                                              *
+  *  Website: http://www.curvycorners.net                        *
+  *  Email:   info@totalinfinity.com                             *
+  *  Forum:   http://www.curvycorners.net/forum/                 *
+  *                                                              *
+  *                                                              *
+  *  This library is free software; you can redistribute         *
+  *  it and/or modify it under the terms of the GNU              *
+  *  Lesser General Public License as published by the           *
+  *  Free Software Foundation; either version 2.1 of the         *
+  *  License, or (at your option) any later version.             *
+  *                                                              *
+  *  This library is distributed in the hope that it will        *
+  *  be useful, but WITHOUT ANY WARRANTY; without even the       *
+  *  implied warranty of MERCHANTABILITY or FITNESS FOR A        *
+  *  PARTICULAR PURPOSE. See the GNU Lesser General Public       *
+  *  License for more details.                                   *
+  *                                                              *
+  *  You should have received a copy of the GNU Lesser           *
+  *  General Public License along with this library;             *
+  *  Inc., 59 Temple Place, Suite 330, Boston,                   *
+  *  MA 02111-1307 USA                                           *
+  *                                                              *
+  ****************************************************************/
+  
+var isIE = navigator.userAgent.toLowerCase().indexOf("msie") > -1; var isMoz = document.implementation && document.implementation.createDocument; var isSafari = ((navigator.userAgent.toLowerCase().indexOf('safari')!=-1)&&(navigator.userAgent.toLowerCase().indexOf('mac')!=-1))?true:false; function curvyCorners()
+{ if(typeof(arguments[0]) != "object") throw newCurvyError("First parameter of curvyCorners() must be an object."); if(typeof(arguments[1]) != "object" && typeof(arguments[1]) != "string") throw newCurvyError("Second parameter of curvyCorners() must be an object or a class name."); if(typeof(arguments[1]) == "string")
+{ var startIndex = 0; var boxCol = getElementsByClass(arguments[1]);}
+else
+{ var startIndex = 1; var boxCol = arguments;}
+var curvyCornersCol = new Array(); if(arguments[0].validTags)
+var validElements = arguments[0].validTags; else
+var validElements = ["div"]; for(var i = startIndex, j = boxCol.length; i < j; i++)
+{ var currentTag = boxCol[i].tagName.toLowerCase(); if(inArray(validElements, currentTag) !== false)
+{ curvyCornersCol[curvyCornersCol.length] = new curvyObject(arguments[0], boxCol[i]);}
+}
+this.objects = curvyCornersCol; this.applyCornersToAll = function()
+{ for(var x = 0, k = this.objects.length; x < k; x++)
+{ this.objects[x].applyCorners();}
+}
+}
+function curvyObject()
+{ this.box = arguments[1]; this.settings = arguments[0]; this.topContainer = null; this.bottomContainer = null; this.masterCorners = new Array(); this.contentDIV = null; var boxHeight = get_style(this.box, "height", "height"); var boxWidth = get_style(this.box, "width", "width"); var borderWidth = get_style(this.box, "borderTopWidth", "border-top-width"); var borderColour = get_style(this.box, "borderTopColor", "border-top-color"); var boxColour = get_style(this.box, "backgroundColor", "background-color"); var backgroundImage = get_style(this.box, "backgroundImage", "background-image"); var boxPosition = get_style(this.box, "position", "position"); var boxPadding = get_style(this.box, "paddingTop", "padding-top"); this.boxHeight = parseInt(((boxHeight != "" && boxHeight != "auto" && boxHeight.indexOf("%") == -1)? boxHeight.substring(0, boxHeight.indexOf("px")) : this.box.scrollHeight)); this.boxWidth = parseInt(((boxWidth != "" && boxWidth != "auto" && boxWidth.indexOf("%") == -1)? boxWidth.substring(0, boxWidth.indexOf("px")) : this.box.scrollWidth)); this.borderWidth = parseInt(((borderWidth != "" && borderWidth.indexOf("px") !== -1)? borderWidth.slice(0, borderWidth.indexOf("px")) : 0)); this.boxColour = format_colour(boxColour); this.boxPadding = parseInt(((boxPadding != "" && boxPadding.indexOf("px") !== -1)? boxPadding.slice(0, boxPadding.indexOf("px")) : 0)); this.borderColour = format_colour(borderColour); this.borderString = this.borderWidth + "px" + " solid " + this.borderColour; this.backgroundImage = ((backgroundImage != "none")? backgroundImage : ""); this.boxContent = this.box.innerHTML; if(boxPosition != "absolute") this.box.style.position = "relative"; this.box.style.padding = "0px"; if(isIE && boxWidth == "auto" && boxHeight == "auto") this.box.style.width = "100%"; if(this.settings.autoPad == true && this.boxPadding > 0)
+this.box.innerHTML = ""; this.applyCorners = function()
+{ for(var t = 0; t < 2; t++)
+{ switch(t)
+{ case 0:
+if(this.settings.tl || this.settings.tr)
+{ var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var topMaxRadius = Math.max(this.settings.tl ? this.settings.tl.radius : 0, this.settings.tr ? this.settings.tr.radius : 0); newMainContainer.style.height = topMaxRadius + "px"; newMainContainer.style.top = 0 - topMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.topContainer = this.box.appendChild(newMainContainer);}
+break; case 1:
+if(this.settings.bl || this.settings.br)
+{ var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var botMaxRadius = Math.max(this.settings.bl ? this.settings.bl.radius : 0, this.settings.br ? this.settings.br.radius : 0); newMainContainer.style.height = botMaxRadius + "px"; newMainContainer.style.bottom = 0 - botMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.bottomContainer = this.box.appendChild(newMainContainer);}
+break;}
+}
+if(this.topContainer) this.box.style.borderTopWidth = "0px"; if(this.bottomContainer) this.box.style.borderBottomWidth = "0px"; var corners = ["tr", "tl", "br", "bl"]; for(var i in corners)
+{ if(i > -1 < 4)
+{ var cc = corners[i]; if(!this.settings[cc])
+{ if(((cc == "tr" || cc == "tl") && this.topContainer != null) || ((cc == "br" || cc == "bl") && this.bottomContainer != null))
+{ var newCorner = document.createElement("DIV"); newCorner.style.position = "relative"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; if(this.backgroundImage == "")
+newCorner.style.backgroundColor = this.boxColour; else
+newCorner.style.backgroundImage = this.backgroundImage; switch(cc)
+{ case "tl":
+newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.tr.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.left = -this.borderWidth + "px"; break; case "tr":
+newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.tl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; newCorner.style.left = this.borderWidth + "px"; break; case "bl":
+newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.br.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = -this.borderWidth + "px"; newCorner.style.backgroundPosition = "-" + (this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break; case "br":
+newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.bl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = this.borderWidth + "px"
+newCorner.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break;}
+}
+}
+else
+{ if(this.masterCorners[this.settings[cc].radius])
+{ var newCorner = this.masterCorners[this.settings[cc].radius].cloneNode(true);}
+else
+{ var newCorner = document.createElement("DIV"); newCorner.style.height = this.settings[cc].radius + "px"; newCorner.style.width = this.settings[cc].radius + "px"; newCorner.style.position = "absolute"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; var borderRadius = parseInt(this.settings[cc].radius - this.borderWidth); for(var intx = 0, j = this.settings[cc].radius; intx < j; intx++)
+{ if((intx +1) >= borderRadius)
+var y1 = -1; else
+var y1 = (Math.floor(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow((intx+1), 2))) - 1); if(borderRadius != j)
+{ if((intx) >= borderRadius)
+var y2 = -1; else
+var y2 = Math.ceil(Math.sqrt(Math.pow(borderRadius,2) - Math.pow(intx, 2))); if((intx+1) >= j)
+var y3 = -1; else
+var y3 = (Math.floor(Math.sqrt(Math.pow(j ,2) - Math.pow((intx+1), 2))) - 1);}
+if((intx) >= j)
+var y4 = -1; else
+var y4 = Math.ceil(Math.sqrt(Math.pow(j ,2) - Math.pow(intx, 2))); if(y1 > -1) this.drawPixel(intx, 0, this.boxColour, 100, (y1+1), newCorner, -1, this.settings[cc].radius); if(borderRadius != j)
+{ for(var inty = (y1 + 1); inty < y2; inty++)
+{ if(this.settings.antiAlias)
+{ if(this.backgroundImage != "")
+{ var borderFract = (pixelFraction(intx, inty, borderRadius) * 100); if(borderFract < 30)
+{ this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, 0, this.settings[cc].radius);}
+else
+{ this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, -1, this.settings[cc].radius);}
+}
+else
+{ var pixelcolour = BlendColour(this.boxColour, this.borderColour, pixelFraction(intx, inty, borderRadius)); this.drawPixel(intx, inty, pixelcolour, 100, 1, newCorner, 0, this.settings[cc].radius, cc);}
+}
+}
+if(this.settings.antiAlias)
+{ if(y3 >= y2)
+{ if (y2 == -1) y2 = 0; this.drawPixel(intx, y2, this.borderColour, 100, (y3 - y2 + 1), newCorner, 0, 0);}
+}
+else
+{ if(y3 >= y1)
+{ this.drawPixel(intx, (y1 + 1), this.borderColour, 100, (y3 - y1), newCorner, 0, 0);}
+}
+var outsideColour = this.borderColour;}
+else
+{ var outsideColour = this.boxColour; var y3 = y1;}
+if(this.settings.antiAlias)
+{ for(var inty = (y3 + 1); inty < y4; inty++)
+{ this.drawPixel(intx, inty, outsideColour, (pixelFraction(intx, inty , j) * 100), 1, newCorner, ((this.borderWidth > 0)? 0 : -1), this.settings[cc].radius);}
+}
+}
+this.masterCorners[this.settings[cc].radius] = newCorner.cloneNode(true);}
+if(cc != "br")
+{ for(var t = 0, k = newCorner.childNodes.length; t < k; t++)
+{ var pixelBar = newCorner.childNodes[t]; var pixelBarTop = parseInt(pixelBar.style.top.substring(0, pixelBar.style.top.indexOf("px"))); var pixelBarLeft = parseInt(pixelBar.style.left.substring(0, pixelBar.style.left.indexOf("px"))); var pixelBarHeight = parseInt(pixelBar.style.height.substring(0, pixelBar.style.height.indexOf("px"))); if(cc == "tl" || cc == "bl"){ pixelBar.style.left = this.settings[cc].radius -pixelBarLeft -1 + "px";}
+if(cc == "tr" || cc == "tl"){ pixelBar.style.top = this.settings[cc].radius -pixelBarHeight -pixelBarTop + "px";}
+switch(cc)
+{ case "tr":
+pixelBar.style.backgroundPosition = "-" + Math.abs((this.boxWidth - this.settings[cc].radius + this.borderWidth) + pixelBarLeft) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "tl":
+pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "bl":
+pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs((this.boxHeight + this.settings[cc].radius + pixelBarTop) -this.borderWidth) + "px"; break;}
+}
+}
+}
+if(newCorner)
+{ switch(cc)
+{ case "tl":
+if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "tr":
+if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "bl":
+if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break; case "br":
+if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break;}
+}
+}
+}
+var radiusDiff = new Array(); radiusDiff["t"] = Math.abs(this.settings.tl.radius - this.settings.tr.radius)
+radiusDiff["b"] = Math.abs(this.settings.bl.radius - this.settings.br.radius); for(z in radiusDiff)
+{ if(z == "t" || z == "b")
+{ if(radiusDiff[z])
+{ var smallerCornerType = ((this.settings[z + "l"].radius < this.settings[z + "r"].radius)? z +"l" : z +"r"); var newFiller = document.createElement("DIV"); newFiller.style.height = radiusDiff[z] + "px"; newFiller.style.width = this.settings[smallerCornerType].radius+ "px"
+newFiller.style.position = "absolute"; newFiller.style.fontSize = "1px"; newFiller.style.overflow = "hidden"; newFiller.style.backgroundColor = this.boxColour; switch(smallerCornerType)
+{ case "tl":
+newFiller.style.bottom = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.topContainer.appendChild(newFiller); break; case "tr":
+newFiller.style.bottom = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.topContainer.appendChild(newFiller); break; case "bl":
+newFiller.style.top = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.bottomContainer.appendChild(newFiller); break; case "br":
+newFiller.style.top = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.bottomContainer.appendChild(newFiller); break;}
+}
+var newFillerBar = document.createElement("DIV"); newFillerBar.style.position = "relative"; newFillerBar.style.fontSize = "1px"; newFillerBar.style.overflow = "hidden"; newFillerBar.style.backgroundColor = this.boxColour; newFillerBar.style.backgroundImage = this.backgroundImage; switch(z)
+{ case "t":
+if(this.topContainer)
+{ if(this.settings.tl.radius && this.settings.tr.radius)
+{ newFillerBar.style.height = topMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.tl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.tr.radius - this.borderWidth + "px"; newFillerBar.style.borderTop = this.borderString; if(this.backgroundImage != "")
+newFillerBar.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; this.topContainer.appendChild(newFillerBar);}
+this.box.style.backgroundPosition = "0px -" + (topMaxRadius - this.borderWidth) + "px";}
+break; case "b":
+if(this.bottomContainer)
+{ if(this.settings.bl.radius && this.settings.br.radius)
+{ newFillerBar.style.height = botMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.bl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.br.radius - this.borderWidth + "px"; newFillerBar.style.borderBottom = this.borderString; if(this.backgroundImage != "")
+newFillerBar.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (topMaxRadius + this.borderWidth)) + "px"; this.bottomContainer.appendChild(newFillerBar);}
+}
+break;}
+}
+}
+if(this.settings.autoPad == true && this.boxPadding > 0)
+{ var contentContainer = document.createElement("DIV"); contentContainer.style.position = "relative"; contentContainer.innerHTML = this.boxContent; contentContainer.className = "autoPadDiv"; var topPadding = Math.abs(topMaxRadius - this.boxPadding); var botPadding = Math.abs(botMaxRadius - this.boxPadding); if(topMaxRadius < this.boxPadding)
+contentContainer.style.paddingTop = topPadding + "px"; if(botMaxRadius < this.boxPadding)
+contentContainer.style.paddingBottom = botMaxRadius + "px"; contentContainer.style.paddingLeft = this.boxPadding + "px"; contentContainer.style.paddingRight = this.boxPadding + "px"; this.contentDIV = this.box.appendChild(contentContainer);}
+}
+this.drawPixel = function(intx, inty, colour, transAmount, height, newCorner, image, cornerRadius)
+{ var pixel = document.createElement("DIV"); pixel.style.height = height + "px"; pixel.style.width = "1px"; pixel.style.position = "absolute"; pixel.style.fontSize = "1px"; pixel.style.overflow = "hidden"; var topMaxRadius = Math.max(this.settings["tr"].radius, this.settings["tl"].radius); if(image == -1 && this.backgroundImage != "")
+{ pixel.style.backgroundImage = this.backgroundImage; pixel.style.backgroundPosition = "-" + (this.boxWidth - (cornerRadius - intx) + this.borderWidth) + "px -" + ((this.boxHeight + topMaxRadius + inty) -this.borderWidth) + "px";}
+else
+{ pixel.style.backgroundColor = colour;}
+if (transAmount != 100)
+setOpacity(pixel, transAmount); pixel.style.top = inty + "px"; pixel.style.left = intx + "px"; newCorner.appendChild(pixel);}
+}
+function insertAfter(parent, node, referenceNode)
+{ parent.insertBefore(node, referenceNode.nextSibling);}
+function BlendColour(Col1, Col2, Col1Fraction)
+{ var red1 = parseInt(Col1.substr(1,2),16); var green1 = parseInt(Col1.substr(3,2),16); var blue1 = parseInt(Col1.substr(5,2),16); var red2 = parseInt(Col2.substr(1,2),16); var green2 = parseInt(Col2.substr(3,2),16); var blue2 = parseInt(Col2.substr(5,2),16); if(Col1Fraction > 1 || Col1Fraction < 0) Col1Fraction = 1; var endRed = Math.round((red1 * Col1Fraction) + (red2 * (1 - Col1Fraction))); if(endRed > 255) endRed = 255; if(endRed < 0) endRed = 0; var endGreen = Math.round((green1 * Col1Fraction) + (green2 * (1 - Col1Fraction))); if(endGreen > 255) endGreen = 255; if(endGreen < 0) endGreen = 0; var endBlue = Math.round((blue1 * Col1Fraction) + (blue2 * (1 - Col1Fraction))); if(endBlue > 255) endBlue = 255; if(endBlue < 0) endBlue = 0; return "#" + IntToHex(endRed)+ IntToHex(endGreen)+ IntToHex(endBlue);}
+function IntToHex(strNum)
+{ base = strNum / 16; rem = strNum % 16; base = base - (rem / 16); baseS = MakeHex(base); remS = MakeHex(rem); return baseS + '' + remS;}
+function MakeHex(x)
+{ if((x >= 0) && (x <= 9))
+{ return x;}
+else
+{ switch(x)
+{ case 10: return "A"; case 11: return "B"; case 12: return "C"; case 13: return "D"; case 14: return "E"; case 15: return "F";}
+}
+}
+function pixelFraction(x, y, r)
+{ var pixelfraction = 0; var xvalues = new Array(1); var yvalues = new Array(1); var point = 0; var whatsides = ""; var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x,2))); if ((intersect >= y) && (intersect < (y+1)))
+{ whatsides = "Left"; xvalues[point] = 0; yvalues[point] = intersect - y; point = point + 1;}
+var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y+1,2))); if ((intersect >= x) && (intersect < (x+1)))
+{ whatsides = whatsides + "Top"; xvalues[point] = intersect - x; yvalues[point] = 1; point = point + 1;}
+var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x+1,2))); if ((intersect >= y) && (intersect < (y+1)))
+{ whatsides = whatsides + "Right"; xvalues[point] = 1; yvalues[point] = intersect - y; point = point + 1;}
+var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y,2))); if ((intersect >= x) && (intersect < (x+1)))
+{ whatsides = whatsides + "Bottom"; xvalues[point] = intersect - x; yvalues[point] = 0;}
+switch (whatsides)
+{ case "LeftRight":
+pixelfraction = Math.min(yvalues[0],yvalues[1]) + ((Math.max(yvalues[0],yvalues[1]) - Math.min(yvalues[0],yvalues[1]))/2); break; case "TopRight":
+pixelfraction = 1-(((1-xvalues[0])*(1-yvalues[1]))/2); break; case "TopBottom":
+pixelfraction = Math.min(xvalues[0],xvalues[1]) + ((Math.max(xvalues[0],xvalues[1]) - Math.min(xvalues[0],xvalues[1]))/2); break; case "LeftBottom":
+pixelfraction = (yvalues[0]*xvalues[1])/2; break; default:
+pixelfraction = 1;}
+return pixelfraction;}
+function rgb2Hex(rgbColour)
+{ try{ var rgbArray = rgb2Array(rgbColour); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); var hexColour = "#" + IntToHex(red) + IntToHex(green) + IntToHex(blue);}
+catch(e){ alert("There was an error converting the RGB value to Hexadecimal in function rgb2Hex");}
+return hexColour;}
+function rgb2Array(rgbColour)
+{ var rgbValues = rgbColour.substring(4, rgbColour.indexOf(")")); var rgbArray = rgbValues.split(", "); return rgbArray;}
+function setOpacity(obj, opacity)
+{ opacity = (opacity == 100)?99.999:opacity; if(isSafari && obj.tagName != "IFRAME")
+{ var rgbArray = rgb2Array(obj.style.backgroundColor); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); obj.style.backgroundColor = "rgba(" + red + ", " + green + ", " + blue + ", " + opacity/100 + ")";}
+else if(typeof(obj.style.opacity) != "undefined")
+{ obj.style.opacity = opacity/100;}
+else if(typeof(obj.style.MozOpacity) != "undefined")
+{ obj.style.MozOpacity = opacity/100;}
+else if(typeof(obj.style.filter) != "undefined")
+{ obj.style.filter = "alpha(opacity:" + opacity + ")";}
+else if(typeof(obj.style.KHTMLOpacity) != "undefined")
+{ obj.style.KHTMLOpacity = opacity/100;}
+}
+function inArray(array, value)
+{ for(var i = 0; i < array.length; i++){ if (array[i] === value) return i;}
+return false;}
+function inArrayKey(array, value)
+{ for(key in array){ if(key === value) return true;}
+return false;}
+function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true;}
+else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r;}
+else { elm['on' + evType] = fn;}
+}
+function removeEvent(obj, evType, fn, useCapture){ if (obj.removeEventListener){ obj.removeEventListener(evType, fn, useCapture); return true;} else if (obj.detachEvent){ var r = obj.detachEvent("on"+evType, fn); return r;} else { alert("Handler could not be removed");}
+}
+function format_colour(colour)
+{ var returnColour = "#ffffff"; if(colour != "" && colour != "transparent")
+{ if(colour.substr(0, 3) == "rgb")
+{ returnColour = rgb2Hex(colour);}
+else if(colour.length == 4)
+{ returnColour = "#" + colour.substring(1, 2) + colour.substring(1, 2) + colour.substring(2, 3) + colour.substring(2, 3) + colour.substring(3, 4) + colour.substring(3, 4);}
+else
+{ returnColour = colour;}
+}
+return returnColour;}
+function get_style(obj, property, propertyNS)
+{ try
+{ if(obj.currentStyle)
+{ var returnVal = eval("obj.currentStyle." + property);}
+else
+{ if(isSafari && obj.style.display == "none")
+{ obj.style.display = ""; var wasHidden = true;}
+var returnVal = document.defaultView.getComputedStyle(obj, '').getPropertyValue(propertyNS); if(isSafari && wasHidden)
+{ obj.style.display = "none";}
+}
+}
+catch(e)
+{ }
+return returnVal;}
+function getElementsByClass(searchClass, node, tag)
+{ var classElements = new Array(); if(node == null)
+node = document; if(tag == null)
+tag = '*'; var els = node.getElementsByTagName(tag); var elsLen = els.length; var pattern = new RegExp("(^|\s)"+searchClass+"(\s|$)"); for (i = 0, j = 0; i < elsLen; i++)
+{ if(pattern.test(els[i].className))
+{ classElements[j] = els[i]; j++;}
+}
+return classElements;}
+function newCurvyError(errorMessage)
+{ return new Error("curvyCorners Error:\n" + errorMessage)
+}
+

--- /dev/null
+++ b/lib/pChart2.1.0/examples/sandbox/index.php
@@ -1,1 +1,707 @@
-
+<?php

+ /*

+     index.php - Sandbox web frontend

+

+     Version     : 1.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 18/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+?>

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

+<head>

+ <title>Sandbox system</title>

+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>

+ <meta name='description' content='pChart is an object oriented php charting library'/>

+ <meta name='keywords' content='pchart, php chart, charting library, php charting'/>

+ <link rel='stylesheet' type='text/css' href='style.css'/>

+ <link rel='shortcut icon' href='images/favicon.ico'/>

+ <script type='text/javascript' src='includes/rounded_corners_lite.inc.js'></script>

+ <script type='text/javascript' src='includes/jscolor.js'></script>

+ <script type='text/javascript' src='includes/functions.js'></script>

+</head>

+<body>

+ <table style=''><tr><td>

+  <table style='padding: 2px; background-color: #E0E0E0; border: 1px solid #D0D0D0;'><tr>

+   <td class='topMenu'>

+    <div class='topMenu' id='menu1' onmouseover='highlightDIV(1);' onmouseout='clearDIV(1);' onclick='toggleDIV(1);'>

+     <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>

+      <td class='topMenu'><img src='graphix/tab.png' width='16' height='16' alt=''/></td>

+      <td class='topMenu'>&nbsp;General settings&nbsp;</td>

+     </tr></table>

+    </div>

+   </td>

+   <td class='topMenu' width='5'></td>

+   <td class='topMenu'>

+    <div class='topMenu' id='menu2' onmouseover='highlightDIV(2);' onmouseout='clearDIV(2);' onclick='toggleDIV(2);'>

+     <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>

+      <td class='topMenu'><img src='graphix/tab.png' width='16' height='16' alt=''/></td>

+      <td class='topMenu'>&nbsp;Data&nbsp;</td>

+     </tr></table>

+    </div>

+   </td>

+   <td class='topMenu' width='5'></td>

+   <td class='topMenu'>

+    <div class='topMenu' id='menu3' onmouseover='highlightDIV(3);' onmouseout='clearDIV(3);' onclick='toggleDIV(3);'>

+     <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>

+      <td class='topMenu'><img src='graphix/tab.png' width='16' height='16' alt=''/></td>

+      <td class='topMenu'>&nbsp;Scale&nbsp;</td>

+     </tr></table>

+    </div>

+   </td>

+   <td class='topMenu' width='5'></td>

+   <td class='topMenu'>

+    <div class='topMenu' id='menu4' onmouseover='highlightDIV(4);' onmouseout='clearDIV(4);' onclick='toggleDIV(4);'>

+     <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>

+      <td class='topMenu'><img src='graphix/tab.png' width='16' height='16' alt=''/></td>

+      <td class='topMenu'>&nbsp;Chart&nbsp;</td>

+     </tr></table>

+    </div>

+   </td>

+   <td class='topMenu' width='5'></td>

+   <td class='topMenu'>

+    <div class='topMenu' id='menu5' onmouseover='highlightDIV(5);' onmouseout='clearDIV(5);' onclick='toggleDIV(5);'>

+     <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>

+      <td class='topMenu'><img src='graphix/tab.png' width='16' height='16' alt=''/></td>

+      <td class='topMenu'>&nbsp;Legend, thresholds &amp; Misc&nbsp;</td>

+     </tr></table>

+    </div>

+   </td>

+  </tr></table>

+ </td>

+ <td width='5'></td>

+ <td>

+  <table style='padding: 2px; background-color: #D0D0D0; border: 1px solid #D0D0D0;'><tr>

+   <td class='topMenu'>

+    <div class='topMenu' id='menu6' onmouseover='highlightDIV(6);' onmouseout='clearDIV(6);' onclick='code();'>

+     <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>

+      <td class='topMenu'><img src='graphix/cog.png' width='16' height='16' alt=''/></td>

+      <td class='topMenu'>&nbsp;Show code&nbsp;</td>

+     </tr></table>

+    </div>

+   </td>

+   <td class='topMenu' width='5'></td>

+   <td class='topMenu'>

+    <div class='topMenu' id='menu7' onmouseover='highlightDIV(7);' onmouseout='clearDIV(7);' onclick='render();'>

+     <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>

+      <td class='topMenu'><img src='graphix/accept.png' width='16' height='16' alt=''/></td>

+      <td class='topMenu'>&nbsp;Render picture&nbsp;</td>

+     </tr></table>

+    </div>

+   </td>

+  </tr></table>

+ </td></tr></table>

+

+ <table><tr><td valign='top'>

+

+ <div class="roundedCorner" id='tab1' style='margin-top: 30px; margin-left: 20px; width: 350px; height: 420px; background: #F0F0F0; padding: 10px; color: #667309; border: 1px solid #E0E0E0'>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/wrench.png' width='16' height='16' alt=''/></td>

+   <td width='300'><b>General settings</b></td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td>Width &nbsp;</td>

+   <td><input type='text' id='g_width' value='700' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' onkeyup='doLayout();' /></td>

+   <td>&nbsp;&nbsp; Height &nbsp;</td>

+   <td><input type='text' id='g_height' value='230' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' onkeyup='doLayout();' /></td>

+   <td>&nbsp;&nbsp;<input type='checkbox' id='g_transparent' /></td>

+   <td>Transparent background</td>

+  </tr></table>

+  <table><tr>

+   <td><input type='checkbox' id='g_aa' checked='checked' /></td>

+   <td>Turn on antialiasing</td>

+   <td>&nbsp;&nbsp;<input type='checkbox' id='g_shadow' checked='checked' /></td>

+   <td>Enable shadow</td>

+   <td>&nbsp;&nbsp; <input type='checkbox' id='g_border' checked='checked' /></td>

+   <td>with a border</td>

+  </tr></table>

+  <table><tr>

+   <td><input type='checkbox' id='g_autopos' checked='checked' onclick='toggleAuto();' /></td>

+   <td>Automatic positioning of the elements</td>

+  </tr></table>

+

+  <br/>

+

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/comment.png' width='16' height='16' alt=''/></td>

+   <td width='240'><b>Chart title</b></td>

+   <td width='20'><input type='checkbox' id='g_title_enabled' checked='checked' /></td>

+   <td width='38'>Enabled</td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='55'>Chart Title</td>

+   <td><input type='text' id='g_title' value='My first pChart project' style='width: 260px;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+  </tr></table>

+  <table><tr>

+   <td width='147'>Alignement method (<a class='smallLinkBlack' target='_new' href='http://wiki.pchart.net/doc.draw.text.html'>help</a>)</td>

+   <td><select id='g_title_align'><?php listalign(); ?></select></td>

+  </tr></table>

+  <table><tr>

+   <td width='55'>X position &nbsp;</td>

+   <td><input type='text' id='g_title_x' value='350' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;&nbsp; Y position &nbsp;</td>

+   <td><input type='text' id='g_title_y' value='25' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;&nbsp; Color &nbsp;</td>

+   <td><input type='text' class='color' id='g_title_color' value='#FFFFFF' style='text-align: center; width: 60px;' onchange='applyColor("g_title_color","g_title_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td><div id='g_title_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>

+  </tr></table>

+  <table><tr>

+   <td width='55'>Font name &nbsp;</td>

+   <td><select id='g_title_font'><?php listfonts(); ?></select></td>

+   <td>&nbsp;&nbsp; Size &nbsp;</td>

+   <td><input type='text' id='g_title_font_size' value='14' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;&nbsp; <input type='checkbox' id='g_title_box' /></td>

+   <td>in a box</td>

+  </tr></table>

+

+  <br/>

+

+  <table style='background-color: #E8E8E8; padding:1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/paintcan.png' width='16' height='16' alt=''/></td>

+   <td width='240'><b>Solid background</b></td>

+   <td width='20'><input type='checkbox' id='g_solid_enabled' checked='checked' /></td>

+   <td width='38'>Enabled</td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='55'>Color</td>

+   <td><input type='text' class='color' id='g_solid_color' value='#AAB757' style='text-align: center; width: 60px;' onchange='applyColor("g_solid_color","g_solid_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td width='40'><div id='g_solid_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>

+   <td width='20'><input type='checkbox' id='g_solid_dashed' checked='checked' /></td>

+   <td width='38'>Dashed</td>

+  </tr></table>

+

+  <br/>

+

+  <table style='background-color: #E8E8E8; padding:1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/paintcan.png' width='16' height='16' alt=''/></td>

+   <td width='240'><b>Gradient background</b></td>

+   <td width='20'><input type='checkbox' id='g_gradient_enabled' checked='checked' /></td>

+   <td width='38'>Enabled</td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='55'>Start color</td>

+   <td><input type='text' class='color' id='g_gradient_start' value='#DBE78B' style='text-align: center; width: 60px;' onchange='applyColor("g_gradient_start","g_gradient_start_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td width='55'><div id='g_gradient_start_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>

+   <td width='54'>End color &nbsp;</td>

+   <td><input type='text' class='color' id='g_gradient_end' value='#018A44' style='text-align: center; width: 60px;' onchange='applyColor("g_gradient_end","g_gradient_end_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td><div id='g_gradient_end_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>

+  </tr></table>

+  <table><tr>

+   <td width='55'>Direction</td>

+   <td width='75'><select id='g_gradient_direction'><option value='vertical'>Vertical</option><option value='horizontal'>Horizontal</option></select></td>

+   <td width='100'>&nbsp; Alpha transparency</td>

+   <td><input type='text' id='g_gradient_alpha' value='50' style='width: 20px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>%</td>

+  </tr></table>

+ </div>

+

+ <div class="roundedCorner" id='tab2' style='display: none; margin-top: 30px; margin-left: 20px; width: 350px; height: 455px; background: #F0F0F0; padding: 10px; color: #667309; border: 1px solid #E0E0E0'>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/database_table.png' width='16' height='16' alt=''/></td>

+   <td width='300'><b>Dataset definition</b></td>

+  </tr></table>

+  <br/>

+  <table>

+   <tr>

+    <td width='46'></td>

+    <td width='65'><center>Serie 1</center></td>

+    <td width='65'><center>Serie 2</center></td>

+    <td width='65'><center>Serie 3</center></td>

+    <td width='65'><center>Absissa</center></td>

+   </tr>

+   <tr>

+    <td>Enabled</td>

+    <td><center><input type='checkbox' id='d_serie1_enabled' checked='checked' onclick='checkEnabledAxis();' /></center></td>

+    <td><center><input type='checkbox' id='d_serie2_enabled' checked='checked' onclick='checkEnabledAxis();' /></center></td>

+    <td><center><input type='checkbox' id='d_serie3_enabled' checked='checked' onclick='checkEnabledAxis();' /></center></td>

+    <td><center><input type='checkbox' id='d_absissa_enabled' checked='checked' /></center></td>

+   </tr>

+  </table>

+  <table>

+   <tr>

+    <td width='46'>Name</td>

+    <td width='65'><center><input type='text' id='d_serie1_name' value='Serie 1' style='width: 50px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+    <td width='65'><center><input type='text' id='d_serie2_name' value='Serie 2' style='width: 50px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+    <td width='65'><center><input type='text' id='d_serie3_name' value='Serie 3' style='width: 50px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+    <td width='65'><center>-</center></td>

+   </tr>

+   <tr>

+    <td width='46'>Binding</td>

+    <td width='65'><center><select id='d_serie1_axis' style='width: 54px;' onchange='checkEnabledAxis();'><?php listaxis(); ?></select></center></td>

+    <td width='65'><center><select id='d_serie2_axis' style='width: 54px;' onchange='checkEnabledAxis();'><?php listaxis(); ?></select></center></td>

+    <td width='65'><center><select id='d_serie3_axis' style='width: 54px;' onchange='checkEnabledAxis();'><?php listaxis(); ?></select></center></td>

+    <td width='65'><center>-</center></td>

+   </tr>

+<?php

+ for($i=0; $i<8;$i++)

+  {

+?>

+   <tr>

+<?php if ( $i == 0 ) { ?>

+    <td>Data</td>

+<?php } else { ?>

+    <td></td>

+<?php } ?>

+    <td><center><input type='text' id='d_serie1_data<?php echo $i; ?>' style='width: 50px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+    <td><center><input type='text' id='d_serie2_data<?php echo $i; ?>' style='width: 50px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+    <td><center><input type='text' id='d_serie3_data<?php echo $i; ?>' style='width: 50px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+    <td><center><input type='text' id='d_absissa_data<?php echo $i; ?>' style='width: 60px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+   </tr>

+<?php

+  }

+?>

+  </table>

+  <table>

+   <tr>

+    <td width='50'></td>

+    <td><input type='checkbox' id='d_normalize_enabled' /></td>

+    <td>normalize the datasets.</td>

+    <td width='10'></td>

+    <td>[ <a class='smallLinkBlack' href='javascript:randomize();'>randomize</a> ]</td>

+   </tr>

+  </table>

+  <br/>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/chart_bar_edit.png' width='16' height='16' alt=''/></td>

+   <td width='300'><b>Axis position and units</b></td>

+  </tr></table>

+  <br/>

+  <table>

+   <tr>

+    <td width='40'></td>

+    <td width='90'><center><b>Axis 0</b></center></td>

+    <td width='90'><center><b>Axis 1</b></center></td>

+    <td width='90'><center><b>Axis 2</b></center></td>

+   </tr>

+   <tr>

+    <td>Name</td>

+    <td><center><input type='text' id='d_axis0_name' value='1st axis' style='width: 76px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+    <td><center><input type='text' id='d_axis1_name' value='2nd axis' style='width: 76px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+    <td><center><input type='text' id='d_axis2_name' value='3rd axis' style='width: 76px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+   </tr>

+   <tr>

+    <td>Unit</td>

+    <td><center><input type='text' id='d_axis0_unit' style='width: 76px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+    <td><center><input type='text' id='d_axis1_unit' style='width: 76px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+    <td><center><input type='text' id='d_axis2_unit' style='width: 76px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>

+   </tr>

+   <tr>

+    <td>Position</td>

+    <td><center><select id='d_axis0_position' style='width: 80px;' onchange='checkEnabledAxis();'><?php listaxispos(); ?></select></center></td>

+    <td><center><select id='d_axis1_position' style='width: 80px;' onchange='checkEnabledAxis();'><?php listaxispos(); ?></select></center></td>

+    <td><center><select id='d_axis2_position' style='width: 80px;' onchange='checkEnabledAxis();'><?php listaxispos(); ?></select></center></td>

+   </tr>

+   <tr>

+    <td>Format</td>

+    <td><center><select id='d_axis0_format' style='width: 80px;' onchange='checkEnabledAxis();'><?php listaxisformat(); ?></select></center></td>

+    <td><center><select id='d_axis1_format' style='width: 80px;' onchange='checkEnabledAxis();'><?php listaxisformat(); ?></select></center></td>

+    <td><center><select id='d_axis2_format' style='width: 80px;' onchange='checkEnabledAxis();'><?php listaxisformat(); ?></select></center></td>

+   </tr>

+  </table>

+ </div>

+

+ <div class="roundedCorner" id='tab3' style='display: none; margin-top: 30px; margin-left: 20px; width: 350px; height: 435px; background: #F0F0F0; padding: 10px; color: #667309; border: 1px solid #E0E0E0'>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/layout_edit.png' width='16' height='16' alt=''/></td>

+   <td width='300'><b>Charting area definition</b></td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='50'>X &nbsp;</td>

+   <td><input type='text' id='s_x' value='70' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;&nbsp; Y &nbsp;</td>

+   <td><input type='text' id='s_y' value='50' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;&nbsp; Width &nbsp;</td>

+   <td><input type='text' id='s_width' value='590' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;&nbsp; Height &nbsp;</td>

+   <td><input type='text' id='s_height' value='140' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+  </tr></table>

+  <table><tr>

+   <td width='50'>Direction</td>

+   <td width='160'><select id='s_direction' onchange='checkEnabledAxis();'><option value='SCALE_POS_LEFTRIGHT'>SCALE_POS_LEFTRIGHT</option><option value='SCALE_POS_TOPBOTTOM'>SCALE_POS_TOPBOTTOM</option></select></td>

+   <td>&nbsp;<input type='checkbox' id='s_arrows_enabled' /></td>

+   <td>&nbsp;with arrows</td>

+  </tr></table>

+  <table><tr>

+   <td width='50'>Mode</td>

+   <td width='160'><select id='s_mode'><option value='SCALE_MODE_FLOATING'>SCALE_MODE_FLOATING</option><option value='SCALE_MODE_START0'>SCALE_MODE_START0</option><option value='SCALE_MODE_ADDALL'>SCALE_MODE_ADDALL</option><option value='SCALE_MODE_ADDALL_START0'>SCALE_MODE_ADDALL_START0</option></select></td>

+   <td>&nbsp;<input type='checkbox' id='s_cycle_enabled' checked='checked' /></td>

+   <td>&nbsp;Background</td>

+  </tr></table>

+  <table><tr>

+   <td width='50'>X Margin</td>

+   <td width='35'><input type='text' id='s_x_margin' value='0' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td width='50'>&nbsp; Y Margin</td>

+   <td width='68'><input type='text' id='s_y_margin' value='0' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;&nbsp;<input type='checkbox' id='s_automargin_enabled' checked='checked' onclick='toggleAutoMargins();' /></td>

+   <td>&nbsp;automatic</td>

+  </tr></table>

+  <table><tr>

+   <td width='50'>Font</td>

+   <td><select id='s_font'><?php listfonts("pf_arma_five"); ?></select></td>

+   <td>&nbsp; Size &nbsp;</td>

+   <td><input type='text' id='s_font_size' value='6' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp; Color &nbsp;</td>

+   <td><input type='text' id='s_font_color' class='color' value='#000000' style='text-align: center; width: 50px;' onchange='applyColor("s_font_color","s_font_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td><div id='s_font_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>

+  </tr></table>

+  <br/>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/page_edit.png' width='16' height='16' alt=''/></td>

+   <td width='300'><b>X Axis configuration</b></td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='50'>Mode</td>

+   <td><select id='s_x_labeling'><option value='LABELING_ALL'>LABELING_ALL</option><option value='LABELING_DIFFERENT'>LABELING_DIFFERENT</option></select></td>

+   <td>&nbsp;&nbsp; Skip each</td>

+   <td>&nbsp;<input type='text' id='s_x_skip' value='0' style='width: 20px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;labels</td>

+  </tr></table>

+  <table><tr>

+   <td width='50'>Rotation</td>

+   <td><input type='text' id='s_x_label_rotation' value='0' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+  </tr></table>

+  <br/>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/page_edit.png' width='16' height='16' alt=''/></td>

+   <td width='300'><b>Grid</b></td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='70'>Grid color</td>

+   <td><input type='text' id='s_grid_color' class='color' value='#FFFFFF' style='text-align: center; width: 60px; text-align: center' onchange='applyColor("s_grid_color","s_grid_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td><div id='s_grid_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>

+   <td>&nbsp; Alpha</td>

+   <td>&nbsp; <input type='text' id='s_grid_alpha' value='50' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+  </tr></table>

+  <table><tr>

+   <td width='70'>Display</td>

+   <td>&nbsp;<input type='checkbox' id='s_grid_x_enabled' checked='checked' /></td>

+   <td>&nbsp;X Lines</td>

+   <td>&nbsp;&nbsp;&nbsp;<input type='checkbox' id='s_grid_y_enabled' checked='checked' /></td>

+   <td>&nbsp;Y Lines</td>

+  </tr></table>

+

+  <br/>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/page_edit.png' width='16' height='16' alt=''/></td>

+   <td width='300'><b>Ticks</b></td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='70'>Ticks color</td>

+   <td><input type='text' id='s_ticks_color' class='color' value='#000000' style='text-align: center; width: 60px; text-align: center' onchange='applyColor("s_ticks_color","s_ticks_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td><div id='s_ticks_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>

+   <td>&nbsp; Alpha</td>

+   <td>&nbsp; <input type='text' id='s_ticks_alpha' value='50' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+  </tr></table>

+  <table><tr>

+   <td width='70'>Sub ticks color</td>

+   <td><input type='text' id='s_subticks_color' class='color' value='#FF0000' style='text-align: center; width: 60px; text-align: center' onchange='applyColor("s_subticks_color","s_subticks_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td><div id='s_subticks_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>

+   <td>&nbsp; Alpha</td>

+   <td>&nbsp; <input type='text' id='s_subticks_alpha' value='50' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;<input type='checkbox' id='s_subticks_enabled' checked='checked' onclick='toggleSubTicks();' /></td>

+   <td>&nbsp;enabled</td>

+  </tr></table>

+ </div>

+

+ <div class="roundedCorner" id='tab4' style='display: none; margin-top: 30px; margin-left: 20px; width: 350px; height: 420px; background: #F0F0F0; padding: 10px; color: #667309; border: 1px solid #E0E0E0'>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/wrench.png' width='16' height='16' alt=''/></td>

+   <td width='300'><b>Chart</b></td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='60'>Chart family</td>

+   <td><select id='c_family' onchange='checkChartSettings();'><?php echo listCharts(); ?></select></td>

+   <td>&nbsp;Break color</td>

+   <td>&nbsp;<input type='text' id='c_break_color' class='color' value='#EA371A' style='text-align: center; width: 60px; text-align: center' onchange='applyColor("c_break_color","c_break_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td><div id='c_break_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>

+  </tr></table>

+  <table><tr>

+   <td width='60'>Settings : </td>

+   <td><input type='checkbox' id='c_display_values' /></td>

+   <td>&nbsp;Display values</td>

+   <td>&nbsp;<input type='checkbox' id='c_break' /></td>

+   <td>&nbsp;Don't break on VOID</td>

+  </tr></table>

+  <div style='background: #D2F5C1; padding: 4px; color: #667309; margin-top: 10px;'>

+   <table><tr>

+    <td width='20'><img src='graphix/comment.png' width='16' height='16' alt=''/></td>

+    <td>Selecting a chart layout will enable/disable chart specifics options.</td>

+   </tr></table>

+  </div>

+  <br/>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/chart_line.png' width='16' height='16' alt=''/></td>

+   <td width='300'><b>Plot specifics</b></td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='60'>Plot size</td>

+   <td><input type='text' id='c_plot_size' value='3' style='width: 20px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td width='60'>&nbsp;&nbsp; Border size</td>

+   <td>&nbsp;<input type='text' id='c_border_size' value='2' style='width: 20px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;<input type='checkbox' id='c_border_enabled' checked='checked' onclick='checkPlotBorder();' /></td>

+   <td>&nbsp;border enabled</td>

+  </tr></table>

+  <br/>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/chart_bar.png' width='16' height='16' alt=''/></td>

+   <td width='300'><b>Bar charts specifics</b></td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td>&nbsp;<input type='radio' id='c_bar_classic' name='c_bar_design' value='0' checked='checked' /></td>

+   <td>&nbsp;Classic</td>

+   <td>&nbsp;<input type='radio' id='c_bar_rounded' name='c_bar_design' value='1' /></td>

+   <td>&nbsp;Rounded</td>

+   <td>&nbsp;<input type='radio' id='c_bar_gradient' name='c_bar_design' value='2' /></td>

+   <td>&nbsp;Gradient filling</td>

+   <td>&nbsp;<input type='checkbox' id='c_around_zero1' checked='checked' /></td>

+   <td>&nbsp;around zero</td>

+  </tr></table>

+  <br/>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/chart_curve.png' width='16' height='16' alt=''/></td>

+   <td width='300'><b>Area charts specifics</b></td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='100'>Forced transparency</td>

+   <td><input type='text' id='c_transparency' value='50' style='width: 20px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;<input type='checkbox' id='c_forced_transparency' checked='checked' onclick='checkAreaChart();' /></td>

+   <td>&nbsp;enabled</td>

+   <td>&nbsp;<input type='checkbox' id='c_around_zero2' checked='checked' /></td>

+   <td>&nbsp;wrapped around zero</td>

+  </tr></table>

+ </div>

+

+ <div class="roundedCorner" id='tab5' style='display: none; margin-top: 30px; margin-left: 20px; width: 350px; height: 420px; background: #F0F0F0; padding: 10px; color: #667309; border: 1px solid #E0E0E0'>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/application_form.png' width='16' height='16' alt=''/></td>

+   <td width='240'><b>Legend</b></td>

+   <td width='20'><input type='checkbox' id='l_enabled' checked='checked' /></td>

+   <td width='38'>Enabled</td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='50'>Font</td>

+   <td><select id='l_font'><?php listfonts("pf_arma_five"); ?></select></td>

+   <td>&nbsp; Size &nbsp;</td>

+   <td><input type='text' id='l_font_size' value='6' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp; Color &nbsp;</td>

+   <td><input type='text' id='l_font_color' class='color' value='#000000' style='text-align: center; width: 50px;' onchange='applyColor("l_font_color","l_font_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td><div id='l_font_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>

+  </tr></table>

+  <table><tr>

+   <td width='50'>Margin</td>

+   <td><input type='text' id='l_margin' value='6' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp; Alpha &nbsp;</td>

+   <td><input type='text' id='l_alpha' value='30' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp; Format</td>

+   <td>&nbsp; <select id='l_format'><?php echo  LegendFormat(); ?></select></td>

+  </tr></table>

+  <table><tr>

+   <td width='50'>Orientation</td>

+   <td>&nbsp; <select id='l_orientation' style='width: 160px;'><option value='LEGEND_VERTICAL'>LEGEND_VERTICAL</option><option value='LEGEND_HORIZONTAL' selected='selected'>LEGEND_HORIZONTAL</option></select></td>

+   <td>&nbsp; Box size &nbsp;</td>

+   <td><input type='text' id='l_box_size' value='5' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+  </tr></table>

+  <table><tr>

+   <td width='50'>Position</td>

+   <td>&nbsp; <select id='l_position' style='width: 160px;' onclick='checkLegend();'><option value='CORNER_TOP_RIGHT'>CORNER_TOP_RIGHT</option><option value='CORNER_BOTTOM_RIGHT'>CORNER_BOTTOM_RIGHT</option><option value='Manual'>Manual</option></select></td>

+   <td>&nbsp; X &nbsp;</td>

+   <td><input type='text' id='l_x' value='10' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp; Y &nbsp;</td>

+   <td><input type='text' id='l_y' value='10' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+  </tr></table>

+  <table><tr>

+   <td width='50'>Layout</td>

+   <td>&nbsp; <select id='l_family' style='width: 160px;'><option value='LEGEND_SERIE_BOX'>LEGEND_SERIE_BOX</option><option value='LEGEND_FAMILY_CIRCLE'>LEGEND_FAMILY_CIRCLE</option><option value='LEGEND_FAMILY_LINE'>LEGEND_FAMILY_LINE</option></select></td>

+  </tr></table>

+  <br/>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/vector.png' width='16' height='16' alt=''/></td>

+   <td width='240'><b>Threshold</b></td>

+   <td width='20'><input type='checkbox' id='t_enabled' /></td>

+   <td width='38'>Enabled</td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='50'>Value</td>

+   <td width='60'><input type='text' id='t_value' value='0' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;<input type='radio' id='t_axis0' name='t_axis' value='0' checked='checked' /></td>

+   <td>&nbsp;Axis 0</td>

+   <td>&nbsp;<input type='radio' id='t_axis1' name='t_axis' value='1' /></td>

+   <td>&nbsp;Axis 1</td>

+   <td>&nbsp;<input type='radio' id='t_axis2' name='t_axis' value='2' /></td>

+   <td>&nbsp;Axis 2</td>

+  </tr></table>

+  <table><tr>

+   <td width='50'>Color</td>

+   <td><input type='text' id='t_color' class='color' value='#000000' style='text-align: center; width: 50px;' onchange='applyColor("t_color","t_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td><div id='t_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>

+   <td>&nbsp; Alpha &nbsp;</td>

+   <td><input type='text' id='t_alpha' value='50' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp;&nbsp; <input type='checkbox' id='t_ticks' checked='checked' /></td>

+   <td>&nbsp; ticks &nbsp;</td>

+  </tr></table>

+  <table><tr>

+   <td width='50'>Caption</td>

+   <td><input type='text' id='t_caption' value='Threshold' style='width: 50px;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>

+   <td>&nbsp; <input type='checkbox' id='t_box' checked='checked' /></td>

+   <td>&nbsp;in a box&nbsp;</td>

+   <td>&nbsp; <input type='checkbox' id='t_caption_enabled' checked='checked' /></td>

+   <td>&nbsp;caption enabled &nbsp;</td>

+  </tr></table>

+  <br/>

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/shape_flip_vertical.png' width='16' height='16' alt=''/></td>

+   <td width='240'><b>Slope chart</b></td>

+   <td width='20'><input type='checkbox' id='sl_enabled' onclick='doLayout();' /></td>

+   <td width='38'>Enabled</td>

+  </tr></table>

+  <table><tr>

+   <td>&nbsp; <input type='checkbox' id='sl_shaded' checked='checked' /></td>

+   <td>&nbsp;Shaded&nbsp;</td>

+   <td>&nbsp; <input type='checkbox' id='sl_caption_enabled' checked='checked' /></td>

+   <td>&nbsp;With caption &nbsp;</td>

+   <td>&nbsp; <input type='checkbox' id='sl_caption_line' checked='checked' /></td>

+   <td>&nbsp;Use line as caption &nbsp;</td>

+  </tr></table>

+  <br/>

+

+  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>

+   <td width='20'><img src='graphix/color_swatch.png' width='16' height='16' alt=''/></td>

+   <td width='300'><b>Palette</b></td>

+  </tr></table>

+  <br/>

+  <table><tr>

+   <td width='50'>Template</td>

+   <td>&nbsp; <select id='p_template'><?php echo listPalettes(); ?></select></td>

+  </tr></table>

+ </div>

+ </td>

+ <td width='20'></td>

+ <td width='730'>

+  <center><div id='result_area' style='font-size: 10px;'></div></center>

+ </td>

+ </tr></table>

+<script type="text/javascript">

+ CurrentDiv = 1;

+ URL        = "";

+ Automatic  = true;

+

+ /* Initial layout */

+ toggleDIV(1);

+ applyCorners();

+ randomize();

+ setDefaultAbsissa();

+ checkEnabledAxis();

+ toggleSubTicks();

+ toggleAutoMargins();

+ checkChartSettings();

+ checkLegend();

+ setColors();

+</script>

+</body>

+</html>

+<?php

+ function listfonts($Default="")

+  {

+   echo "<option value='advent_light.ttf'>advent_light</option>";

+   echo "<option value='Bedizen.ttf'>Bedizen</option>";

+   if ( $Default == "" )

+    { echo "<option value='Forgotte.ttf' selected='selected'>Forgotte</option>"; }

+   else

+    { echo "<option value='Forgotte.ttf'>Forgotte</option>"; }

+   echo "<option value='GeosansLight.ttf'>GeosansLight</option>";

+   if ( $Default == "pf_arma_five" )

+    { echo "<option value='pf_arma_five.ttf' selected='selected'>pf_arma_five</option>"; }

+   else

+    { echo "<option value='pf_arma_five.ttf'>pf_arma_five</option>"; }

+   echo "<option value='Silkscreen.ttf'>Silkscreen</option>";

+  }

+

+ function listaxis()

+  {

+   echo "<option value='0' selected='selected'>Axis 0</option>";

+   echo "<option value='1'>Axis 1</option>";

+   echo "<option value='2'>Axis 2</option>";

+  }

+

+ function listaxispos()

+  {

+   echo "<option value='left' selected='selected'>Left</option>";

+   echo "<option value='right'>Right</option>";

+  }

+

+ function LegendFormat()

+  {

+   echo "<option value='LEGEND_NOBORDER' selected='selected'>LEGEND_NOBORDER</option>";

+   echo "<option value='LEGEND_BOX'>LEGEND_BOX</option>";

+   echo "<option value='LEGEND_ROUND'>LEGEND_ROUND</option>";

+  }

+

+ function listCharts()

+  {

+   echo "<option value='plot'>Plot chart</option>";

+   echo "<option value='line'>Line chart</option>";

+   echo "<option value='spline' selected='selected'>Spline chart</option>";

+   echo "<option value='step'>Step chart</option>";

+   echo "<option value='bar'>Bar chart</option>";

+   echo "<option value='area'>Area chart</option>";

+   echo "<option value='fspline'>Filled spline chart &nbsp;&nbsp;&nbsp;&nbsp;</option>";

+   echo "<option value='fstep'>Filled step chart</option>";

+   echo "<option value='sbar'>Stacked bar chart</option>";

+   echo "<option value='sarea'>Stacked area chart</option>";

+  }

+

+ function listPalettes()

+  {

+   echo "<option value='default'>Default</option>";

+   echo "<option value='autumn'>Autumn</option>";

+   echo "<option value='blind'>Blind</option>";

+   echo "<option value='evening'>Evening</option>";

+   echo "<option value='kitchen'>Kitchen</option>";

+   echo "<option value='light'>Light</option>";

+   echo "<option value='navy'>Navy</option>";

+   echo "<option value='shade'>Shade</option>";

+   echo "<option value='spring'>Spring</option>";

+   echo "<option value='shade'>Shade</option>";

+   echo "<option value='summer'>Summer</option>";

+  }

+

+ function listalign()

+  {

+   echo "<option value='TEXT_ALIGN_TOPLEFT'>TEXT_ALIGN_TOPLEFT</option>";

+   echo "<option value='TEXT_ALIGN_TOPMIDDLE'>TEXT_ALIGN_TOPMIDDLE</option>";

+   echo "<option value='TEXT_ALIGN_TOPRIGHT'>TEXT_ALIGN_TOPRIGHT</option>";

+   echo "<option value='TEXT_ALIGN_MIDDLELEFT'>TEXT_ALIGN_MIDDLELEFT</option>";

+   echo "<option selected='selected' value='TEXT_ALIGN_MIDDLEMIDDLE'>TEXT_ALIGN_MIDDLEMIDDLE</option>";

+   echo "<option value='TEXT_ALIGN_MIDDLERIGHT'>TEXT_ALIGN_MIDDLERIGHT</option>";

+   echo "<option value='TEXT_ALIGN_BOTTOMLEFT'>TEXT_ALIGN_BOTTOMLEFT</option>";

+   echo "<option value='TEXT_ALIGN_BOTTOMMIDDLE'>TEXT_ALIGN_BOTTOMMIDDLE</option>";

+   echo "<option value='TEXT_ALIGN_BOTTOMRIGHT'>TEXT_ALIGN_BOTTOMRIGHT</option>";

+  }

+

+ function listaxisformat()

+  {

+   echo "<option selected='selected' value='AXIS_FORMAT_DEFAULT'>DEFAULT</option>";

+   echo "<option value='AXIS_FORMAT_METRIC'>METRIC</option>";

+   echo "<option value='AXIS_FORMAT_CURRENCY'>CURRENCY</option>";

+  }

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/sandbox/script/render.php
@@ -1,1 +1,891 @@
-
+<?php   

+ /*

+     render.php - Sandbox rendering engine

+

+     Version     : 1.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 18/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ session_start();

+

+ if ( !isset($_GET["Mode"]) ) { $Mode = "Render"; } else { $Mode = $_GET["Mode"]; }

+

+ $Constants = readConstantFile();

+

+ /* -- Retrieve General configuration items -------------------------------- */

+ $g_width		= $_SESSION["g_width"];

+ $g_height		= $_SESSION["g_height"];

+ $g_border		= $_SESSION["g_border"];

+

+ $g_aa			= $_SESSION["g_aa"];

+ $g_shadow		= $_SESSION["g_shadow"];

+ $g_transparent		= $_SESSION["g_transparent"];

+

+ $g_title_enabled	= $_SESSION["g_title_enabled"];

+ $g_title		= $_SESSION["g_title"];

+ $g_title_align		= $_SESSION["g_title_align"];

+ $g_title_x		= $_SESSION["g_title_x"];

+ $g_title_y		= $_SESSION["g_title_y"];

+ $g_title_color		= $_SESSION["g_title_color"];

+ $g_title_font		= $_SESSION["g_title_font"];

+ $g_title_font_size	= $_SESSION["g_title_font_size"];

+ $g_title_box		= $_SESSION["g_title_box"];

+

+ $g_solid_enabled	= $_SESSION["g_solid_enabled"];

+ $g_solid_color		= $_SESSION["g_solid_color"];

+ $g_solid_dashed	= $_SESSION["g_solid_dashed"];

+

+ $g_gradient_enabled	= $_SESSION["g_gradient_enabled"];

+ $g_gradient_start	= $_SESSION["g_gradient_start"];

+ $g_gradient_end	= $_SESSION["g_gradient_end"];

+ $g_gradient_direction	= $_SESSION["g_gradient_direction"];

+ $g_gradient_alpha	= $_SESSION["g_gradient_alpha"];

+ /* ------------------------------------------------------------------------ */

+

+ /* -- Retrieve Data configuration items ----------------------------------- */

+ $d_serie1_enabled	= $_SESSION["d_serie1_enabled"];

+ $d_serie2_enabled	= $_SESSION["d_serie2_enabled"];

+ $d_serie3_enabled	= $_SESSION["d_serie3_enabled"];

+ $d_absissa_enabled	= $_SESSION["d_absissa_enabled"];

+

+ $d_serie1_name		= $_SESSION["d_serie1_name"];

+ $d_serie2_name		= $_SESSION["d_serie2_name"];

+ $d_serie3_name		= $_SESSION["d_serie3_name"];

+

+ $d_serie1_axis		= $_SESSION["d_serie1_axis"];

+ $d_serie2_axis		= $_SESSION["d_serie2_axis"];

+ $d_serie3_axis		= $_SESSION["d_serie3_axis"];

+

+ $data0 		= $_SESSION["data0"];

+ $data1 		= $_SESSION["data1"];

+ $data2 		= $_SESSION["data2"];

+ $absissa 		= $_SESSION["absissa"];

+

+ $d_normalize_enabled	= $_SESSION["d_normalize_enabled"];

+

+ $d_axis0_name		= $_SESSION["d_axis0_name"];

+ $d_axis1_name		= $_SESSION["d_axis1_name"];

+ $d_axis2_name		= $_SESSION["d_axis2_name"];

+

+ $d_axis0_unit		= $_SESSION["d_axis0_unit"];

+ $d_axis1_unit		= $_SESSION["d_axis1_unit"];

+ $d_axis2_unit		= $_SESSION["d_axis2_unit"];

+

+ $d_axis0_position	= $_SESSION["d_axis0_position"];

+ $d_axis1_position	= $_SESSION["d_axis1_position"];

+ $d_axis2_position	= $_SESSION["d_axis2_position"];

+

+ $d_axis0_format	= $_SESSION["d_axis0_format"];

+ $d_axis1_format	= $_SESSION["d_axis1_format"];

+ $d_axis2_format	= $_SESSION["d_axis2_format"];

+

+ /* ------------------------------------------------------------------------ */

+

+ /* -- Retrieve Scale configuration items ---------------------------------- */

+ $s_x			= $_SESSION["s_x"];

+ $s_y			= $_SESSION["s_y"];

+ $s_width		= $_SESSION["s_width"];

+ $s_height		= $_SESSION["s_height"];

+ $s_direction		= $_SESSION["s_direction"];

+ $s_arrows_enabled	= $_SESSION["s_arrows_enabled"];

+ $s_mode		= $_SESSION["s_mode"];

+ $s_cycle_enabled	= $_SESSION["s_cycle_enabled"];

+ $s_x_margin		= $_SESSION["s_x_margin"];

+ $s_y_margin		= $_SESSION["s_y_margin"];

+ $s_automargin_enabled	= $_SESSION["s_automargin_enabled"];

+ $s_font		= $_SESSION["s_font"];

+ $s_font_size		= $_SESSION["s_font_size"];

+ $s_font_color		= $_SESSION["s_font_color"];

+

+ $s_x_labeling		= $_SESSION["s_x_labeling"];

+ $s_x_skip		= $_SESSION["s_x_skip"];

+ $s_x_label_rotation	= $_SESSION["s_x_label_rotation"];

+

+ $s_grid_color		= $_SESSION["s_grid_color"];

+ $s_grid_alpha		= $_SESSION["s_grid_alpha"];

+ $s_grid_x_enabled	= $_SESSION["s_grid_x_enabled"];

+ $s_grid_y_enabled	= $_SESSION["s_grid_y_enabled"];

+

+ $s_ticks_color		= $_SESSION["s_ticks_color"];

+ $s_ticks_alpha		= $_SESSION["s_ticks_alpha"];

+ $s_subticks_color	= $_SESSION["s_subticks_color"];

+ $s_subticks_alpha	= $_SESSION["s_subticks_alpha"];

+ $s_subticks_enabled	= $_SESSION["s_subticks_enabled"];

+ /* ------------------------------------------------------------------------ */

+

+ /* -- Retrieve Chart configuration items ---------------------------------- */

+ $c_family		= $_SESSION["c_family"];

+ $c_display_values	= $_SESSION["c_display_values"];

+ $c_break_color		= $_SESSION["c_break_color"];

+ $c_break		= $_SESSION["c_break"];

+

+ $c_plot_size		= $_SESSION["c_plot_size"];

+ $c_border_size		= $_SESSION["c_border_size"];

+ $c_border_enabled	= $_SESSION["c_border_enabled"];

+

+ $c_bar_classic		= $_SESSION["c_bar_classic"];

+ $c_bar_rounded		= $_SESSION["c_bar_rounded"];

+ $c_bar_gradient	= $_SESSION["c_bar_gradient"];

+ $c_around_zero1	= $_SESSION["c_around_zero1"];

+

+ $c_transparency	= $_SESSION["c_transparency"];

+ $c_forced_transparency	= $_SESSION["c_forced_transparency"];

+ $c_around_zero2	= $_SESSION["c_around_zero2"];

+ /* ------------------------------------------------------------------------ */

+

+ /* -- Retrieve Legend configuration items ---------------------------------- */

+ $l_enabled		= $_SESSION["l_enabled"];

+

+ $l_font		= $_SESSION["l_font"];

+ $l_font_size		= $_SESSION["l_font_size"];

+ $l_font_color		= $_SESSION["l_font_color"];

+

+ $l_margin		= $_SESSION["l_margin"];

+ $l_alpha		= $_SESSION["l_alpha"];

+ $l_format		= $_SESSION["l_format"];

+

+ $l_orientation		= $_SESSION["l_orientation"];

+ $l_box_size		= $_SESSION["l_box_size"];

+

+ $l_position		= $_SESSION["l_position"];

+ $l_x			= $_SESSION["l_x"];

+ $l_y			= $_SESSION["l_y"];

+

+ $l_family		= $_SESSION["l_family"];

+ /* ------------------------------------------------------------------------ */

+

+ /* -- Retrieve Threshold configuration items ------------------------------ */

+ $t_enabled		= $_SESSION["t_enabled"];

+

+ $t_value		= $_SESSION["t_value"];

+ $t_axis		= $_SESSION["t_axis"];

+

+ $t_color		= $_SESSION["t_color"];

+ $t_alpha		= $_SESSION["t_alpha"];

+ $t_ticks		= $_SESSION["t_ticks"];

+

+ $t_caption		= $_SESSION["t_caption"];

+ $t_box			= $_SESSION["t_box"];

+ $t_caption_enabled	= $_SESSION["t_caption_enabled"];

+ /* ------------------------------------------------------------------------ */

+

+ /* -- Retrieve slope chart configuration items ---------------------------- */

+ $sl_enabled		= $_SESSION["sl_enabled"];

+ $sl_shaded		= $_SESSION["sl_shaded"];

+ $sl_caption_enabled	= $_SESSION["sl_caption_enabled"];

+ $sl_caption_line	= $_SESSION["sl_caption_line"];

+ /* ------------------------------------------------------------------------ */

+

+ /* -- Retrieve color configuration items ---------------------------------- */

+ $p_template		= $_SESSION["p_template"];

+ /* ------------------------------------------------------------------------ */

+

+

+ /* pChart library inclusions */

+ include("../../../class/pData.class.php");

+ include("../../../class/pDraw.class.php");

+ include("../../../class/pImage.class.php");

+

+ $myData = new pData();

+ if ( $Mode == "Source" )

+  {

+   echo "&lt;?php\r\n";

+   echo 'include("class/pData.class.php");'."\r\n";

+   echo 'include("class/pDraw.class.php");'."\r\n";

+   echo 'include("class/pImage.class.php");'."\r\n";

+   echo "\r\n";

+   echo '$myData = new pData();'."\r\n";

+  }

+

+ if ( $p_template != "default" )

+  $myData->loadPalette("../../../palettes/".$p_template.".color",TRUE);

+

+ $Axis = "";

+ if ( $d_serie1_enabled == "true" )

+  {

+   $data0  = stripTail($data0);

+   $Values = preg_split("/!/",right($data0,strlen($data0)-1));

+   foreach($Values as $key => $Value)

+    { if ( $Value == "" ) { $Value = VOID; } $myData->addPoints($Value,"Serie1"); }

+

+   $myData->setSerieDescription("Serie1",$d_serie1_name);

+   $myData->setSerieOnAxis("Serie1",$d_serie1_axis);

+   $Axis[$d_serie1_axis] = TRUE;

+

+   if ( $Mode == "Source" )

+    {

+     $Data = "";

+     foreach($Values as $key => $Value)

+      { if ( $Value == "" || $Value == VOID ) { $Value = "VOID"; } $Data = $Data.",".toString($Value); }

+     $Data = right($Data,strlen($Data)-1);

+

+     echo '$myData->addPoints(array('.$Data.'),"Serie1");'."\r\n";

+     echo '$myData->setSerieDescription("Serie1","'.$d_serie1_name.'");'."\r\n";

+     echo '$myData->setSerieOnAxis("Serie1",'.$d_serie1_axis.');'."\r\n\r\n";

+

+     $Axis[$d_serie1_axis] = TRUE;

+    }

+  }

+

+ if ( $d_serie2_enabled == "true" )

+  {

+   $data1  = stripTail($data1);

+   $Values = preg_split("/!/",right($data1,strlen($data1)-1));

+   foreach($Values as $key => $Value)

+    { if ( $Value == "" ) { $Value = VOID; } $myData->addPoints($Value,"Serie2"); }

+

+   $myData->setSerieDescription("Serie2",$d_serie2_name);

+   $myData->setSerieOnAxis("Serie2",$d_serie2_axis);

+   $Axis[$d_serie2_axis] = TRUE;

+

+   if ( $Mode == "Source" )

+    {

+     $Data = "";

+     foreach($Values as $key => $Value)

+      { if ( $Value == "" ) { $Value = "VOID"; } $Data = $Data.",".toString($Value); }

+     $Data = right($Data,strlen($Data)-1);

+

+     echo '$myData->addPoints(array('.$Data.'),"Serie2");'."\r\n";

+     echo '$myData->setSerieDescription("Serie2","'.$d_serie2_name.'");'."\r\n";

+     echo '$myData->setSerieOnAxis("Serie2",'.$d_serie2_axis.');'."\r\n\r\n";

+

+     $Axis[$d_serie2_axis] = TRUE;

+    }

+  }

+

+ if ( $d_serie3_enabled == "true" )

+  {

+   $data2  = stripTail($data2);

+   $Values = preg_split("/!/",right($data2,strlen($data2)-1));

+   foreach($Values as $key => $Value)

+    { if ( $Value == "" ) { $Value = VOID; } $myData->addPoints($Value,"Serie3"); }

+

+   $myData->setSerieDescription("Serie3",$d_serie3_name);

+   $myData->setSerieOnAxis("Serie3",$d_serie3_axis);

+   $Axis[$d_serie3_axis] = TRUE;

+

+   if ( $Mode == "Source" )

+    {

+     $Data = "";

+     foreach($Values as $key => $Value)

+      { if ( $Value == "" ) { $Value = "VOID"; } $Data = $Data.",".toString($Value); }

+     $Data = right($Data,strlen($Data)-1);

+

+     echo '$myData->addPoints(array('.$Data.'),"Serie3");'."\r\n";

+     echo '$myData->setSerieDescription("Serie3","'.$d_serie3_name.'");'."\r\n";

+     echo '$myData->setSerieOnAxis("Serie3",'.$d_serie3_axis.');'."\r\n\r\n";

+

+     $Axis[$d_serie3_axis] = TRUE;

+    }

+  }

+

+ if ( $d_absissa_enabled == "true" )

+  {

+   $absissa = stripTail($absissa);

+   $Values  = preg_split("/!/",right($absissa,strlen($absissa)-1));

+   foreach($Values as $key => $Value)

+    { if ( $Value == "" ) { $Value = VOID; } $myData->addPoints($Value,"Absissa"); }

+

+   $myData->setAbscissa("Absissa");

+

+   if ( $Mode == "Source" )

+    {

+     $Data = "";

+     foreach($Values as $key => $Value)

+      { if ( $Value == "" ) { $Value = "VOID"; } $Data = $Data.",".toString($Value); }

+     $Data = right($Data,strlen($Data)-1);

+

+     echo '$myData->addPoints(array('.$Data.'),"Absissa");'."\r\n";

+     echo '$myData->setAbscissa("Absissa");'."\r\n\r\n";

+    }

+  }

+

+ if ( isset($Axis[0]) )

+  {

+   if ( $d_axis0_position == "left" ) { $myData->setAxisPosition(0,AXIS_POSITION_LEFT); } else { $myData->setAxisPosition(0,AXIS_POSITION_RIGHT); }

+   $myData->setAxisName(0,$d_axis0_name);

+   $myData->setAxisUnit(0,$d_axis0_unit);

+

+   if ( $d_axis0_format == "AXIS_FORMAT_METRIC" )	{ $myData->setAxisDisplay(0,680004); }

+   if ( $d_axis0_format == "AXIS_FORMAT_CURRENCY" )	{ $myData->setAxisDisplay(0,680005,"$"); }

+

+   if ( $Mode == "Source" )

+    {

+     if ( $d_axis0_position == "left" ) { echo '$myData->setAxisPosition(0,AXIS_POSITION_LEFT);'."\r\n"; } else { echo '$myData->setAxisPosition(0,AXIS_POSITION_RIGHT);'."\r\n"; }

+     echo '$myData->setAxisName(0,"'.$d_axis0_name.'");'."\r\n";

+     echo '$myData->setAxisUnit(0,"'.$d_axis0_unit.'");'."\r\n\r\n";

+    }

+  }

+

+ if ( isset($Axis[1]) )

+  {

+   if ( $d_axis1_position == "left" ) { $myData->setAxisPosition(1,AXIS_POSITION_LEFT); } else { $myData->setAxisPosition(1,AXIS_POSITION_RIGHT); }

+   $myData->setAxisName(1,$d_axis1_name);

+   $myData->setAxisUnit(1,$d_axis1_unit);

+

+   if ( $Mode == "Source" )

+    {

+     if ( $d_axis1_position == "left" ) { echo '$myData->setAxisPosition(1,AXIS_POSITION_LEFT);'."\r\n"; } else { echo '$myData->setAxisPosition(1,AXIS_POSITION_RIGHT);'."\r\n"; }

+     echo '$myData->setAxisName(1,"'.$d_axis1_name.'");'."\r\n";

+     echo '$myData->setAxisUnit(1,"'.$d_axis1_unit.'");'."\r\n\r\n";

+    }

+  }

+

+ if ( isset($Axis[2]) )

+  {

+   if ( $d_axis2_position == "left" ) { $myData->setAxisPosition(2,AXIS_POSITION_LEFT); } else { $myData->setAxisPosition(2,AXIS_POSITION_RIGHT); }

+   $myData->setAxisName(2,$d_axis2_name);

+   $myData->setAxisUnit(2,$d_axis2_unit);

+

+   if ( $Mode == "Source" )

+    {

+     if ( $d_axis2_position == "left" ) { echo '$myData->setAxisPosition(2,AXIS_POSITION_LEFT);'."\r\n"; } else { echo '$myData->setAxisPosition(2,AXIS_POSITION_RIGHT);'."\r\n"; }

+     echo '$myData->setAxisName(2,"'.$d_axis2_name.'");'."\r\n";

+     echo '$myData->setAxisUnit(2,"'.$d_axis2_unit.'");'."\r\n\r\n";

+    }

+  }

+

+ if ( $d_normalize_enabled == "true" )

+  {

+   if ( $Mode == "Render" )

+    $myData->normalize(100);

+   else

+    echo '$myData->normalize(100);'."\r\n";

+  }

+

+ if ( $Mode == "Render" )

+  {

+   if ( $g_transparent == "true" )

+    $myPicture = new pImage($g_width,$g_height,$myData,TRUE);

+   else

+    $myPicture = new pImage($g_width,$g_height,$myData);

+  }

+ else

+  {

+   $myPicture = new pImage($g_width,$g_height,$myData);

+   if ( $g_transparent == "true" )

+    echo '$myPicture = new pImage('.$g_width.','.$g_height.',$myData,TRUE);'."\r\n";

+   else

+    echo '$myPicture = new pImage('.$g_width.','.$g_height.',$myData);'."\r\n";

+  }

+

+ if ( $g_aa == "false" )

+  {

+   if ( $Mode == "Render" )

+    $myPicture->Antialias = FALSE;

+   else

+    echo '$myPicture->Antialias = FALSE;'."\r\n";

+  }

+

+ if ( $g_solid_enabled == "true" )

+  {

+   list($R,$G,$B) = extractColors($g_solid_color);

+   $Settings = array("R"=>$R,"G"=>$G,"B"=>$B);

+

+   if ( $g_solid_dashed == "true" ) { $Settings["Dash"] = TRUE; $Settings["DashR"]=$R+20; $Settings["DashG"]=$G+20; $Settings["DashB"]=$B+20; }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawFilledRectangle(0,0,$g_width,$g_height,$Settings);

+   else

+    {

+     echo dumpArray("Settings",$Settings);

+     echo '$myPicture->drawFilledRectangle(0,0,'.$g_width.','.$g_height.',$Settings);'."\r\n\r\n";

+    }

+  }

+

+ if ( $g_gradient_enabled == "true" )

+  {

+   list($StartR,$StartG,$StartB) = extractColors($g_gradient_start);

+   list($EndR,$EndG,$EndB)       = extractColors($g_gradient_end);

+

+   $Settings = array("StartR"=>$StartR,"StartG"=>$StartG,"StartB"=>$StartB,"EndR"=>$EndR,"EndG"=>$EndG,"EndB"=>$EndB,"Alpha"=>$g_gradient_alpha);

+

+   if ( $Mode == "Render" )

+    {

+     if ( $g_gradient_direction == "vertical" )

+      $myPicture->drawGradientArea(0,0,$g_width,$g_height,DIRECTION_VERTICAL,$Settings);

+     else

+      $myPicture->drawGradientArea(0,0,$g_width,$g_height,DIRECTION_HORIZONTAL,$Settings);

+    }

+   else

+    {

+     echo dumpArray("Settings",$Settings);

+

+     if ( $g_gradient_direction == "vertical" )

+      echo '$myPicture->drawGradientArea(0,0,'.$g_width.','.$g_height.',DIRECTION_VERTICAL,$Settings);'."\r\n\r\n";

+     else

+      echo '$myPicture->drawGradientArea(0,0,'.$g_width.','.$g_height.',DIRECTION_HORIZONTAL,$Settings);'."\r\n\r\n";

+    }

+  }

+

+ if ( $Mode == "Render" )

+  {

+   if ( $g_border == "true" ) { $myPicture->drawRectangle(0,0,$g_width-1,$g_height-1,array("R"=>0,"G"=>0,"B"=>0)); }

+   if ( $g_shadow == "true" ) { $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>50,"G"=>50,"B"=>50,"Alpha"=>20)); }

+  }

+ else

+  {

+   if ( $g_border == "true" ) { echo '$myPicture->drawRectangle(0,0,'.($g_width-1).','.($g_height-1).',array("R"=>0,"G"=>0,"B"=>0));'."\r\n\r\n"; }

+   if ( $g_shadow == "true" ) { echo '$myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>50,"G"=>50,"B"=>50,"Alpha"=>20));'."\r\n\r\n"; }

+  }

+

+ if ( $g_title_enabled == "true" )

+  {

+   if ( $Mode == "Render" )

+    $myPicture->setFontProperties(array("FontName"=>"../../../fonts/".$g_title_font,"FontSize"=>$g_title_font_size));

+   else

+    echo '$myPicture->setFontProperties(array("FontName"=>"fonts/'.$g_title_font.'","FontSize"=>'.$g_title_font_size.'));'."\r\n";

+

+   list($R,$G,$B) = extractColors($g_title_color);

+

+   $TextSettings = array("Align"=>getTextAlignCode($g_title_align),"R"=>$R,"G"=>$G,"B"=>$B);

+   if ( $g_title_box == "true" ) { $TextSettings["DrawBox"] = TRUE; $TextSettings["BoxAlpha"] = 30; }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawText($g_title_x,$g_title_y,$g_title,$TextSettings);

+   else

+    {

+     echo dumpArray("TextSettings",$TextSettings);

+     echo '$myPicture->drawText('.$g_title_x.','.$g_title_y.',"'.$g_title.'",$TextSettings);'."\r\n\r\n";

+    }

+  }

+

+ /* Scale section */

+ if ( $Mode == "Render" )

+  { if ( $g_shadow == "true" ) { $myPicture->setShadow(FALSE); } }

+ else

+  { if ( $g_shadow == "true" ) { echo '$myPicture->setShadow(FALSE);'."\r\n"; } }

+

+ if ( $Mode == "Render" )

+  $myPicture->setGraphArea($s_x,$s_y,$s_x+$s_width,$s_y+$s_height);

+ else

+  echo '$myPicture->setGraphArea('.$s_x.','.$s_y.','.($s_x+$s_width).','.($s_y+$s_height).');'."\r\n";

+

+ list($R,$G,$B) = extractColors($s_font_color);

+ if ( $Mode == "Render" )

+  $myPicture->setFontProperties(array("R"=>$R,"G"=>$G,"B"=>$B,"FontName"=>"../../../fonts/".$s_font,"FontSize"=>$s_font_size));

+ else

+  echo '$myPicture->setFontProperties(array("R"=>'.$R.',"G"=>'.$G.',"B"=>'.$B.',"FontName"=>"fonts/'.$s_font.'","FontSize"=>'.$s_font_size.'));'."\r\n\r\n";

+

+ /* Scale specific parameters -------------------------------------------------------------------------------- */

+ list($GridR,$GridG,$GridB) = extractColors($s_grid_color);

+ list($TickR,$TickG,$TickB) = extractColors($s_ticks_color);

+ list($SubTickR,$SubTickG,$SubTickB) = extractColors($s_subticks_color);

+

+ if ( $s_direction == "SCALE_POS_LEFTRIGHT" ) { $Pos = 690101; } else { $Pos = 690102; }

+ if ( $s_x_labeling == "LABELING_ALL") { $Labeling = 691011; } else { $Labeling = 691012; }

+ if ( $s_mode == "SCALE_MODE_FLOATING" ) { $iMode = 690201; }

+ if ( $s_mode == "SCALE_MODE_START0" ) { $iMode = 690202; }

+ if ( $s_mode == "SCALE_MODE_ADDALL" ) { $iMode = 690203; }

+ if ( $s_mode == "SCALE_MODE_ADDALL_START0" ) { $iMode = 690204; }

+

+ $Settings = array("Pos"=>$Pos,"Mode"=>$iMode,"LabelingMethod"=>$Labeling,"GridR"=>$GridR,"GridG"=>$GridG,"GridB"=>$GridB,"GridAlpha"=>$s_grid_alpha,"TickR"=>$TickR,"TickG"=>$TickG,"TickB"=>$TickB,"TickAlpha"=>$s_ticks_alpha,"LabelRotation"=>$s_x_label_rotation);

+

+ if ( $s_x_skip	!= 0 ) { $Settings["LabelSkip"] = $s_x_skip; }

+ if ( $s_cycle_enabled == "true" ) { $Settings["CycleBackground"] = TRUE; }

+ if ( $s_arrows_enabled == "true" ) { $Settings["DrawArrows"] = TRUE; }

+ if ( $s_grid_x_enabled == "true" ) { $Settings["DrawXLines"] = TRUE; } else { $Settings["DrawXLines"] = 0; }

+ if ( $s_subticks_enabled == "true" )

+  { $Settings["DrawSubTicks"] = TRUE; $Settings["SubTickR"] = $SubTickR; $Settings["SubTickG"] = $SubTickG; $Settings["SubTickB"] = $SubTickB; $Settings["SubTickAlpha"] = $s_subticks_alpha;}

+ if ( $s_automargin_enabled == "false" ) 

+  { $Settings["XMargin"] = $s_x_margin; $Settings["YMargin"] = $s_y_margin; }

+

+ if ( $Mode == "Render" )

+  {

+   if ( $s_grid_y_enabled == "true" ) { $Settings["DrawYLines"] = ALL; } else { $Settings["DrawYLines"] = NONE; }

+   $myPicture->drawScale($Settings);

+  }

+ else

+  {

+   if ( $s_grid_y_enabled == "true" ) { $Settings["DrawYLines"] = "ALL"; } else { $Settings["DrawYLines"] = "NONE"; }

+   echo dumpArray("Settings",$Settings);

+   echo '$myPicture->drawScale($Settings);'."\r\n\r\n";

+  }

+ /* ---------------------------------------------------------------------------------------------------------- */

+

+ if ( $Mode == "Render" )

+  { if ( $g_shadow == "true" ) { $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>50,"G"=>50,"B"=>50,"Alpha"=>10)); } }

+ else

+  { if ( $g_shadow == "true" ) { echo '$myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>50,"G"=>50,"B"=>50,"Alpha"=>10));'."\r\n\r\n"; } }

+

+ /* Chart specific parameters -------------------------------------------------------------------------------- */

+ if ( $c_display_values == "true" ) { $Config = array("DisplayValues"=>TRUE); } else { $Config = ""; }

+

+ if ( $c_family == "plot" )

+  {

+   $Config["PlotSize"] = $c_plot_size;

+   if ( $c_border_enabled == "true" ) { $Config["PlotBorder"] = TRUE; $Config["BorderSize"] = $c_border_size; }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawPlotChart($Config);

+   else

+    {

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawPlotChart($Config);'."\r\n";

+    }

+  }

+

+ if ( $c_family == "line" )

+  {

+   if ( $c_break == "true" )

+    {

+     list($BreakR,$BreakG,$BreakB) = extractColors($c_break_color);

+

+     $Config["BreakVoid"] = 0;

+     $Config["BreakR"] = $BreakR;

+     $Config["BreakG"] = $BreakG;

+     $Config["BreakB"] = $BreakB;

+    }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawLineChart($Config);

+   else

+    {

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawLineChart($Config);'."\r\n";

+    }

+  }

+

+ if ( $c_family == "step" )

+  {

+   if ( $c_break == "true" )

+    {

+     list($BreakR,$BreakG,$BreakB) = extractColors($c_break_color);

+

+     $Config["BreakVoid"] = 0;

+     $Config["BreakR"] = $BreakR;

+     $Config["BreakG"] = $BreakG;

+     $Config["BreakB"] = $BreakB;

+    }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawStepChart($Config);

+   else

+    {

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawStepChart($Config);'."\r\n";

+    }

+  }

+

+ if ( $c_family == "spline" )

+  {

+   if ( $c_break == "true" )

+    {

+     list($BreakR,$BreakG,$BreakB) = extractColors($c_break_color);

+

+     $Config["BreakVoid"] = 0;

+     $Config["BreakR"] = $BreakR;

+     $Config["BreakG"] = $BreakG;

+     $Config["BreakB"] = $BreakB;

+    }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawSplineChart($Config);

+   else

+    {

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawSplineChart($Config);'."\r\n";

+    }

+  }

+

+ if ( $c_family == "bar" )

+  {

+   if ( $c_bar_rounded == "true" )  { $Config["Rounded"] = TRUE; }

+   if ( $c_bar_gradient == "true" ) { $Config["Gradient"] = TRUE; }

+   if ( $c_around_zero1 == "true" ) { $Config["AroundZero"] = TRUE; }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawBarChart($Config);

+   else

+    {

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawBarChart($Config);'."\r\n";

+    }

+  }

+

+ if ( $c_family == "area" )

+  {

+   if ( $c_forced_transparency == "true" ) { $Config["ForceTransparency"] = $c_transparency; }

+   if ( $c_around_zero2 == "true" ) { $Config["AroundZero"] = TRUE; }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawAreaChart($Config);

+   else

+    {

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawAreaChart($Config);'."\r\n";

+    }

+  }

+

+ if ( $c_family == "fstep" )

+  {

+   if ( $c_forced_transparency == "true" ) { $Config["ForceTransparency"] = $c_transparency; }

+   if ( $c_around_zero2 == "true" ) { $Config["AroundZero"] = TRUE; } else { $Config["AroundZero"] = FALSE; }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawFilledStepChart($Config);

+   else

+    {

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawFilledStepChart($Config);'."\r\n";

+    }

+  }

+

+ if ( $c_family == "fspline" )

+  {

+   if ( $c_forced_transparency == "true" ) { $Config["ForceTransparency"] = $c_transparency; }

+   if ( $c_around_zero2 == "true" ) { $Config["AroundZero"] = TRUE; }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawFilledSplineChart($Config);

+   else

+    {

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawFilledSplineChart($Config);'."\r\n";

+    }

+  }

+

+ if ( $c_family == "sbar" )

+  {

+   if ( $c_bar_rounded == "true" )  { $Config["Rounded"] = TRUE; }

+   if ( $c_bar_gradient == "true" ) { $Config["Gradient"] = TRUE; }

+   if ( $c_around_zero1 == "true" ) { $Config["AroundZero"] = TRUE; }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawStackedBarChart($Config);

+   else

+    {

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawStackedBarChart($Config);'."\r\n";

+    }

+  }

+

+ if ( $c_family == "sarea" )

+  {

+   if ( $c_forced_transparency == "true" ) { $Config["ForceTransparency"] = $c_transparency; }

+   if ( $c_around_zero2 == "true" )        { $Config["AroundZero"] = TRUE; }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawStackedAreaChart($Config);

+   else

+    {

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawStackedAreaChart($Config);'."\r\n";

+    }

+  }

+

+ if ( $t_enabled == "true" )

+  {

+   list($R,$G,$B) = extractColors($t_color);

+

+   $Config = "";

+   $Config["R"] = $R; $Config["G"] = $G; $Config["B"] = $B;

+   $Config["Alpha"] = $t_alpha;

+  

+   if ( isset($myData->Data["Axis"][$t_axis]) ) { $Config["AxisID"] = $t_axis; }

+

+   if ( $t_ticks == "true" ) { $Config["Ticks"] = 4; } else { $Config["Ticks"] = 0; }

+

+   if ( $t_caption_enabled == "true" )

+    {

+     $Config["WriteCaption"] = TRUE;

+     $Config["Caption"] = $t_caption;

+     if ( $t_box == "true" ) { $Config["DrawBox"] = TRUE; }

+    }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawThreshold($t_value,$Config);

+   else

+    {

+     $Config["Caption"] = chr(34).$t_caption.chr(34);

+

+     echo "\r\n";

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawThreshold('.$t_value.',$Config);'."\r\n";

+    }

+  }

+

+ if ( $l_enabled == "true" )

+  {

+   list($R,$G,$B) = extractColors($l_font_color);

+

+   $Config = "";

+   $Config["FontR"]    = $R; $Config["FontG"] = $G; $Config["FontB"] = $B;

+   $Config["FontName"] = "../../../fonts/".$l_font;

+   $Config["FontSize"] = $l_font_size;

+   $Config["Margin"]   = $l_margin;

+   $Config["Alpha"]    = $l_alpha;

+   $Config["BoxSize"]  = $l_box_size;

+

+   if ( $l_format == "LEGEND_NOBORDER" ) { $Config["Style"] = 690800; }

+   if ( $l_format == "LEGEND_BOX" )      { $Config["Style"] = 690801; }

+   if ( $l_format == "LEGEND_ROUND" )    { $Config["Style"] = 690802; }

+

+   if ( $l_orientation == "LEGEND_VERTICAL" )   { $Config["Mode"] = 690901; }

+   if ( $l_orientation == "LEGEND_HORIZONTAL" ) { $Config["Mode"] = 690902; }

+

+   if ( $l_family == "LEGEND_FAMILY_CIRCLE" ) { $Config["Family"] = 691052; }

+   if ( $l_family == "LEGEND_FAMILY_LINE" ) { $Config["Family"] = 691053; }

+

+   $Size = $myPicture->getLegendSize($Config);

+   if ( $l_position == "CORNER_TOP_RIGHT" )

+    { $l_y = $l_margin + 10; $l_x = $g_width - $Size["Width"] - 10 + $l_margin; }

+   if ( $l_position == "CORNER_BOTTOM_RIGHT" )

+    { $l_y = $g_height - $Size["Height"] - 10 + $l_margin; $l_x = $g_width - $Size["Width"] - 10 + $l_margin; }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawLegend($l_x,$l_y,$Config);

+   else

+    {

+     $Config["FontName"] = chr(34)."fonts/".$l_font.chr(34);

+

+     echo "\r\n";

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawLegend('.$l_x.','.$l_y.',$Config);'."\r\n";

+    }

+  }

+

+ if ( $sl_enabled == "true" )

+  {

+   $Config = "";

+   $Config["CaptionMargin"] = 10;

+   $Config["CaptionWidth"]  = 10;

+

+   if ( $sl_shaded == "true" ) { $Config["ShadedSlopeBox"] = TRUE; }

+   if ( $sl_caption_enabled != "true" ) { $Config["Caption"] = FALSE; }

+   if ( $sl_caption_line == "true" ) { $Config["CaptionLine"] =TRUE; }

+

+   if ( $Mode == "Render" )

+    $myPicture->drawDerivative($Config);

+   else

+    {

+     echo "\r\n";

+     echo dumpArray("Config",$Config);

+     echo '$myPicture->drawDerivative($Config);'."\r\n";

+    }

+  }

+

+ if ( $Mode == "Render" )

+  $myPicture->stroke();

+ else

+  echo "\r\n".'$myPicture->stroke();'."\r\n?>";

+

+ function extractColors($Hexa)

+  {

+   if ( strlen($Hexa) != 6 ) { return(array(0,0,0)); }

+

+   $R = hexdec(left($Hexa,2));

+   $G = hexdec(mid($Hexa,3,2));

+   $B = hexdec(right($Hexa,2));

+

+   return(array($R,$G,$B));

+  }

+

+ function getTextAlignCode($Mode)

+  {

+   if ( $Mode == "TEXT_ALIGN_TOPLEFT" )      { return(690401); }

+   if ( $Mode == "TEXT_ALIGN_TOPMIDDLE" )    { return(690402); }

+   if ( $Mode == "TEXT_ALIGN_TOPRIGHT" )     { return(690403); }

+   if ( $Mode == "TEXT_ALIGN_MIDDLELEFT" )   { return(690404); }

+   if ( $Mode == "TEXT_ALIGN_MIDDLEMIDDLE" ) { return(690405); }

+   if ( $Mode == "TEXT_ALIGN_MIDDLERIGHT" )  { return(690406); }

+   if ( $Mode == "TEXT_ALIGN_BOTTOMLEFT" )   { return(690407); }

+   if ( $Mode == "TEXT_ALIGN_BOTTOMMIDDLE" ) { return(690408); }

+   if ( $Mode == "TEXT_ALIGN_BOTTOMRIGHT" )  { return(690409); }

+  }

+

+ function dumpArray($Name,$Values)

+  {

+   if ( $Values == "" ) { return('$'.$Name.' = "";'."\r\n"); }

+

+   $Result = '$'.$Name." = array(";

+   foreach ($Values as $Key => $Value)

+    { $Result = $Result.chr(34).$Key.chr(34)."=>".translate($Value).", "; }

+

+   $Result = left($Result,strlen($Result)-2).");\r\n";

+

+   return($Result);

+  }

+

+ function translate($Value)

+  {

+   global $Constants;

+

+   if ( isset($Constants[$Value]))

+    return($Constants[$Value]);

+   else

+    return($Value);

+  }

+

+

+ function stripTail($Values)

+  {

+   $Values = preg_split("/!/",right($Values,strlen($Values)-1));

+

+   $Temp = ""; $Result = "";

+   foreach($Values as $Key => $Value)

+    {

+     if ( $Value == "" )

+      { $Temp[] = VOID; }

+     else

+      {

+       if ( $Temp != "" && $Result != "" )

+        { $Result = array_merge($Result,$Temp); }

+       elseif( $Temp != "" && $Result == "" )

+        { $Result = $Temp; }

+

+       $Result[] = $Value;

+       $Temp = "";

+      }

+    }

+

+   $Serialized = "!"; foreach($Result as $Key => $Value) { $Serialized = $Serialized.$Value."!"; }

+   $Serialized = left($Serialized,strlen($Serialized)-1);

+

+   return($Serialized);

+  }

+

+ function readConstantFile()

+  {

+   $FileName = "../includes/constants.txt";

+

+   $handle = @fopen($FileName, "r");

+   if ($handle)

+    {

+     $Result = "";

+     while (($buffer = fgets($handle, 4096)) !== false)

+      {

+       $Values = preg_split("/,/",$buffer);

+       $Result[$Values[0]] = $Values[1];

+      }

+     fclose($handle);

+     return($Result);

+    }

+   else

+    { return(array("VOID"=>"0.12345")); }

+  }

+

+ function toString($Value)

+  {

+   if ( is_numeric($Value) || $Value == "VOID")

+    return($Value);

+   else

+    return(chr(34).$Value.chr(34));

+  }

+

+ function left($value,$NbChar)  

+  { return substr($value,0,$NbChar); }  

+ 

+ function right($value,$NbChar)  

+  { return substr($value,strlen($value)-$NbChar,$NbChar); }  

+ 

+ function mid($value,$Depart,$NbChar)  

+  { return substr($value,$Depart-1,$NbChar); }  

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/sandbox/script/session.php
@@ -1,1 +1,24 @@
-
+<?php

+ /*

+     session.php - Sandbox sesson manager

+

+     Version     : 1.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 18/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ session_start();

+

+ foreach($_GET as $Key => $Value)

+  { $_SESSION[$Key] = $Value; }

+

+ print_r($_SESSION);

+

+ usleep(200000);

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/examples/sandbox/style.css
@@ -1,1 +1,90 @@
+body

+ {

+  margin: 4px;

+  text-align: left;

+  font-family: tahoma;

+  background-color: #FFFFFF;

+  background-image: url('graphix/background.console.png');

+ }

+

+table { margin: 0px; padding: 0px;}

+

+td { margin: 0px; padding: 0px; }

+

+tr { margin: 0px; padding: 0px; }

+

+td.topMenu   { font-family: tahoma; font-size: 11px; }

+

+div.roundedCorner { font-size: 10px; }

+

+div.topMenu { border: 1px solid #FEFEFE; background-color: #EAEAEA; cursor: hand; cursor: pointer; }

+

+input

+ {

+  font-family: tahoma;

+  font-size: 10px;

+ }

+

+input[type="text"]

+ {

+  width: 325px;

+  border: 1px solid #D0D0D0;

+  background-color: #FFFFFF;

+  vertical-align: middle;

+  font-weight: normal;

+  color: #707070;

+  outline: none;

+  height: 15px;

+ }

+

+select

+ {

+  border: 1px solid #D0D0D0;

+  background-color: #FFFFFF;

+  vertical-align: middle;

+  font-weight: normal;

+  color: #707070;

+  outline: none;

+  font-size: 10px;

+  height: 19px;

+ }

+

+input[type="submit"]

+ {

+  border: 1px solid #D0D0D0;

+  background-color: #FFFFFF;

+  vertical-align: middle;

+  font-weight: normal;

+  color: #707070;

+  outline: none;

+ }

+

+pre

+ {

+  font-family; tahoma;

+  font-size: 11px;

+  background-color: #FFFFFF;

+  border: 1px solid #E0E0E0;

+  padding: 5px;

+  margin-top: 20px;

+  text-align: left;

+  overflow-x: auto;

+  white-space: pre-wrap;

+  white-space: -moz-pre-wrap !important;

+  white-space: -pre-wrap;

+  white-space: -o-pre-wrap;

+  word-wrap: break-word;

+ }

+

+a.link:link		{ text-decoration: none; }

+a.link:visited		{ text-decoration: none; }

+a.link:hover		{ text-decoration: underline; }

+

+a.smallLinkGrey:link    { text-decoration: none; color: #6A6A6A; }

+a.smallLinkGrey:visited { text-decoration: none; color: #6A6A6A; }

+a.smallLinkGrey:hover   { text-decoration: underline; color: #6A6A6A; }

+

+a.smallLinkBlack:link    { text-decoration: none; color: #000000; }

+a.smallLinkBlack:visited { text-decoration: none; color: #000000; }

+a.smallLinkBlack:hover   { text-decoration: underline; color: #000000; }

 

 Binary files /dev/null and b/lib/pChart2.1.0/fonts/Bedizen.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/Forgotte.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/GeosansLight.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/MankSans.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/Silkscreen.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/advent_light.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/calibri.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/pf_arma_five.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/verdana.ttf differ
--- /dev/null
+++ b/lib/pChart2.1.0/index.php
@@ -1,1 +1,6 @@
-
+<?php

+ /* If you navigate here, then you should see the examples */

+

+ header('Location: examples/');

+ exit();

+?>

--- /dev/null
+++ b/lib/pChart2.1.0/palettes/autumn.color
@@ -1,1 +1,7 @@
+185,106,154,100

+216,137,184,100

+156,192,137,100

+216,243,201,100

+253,232,215,100

+255,255,255,100

 

--- /dev/null
+++ b/lib/pChart2.1.0/palettes/blind.color
@@ -1,1 +1,7 @@
+109,152,171,100

+0,39,94,100

+254,183,41,100

+168,177,184,100

+255,255,255,100

+0,0,0,100

 

--- /dev/null
+++ b/lib/pChart2.1.0/palettes/evening.color
@@ -1,1 +1,7 @@
+242,245,237,100

+255,194,0,100

+255,91,0,100

+184,0,40,100

+132,0,46,100

+74,192,242,100

 

--- /dev/null
+++ b/lib/pChart2.1.0/palettes/kitchen.color
@@ -1,1 +1,7 @@
+155,225,251,100

+197,239,253,100

+189,32,49,100

+35,31,32,100

+255,255,255,100

+0,98,149,100

 

--- /dev/null
+++ b/lib/pChart2.1.0/palettes/light.color
@@ -1,1 +1,8 @@
+239,210,121,100

+149,203,233,100

+2,71,105,100

+175,215,117,100

+44,87,0,100

+222,157,127,100

+

 

--- /dev/null
+++ b/lib/pChart2.1.0/palettes/navy.color
@@ -1,1 +1,7 @@
+25,78,132,100

+59,107,156,100

+31,36,42,100

+55,65,74,100

+96,187,34,100

+242,186,187,100

 

--- /dev/null
+++ b/lib/pChart2.1.0/palettes/shade.color
@@ -1,1 +1,7 @@
+117,113,22,100

+174,188,33,100

+217,219,86,100

+0,71,127,100

+76,136,190,100

+141,195,233,100

 

--- /dev/null
+++ b/lib/pChart2.1.0/palettes/spring.color
@@ -1,1 +1,7 @@
+146,123,81,100

+168,145,102,100

+128,195,28,100

+188,221,90,100

+255,121,0,100

+251,179,107,100

 

--- /dev/null
+++ b/lib/pChart2.1.0/palettes/summer.color
@@ -1,1 +1,7 @@
+253,184,19,100

+246,139,31,100

+241,112,34,100

+98,194,204,100

+228,246,248,100

+238,246,108,100

 

 Binary files /dev/null and b/lib/pChart2.1.0/readme.txt differ