Today, Phil's guest is Denise Jacobs. She has been working in the IT industry since 1996. Over that time, she has been a developer, designer, writer, speaker and mentor. Right now her focus is on teaching, in particular helping others to recognize and overcome self-doubt. A positive step that frees developers and programmers to be more creative and excel at what they do.
(1.08) – So Denise, can you expand on that brief introduction and tell us a little bit more about yourself? Denise explained that she started web design when the web was really young in 1996. She worked for Microsoft and several other companies. In the end, she realized that what she really liked doing was teaching. So, she started teaching web design and development at Seattle Central Community College. When she moved to Miami she worked at a software company that produced a CMS. That experience made her realize she really wanted to work for herself. She also started speaking at conferences. Around the same time, in 2009, she was asked to write a book. The CSS Detective Guide was a big success. Writing it and speaking about it got Denise more interested in the creative process. So she started to talk publicly about that side of IT work. Her latest book is about silencing your inner critic, so you can unlock your creativity and get into a flow state so that you can do your best work.
(4.47) – Do you feel that writing the original book was that reason for getting into this more creative area? Denise explained that it was really the catalyst. The process of writing the book made Denise realize that she had crippling self-doubt. She was always seeking validation, questioning her developer and writing ability. Worrying about how she was perceived. Writing the book got Denise to the stage where she finally felt comfortable with her work.
(7.48) – Phil asks Denise for a unique IT career tip. Denise's advice is to "be your brilliance" – tune into what you do well and focus on that. Unfortunately, we rarely recognize that we are good at something, especially if it is really easy for us to do. She gave the example of a gymnast. They will think nothing of balancing on a beam and not really think about the fact that doing that requires a good sense of balance. Yet, the fact is that they have an excellent sense of balance, something which is obvious to everyone else. To identify their brilliance, Denise advises people to – "think back to the last time that you did something that was so enjoyable that you lost time." If you were so consumed that you forgot to eat or use the bathroom you were, likely, in a flow state and working in one of your areas of brilliance.
(9.50) – Denise is asked to share her worst career moment by Phil. In one job Denise was singled out by one of her managers for "special treatment", but, not in a good way. The company had a flexible working policy. Yet, her manager bullied her into coming in before 9 am and staying late. For Denise it was an awful time. It did not matter how many sacrifices she made her efforts were not recognized. Instead, she was demeaned. For example, one of her project managers was an introvert, so she ended up picking up the slack quite a bit. Effectively she became the de-facto manager. Despite assuming all of the stress and much of the physical work, when presents were handed out to everyone all she got was a joke gift of a date ball. That was it; Denise saw the light and took a step back.
(14.08) – Phil asks Denise what her best career moment was. For Denise becoming a public speaker has turned out to be a highlight. It has opened up a whole new world for her and enabled her to meet and help so many wonderful people.
(15.36) – Phil asks Denise what excites her about the future of the IT careers. The opportunities are huge. Recently, an HR manager told her that a lot of positions are going unfilled. So, there is plenty of work available. More importantly, there is room for innovation and creativity. The possibilities and opportunities are huge.
(16.32) – What drew you to a career in IT? Actually, Denise fell into an IT career by accident. While working at the University of Washington, she realized that the website was not getting updated. So, she sought out the person who was responsible for the website and discovered they were no longer keen to work on it. So, Denise learned HTML and a few other skills and took over. That was the beginning of her IT career.
(18.10) – What is the best career advice you have been given? Denise says it is important to surround yourself with people who are ahead of you. She called them "opportunity models", people that can help you to recognize the possibilities and opportunities.
(18.42) – If you were to start your IT career again, right now, what would you do? Denise said that she would still focus on learning and teaching what she knows. She believes that is the fastest way to learn more and grow your community.
(19.17) – Phil asks Denise what she is currently focusing on. Right now, Denise is working to grow her reach and provide value. She has a lot of information to share that she has been too busy to get out there. So, over the next year, her plan is to share a lot more content.
(20.08) – What would you consider to be your most important non-technical skill? Denise picked out two things. Firstly, being able to write well and communicate effectively. Secondly, her design skills, which enables her to make her content visually appealing and engaging.
(20.43) – Phil asks Denise to share a few final words of advice with the IT Career Energizer audience. Denise says it is vital not to let your self-doubt get in your way. You need to be able to identify when you are suffering from imposter syndrome, procrastinating, worrying about being judged or doubting yourself. That is the first step to breaking through those negative thoughts and dealing effectively with them. There are tools you can use to hack your thought patterns, so you stop holding yourself back.


HomeLeave it at the door.
March and April have brought snow and rain to different parts of the country. Whether you're coming in from a hike or your child had baseball practice and is bringing dirty cleats into the house, make sure to leave shoes at the door. This will keep you from spending time cleaning mud and wet shoe prints in your home later!


Solo chromatic kantele, strings (min. 33221); 26 min.
solo piano + 3222 4221 13 harp, strings (doublings: picc. eng. hn); 34 min.
solo soprano + 3333 4331 04 harp, cimbalom, str (doublings picc, eng. hn, cbsn); 25 min.
solo viola + 3223 4231 14, didgeridoo, harp, piano, strings (doublings: alto fl, picc, eng. hn, b.cl, cbsn, 2 picc. tpts); 35 min.
horn & natural horn, strings (min. 55432); 25 min.


Earlier this month, we were introduced to the website of a prominent pediatric optometrist, Dr. Bill Takeshita (drbillfoundation.org). Through this site, we learned for the first time about the difference between optometrists and ophthalmologists. Lukas has been seeing an ophthalmologist since he was 4 months old, but had never seen an optometrist until a few days ago. Little did we know, it would have been best if Lukas had been visiting an optometrist regularly from about 6 months of age. There are fundamental differences between ophthalmologists and optometrists. Essentially, ophthalmologists focus on the medical and surgical treatment of the eyes, while optometrists focus more on vision therapy and prescribing glasses. You can read more about the differences between the two at: drbillfoundation.org/Main/EyeCareProfessionals.
Though this is not directly related to CVI, we wanted to highlight this issue because we know many parents, like us, simply don't know how valuable it can be to take their child to an optometrist. Though glasses cannot help CVI, they CAN help other ocular conditions which may be adding to CVI and making it even harder for your child to see. We are frustrated that it took us this long to gain that knowledge, but we are hopeful that we can help others to learn about it sooner and we are very excited to see how Little Bear's vision may improve with his new glasses!
Oops, I meant to say Zenni Optical above.
Thanks for the tip! We will keep it in mind when we get a prescription filled.
There are definitely differences between the two disciplines. One of the big problems we find with medical exams on children with CVI is that many doctors discount any other issues that may be there–like astigmatism, nearsigntedness, etc. that could benefit from glasses or other interventions. It is critical that families ask for this information during their child's eye exam so that not only can they have all the important facts but they can get a read on whether their ophthalmologist is discounting other issues because of the CVI.
From a teacher of the visually impaired with 40 years in early intervention.
Thanks for your response! We agree that it is vital that parents advocate for their children when visiting doctors. You make some great points to keep in mind.
I asked my 8 month son's pediatrician about seeing an optometrist and the doctor said that optometrists were for children that had uncomplicated eye conditions and just needed glasses. I also had one ophthalmologist misdiagnose my son and then the next ophthalmologist diagnose him with CVI then said there is nothing that we can do and he wants to see him back in a year. So frustrating!


text:
June 14, 2016 4:29AM PT
Annecy: DreamWorks' Kendal Cronkhite Unveils 'Trolls'' Art and Craft
Movie's production designer showcases 17-minutes of finished footage and 'Trolls'' production process to a warm reception
By John Hopewell
John Hopewell
Chief International Correspondent @https://twitter.com/john_hopewell	FOLLOW
John's Most Recent Stories
Euro TV Production Company Tandem Marks 20 Years
CREDIT: Copyright: DreamWorks Animation
ANNECY — Justin Timberlake and Anna Kendrik stole the show at the Cannes Festival's presentation of DreamWorks Animation's musical comedy 'Trolls,' dueting its finale song "True Colors" in the Palais des Festivals, with Timberlake on acoustic guitar.
At the Annecy Animation Festival on June 14, the central stage belonged to DreamWorks' trolls themselves, six-inch-high forest folk with pudgy faces and an obelisk of straight-up hair the color of tropical dyes.
In an 80-minute presentation, featuring a continuous 17 minutes of fully-lit final footage, Kendal Cronkhite, "Trolls'" production designer, talked at length about how through film's interplay of theme and craft contributed towards embodying its directors' vision. Made up of mostly young animators, many from French animation schools, the sometimes dazzling show of artistry played to an appreciative audience.
An original story directed by Mike Mitchell ("Shrek Forever After") and Walt Dohrn, a story artist on "Shrek 2" and "Madagascar," "Trolls" turns on "finding one's true self and true happiness, which is all inside," Cronkhite commented at Annecy. The trolls themselves seem to have mastered that life art. Poppy (Anna Kendrick), "Trolls" heroine, has a slightly hippy air with her straight-up red hair topped off in a pony tail and a blue headband bedecked in green flowers. She scrapbooks, has sleepover parties, and wears a wrist watch which blossoms and lights up every half hour, reminding her to hug all her fellow trolls.
From the extended sequence shown at Annecy, it's clear that those who could do with more happiness training, are the Bergens – monster urban human-scale trolls who, in a '70s retro touch, wear polyester, consume fast food and are pale, poor and miserable. They are only content one day a year, at Trollstice, when they feast on the mini troll folk. Doing so, they experience fleeting joy.
Also in need of a crash course in happiness is Branch (Justin Timberlake), who's about as downbeat as mini-Trolls get, a near curmudgeonly loner who lives in a bunker, fearing imminent Bergen attack. When the Bergens capture her 12 best friends, Poppy sets out to rescue them. Plucked from "Trolls'" late second act, the 17-minute sequence at Annecy took in Poppy trying to persuade Branch to accompany her to Bergen Town. He refuses. On the way, Poppy sings an anthem, "Get Back Up Again," as her environment, designed by Cronkhite, goes through 27 fantasy locations.
"Poppy" is a super-positive, happy loving personality," Cronkhite said, though the near psychedelic environments she encounters on her way to Bergen Town really kick her butt, whether gummy sugar candy geysers or a knit macrame snake that chases her through the jungle of its body, or a hill creature whose mouth she falls into, or popping balloon eyeballs. But Poppy doesn't lose one ounce of optimism. Branch, a Bergen expert, reluctantly catches up with her to take her into Bergen Town.
Cronkite also showcased the various stages of production. Using a sequence where Poppy sings Simon and Garfunkel classic "The Sounds of Silence" to Branch, Cronkhite broke down the film into a progression reel – a four-panel split-screen – of b/w storyboard drawings with soundtrack; lay-out of sets and characters'; animation, with the characters acting in the scene; and the final surface-light pass. All parts played simultaneously. The demonstration was a testament to the skill of the story artists whose tight work matched pretty closely the end result.
Designing the look of a film, the characters and environments, a production designer boards early on and works in tandem with the head of story, writers and directors and editors, Cronkhite said.
A DreamWorks veteran – she art designed "Antz," DreamWorks Animation's first CGI movie – Cronkhite's challenge was to transfuse "Trolls" informing themes into the look of the movie. Her aim was to create "a very fuzzy, fibre-art inspired world" in CG, she explained.
Danish woodcutter Thomas Dam carved the first troll doll in 1959. The first part of "Trolls'" process was to take the character and break it down, according to Cronkhite. DreamWorks kept the trolls' hair and the "stubby, fat, rounded fat language of the troll," she added.
Cronkite had a "lightbulb moment," she said, when she wondered "if the whole Troll world could be wool. Because of their positive nature, diversity and their communal lifestyle, it made sense that their environment should reflect them," she added.
"Since we were going with a fiber-felted world, we decided to do the same with the characters."
For Cronkhite, the '70s was an important inspiration. "That's when the doll became very popular. We decided that the trolls would be our hippies of the '70s. They live in nature. They macrame. They're probably vegetarians."
DreamWorks hired Portland-based Sayuri Sasaki Hemann, a fabric, fibre and encaustic paintings artist, to take early development drawings from the film's stylist, Amelie Flechais, a French comic and children's book illustrator, and build a fibre, six-feet model world.
The Trolls always have a song on their lips. Indeed, the comedy highlight of the 17-minute continuous footage shown at Annecy was Poppy singing "The Sounds of Silence" to Branch, backed up by a forest creature chorus. In one of the film's latest talent announcements, Crondhike's Annecy preview comes as DreamWorks Animation has officially confirmed that Christophe Beck ("Frozen," "The Hangover") will serve as "Trolls'" composer. Justin Timberlake is executive producing "Trolls'" entire soundtrack, and has written four original songs for the film, including "Can't Stop the Feeling" which, released on May 6, has topped charts in the U.S. and U.K. As "Frozen" suggested, Beck is adept at working in such a structure.
"We are delighted to be working with Chris; he is masterfully unifying our patchwork tapestry of song cues from many eras and giving our film an emotional and harmonious sophistication," said "Trolls'" producer Gina Shay.
From a screenplay by Jonathan Aibel and Glenn Berger, who co-penned "King Fu Panda 3," "Trolls" is slated for a Nov. 4 release from Fox becoming DWA's second-half 2016 title, before DreamWorks' "Boss Baby," another Annecy sneak-peek, bows in the U.S. on March 10, 2017.
Annecy Film Festival
Sarah Silverman and "Game of Thrones" star John Bradley have joined the Jennifer Lopez comedy "Marry Me" at Universal. Owen Wilson is also on board to star. Kat Coiro is directing the film and the script was written by John Rogers and Tami Sagher, with a rewrite by Harper Dill. Universal recently acquired the pic [...]

redpajama_set_name: RedPajamaCommonCrawl


I am so glad Family Friendly Gaming rented a copy of The Legend of Zelda TriForce Heroes on the Nintendo 3DS. This is not a game to purchase. In fact this might be one of the worst Zelda games of all time. The Legend of Zelda TriForce Heroes is all about fashion, and three players. One player can play The Legend of Zelda TriForce Heroes, but they have to swap between all three characters to do things.
The Legend of Zelda TriForce Heroes tells players that they are swapping their soul between bodies in the single player mode. There is also idol worship - which is where we save. The different costumes that can be worn will give different powers. You may need to replay certain levels over and over again and get really lucky at the end of the level. Why? There are three treasure chests to choose from. You might get something worthwhile to build a new suit, or you might get something worthless.
Levels in The Legend of Zelda TriForce Heroes are like going through a few rooms here and there. The Legend of Zelda TriForce Heroes feels totally disconnected. Players can pick up other Link characters to build a totem. Why is this needed? To throw characters to higher ledges, and to shoot things two, and three levels high. Trust me this gets old really fast.
The Legend of Zelda TriForce Heroes is way over priced on the market as it currently stands. This game is worth around ten dollars in my role playing gamer opinion. The looks and sounds in The Legend of Zelda TriForce Heroes are recycled from previous Zelda video games. Why doesn't Nintendo cut their fanboys a break and give them a price cut? How many billions do they need in their bank account?
I wanted to like The Legend of Zelda TriForce Heroes so much. Trying to force me to play online is lame, or three local players with the same game. The single player mode is horrible. I do not have a Cadillac Internet plan to play video games online. When will these companies realize they are limiting their sales? Pass on purchasing The Legend of Zelda TriForce Heroes on the 3DS. There are plenty of better games for families.


text:
Why Did Nobody See It Coming?: How Scenarios Can Help Us Prepare for the Future in an Uncertain World
Preventing Civilian Casualties, Drinking During the Pandemic, Vaccination Equity: RAND Weekly Recap
>P-5713
Agricultural Research: A Study of the Demand for Public Goods.
by J. Guttman
Purchase Print Copy
Add to Cart Paperback47 pages $23.00 $18.40 20% Web Discount
Develops a model of the demand for public goods, and applies the model to explain cross-sectional differences in public allocations to agricultural research in the United States. The model postulates that demanders of agricultural research on the state level--primarily farmers and firms producing agricultural inputs--contribute voluntarily to lobbying activity, which in turn induces research allocations. The effect of group size on a Cournot equilibrium of aggregate contributions is shown to be positive. A "concentration effect" is derived which states that the share of contributions contributed by the relatively large demanders increases, and the share contributed by the relatively small demanders decreases, as group size becomes large. These implications of the model are found to be consistent with American data on agricultural research allocations in 1969. 47 pp. Ref. (Author)
This report is part of the RAND Corporation Paper series. The paper was a product of the RAND Corporation from 1948 to 2003 that captured speeches, memorials, and derivative research, usually prepared on authors' own time and meant to be the scholarly or scientific contribution of individual authors to their professional fields. Papers were less formal than reports and did not require rigorous peer review.
Copyright: RAND Corporation
Print Format: Paperback
Paperback Pages: 47
Paperback Price: $18.40
Document Number: P-5713
Series: Papers
RAND Corporation Style Manual
Guttman, J., Agricultural Research: A Study of the Demand for Public Goods.. Santa Monica, CA: RAND Corporation, 1976. https://www.rand.org/pubs/papers/P5713.html. Also available in print form.
Guttman, J., Agricultural Research: A Study of the Demand for Public Goods., Santa Monica, Calif.: RAND Corporation, P-5713, 1976. As of January 13, 2022: https://www.rand.org/pubs/papers/P5713.html
Download Citation (BibTeX) Download Citation (RIS)


Cedar Springs Boat Launch Area provides access to boat-in reservoir campgrounds.
This boat ramp is open year-round.
From Vernal, Utah, take U.S. 191 north 42 miles. Turn north onto Forest Road 183 and travel approximately 3 miles to the boat launch.


With 'More Inside' the products have chosen to speak! 'More Inside' is a range of specific and versatile products that can be used on their own or mixed and layered together for a creative styling finish. Created by Davines Artistic Director Angelo Seminara, each product provides much needed hydration for you hair, ensuring a long-lasting effect when finishing.
The product leaves the hair feeling refreshed and bouncy without leaving a heavy, or greasy product residue.
Each product from the range offers something different for specific hair types, to help you work and mould your hair to the style you love.
The 'More Inside' range is designed with handmade and sustainable packaging and distinctive paper for individuality and uniqueness for your everyday haircare needs.
Each handmade design has carefully selected materials making the product easier to separate and recycle when using them for your hair.
More importantly the carbon dioxide emissions from production are offset with reforestation and woodland protection projects.


Am trying to disable some checkboxselection model inserted in grid .I have tried with the beforerowselect listener of the checkboxselection .
This listener is not triggered when the row is selected.Is there anyway to disable the checkboxselection model based on some criteria?
Which Ext version are you using? With Ext 4.1.1, Ext.selection.CheckboxModel does not fire 'beforerowselect' event but instead it fires 'beforeselect' event.


text:
Jane Simons | Thursday, June 27, 2019
Ready for some hockey? Say hello to Interstate Hockey League's Battle Creek Cavalry Hockey Club
David Darkey is the president of the Battle Creek Cavalry Hockey Club.John Grap
The floor of the hockey rink currently is not covered with ice.John Grap
Josh Millikin paints a wall at The Rink.John Grap
The zamboni at The Rink sits ready for ice hockey seasonJohn Grap
Some of the plaques in the trophy case on the wall at The RinkJohn Grap
Main entrance to The RinkJohn Grap
Outside The Rink in Battle Creek. It is currently undergoing renovations costing more than $1million.John Grap
The logo for the Battle Creek Calvary Hockey Club
Editor's note: This story is part of Southwest Michigan Second Wave's On the Ground Battle Creek series.
The return of semi-professional hockey to Battle Creek in November will give players a chance to keep playing a sport they love while giving spectators a total fan experience, says Drake MacKenzie, Commissioner of the Interstate Hockey League.
A team of 25 players will make up the Battle Creek Cavalry Hockey Club who will play their home games at The Rink in the city's downtown area. Their team colors are green and gold, they will have semi-pro status, and they will be playing hard to win, MacKenzie says.
"Every town deserves a good hockey team," he says. "We want to make professional hockey stick in Battle Creek."
David Darkey is the president of the Battle Creek Cavalry Hockey Club.The Cavalry is not the first hockey team to call Battle Creek home. In 2008, the Battle Creek Revolution, a professional team and member of the All-American Hockey League, played its home games at The Rink, which was called Revolution Arena at the time. The team played for three seasons before disbanding in 2011.
During those seasons, The Revolution played against a team out of Lapeer. MacKenzie grew up in the small town of Hadley, just southwest of Lapeer, where he played high school hockey and became a fan of the Lapeer team. His memories of the intense rivalry between the Revolution and the Lapeer team is what prompted him to locate one of his IHL teams in Battle Creek.
"I thought, they must have crazy fans like we have," he says of Battle Creek.
The Cavalry is one of 12 teams in the Interstate Hockey League, which was founded by MacKenzie in 2018. The other teams are located in Alpena, Bay City, Flint, Fraser, Holland, and Lansing, with a city or two yet to be named.
The Calhoun County Visitors Bureau will definitely be cheering on the new team, says Linda Freybler, Chief Executive Office for the CCVB. "I think it's a great use of The Rink," she says. "We've had a history of hockey being here and having a new league will be great for the community."
Battle Creek's amateur sports legacy
The Cavalry, which is being coached by Austin Hickner, will become part of an amateur sports legacy in Battle Creek that includes teams such as the minor league Battle Creek Battle Cats that play their home games at Bailey Park. Freybler says Battle Creek was the first city in Michigan to have a Sports Commission, created more than 30 years ago by city leaders with a focus on building an amateur sports presence in the area.
The addition of the Cavalry presents "opportunities to enhance the lives of our residents and bring visitors to our community," Freybler says. "It's great that people are continuing our amateur sports tradition."
That tradition was boosted with the development of local venues such as Bailey Park, The Rink, and Kellogg Arena that are equipped to host these amateur teams.
The Rink has been undergoing extensive renovation efforts since being purchased in 2016 by Jennifer and Rick Powell, a local couple with strong ties to the venue and the city. Rick Powell is an engineer with an area company and Jennifer Powell is a vice president with a Pittsburgh-based bank.
Their familiarity with the venue grew when their son began playing youth hockey with the Battle Creek Bruins, which practices and plays at The Rink. They came to realize how many people were touched by the facility and being able to play there.
"It was our understanding that the facility could potentially be closed," says Jennifer Powell. "We felt that it was important that someone step forward to save it for the community and we wanted to turn it back into the community asset it really is."
Now closed for the summer as renovation work continues, Powell says in-season The Rink, which they are operating as a nonprofit, hosts drop-in hockey, open skates, learn-to-skate classes, tournaments, and also serves as a practice site for competitive figure skaters and members of the Kalamazoo Wings hockey team. During a recent open-skate, she says more than 200 children from different backgrounds and schools skated together.
So far, Powell says, just north of $1 million has been spent on the renovations with a portion of that funding coming from the Battle Creek Community Foundation, which has been a major supporter of these improvement efforts.
Powell says the addition of the Cavalry bodes well for The Rink's future. "Certainly for us, it's going to grow the exposure of our facility," she says. "I anticipate having people from Kalamazoo to Jackson and Hastings to Coldwater coming in for games. For our facility, the increase in revenue allows us to put money back into the facility.
"For hockey in general for our community, this gives us a great place for our youth to interact with people who have made it to the next level who now have the option that they can continue to play a sport they love here in town."
Player recruitment for the Cavalry includes open calls on Facebook, efforts by Coach Hickner, and word-of-mouth referrals, says David Darkey, president of the Cavalry. He adds that the majority of players are from within 25 or 30 miles of Battle Creek.
For those who play, he says, it's the best of both worlds because they can continue to work at their day jobs or focus on their education while participating in a sport they are passionate about without spending a lot of time or money.
"They can still have their day job and go to school and still get to act like a pro on the weekends," MacKenzie says.
Darkey, who lives in Bellevue, has been involved in the local amateur sports team market since 1999. He will be handling the business end of the Cavalry's operation, including ticket sales and working with the Powell's. He says he saw a posting for his current position on Facebook and applied.
"The nice thing with this league is the business model," he says. "They have games on Friday, Saturday, or Sunday and all the teams are in Michigan. If it's done properly this club could survive for years down the line."
The IHL was borne out of MacKenzie's love for the game of hockey. Like many who played hockey in their youth, he was not ready to hang up his skates when he graduated from high school and was no longer able to play for the Hadley Nepessings, his school's team.
Growing up in a small town, he says, "that was my childhood, baseball all summer and hockey all winter."
During this time, he became a huge fan of the Flint Generals, a minor league hockey team that left after its 2010 season.
"Somehow that lit a fire under me to do something with pro/semi-pro hockey and after I graduated in 2014, I founded the Union Hockey League which began play in 2016."
Drake MacKenzie, Commissioner of the Interstate Hockey League.The UHL had six teams which played in an arena, which though small, was always packed, simply through word-of-mouth marketing, MacKenzie says.
"It was pretty cool to have high-level guys playing and teaching the younger guys. It meant something to play for each team. Everyone took it seriously because everyone cared," MacKenzie says.
But, the business model, which called for players to pay $15 to $20 to play, was not to last. After one season the UHL disbanded and MacKenzie admits to doing and saying "a lot of stupid things" at the time. He also learned that "good hockey players aren't going to pay to play."
As a result, MacKenzie says players who sign on with the IHL teams will only pay a $100 registration with the IHL picking up the cost of their equipment and uniforms. They also will share in 80 percent of the gate proceeds with the remainder going to The Rink and local youth hockey programs.
It continues to be a learning process for the 24-year-old MacKenzie who readily admits that he is not a typical entrepreneur, businessman, or even hockey player.
"I have no idea how to make my hair look nice, I wear button-up shirts and jeans to every meeting and I am easily identified by my hat, which is always on backwards," he says. "I didn't go to college (well okay, I did, for like a week) and I got cut from high school hockey. I 100 percent run my mouth too much.
"But if you know me, you'll be hard pressed to find someone that cares about hockey and people as deeply as I do. I am just a young, aggressive guy."
He is also part showman which is reflected in his plans to make inflatable characters, video boards, and food trucks a part of the fan experience at rinks that host his teams.
"I really encourage creativity," MacKenzie says. "I know that what's going to work in Fraser, may not work in Battle Creek."
One thing that he knows will work across the board is making the games affordable with individual tickets priced at $7 and season tickets available for $100. Because he owns all 12 teams, he says he will be able to control a high standard of quality for each one of them.
The IHL's annual budget is between $2 million and $5 million. MacKenzie says the league it has a lot of contracts with financial supporters pending and they are waiting for the checks to come in. Within the next few weeks, he says he is hoping to announce some major sponsorships that will give the IHL a huge financial boost.
"I have confidence in every one of our markets," MacKenzie says. "I am so excited for the Interstate League to kickoff. There is nothing more noble than a person following their dreams, which I am doing to the fullest."
Read more articles by Jane Simons.
Jane Simons is a freelance reporter and writer with more than 20 years of experience and also is the owner of In So Many Words based in Battle Creek. She is the Project Editor for On the Ground Battle Creek.
Entertainment, events, On the Ground, Sports and Recreation


When it's well done the printed word is still a powerful marketing weapon. Online is great, but sometimes you can't beat the look, feel and impact of something more tangible.
The Treloars' Trust is one of the UK's most respected charities, committed to improving the lives of children with profound disabilities. One of their key communication vehicles is their School Prospectus. I was approached for a radical reappraisal of how this should work. It was vital to create a brochure that talked to both parents and children. Equally important was the need to celebrate the very real achievements of these special young people. This more relaxed approach has paid dividends.
Launching a new form of employment contract is no easy matter. It's a particularly complicated and sensitive legal area. So bold simplicity was key to the approach behind this brochure that promoted this new concept, which offered numerous benefits to both employers and employees alike.


text:
NAS Meetings
Community Express
Wellbeing groups
BASS Autism Services
Well Aware
Tools, books and other resources
Autistic Eye
www.autisticeye.co.uk
Josh Curd, who has Asperger's syndrome, has a not-for-profit social enterprise called Autistic Eye. It provides an opportunity for people on the Autistic Spectrum to sell their artwork and share it in a positive and insightful way. Our tagline is 'seeing things differently' and that's what we're all about.
Prints are exhibited at 'Cafe at the Centre' Manvers Street Bath. Cards are for sale at the café, at Ammerdown Centre and from the website.
Autistic Eye are now looking:
to sell more cards
for subscribers, for £7 a month 'Friends' receive 4 cards and a newsletter each month
for 'outposts' to sell cards and make money for themselves or a cause of their choice
for new artists with Autism or Asperger's Syndrome
Josh asks that you look at the website www.autisticeye.co.uk, buy some cards, become a FRIEND and spread the word.
My name's Matthew and I provide therapeutic and educational music facilitation for people of all ages and abilities in Bristol and the wider area. My 1:1 and group sessions foster positive communication, interaction and self-expression using music as a tool. Sessions typically involve the following:
A wide range of world drums and percussion instruments for exploring rhythm.
Tactile and electronic instruments such as ocean drums, piano mats, glockenspiels, bells, air synths and keyboards for encouraging a musical dialogue between myself and participants, and also between the participants themselves.
A guitar and keyboard for singing popular songs and also to make up songs on the spot that reflect what the group is doing.
Loop pedals and samplers that allow me to create a live soundscape that the participants can contribute to and immerse themselves in.
The sessions are very wide-ranging and there is something for everyone.
For more information including videos, pictures and testimonials please visit my website
NAS Avon branch: Diana Elliott: 07825 227026, avon@nas.org.uk
BASS: 01275 796200, awp.bass@nhs.net or visit their website
Well Aware: 0808 808 5252, info@wellaware.org.uk or visit their website
NAS Data Protection and Privacy Policy and Terms and Conditions


text:
Benchmarking & Transparency Policy Evaluation
High-Performance Leases
Home > Environment > Energy > City Energy Project > High-Performance Leases
High-Performance Leasing Resources
JLL is using green leases to make win-win agreements for both landlords and tenants.
Resources for Developing High-Performance Leases
Are you in the process of signing a commercial real estate lease in San José? Does your business have sustainability goals and want to make sure that your lease is promoting high-performance buildings and energy efficiency?
If so, you should consider high-performance leases. Also known as green leases, high-performance leases help building owners and tenants work together to save money, conserve resources, and ensure efficient operation. According to a 2015 Institute for Market Transformation (IMT) study, high-performance leasing can save the U.S. office market $3.3 billion annually and reduce a commercial building's utility bills up to 22%.
Building owners, tenants, brokers, and the commercial real estate industry can use this resource page to develop, negotiate, and implement high-performance leases to increase sustainability in leased buildings and decrease spending.
What is a high-performance lease?
High-performance leasing (also known as green, energy-aligned, or energy-efficient leasing) helps landlords and tenants work together to save money, conserve resources, and ensure the efficient operation of buildings. Questions addressed in a high-performance lease may include:
What are the environmental measures to be taken to meet energy efficiency and sustainability goals? For example, indoor temperature regulation, water use, and materials used to maintain the property.
How will the tenants and landlords cooperate to meet these measures?
How are the costs and benefits shared between the landlord and the tenants?
Which party is responsible for monitoring compliance with these measures?
What will happen if the parties fail to meet the targets?
Source: Institute for Market Transformation - Making Efficiency Work for You
When is the next high-performance leasing training?
Register for our free High-Performance Lease Training in San José on October 17, 2018 to learn more about how high-performance leasing can benefit you. Hear from the U.S. Department of Energy and IMT's Green Lease Leaders program and receive help to identify your high-performance lease opportunities. View upcoming energy trainings.
Where can I learn more and find resources such as high-performance leasing template language?
See the FAQs below to learn about the benefits of high-performance leases. You can also find high-performance leasing template language and site selection checklists. Many of the examples will need to be edited and amended to fit each individual building or property, but these resources are a great way to build your own custom lease language.
How can I be recognized as a high-performance or green lease leader?
Apply online to be recognized as a leader in high-performance leasing. Green Lease Leaders™ is a national program by the U.S. Department of Energy and IMT that recognizes forward-thinking companies and real estate practitioners who break down barriers to high-performance buildings by incorporating energy efficiency and sustainability targets into leases.
What issues can a high-performance lease address and resolve?
Why are high-performance leases beneficial?
How can a high-performance lease help my bottom line?
I'm ready to start a high-performance lease. Are there samples of high-performance lease language or site selection checklists available?
Sample High-Performance Lease Language
Site Selection Checklists
I'm in the retail industry. Is there high-performance lease language available for me?
I'm a small business. Does high-performance leasing apply to me?
I'm not sure if my lease is high-performance. How can I analyze my lease for high-performance lease opportunities?
Can I switch to a high-performance lease if I'm in the middle of a lease term?
I've heard that high-performance leases make the leasing process longer. What are strategies to overcome this?
I'm ready to be recognized as a Green Lease Leader. What do I need to do?
There are four main categories for high-performance lease language:
Pass-through Clauses: Language that allows the landlord's capital improvement costs to be shared with tenants.
Operational Clauses: Language that mandates practices for the tenant space to operate more efficiently and sustainably.
Sustainable Purchasing: Language that outlines allowable materials in tenant and common area space. Criteria may include requirements for ENERGY STAR products, construction materials with recycled content, or green cleaning supplies.
Reporting: These clauses encourage sharing data about tenant space and building-wide utilities in an effort to measure energy use and manage benchmarking goals.
High-performance leases are not generally stand-alone documents separate from a normal commercial real estate lease. Rather, a high-performance lease is a regular commercial lease with additional language to address both landlord and tenant sustainability goals. The language in the lease can improve the environmental sustainability of commercial properties in several ways. High-performance leases can reduce operating costs, help comply with energy benchmarking, and achieve green building certifications such as Leadership in Energy and Environmental Design (LEED). With a high-performance lease, both landlord and tenant have incentives to invest in long-term, energy-efficient solutions.
A growing number of commercial real estate companies, tenants, and brokers are using a high-performance lease as a collaborative blueprint to increase building energy performance and save money. The Institute for Market Transformation (IMT) estimates that such leases can reduce utility bills by up to $0.51 per square foot and reduce energy consumption in an office building by up to 22 percent.
I'm ready to start a high-performance lease. Are there samples of lease language or site selection checklists available?
There are many examples of high-performance lease language and checklists to help you in site selection. Many of the examples will need to be edited and amended to fit each individual building or property's needs and specifications, but they are a great resource for building custom language. Below are some free resources and examples to help you get started. If you need additional assistance, contact
For security reasons, you must enable JavaScript to view this E-mail address.
High-Performance Lease Language Examples by the Institute for Market Transformation (IMT)
Organized by category and technology type (i.e. HVAC, submetering, fit out and building requirements, etc.), this resource provides high-performance lease language examples from academic, government and NGO sources.
Green Leasing: An Effective Tenant/Landlord Strategy for Energy Efficiency by A Better City
This report provides model high-performance lease language that has been used by tenants and landlords in the U.S., Canada, and the U.K, as well as two success stories.
Green Lease Library
This centralized site for commercial green leasing resources provides sample language, case studies, and guidance on high-performance leasing.
Green Lease Guide: A Guide for Landlords and Tenants to Collaborate on Energy Efficiency and Sustainable Practices by Building Owners and Managers Association (BOMA) International
A full green lease model developed by BOMA, available for a small fee.
Green Lease Leaders by the U.S. Department of Energy and IMT
A recognition program that honors landlords, tenants, and brokers for leadership in green leasing best practices.
See how the Tower Companies built a successful green lease with real lease language that gets efficiency results:
Green Leasing Toolkit by the California Sustainability Alliance
Promotes communication and creates transparency within the lease process. The toolkit downloads as an Excel spreadsheet and includes a green policy statement, lease options matrix, scorecard, lease provision database, and resource database.
Green Sheet by the Business Council on Climate Change
Enables real estate professionals to integrate sustainability directly into their process for site selection, corporate sustainability reporting, and targeting capital or operating improvements.
7 Questions to Ask Your Building Owner When Considering a Green Lease by Megan Porter, PG&E
Small Office Build-Out Tips by Better Buildings Alliance
Large Office Build-Out Tips by Better Buildings Alliance offers guidance on how your property teams, leasing agents, and brokers can communicate the value of considering energy efficiency during tenant improvements.
The Retail Industry Leaders Association created this "Retail Green Lease Primer" to help retail landlords and tenants get started on high-performance or green leasing. The Institute for Market Transformation also created this resource to identify first steps and sample language for retailers.
Yes, small businesses are leaders in high-performance leasing. This NEO Realty Group Green Lease Case Study demonstrates that anyone in any location can achieve energy efficiency goals for both landlord and tenant stakeholders. Watch this video to see how small businesses in Cleveland are stepping up as green lease leaders in their community:
If you're interested in learning more, please contact
Find opportunities in your lease in just 5 minutes by using this Lease Audit Tool from the U.S. Department of Energy and Institute for Market Transformation. If you need additional assistance, contact
Yes. Although it's better to start with a new lease, you can still do a high-performance lease in the middle of a lease term. Restructuring existing leases for greater energy efficiency can be a tough job. Here are some ways to make it easier:
Adjusting Rules and Regulations: Inserting high-performance operation language into the Rules and Regulations of a lease is the first step towards an agreement that lowers utility costs. It allows the development of simple low or no-cost solutions for tenants and landlords. Landlords can often simply insert these changes in Rules and Regulations to modify the lease.
Amendments: Amendments can be used to address select alterations to the lease. This strategy commonly requires legal coordination from both landlord and tenant. The approach can be used to implement a capital improvement or sharing of utilities while clearly outlining how both parties benefit from the improvement. It's important to note that amendments shield the remainder of the lease items from additional negotiations, as an amendment is generally a stand-alone document limited to a few pages.
High-performance leases are worth the time because they create win-win agreements for building owners and tenants. Use these discussion opportunities to green your lease.
FOR LANDLORDS:
Extended Lease Term: Agree to extend the tenant's lease so that the tenant can recoup all or a larger portion of savings after an initial payback period.
Financial Savings: Emphasize overall operating savings such as lower utility expenses (in the case of triple-net leases) wellness, comfort, and productivity savings to the tenant.
Be Transparent: Let the tenant know of planned improvements that are beneficial to the tenant.
FOR TENANTS:
Agree to a Longer Lease Term: By signing a longer lease, the landlord may be more willing to renegotiate the lease to prevent vacancy. Additionally, such suggestion helps the landlord save on transaction costs associated with replacing tenants and less waste will result from additional tenant build-outs.
Communicate Cooperatively: Share with the landlord what you are willing to pay. Aim for a win-win resolution for both parties.
Benefits to the Landlord: Emphasize what the landlord stands to gain when investing in energy efficiency. Mention lower operating costs, higher net operating incomes (NOI) and a higher valued building.
Rebates and Tax Incentives: Research rebates and tax incentives from your local utilities and contractors. These rebates and incentives may help tenant and landlord overcome cost hurdles.
I'm ready to be recognized as a high-performance lease leader. What do I need to do?
Apply online to be recognized as a leader in high-performance leases. Green Lease Leaders™ is a national program by the U.S. Department of Energy and IMT. The program recognizes forward-thinking companies and real estate practitioners who break down barriers to high-performance buildings by incorporating energy efficiency and sustainability targets into leases.


text:
Die Sakya-Schrift-Pagode () im Osten des Guanghua-Tempels () in der chinesischen Stadt Putian, Provinz Fujian, wurde vor dem Jahr 1165 in der Zeit der Südlichen Song-Dynastie erbaut. Es ist eine 36 Meter hohe fünfstöckige oktogonale Steinpagode, die einem Turm ähnelt. Sie wird auch als "Pagode des Guanghua-Tempels" () bezeichnet.

Eine Besonderheit sind ihre Reliefskulpturen. Die Arhats und Buddha-Bildnisse in vielgestaltigen Ausdrucksformen liefern alle wertvolles Material für die Erforschung von Kunst und Kultur des Buddhismus der Südlichen Song-Dynastie.

Seit ihrer Fertigstellung hat die Pagode  Taifune, Erdbeben und andere Naturkatastrophen unbeschädigt überstanden.

Die Pagode steht seit 1988 auf der Liste der Denkmäler der Volksrepublik China in Fujian (3-149).

Weblinks
 Shijiawen  Fo ta - Chinesisch

Buddhistisches Kloster in der Volksrepublik China
Pagode in der Volksrepublik China
Song-Dynastie
Bauwerk in Fujian
Nationales Kulturdenkmal der Volksrepublik China
Religion (Fujian)
Putian
Sakralbau in Asien

zh:广化寺 (莆田)#释迦文佛塔

redpajama_set_name: RedPajamaWikipedia


After returning to the hotel Thursday night, we recorded this adrenaline-fueled report on the evening's festivities..
The instructions were: turn on the flashlight on your smart phone. My phone is too dumb to have a light, and too lame to have a battery that would handle it.
There will be a lot more to talk/write about in the coming days as some of this is processed.
I post this from the Great Hall of Chicago's Union Station, and we look forward to getting home and reuniting with our cats.


Over the course of nearly ten years, and at a price tag of over NOK 200 million, researchers have been studying Norwegian working life. What have been the results?
At the request of the Research Council, three Nordic professors have evaluated the results of the Program on Working Life Research (ARBEIDSLIV), whose activities were consolidated under the Research Program on Welfare, Working Life and Migration (VAM) last year.
The purpose of the ARBEIDSLIV program has been to generate new knowledge on important development trends in working life with particular emphasis on the most important conditions and processes that affect the participation, empowerment, presence and absence of the individual in working life.
Professor Helge Hvid of Roskilde University in Denmark presented the group's report at the concluding conference for the ARBEIDSLIV program in January.
The report's main conclusion is that the program has funded highly relevant research which has produced a great deal of valuable insight into an extensive and complex area. Only the highest quality applications came out on top in the competition for funding, as just 41 of almost 200 project proposals were selected.
In a scientific context, the group puts special focus on the efforts of economists at the Norwegian School of Economics and Business Administration (NHH) and the Ragnar Frisch Centre for Economic Research at the University of Oslo (UiO), who have linked company data and personal data in a way that makes Norwegian research unique in this area.
The three professors would like to have seen more projects in the program's portfolio that focused on various roles of employees in working life as well as more research on finding explanations for leaders' behavior and actions.
The Institute for Social Research (ISF) in Oslo, the Department of Economics at NHH in Bergen and the Frisch Centre at UiO were the big winners in the competition for funding. Altogether these three institutions were awarded over half of the total allocations available.
At the other end of the scale are the universities, which were poorly represented among the grant applicants. The evaluation group views this as an indication that research on working life in general does not have a firm foothold at Norwegian universities.
The ARBEIDSLIV program stipulated from the outset that it sought projects of an interdisciplinary nature. The report concludes, however, that this was not achieved. The three professors also would like to have seen more projects that combined quantitative and qualitative methods.
The evaluation report also contains a thematic review of all the program's projects and a more in-depth description of the results from 12 of these.
"The group has presented a very interesting report which gives the contours of the traditions underlying research on working life today. The research activity has left a clear mark on Norwegian working life and at the same time has brought international attention to Norwegian social research," says Dr Hallén.
"Norway can boast of a high level of participation in working life, which is unique in a global context. But many challenges nonetheless remain. Many people who can and want to work still find themselves outside the labor market. Extensive research is still needed in this area if we are to meet the challenges facing Norwegian working life in the future," says Dr Hallén.
On the Edge: Dangerous Separatism?


text:
Tracking and Measuring Performance: MAP-21
With the new transportation law, MAP-21, a new focus on performance measures was adopted. The US Department of Transportation has been tasked with developing standards on which to measure success. What measures do you think should be considered to track our performance?
The DOT's website allows members of the public and of the transportation community to contribute ideas and vote for or against other proposals for performance measures. Some have said "consideration should be given to including a measure of incident clearance time," while others suggested "using measures that incorporate average travel times, such as for an average home to work commute time, which is a modal-neutral measure."
What are your thoughts? Add to the discussion on our facebook page here.


text:
/*--------------------------------------------------------------------*/
/*--- Xen Hypercalls                                 syswrap-xen.c ---*/
/*--------------------------------------------------------------------*/

/*
   This file is part of Valgrind, a dynamic binary instrumentation
   framework.

   Copyright (C) 2012 Citrix Systems
      ian.campbell@citrix.com

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   This program is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307, USA.

   The GNU General Public License is contained in the file COPYING.
*/

#include "pub_core_basics.h"
#include "pub_core_vki.h"

#if defined(ENABLE_XEN)

#include "pub_core_vkiscnums.h"
#include "pub_core_libcsetjmp.h"   // to keep _threadstate.h happy
#include "pub_core_threadstate.h"
#include "pub_core_aspacemgr.h"
#include "pub_core_debuginfo.h"    // VG_(di_notify_*)
#include "pub_core_transtab.h"     // VG_(discard_translations)
#include "pub_core_xarray.h"
#include "pub_core_clientstate.h"
#include "pub_core_debuglog.h"
#include "pub_core_libcbase.h"
#include "pub_core_libcassert.h"
#include "pub_core_libcfile.h"
#include "pub_core_libcprint.h"
#include "pub_core_libcproc.h"
#include "pub_core_libcsignal.h"
#include "pub_core_mallocfree.h"
#include "pub_core_tooliface.h"
#include "pub_core_options.h"
#include "pub_core_scheduler.h"
#include "pub_core_signals.h"
#include "pub_core_syscall.h"
#include "pub_core_syswrap.h"
#include "pub_core_stacktrace.h"    // For VG_(get_and_pp_StackTrace)()

#include "priv_types_n_macros.h"
#include "priv_syswrap-generic.h"
#include "priv_syswrap-xen.h"

#include <inttypes.h>

#define PRE(name) static DEFN_PRE_TEMPLATE(xen, name)
#define POST(name) static DEFN_POST_TEMPLATE(xen, name)

static void bad_subop ( ThreadId              tid,
                        SyscallArgLayout*     layout,
                        /*MOD*/SyscallArgs*   args,
                        /*OUT*/SyscallStatus* status,
                        /*OUT*/UWord*         flags,
                        const HChar*           hypercall,
                        UWord                 subop)
{
   VG_(dmsg)("WARNING: unhandled %s subop: %ld\n",
             hypercall, subop);
   if (VG_(clo_verbosity) > 1) {
      VG_(get_and_pp_StackTrace)(tid, VG_(clo_backtrace_size));
   }
   VG_(dmsg)("You may be able to write your own handler.\n");
   VG_(dmsg)("Read the file README_MISSING_SYSCALL_OR_IOCTL.\n");
   VG_(dmsg)("Nevertheless we consider this a bug.  Please report\n");
   VG_(dmsg)("it at http://valgrind.org/support/bug_reports.html &\n");
   VG_(dmsg)("http://wiki.xen.org/wiki/Reporting_Bugs_against_Xen.\n");

   SET_STATUS_Failure(VKI_ENOSYS);
}

PRE(memory_op)
{
   PRINT("__HYPERVISOR_memory_op ( %ld, %lx )", ARG1, ARG2);

   switch (ARG1) {
   case VKI_XENMEM_set_memory_map: {
      struct vki_xen_foreign_memory_map *arg =
	      (struct vki_xen_foreign_memory_map *)ARG2;
      PRE_MEM_READ("XENMEM_set_memory_map domid",
                   (Addr)&arg->domid, sizeof(arg->domid));
      PRE_MEM_READ("XENMEM_set_memory_map map",
                   (Addr)&arg->map, sizeof(arg->map));
      break;
   }
   case VKI_XENMEM_increase_reservation:
   case VKI_XENMEM_decrease_reservation:
   case VKI_XENMEM_populate_physmap:
   case VKI_XENMEM_claim_pages: {
      struct xen_memory_reservation *memory_reservation =
         (struct xen_memory_reservation *)ARG2;
      const HChar *which;

      switch (ARG1) {
      case VKI_XENMEM_increase_reservation:
         which = "XENMEM_increase_reservation";
         break;
      case VKI_XENMEM_decrease_reservation:
         which = "XENMEM_decrease_reservation";
         PRE_MEM_READ(which,
                      (Addr)memory_reservation->extent_start.p,
                      sizeof(vki_xen_pfn_t) * memory_reservation->nr_extents);
	 break;
      case VKI_XENMEM_populate_physmap:
         which = "XENMEM_populate_physmap";
         PRE_MEM_READ(which,
                      (Addr)memory_reservation->extent_start.p,
                      sizeof(vki_xen_pfn_t) * memory_reservation->nr_extents);
         break;
      case VKI_XENMEM_claim_pages:
         which = "XENMEM_claim_pages";
         break;
      default:
         which = "XENMEM_unknown";
         break;
      }

      PRE_MEM_READ(which,
                   (Addr)&memory_reservation->extent_start,
                   sizeof(memory_reservation->extent_start));
      PRE_MEM_READ(which,
                   (Addr)&memory_reservation->nr_extents,
                   sizeof(memory_reservation->nr_extents));
      PRE_MEM_READ(which,
                   (Addr)&memory_reservation->extent_order,
                   sizeof(memory_reservation->extent_order));
      PRE_MEM_READ(which,
                   (Addr)&memory_reservation->mem_flags,
                   sizeof(memory_reservation->mem_flags));
      PRE_MEM_READ(which,
                   (Addr)&memory_reservation->domid,
                   sizeof(memory_reservation->domid));
      break;
   }

   case VKI_XENMEM_get_sharing_freed_pages:
   case VKI_XENMEM_get_sharing_shared_pages:
      break;

   default:
      bad_subop(tid, layout, arrghs, status, flags,
                "__HYPERVISOR_memory_op", ARG1);
      break;
   }
}

PRE(mmuext_op)
{
   struct vki_xen_mmuext_op *ops = (struct vki_xen_mmuext_op *)ARG1;
   unsigned int i, nr = ARG2;

   for (i=0; i<nr; i++) {
      struct vki_xen_mmuext_op *op = ops + i;
      PRE_MEM_READ("__HYPERVISOR_MMUEXT_OP cmd",
                   (Addr)&op->cmd, sizeof(op->cmd));
      switch(op->cmd) {
      case VKI_XEN_MMUEXT_PIN_L1_TABLE:
      case VKI_XEN_MMUEXT_PIN_L2_TABLE:
      case VKI_XEN_MMUEXT_PIN_L3_TABLE:
      case VKI_XEN_MMUEXT_PIN_L4_TABLE:
      case VKI_XEN_MMUEXT_UNPIN_TABLE:
      case VKI_XEN_MMUEXT_NEW_BASEPTR:
      case VKI_XEN_MMUEXT_CLEAR_PAGE:
      case VKI_XEN_MMUEXT_COPY_PAGE:
      case VKI_XEN_MMUEXT_MARK_SUPER:
      case VKI_XEN_MMUEXT_UNMARK_SUPER:
         PRE_MEM_READ("__HYPERVISOR_MMUEXT_OP arg1.mfn",
                      (Addr)&op->arg1.mfn,
                      sizeof(op->arg1.mfn));
         break;

      case VKI_XEN_MMUEXT_INVLPG_LOCAL:
      case VKI_XEN_MMUEXT_INVLPG_ALL:
      case VKI_XEN_MMUEXT_SET_LDT:
         PRE_MEM_READ("__HYPERVISOR_MMUEXT_OP arg1.mfn",
                      (Addr)&op->arg1.linear_addr,
                      sizeof(op->arg1.linear_addr));
         break;

      case VKI_XEN_MMUEXT_TLB_FLUSH_LOCAL:
      case VKI_XEN_MMUEXT_TLB_FLUSH_MULTI:
      case VKI_XEN_MMUEXT_INVLPG_MULTI:
      case VKI_XEN_MMUEXT_TLB_FLUSH_ALL:
      case VKI_XEN_MMUEXT_FLUSH_CACHE:
      case VKI_XEN_MMUEXT_NEW_USER_BASEPTR:
      case VKI_XEN_MMUEXT_FLUSH_CACHE_GLOBAL:
         /* None */
         break;
      }

      switch(op->cmd) {
      case VKI_XEN_MMUEXT_SET_LDT:
         PRE_MEM_READ("__HYPERVISOR_MMUEXT_OP arg2.nr_ents",
                      (Addr)&op->arg2.nr_ents,
                      sizeof(op->arg2.nr_ents));
         break;

      case VKI_XEN_MMUEXT_TLB_FLUSH_MULTI:
      case VKI_XEN_MMUEXT_INVLPG_MULTI:
         /* How many??? */
         PRE_MEM_READ("__HYPERVISOR_MMUEXT_OP arg2.vcpumask",
                      (Addr)&op->arg2.vcpumask,
                      sizeof(op->arg2.vcpumask));
         break;

      case VKI_XEN_MMUEXT_COPY_PAGE:
         PRE_MEM_READ("__HYPERVISOR_MMUEXT_OP arg2.src_mfn",
                      (Addr)&op->arg2.src_mfn,
                      sizeof(op->arg2.src_mfn));
         break;

      case VKI_XEN_MMUEXT_PIN_L1_TABLE:
      case VKI_XEN_MMUEXT_PIN_L2_TABLE:
      case VKI_XEN_MMUEXT_PIN_L3_TABLE:
      case VKI_XEN_MMUEXT_PIN_L4_TABLE:
      case VKI_XEN_MMUEXT_UNPIN_TABLE:
      case VKI_XEN_MMUEXT_NEW_BASEPTR:
      case VKI_XEN_MMUEXT_TLB_FLUSH_LOCAL:
      case VKI_XEN_MMUEXT_INVLPG_LOCAL:
      case VKI_XEN_MMUEXT_TLB_FLUSH_ALL:
      case VKI_XEN_MMUEXT_INVLPG_ALL:
      case VKI_XEN_MMUEXT_FLUSH_CACHE:
      case VKI_XEN_MMUEXT_NEW_USER_BASEPTR:
      case VKI_XEN_MMUEXT_CLEAR_PAGE:
      case VKI_XEN_MMUEXT_FLUSH_CACHE_GLOBAL:
      case VKI_XEN_MMUEXT_MARK_SUPER:
      case VKI_XEN_MMUEXT_UNMARK_SUPER:
         /* None */
         break;
      }
   }
}

static void pre_evtchn_op(ThreadId tid,
                          SyscallArgLayout*     layout,
                          /*MOD*/SyscallArgs*   arrghs,
                          /*OUT*/SyscallStatus* status,
                          /*OUT*/UWord*         flags,
                          __vki_u32 cmd, void *arg, int compat)
{
   PRINT("__HYPERVISOR_event_channel_op%s ( %d, %p )",
         compat ? "_compat" : "", cmd, arg);

   switch (cmd) {
   case VKI_XEN_EVTCHNOP_alloc_unbound: {
      struct vki_xen_evtchn_alloc_unbound *alloc_unbound = arg;
      PRE_MEM_READ("EVTCHNOP_alloc_unbound dom",
                   (Addr)&alloc_unbound->dom, sizeof(alloc_unbound->dom));
      PRE_MEM_READ("EVTCHNOP_alloc_unbound remote_dom",
                   (Addr)&alloc_unbound->remote_dom,
                   sizeof(alloc_unbound->remote_dom));
      break;
   }
   default:
      if ( compat )
         bad_subop(tid, layout, arrghs, status, flags,
                   "__HYPERVISOR_event_channel_op_compat", cmd);
      else
         bad_subop(tid, layout, arrghs, status, flags,
                   "__HYPERVISOR_event_channel_op", cmd);
      break;
   }
}

PRE(evtchn_op)
{
   pre_evtchn_op(tid, layout, arrghs, status, flags,
                 ARG1, (void *)ARG2, 0);
}

PRE(evtchn_op_compat)
{
   struct vki_xen_evtchn_op *evtchn = (struct vki_xen_evtchn_op *)ARG1;
   PRE_MEM_READ("__HYPERVISOR_event_channel_op_compat",
                ARG1, sizeof(*evtchn));

   pre_evtchn_op(tid, layout, arrghs, status, flags,
                 evtchn->cmd, &evtchn->u, 1);
}

PRE(xen_version)
{
   PRINT("__HYPERVISOR_xen_version ( %ld, %lx )", ARG1, ARG2);

   switch (ARG1) {
   case VKI_XENVER_version:
   case VKI_XENVER_extraversion:
   case VKI_XENVER_compile_info:
   case VKI_XENVER_capabilities:
   case VKI_XENVER_changeset:
   case VKI_XENVER_platform_parameters:
   case VKI_XENVER_get_features:
   case VKI_XENVER_pagesize:
   case VKI_XENVER_guest_handle:
   case VKI_XENVER_commandline:
      /* No inputs */
      break;

   default:
      bad_subop(tid, layout, arrghs, status, flags,
                "__HYPERVISOR_xen_version", ARG1);
      break;
   }
}

PRE(grant_table_op)
{
   PRINT("__HYPERVISOR_grant_table_op ( %ld, 0x%lx, %ld )", ARG1, ARG2, ARG3);
   switch (ARG1) {
   case VKI_XEN_GNTTABOP_setup_table: {
      struct vki_xen_gnttab_setup_table *gst =
	      (struct vki_xen_gnttab_setup_table*)ARG2;
      PRE_MEM_READ("VKI_XEN_GNTTABOP_setup_table dom",
		   (Addr)&gst->dom, sizeof(gst->dom));
      PRE_MEM_READ("VKI_XEN_GNTTABOP_setup_table nr_frames",
                   (Addr)&gst->nr_frames, sizeof(gst->nr_frames));
      break;
   }
   default:
      bad_subop(tid, layout, arrghs, status, flags,
                "__HYPERVISOR_grant_table_op", ARG1);
      break;
   }
}

PRE(sysctl) {
   struct vki_xen_sysctl *sysctl = (struct vki_xen_sysctl *)ARG1;

   PRINT("__HYPERVISOR_sysctl ( %d )", sysctl->cmd);

   /*
    * Common part of xen_sysctl:
    *    uint32_t cmd;
    *    uint32_t interface_version;
    */
   PRE_MEM_READ("__HYPERVISOR_sysctl", ARG1,
                sizeof(vki_uint32_t) + sizeof(vki_uint32_t));

   if (!sysctl)
      return;

   switch (sysctl->interface_version)
   {
   case 0x00000008:
   case 0x00000009:
   case 0x0000000a:
	   break;
   default:
      VG_(dmsg)("WARNING: sysctl version %"PRIx32" not supported\n",
                sysctl->interface_version);
      if (VG_(clo_verbosity) > 1) {
         VG_(get_and_pp_StackTrace)(tid, VG_(clo_backtrace_size));
      }
      VG_(dmsg)("You may be able to write your own handler.\n");
      VG_(dmsg)("Read the file README_MISSING_SYSCALL_OR_IOCTL.\n");
      VG_(dmsg)("Nevertheless we consider this a bug.  Please report\n");
      VG_(dmsg)("it at http://valgrind.org/support/bug_reports.html &\n");
      VG_(dmsg)("http://wiki.xen.org/wiki/Reporting_Bugs_against_Xen.\n");

      SET_STATUS_Failure(VKI_EINVAL);
      return;
   }

#define __PRE_XEN_SYSCTL_READ(_sysctl, _union, _field)			\
      PRE_MEM_READ("XEN_SYSCTL_" #_sysctl " u." #_union "." #_field,	\
                   (Addr)&sysctl->u._union._field,			\
                   sizeof(sysctl->u._union._field))
#define PRE_XEN_SYSCTL_READ(_sysctl, _field) \
      __PRE_XEN_SYSCTL_READ(_sysctl, _sysctl, _field)

   switch (sysctl->cmd) {
   case VKI_XEN_SYSCTL_getdomaininfolist:
      switch (sysctl->interface_version)
      {
      case 0x00000008:
	 PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, first_domain);
	 PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, max_domains);
	 PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, buffer);
	 break;
      case 0x00000009:
	 PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, first_domain);
	 PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, max_domains);
	 PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, buffer);
	 break;
      }
      break;

   case VKI_XEN_SYSCTL_sched_id:
       /* No inputs */
       break;

   case VKI_XEN_SYSCTL_cpupool_op:
      PRE_XEN_SYSCTL_READ(cpupool_op, op);

      switch(sysctl->u.cpupool_op.op) {
      case VKI_XEN_SYSCTL_CPUPOOL_OP_CREATE:
      case VKI_XEN_SYSCTL_CPUPOOL_OP_DESTROY:
      case VKI_XEN_SYSCTL_CPUPOOL_OP_INFO:
      case VKI_XEN_SYSCTL_CPUPOOL_OP_ADDCPU:
      case VKI_XEN_SYSCTL_CPUPOOL_OP_RMCPU:
      case VKI_XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN:
         PRE_XEN_SYSCTL_READ(cpupool_op, cpupool_id);
      }

      if (sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_CREATE)
         PRE_XEN_SYSCTL_READ(cpupool_op, sched_id);

      if (sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN)
         PRE_XEN_SYSCTL_READ(cpupool_op, domid);

      if (sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_ADDCPU ||
          sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_RMCPU)
         PRE_XEN_SYSCTL_READ(cpupool_op, cpu);

      break;

   case VKI_XEN_SYSCTL_physinfo:
      /* No input params */
      break;

   case VKI_XEN_SYSCTL_topologyinfo:
      PRE_XEN_SYSCTL_READ(topologyinfo, max_cpu_index);
      PRE_XEN_SYSCTL_READ(topologyinfo, cpu_to_core);
      PRE_XEN_SYSCTL_READ(topologyinfo, cpu_to_socket);
      PRE_XEN_SYSCTL_READ(topologyinfo, cpu_to_node);
      break;

   case VKI_XEN_SYSCTL_numainfo:
      PRE_XEN_SYSCTL_READ(numainfo, max_node_index);
      PRE_XEN_SYSCTL_READ(numainfo, node_to_memsize);
      PRE_XEN_SYSCTL_READ(numainfo, node_to_memfree);
      PRE_XEN_SYSCTL_READ(numainfo, node_to_node_distance);
      break;

   default:
      bad_subop(tid, layout, arrghs, status, flags,
                "__HYPERVISOR_sysctl", sysctl->cmd);
      break;
   }
#undef PRE_XEN_SYSCTL_READ
#undef __PRE_XEN_SYSCTL_READ
}

PRE(domctl)
{
   struct vki_xen_domctl *domctl = (struct vki_xen_domctl *)ARG1;

   PRINT("__HYPERVISOR_domctl ( %d ) on dom%d", domctl->cmd, domctl->domain);

   /*
    * Common part of xen_domctl:
    *    vki_uint32_t cmd;
    *    vki_uint32_t interface_version;
    *    vki_xen_domid_t  domain;
    */
   PRE_MEM_READ("__HYPERVISOR_domctl", ARG1,
                sizeof(vki_uint32_t) + sizeof(vki_uint32_t)
		+ sizeof(vki_xen_domid_t));

   if (!domctl)
      return;

   switch (domctl->interface_version)
   {
   case 0x00000007:
   case 0x00000008:
   case 0x00000009:
	   break;
   default:
      VG_(dmsg)("WARNING: domctl version %"PRIx32" not supported\n",
                domctl->interface_version);
      if (VG_(clo_verbosity) > 1) {
         VG_(get_and_pp_StackTrace)(tid, VG_(clo_backtrace_size));
      }
      VG_(dmsg)("You may be able to write your own handler.\n");
      VG_(dmsg)("Read the file README_MISSING_SYSCALL_OR_IOCTL.\n");
      VG_(dmsg)("Nevertheless we consider this a bug.  Please report\n");
      VG_(dmsg)("it at http://valgrind.org/support/bug_reports.html &\n");
      VG_(dmsg)("http://wiki.xen.org/wiki/Reporting_Bugs_against_Xen.\n");

      SET_STATUS_Failure(VKI_EINVAL);
      return;
   }

#define __PRE_XEN_DOMCTL_READ(_domctl, _union, _field)			\
      PRE_MEM_READ("XEN_DOMCTL_" #_domctl " u." #_union "." #_field,	\
                   (Addr)&domctl->u._union._field,			\
                   sizeof(domctl->u._union._field))
#define PRE_XEN_DOMCTL_READ(_domctl, _field) \
      __PRE_XEN_DOMCTL_READ(_domctl, _domctl, _field)

   switch (domctl->cmd) {
   case VKI_XEN_DOMCTL_destroydomain:
   case VKI_XEN_DOMCTL_pausedomain:
   case VKI_XEN_DOMCTL_max_vcpus:
   case VKI_XEN_DOMCTL_get_address_size:
   case VKI_XEN_DOMCTL_gettscinfo:
   case VKI_XEN_DOMCTL_getdomaininfo:
   case VKI_XEN_DOMCTL_unpausedomain:
      /* No input fields. */
      break;

   case VKI_XEN_DOMCTL_createdomain:
      PRE_XEN_DOMCTL_READ(createdomain, ssidref);
      PRE_XEN_DOMCTL_READ(createdomain, handle);
      PRE_XEN_DOMCTL_READ(createdomain, flags);
      break;

   case VKI_XEN_DOMCTL_max_mem:
      PRE_XEN_DOMCTL_READ(max_mem, max_memkb);
      break;

   case VKI_XEN_DOMCTL_set_address_size:
      __PRE_XEN_DOMCTL_READ(set_address_size, address_size, size);
      break;

   case VKI_XEN_DOMCTL_settscinfo:
      __PRE_XEN_DOMCTL_READ(settscinfo, tsc_info, info.tsc_mode);
      __PRE_XEN_DOMCTL_READ(settscinfo, tsc_info, info.gtsc_khz);
      __PRE_XEN_DOMCTL_READ(settscinfo, tsc_info, info.incarnation);
      __PRE_XEN_DOMCTL_READ(settscinfo, tsc_info, info.elapsed_nsec);
      break;

   case VKI_XEN_DOMCTL_hypercall_init:
      PRE_XEN_DOMCTL_READ(hypercall_init, gmfn);
      break;

   case VKI_XEN_DOMCTL_getvcpuinfo:
      PRE_XEN_DOMCTL_READ(getvcpuinfo, vcpu);
      break;

   case VKI_XEN_DOMCTL_scheduler_op:
      PRE_XEN_DOMCTL_READ(scheduler_op, sched_id);
      PRE_XEN_DOMCTL_READ(scheduler_op, cmd);
      if ( domctl->u.scheduler_op.cmd == VKI_XEN_DOMCTL_SCHEDOP_putinfo ) {
         switch(domctl->u.scheduler_op.sched_id) {
         case VKI_XEN_SCHEDULER_SEDF:
            PRE_XEN_DOMCTL_READ(scheduler_op, u.sedf.period);
            PRE_XEN_DOMCTL_READ(scheduler_op, u.sedf.slice);
            PRE_XEN_DOMCTL_READ(scheduler_op, u.sedf.latency);
            PRE_XEN_DOMCTL_READ(scheduler_op, u.sedf.extratime);
            PRE_XEN_DOMCTL_READ(scheduler_op, u.sedf.weight);
            break;
         case VKI_XEN_SCHEDULER_CREDIT:
            PRE_XEN_DOMCTL_READ(scheduler_op, u.credit.weight);
            PRE_XEN_DOMCTL_READ(scheduler_op, u.credit.cap);
            break;
         case VKI_XEN_SCHEDULER_CREDIT2:
            PRE_XEN_DOMCTL_READ(scheduler_op, u.credit2.weight);
            break;
         case VKI_XEN_SCHEDULER_ARINC653:
            break;
         }
      }
      break;

   case VKI_XEN_DOMCTL_getvcpuaffinity:
      __PRE_XEN_DOMCTL_READ(getvcpuaffinity, vcpuaffinity, vcpu);
      break;

   case VKI_XEN_DOMCTL_setvcpuaffinity:
      __PRE_XEN_DOMCTL_READ(setvcpuaffinity, vcpuaffinity, vcpu);
      PRE_MEM_READ("XEN_DOMCTL_setvcpuaffinity u.vcpuaffinity.cpumap.bitmap",
                   (Addr)domctl->u.vcpuaffinity.cpumap.bitmap.p,
                   domctl->u.vcpuaffinity.cpumap.nr_bits / 8);
      break;

   case VKI_XEN_DOMCTL_getnodeaffinity:
      __PRE_XEN_DOMCTL_READ(nodeaffinity, nodeaffinity, nodemap.nr_bits);
      break;
   case VKI_XEN_DOMCTL_setnodeaffinity:
      __PRE_XEN_DOMCTL_READ(nodeaffinity, nodeaffinity, nodemap.nr_bits);
      PRE_MEM_READ("XEN_DOMCTL_setnodeaffinity u.nodeaffinity.cpumap.bitmap",
                   (Addr)domctl->u.nodeaffinity.nodemap.bitmap.p,
                   domctl->u.nodeaffinity.nodemap.nr_bits / 8);
      break;

   case VKI_XEN_DOMCTL_getvcpucontext:
      __PRE_XEN_DOMCTL_READ(getvcpucontext, vcpucontext, vcpu);
      break;

   case VKI_XEN_DOMCTL_setvcpucontext:
      __PRE_XEN_DOMCTL_READ(setvcpucontext, vcpucontext, vcpu);
      __PRE_XEN_DOMCTL_READ(setvcpucontext, vcpucontext, ctxt.p);
      break;

   case VKI_XEN_DOMCTL_set_cpuid:
      PRE_MEM_READ("XEN_DOMCTL_set_cpuid u.cpuid",
                   (Addr)&domctl->u.cpuid, sizeof(domctl->u.cpuid));
      break;

   case VKI_XEN_DOMCTL_getvcpuextstate:
      __PRE_XEN_DOMCTL_READ(getvcpuextstate, vcpuextstate, vcpu);
      __PRE_XEN_DOMCTL_READ(getvcpuextstate, vcpuextstate, xfeature_mask);
      __PRE_XEN_DOMCTL_READ(getvcpuextstate, vcpuextstate, size);
      __PRE_XEN_DOMCTL_READ(getvcpuextstate, vcpuextstate, buffer);
      break;

   default:
      bad_subop(tid, layout, arrghs, status, flags,
                "__HYPERVISOR_domctl", domctl->cmd);
      break;
   }
#undef PRE_XEN_DOMCTL_READ
#undef __PRE_XEN_DOMCTL_READ
}

PRE(hvm_op)
{
   unsigned long op = ARG1;
   void *arg = (void *)(unsigned long)ARG2;

   PRINT("__HYPERVISOR_hvm_op ( %ld, %p )", op, arg);

#define __PRE_XEN_HVMOP_READ(_hvm_op, _type, _field)    \
   PRE_MEM_READ("XEN_HVMOP_" # _hvm_op " " #_field,     \
                (Addr)&((_type*)arg)->_field,           \
                sizeof(((_type*)arg)->_field))
#define PRE_XEN_HVMOP_READ(_hvm_op, _field)                             \
   __PRE_XEN_HVMOP_READ(_hvm_op, "xen_hvm_" # _hvm_op "_t", _field)

   switch (op) {
   case VKI_XEN_HVMOP_set_param:
      __PRE_XEN_HVMOP_READ(set_param, struct vki_xen_hvm_param, domid);
      __PRE_XEN_HVMOP_READ(set_param, struct vki_xen_hvm_param, index);
      __PRE_XEN_HVMOP_READ(set_param, struct vki_xen_hvm_param, value);
      break;

   case VKI_XEN_HVMOP_get_param:
      __PRE_XEN_HVMOP_READ(get_param, struct vki_xen_hvm_param, domid);
      __PRE_XEN_HVMOP_READ(get_param, struct vki_xen_hvm_param, index);
      break;

   default:
      bad_subop(tid, layout, arrghs, status, flags,
                "__HYPERVISOR_hvm_op", op);
      break;
   }
#undef __PRE_XEN_HVMOP_READ
#undef PRE_XEN_HVMOP_READ
}

POST(memory_op)
{
   switch (ARG1) {
   case VKI_XENMEM_set_memory_map:
   case VKI_XENMEM_decrease_reservation:
   case VKI_XENMEM_claim_pages:
      /* No outputs */
      break;
   case VKI_XENMEM_increase_reservation:
   case VKI_XENMEM_populate_physmap: {
      struct xen_memory_reservation *memory_reservation =
         (struct xen_memory_reservation *)ARG2;

      POST_MEM_WRITE((Addr)memory_reservation->extent_start.p,
                     sizeof(vki_xen_pfn_t) * memory_reservation->nr_extents);
      break;
   }

   case VKI_XENMEM_get_sharing_freed_pages:
   case VKI_XENMEM_get_sharing_shared_pages:
       /* No outputs */
       break;
   }
}

POST(mmuext_op)
{
   unsigned int *pdone = (unsigned int *)ARG3;
   /* simplistic */
   POST_MEM_WRITE((Addr)pdone, sizeof(*pdone));
}

static void post_evtchn_op(ThreadId tid, __vki_u32 cmd, void *arg, int compat)
{
   switch (cmd) {
   case VKI_XEN_EVTCHNOP_alloc_unbound: {
      struct vki_xen_evtchn_alloc_unbound *alloc_unbound = arg;
      POST_MEM_WRITE((Addr)&alloc_unbound->port, sizeof(alloc_unbound->port));
      break;
   }
   }
}

POST(evtchn_op)
{
   post_evtchn_op(tid, ARG1, (void *)ARG2, 0);
}

POST(evtchn_op_compat)
{
   struct vki_xen_evtchn_op *evtchn = (struct vki_xen_evtchn_op *)ARG1;
   post_evtchn_op(tid, evtchn->cmd, &evtchn->u, 1);
}

POST(xen_version)
{
   switch (ARG1) {
   case VKI_XENVER_version:
      /* No outputs */
      break;
   case VKI_XENVER_extraversion:
      POST_MEM_WRITE((Addr)ARG2, sizeof(vki_xen_extraversion_t));
      break;
   case VKI_XENVER_compile_info:
      POST_MEM_WRITE((Addr)ARG2, sizeof(struct vki_xen_compile_info));
      break;
   case VKI_XENVER_capabilities:
      POST_MEM_WRITE((Addr)ARG2, sizeof(vki_xen_capabilities_info_t));
      break;
   case VKI_XENVER_changeset:
      POST_MEM_WRITE((Addr)ARG2, sizeof(vki_xen_changeset_info_t));
      break;
   case VKI_XENVER_platform_parameters:
      POST_MEM_WRITE((Addr)ARG2, sizeof(struct vki_xen_platform_parameters));
      break;
   case VKI_XENVER_get_features:
      POST_MEM_WRITE((Addr)ARG2, sizeof(struct vki_xen_feature_info));
      break;
   case VKI_XENVER_pagesize:
      /* No outputs */
      break;
   case VKI_XENVER_guest_handle:
      POST_MEM_WRITE((Addr)ARG2, sizeof(vki_xen_domain_handle_t));
      break;
   case VKI_XENVER_commandline:
      POST_MEM_WRITE((Addr)ARG2, sizeof(vki_xen_commandline_t));
      break;
   }
}

POST(grant_table_op)
{
   switch (ARG1) {
   case VKI_XEN_GNTTABOP_setup_table: {
      struct vki_xen_gnttab_setup_table *gst =
	      (struct vki_xen_gnttab_setup_table*)ARG2;
      PRE_MEM_WRITE("VKI_XEN_GNTTABOP_setup_table",
                    (Addr)&gst->status, sizeof(gst->status));
      PRE_MEM_WRITE("VKI_XEN_GNTTABOP_setup_table",
                    (Addr)gst->frame_list.p,
                    sizeof(*gst->frame_list.p) & gst->nr_frames);
      break;
   }
   }
}

POST(sysctl)
{
   struct vki_xen_sysctl *sysctl = (struct vki_xen_sysctl *)ARG1;

   switch (sysctl->interface_version)
   {
   case 0x00000008:
   case 0x00000009:
   case 0x0000000a:
	   break;
   default:
      return;
   }

#define __POST_XEN_SYSCTL_WRITE(_sysctl, _union, _field)        \
      POST_MEM_WRITE((Addr)&sysctl->u._union._field,            \
                     sizeof(sysctl->u._union._field))
#define POST_XEN_SYSCTL_WRITE(_sysctl, _field) \
      __POST_XEN_SYSCTL_WRITE(_sysctl, _sysctl, _field)

   switch (sysctl->cmd) {
   case VKI_XEN_SYSCTL_getdomaininfolist:
      switch (sysctl->interface_version)
      {
      case 0x00000008:
	 POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000008, num_domains);
	 POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000008.buffer.p,
			sizeof(*sysctl->u.getdomaininfolist_00000008.buffer.p)
			* sysctl->u.getdomaininfolist_00000008.num_domains);
	 break;
      case 0x00000009:
	 POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000009, num_domains);
	 POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000009.buffer.p,
			sizeof(*sysctl->u.getdomaininfolist_00000009.buffer.p)
			* sysctl->u.getdomaininfolist_00000009.num_domains);
	 break;
      }
      break;

   case VKI_XEN_SYSCTL_sched_id:
       POST_XEN_SYSCTL_WRITE(sched_id, sched_id);
       break;

   case VKI_XEN_SYSCTL_cpupool_op:
      if (sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_CREATE ||
          sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_INFO)
         POST_XEN_SYSCTL_WRITE(cpupool_op, cpupool_id);
      if (sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_INFO) {
         POST_XEN_SYSCTL_WRITE(cpupool_op, sched_id);
         POST_XEN_SYSCTL_WRITE(cpupool_op, n_dom);
      }
      if (sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_INFO ||
          sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_FREEINFO)
         POST_XEN_SYSCTL_WRITE(cpupool_op, cpumap);
      break;

   case VKI_XEN_SYSCTL_physinfo:
      switch (sysctl->interface_version)
      {
      case 0x00000008:
      case 0x00000009: /* Unchanged from version 8 */
         POST_XEN_SYSCTL_WRITE(physinfo_00000008, threads_per_core);
         POST_XEN_SYSCTL_WRITE(physinfo_00000008, cores_per_socket);
         POST_XEN_SYSCTL_WRITE(physinfo_00000008, nr_cpus);
         POST_XEN_SYSCTL_WRITE(physinfo_00000008, max_cpu_id);
         POST_XEN_SYSCTL_WRITE(physinfo_00000008, nr_nodes);
         POST_XEN_SYSCTL_WRITE(physinfo_00000008, max_node_id);
         POST_XEN_SYSCTL_WRITE(physinfo_00000008, cpu_khz);
         POST_XEN_SYSCTL_WRITE(physinfo_00000008, total_pages);
         POST_XEN_SYSCTL_WRITE(physinfo_00000008, free_pages);
         POST_XEN_SYSCTL_WRITE(physinfo_00000008, scrub_pages);
         POST_XEN_SYSCTL_WRITE(physinfo_00000008, hw_cap[8]);
         POST_XEN_SYSCTL_WRITE(physinfo_00000008, capabilities);
         break;
      case 0x0000000a:
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, threads_per_core);
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, cores_per_socket);
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, nr_cpus);
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, max_cpu_id);
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, nr_nodes);
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, max_node_id);
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, cpu_khz);
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, total_pages);
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, free_pages);
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, scrub_pages);
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, outstanding_pages);
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, hw_cap[8]);
         POST_XEN_SYSCTL_WRITE(physinfo_0000000a, capabilities);
         break;
      }
      break;

   case VKI_XEN_SYSCTL_topologyinfo:
      POST_XEN_SYSCTL_WRITE(topologyinfo, max_cpu_index);
      if (sysctl->u.topologyinfo.cpu_to_core.p)
         POST_MEM_WRITE((Addr)sysctl->u.topologyinfo.cpu_to_core.p,
                     sizeof(uint32_t) * sysctl->u.topologyinfo.max_cpu_index);
      if (sysctl->u.topologyinfo.cpu_to_socket.p)
         POST_MEM_WRITE((Addr)sysctl->u.topologyinfo.cpu_to_socket.p,
                     sizeof(uint32_t) * sysctl->u.topologyinfo.max_cpu_index);
      if (sysctl->u.topologyinfo.cpu_to_node.p)
         POST_MEM_WRITE((Addr)sysctl->u.topologyinfo.cpu_to_node.p,
                     sizeof(uint32_t) * sysctl->u.topologyinfo.max_cpu_index);
      break;

   case VKI_XEN_SYSCTL_numainfo:
      POST_XEN_SYSCTL_WRITE(numainfo, max_node_index);
      POST_MEM_WRITE((Addr)sysctl->u.numainfo.node_to_memsize.p,
                     sizeof(uint64_t) * sysctl->u.numainfo.max_node_index);
      POST_MEM_WRITE((Addr)sysctl->u.numainfo.node_to_memfree.p,
                     sizeof(uint64_t) * sysctl->u.numainfo.max_node_index);
      POST_MEM_WRITE((Addr)sysctl->u.numainfo.node_to_node_distance.p,
                     sizeof(uint32_t) * sysctl->u.numainfo.max_node_index);
      break;
   }
#undef POST_XEN_SYSCTL_WRITE
#undef __POST_XEN_SYSCTL_WRITE
}

POST(domctl){
   struct vki_xen_domctl *domctl = (struct vki_xen_domctl *)ARG1;

   switch (domctl->interface_version) {
   case 0x00000007:
   case 0x00000008:
   case 0x00000009:
	   break;
   default:
	   return;
   }

#define __POST_XEN_DOMCTL_WRITE(_domctl, _union, _field)        \
   POST_MEM_WRITE((Addr)&domctl->u._union._field,               \
                  sizeof(domctl->u._union._field));
#define POST_XEN_DOMCTL_WRITE(_domctl, _field)          \
   __POST_XEN_DOMCTL_WRITE(_domctl, _domctl, _field)

   switch (domctl->cmd) {
   case VKI_XEN_DOMCTL_createdomain:
   case VKI_XEN_DOMCTL_destroydomain:
   case VKI_XEN_DOMCTL_pausedomain:
   case VKI_XEN_DOMCTL_max_mem:
   case VKI_XEN_DOMCTL_set_address_size:
   case VKI_XEN_DOMCTL_settscinfo:
   case VKI_XEN_DOMCTL_hypercall_init:
   case VKI_XEN_DOMCTL_setvcpuaffinity:
   case VKI_XEN_DOMCTL_setvcpucontext:
   case VKI_XEN_DOMCTL_setnodeaffinity:
   case VKI_XEN_DOMCTL_set_cpuid:
   case VKI_XEN_DOMCTL_unpausedomain:
      /* No output fields */
      break;

   case VKI_XEN_DOMCTL_max_vcpus:
      POST_XEN_DOMCTL_WRITE(max_vcpus, max);
      break;

   case VKI_XEN_DOMCTL_get_address_size:
      __POST_XEN_DOMCTL_WRITE(get_address_size, address_size, size);
      break;

   case VKI_XEN_DOMCTL_gettscinfo:
      __POST_XEN_DOMCTL_WRITE(settscinfo, tsc_info, info.tsc_mode);
      __POST_XEN_DOMCTL_WRITE(settscinfo, tsc_info, info.gtsc_khz);
      __POST_XEN_DOMCTL_WRITE(settscinfo, tsc_info, info.incarnation);
      __POST_XEN_DOMCTL_WRITE(settscinfo, tsc_info, info.elapsed_nsec);
      break;

   case VKI_XEN_DOMCTL_getvcpuinfo:
      POST_XEN_DOMCTL_WRITE(getvcpuinfo, online);
      POST_XEN_DOMCTL_WRITE(getvcpuinfo, blocked);
      POST_XEN_DOMCTL_WRITE(getvcpuinfo, running);
      POST_XEN_DOMCTL_WRITE(getvcpuinfo, cpu_time);
      POST_XEN_DOMCTL_WRITE(getvcpuinfo, cpu);
      break;

   case VKI_XEN_DOMCTL_scheduler_op:
      if ( domctl->u.scheduler_op.cmd == VKI_XEN_DOMCTL_SCHEDOP_getinfo ) {
         switch(domctl->u.scheduler_op.sched_id) {
         case VKI_XEN_SCHEDULER_SEDF:
            POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.period);
            POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.slice);
            POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.latency);
            POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.extratime);
            POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.weight);
            break;
         case VKI_XEN_SCHEDULER_CREDIT:
            POST_XEN_DOMCTL_WRITE(scheduler_op, u.credit.weight);
            POST_XEN_DOMCTL_WRITE(scheduler_op, u.credit.cap);
            break;
         case VKI_XEN_SCHEDULER_CREDIT2:
            POST_XEN_DOMCTL_WRITE(scheduler_op, u.credit2.weight);
            break;
         case VKI_XEN_SCHEDULER_ARINC653:
            break;
         }
      }
      break;

   case VKI_XEN_DOMCTL_getvcpuaffinity:
      POST_MEM_WRITE((Addr)domctl->u.vcpuaffinity.cpumap.bitmap.p,
                     domctl->u.vcpuaffinity.cpumap.nr_bits / 8);
      break;

   case VKI_XEN_DOMCTL_getnodeaffinity:
      POST_MEM_WRITE((Addr)domctl->u.nodeaffinity.nodemap.bitmap.p,
                     domctl->u.nodeaffinity.nodemap.nr_bits / 8);
      break;

   case VKI_XEN_DOMCTL_getdomaininfo:
      switch (domctl->interface_version) {
      case 0x00000007:
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000007, domain);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000007, flags);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000007, tot_pages);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000007, max_pages);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000007, shr_pages);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000007, shared_info_frame);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000007, cpu_time);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000007, nr_online_vcpus);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000007, max_vcpu_id);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000007, ssidref);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000007, handle);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000007, cpupool);
      break;
      case 0x00000008:
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, domain);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, flags);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, tot_pages);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, max_pages);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, shr_pages);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, paged_pages);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, shared_info_frame);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, cpu_time);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, nr_online_vcpus);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, max_vcpu_id);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, ssidref);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, handle);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000008, cpupool);
      break;
      case 0x00000009:
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, domain);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, flags);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, tot_pages);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, max_pages);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, outstanding_pages);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, shr_pages);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, paged_pages);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, shared_info_frame);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, cpu_time);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, nr_online_vcpus);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, max_vcpu_id);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, ssidref);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, handle);
	 POST_XEN_DOMCTL_WRITE(getdomaininfo_00000009, cpupool);
      break;
      }
      break;
   case VKI_XEN_DOMCTL_getvcpucontext:
      __POST_XEN_DOMCTL_WRITE(getvcpucontext, vcpucontext, ctxt.p);
      break;

   case VKI_XEN_DOMCTL_getvcpuextstate:
      __POST_XEN_DOMCTL_WRITE(getvcpuextstate, vcpuextstate, xfeature_mask);
      __POST_XEN_DOMCTL_WRITE(getvcpuextstate, vcpuextstate, size);
      POST_MEM_WRITE((Addr)domctl->u.vcpuextstate.buffer.p,
                     domctl->u.vcpuextstate.size);
      break;

   }
#undef POST_XEN_DOMCTL_WRITE
#undef __POST_XEN_DOMCTL_WRITE
}

POST(hvm_op)
{
   unsigned long op = ARG1;
   void *arg = (void *)(unsigned long)ARG2;

#define __POST_XEN_HVMOP_WRITE(_hvm_op, _type, _field)  \
      POST_MEM_WRITE((Addr)&((_type*)arg)->_field,      \
                     sizeof(((_type*)arg)->_field))
#define POST_XEN_HVMOP_WRITE(_hvm_op, _field) \
      __PRE_XEN_HVMOP_READ(_hvm_op, "xen_hvm_" # _hvm_op "_t", _field)

   switch (op) {
   case VKI_XEN_HVMOP_set_param:
      /* No output paramters */
      break;

   case VKI_XEN_HVMOP_get_param:
      __POST_XEN_HVMOP_WRITE(get_param, struct vki_xen_hvm_param, value);
      break;
   }
#undef __POST_XEN_HVMOP_WRITE
#undef POST_XEN_HVMOP_WRITE
}

typedef
   struct {
      SyscallTableEntry entry;
      int nr_args;
   }
   XenHypercallTableEntry;

#define HYPX_(const, name, nr_args) \
   [const] = { { vgSysWrap_xen_##name##_before, NULL }, nr_args }
#define HYPXY(const, name, nr_args)                     \
   [const] = { { vgSysWrap_xen_##name##_before,         \
                 vgSysWrap_xen_##name##_after },        \
               nr_args }

static XenHypercallTableEntry hypercall_table[] = {
   //    __VKI_XEN_set_trap_table                                  // 0
   //    __VKI_XEN_mmu_update                                      // 1
   //    __VKI_XEN_set_gdt                                         // 2
   //    __VKI_XEN_stack_switch                                    // 3
   //    __VKI_XEN_set_callbacks                                   // 4

   //    __VKI_XEN_fpu_taskswitch                                  // 5
   //    __VKI_XEN_sched_op_compat                                 // 6
   //    __VKI_XEN_platform_op                                     // 7
   //    __VKI_XEN_set_debugreg                                    // 8
   //    __VKI_XEN_get_debugreg                                    // 9

   //    __VKI_XEN_update_descriptor                               // 10
   //                                                                 // 11
   HYPXY(__VKI_XEN_memory_op,               memory_op,         2), // 12
   //    __VKI_XEN_multicall                                       // 13
   //    __VKI_XEN_update_va_mapping                               // 14

   //    __VKI_XEN_set_timer_op                                    // 15
   HYPXY(__VKI_XEN_event_channel_op_compat, evtchn_op_compat,  1), // 16
   HYPXY(__VKI_XEN_xen_version,             xen_version,       2), // 17
   //    __VKI_XEN_console_io                                      // 18
   //    __VKI_XEN_physdev_op_compat                               // 19

   HYPXY(__VKI_XEN_grant_table_op,          grant_table_op,    3), // 20
   //    __VKI_XEN_vm_assist                                       // 21
   //    __VKI_XEN_update_va_mapping_otherdomain                   // 22
   //    __VKI_XEN_iret,                    iret                   // 23
   //    __VKI_XEN_vcpu_op,                 vcpu_op                // 24

   //    __VKI_XEN_set_segment_base                                // 25
   HYPXY(__VKI_XEN_mmuext_op,               mmuext_op,         2), // 26
   //    __VKI_XEN_xsm_op                                          // 27
   //    __VKI_XEN_nmi_op                                          // 28
   //    __VKI_XEN_sched_op                                        // 29

   //    __VKI_XEN_callback_op                                     // 30
   //    __VKI_XEN_xenoprof_op                                     // 31
   HYPXY(__VKI_XEN_event_channel_op,        evtchn_op,         2), // 32
   //    __VKI_XEN_physdev_op                                      // 33
   HYPXY(__VKI_XEN_hvm_op,                  hvm_op,            2), // 34

   HYPXY(__VKI_XEN_sysctl,                  sysctl,            1), // 35
   HYPXY(__VKI_XEN_domctl,                  domctl,            1), // 36
   //    __VKI_XEN_kexec_op                                        // 37
   //    __VKI_XEN_tmem_op                                         // 38
};

static void bad_before ( ThreadId              tid,
                         SyscallArgLayout*     layout,
                         /*MOD*/SyscallArgs*   args,
                         /*OUT*/SyscallStatus* status,
                         /*OUT*/UWord*         flags )
{
   VG_(dmsg)("WARNING: unhandled hypercall: %s\n",
      VG_SYSNUM_STRING_EXTRA(args->sysno));
   if (VG_(clo_verbosity) > 1) {
      VG_(get_and_pp_StackTrace)(tid, VG_(clo_backtrace_size));
   }
   VG_(dmsg)("You may be able to write your own handler.\n");
   VG_(dmsg)("Read the file README_MISSING_SYSCALL_OR_IOCTL.\n");
   VG_(dmsg)("Nevertheless we consider this a bug.  Please report\n");
   VG_(dmsg)("it at http://valgrind.org/support/bug_reports.html &\n");
   VG_(dmsg)("http://wiki.xen.org/wiki/Reporting_Bugs_against_Xen.\n");

   SET_STATUS_Failure(VKI_ENOSYS);
}

static XenHypercallTableEntry bad_hyper =
{ { bad_before, NULL }, 0 };

static XenHypercallTableEntry* ML_(get_xen_hypercall_entry) ( UInt sysno )
{
   XenHypercallTableEntry *ret = &bad_hyper;

   const UInt hypercall_table_size
      = sizeof(hypercall_table) / sizeof(hypercall_table[0]);

   /* Is it in the contiguous initial section of the table? */
   if (sysno < hypercall_table_size) {
      XenHypercallTableEntry* ent = &hypercall_table[sysno];
      if (ent->entry.before != NULL)
         ret = ent;
   }

   /* Can't find a wrapper */
   return ret;
}

DEFN_PRE_TEMPLATE(xen, hypercall)
{
   XenHypercallTableEntry *ent = ML_(get_xen_hypercall_entry)(SYSNO);

   /* Return number of arguments consumed */
   ARG8 = ent->nr_args;

   vg_assert(ent);
   vg_assert(ent->entry.before);
   (ent->entry.before)( tid, layout, arrghs, status, flags );

}

DEFN_POST_TEMPLATE(xen, hypercall)
{
   XenHypercallTableEntry *ent = ML_(get_xen_hypercall_entry)(SYSNO);

   /* Return number of arguments consumed */
   ARG8 = ent->nr_args;

   vg_assert(ent);
   if (ent->entry.after)
      (ent->entry.after)( tid, arrghs, status );
}

#endif // defined(ENABLE_XEN)

redpajama_set_name: RedPajamaGithub


Revenue per visitor (RPV) has skyrocketed on social media platforms year-on-year, with RPV up 300% on Twitter for brands.
RPV for both first-click and last-click attribution models have rising 150% on Pinterest and by 39% year-on-year on Facebook, according to Adobe Digital Index's Social Intelligence Report.
According to the report the rising RPVs show social is becoming "a more essential component of the marketing mix".
"To make the most of this growing market, consider pilot campaigns within new social channels or increase spend in current social channels. Monitor spend and ROI closely so you can track performance and optimize for greater success," the report said.
Facebook is still the leading social platform but Twitter and Pinterest are starting to close the gap.
Facebook's share of visitors has dropped 20% from its 77% share in 2012.
The social network's drop comes as younger player Twitter leapt a mammoth 258% year-on-year. Pinterest also increased, growing by 84% in one year.
If a brand is struggling to engage its social media community its social team should consider adding a photo to its posts.
Posts with photos have an engagement rate that is a whopping 600% greater than text-based posts.
The engagement with photo posts have increased 8% yoy but engagement with video posts is down 40%.
Overall a brand posts averages 945 likes, 88 shares and 58 comments.
A drop in cost-per-click (CPC) rates and a rise in click-through rates (CTR) have increased Facebook's attractiveness as a marketing tool. However retailers should expect to pay more during the approaching Christmas season, the report warned.
Facebook's CPCs are down 40% yoy while CTRs have grown by 275%. The cost-per click rises by by 42% for retailers during holidays.