text:
Para uma melhor experiência, visita "Juventude em Jogo" no teu computador.
Please visit "Youth in Play" on your computer for the best experience.
HOME CAPITULOS ▾ ▴
1. A fuga possível
2. O Messi do Brasil
3. Um espera incerta
4. Dados em jogo
METANARRATIVA SUBSCREVER -EN-
HOME CHAPTERS ▾ ▴
1. A possible escape
2. Brazil's Messi
3. Limbo
4. Data in play
METANARRATIVE SUBSCRIBE -PT-
Usamos cookies e recolhemos dados estatísticos para melhorar a forma como te apresentamos o jornalismo que fazemos.
We use cookies and collect statistic data to improve the way we present to you the journalism we make.
A Possible Escape
Brazil's Messi
Data in play
BY BBSeditores	/Histórias de vida /No Comments
My house is a stadium chapter I
Valentine spent his childhood playing with a plastic ball in the small square in the neighbourhood where he lived in Abuja, the capital of Nigeria. He still fondly keeps the football boots his father got him as a child. Football was his "pipe dream". His parents wanted him to study and he, a child, never had the courage to say out loud what was going through his head.
Nobody would have guessed that, at the age of 19, he would be playing at Associação Desportiva (AD) Nogueirense and that he would be living in Nogueira do Cravo, a small village in the district of Coimbra, Portugal, with just over 2,300 inhabitants. The day that agent Tersoo John told him that he had "the heart to play the game", that "so much courage is not normal" in a boy of his age, it changed his life. He remembers it as if it were yesterday.
We meet him inside the AD Nogueirense Stadium, in a house about 20 metres from the pitch and the changing rooms, which he shares with two other Nigerians, a Brazilian, an Ivorian, a Malian, a Guinean and four Portuguese. "I know they were in there, the house wasn't very clean, it was the cleaner's day off," Rui Fernandes, the club sports director says. "It's easier for us to get foreign rather than Portuguese players. A foreign player who comes here wants to excel, to be as successful as possible. We are a small club with fewer connections, we have our difficulties, the team we have now is the best we can maintain with our resources. That's the reality."
The realities that the sports director refers to are food and board. "There's one player who has been here for two years without receiving a thing. I was lucky, I am one of the two who have a professional contract," Valentine tells us. The club actually goes above and beyond its obligations: "the first month, they gave me an envelope with 100 euros. I don't know how much the others received because they called us all in separately," he remembers.
Although the Portuguese Football Federation (FPF) requires all players to be registered for the National Adult Championship, the league AD Nogueirense participates in, it does not require that players have a professional contract. "It's an amateur competition and legislation dictates that contracts are only necessary for professionals," confirms lawyer João Diogo Manteigas.
Valentine is an exception, because, as the AD Nogueirense sports director explains, "he doesn't have Portuguese nationality or Portuguese residence." Giving him the contract was the "only alternative". Besides this, the technical team identified him as one of the players with the most potential. Were he to be sold, his contract guarantees the club their share of the transfer fee.
Of the AD Nogueirense players who share a house with Valentine, only the Malian Sydou Ouilly is not, and never was, registered with the FPF, according to the search tool available on the institution's website. This is despite having been in Portugal for four years and having spent time at clubs such as Leixões Sport Club, Oliveira do Hospital Football Club and Sport Clube Mineiro Aljustrelense. As Manteigas explains, the registration forms required for the FPF, for either amateur or profissional players, provide this loophole.
Valentine is a prime example. Three months after having arrived in Portugal – in 2013 – with a tourist visa, he found himself in an illegal situation. He only received his first residence permit in December 2015. Despite this, his name has been registered on the FPF as having played for Paços de Ferreira and now AD Nogueirense.
The FPF deny knowledge of these cases and say, "registrations that break FIFA's rules are impossible in Portugal." The institution guarantees that it also "monitors the transfers of players and cooperates with the Portuguese authorities in order to identify possible irregularities."
The second time it was for good chapter II
Valentine Akpey formed part of a group of eight young people who left Nigeria for Portugal in 2013. He wanted to make his "pipe dream" a reality. Hope came to him in the form of a promise from Portuguese trainer Sérgio Daniel and his Nigerian agent, Tersoo John. He had to show what he was worth, give his all and they guaranteed that if he did this, he would get into a good club. He was 17 years old.
European Dream Came True was the name of the project promoted by Sérgio Daniel and the De' Elite Sports Group, academy, a talent-scouting company. When the group still had a website, the Nigerian agent Garba Tijani was introduced as the president, Tersoo John as the vice-president and Sérgio Daniel as the technical director.
You can read the call for participants in the project on the Nairaland online forum, where it was published two years ago: "This project consists in choosing the best […] Nigerian players under the categories U12 to U23 s for AC Milan of Italy, AS Monaco of France and SC Olhanense of Portugal. The selection process will be done by scouts and representatives chosen by the teams, led by Sérgio Daniel. Will be fully filmed so that the teams in question can see DVDs of athletes."
Valentine, introduced on Sérgio Daniel's Youtube account as "Spider Man" and one of the academy's "brightest stars", was one of the ones selected. He had been selected in 2012 and the then president of SC Olhanense was expecting him in the Algarve, but at the time his visa was denied.
A year later, fate nearly played another nasty trick on him: on the way to the Portuguese embassy in Nigeria for a visa interview appointment, the bus he was travelling on with other players was stopped by a group of armed assailants. The thieves went through all their luggage and took all their mobile phones and computers.
Valentine was convinced he would be late: "First I thought I was going to die, then I just thought about how it could be that I was going to turn up to the meeting in the clothes I was wearing, without having had a wash, without brushing my teeth. I was nervous."
When he finally arrived, he remembers that there were a number of different offices, and a man took him through. He described the conversation as if it were yesterday: they asked him where he wanted to go, why, who was taking him, who would pay for this flight and for what club he was going to play. He answered all the questions. At the end, "he checked on the internet if Sport Clube Estrela was a real club and he told me the interview was over." It took two weeks for the decision to arrive.
No club and no plan B chapter III
Valentine arrived in Portugal on 13 November 2013. Three months away from turning 18, he could not sign any professional contract. "Before coming, my academy bought a district club, Sport Clube Estrela. We knew we'd stay there until we got used to the climate." They trained for a month, played some friendlies and even played with Benfica and Sporting.
It was during one of these matches, in the Algarve against Olhanense, that an agent noticed him: "he told me I was a good player and that he wanted to take me to other clubs." A week later, Valentine was training with the FC Porto Youths. This is how what he calls his "career as a professional footballer" started.
After FC Porto, he moved to the Paços de Ferreira Youth team, where he played for a season, but he was let go before signing the promised professional contract. "The trainer Paulo Fonseca said he would put me in the first team, but he left for SC Braga before the end of the season and club management never said anything to me."
He was left without a club and no Plan B. During the summer of 2014, while he spent the holidays in Portalegre, he was "caught" by the Portuguese Borders and Immigration Control (SEF) who gave him 20 days to rectify his situation or leave the country: "I was with Nigerian friends, who played for the SC Estrela [the club owned by De Elite Sports Group]. At that point I went to Paços, so I had no more problems, but they got taken to court in the end."
A short while later, at the end of 2014, the SEF investigated 104 sports clubs and associations throughout the country and identified 508 foreign athletes, of which 203 were in the country illegally. Athletes without a visa or resident's card were found in at least 25 clubs, reported the weekly newspaper Expresso in February 2015. That same month, the sports paper Record published a news item entitled, "SEF detains players training at Estrela de Portalegre [name by which the SC Estrela is known]" and the club management reported on their Facebook page that they would not continue to participate in the Male Adult District Championship.
In an attempt to control the increasing number of undocumented foreign footballers playing in Portugal, the Portuguese Football Federation, the Borders and Immigration Control, the Portuguese Professional Football League and the Professional Footballers' Union signed a protocol in June 2015, to "extend the scope of cooperation with regard to obtaining residence permits for foreign players", to create a work group that monitors cases of particular importance and promotes clarifications together with agents and sporting associations as regards the legislation on the "entrance, permanence, exit and removal of foreign citizens from the national territory."
I don't want to go back; I can't go back chapter IV
In August 2015, Valentine accepted an offer to play for AD Nogueirense. "My agent had to bring me here." You can't get any further than the only coffee shop in Nogueira do Cravo on foot. He only leaves the village when the trainer, Rui Vale, is available and takes them to the closest town, Oliviera do Hospital. His day-to-day life consists of sleeping, watching films, training and "staying focused". "I have to keep myself focused" is the phrase that he repeats the most.
Ever since he arrived in Portugal, he has always had housing and food, but he has never earned more than 250€ per month, paid by Paços de Ferreira after five months of complaining. "When I left Nigeria, I hoped that it was going to be easier, it's not how I thought it would be… It's difficult, but I need to keep going to be strong, to struggle, because I have to get to where I want."
"Many of my friends still don't understand that things here aren't as easy as they think. They think that as soon as you arrive in Europe, you'll start to earn money and you'll get rich, but it's nothing like that. They ask me to send them money and I say: 'When I have some, I'll send you it, but at the moment I don't have anything.'"
Even so he says that he didn't come with false hopes. He repeats that his agent, Tersoo John, is a "great friend", and he is "different from other agents": "he helps me and he sends me a bit of money. I am still young, I don't need much."
Valentine left Nigeria without the knowledge of his family and friends, a short time after his younger brother, who was also preparing to leave for Europe, had died. "He was playing football, it was raining a lot and lightning struck. When the lightning strike hit the ground, all the players fell down. Slowly they started to get up, one by one. All of them, except my brother." He doesn't regret his decision, but he does miss home, a lot. He misses the food, his girlfriend, his mum. If he wanted to go back to Nigeria, he's sure that Tersoo John would pay for his ticket. But he doesn't want to, or he can't, or he can't even imagine the possibility. Not like this, having nothing, yet to fulfil his dream.
Comente Cancel reply
About Divergente
Divergente é uma marca Bagabaga Studios, CRL :: NIPC: 510672531 :: Número de registo na ERC: 126622 :: Av. Berna, 26 C, 1069-061 Lisboa

redpajama_set_name: RedPajamaCommonCrawl


text:
READER SUBMITTED
Brugnoli to retire as executive director of MHA
Amy Wagner
YourNews contributor
VERO BEACH -- Dr. Robert J. Brugnoli, executive director of the Mental Health Association in Indian River County, will retire from the organization at the end of 2018.
"I'm really happy with what we have been able to build at the MHA," said Brugnoli. "I'm proud that we have become a leader in providing quality mental health services to those at risk regardless of their ability to pay."
MHA board chair Karen Mersky noted Brugnoli has left an important legacy in the local mental health community.
"Dr. Bob has worked tirelessly to identify and meet both the emerging and unmet needs of our community. He has done so with an eye for fiscal responsibility and has worked passionately to develop clear policies and procedures to ensure the MHA's ongoing success.
"He has also continually sought opportunities to deliver the MHA'S message 'It's OK To Get Help.'"
The Mental Health Association board plans to have a new executive director in place before Brugnoli's retirement. Board vice chair Ross Cotherman will lead a search committee that has a clear plan to find the organization's next leader.
Brugnoli will remain at the non-profit organization during the transition period. He plans to continue to support the needs of those facing mental health challenges following his retirement from the MHA.
For more information on the Mental Health Association's Walk-In & Counseling Center, call 772-569-9788.


text:
CES: Verizon Talks Mobile TV
By Glen Dickson
Live mobile television may soon become a mainstream reality now that Verizon has announced at the Consumer Electronics Show that it will launch V Cast Mobile TV, a broadcast mobile TV service provided by Qualcomm subsidiary MediaFLO, in the first quarter of 2007.
The V Cast Mobile TV service, pricing for which was not disclosed, will feature network content from CBS, Fox, NBC, and MTV Networks, including Comedy Central, MTV, and Nickelodeon, that can be received on new mobile phones from LG and Samsung. The programming will not simply be a simulcast of existing network programming, according to John Stratton, Verizon EVP and chief marketing officer, but "the best of what TV has to offer."
For example, one channel demonstrated by Qualcomm executives on a Samsung phone was a compilation of programming from NBC News, including content from MSNBC, CNBC, NBC's Today and Nightly News with Brian Williams. Stratton also suggested that V Cast Mobile TV will carry some live programming, such as sporting events, so fans can follow their teams while they are on the go.
The service will not launch with any content from local broadcasters, though Stratton says "there is an ability, over time, to build in local programming." The V Cast Mobile TV programming will first be offered in East and West coast programming blocks, similar to satellite services.
Verizon President and COO Denny Strigl positioned V Cast Mobile TV as an example of Verizon's two-fold strategy "to build great content delivery systems and deliver great content." He said it would be a great companion to FiOS TV, Verizon's fiber-based television service, which unveiled a new interactive program guide in Las Vegas.
But the reality is that the programming and technology behind V Cast Mobile TV is being sold on a wholesale basis to Verizon Wireless by Qualcomm and its MediaFLO subsidiary, which purchased the broadcast spectrum on UHF channel 55 that will be used to deliver the service and is negotiating the content deals with programming networks.
Qualcomm Chairman and CEO Dr. Paul Jacobs and MediaFLO president Gina Lombardi were both in attendance at the Verizon event.
MediaFLO, which is currently up and running in several test markets including Las Vegas, has been hampered by broadcasters' interference concerns and a drawn-out review of those concerns by the FCC.
But Lombardi says her company is now "doing well" in working with the FCC, which finally set an interference threshold for the service in October.
She also says that local broadcasters on channels that would be affected by MediaFLO's launch on Ch. 55 have been "very receptive" to negotiating agreements regarding interference to their current broadcast operations (stations in channels 52-69 will eventually be vacating those channels anyway as part of the digital TV transition).
Nonetheless, problems still remain in large markets such as San Francisco, where MediaFLO has been unable to launch because of the interference it would cause to Cox station and Fox affiliate KTVU Oakland, which broadcasts DTV on Ch. 56. Lombardi wouldn't comment on whether V Cast Mobile TV would be available in San Francisco or detail which major markets will get the service this year.
V Cast Mobile TV should have about 20 channels at launch, says Lombardi, and seven are live on-air in Las Vegas this week for demonstrations.
The MediaFLO service has been tested with about 4,000 consumers nationwide, she says, and MediaFLO has done trials with Sprint Nextel and T-Mobile in addition to Verizon Wireless.
"We've learned a lot," says Lombardi. "But mainly, people who already love TV really love the service."
MediaFLO may be getting some new competition in the mobile TV space. Crown Castle International announced early Monday that its subsidiary, Modeo, has launched a beta test of its own mobile TV service in New York City.
Modeo says it began distributing Modeo Mobile TV Smartphones, which receive live broadcasts using the DVB-H transmission standard, last week of December. The trial will run with several hundred participants, which Modeo describes as a "select group of wireless carriers, reporters, industry analysts, financial analysts, and content providers," through the first quarter of 2007.
Modeo is also onsite in Las Vegas demonstrating its service, in partnership with Microsoft and HTC, the developer and manufacturer of its Smartphone.
Glen Dickson
At Ice-Cold Sundance, 'Netflix And Chill' Takes on a New Meaning for the Now Tight-Belted Streaming Companies (Bloom)
NFL Playoffs, 'UFC 283' PPV Event: What's On This Weekend in TV Sports (January 21-22)
Alan Komissaroff, Fox News Senior VP, Dies After Heart Attack at 47
Samsung Has Talked to TCL About Licensing FAST 'TV Plus' for Third-Party Smart TVs (Report)
Fifth Largest U.S. MSO Trademarks 'Mediacom Mobile' as 'Junior Cable' Begins MVNO Push


The 12th ATA destination expo will take place in Nairobi, 24th - 26th February at KICC; the second time the event is held in Africa.
Kenya is honored to host this year's event and is taking the opportunity to facilitate the visiting travel agents and professionals meet and link with Kenyan suppliers to better sell Kenya to the US travel market; and for an unforgettable taste of Kenya's diverse, world renown product offering including Safari, MICE, beach, heritage & culture and the great outdoors.
d) World's only wildlife park in a capital city, Nairobi National Park.
Conclude your visit on a high note with an unforgettable safari in Kenya's array of premium wildlife parks and reserves; including 2015 & 2016 winner of 'Africa's leading National Park', Masai Mara National Reserve; or a rejuvenating beach holiday - discover Kenya's 585km pristine beach on the Indian Ocean coastline; or inland for hiking and cultural retreats.
The single tourist visa costs US$100 with a validity period of 90 days thus highly competitive and more value for money.


When you are beaten by another player and your friends ask you what happened, just pull out our article. This is the second part of our Top 30 Excuses When You Lost A Ping-Pong Match and you will find it funny as the first. If you like it feel free to share it!
Let say we find the perfect excuse from our Top 30 Excuses When You Lost A Ping-Pong Match Part 1 we are going to choose "the new plastic ball" this time. We have 29 more to choose from.
Like our first post, it's quick, easy and effective! Just choose a number from our part 1 and part 2 and complete the sentence. No more giving the credit to unworthy opponents!
If you enjoy this post share it, with your table tennis friend, I'm sure they have something to say about it! If you have something extra to add, please share it. Our table tennis community need some fun too.


The Lions roared off the bottom of the Scottish Championship for the first time since November as they left Kirkcaldy with a four-goal win for the second time this season and results elsewhere went their way on a dream afternoon for Mark Burchill's boys.
Livi's emphatic win, coupled with Alloa's loss at Hibernian, took the Lions up to ninth on goal difference heading into the final fixtures of the season on Saturday and to within a point of avoiding automatic relegation.
Mark Burchill was forced into two changes to the side that had lost 3-1 to Hibs on Wednesday, with Darren Cole suspended and Jordan White only recovering sufficiently from his knock against Hibs to take a place on the bench. Craig Sives and Jason Talbot took their places.
The Livi players knew victory was essential and they started the game with a real appetite to claim the three points. They almost received an early boost from a familiar face on five minutes when Keaghan Jacobs whipped a dangerous cross into the box and Paul Watson only just avoided putting the ball into his own net. There was an early break in play as pantomime villain Calum Elliot received treatment for an injury. The treatment was in vain and the ex-Hearts striker had to be stretchered off to be replaced by Christian Nade.
The Lions were well on top and eventually got their reward on 19 minutes with a little help from the far side linesman as, after Rovers had failed to deal with a corner, Callum Fordyce looped a header goalward that, despite Ryan Conroy's best efforts, was adjudged to have crossed the line. Raith keeper Kevin Cuthbert was booked for his protests. Things weren't all going the Lions' way however as word came through from Central Park that Cowdenbeath had taken a shock lead against champions Hearts.
Livi continued to pour forward at will and should have doubled their lead on 26 minutes when Talbot found Fordyce on the right and continued his run into the box to get on the end of the cross but he had to stretch to make a connection and his effort from close range flew high over the bar. Better news filtered through from elsewhere that Hearts had bagged an equaliser at Cowdenbeath and Hibs had broken the deadlock at home to Alloa. Myles Hippolyte tried his luck from distance but it flew straight at Cuthbert.
That proved to be the final action of note in the first half though, across the Forth at Easter Road, Hibs were doing their bit for the cause as they doubled their lead against Alloa. Livi went in at the break with a crucial lead and with results elsewhere going pretty well too.
Livi had been by far the dominant side and they came out for the second half determined to add comfort to the scoreline. Within three minutes they had done just that when Keaghan curled a free kick into the box, Fordyce put pressure on the goalkeeper and the ball broke to Sives and he reacted quickly to coolly place the ball into the unguarded net to make it 2-0. The Livi boss made his first change soon after the goal as Hippolyte was replaced by Gary Glen.
The Lions were rampant by now and claimed a third goal on 54 minutes when Keaghan sent another free kick to the back post, Fordyce knocked the ball back across goal and Danny Mullen glanced a header beyond Cuthbert and into the net to spark wild celebrations among the travelling black and yellow army behind the goals. Livi then made their second change two minutes later as Keaghan, who had just been booked, was replaced by Jordan White. Raith also made their second change, bringing on Grant Anderson for the ineffectual Barrie McKay. At Easter Road, Hibs had increased their lead to 3-0 over Alloa, though they were quickly pegged back to 3-1, while Hearts were still on level terms with Cowdenbeath.
Livi weren't done yet and they bagged a fourth goal on 74 minutes when Sives smashed a loose ball across goal and former Lion Craig Barr did his old side a turn and bulleted a header past his own goalkeeper at the near post. Any fears the Livi fans may have had of an Alloa fightback were allayed soon after as word came through that Hibs had made it 4-1 at Easter Road. Livi made their last change as Michael McKenna replaced Talbot with 12 minutes to go.
Raith had offered virtually nothing as an attacking force but they were gifted a chance to grab a consolation when Declan Gallagher bundled over Mark Stewart in the box. There was really nothing for the Livi fans to worry about as Lewis Vaughan's penalty was brilliantly turned over the bar by Darren Jamieson for his ELEVENTH penalty save in the last two seasons.
A spontaneous cheer broke out among the Livi support late on as word came through that Hearts had claimed a 93rd-minute winner against Cowdenbeath to set the seal on a perfect afternoon for the Lions. The combination of results lifts Livi up to ninth on goal difference ahead of Alloa, just a point behind Cowdenbeath as the relegation dogfight goes to the final day.
Three weeks ago, Livi were six points behind Alloa and eight behind Cowdenbeath, but now they go into next week's final game against Queen of the South knowing a victory, combined with Cowdenbeath failing to win at Alloa, would secure the Lions' Championship place for next season, while a point against Queens will secure a place in the play-off regardless of the result at Alloa.
Suffice to say this is the biggest match in Livi's recent history and a huge crowd at the Energy Assets Arena would go a long way to achieving the desired result. Gate prices have been slashed for the big match and it would be great to see a big turnout from the West Lothian community to roar the Lions to safety!


text:
Consent and Trade
Trading Freely in a Global Market
Author: Frank J. Garcia, Boston College, Massachusetts
$ 39.99 (P)
Request examination copy
Instructors may request a copy of this title for examination
In a time of changing trade norms, when free trade seems to be giving way to new kinds of nationalism, some fundamental questions about trade are still not being asked. Is trade consensual or coercive? Is 'free trade' as currently practiced really free? If not, what difference can trade law make in addressing economically oppressive practices that nationalistic trade policies cannot? In this book Garcia offers an examination of trade law's roots in consensual exchange, highlighting the central role of consent in differentiating trade from legally facilitated coercion, exploitation or predation. The book revisits the premise of consensual exchange which underlies the rhetoric of 'free trade', and then examines the social and political conditions that are a necessary part of a more genuine trade law system, in service of the idea that recovering consent in trade law can promote human flourishing on a global scale.
Provides a new perspective on the nature of trade and the object of trade law
Explores dynamics such as consent, coercion, exploitation and predation in selected trade agreements
Suggests new ways to think about global justice and its relationship to economic law
'Frank J. Garcia has given us a splendid book. In its insistence that the legitimacy and efficacy of trade law rests on true consent, in its rejection of empty reassurances based on a sterile view of the workings of the market, in its thorough and careful development of its examples, in its hope for a new way of thinking that may help trade contribute to more full and meaningful lives for people around the globe, and in its fundamental decency, this is the kind of economic thinking we have been long awaiting.' James Boyd White, Hart Wright Professor of Law Emeritus and Professor of English Emeritus, University of Michigan
'Frank J. Garcia is a leading voice in bringing theories of global justice in contact with the institutions of international trade. His new book Consent and Trade is a remarkable achievement and a must read for anyone interested in understanding why we have to take questions about the fairness of international trade seriously. It is an important book, coming at a time when our settled understandings of how international trade and policy operate are under serious challenge.' John Linarelli, Durham University
1. Consent and trade
2. Consent, oppression, and contemporary trade agreements
3. (Re)building trade agreements
4. Consensual trade and the twenty-first-century global economy
Front Matter (85 KB)
Marketing Excerpt (109 KB)
Frank J. Garcia, Boston College, Massachusetts
Frank J. Garcia is Professor of Law and Dean's Global Fund Scholar at the Boston College Law School, Massachusetts. A Fulbright Scholar, he has lectured widely on globalization and international economic law in Europe, South America and the Asia/Pacific region. Professor Garcia has held various leadership positions within the American Society of International Law, and currently sits on the editorial board of the Journal of International Economic Law, where he is Chief Book Review Editor. He is the author, most recently, of Global Justice and International Economic Law: Three Takes (Cambridge, 2013).
International Organization
International Organization is a leading peer-reviewed journal that covers the entire field of international affairs.…
European Political Science Review
The European Political Science Review (EPSR) publishes high quality scholarly research in political science, focusing…
The aim of Ethics & International Affairs, the journal of the Carnegie Council, is to help close the gap between…
European Journal of International Security
NEW IN 2016 - The European Journal of International Security (EJIS) publishes theoretical, methodological and empirical…
Global Justice and International Economic Law
Three Takes


text:
using System.Threading.Tasks;
using TestExtensions;
using UnitTests.GrainInterfaces;
using Xunit;

namespace UnitTests.SerializerTests
{
    [TestCategory("Serialization"), TestCategory("BVT")]
    public class RoundTripSerializerTests : HostedTestClusterEnsureDefaultStarted
    {
        public RoundTripSerializerTests(DefaultClusterFixture fixture) : base(fixture)
        {
        }

        [Fact]
        public async Task Serialize_TestMethodResultRecord()
        {
            var grain = this.GrainFactory.GetGrain<IRoundtripSerializationGrain>(GetRandomGrainId());
            RetVal retVal = await grain.GetRetValForParamVal(new ParamVal(42));
            Assert.Equal(42, retVal.Value);
        }

        [Fact]
        public async Task Serialize_TestMethodResultEnum()
        {
            var grain = this.GrainFactory.GetGrain<IRoundtripSerializationGrain>(GetRandomGrainId());
            CampaignEnemyTestType result = await grain.GetEnemyType();
            Assert.Equal(CampaignEnemyTestType.Enemy2, result); //Enum return value wasn't transmitted properly
        }

        [Fact]
        public async Task Serialize_TestMethodResultWithInheritedClosedGeneric()
        {
            var grain = this.GrainFactory.GetGrain<IRoundtripSerializationGrain>(GetRandomGrainId());
            object result = await grain.GetClosedGenericValue();
            Assert.NotNull(result);
        }
    }
}

redpajama_set_name: RedPajamaGithub


text:
// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Editing;
using ICSharpCode.AvalonEdit.Folding;
using ICSharpCode.AvalonEdit.Rendering;

namespace ICSharpCode.AvalonEdit.Search
{
	/// <summary>
	/// Provides search functionality for AvalonEdit. It is displayed in the top-right corner of the TextArea.
	/// </summary>
	public class SearchPanel : Control
	{
        private const double MIN_WIDTH_SEARCH_PANEL = 260;

        TextArea textArea;
		SearchInputHandler handler;
		TextDocument currentDocument;
		SearchResultBackgroundRenderer renderer;
		ComboBox searchComboBox;
        TextBox searchTextBox;  // internal editable TextBox of search comboBox
        TextBox replaceTextBox;
		Border searchPanel;
        Thumb resizeThumb;
        SearchPanelAdorner adorner;

        #region DependencyProperties
        /// <summary>
        /// Dependency property for <see cref="ShowRegexPopup"/>.
        /// </summary>
        public static readonly DependencyProperty ShowRegexPopupProperty =
            DependencyProperty.Register("ShowRegexPopup", typeof(bool), typeof(SearchPanel),
                                        new FrameworkPropertyMetadata(false, SearchPatternChangedCallback));

        /// <summary>
        /// Gets/sets whether the search pattern should be interpreted as regular expression.
        /// </summary>
        public bool ShowRegexPopup
        {
            get { return (bool)GetValue(ShowRegexPopupProperty); }
            set { SetValue(ShowRegexPopupProperty, value); }
        }

        /// <summary>
        /// Hide regex note popup
        /// </summary>
        public void HideRegexPopup()
        {
            ShowRegexPopup = false;
        }

        /// <summary>
        /// Dependency property for <see cref="UseWildCards"/>.
        /// </summary>
        public static readonly DependencyProperty UseWildCardsProperty =
            DependencyProperty.Register("UseWildCards", typeof(bool), typeof(SearchPanel),
                                        new FrameworkPropertyMetadata(false, SearchPatternChangedCallback));

        /// <summary>
        /// Gets/sets whether the search pattern uses wild cards, including ? or *.
        /// </summary>
        public bool UseWildCards
        {
            get { return (bool)GetValue(UseWildCardsProperty); }
            set
            {
                SetValue(UseWildCardsProperty, value);
                if (value)
                {
                    // do not use when using wild cards
                    UseRegex = false;
                }
            }
        }

        /// <summary>
        /// Dependency property for <see cref="UseRegex"/>.
        /// </summary>
        public static readonly DependencyProperty UseRegexProperty =
			DependencyProperty.Register("UseRegex", typeof(bool), typeof(SearchPanel),
			                            new FrameworkPropertyMetadata(false, SearchPatternChangedCallback));

		/// <summary>
		/// Gets/sets whether the search pattern should be interpreted as regular expression.
		/// </summary>
		public bool UseRegex {
			get { return (bool)GetValue(UseRegexProperty); }
			set { SetValue(UseRegexProperty, value); }
		}

		/// <summary>
		/// Dependency property for <see cref="MatchCase"/>.
		/// </summary>
		public static readonly DependencyProperty MatchCaseProperty =
			DependencyProperty.Register("MatchCase", typeof(bool), typeof(SearchPanel),
			                            new FrameworkPropertyMetadata(false, SearchPatternChangedCallback));

		/// <summary>
		/// Gets/sets whether the search pattern should be interpreted case-sensitive.
		/// </summary>
		public bool MatchCase {
			get { return (bool)GetValue(MatchCaseProperty); }
			set { SetValue(MatchCaseProperty, value); }
		}

		/// <summary>
		/// Dependency property for <see cref="WholeWords"/>.
		/// </summary>
		public static readonly DependencyProperty WholeWordsProperty =
			DependencyProperty.Register("WholeWords", typeof(bool), typeof(SearchPanel),
			                            new FrameworkPropertyMetadata(false, SearchPatternChangedCallback));

		/// <summary>
		/// Gets/sets whether the search pattern should only match whole words.
		/// </summary>
		public bool WholeWords {
			get { return (bool)GetValue(WholeWordsProperty); }
			set { SetValue(WholeWordsProperty, value); }
		}

		/// <summary>
		/// Dependency property for <see cref="SearchPattern"/>.
		/// </summary>
		public static readonly DependencyProperty SearchPatternProperty =
			DependencyProperty.Register("SearchPattern", typeof(string), typeof(SearchPanel),
			                            new FrameworkPropertyMetadata("", SearchPatternChangedCallback));

		/// <summary>
		/// Gets/sets the search pattern.
		/// </summary>
		public string SearchPattern {
			get { return (string)GetValue(SearchPatternProperty); }
			set { SetValue(SearchPatternProperty, value); }
		}

        /// <summary>
        /// Dependency property for <see cref="RecentSearchPatterns"/>.
        /// </summary>
        public static readonly DependencyProperty RecentSearchPatternsProperty =
            DependencyProperty.Register("RecentSearchPatterns", typeof(List<string>), typeof(SearchPanel),
                                        new FrameworkPropertyMetadata(new List<string>()));

        /// <summary>
        /// Gets/sets the recent search patterns.
        /// </summary>
        public List<string> RecentSearchPatterns
        {
            get { return (List<string>)GetValue(RecentSearchPatternsProperty); }
            set { SetValue(RecentSearchPatternsProperty, value); }
        }

        /// <summary>
        /// Dependency property for <see cref="Replacement"/>.
        /// </summary>
        public static readonly DependencyProperty ReplacementProperty =
			DependencyProperty.Register("Replacement", typeof(string), typeof(SearchPanel),
										new FrameworkPropertyMetadata(""));

		/// <summary>
		/// Gets/sets the replacement.
		/// </summary>
		public string Replacement {
			get { return (string)GetValue(ReplacementProperty); }
			set { SetValue(ReplacementProperty, value); }
		}

		/// <summary>
		/// Dependency property for <see cref="ShowReplace"/>.
		/// </summary>
		public static readonly DependencyProperty ShowReplaceProperty =
			DependencyProperty.Register("ShowReplace", typeof(bool), typeof(SearchPanel),
										new FrameworkPropertyMetadata(false));

		/// <summary>
		/// Gets/sets whether the replace is shown.
		/// </summary>
		public bool ShowReplace {
			get { return (bool)GetValue(ShowReplaceProperty); }
			set { SetValue(ShowReplaceProperty, value); }
		}

		/// <summary>
		/// Dependency property for <see cref="MarkerBrush"/>.
		/// </summary>
		public static readonly DependencyProperty MarkerBrushProperty =
			DependencyProperty.Register("MarkerBrush", typeof(Brush), typeof(SearchPanel),
			                            new FrameworkPropertyMetadata(Brushes.LightGreen, MarkerBrushChangedCallback));

		/// <summary>
		/// Gets/sets the Brush used for marking search results in the TextView.
		/// </summary>
		public Brush MarkerBrush {
			get { return (Brush)GetValue(MarkerBrushProperty); }
			set { SetValue(MarkerBrushProperty, value); }
		}

		/// <summary>
		/// Dependency property for <see cref="Localization"/>.
		/// </summary>
		public static readonly DependencyProperty LocalizationProperty =
			DependencyProperty.Register("Localization", typeof(Localization), typeof(SearchPanel),
			                            new FrameworkPropertyMetadata(new Localization()));

		/// <summary>
		/// Gets/sets the localization for the SearchPanel.
		/// </summary>
		public Localization Localization {
			get { return (Localization)GetValue(LocalizationProperty); }
			set { SetValue(LocalizationProperty, value); }
		}
		#endregion

		static void MarkerBrushChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
		{
			SearchPanel panel = d as SearchPanel;
			if (panel != null) {
				panel.renderer.MarkerBrush = (Brush)e.NewValue;
			}
		}

		static SearchPanel()
		{
			DefaultStyleKeyProperty.OverrideMetadata(typeof(SearchPanel), new FrameworkPropertyMetadata(typeof(SearchPanel)));
		}

		ISearchStrategy strategy;

		static void SearchPatternChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
		{
			SearchPanel panel = d as SearchPanel;
            panel?.ValidateAndUpdateSearch();
        }

        void ValidateAndUpdateSearch()
        {
            if (searchComboBox == null)
                return;

            var be = searchComboBox.GetBindingExpression(ComboBox.TextProperty);
            try
            {
                Validation.ClearInvalid(be);
                UpdateSearch();
            }
            catch (Exception ex)
            {
                if (messageView != null)
                {
                    messageView.IsOpen = true;
                    messageView.Content = ex.Message;
                    messageView.PlacementTarget = searchPanel;
                }

                var ve = new ValidationError(be.ParentBinding.ValidationRules[0], be, ex.Message, ex);
                Validation.MarkInvalid(be, ve);
            }
        }

        void UpdateSearch()
        {
            // only reset as long as there are results
            // if no results are found, the "no matches found" message should not flicker.
            // if results are found by the next run, the message will be hidden inside DoSearch ...
            if (renderer.CurrentResults.Any())
                messageView.IsOpen = false;

            strategy = SearchStrategyFactory.Create(SearchPattern ?? "", !MatchCase, WholeWords, GetSearchMode());
            OnSearchOptionsChanged(new SearchOptionsChangedEventArgs(SearchPattern, MatchCase, UseWildCards, UseRegex, WholeWords));
            DoSearch(true);
        }

        private SearchMode GetSearchMode()
        {
            var searchMode = SearchMode.Normal;
            if (UseWildCards)
                searchMode = SearchMode.Wildcard;
            else if (UseRegex)
                searchMode = SearchMode.RegEx;
            return searchMode;
        }

        /// <summary>
        /// It will be raised after finishing Close()
        /// </summary>
        public event Action Closed;

        /// <summary>
        /// Creates a new SearchPanel.
        /// </summary>
        SearchPanel()
		{
		}

		/// <summary>
		/// Attaches this SearchPanel to a TextArea instance.
		/// </summary>
		[Obsolete("Use the Install method instead")]
		public void Attach(TextArea textArea)
		{
			if (textArea == null)
				throw new ArgumentNullException("textArea");
			AttachInternal(textArea);
		}

		/// <summary>
		/// Creates a SearchPanel and installs it to the TextEditor's TextArea.
		/// </summary>
		/// <remarks>This is a convenience wrapper.</remarks>
		public static SearchPanel Install(TextEditor editor)
		{
			if (editor == null)
				throw new ArgumentNullException("editor");
			return Install(editor.TextArea);
		}

		/// <summary>
		/// Creates a SearchPanel and installs it to the TextArea.
		/// </summary>
		public static SearchPanel Install(TextArea textArea)
		{
			if (textArea == null)
				throw new ArgumentNullException("textArea");
			SearchPanel panel = new SearchPanel();

            panel.AttachInternal(textArea);
			panel.handler = new SearchInputHandler(textArea, panel);
			textArea.DefaultInputHandler.NestedInputHandlers.Add(panel.handler);
			return panel;
		}

		/// <summary>
		/// Adds the commands used by SearchPanel to the given CommandBindingCollection.
		/// </summary>
		public void RegisterCommands(CommandBindingCollection commandBindings)
		{
			handler.RegisterGlobalCommands(commandBindings);
		}

		/// <summary>
		/// Removes the SearchPanel from the TextArea.
		/// </summary>
		public void Uninstall()
		{
			CloseAndRemove();
			textArea.DefaultInputHandler.NestedInputHandlers.Remove(handler);
		}

		void AttachInternal(TextArea textArea)
		{
			this.textArea = textArea;
			adorner = new SearchPanelAdorner(textArea, this);
			DataContext = this;

			renderer = new SearchResultBackgroundRenderer();
			currentDocument = textArea.Document;
			if (currentDocument != null)
				currentDocument.TextChanged += textArea_Document_TextChanged;
			textArea.DocumentChanged += textArea_DocumentChanged;
			KeyDown += SearchLayerKeyDown;

			this.CommandBindings.Add(new CommandBinding(SearchCommands.Find, (sender, e) => Open(false)));
			this.CommandBindings.Add(new CommandBinding(SearchCommands.Replace, (sender, e) => Open(true)));
			this.CommandBindings.Add(new CommandBinding(SearchCommands.FindNext, (sender, e) => FindNext()));
			this.CommandBindings.Add(new CommandBinding(SearchCommands.FindPrevious, (sender, e) => FindPrevious()));
			this.CommandBindings.Add(new CommandBinding(SearchCommands.ReplaceNext, (sender, e) => ReplaceNext()));
			this.CommandBindings.Add(new CommandBinding(SearchCommands.ReplaceAll, (sender, e) => ReplaceAll()));
			this.CommandBindings.Add(new CommandBinding(SearchCommands.CloseSearchPanel, (sender, e) => Close()));
            this.CommandBindings.Add(new CommandBinding(SearchCommands.CloseRegexNote, (sender, e) => HideRegexPopup()));
            IsClosed = true;
		}

		void textArea_DocumentChanged(object sender, EventArgs e)
		{
			if (currentDocument != null)
				currentDocument.TextChanged -= textArea_Document_TextChanged;
			currentDocument = textArea.Document;
			if (currentDocument != null) {
				currentDocument.TextChanged += textArea_Document_TextChanged;
				DoSearch(false);
			}
		}

		void textArea_Document_TextChanged(object sender, EventArgs e)
		{
			DoSearch(false);
		}

		/// <inheritdoc/>
		public override void OnApplyTemplate()
		{
			base.OnApplyTemplate();
			searchPanel = Template.FindName("PART_searchPanel", this) as Border;
            searchPanel.Width = MIN_WIDTH_SEARCH_PANEL;

            searchComboBox = Template.FindName("PART_searchComboBox", this) as ComboBox;
            searchComboBox.Loaded += OnSearchComboBoxLoaded;

            replaceTextBox = Template.FindName("PART_replaceTextBox", this) as TextBox;

            resizeThumb = Template.FindName("resizeThumb", this) as Thumb;
            resizeThumb.DragDelta += OnResizeThumbDragDelta;
        }

        /// <summary>
        /// Extract internal editable TextBox of search comboBox and do initial search
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnSearchComboBoxLoaded(object sender, RoutedEventArgs e)
        {
            searchTextBox = searchComboBox.Template.FindName("PART_EditableTextBox", searchComboBox) as TextBox;
            searchComboBox.Focus();
            ValidateAndUpdateSearch();
        }

        /// <summary>
        /// Extract internal editable TextBox of search comboBox
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SearchTextComboBoxGotFocus(object sender, RoutedEventArgs e)
        {
            searchTextBox = searchComboBox.Template.FindName("PART_EditableTextBox", searchComboBox) as TextBox;
            ValidateAndUpdateSearch();
        }

        /// <summary>
        /// Resize search panel by using thumb.
        /// Note:
        /// WPF. SIMPLE ADORNER USAGE WITH DRAG AND RESIZE OPERATIONS
        /// URL: https://denisvuyka.wordpress.com/2007/10/15/wpf-simple-adorner-usage-with-drag-and-resize-operations/
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void OnResizeThumbDragDelta(object sender, DragDeltaEventArgs args)
        {
            double x_adjust = args.HorizontalChange;
            double new_width = searchPanel.Width - x_adjust;
            if ((new_width > MIN_WIDTH_SEARCH_PANEL) &&
                (new_width < textArea.ActualWidth))
            {
                searchPanel.Width = new_width;
            }
        }

		/// <summary>
		/// Reactivates the SearchPanel by setting the focus on the search box and selecting all text.
		/// </summary>
		public void Reactivate()
		{
			if (searchTextBox == null)
				return;
			searchTextBox.Focus();
			searchTextBox.SelectAll();
		}

		/// <summary>
		/// Moves to the next occurrence in the file.
		/// </summary>
		public void FindNext()
		{
			SearchResult result = renderer.CurrentResults.FindFirstSegmentWithStartAfter(textArea.Caret.Offset + 1);
			if (result == null)
				result = renderer.CurrentResults.FirstSegment;
			if (result != null) {
				SelectResult(result);
			}
		}

		/// <summary>
		/// Moves to the previous occurrence in the file.
		/// </summary>
		public void FindPrevious()
		{
			SearchResult result = renderer.CurrentResults.FindFirstSegmentWithStartAfter(textArea.Caret.Offset);
			if (result != null)
				result = renderer.CurrentResults.GetPreviousSegment(result);
			if (result == null)
				result = renderer.CurrentResults.LastSegment;
			if (result != null) {
				SelectResult(result);
			}
		}

		/// <summary>
		/// Replaces current result if any and moves to the next occurrence in the file.
		/// </summary>
		public int ReplaceNext() {
			SearchResult result = renderer.CurrentResults.FindFirstSegmentWithStartAfter(textArea.Caret.Offset);
			var count = renderer.CurrentResults.Count;
			if (result != null
				&& !textArea.Selection.IsEmpty
				&& textArea.Document.GetOffset(textArea.Selection.StartPosition.Location) == result.StartOffset
				&& textArea.Document.GetOffset(textArea.Selection.EndPosition.Location) == result.EndOffset) {
				Replace(result);
				--count;
			}
			result = renderer.CurrentResults.FindFirstSegmentWithStartAfter(textArea.Caret.Offset + textArea.Selection.Length);
			if (result == null)
				result = renderer.CurrentResults.FirstSegment;
			if (result != null) {
				SelectResult(result);
				return count;
			}
			return 0;
		}

		/// <summary>
		/// Replaces all occurrences in the file.
		/// </summary>
		public void ReplaceAll() {
            string msg = string.Format(Localization.ReplaceAllConfirmMessage, SearchPattern, Replacement);
            if (MessageBox.Show(Application.Current.MainWindow,
                           msg,
                           Localization.ReplaceAllConfirmTitle,
                           MessageBoxButton.OKCancel,
                           MessageBoxImage.Question) == MessageBoxResult.OK)
            {
                var count = ReplaceNext();
                while (count-- > 0)
                {
                    ReplaceNext();
                }

                // select all replaced text
                SearchPattern = Replacement;
            }
        }

		void Replace(SearchResult result) {
			currentDocument.Replace(textArea.Selection.Segments.FirstOrDefault(), result.ReplaceWith(Replacement));
		}

		ToolTip messageView = new ToolTip { Placement = PlacementMode.Bottom, StaysOpen = true, Focusable = false };

		void DoSearch(bool changeSelection)
		{
			if (IsClosed || (strategy == null))
				return;
			renderer.CurrentResults.Clear();

			if (!string.IsNullOrEmpty(SearchPattern)) {
				int offset = textArea.Caret.Offset;
				if (changeSelection) {
					textArea.ClearSelection();
				}
				// We cast from ISearchResult to SearchResult; this is safe because we always use the built-in strategy
				foreach (SearchResult result in strategy.FindAll(textArea.Document, 0, textArea.Document.TextLength)) {
					if (changeSelection && result.StartOffset >= offset) {
						SelectResult(result);
						changeSelection = false;
					}
					renderer.CurrentResults.Add(result);
				}
				if (!renderer.CurrentResults.Any()) {
					messageView.IsOpen = true;
					messageView.Content = Localization.NoMatchesFoundText;
					messageView.PlacementTarget = searchPanel;
				} else
					messageView.IsOpen = false;
			}
			textArea.TextView.InvalidateLayer(KnownLayer.Selection);
		}

		void SelectResult(SearchResult result)
		{
			textArea.Caret.Offset = result.StartOffset;
			textArea.Selection = Selection.Create(textArea, result.StartOffset, result.EndOffset);
			textArea.Caret.BringCaretToView();
			// show caret even if the editor does not have the Keyboard Focus
			textArea.Caret.Show();
		}

		void SearchLayerKeyDown(object sender, KeyEventArgs e)
		{
			switch (e.Key) {
				case Key.Enter:
					e.Handled = true;
					if (replaceTextBox != null
						&& replaceTextBox.IsFocused) {
						ReplaceNext();
					} else {
						if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
							FindPrevious();
						else
							FindNext();
						if (searchTextBox != null) {
							var error = Validation.GetErrors(searchTextBox).FirstOrDefault();
							if (error != null) {
								messageView.Content = Localization.ErrorText + " " + error.ErrorContent;
								messageView.PlacementTarget = searchPanel;
								messageView.IsOpen = true;
							}
						}
					}
					break;
				case Key.Escape:
					e.Handled = true;
					Close();
					break;
			}
		}

		/// <summary>
		/// Gets whether the Panel is already closed.
		/// </summary>
		public bool IsClosed { get; private set; }

		/// <summary>
		/// Closes the SearchPanel.
		/// </summary>
		public void Close()
		{
			bool hasFocus = this.IsKeyboardFocusWithin;

			var layer = AdornerLayer.GetAdornerLayer(textArea);
			if (layer != null)
				layer.Remove(adorner);
			messageView.IsOpen = false;
			textArea.TextView.BackgroundRenderers.Remove(renderer);
			if (hasFocus)
				textArea.Focus();
			IsClosed = true;

			// Clear existing search results so that the segments don't have to be maintained
			renderer.CurrentResults.Clear();
            Closed?.Invoke();
        }

		/// <summary>
		/// Closes the SearchPanel and removes it.
		/// </summary>
		[Obsolete("Use the Uninstall method instead!")]
		public void CloseAndRemove()
		{
			Close();
			textArea.DocumentChanged -= textArea_DocumentChanged;
			if (currentDocument != null)
				currentDocument.TextChanged -= textArea_Document_TextChanged;
		}

        /// <summary>
        /// Opens the an existing search panel with previous show replace property.
        /// </summary>
        public void Open()
        {
            Open(ShowReplace);
        }

		/// <summary>
		/// Opens the an existing search panel.
		/// </summary>
		public void Open(bool showReplace)
		{
			ShowReplace = showReplace;
			if (!IsClosed) return;
			var layer = AdornerLayer.GetAdornerLayer(textArea);
			if (layer != null)
				layer.Add(adorner);
			textArea.TextView.BackgroundRenderers.Add(renderer);
			IsClosed = false;
			DoSearch(false);
		}

		/// <summary>
		/// Fired when SearchOptions are changed inside the SearchPanel.
		/// </summary>
		public event EventHandler<SearchOptionsChangedEventArgs> SearchOptionsChanged;

		/// <summary>
		/// Raises the <see cref="SearchPanel.SearchOptionsChanged" /> event.
		/// </summary>
		protected virtual void OnSearchOptionsChanged(SearchOptionsChangedEventArgs e)
		{
            SearchOptionsChanged?.Invoke(this, e);
        }
	}

	/// <summary>
	/// EventArgs for <see cref="SearchPanel.SearchOptionsChanged"/> event.
	/// </summary>
	public class SearchOptionsChangedEventArgs : EventArgs
	{
		/// <summary>
		/// Gets the search pattern.
		/// </summary>
		public string SearchPattern { get; private set; }

		/// <summary>
		/// Gets whether the search pattern should be interpreted case-sensitive.
		/// </summary>
		public bool MatchCase { get; private set; }

        /// <summary>
        /// Gets whether the search pattern should be interpreted as wild cards.
        /// </summary>
        public bool UseWildCards { get; private set; }

        /// <summary>
        /// Gets whether the search pattern should be interpreted as regular expression.
        /// </summary>
        public bool UseRegex { get; private set; }

		/// <summary>
		/// Gets whether the search pattern should only match whole words.
		/// </summary>
		public bool WholeWords { get; private set; }

		/// <summary>
		/// Creates a new SearchOptionsChangedEventArgs instance.
		/// </summary>
		public SearchOptionsChangedEventArgs(string searchPattern, bool matchCase, bool useWildCards, bool useRegex, bool wholeWords)
		{
			this.SearchPattern = searchPattern;
			this.MatchCase = matchCase;
            this.UseWildCards = useWildCards;
            this.UseRegex = useRegex;
			this.WholeWords = wholeWords;
		}
	}

    class SearchPanelAdorner : Adorner
	{
		SearchPanel panel;

		public SearchPanelAdorner(TextArea textArea, SearchPanel panel)
			: base(textArea)
		{
			this.panel = panel;
			AddVisualChild(panel);
		}

		protected override int VisualChildrenCount {
			get { return 1; }
		}

		protected override Visual GetVisualChild(int index)
		{
			if (index != 0)
				throw new ArgumentOutOfRangeException();
			return panel;
		}

		protected override Size ArrangeOverride(Size finalSize)
		{
            panel.Arrange(new Rect(new Point(0, 0), finalSize));
			return new Size(panel.ActualWidth, panel.ActualHeight);
		}
	}
}


text:
Netaji will be remembered for his fierce resistance to colonial rule: PM Modi
New Delhi, January 23
Recalling Netaji's "unparalleled contribution to India's history", Prime Minister Narendra Modi on Monday paid homage to Subhas Chandra Bose on his 126th birth anniversary today.
"Today, on Parakram Diwas, I pay homage to Netaji Subhas Chandra Bose & recall his unparalleled contribution to India's history. He will be remembered for his fierce resistance to colonial rule. We are working to realize his vision for India," PM Modi wrote in his tweet.
The Government had declared January 23 as Parakram Diwas in 2021 to commemorate the birth anniversary of Netaji Subhas Chandra Bose.
Modi is also scheduled to virtually participate in an event to name the 21 largest unnamed islands of Andaman and Nicobar Islands after 21 Param Vir Chakra awardees on the Parakram Diwas today.
According to an official release from the Prime Minister's Office (PMO), PM, Modi will also unveil the model of the National Memorial dedicated to Netaji to be built on Netaji Subhas Chandra Bose Dweep.
Keeping in mind the historical significance of the Andaman and Nicobar Islands and to honor the memory of Netaji, Ross Islands was renamed as Netaji Subhash Chandra Bose Dweep by the prime minister during his visit to the Island in 2018.
Neil Island and Havelock Island were also renamed as Shaheed Dweep and Swaraj Dweep.
"Giving due respect to the real-life heroes of the country has always been accorded the highest priority by the Prime Minister. Going ahead with this spirit, it has now been decided to name the 21 largest unnamed islands of the island group after 21 Param Vir Chakra awardees," the statement from the PMO read.
The largest unnamed island will be named after the first Param Vir Chakra awardee, the second largest unnamed island will be named after the second Param Vir Chakra awardee, and so on.
This step will be an everlasting tribute to our heroes, several of whom made the ultimate sacrifice to protect the sovereignty and integrity of the nation.Born on January 23, 1897, Netaji played a crucial role in India's freedom movement.
Subhash Chandra Bose established the Azad Hind Fauj. While there is a controversy over Bose's death in a plane crash in Taipei on August 18, 1945, the Central government had in an RTI (Right to Information) in 2017 confirmed that he had died in the incident.
Tags: 126th birth anniversary, PM Modi


Core module of Full CAMMACD System.
MTF is a subsystem based on multiple timeframe trading analysis and consists of the dashboard, MTF Bollinger Bands, MACD and ATR indicator. Camarilla levels are traded on intraday basis and the MTF is a momentum based module. Based on the ATR and camarilla levels traders might expect more pips but less trades than with scalping or scalp swing module.
After the purchase, you will receive an on-boarding email with the details – just in case, keep an eye on your Spam folder.
Momentum Trading based on Camarilla & Moving Averages.
A CAMMACD Scalping method fo the trending market.
LOA is M15 time-frame module for the active trading hours.
A 4H timeframe system for intra-day & intra-week momentum trading.


text:
La Fauvette war eine französische Automarke.

Unternehmensgeschichte
Das Unternehmen La Locomotion Moderne aus Paris begann 1904 mit der Produktion von Automobilen, die als La Fauvette vermarktet wurden. Im gleichen Jahr endete die Produktion bereits wieder.

Fahrzeuge
Das einzige Modell war mit einem Einbaumotor von De Dion-Bouton mit 6,5 PS Leistung ausgestattet. Der Motor war vorne im Fahrzeug montiert und trieb über eine Kardanwelle die Hinterachse an. Die Karosserien boten wahlweise Platz für zwei oder vier Personen.

Literatur

 George Nick Georgano (Chefredakteur): The Beaulieu Encyclopedia of the Automobile. Volume 2: G–O. Fitzroy Dearborn Publishers, Chicago 2001, ISBN 1-57958-293-1. (englisch)
 George Nick Georgano: Autos. Encyclopédie complète. 1885 à nos jours. Courtille, Paris 1975. (französisch)

Einzelnachweise

Ehemaliger Pkw-Hersteller (Frankreich)
Ehemaliges Unternehmen (Paris)
Gegründet 1904

redpajama_set_name: RedPajamaWikipedia


It is tragedy of our society that our woman is weak . She has not dare to stand before the odd attitude of man. But when woman would have enough courage , the world would be changed. So please be brave.
Yes just dare to rise above your fears and be brave.
Is It Time To Shed Old Skin?


If you "move off" workers compensation and still are medically unable to work you may be eligible for the disability support pension from Centrelink.
Financial support if you have a permanent physical, intellectual or psychiatric condition that stops you from working.
What is the income and assets test?
Centrelink assess your income from all sources. This includes financial assets such as superannuation. To work out how much your financial assets are worth as income, they use deeming.
Pensions have income and asset limits. If you're over these limits, you get a lower pension.
These are the income rules for most pensioners.
If you or your partner get a payment for compensation or damages, it may affect the amount Centrelink pays you.
To get Disability Support Pension (DSP), Centrelking need to assess how your condition affects you.
If you don't meet any of those situations, your medical condition must be fully diagnosed, treated and stabilised. You may need to attend a Job Capacity Assessment to assess if your disability or medical condition is fully diagnosed, treated and stabilised.
If your condition is fully diagnosed, treated and stabilised, Centrelink then assesses how your condition impacts your ability to function each day. A health professional does this using Impairment Tables.
There are 15 and they're used to give an impairment rating that helps Centrelink know if you're eligible for DSP.
You can read more about Impairment Tables on the Department of Social Services website.
If the Job Capacity Assessment recommends you're medically eligible, you may also need to attend a Disability Medical Assessment.
This entry was posted in Finding help outside the system, Union Organisers. Bookmark the permalink.