text:
Village of Arlington Heights » Your Government » Boards & Commissions
The volunteerism spirit in the Village of Arlington Heights is one of our strongest attributes. Nearly 150 volunteers serve on the Villages' Boards and Commissions. Their advisory role in making recommendations to the Village Board is critical to the success of a well-balanced community. This network of volunteers is involved in many aspects, from reviewing development plans to planning special events; from advising on housing programs to assisting various groups such as businesses, senior citizens, our youth, and citizens with disabilities. The service of these volunteer members is greatly appreciated.
Apply for a Board or Commission
Arlington Economic Alliance
Intent and Purpose
To provide the business community a strong partnership with the Village and to promote a healthy business climate. The Alliance is the Village Board's economic advisory committee on business issues.
The Arlington Economic Alliance consists of 13 members, appointed by the Village President and the Village Board for three year terms. The current members of the Arlington Economic Alliance are:
Scott Whisler, Chair
Anthony Guido
Rex Paisley
Dave Parulo
Jon Ridler
Brian Roginski
Andi Ruhl
Matthew Fink
Rich Casey
Andrew Stengren
Joyce Barabicho
Lyndsay Holton-Crowe
The administrative contact for the Arlington Economic Alliance is the Business Development Coordinator of the Planning & Community Development Department at 847.368.5200.
The Arlington Economic Alliance shall promote economic development by activities including, but not limited to, the following:
Advising the Village on the development and implementation of business retention/expansion programs
Advising the Village on the implementation of a marketing program to attract new business and industry
Monitoring business activity and trends on the local, state and national levels
Establishing a focal point for businesses to approach and discuss issues that affect them
Engaging representatives from the following community-wide entities at Arlington Economic Alliance meetings as appropriate: Arlington Heights Memorial Library, Arlington Heights Park District, Township High School District 214, the Special Events Commission and other entities as appropriate
Researching and advising the Board of Trustees, Village Manager and Boards and Commissions on matters relating to economic development
Annually, not later than the beginning of the fiscal year, submit an annual report to the Village Board
Dear Arlington Heights Residents,
The arts are alive in Arlington Heights! Throughout the year, the Arlington Heights Arts Commission enhances and encourages art awareness within the Village and creates projects to keep cultural arts flourishing. We welcome community participation in all aspects of the arts - visual, writing, performance and music. Some of our programs include: the bi-annual Art Outreach Events, the Cultural Arts Award, Decorated Object Competition, the Photography Competition and the Banner Pole Project. We also support village events such as the Library's Teen Film Festival and the Historical Society's Festival of Wreaths. We look forward to seeing and working ith many of you as we help to keep the arts alive and vibrant in Arlington Heights!
Janet Souter, Chair
Village of Arlington Heights Arts Commission
Read the Arts Commission brochure regarding its role to encourage art awareness in the community.
To enhance and encourage art in support of cultural advancement within the Village of Arlington Heights.
To provide for an appointive, advisory body which shall, after due deliberation, make recommendations to the President and Board of Trustees on the acquisition of public art within the Village of Arlington Heights.
2019 Cultural Arts Listing
The Arts Commission consists of nine members, residents of the Village, appointed by the Village President with the advice and consent of the Board of Trustees. The current members of the Arts Commission are:
Toni Higgins-Thrash
Mary Seitz-Pagano
Kristen Schurtz
Sarah Galla
Kristen Walter
Leena Joshi
Brian Wolf
The Administrative Contact for the Arts Commission is the Landscape Planner of the Planning & Community Development Department, 847.368.5200.
Meetings and Quorum
Regular meetings of the Arts Commission are held at the call of the chair, which has typically been the first Wednesday of each month at 6:30 p.m. in the Commissions Room, located on the 2nd floor of Village Hall. Five members constitute a quorum.
Bicycle & Pedestrian Advisory Committee
The Bicycle & Pedestrian Advisory Commission shall assist in the development of comprehensive plans for bikeways within the Village.
The Bicycle & Pedestrian Advisory Commission consists of seven members, residents of the Village, appointed by the Village President with consent of the Village Board to three-year terms. Members of the Bicycle & Pedestrian Advisory Commission are:
Jurgen Juffa, Chairman
Alan Medsker
Paul Danko
Charlotte Obodzinski
Richard Lenski
Lynn Sakata
The Administrative Liaison for the Bicycle & Pedestrian Advisory Commission is a member of the Engineering Division, 847.368.5250.
Meetings & Quorum
Regular meetings of the Bicycle & Pedestrian Advisory Commission are held on the call of the Chair. Four members constitute a quorum.
Bicycle and Pedestrian Plan
The Village Board unanimously approved the Arlington Heights Bicycle and Pedestrian Plan on September 5, 2017. The project was completed with assistance from CMAP's Local Technical Assistance program. CMAP is the comprehensive regional planning agency for metropolitan Chicago. The comprehensive plan outlines the community's vision for bicycle and pedestrian travel and define policies to help achieve Village-wide goals related to access, mobility, health and sustainability.
Bike Arlington Heights Events
The BPAC organizes and hosts community bike rides to meet local cyclists and acquaint people with the Village network of bikeways. The Commission believes that in doing so, participants are encouraged to consider biking the next time they have a short trip to make into downtown or to any of the many destinations the Village of Arlington Heights is home to. Check back periodically for additional scheduled events
Bicycle Safety Information
LIB Bike Safety Quiz
Federal Highway Administration Bicycle Safer Journey
Bicycles & Public Transportation
Bike & Bus Ride
To provide for a fact-finding body which shall make recommendations to the Village Board on matters pertaining to health. Additionally, the Board of Health shall take emergency actions authorized by the Statute, such as quarantine, to protect the public health.
The Board of Health consists of five members, who are residents of the Village and health care professionals, appointed by the Village President and the Village Board for three year terms. Members of the Board of Health are:
Timothy Laurie, MD, Chair
Jerome Meservey, MD
Thomas A. Harris, DDS
Karen VanLandeghem
Sean Barnett, MD
The Administration Liaison for the Board of Health is the Director of Health & Human Services Department, 847.368.5763.
Regular meetings of the Board of Health are held at the call of the chair. Three members shall constitute a quorum.
Board of Local Improvements
To provide recommendations to the Village Board on matters pertaining to the construction, extension, improvement or repair of any local improvements.
The Board of Local Improvements consists of five members, residents of the Village, appointed by the Village President with consent of the Village Board for five-year terms. Members of the Board of Local Improvements are:
John Kazanow, President
Nicholas Cortesi
Bonifacio (Benny) Epino
David Landeweer
The Administrative Liaison for the Board of Local Improvements is the Village Engineer of the Engineering Division, 847.368.5250.
Regular meetings of the Board of Local Improvements are held at call by the chair. Three members constitute a quorum.
Building Code Review Board
To make recommendations to the Village Board relating to waivers and amendments to the Building Code and administrative procedures relating to the enforcement of the Building Code.
The Building Code Review Board consists of five members, residents of the Village, appointed by the Village President with consent of the Village Board for three-year terms. Members consist of a Trustee of the Village, a structural engineer, a building contractor, an architect and a mechanical engineer. A representative of the Building Department and a representative of the Fire Department shall each serve as Village Administrative Liaisons to the Board. Members of the Building Code Review Board are:
Richard Bondarowicz, Chair
John Carrato
Carl F. Baldassarra
Thomas Hutchison
Trustee Jim Tinaglia
The Administration Contact for the Building Code Review Board is the Director of the Building & Life Safety Department, 847.368.5560.
Regular meetings of the Building Code Review Board are held at the call of the chair.
Commission for Citizens with Disabilities
To promote the needs and concerns of the citizens with disabilities of the Village and to cooperate with the Village government and all other governmental agencies in the promotion of the cause of people with disabilities.
The Commission for Citizens with Disabilities consists of nine members, residents of the Village, appointed by the Village President with the consent of the Village Board for three-year terms. Members of the Commission for Citizens with Disabilities are:
Roxanne Calibraro, Chair
Seth Jonathon Goldberg
Jacqueline McCarty
Peg McMahon
Eva Mullinax
Michele Ramsey
Sheryl Letwat
The Administrative Liaison for the Commission for Citizens with Disabilities is the Disability Services Coordinator, 847.368.5760.
Regular meetings are held on the 2nd Tuesday of each month at 7:00 p.m. Five members constitute a quorum.
Disability Employment Awareness Nomination Form
The Arlington Heights Commission for Citizens with Disabilities promotes National Disability Employment Awareness Month (NDEAM) each October.
Wishing to encourage Arlington Heights employers to hire people with disabilities, the Commission has established the annual Disability Employment Awareness Award.
The annual award is presented to an Arlington Heights employer known for employing persons with disabilities. Nominations are sought from the community at large and self-nominations are encouraged. For more information contact David Robb, Disability Services Coordinator at the Village of Arlington Heights, 847.368.5793
Disability Employment Campaign
The Commission for Citizens with Disabilities developed a Business Information Packet as a way to provide businesses/employers with a resource they can reference in considering hiring skilled workers with disabilities. Employers are encouraged to consider hiring skilled workers with disabilities.
The packet provides information on tax incentives, reasonable accommodations, definition of disability by the Americans with Disabilities Act and other employment supports available to companies that employ workers with disabilities.
To provide for an appointive, advisory body which shall, after due deliberation, make recommendations to the Board of Trustees or the Building Commissioner on matters relating to external architectural design, aesthetics, landscape and signs.
The Design Commission shall consist of five members, residents of the Village, appointed by the Village President by and with the advice and consent of the Board of Trustees. The current members are:
John Fitzgerald, Chair
Ted Eckhardt
Kirsten Kingsley
Jonathan Kubow
Scott Seyer
The Administrative contact for the Design Commission is the Design Planner of Planning & Community Development Department at 847.368.5200.
The Design Commission shall review all Plan Commission, Zoning Board of Appeals, Building Permit and Sign Permit applications for new construction and those applications for improvements which affect the architectural design of the building, site improvements or signage to determine whether it meets with the standards, requirements and purposes of the Design Guidelines and Chapter 30, Sign Code. The following applications can be found in our Community Planning & Zoning section of Village Services:
Design Commission application for Commercial/Multi-Family/Institutional projects
Design Commission application for Single Family projects
Design Commission application for Sign Variations
Design Commission application for Downtown Sign projects.
The Design Commission has final authority on projects that do not require Village Board approval. Appeals to the Design Commission determinations may be done directly to the Village President and Board of Trustees. Appeals must be made in writing to the Village Manager within 30 days of receipt of the notice of denial by the Design Commission.
Regular meetings of the Design Commission are held at the call of the chair, which has typically been the second and fourth Tuesday of each month, at 6:30 p.m. in the Community Meeting Room, located on the 3rd floor of Village Hall. Three members constitute a quorum. The vote of three members of the Design Commission is necessary for a motion to pass.
To promote the preservation and enhancement of the physical environment of the Village of Arlington Heights and cooperate with the Village government and all other governmental agencies in the protection of the environment.
The Environmental Commission consists of eight members - with one being a youth member - residents of the Village, appointed by the Village President with consent of the Village Board for three-year terms. Members of the Environmental Commission are:
Dennis O'Brien, Chair
Theresa Jordan
Katherine McVay
Steven Sawyer
Troy Malik
Paul Balga
Daniel Kowalczyk, Youth Member
The Administrative Liaison for the Environmental Commission is an Environmental Health Officer with Health & Human Services Department, 847.368.5760.
Regular meetings are at the call of the Chair. Five members constitute a quorum.
To comply with Statutes pertaining to the appointment of firefighters and police officers.
The Fire and Police Commission consists of three members, residents of the Village, appointed by the Village President with consent of the Village Board for three-year terms. Members of the Fire and Police Commission are:
Lynn Szabo, Chair
Lee Hettinger
Luis Ramirez Alonso
The Administrative Liaison for the Fire and Police Commission is the Director of Human Resources, 847.368.5161.
Regular meetings of the Fire and Police Commission are held at the call of the chair.
To comply with the statutes pertaining to control and management of the Firefighters Pension Fund.
Two members of the Board shall be appointed by the Mayor or President of the Board of Trustees of the municipality or the Fire Protection District involved. Two members of the Board shall be active participants in the pension fund who are elected from the active participants of the fund. One member of the Board shall be a person who is retired under the Fireman's Pension Fund Act of 1919 or Article 40 who is elected from persons retired under the Fireman's Pension Fund Act of 1919 or Article 40.
The terms of the appointees shall be staggered with one serving an initial term of three years and another serving an initial term of two years. After their initial terms, each term shall be for three years or until a successor has been appointed.
Members of the Firefighters' Pension Board are:
Douglas Ruhnke, President
Mark Aleckson
Kert Evans
Andrew Larson
Thomas Kuehne
The Administrative Liaison for the Firefighters' Pension Board is the Director of Finance, 847.368.5500.
To provide an appointive advisory body which shall:
Promote adequate housing for all of the community's people, to create and/or maintain sound viable neighborhoods, to meet the needs for housing by increasing the number of housing units for low-and-moderate income families and individuals, and to expand housing opportunities for all members of the community
Constitute the Fair Housing Review Board for the purpose of conducting hearings and investigating complaints regarding discrimination in the sale, rental, or financing of housing
The Housing Commission consists of seven members, all residents of the Village, appointed by the Village President and the Village Board . The current members of the Housing Commission are:
Alex Hageli, Chair
John Eggum
William F. Delea
Zachery Creer
Andrew Tripp
Ken Kiefer
The Administration Contact for the Housing Commission is the Housing Planner of the Planning & Community Development Department, 847.368.5200.
The Housing Commission is involved in the following activities:
Researches, initiates, and makes recommendations to the Village Board concerning Arlington Height programs and issues. For example, the Housing Commission provides input and makes funding suggestions concerning the Village's Community Development Block Grant (CDBG) budget, affordable housing policies, Inter-jurisdictional Housing Initiative, etc.
Monitors Village housing programs such as the Single-Family Rehabilitation Loan Program, First-Time Homebuyer Program, implementation of the Multi-Family Affordable Housing Toolkit, CEDA's Wright House transitional housing facility
Regular meetings of the Housing Commission are held at the call of the chair, which is typically on the first Tuesday of every month at 7:00 p.m. in the Commissions Conference Room, located on the 2nd floor of Village Hall. Four members constitute a quorum.
To provide for an appointive, fact-finding, advisory body which shall, after due deliberation and public hearing, when required, make recommendations to the Board of Trustees on matters pertaining to:
The Comprehensive Plan and Official Map
Chapter 28 | Zoning Regulations
Chapter 29 | Subdivision Regulations
Individual Petitions pertaining to the above
Such other matters as may be referred to the Plan Commission by the Village Board
The Plan Commission consists of nine members, all residents of the Village, appointed by the Village President with the advice and consent of the Board of Trustees. The current members of the Plan Commission are:
Terrence Ennes, Chair
Jay Cherwin
Susan Dawson
George T. Drost
Bruce C. Green
Lynn Jensen
Joseph Lorenzini
John Sigalos
Mary Jo Warskow
The Administration Contact for the Plan Commission is the Planning & Community Development Department at 847.368.5200.
The Plan Commission is charged with conducting appropriate hearings, and submitting recommendations to the Board of Trustees on petitions involving the following matters:
Subdivision, including re-subdivision and consolidation
Rezoning
Land Use Variations
Amendments to the Zoning Regulations (Chapter 28 of the Arlington Heights Municipal Code)
Such other matters as may be referred to the Commission by the President and Board of Trustees.
In applications for Planned Unit Development, Subdivisions, Special Use Permits, Rezoning and Land Use Variations, the Plan Commission may recommend and the Village Board of Trustees may authorize variations from the Zoning Regulations as may be required within the boundaries of such development without referring the matter to the Zoning Board of Appeals. For more information about the Plan Commission review process, view the application in our Document Center.
The Plan Commission may create subcommittees and adopt policies and procedures deemed advisable to fulfill its power, duties, and responsibilities. All such policies and procedures shall be recorded and transmitted to the Village Board. The three primary sub-committees of the Plan Commission include:
Comprehensive Plan Subcommittee
Reviews and forwards recommendations to the Plan Commission on matters pertaining to the Comprehensive Plan and Official Map. The Comprehensive Plan is a description of long-range public policy affecting community character, economic well-being, cultural and social amenities, ease and convenience of circulation in the Village, and orderly development of various land uses, and serves as a policy guide in all decisions related to community growth. The Official Map identifies the location of present and future public service facilities and improvements, thoroughfare system improvements, park and school sites and land for other public purposes.
Ordinance Review Committee
Reviews and forwards recommendations to the Plan Commission on matters pertaining to Chapter 28, Zoning Regulations, and Chapter 29 (Subdivision Regulations) text amendments.
Conceptual Plan Review Committee
Reviews and forwards recommendations to the Plan Commission on matters pertaining to current and long range planning and individual petitions for a PUD, a rezoning, a special use, a land use variation, an amendment to the comprehensive plan, a plat of subdivision, and such other matters as may be referred to the Plan Commission by the Village Board.
Regular meetings of the Plan Commission are held at the call of the chair, which has typically been the second and fourth Wednesday of the every month at 7:30 p.m. in the Board Room, located on the 3rd floor of Village Hall. Five members constitute a quorum.
To comply with Statutes pertaining to control and management of the Police Pension Fund.
The Police Pension Fund Board consists of five members comprised of two members appointed by the Village President with consent of the Village Board; two members elected among the regular police force by active members thereof; and one member elected by and from the beneficiaries of the fund. The election of the members is held biannually on third Monday of April. Members of the Police Pension Fund Board are:
Thomas Henderson, Chair
Harry Malone
Petar Milutinovic
Mike Schenkel
William Falk
The Administrative Liaison for the Police Pension Fund Board is the Director of Finance, at 847.368.5500.
Regular meetings of the Board of Trustees of the Police Pension Fund are on call.
To promote the needs and concerns of the senior citizens of the Village and to cooperate with the Village Government and all other governmental agencies in the promotion of the causes of senior citizens.
The Senior Citizens Commission consists of ten members, residents of the Village, appointed by the Village President with consent of the Village Board for three-year terms. Members of the Senior Citizens Commission are:
Frederick Feldman, Chair
Dottie Hardy
Sharon Adams
George Motto
Maureen Seleski
George Weber
Tem Williams
Nancy Frenk
Susan Viecelli
The Administrative Liaison for the Senior Citizens Commission is the Senior Center Manager, 847.253.5532.
Regular Meetings are held on the 3rd Monday of each month at 7:00 p.m. Six members constitute a quorum.
Special Events Commission
To promote, organize and implement special events of civic, patriotic, educational and cultural nature in the Village.
Annually, the Special Events Commission hosts wonderful community events including the Hearts of Gold Awards Dinner in February, the Spring Sweep on the last Saturday of April, the Mane Event in mid August, the Autumn Harvest on the first Saturday of October and the Tree Lighting on the Friday after Thanksgiving.
Hearts of Gold
The Commission requests the public to nominate someone who works, volunteers or lives in our community and is worthy of a "Heart of Gold." Award winners are outstanding volunteers, dedicated teachers or business people, a friendly neighbor who does kind deeds for others, a young teen who has already accomplished great things, a senior citizen who dedicates their time to an organization or to others, etc.
Spring Sweep
This even includes document shredding and electronic recycling at the Nokia site on the north end of town, near Dundee and Hwy. 53.
Mane Event
The Mane Event is a block party kick-off for the Million Week at Arlington International Racecourse. The event includes food, entertainment, kids' games, etc. all held in the Downtown.
This family fun event held in North School Park celebrates fall activities like scarecrow building, hayrides, music, food and kids' entertainment.
Families, visitors and neighbors gather for this Thanksgiving holiday treat to enjoy the magic countdown and flip of the switch that lights up all holiday displays in North School Park and one of the largest holiday trees in the area! Held the Friday after Thanksgiving.
The Special Events Commission consists of twelve members, appointed by the Village President with consent of the Village Board for four-year terms. Members of the Special Events Commission are:
Laurie Mitchell, Chair
Joseph Musolino
Steven Fromm
Kevin Seifert
Scott Rowader
Christopher Fahnoe
Michael Prost
Emma Edmondson, Park District representative
Nancy Forch
Diane Jamieson
David Jaffe
Keri Stanley
The Administrative Liaison for the Special Events Commission is the Communications Coordinator, 847.368.5100.
Regular meetings of the Special Events Commission are held on the second Wednesday of each month at 7 p.m. Seven members constitute a quorum.
To provide recommendations to the Village Board on matters pertaining to the welfare of the youth of the Village and to promote youth programs.
The Youth Commission consists of 13 members, six adult members and seven youth members appointed by the Village President with consent of the Village Board for three-year terms with high school students serving one-year. Members are to include a staff member from District 214 or District 25, a Park District representative, and a representative of the Police Department. The adult members shall be residents or employed within the Village in a professional capacity relating to youth work. Members of the Youth Commission are:
Matt Healy, Chair
Taryn Gombar, Police Officer
Chyrel Moore
Kim Dyer
Alice Son
Jonathan Kho, Youth Member
Kendall Fahnoe, Youth Member
Grace Baldino, Youth Member
Alya Patel, Youth Member
Connor Neill, Youth Member
The Administrative Liaison for the Youth Commission is the Director of Health & Human Services, 847-368-5760.
Regular meetings of the Youth Commission are held the 3rd Thursday of each month at 6:00 p.m. Seven members constitute a quorum.
To provide for an appointive, fact-finding body which shall, after due deliberation and public hearing, make final decisions on specified administrative matters related to zoning.
The Zoning Board of Appeals consists of seven members, all residents of the Village, appointed by the Village President with the advice and consent of the Board of Trustees. The current members of the Zoning Board of Appeals are:
David Divito, Chair
Joseph Geisel
Benjamin Jaffe
Joseph Selbka
Peter Siavelis
Jeff Lanaghan
The Administrative contact for the Zoning Board of Appeals is the Landscape Planner of Planning & Community Development Department, 847.368.5200.
The Zoning Board of Appeals is the body that reviews variation requests from Chapter 28 (Zoning Regulations) of the Arlington Heights Municipal Code if the project does not require review by the Plan Commission. The typical variation review process lasts approximately 30 days. In that time, Staff reviews the application package for completeness and the proposal to ensure the Zoning Regulations are being interpreted properly, legal notice is completed, and a hearing is held.
The Zoning Board of Appeals reviews variations whenever a property owner can show that a strict application of the terms of the Zoning Regulations relating to the construction or alteration of building or structures will impose upon the owner unusual practical difficulties or particular hardship. Such variation of the strict application of the terms of the Zoning Regulations can only be granted only when the Board is satisfied that a granting of such variation will not merely serve as a convenience to the applicant, but will alleviate some demonstrable and unusual hardship or difficulty so great as to warrant a variation from the Comprehensive Plan, and at the same time the surrounding property will be properly protected.
In its consideration of the standards of practical difficulties or particular hardship, the Zoning Board of Appeals shall require evidence that:
The property in question cannot yield a reasonable return if permitted to be used only under the conditions allowed by the regulations in that zone
The plight of the owner is due to unique circumstances
The variation, if granted, will not alter the essential character of the locality
A variation shall be permitted only if the evidence, in the judgment of the Zoning Board of Appeals, sustains each of the three conditions enumerated.
Limitation on Requests for Variations
No request for a variation shall be considered by the Zoning Board of Appeals for property which has been the subject matter of a previous request for a variation for a period of one year after the Zoning Board of Appeals has made a determination or recommendation for a variation on the same property.
If a requested variation is approved by the Zoning Board of Appeals, it shall be valid for only one year, unless a building permit for the construction or alteration is obtained, or in certain circumstances the use is established, within that year and the construction or alteration is started and proceeds to completion in accordance with the terms of such permit.
Regular meetings of the Zoning Board of Appeals are held at the call of the chair, which has typically been the second Monday of the every month at 7:00 p.m. in the Buechner Room, located on the 1st floor of Village Hall. Four members constitute a quorum. The concurring vote of four members of the Zoning Board is necessary to decide in favor of the applicant in any matter upon which it is required to pass or to effect any variation.
Foreign Fire Insurance Tax Board
A Foreign Fire Insurance Tax Board is created pursuant to the provisions of 65 ILCDS 5/11/-10-2. The trustees of the department foreign fire insurance board shall make all needful rules and regulations with respect to the department foreign fire insurance board and the management of the money to be appropriated to the board.
Ross Chapman
James Stempien
Robert Losik
Martin Moran
Michael Schubert
Administration Contact is the Fire Chief, 847.368.5450. Meetings are scheduled on call.


Lately we've been pulling out items to sell in a garage sale in hopes of clearing away some of the clutter around here. There are so many clothes, toys and gear from when my girls were babies that is just never going to be needed again, so why not let someone else get some use out of it?
Of the few things that have pained me to think of parting with, high on the list are the pairs of shoes we have from pediped footwear. They're just so... cute. You can find pictures of the styles that we own in the pediped giveaway I hosted this past winter, as well as a whole list of reasons why we love these shoes.
So what's new in pediped footwear?
Launched in 2004 by Angela and Brian Edgeworth in their quest for the perfect soft-soled shoe for their first daughter, the exceptional quality, unsurpassed comfort and distinctive styling have made pediped footwear one of the fastest-growing children's footwear brands in the United States. Sold in over 3000 stores in the U.S. and 40 countries worldwide, pediped offers more than 120 designs for boys and girls between their Originals (soft-soled for newborns to age 2+) and Flex (rubber-soled for children 1-5 years) collections.
pediped has now introduced the next generation in ultimate comfort for children by including Memory Foam Technology (MFT) in their signature ballet flats and sandals for boys and girls. The responsive and high-density MFT insoles mold to a child's foot and spring back when pressed to absorb shock and minimize impact. The insoles also react to body temperature, distribute weight and provide support where needed, creating a custom fit that is comparable to none.
Best of all, this ultra comfortable technology is available in many adorable styles including the Penny ballet flat, the Megan sandal with flowers, the Phoebe with rhinestones, the Gillian and the Brody, a rugged sandal for boys. The shoes are made of an all leather upper, lining and all natural rubber sole. Upholding its reputation as a leader in the children's footwear industry, pediped is the only U.S. children's footwear company to offer a complete line of shoes with memory foam technology.
pediped footwear's MFT line is available now at select retailers and on their website in EU sizes 20 - 29 (U.S. sizes 5 - 12.5) and retails for $48 - $52 per pair. There will also be new fall/winter 2010 MFT styles from pediped debuting this July!


People We Work With – Griffin Architects, P.A.
With a remodel that was that extensive, on a home that was that old, there were occasional unforeseen problems during construction. Griffin Architects was extraordinarily responsive with creative solutions and their supervision of construction insured a fabulous result. Twenty years later, we are still enjoying our wonderful home.


After downing Caius Ballad for the second time, you will transition into a three-way battle. This marks the final leg of the story in Final Fantasy XIII-2. Follow the guide for hints to get through this tough battle, and good luck!
At first in this battle you will only be fighting Amber Bahamut and Garnet Bahamut, but Jet Bahamut will join the fray once you kill the first two opponents. First things first, you should focus on taking out the first two Bahamuts. Amber Bahamut is resistant to magic, and Garnet Bahamut is resistant to physical attacks. Although they will begin casting more powerful spells as the encounter goes on, neither of these enemies poses a particularly large threat. Simply bring their Chain Gauges up to the maximum, stagger them, and finish them off. You have faced down plenty of tougher opponents before.
Jet Bahamut will spawn after you defeat the other two, and this battle is no cakewalk. Jet Bahamut will occasionally attempt to resurrect his fallen allies. This is less imposing than it sounds, though, because although Jet Bahamut is immune to all attacks while his allies are present, he also will not attack you as long as the other two Bahamuts are out on the field. Once you defeat them, however, he will always immediately cast Break Curse, which will inflict numerous status ailments upon your party. Use Remedies or heal with a Medic to get rid of them.
When you are fighting the three Bahamuts together, do not be in a rush to finish the battle too quickly. Kill either Amber or Gernet Bahamut, and then focus on the other. As it is about to die, take a step back and examine your party's health. Amber and Garnet Bahamut are not nearly as tough as Jet Bahamut, so you should take a moment to heal and buff yourself before delivering the finishing blow to the weaker of the dragons and delving back into battle with Jet Bahamut.
The real abilities that you should watch out for are Abyssal Yawn and Judgment Blade, which deal heavy damage. If possible, switch to Tortoise when you see these attacks coming. That will not always be possible though, so you will have to weigh your options. If your reactions are good enough, you may be able to block a significant portion of the damage that would be dealt to you. If you can't make the precise timing, though, you will just end up wasting time.
Jet Bahamut will also cast Seed of Destruction, an ability which spawns several Ebon Seeds onto the battlefield. These are kind of like landmines, and will self-destruct after a period of time if left untended. You should immediately begin to focus on destroying them when Jet Bahamut spawns them out onto the battlefield. Then switch your focus back to Jet Bahamut.
After you have fought Jet Bahamut once, the battle will continue. At this point you may notice a countdown appear onscreen. Starting at Count: 3 and eventually lowering to Count: 1, this counter marks an impending attack by all three Bahamuts called Exaflare. If less than three Bahamuts are present at the time of the countdown, the attack will be weakened. Two Bahamuts leads to the Teraflare ability, and Gigaflare will be cast if only Jet Bahamut is present. Gigaflare is the weakest of the three attacks, so try to kill off the other Bahamuts as fast as you can if the counter appears onscreen when more than one of them is alive. If you are at or around 60% health or less, it is probably best to concentrate on healing instead of killing one of the Bahamuts. These attacks are strong and can leave you in a bind if you are not prepared to take the brunt of their damage. Luckily, they at least give you plenty of warning, so do what you need to do and then switch to the Tortoise Paradigm.
Note that whenever you need to heal, it is always preferable to use a Phoenix Down over the Rise spell. Using a Phoenix Down will temporarily grant status enhancements to the raised party member, and will negate wound damage.
Once you have lowered Jet Bahamut's health significantly, he will begin using an attack called Dying Sun. This is one of his most powerful attacks, and just like the Exaflare, you should switch to Tortoise as soon as you see this attack coming. You will have to stay on your toes, switching from attack-based Paradigms to the Tortoise Paradigm when things get hairy, and event the Variety Paradigm when you need to heal. This battle can stretch on for a long time if you let it because Jet Bahamut tends to summon other creatures or Ebon Seeds to do the damage for him. At a certain point, when Jet Bahamut's health is lowered, you will simply have to switch to a more offensive-focused Paradigm if you hope to get a 5-Star score in this battle. Otherwise, you can eke out a victory by slowly draining his health. This tactic can be dangerous, though, as you never know when the enemy will summon reinforcements or use a powerful attack. Try to end the fight quickly.
Upon finally defeating Jet Bahamut, your battle still is not quite over. A Cinematic Battle Action is necessary to finish the game. You must press one of two buttons to make a key decision, so keep your wits about you and your hands on the controller.
The credits will roll after the cutscene ends. Congratulations, you have just beaten the story of Final Fantasy XIII-2! There is still much to be done in the Post Game, so be sure to stick around until after the credits. Here, you will receive 30,000 experience points and the Paradox Scope Fragment, and you will unlock Valhalla as a location in the Historia Crux. At this point, you are ready to tackle the game's numerous optional challenges, some of which are even more difficult than the final battle you just faced.


The lowest fare found from Norwich (NWI) to Malta (MLA) was £352 with KLM. The fares shown here are the lowest flight prices to Malta obtained in actual searches by Just The Flight customers. To search and book flights to Malta, please enter your travel requirements in the search form above, and click the search button.


text:
#import <AVFoundation/AVFoundation.h>
#import <QuartzCore/QuartzCore.h>
#import "OccasionVC.h"
#import "SBJson/SBJson.h"
#import "PlaylistVC.h"
#import "NSObject+AssociateProducer.h"
#import "Sequence.h"
#import "LocalPlaylist.h"
#import "NSBundle+RumblefishMobileSDKResources.h"
#import "UIImage+RumblefishSDKResources.h"

@class OccasionControllerView;

@interface NSObject (OccasionControllerViewDelegate)

- (UIInterfaceOrientation)occasionControllerViewCurrentOrientation:(OccasionControllerView *)controllerView;
- (void)occasionControllerView:(OccasionControllerView *)controllerView tappedHomeButtonAtIndex:(NSUInteger)index;

@end

@interface OccasionControllerView : UIView

@property (nonatomic, weak) id delegate;
@property (nonatomic, assign) BOOL buttonsHidden;
@property (nonatomic, strong) NSArray *rootButtons;

@end

@implementation OccasionControllerView

@synthesize delegate, buttonsHidden = _buttonsHidden, rootButtons;

#define imageWidth 116
#define imageHeight 115
#define imageMargin 6

- (void)awakeFromNib {
    self.rootButtons = [@[ @"mood.png", @"celebration.png", @"themes.png", @"currentevents.png", @"sports.png", @"holiday.png" ] map:^ id (id imageName) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button setImage:[UIImage imageInResourceBundleNamed:imageName] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button];
        return button;
    }];
}

- (void)makeRootButtonsVisible {
    [rootButtons each:^(id x) {
        UIView *b = (UIView *)x;
        b.layer.rasterizationScale = 1.0;
        b.alpha = 1.0;
    }];
}

- (void)makeRootButtonsInvisible {
    [rootButtons each:^(id x) {
        UIView *b = (UIView *)x;
        b.layer.rasterizationScale = 1.0;
        b.layer.shouldRasterize = YES;
        b.alpha = 0;
    }];
}

- (void)layoutButtonsVisible {

    CGFloat itemWidth = imageWidth + imageMargin * 2;
    CGFloat itemsFittingH = MIN(3, floorf(self.bounds.size.width / itemWidth));

    CGFloat itemHeight = imageHeight + imageMargin * 2;
    CGFloat itemsFittingV = MIN(3, floorf(self.bounds.size.height / itemHeight));

    itemWidth = self.bounds.size.width / itemsFittingH;
    CGFloat calculatedXmargin = (self.bounds.size.width - (imageWidth * itemsFittingH)) / (itemsFittingH * 2 + 2);

    itemHeight = self.bounds.size.height / itemsFittingV;
    CGFloat calculatedYmargin = (self.bounds.size.height - (imageHeight * itemsFittingV)) / (itemsFittingV * 2 + 2);

    CGFloat xInit = calculatedXmargin;
    CGFloat yInit = calculatedYmargin;
    CGFloat xInterval = imageWidth + calculatedXmargin * 2;
    CGFloat yInterval = imageHeight + calculatedYmargin * 2;

    NSLog(@"xInit = %f, yInit = %f, xInterval = %f, yInterval = %f", xInit, yInit, xInterval, yInterval);

    __block CGFloat x = xInit, y = yInit;
    [rootButtons each:^(id i) {
        if (x + xInterval > self.bounds.size.width) {
            x = xInit;
            y += yInterval;
        }
        UIView *b = (UIView *)i;
        b.frame = CGRectMake(x + calculatedXmargin, y + imageMargin, imageWidth, imageHeight);
        x += xInterval;
    }];
}

- (void)layoutButtonsInvisible {
    [self layoutButtonsVisible];

    if (UIInterfaceOrientationIsPortrait([delegate occasionControllerViewCurrentOrientation:self])) {
        for (int i = 0; i < rootButtons.count; i++) {
            UIView *b = (UIView *)rootButtons[i];

            CGFloat y = b.frame.origin.y;
            if (i < 2)
                y = -imageHeight;
            if (i > 3)
                y = self.bounds.size.height;

            BOOL left = (i % 2) == 0;
            b.frame = CGRectMake(left ? -imageWidth : self.bounds.size.width, y, imageWidth, imageHeight);
        }
    }
    else {
        for (int i = 0; i < rootButtons.count; i ++) {
            UIView *b = (UIView *)rootButtons[i];

            CGFloat x = b.frame.origin.x;

            if (i == 0 || i == 3)
                x = -imageWidth;
            if (i == 2 || i == 5)
                x = self.bounds.size.width;

            BOOL top = (i < 3);
            b.frame = CGRectMake(x, top ? -imageHeight : self.bounds.size.height, imageWidth, imageHeight);
        }
    }
}

- (void)setDisplaysHomeButtons:(BOOL)value animated:(BOOL)animated {
    if (value) {
        if (animated) {
            [UIView animateWithDuration:0.5f animations:^{
                [self layoutButtonsVisible];
                [self makeRootButtonsVisible];
            }];
        }
        else {
            [self layoutButtonsVisible];
            [self makeRootButtonsVisible];
        }
    }
    else {
        if (animated) {
            [UIView animateWithDuration:0.5f animations:^{
                [self layoutButtonsInvisible];
                [self makeRootButtonsInvisible];
            }];
        }
        else {
            [self layoutButtonsInvisible];
            [self makeRootButtonsInvisible];
        }
    }
    _buttonsHidden = value;
}

- (void)layoutSubviews {
    if (_buttonsHidden) {
        [self layoutButtonsVisible];
    }
    else {
        [self layoutButtonsInvisible];
    }
    [super layoutSubviews];
}

- (void)buttonTapped:(UIButton *)button {
    [self.delegate occasionControllerView:self tappedHomeButtonAtIndex:[self.rootButtons indexOfObject:button]];
}

@end

@interface OccasionVC ()

@property (nonatomic, copy) NSArray *occasions;
@property (nonatomic, strong) NSMutableArray *occasionStack;
@property (nonatomic, strong) Occasion *displayedOccasion;
@property (nonatomic, copy) NSArray *displayedPlaylists;
@property (nonatomic, copy) NSArray *occasionImages;
@property (nonatomic, strong) OccasionControllerView *controllerView;

@end

@implementation OccasionVC

@synthesize displayedOccasion, displayedPlaylists, occasions, occasionStack, occasionImages, controllerView;

NSMutableArray *secondButtons, *thirdButtons;
int level, plRow, plSection;
bool isPlaying;
NSString *srv;
UITableViewCell *selectedCell;
AVPlayer *audioPlayer;
AVPlayerItem *playerItem;
PlaylistVC *playlist;
CGRect thirdRect, secondRect;
bool replaySong;

NSMutableDictionary *allImagesDict;
NSTimer *rotateImagesTimer;

#pragma mark - View lifecycle

- (id)init {
    if (self = [super initWithNibName:@"OccasionVC" bundle:[NSBundle rumblefishResourcesBundle]]) {
        self.occasionStack = [NSMutableArray array];
    }
    return self;
}

- (OccasionControllerView *)controllerView {
    return (OccasionControllerView *)self.view;
}

- (void)viewDidLoad
{
    self.controllerView.delegate = self;
    [self.controllerView setDisplaysHomeButtons:NO animated:NO];

    [super viewDidLoad];
    [self.navigationController setNavigationBarHidden:NO animated:YES];

    plRow = -1;
    plSection = -1;
    level = 1;
    table.alpha = 0;
    replaySong = NO;

    table.separatorColor = [UIColor colorWithRed:0.08f green:0.08f blue:0.08f alpha:1.0f];
    selectedCell = [[UITableViewCell alloc] init];

    UIImageView *titleView = [[UIImageView alloc] initWithImage:[UIImage imageInResourceBundleNamed:@"friendlymusic_logo.png"]];
    self.navigationItem.titleView = titleView;
    UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Playlist" style: UIBarButtonItemStyleBordered target:self action:@selector(gotoPlaylist)];
    self.navigationItem.rightBarButtonItem = rightButton;

    firstButton = [UIButton buttonWithType:UIButtonTypeCustom];
    firstButton.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    firstButton.frame = CGRectMake(0, 0, scroller.bounds.size.width, 35);
    firstButton.alpha = 0;
    firstButton.titleLabel.font = [UIFont systemFontOfSize:32];
    [firstButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
    [firstButton addTarget:self action:@selector(animateToHomeScreen) forControlEvents:UIControlEventTouchUpInside];
    [firstButton setContentEdgeInsets:UIEdgeInsetsMake(0, 3, 0, 0)];
    [[firstButton layer] setMasksToBounds:YES];
    [[firstButton layer] setBorderWidth:0.5];
    [[firstButton layer] setBorderColor:[[UIColor colorWithRed:0.2f green:0.2f blue:0.2f alpha:1.0f] CGColor]];
    [self.view addSubview:firstButton];

    secondButtons = [[NSMutableArray alloc] init];
    thirdButtons = [[NSMutableArray alloc] init];

    bigSpinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:
                  UIActivityIndicatorViewStyleWhiteLarge];

    UIWindow *topWindow = [[UIApplication sharedApplication] keyWindow];
    bigSpinner.center = topWindow.center;
    [topWindow addSubview:bigSpinner];

    [self loadOccasionImages];

    for (int i = 0; i < occasionImages.count; i++)
        [self updateBackgroundImageForButtonAtIndex:i];

    rotateImagesTimer = [NSTimer scheduledTimerWithTimeInterval:OCCASION_IMAGE_SWITCH_DELAY target:self selector:@selector(updateBackgroundImageForRandomButton) userInfo:nil repeats:YES];

    [self.controllerView setDisplaysHomeButtons:NO animated:NO];

    [self getOccasionsFromServer];

    // Registers this class as the delegate of the audio session.
    [[AVAudioSession sharedInstance] setDelegate:self];
    // Allow the app sound to continue to play when the screen is locked.
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
}

- (void)viewDidUnload
{
    for (UIButton *b in secondButtons) {
        [b removeFromSuperview];
    }
    for (UIButton *b in thirdButtons) {
        [b removeFromSuperview];
    }
    [thirdButtons removeAllObjects];
    [secondButtons removeAllObjects];
    thirdFontColor = nil;
    thirdLevelColor = nil;
    [super viewDidUnload];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [table reloadData];
}

- (void)viewWillDisappear:(BOOL)animated {
    [rotateImagesTimer invalidate];

    [super viewWillDisappear:animated];

    if (plRow >= 0) {
        [self stop];
    }
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    // force cells to re-layout

    [table performSelector:@selector(reloadData) withObject:nil afterDelay:0];
}

- (void)loadOccasionImages {
    NSBundle *bundle = [NSBundle rumblefishResourcesBundle];
    NSString *plistPath = [bundle pathForResource:@"occasion_image_cache" ofType:@"plist"];
    self.occasionImages = [NSArray arrayWithContentsOfFile:plistPath];
}

- (void)goBack {
    [audioPlayer pause];
    [self.navigationController popViewControllerAnimated:YES];

}

- (void)pushOccasionNamed:(NSString *)name {
    Occasion *occasion = [[occasions filter:^ BOOL (id o) { return [((Occasion *)o).name isEqual:name]; }] objectAtIndex:0];
    [occasionStack addObject:occasion];

    NSArray *children = occasion.children;

    for (int i=0; i < children.count; i++) {
        Occasion *child = [occasion.children objectAtIndex:i];

        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.tag = i;
        button.frame = CGRectMake(0, scroller.frame.size.height + i*129, self.view.bounds.size.width, 129);
        button.alpha = 0;
        button.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        button.backgroundColor = secondLevelColor;
        button.titleLabel.font = [UIFont systemFontOfSize:100];
        button.titleLabel.adjustsFontSizeToFitWidth = YES;
        [button setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
        [button setContentEdgeInsets:UIEdgeInsetsMake(0, 3, 0, 0)];
        [button setTitleColor:secondFontColor forState:UIControlStateNormal];
        [button setTitle:[child.name lowercaseString] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(showThirdLevel:) forControlEvents:UIControlEventTouchUpInside];
        [[button layer] setMasksToBounds:YES];
        [[button layer] setBorderWidth:0.5];
        [[button layer] setBorderColor:[[UIColor colorWithRed:0.2f green:0.2f blue:0.2f alpha:1.0f] CGColor]];
        [scroller addSubview:button];
        [secondButtons addObject:button];
    }
    scroller.contentSize = CGSizeMake(self.view.bounds.size.width, children.count * 129);
}

- (void)pushOccasion:(Occasion *)occasion {
    [occasionStack addObject:occasion];

    for (int i=0; i< occasion.children.count; i++) {
        Occasion *child = [occasion.children objectAtIndex:i];

        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.tag = i;
        button.frame = CGRectMake(0, 70 + scroller.bounds.size.height + i * 56, scroller.bounds.size.width, 56);
        button.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        button.backgroundColor = thirdLevelColor;
        button.titleLabel.font = [UIFont systemFontOfSize:50];
        button.titleLabel.adjustsFontSizeToFitWidth = YES;
        [button setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
        [button setContentEdgeInsets:UIEdgeInsetsMake(0, 3, 0, 0)];
        button.alpha = 0;
        [button setTitleColor:thirdFontColor forState:UIControlStateNormal];
        [button setTitle:[child.name lowercaseString] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(loadPlaylist:) forControlEvents:UIControlEventTouchUpInside];
        [[button layer] setMasksToBounds:YES];
        [[button layer] setBorderWidth:0.5];
        [[button layer] setBorderColor:[[UIColor colorWithRed:0.2f green:0.2f blue:0.2f alpha:1.0f] CGColor]];
        [scroller addSubview:button];
        [thirdButtons addObject:button];
    }
    scroller.contentSize = CGSizeMake(scroller.bounds.size.width, 70 + occasion.children.count * 56);

}

- (void)popOccasion {
    [self.occasionStack removeLastObject];
}

- (UIInterfaceOrientation)occasionControllerViewCurrentOrientation:(OccasionControllerView *)controllerView {
    return self.interfaceOrientation;
}

- (void)occasionControllerView:(OccasionControllerView *)controllerView tappedHomeButtonAtIndex:(NSUInteger)index {
    switch (index) {
        case 0:
            firstLevelColor = [UIColor colorWithRed:0.55f green:0.32f blue:0.68f alpha:1.0f];
            secondLevelColor = [UIColor colorWithRed:0.51f green:0.4f blue:0.58f alpha:1.0f];
            thirdLevelColor = [[UIColor alloc] initWithRed:0.506f green:0.45f blue:0.53f alpha:1.0f];
            secondFontColor = [UIColor colorWithRed:0.26f green:0.219f blue:0.278f alpha:1.0f];
            thirdFontColor = [[UIColor alloc] initWithRed:0.26f green:0.223f blue:0.282f alpha:1.0f];
            [firstButton setTitle:@"mood" forState:UIControlStateNormal];
            [self pushOccasionNamed:@"Moods"];
            break;

        case 1:
            firstLevelColor = [UIColor colorWithRed:0.33f green:0.537f blue:0.156f alpha:1.0f];
            secondLevelColor = [UIColor colorWithRed:0.455f green:0.6f blue:0.33f alpha:1.0f];
            thirdLevelColor = [[UIColor alloc] initWithRed:0.474f green:0.537f blue:0.42f alpha:1.0f];
            secondFontColor = [UIColor colorWithRed:0.235f green:0.337f blue:0.152f alpha:1.0f];
            thirdFontColor = [[UIColor alloc] initWithRed:0.231f green:0.278f blue:0.192f alpha:1.0f];
            [firstButton setTitle:@"celebration" forState:UIControlStateNormal];
            [self pushOccasionNamed:@"Celebrations"];
            break;

        case 2:
            firstLevelColor = [UIColor colorWithRed:0.66f green:0.576f blue:0.157f alpha:1.0f];
            secondLevelColor = [UIColor colorWithRed:0.71f green:0.64f blue:0.317f alpha:1.0f];
            thirdLevelColor = [[UIColor alloc] initWithRed:0.74f green:0.686f blue:0.435f alpha:1.0f];
            secondFontColor = [UIColor colorWithRed:0.455f green:0.4f blue:0.157f alpha:1.0f];
            thirdFontColor = [[UIColor alloc] initWithRed:0.443f green:0.4f blue:0.21f alpha:1.0f];
            [firstButton setTitle:@"themes" forState:UIControlStateNormal];
            [self pushOccasionNamed:@"Themes"];
            break;

        case 3:
            firstLevelColor = [UIColor colorWithRed:0.243f green:0.654f blue:0.63f alpha:1.0f];
            secondLevelColor = [UIColor colorWithRed:0.455f green:0.73f blue:0.713f alpha:1.0f];
            thirdLevelColor = [[UIColor alloc] initWithRed:0.6f green:0.713f blue:0.706f alpha:1.0f];
            secondFontColor = [UIColor colorWithRed:0.28f green:0.46f blue:0.455f alpha:1.0f];
            thirdFontColor = [[UIColor alloc] initWithRed:0.35f green:0.44f blue:0.435f alpha:1.0f];
            [firstButton setTitle:@"current events" forState:UIControlStateNormal];
            [self pushOccasionNamed:@"Current Events"];
            break;

        case 4:
            firstLevelColor = [UIColor colorWithRed:0.192f green:0.388f blue:0.63f alpha:1.0f];
            secondLevelColor = [UIColor colorWithRed:0.31f green:0.45f blue:0.627f alpha:1.0f];
            thirdLevelColor = [[UIColor alloc] initWithRed:0.5f green:0.584f blue:0.69f alpha:1.0f];
            secondFontColor = [UIColor colorWithRed:0.168f green:0.282f blue:0.427f alpha:1.0f];
            thirdFontColor = [[UIColor alloc] initWithRed:0.274f green:0.34f blue:0.423f alpha:1.0f];
            [firstButton setTitle:@"sports" forState:UIControlStateNormal];
            [self pushOccasionNamed:@"Sports"];
            break;

        case 5:
            firstLevelColor = [UIColor colorWithRed:0.647f green:0.2f blue:0.2f alpha:1.0f];
            secondLevelColor = [UIColor colorWithRed:0.745f green:0.32f blue:0.32f alpha:1.0f];
            thirdLevelColor = [[UIColor alloc] initWithRed:0.75f green:0.455f blue:0.455f alpha:1.0f];
            secondFontColor = [UIColor colorWithRed:0.51f green:0.172f blue:0.172f alpha:1.0f];
            thirdFontColor = [[UIColor alloc] initWithRed:0.5f green:0.21f blue:0.21f alpha:1.0f];
            [firstButton setTitle:@"holiday" forState:UIControlStateNormal];
            [self pushOccasionNamed:@"Holidays"];
            break;
    }

    firstButton.backgroundColor = firstLevelColor;
    firstButton.titleLabel.textColor = [UIColor whiteColor];
    [self showSecondLevel];
}

- (void)animateToHomeScreen {
    while (occasionStack.count)
        [self popOccasion];

    // stop if playing
    if (plRow >= 0) {
        [self stop];
    }

    [UIView animateWithDuration:0.5 animations:^ {
            firstButton.alpha = 0;
            table.alpha = 0;
            for (UIButton *b in secondButtons) {
                b.frame = CGRectMake(0, b.frame.origin.y+scroller.bounds.size.height, scroller.bounds.size.width, 129);
                b.alpha = 0;
            }
            for (UIButton *b in thirdButtons) {
                b.frame = CGRectMake(0, b.frame.origin.y+scroller.bounds.size.height, scroller.bounds.size.width, 56);
                b.alpha = 0;
            }
        }
        completion:^(BOOL finished){
            scroller.hidden = YES;
            [self.controllerView setDisplaysHomeButtons:YES animated:YES];
            [thirdButtons removeAllObjects];
            [secondButtons removeAllObjects];
            [table reloadData];
        }];
    level = 1;
}

- (void)showSecondLevel {
    [self.controllerView setDisplaysHomeButtons:NO animated:YES];
    scroller.hidden = NO;
    [UIView animateWithDuration:0.5 animations:^{
        firstButton.alpha = 1.0;
        for (UIButton *b in secondButtons) {
            b.alpha = 1.0;
            b.frame = CGRectMake(0, b.frame.origin.y - scroller.frame.size.height + firstButton.frame.size.height, scroller.frame.size.width, 129);
        }
    }];
    level = 2;
}

- (void)showThirdLevel:(UIButton *)button {
    int tag = [button tag];

    if (level == 2) {
        replaySong = NO;
        Occasion *parent = [occasionStack objectAtIndex:0];
        Occasion *child = [parent.children objectAtIndex:button.tag];
        [self pushOccasion:child];

        button.titleLabel.font = [UIFont systemFontOfSize:32];
        [UIView animateWithDuration:0.5 animations:^{
            //move
            secondRect = button.frame;
            button.frame = CGRectMake(0, 35, scroller.bounds.size.width, 35);
            for (UIButton *b in secondButtons) {
                if ([b tag] != tag) {
                    b.frame = CGRectMake(0, b.frame.origin.y+scroller.bounds.size.height, scroller.bounds.size.width, 129);
                    b.alpha = 0;
                }
            }
        } completion:^(BOOL finished){
            [UIView animateWithDuration:0.5 animations:^{
                for (UIButton *b in thirdButtons) {
                    b.alpha = 1.0;
                    b.frame = CGRectMake(0, b.frame.origin.y-scroller.bounds.size.height, scroller.bounds.size.width, 56);
                }
            }];
        }];
        level = 3;
    }
    else if (level == 3 || level == 4) {  //opposite direction of level 2
        [self popOccasion];
        // stop if playing
        if (plRow >= 0) {
            [self stop];
        }

        [UIView animateWithDuration:0.5 animations:^{
            table.alpha = 0;
            for (UIButton *b in thirdButtons) {
                b.alpha = 0;
                b.frame = CGRectMake(0, b.frame.origin.y+scroller.bounds.size.height, scroller.bounds.size.width, 56);
            }
        }
        completion:^(BOOL finished) {
            for (UIButton *b in thirdButtons) {
                [b removeFromSuperview];
            }
            [UIView animateWithDuration:0.5 animations:^{
                //move
                button.frame = CGRectMake(0, secondRect.origin.y, scroller.bounds.size.width, 129);
                for (UIButton *b in secondButtons) {
                    if ([b tag] != tag) {
                        int index = [secondButtons indexOfObject:b];
                        b.frame = CGRectMake(0, 35 + index * 129, scroller.bounds.size.width, 129);
                        b.alpha = 1.0;
                    }
                }
                scroller.contentSize = CGSizeMake(scroller.bounds.size.width, 35 + [secondButtons count] * 129);
            }];
            button.titleLabel.font = [UIFont systemFontOfSize:100];
            [table reloadData];
            [thirdButtons removeAllObjects];
        }];
        level = 2;
    }
}

- (void)fetchPlaylistsForOccasion:(Occasion *)occasion {

    Producer mediaForOccasion =
        [Async continueAfterProducer:[[RFAPI singleton] getOccasion:occasion.ID] withSelector:^ Producer (id result) {
            self.displayedOccasion = (Occasion *)result;

            return [[displayedOccasion.playlists map:^ id (id p) {
                return [[RFAPI singleton] getPlaylist:((Playlist *)p).ID];
            }] parallelProducer];
        }];

    [loadingIndicator startAnimating];

    [self associateProducer:mediaForOccasion callback:^ void (id result) {
        self.displayedPlaylists = (NSArray *)result;
        [table reloadData];
        table.alpha = 1.0;
        [loadingIndicator stopAnimating];
        // play same song if needed
        if (replaySong && plRow>=0 && plSection>=0) {
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:plRow inSection:plSection];
            [table selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
            [table.delegate tableView:table didSelectRowAtIndexPath:indexPath];
        }
    }];
}

- (void)loadPlaylist:(UIButton *)button {
    thirdButton = button;
    int tag = [button tag];
    if (level == 3) {

        Occasion *parent = [occasionStack objectAtIndex:1];
        Occasion *child = [parent.children objectAtIndex:tag];

        [self fetchPlaylistsForOccasion:child];

        button.titleLabel.font = [UIFont systemFontOfSize:32];
        [UIView animateWithDuration:0.5 animations:^{
            //move
            thirdRect = button.frame;
            button.frame = CGRectMake(0, 70, scroller.bounds.size.width, 35);
            for (UIButton *b in thirdButtons) {
                if ([b tag] != tag) {
                    b.frame = CGRectMake(0, b.frame.origin.y+scroller.bounds.size.height, scroller.bounds.size.width, 56);
                    b.alpha = 0;
                }
            }
            scroller.contentSize = CGSizeMake(scroller.bounds.size.width, table.frame.size.height);
        }];
        level = 4;
    }
    else {  // opposite direction of level 3
        // stop if playing
        if (plRow >= 0) {
            [self stop];
        }

        button.titleLabel.font = [UIFont systemFontOfSize:50];
        [UIView animateWithDuration:0.5 animations:^{
            table.alpha = 0;
            //move
            button.frame = CGRectMake(0, thirdRect.origin.y, scroller.bounds.size.width, 56);
            for (UIButton *b in thirdButtons) {
                if ([b tag] != tag) {
                    int index = [thirdButtons indexOfObject:b];
                    b.frame = CGRectMake(0, 70 + 56 * index, scroller.bounds.size.width, 56);
                    b.alpha = 1;
                }
            }
        }
        completion:^(BOOL finished) {
            self.displayedOccasion = nil;
            self.displayedPlaylists = nil;
            [table reloadData];
            scroller.contentSize = CGSizeMake(scroller.bounds.size.width, 70 + thirdButtons.count * 56);
        }];
        level = 3;
    }
}

- (void)addToPlaylist:(UIButton *)button {
    int row = [[table indexPathForCell:(UITableViewCell *)[[button superview] superview]] row];
    int section = [[table indexPathForCell:(UITableViewCell *)[[button superview] superview]] section];

    Media *currentMedia = [((Playlist *)[displayedPlaylists objectAtIndex:section]).media objectAtIndex:row];
    [[LocalPlaylist sharedPlaylist] addToPlaylist:currentMedia];

    button.hidden = YES;
    [[button superview] viewWithTag:8].hidden = NO;
}

- (void)removeFromPlaylist:(UIButton *)button {
    int row = [[table indexPathForCell:(UITableViewCell *)[[button superview] superview]] row];
    int section = [[table indexPathForCell:(UITableViewCell *)[[button superview] superview]] section];

    Media *currentMedia = [((Playlist *)[displayedPlaylists objectAtIndex:section]).media objectAtIndex:row];
    [[LocalPlaylist sharedPlaylist] removeFromPlaylist:currentMedia];

    button.hidden = YES;
    [[button superview] viewWithTag:5].hidden = NO;
}

- (void)gotoPlaylist {
    if (plRow >= 0) {
        [self stop];
    }
    if (playlist == nil) {
        playlist = [[PlaylistVC alloc] init];
    }
    [self.navigationController pushViewController:playlist animated:YES];
}

- (void)updateBackgroundImageForButtonAtIndex:(NSUInteger)index {
    NSUInteger randomIndex = arc4random() % ((NSArray *)self.occasionImages[index]).count;
    UIButton *button = self.controllerView.rootButtons[index];
    [button setBackgroundImage:[UIImage imageWithData:self.occasionImages[index][randomIndex]] forState:UIControlStateNormal];
}

- (void)updateBackgroundImageForRandomButton {
    NSUInteger randomIndex = arc4random() % self.controllerView.rootButtons.count;
    [self updateBackgroundImageForButtonAtIndex:randomIndex];
}

- (void)getOccasionsFromServer {
    [loadingIndicator startAnimating];

    // we're going to filter out occasions whose names aren't among these:
    NSArray *displayedOccasionNames = [NSArray arrayWithObjects:@"Celebrations", @"Current Events", @"Holidays", @"Moods", @"Sports", @"Themes", nil];

    [self associateProducer:[[RFAPI singleton] getOccasions] callback:^ (id results) {
        self.occasions = [((NSArray *)results) filter:^ BOOL (id o) {
            return [displayedOccasionNames any:^ BOOL (id n) {
                return [((Occasion *)o).name isEqual:n];
            }];
        }];

        [loadingIndicator stopAnimating];
        [self.controllerView setDisplaysHomeButtons:YES animated:YES];
    }];
}

#pragma mark - TableView methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return displayedPlaylists.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return ((Playlist *)[displayedPlaylists objectAtIndex:section]).media.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MoodCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.contentView.backgroundColor = [UIColor colorWithRed:0.1686f green:0.1686f blue:0.1686f alpha:1.0f];

        UIImage *horImage = [UIImage imageInResourceBundleNamed:@"separator_horizontal.png"];
        UIImageView *horSeparator = [[UIImageView alloc] initWithImage:horImage];
        horSeparator.frame = CGRectMake(0, 0, horImage.size.width, horImage.size.height);
        horSeparator.tag = 1;
        [cell.contentView addSubview:horSeparator];

        UIImage *verImage = [UIImage imageInResourceBundleNamed:@"separator_vertical.png"];
        UIImageView *verSeparator = [[UIImageView alloc] initWithImage:verImage];
        verSeparator.frame = CGRectMake(45, 1, verImage.size.width, verImage.size.height);
        verSeparator.tag = 2;
        [cell.contentView addSubview:verSeparator];

        UILabel *indexLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 45, 44)];
        indexLabel.tag = 3;
        indexLabel.textColor = [UIColor whiteColor];
        indexLabel.textAlignment = NSTextAlignmentCenter;
        indexLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:14];
        indexLabel.backgroundColor = [UIColor clearColor];
        [cell.contentView addSubview:indexLabel];

        UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(49, 0, 232, 44)];
        titleLabel.tag = 4;
        titleLabel.textColor = [UIColor whiteColor];
        titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:14];
        titleLabel.numberOfLines = 2;
        titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
        titleLabel.backgroundColor = [UIColor clearColor];
        [cell.contentView addSubview:titleLabel];

        UIButton *addButton = [UIButton buttonWithType:UIButtonTypeCustom];
        addButton.tag = 5;
        UIImage *addImage = [UIImage imageInResourceBundleNamed:@"btn_add.png"];
        [addButton setImage:addImage forState:UIControlStateNormal];
        [addButton setFrame:CGRectMake(270, 0, 44, 44)];
        [addButton addTarget:self action:@selector(addToPlaylist:) forControlEvents:UIControlEventTouchUpInside];
        [cell.contentView addSubview:addButton];

        UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
        spinner.center = CGPointMake(22.5, 22);
        spinner.hidesWhenStopped = YES;
        spinner.tag = 6;
        [cell.contentView addSubview:spinner];

        UIButton *stopButton = [UIButton buttonWithType:UIButtonTypeCustom];
        stopButton.tag = 7;
        UIImage *stopImage = [UIImage imageInResourceBundleNamed:@"btn_stop.png"];
        [stopButton setImage:stopImage forState:UIControlStateNormal];
        [stopButton setFrame:CGRectMake(1, 0, 44, 44)];
        [stopButton addTarget:self action:@selector(stop) forControlEvents:UIControlEventTouchUpInside];
        stopButton.hidden = YES;
        [cell.contentView addSubview:stopButton];

        UIButton *tikButton = [UIButton buttonWithType:UIButtonTypeCustom];
        tikButton.tag = 8;
        UIImage *tikImage = [UIImage imageInResourceBundleNamed:@"song_check.png"];
        [tikButton setImage:tikImage forState:UIControlStateNormal];
        [tikButton setFrame:CGRectMake(280, 12, 22, 19)];
        [tikButton addTarget:self action:@selector(removeFromPlaylist:) forControlEvents:UIControlEventTouchUpInside];
        tikButton.hidden = YES;
        [cell.contentView addSubview:tikButton];

        UIView *colorBar = [[UIView alloc] initWithFrame:CGRectMake(cell.contentView.frame.size.width-5, 0, 5, cell.contentView.frame.size.height)];
        colorBar.tag = 9;
        [cell.contentView addSubview:colorBar];
    }

    UILabel *index = (UILabel *)[cell.contentView viewWithTag:3];
    index.text = [NSString stringWithFormat:@"%i", indexPath.row+1];
    UILabel *title = (UILabel *)[cell.contentView viewWithTag:4];
    Playlist *playlist = [displayedPlaylists objectAtIndex:indexPath.section];
    Media *media = ((Media *)[playlist.media objectAtIndex:indexPath.row]);
    title.text = media.title;

    [cell.contentView viewWithTag:5].hidden = NO;
    [cell.contentView viewWithTag:8].hidden = YES;

    if ([[LocalPlaylist sharedPlaylist] existsInPlaylist:media]) {
        [cell.contentView viewWithTag:5].hidden = YES;
        [cell.contentView viewWithTag:8].hidden = NO;
    }

    if (indexPath.row == plRow && indexPath.section == plSection) {
        [cell.contentView viewWithTag:3].hidden = YES;
        if (isPlaying) {
            [cell.contentView viewWithTag:7].hidden = NO;
            [(UIActivityIndicatorView *)[cell.contentView viewWithTag:6] stopAnimating];
        }
        else {
            [cell.contentView viewWithTag:7].hidden = YES;
            [(UIActivityIndicatorView *)[cell.contentView viewWithTag:6] startAnimating];
        }
    }
    else {
        [cell.contentView viewWithTag:3].hidden = NO;
        [cell.contentView viewWithTag:7].hidden = YES;
        [(UIActivityIndicatorView *)[cell.contentView viewWithTag:6] stopAnimating];
    }

    [cell.contentView viewWithTag:5].frame = CGRectMake(self.view.bounds.size.width - 44, 0, 44, 44);
    [cell.contentView viewWithTag:8].frame = CGRectMake(self.view.bounds.size.width - 33, 12, 22, 19);
    title.frame = CGRectMake(52, 0, self.view.bounds.size.width - 100, 44);

    CGRect horizontalLineFrame = [cell.contentView viewWithTag:1].frame;
    horizontalLineFrame.size.width = tableView.bounds.size.width;
    [cell.contentView viewWithTag:1].frame = horizontalLineFrame;

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // revert previous cell changes
    UILabel *index = (UILabel *)[selectedCell.contentView viewWithTag:3];
    index.hidden = NO;
    if (audioPlayer != nil) {
        [audioPlayer pause];
    }
    UIButton *stop = (UIButton *)[selectedCell.contentView viewWithTag:7];
    stop.hidden = YES;
    UIActivityIndicatorView *spinner = (UIActivityIndicatorView *)[selectedCell.contentView viewWithTag:6];
    [spinner stopAnimating];
    isPlaying = NO;

    // change current cell views
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    index = (UILabel *)[cell.contentView viewWithTag:3];
    index.hidden = YES;
    spinner = (UIActivityIndicatorView *)[cell.contentView viewWithTag:6];
    [spinner startAnimating];
    selectedCell = cell;
    plRow = indexPath.row;
    plSection = indexPath.section;

    Playlist *playlist = [displayedPlaylists objectAtIndex:indexPath.section];
    Media *media = [playlist.media objectAtIndex:indexPath.row];
    playerItem = [[AVPlayerItem alloc] initWithURL:media.previewURL];
    [playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
    [playerItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
    audioPlayer = [[AVPlayer alloc] initWithPlayerItem:playerItem];
    [table reloadData];
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    Playlist *playlist = [displayedPlaylists objectAtIndex:section];

    UIImageView *header = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 60)];
    header.image = [UIImage imageInResourceBundleNamed:@"occasion_header_bg.png"];
    UIImageView *art = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 60, 60)];

    // XXX synchronous image download. gonna need to extract a view class here.
    if (playlist.image)
        art.image = playlist.image;
    [header addSubview:art];

    UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, 260, 20)];
    title.textColor = [UIColor whiteColor];
    title.font = [UIFont boldSystemFontOfSize:16];
    title.backgroundColor = [UIColor clearColor];
    title.text = playlist.title;
    [header addSubview:title];

    UILabel *description = [[UILabel alloc] initWithFrame:CGRectMake(60, 20, 260, 40)];
    description.textColor = [UIColor whiteColor];
    description.font = [UIFont systemFontOfSize:16];
    description.backgroundColor = [UIColor clearColor];
    description.text = playlist.strippedEditorial;
    description.numberOfLines = 0;
    [header addSubview:description];
    return header;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 60;
}

- (void)playerItemDidReachEnd:(NSNotification *)notification {
    UIButton *stop = (UIButton *)[selectedCell.contentView viewWithTag:7];
    stop.hidden = YES;
    plRow = -1;
    plSection = -1;
    UILabel *index = (UILabel *)[selectedCell.contentView viewWithTag:3];
    index.hidden = NO;

    [playerItem removeObserver:self forKeyPath:@"playbackLikelyToKeepUp"];
    [playerItem removeObserver:self forKeyPath:@"status"];
    playerItem = nil;
    audioPlayer = nil;
    [table reloadData];
}

- (void)stop {
//    NSLog(@"start stop -- SHOULD NOT BE REACHED");

    [audioPlayer pause];
    [self playerItemDidReachEnd:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    AVPlayerItem *item = (AVPlayerItem *)object;
    if ([keyPath isEqualToString:@"status"]) {
        if ([item status] == AVPlayerItemStatusFailed) {
            UIActivityIndicatorView *spinner = (UIActivityIndicatorView *)[selectedCell.contentView viewWithTag:6];
            [spinner stopAnimating];

            UILabel *index = (UILabel *)[selectedCell.contentView viewWithTag:3];
            index.hidden = NO;
            NSLog(@"Error:%@", [item.error description]);

            [playerItem removeObserver:self forKeyPath:@"playbackLikelyToKeepUp"];
            [playerItem removeObserver:self forKeyPath:@"status"];
            playerItem = nil;
            audioPlayer = nil;
            [table reloadData];

            // reload playlist
            level = 3;
            replaySong = YES;
            [self loadPlaylist:thirdButton];
        }
        return;
    }
    if ([keyPath isEqualToString:@"playbackLikelyToKeepUp"]) {
        if (item.playbackLikelyToKeepUp) {
            [audioPlayer play];
            UIActivityIndicatorView *spinner = (UIActivityIndicatorView *)[selectedCell.contentView viewWithTag:6];
            [spinner stopAnimating];
            isPlaying = YES;
            UIButton *stop = (UIButton *)[selectedCell.contentView viewWithTag:7];
            stop.hidden = NO;
            [table reloadData];
        }
        return;
    }

    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}

@end

redpajama_set_name: RedPajamaGithub


text:
La brousse est un type de végétation surtout tropicale, essentiellement composée de buissons, arbustes et plantes herbacées . Elle se distingue de la savane qui est une forme de  parfois parsemée d'arbres isolés ou groupés en bosquets.

Par extension, le terme de brousse désigne en Afrique un espace situé loin des centres urbains, un sens similaire à l'anglais bush, et qui a donné son nom au « taxi-brousse ». En français métropolitain, ce sens a fini par s'appliquer à toute campagne isolée, ou « bled ».

Étymologie
Le terme de brousse est certainement un emprunt (1876) au provençal « brousso » (brosse) et s'appliquait à l'origine à une formation buissonnante du Sud de la France.

Notes et références

Articles connexes
 Liste des formations végétales
 Biomes de brousses :
 Prairies, savanes et brousses tropicales et subtropicales ;
 Prairies, savanes et brousses tempérées ;
 Déserts et brousses xériques ;
 Prairies et brousses d'altitude.
Brousse (Nouvelle-Calédonie)

Formation végétale

redpajama_set_name: RedPajamaWikipedia


text:
Sauvaire Intermet, né vers 1573 à Tarascon, mort en 1657, à Avignon, est un musicien et compositeur français du .

Biographie
Originaire de Tarascon, Sauvaire est peut-être le fils de Giraud Antermet qui est baptisé le  en l'église Sainte-Marthe de Tarascon. Il est nommé clerc.

Sauvaire Intermet est nommé dès 1590 maître de musique de la cathédrale Saint-Trophime d'Arles, jusque vers 1595, époque à laquelle il semble s'être déplacé vers Avignon où il est déjà bénéficier du chapitre de Saint-Agricol.

Un acte du  le qualifie de « mestre de chapelle de la Reyne de France », probablement de Louise de Lorraine-Vaudemont (1553-1601), veuve d'Henri III et retirée à Chenonceaux ; il a pu à cette époque croiser des maîtres de la Chapelle ou de la Chambre du roi. Le , il est reçu chanoine du chapitre de Saint-Agricol d'Avignon et y prend la charge de maître de chapelle. Sa carrière dans cette église a duré plusieurs dizaines d'années ; elle est émaillée des incidents classiques de la vie d'une maîtrise, telle une procédure pour insultes proférées à l'encontre du maître des enfants en 1612. Le  il accède à la charge d'auditeur des comptes du chapitre de Saint-Agricol, qui oblige qu'il soit remplacé.

Sa carrière à Saint-Agricol subit quelques interruptions à Saint-Just de Narbonne en 1613-1614 et vers 1616, puis à Saint-Sauveur d'Aix-en-Provence de mars à  (il est réengagé le  à Avignon). Après son retour d'Aix-en-Provence en 1629 il reprend sa charge de maître de musique à Avignon, et le  celle d'auditeur des comptes.

Parallèlement à ces engagements, Intermet se met à la disposition de la Ville à l'occasion d'entrées royales ou d'autres événements majeurs. Pour un musicien la ville d'Avignon était un poste de choix, située dans les possessions pontificales et par là même sujette aux influences italiennes. Les Jésuites y sont très présents, avec un noviciat et un collège important qui s'est beaucoup renforcé lors de l'interdiction de l'ordre en France entre fin 1594 et 1603. Avignon constitue en fait une position avancée de l'influence pontificale en France et un bastion jésuite entouré de terres à dominante protestante. Intermet fut ici maître de chapelle, et musicien officiel de la cité et comté d'Avignon, chargé de l'animation musicale des cérémonies et des entrées royales, et probablement aussi maître de la musique au Collège des Jésuites. Ce triple statut lui a procuré une prééminence sensible sur les autres  musiciens avignonnais, sinon provençaux, puisqu'il s'est fixé là pour une période d'environ cinquante ans, particulièrement longue pour un maître de chapelle.

Des relevés d'archives le montrent qui adjoint une bande de violons à ses chanteurs pour renforcer la musique lors des fêtes solennelles ou des processions majeures. Plusieurs relations le citent dirigeant la musique lors de grandes célébrations, comme en novembre 1600 lors de l'entrée de Marie de Médicis pour laquelle il rassemble les chanteurs de toutes les chapelles d'Avignon, ou fin juillet 1622 lors des fêtes de la canonisation d'Ignace de Loyola et de François Xavier. Il intervient aussi en novembre 1622 lors de l'entrée de Louis XIII à Avignon (le roi fit faire une copie de la musique d'Intermet tant il en fut ravi).

Intermet fut aussi actif pour les confréries d'artisans ou de pénitents, souvent localisées dans la chapelle du Collège des Jésuites. Il fut sollicité pour diriger leurs services en musique ou leur composer des cantiques, comme le prouve un document de 1647 concernant la congrégation des artisans taffetassiers. À Avignon, il dut être en contact avec quelques personnages maintenant plus célèbres que lui : le Jésuite Athanasius Kircher (1602-1680), le musicien maîtrisien Annibal Gantez (c. 1600 – 1668), ou Nicolas Saboly (1614-1675), célèbre compositeur de noëls.

Intermet teste la première fois le , étant alors malade ; il prévoit à cette occasion une messe des morts annuelle et quelques dons. Un nouveau testament intervint le , qui prévoit son ensevelissement à Avignon ou à Tarascon selon la place où il décède. Il constitue enfin son neveu Michel Intermet son exécuteur testamentaire et meurt peu après le  âgé de 84 ans. François Béraud, organiste à Saint-Agricol depuis 1654, lui succède à la charge de maître de musique.

Œuvres
Son œuvre est majoritairement perdue ou fragmentaire et reste donc difficile à apprécier.

Chansons
 4 chansons en français, 4 v. in Ms. Bayle, c. 1597 (perdu, cité par Gastoué 1904).

Noëls et cantiques
 Cantiques pour l'entrée de Marie de Médicis, 1600.
 Là ça qui veut voir un dieu enfant 4v ? Chicago NL : Case MS 5136
 Quand l'œil de Jesus je voy 4-8v Chicago NL : Case MS 5136
 Noëls 2v, anonymes et en partie par Intermet, Avignon Ms. 1250 et Ms. 1181, copiés vers 1653-1664.
 Cantiques spirituels à l'usage de la Congrégation des jeunes artisans érigée à Avignon (Lyon : Antoine Molin, 1653 (musique impr. par Robert III Ballard), perdus.
 Intermet pourrait avoir contribué à la musique adaptée aux Hymnes et cantiques de Michel Coyssard (Anvers, 1600, et Paris, 1623/1655).

Messes
 Missa pro defunctis, 1613, perdue, citée dans Robert 1966 p. 628.
 Missa pour les Minimes, perdue, citée par Robert 1965.
 Missa 8 v In devotione, perdue.
 Missa 6 v, perdue, toutes deux citées par Dufourcq 1958.

Motets
La plupart de ses motets connus sont conservés dans 5 parties séparées, vestiges d'un ensemble de 12, récemment découverts dans la collection H. M. Brown à Chicago, auxquels on peut adjoindre une partie isolée provenant d'un autre recueil de même origine. Ces motets sont écrits sur des psaumes, des hymnes, prières, répons, versets ou antiennes divers.

Parmi ces derniers, la plupart concernent la liturgie des vendredi et samedi saints. Pour le reste, il est largement fait appel au procédé de la centonisation, avec des versets extraits notamment de Jean 6, Isaïe, et de l'Ecclésiaste. Ce recueil contient sept motets à la louange de grandes figures jésuites : Ignace de Loyola, François Xavier et François Borgia.

Les dates trouvées dans ce recueil mentionnent les années 1622, 1623 et 1624 ; il est dès lors évident qu'une partie de ces motets a pu être composée pour les fêtes de la canonisation conjointe des saints Ignace de Loyola et François Xavier, en 1622, comme avec celles de la béatification de François Borgia en  (et on sait par les témoignages ci-dessus qu'Intermet avait pris une part active à leur célébration).

La musique est d'un style contrapuntique, assez monnayé, avec parfois des sections très homophoniques, en style de faux-bourdon ou de "contrepoint simple".

Ce recueil contient aussi des preuves de la pratique polychorale déjà relatée dans les témoignages de 1600 et 1622 : écriture à deux ou trois chœurs, apparition précoce des petits chœurs de solistes en opposition au grand chœur, parfois une structure refrain-couplet qui se prête naturellement à la spatialisation. Il fournit un témoignage unique de la musique qui pouvait être interprétée dans les célébrations jésuites à Avignon au début du .

Réception
La renommée d'Intermet fut grande, et d'autant plus significative qu'après 1600 il semble n'être jamais sorti de sa Provence natale et que ses œuvres ne furent presque jamais imprimées. Annibal Gantez le cite en 1643 à l'égal d'Eustache Du Caurroy ou de Claude Le Jeune ; le jésuite Antoine Parran le cite également dans son Traité de musique de 1639.

Notes

Bibliographie
 Giorgio Chatrian, Il fondo musicale della biblioteca capitolare di Aosta. Torino : Centro Studi Piemontesi, 1985.
 Norbert Dufourcq, « Un inventaire de la musique religieuse de la Collégiale Notre-Dame d'Annecy, 1661 », Revue de Musicologie 41 (1958), .
 Henri-André Durand, « Les instruments dans la musique sacrée au chapitre collégial Saint-Agricol d'Avignon », Revue de Musicologie 52/1 (1966) .
 Amédée Gastoué, « La musique à Avignon et dans le Comtat du XIVe au XVIIIe siècle », Rivista musicale italiana 11 (1904) , 554-578, 768-777. Reprint dans La vie musicale dans les provinces françaises, IV (1980) .
 Laurent Guillo, « Un recueil de motets de Sauvaire Intermet (Avignon, c. 1620-1625) : Chicago, Newberry Library, Case MS 5136 »,  siècle, 232 () .
 Laurent Guillo, Pierre I Ballard et Robert III Ballard, imprimeurs du roy pour la musique (1599-1673). – Sprimont et Versailles : 2003. 2 vol. Supplément en ligne sur le site du CMBV (Cahiers Philidor 33).
 Denise Launay, « Les motets à double chœur en France dans la première moitié du XVIIe siècle », Revue de musicologie, 40 (1957) .
 Margaret McGowan, « Les Jésuites à Avignon : les fêtes au service de la propagande politique et religieuse », Les Fêtes de la Renaissance III : actes du Quinzième colloque international d'études humanistes (Tours, 10-). (Paris : 1975), .
Joseph d'Ortigue, La Musique à l'église. - Paris : Didier, 1861.
Félix Raugel, « La maîtrise et les orgues de la Primatiale Saint-Trophime d'Arles », Recherches sur la musique classique française 2 (1962), p.  P· 102.
 Jean Robert, « Maîtres de chapelle à Avignon, 1610-1675 », Revue de musicologie 51/2 (1965), .
 Jean Robert, « La maîtrise Saint-Agricol d'Avignon au  siècle », Actes du  Congrès national des sociétés savantes (Nice, 1965), Section d'histoire moderne et contemporaine, 3 : De la Restauration à nos jours, histoire de l'art, Paris, 1966, 609-635.

Liens externes

Personnalité provençale du XVIIe siècle
Compositeur français de la période baroque
Naissance en 1573
Naissance à Tarascon (Bouches-du-Rhône)
Décès en octobre 1657
Décès à Avignon
Intermet


text:
Find Poly
Consider a set of line segments in a 2D plane.
For any set of line segments $L$, define $P(L)$ as the set of all endpoints of the line segments in $L$.
Two line segments are said to be connected if they share an endpoint.
Given a set of line segments $U$, we say that a geometric figure ("figure" for short) is a set $S$ of one or more line segments, $S \subseteq U$, for which
for any two points $p_1$ and $p_2$ in $P(S)$, we can reach $p_2$ from $p_1$ by tracing along one or more connected line segments, and
for every line segment $e$ in $S$, all line segments of $U$ that are connected to $e$ are also in $S$.
A polygon is a geometric figure $S$ for which it is possible to trace a path starting from some endpoint $p$ and ending at $p$ using every line segment in $S$ exactly once and visiting each point in $P(S)$ other than $p$, exactly once, visiting $p$ only at the beginning and end of the path.
See Figure 1 which has $10$ figures of which $a$, $b$, $e$, and $f$ are polygons. The dots are the end points of the line segments.
Figure 1: $10$ figures, $4$ polygons
Note that $b$ is self-intersecting but that the intersection is not at the end points of the intersecting line segments. Similarly $c$ and $d$ as well as $e$ and $f$ intersect but are not connected.
Your task is to count the total number of figures and identify how many are polygons.
The input is a series of lines terminated by end-of-file. Each line will have one or more line segments of the form:
(x1,y1),(x2,y2);
where (x1,y1) is one end point and (x2,y2) is the other end point, and $0 \leq x1, y1, x2, y2 \leq 99$. All coordinates are integers.
The separator characters, "(),;", may be preceded or followed by white space. A line may be at most $100$ characters long.
There will be at most $200$ line segments. A given line segment will only appear once in the input and none will be of length $0$.
Line segments are not directed so the order of the end points in the line segment is not significant. The order of the line segments in the input is also not significant.
Print a single line containing two integers separated by a single space. The first number should be the total number of figures and the second should be the number of polygons found.
In the first example below, the points correspond to the picture in Figure 1.
Sample Input 1
Sample Output 1
(84,84),(78,84);(68,60),(64,64);(20,85),(15,88);(0,0),(2,8);
(30,60),(30,66);(13,40),(18,38);(15,88),(15,95);(18,38),(8,38);
(31,7),(25,10);(30,66),(26,70);(40,14),(30,19);(5,85),(15,88);
(48,20),(56,26);(84,84),(84,82);(66,82),(70,86);(15,95),(25,90);
(70,86),(66,88);(59,23),(50,27);(15,88),(5,80);(78,84),(74,82);
(60,80),(66,82);(5,85),(5,80);(25,10),(40,14);(20,85),(25,90);
(5,85),(15,95);(0,0),(10,4);(10,30),(14,30);(74,82),(70,86);
(10,30),(12,43);(6,10),(10,4);(5,80),(20,85);(6,10),(2,8);
(60,80),(66,88);(84,82),(74,82);(12,43),(13,36);
(45,26),(88,34);(39,6),(67,8);(73,52),(92,38);(63,35),(18,61);
(34,23),(46,10);(2,75),(86,47);(26,18),(95,36);(59,78),(49,95);
(63,95),(67,80);(23,12),(33,46);(33,1),(46,10);(63,78),(2,75);
(2,33),(11,31);(99,98),(18,5);(88,34),(49,95);(25,43),(46,10);
(66,1),(2,75);(17,59),(2,33);(85,7),(85,59);(51,56),(63,95);
(1,48),(46,7);(66,49),(57,84);(59,78),(63,35);(0,49),(69,83);
(75,82),(51,56);(67,8),(92,38);(25,43),(86,47);(54,33),(12,42);
(85,7),(73,52);(1,48),(99,98);(53,26),(11,31);(34,23),(86,47);
(22,91),(55,59);(23,12),(75,6);(66,1),(33,1);(33,46),(97,41);
(87,12),(66,49);(92,38),(8,19);(54,33),(97,41);(45,26),(7,53);
(39,6),(85,59);(63,78),(34,23);(76,9),(18,5);(67,80),(17,59);
(25,43),(66,1);(75,82),(53,26);(0,49),(18,61);(12,42),(19,3);
(33,1),(63,78);(76,9),(46,7);(8,19),(84,90);(8,19),(37,92);
Submit Stats
Problem ID: findpoly
CPU Time limit: 1 second
Memory limit: 1024 MB
Difficulty: 4.2
Sample data files
Source: 2018 ICPC Mid-Atlantic Regional Contest

redpajama_set_name: RedPajamaCommonCrawl


Alana Baker joined the Hotel Association of Canada as Director of Government Relations in the spring of 2017 to further develop its growing advocacy portfolio, advancing the interests of the Association's members with federal, provincial and municipal governments.
An award-winning government relations, public relations and communications professional, Alana Baker has over 12 years of experience and a proven track record of executing high impact advocacy and public relations campaigns.
As a consultant, Alana has provided public affairs advice to clients throughout North America. In 2010, Alana was selected by Manhattan-based publication PR News as one of the top "15-to-Watch", in recognition of her outstanding contributions to the public relations field.


This patient flew in from across the country to resolve her issue non-surgically as this was a reoccurring condition. The Aspen Center offers this treatment for qualified patients in the form of a one week Fast Track.
2 treatments a day x 5 days (1 week). (Mon-Fri) Fly in on a weekend, fly out the following weekend.
For patients that qualify ( Must do Advanced Online Evaluation first) you may be able to receive treatment in our Main South Florida Facility that offers a compressed Fast Track Program (not available in all locations) in which you receive The Aspen Treatment twice a day x 5 days. Essentially, patients fly in on a weekend, receive a week of treatment, then fly out the following weekend.
Aspen Rehabilitation will be happy to help accommodate our out of town guests with travel and lodging. Please call the main office number first to coordinate your first visit prior to making hotel or travel reservations.Once arranged please see the below information for local hotel and lodging available.
We look forward to meeting you and wish you safe travels.
CLICK THE LOGOS BELOW to register in one of the two closest hotels to our Coral Springs location.
We highly suggest a rental car for travel between FLL Airport and our location.
Click Here to see your rental car options.
For our out of Town Guests We recommended arriving at Fort Lauderdale Airport (FLL) and using go shuttle for Transportation, if a rental car is not an option.
DO NOT reserve hotel, flight, car or make travel arrangements until you make and confirm all your scheduled appointments with Aspen After Surgery Center.


Here are our photos from the charity car show organized by Keystone Ford, Winnipeg Heights and the Winnipeg Harvest.
The weather was perfect for a car show and everything went smoothly! Congratulations to all the winners and our friends including Rey with the CRX, Richie with the STi and Will with the Civic Si.


Our commission would be to serve our customers and clientele with very best excellent and aggressive portable digital products for 0 10v Led Driver 350ma , 0-10v Led Driver 240w , 0-10v Led Driver , which assistance us usually be clients' very first choice.
"Reliable top quality and great credit score standing are our principles, which will help us at a top-ranking position. Adhering on the tenet of ""quality first, consumer supreme"" for 0 10v Led Driver 350ma , 0-10v Led Driver 240w , 0-10v Led Driver , To create more creative goods maintain high-quality products and solutions and update not only our goods but ourselves so as to keep us ahead of the world and the last but most vital one: to make every client satisfied with everything we offer you and to grow stronger together. To be the real winner starts here!