text:
Cleanzine: your weekly cleaning and hygiene industry newsletter 11th July 2019 Issue no. 878
Your industry news - first Number 1 for Recruitment
We strongly recommend viewing Cleanzine full size in your web browser. Click our masthead above to visit our website version.
Dustcontrol and Speedy combine for Willmott Dixon in London landmark refurbishment
Dustcontrol UK and Speedy Hire have combined their expertise to deliver dust extraction solutions for Willmott Dixon - one of the UK's leading construction firms.
The partnership centres on a Willmott Dixon project to refurbish the Old Admiralty Building (OAB) in Horseguards Parade, central London, an undertaking that will see the Grade II listed building transformed into a modern working environment.
The project has unique challenges, both in relation to the materials contained within the building and the requirements of the new fit out itself, which is spread across over 600 rooms, presenting some significant potential health & safety issues, many of which are dust related.
Silica dust, found in many common construction materials, presents the risk of silicosis, which is a serious lung disease caused through the inhalation of Respirable Crystalline Silica; dust particles invisible to the naked eye created through activities such as drilling, sanding, coring and grinding. It's not just silica that poses a hazard. Asbestos is present throughout the building, while horsehair is in the lime plaster that's being reinstated presents a very minimal risk of anthrax.
The multitude of dust related hazards means efficient dust control is essential.
Looking for the relevant solution, Willmott Dixon turned to Speedy Services for its input, the UK's leading hire provider, which provisions a broad range of equipment across the full spectrum of construction needs.
One of Speedy Services supply chain partners is Dustcontrol UK, a specialist in providing dust extraction solutions.
Recognising that Willmott Dixon's circumstances needed specialist input to determine the best solution, Speedy Services called in the team at Dustcontrol UK to utilise their expertise.
A key element that sets Dustcontrol UK apart from its competitors is the fact all its products are built to application class H as standard. This means the equipment it provides offers the highest levels of filtration possible. The minimum standard required by law is M class, but the use of H class promotes best practice.
All Dustcontrol machines are cyclone based with a pre-filter, a setup which meets M class requirements on its own. However, the inclusion of an H-13 HEPA filter ensures the capture of 99.97% of all particles greater than 0.3 microns, meaning air exhausted is the cleanest it can be.
While the equipment provided by Dustcontrol is top of its class, the firm's expertise also enables it to provide bespoke solutions for clients.
In this instance, Willmott Dixon was keen to establish a dust extraction solution that ensured the protection of its workforce and exceeded the relevant regulations. By utilising the best techniques, the principal safety manager hoped to minimise the release of airborne dust to create the best possible working environment for people on site.
To provide this, Dustcontrol UK and Speedy Services devised a setup that would see the sectioning off of a specific room and the setting up of a mixing and cutting station, keeping dust in one place on site and avoiding its spread.
Following a site survey, it was determined that dust extraction equipment would need to be in place on site 24/7 to combat the dust created by plasterers and floorers mixing dry powders; one of the main causes of dust on a construction site.
The first solution suggested by Dustcontrol was a DC Tromb 400 - its most powerful extractor to date. A short hose was then used to attach the Tromb to a pre-separator, which collects up to 90% of all heavy materials. This keeps dust off the filter in the Tromb, meaning only 10% of the very finest dust reaches the Tromb itself. With the project set to last many months, the pre-separator helps to prolong the lifespan of the Tromb filter, reducing the need for maintenance or the risk of breakdown through overuse. A Y piece can also be added to the Tromb to enable extraction from two power tools at the same time.
Dustcontrol then recommended the use of a DC2900 to combat dust created by tipping plaster. The DC2900 was used in combination with a hook that sits inside the rim of a bucket and serves to create a vortex that prevents dust escaping, stopping it getting airborne in the first instance.
The combination of the DC Tromb, pre-separator and DC2900, means dust in the room is kept to an absolute minimum and well below the requisite safety levels.
But to further ensure air quality, an Aircube 2000 was also installed within the room. The Aircube range are ambient air cleaners, which run all day long on site, ensuring that any dust particles that do escape are picked up by the Aircube 2000 in situ. This further restricts dust migration, stopping it moving into other areas of the site and ensuring a clean, healthy working environment.
The extraction units such as the Tromb and DC2900 can also be used as vacuum cleaners, allowing for their use to clean other areas on the site, as well as in the designated stations. This also removes the need for brooms, which disturb dust during cleaning, putting respirable dusts back into the local atmosphere.
Given the size of the Old Admiralty Building, this solution has been extended to cover 6 floors, meaning there is a specific room designated for dust generating activities on each floor. This is set to extend to 10 rooms over the next few months.
"Often in the construction industry, dust control measures are a knee-jerk reaction to a problem that presents itself during the course of a project," argues Alan Collett, strategic account director at Speedy Services. "However, with Willmott Dixon in this instance, strategic engagement has allowed for the solution of a potential problem to be developed before it even materialises.
"Working with a firm like Dustcontrol allows us to bring in expertise to combat specific problems that our clients such as Willmott Dixon face. It's great to see them taking up an innovative solution when it's presented to them, and it's something we'll be looking to roll out in other construction sites going forward, where circumstance allows."
James Miller, General Manager at Dustcontrol UK says: "The work for Willmott Dixon just serves to demonstrate the extent of our dust extraction capabilities. By localising dust generating activities on site, we're able to practically remove it as an issue by capturing it comprehensively at source.
"The level of filtration afforded by our equipment means air quality levels are the highest achievable in a working construction environment. H class filtration makes a huge difference, and we're pleased it's worked so well at the Old Admiralty Building."
W: www.dustcontroluk.co.uk
© The Cleanzine 2019.
Subscribe | Unsubscribe | Cookies | Sitemap


text:
Judge refuses to accept 'death wish' list for oath guard in seditious conspiracy trial
Male sex toys may aid in pleasure and performance
Trump's Facebook and Instagram accounts have been reinstated after a two-year ban
Hank and John Green launched the YouTube College Credit Program
Donald Trump to return to Facebook, Instagram and Meta says
A virtual reality headset may be the workout tool you need
In J6th's most important trial to date, US District Judge Mehta has refused to acknowledge evidence that Steward Rhodes, the leader of the Oaths, kept a "death list" on his writing notebook created just days before the attack on the Capitol. This may sound outrageous but, below, I'll explain why it doesn't exist and it's a very strong ruling despite the inconvenience of the Department of Justice.
… Judge Mehta: The "Death List" has nothing to do with this conspiracy … It does not at all indicate that this conspiracy involves violence over past behavior (revenge of citizens). …refuse movement.
– Roger Barloff (@rparloff) October 6 2022
Judge Mehta listened to the full context in which the government wanted to add this evidence and found it dangerous. By making this ruling, it makes the case a little bit more difficult for the Department of Justice (a little bit), but it does solidify any case on appeal, and one of the first things an appellate attorney looks at coming out of trial is accepting highly inflammatory evidence that was not relevant to the elements. involved in the criminal trial.
If Mehta believed a death wish was necessary to prove the plot and was part of the January 6 plan, he would likely admit the evidence as it would be "very relevant". But Mehta found that these were merely personal notes that Rhodes had taken on his own. As such, the evidence is somewhat relevant to Rhodes' state of mind but not really the plot itself, the primary charge.
low link. But on top of this consideration is the fact that the list is highly inciting. No matter how many times defense attorneys say, "Holding to evidence as applied to a conspiracy, these were just speculations that were not acted upon…" it didn't matter. A jury, like most of us, will hear the "death list" and it will stay in our brains as something like, "This guy is a monster," and while that may be true, it has nothing to do with the charges. Low significance, highly inflammatory is a recipe to back off on appeal.
Why did the Ministry of Justice submit it knowing that it was an appeal case? They might argue on appeal that even if you give up that evidence, the real evidence is so overwhelming that it's a harmless mistake. They will get a great latitude but not infinite.
Judge Mehta did what a good judge does, weighed the pros/cons of the evidence, and ruled in favor of the defendant.
My criminal law professor said, on the first day of L-school, "Remember, when we think about the criminal justice system, we don't ask, 'What do I want for them?'" No, the question is, "What would I want for myself if I was falsely accused or overcharged?" The people who founded this country were criminals. They set up a system to protect the law and protect themselves."
It is a good point to consider Mehta's judgment and interpretation.
JasonMiciak believes that a day without learning is a day not lived. Political writer, essayist, author and lawyer. A Canadian-born dual citizen, he spent his teenage years and college in the Pacific Northwest and has since lived in seven states. He is now enjoying life as a single father to a young girl writing from the shores of the Gulf Coast. He loves crafting his flower pots, cooking, and is currently studying philosophy of science, religion, and the non-mathematical principles behind quantum mechanics and cosmology. Feel free to contact for chats or any concerns.
Democratic gubernatorial candidate Katie Hobbs struggles to name one thing she's learned from the Latino community at embarrassing Hispanic town hall event
Biden pardons people convicted of marijuana possession under federal law
The suspect is Nikki Secondino
Reported expert portal regarding the killing of 61-year-old Carlo Scandino in his Brooklyn apartment Thursday in an incident that police initially indicated was a home invasion.
Sources at The New York Post indicated that the killer may have been closer to home, suggesting Secondino's trans daughter may have been involved.
Carlo's 22-year-old transgender daughter Nikki Scandino has been accused of killing her father.
Common: MUST READ: Corruption In Maricopa County 2022 And How Runbeck Used Spanish-Speaking Employees And Resignation Of Running Ballots On Election Day
Nikki smirked for the cameras as she was escorted out of the NYPD police station.
Photo: Facebook screenshot/Carlo Secondino
The New York Post reported:
Nikki Scandino has been charged with murder and other crimes after police initially believed her father, Carlo Secondino, had been stabbed to death during an early morning home invasion at their Bensonhurst home.
Sources told The Post earlier Thursday that Nicki is suspected of making up a fake break-in story to cover up her brutal crime.
But the tale quickly unraveled and the alleged killer was also charged with attempted murder and criminal possession of a weapon in connection with the horrific attack in which her 19-year-old sister was stabbed.
The younger sister was taken to Maimonides Hospital in critical condition.
Nikki smiled, but ignored reporters' questions, as investigators led her out of Brooklyn's 62nd Precinct Thursday night.
A neighbor of Secondinos also said she heard Nikki Make a phone call in the hallway after the murder, claiming that the family was robbed by home invaders, who also stabbed them.
The release of former President Donald J. Trump's private tax documents comes amid questions about why the IRS failed to fully audit him during his presidency.
JUST IN: Bolsonaro rules out military intervention in Brazil, "I have no support from other institutions to act against Lula!"
Click here to add The Western Journal to your home screen.
// Load the SDK asynchronously (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "https://connect.facebook.net/en_US/sdk.js"; fjs.parentNode.insertBefore(js, fjs); }(document, "script", "facebook-jssdk"));
Tech1 day ago

redpajama_set_name: RedPajamaCommonCrawl


Do you remember Muzzy Izzet's remarkable strike for Leicester City against Tottenham Hotspur in October 1998?
With the score 1-1 after Emile Heskey cancelled out Les Ferdinand's 12 minute opener, five minutes from time Izzet produced a stunning volley from outside the box which flew past Spurs keeper Espen Baardsen.
The game was at Filbert Street, and the Foxes went on to finish 10 in the Premier League at the end of the 1998-1999 season.
Who is Leicester City's most underrated player?
Now that goal has been included in FourFourTwo's best 25 Premier League goals of all time.
Izzet features 20 on the list, and ahead of the likes of Luis Suarez (Liverpool v Newcastle, 2012/13), Gareth Bale (Spurs v Stoke, 2010/11) and Frank Lampard (Chelsea v Everton, 2006/07).
"Younger football fans won't remember Filbert Street, but it was the kind of place where – how to be polite? – it was hard to imagine good goals being scored," FourFourTwo went on to add.
"By the late 1990s, Martin O'Neill had built a formidable Leicester side, but they were more functional than spectacular.
"Emile Heskey was at the more mobile stage of his career, Steve Guppy was one of the best crossers in the country and Matt Elliott was a truly terrifying centre-half.


Lawfully is an acceptable word in Scrabble with 17 points. Lawfully is an accepted word in Word with Friends having 20 points. Lawfully is a 8 letter medium Word starting with L and ending with Y. Below are Total 34 words made out of this word.
Note There are 2 vowel letters and 6 consonant letters in the word lawfully. L is 12th, A is 1st, W is 23rd, F is 6th, U is 21th, Y is 25th, Letter of Alphabet series.


Why should I join the CCPIA?
As a home inspection company, I operate in a very small Colorado real estate market. How is joining the CCPIA going to help my bottom line?
Probably won't. Its experienced Commercial inspectors and files and experiences are shared. I suggest you join Home Advisor and Yelp as they both would answer your bottom line question. Thumbtack and Porch are great also.
John, it helps your bottom line if you only get one inspection job from CCPIA and the organization spends a small fortune on advertising its members to those in need of commercial inspection service to make that happen. It's not like the pay is bad in that sector of the inspection industry.
There are other educational resources to help you identify and serve the needs in your specific market too.


Our Quality Chrome Mirror Covers really upgrade the Exterior of your Sprinter and Crafter Van and give that Exclusive upmarket Look!
These have been carfully designed to fit Left Hand Drive Models.
Excellent value for your Sprinter Van giving an excellent finishing touch.
Click the button below to add the Mercedes Sprinter LHD Mirror Covers ABS Chrome 2000-2006 MK2 to your wish list.


text:
Die Schlacht bei Dormans fand während des Fünften Hugenottenkriegs am 10. Oktober 1575 bei Dormans, zwischen Trélou-sur-Marne im Westen und Verneuil im Nordosten, statt.

Geschichte
Beim Anrücken der Truppen zerstörten die Einwohner des südlicher der Marne gelegenen Dormans die hölzerne Brücke über den Fluss, um vor den Soldaten beider Parteien auf der anderen Seite in Sicherheit zu sein.

Den königlichen Truppen unter Henri I. de Lorraine, duc de Guise standen etwa 2000 Reîtres gegenüber, die von den Protestanten und den Malcontents des François-Hercule de Valois, duc d'Alençon rekrutiert worden waren und unter dem Kommando von Guillaume de Montmorency, seigneur de Thoré, standen, dem Bruder des Marschalls François de Montmorency.

Henri de Guise schlug die Protestanten in die Flucht und nahm neben anderen Philippe de Mornay gefangen. Der Sieg wurde allerdings durch die Aktionen des Pfalzgrafen Johann Kasimir von Pfalz-Simmern, mit dem Paris bedrohte wurde, zunichtegemacht. Der Fünfte Hugenottenkrieg endete im Mai 1576 mit dem Edikt von Beaulieu.

Henri de Guise wurde im Gefecht aber durch einen Schlag mit einer Arkebuse an der linken Wange verletzt, und danach – wie sein Vater – le Balafré ("der Vernarbte") genannt.

Literatur
 Pierre de L'Estoile, Journal de Henri III, de Henri IV et de Louis XIII, Band 1, 1575, S. 122
 Gordon Campbell (Hrsg.), Wars of Religion or (French) Guerres de Religion, in The Oxford Dictionary of the Renaissance, Oxford University Press, 2003
 Penny Richards, Warriors of God: History, Heritage and the Reputation of the Guise, in: Jessica Munns, Penny Richards, Jonathan Sprangler (Hrsg.), Aspiration, Representation and Memory: The Guise in Europe, 1506–1688, Routledge, 2016, ISBN 978-1-317-17803-3.

Dormans
Département Marne
Konflikt 1575
Geschichte (Grand Est)
Ereignis in Frankreich
Dormans

redpajama_set_name: RedPajamaWikipedia


text:
Summer Crop Production Report of FY 2017/18
Paddy production down by 1.5% to 5.15 million tons
Published On: January 18, 2018 08:15 AM NPT By: Arpana Ale Magar
Maize yields at record high of 2.55 million tons
KATHMANDU, Jan 18: Production of paddy dropped slightly, while maize production climbed to an all-time high in Fiscal Year 2017/18, according to a report prepared by the Ministry of Agricultural Development (MoAD).
Summer Crop Production Report of FY 2017/18 prepared by the ministry shows that paddy production dropped by 1.50 percent, while production of maize saw a healthy growth of this year.
The country produced 5.15 million tons of paddy this year, compared to 5.23 million tons of last year, according to the report. Paddy farming was done in 1.46 million hectare of land in FY 2017/18, compared to 1.55 million hectares in FY 2016/17.
Although the ministry was expecting bumper harvest of paddy this year, late monsoon and floods in Tarai districts in August affected paddy. Floods triggered by heavy rainfall in the second week of August completely damaged paddy crop in around 25,632 hectares of land in and partially affected paddy plantation in 126,282 hectares of land, mostly in Tarai districts, according to the ministry.
Earlier in October, the ministry had projected paddy production to grow to 5.4 million tons.
Production of maize, however, increased by nearly 10 percent this year. According to the report, maize production increased by 2.55 million tons in FY 2017/18, compared to 2.33 million tons in FY 2016/17.
Rise in maize production has been attributed to rise in plantation area. The report shows that maize farming was done in 954,158 hectares in FY 2017/18, compared to 924,321 hectares a year earlier.
Similarly, easy availability of inputs and chemical fertilizers, favorable climate as well as use of improved seeds were the other reason that contributed to a healthy rise in maize production, according to Ram Krishna Regmi, senior statistic officer of MoAD. "Different government and non-government organizations are making efforts to increase agricultural productivity. This has also contributed in increasing maize productivity," he added.
The report also shows that production of millet increased to 307,704 tons, while production of buckwheat fell to 11,472 tons in FY 2017/18. Last year, the country had produced 306,704 tons of millet and 12,017 tons of buckwheat.
Cardamom production in Taplejung up by 400 tons
TAPLEJUNG, April 2: Growth in cardamom yields has given some respite to farmers who have seen unprecedented rise and fall in...
Paddy production surges by 13 percent in Khotang
KATHAMANDU, Dec 18: Vegetable Development Directorate (VDD) under the Ministry of Agricultural Development (MoAD) is sending teams to eight different districts...
Vegetable supplies to Ktm down by 100 tons
KATHMANDU, Aug 14: Recent floods in the eastern part of Nepal have caused the supply of vegetables to the Kathmandu Valley...


Construction waste crushing plant,Construction crusher .Construction waste recycling refers to the separation and recycling of reusable waste materials generated during the construction of various projects. Potentially.crushers for crushing waste,How does a mobile crusher machine dispose of construction waste .Mobile stone crusher is with tire and crawler types with many systems of feeding, crushing, screening, conveying, and other functions. It is named of mobile stone.
Concrete Crusher - RUBBLE MASTER - Construction Rubble CrusherThe mobile and semi-mobile RM crushers are ideal for recycling concrete and . Crushing concrete and recycling waste concrete into valuable building material.crushers for crushing waste,Crushing it The rise of mobile impact crushers for recyclingMar 1, 2017 . "The impact crusher's ability to handle steel-reinforced concrete, along with custom options, such as plastics and wood-waste removal systems,.
Dec 25, 2012 . crusher · crusher is a machine used for reducing the size of different solid waste, which is a size reduction equipment can be applied to many.
Powerscreen® 4242SR Impactor Crusher crushing waste concrete .
Jan 18, 2010 . Powerscreen® 4242SR tracked impact crusher being used to crush waste concrete to produce a 3/4" sub base product. This impactor crushing.
*In financial terms the UK is spending £4bn to dump waste in a landfill site. * . Red Rhino recently sold a 5000 series crusher to a large waste transfer station in.
B.R. Kreider's crusher can turn your construction scrap into usable material with . of excess rock or burying rock on site can minimize waste and reduce costs.
Volume Reduction and Preliminary Shredding. The slow-running single- and double-shaft crushers by Husmann are used on landfills for volume reduction or.
Dec 1, 2016 . ia DEQ - Universal Waste Lamp Crushing Frequently Asked Questions . The name of the company or individual which owns the crusher;.
Q and A – Drum-top Fluorescent Lamp Crushers. Introduction. Maryland's hazardous waste regulations include provisions that allow the use of a device to crush.
Warrior 1400X Construction & Demolition Waste . improved operational costs, production levels and reduced crusher wear; Approx 10% reduction in setup time.
Jun 24, 2014 . Under the US EPA's RCRA regulations, wastes that contain elevated . Massachusetts requires lamp crushers to obtain a Class A recycling.
Relatively speaking, waste plastic crushing machine is suitable for shredding soft small, broken materials, such as PE film, beverage bottles, EPS shredding.
With its portable crushing unit from Co., IWS Crushing can recycle . waste, we crush concrete and asphalt construction and demolition waste and.
Combined with a Presto High Force Auger, either a crusher or shredder can . When it comes to compacting recyclables and residual waste, look no further,.
Process construction and demolition waste efficiently and enjoy the cost benefits offered by Red . This alternative is to use a mini crusher to crush this rubble.


text:
Courses Speaking Joy Research Blog
Click for joy!
Are you ready for 1:1 coaching?
Seeking authenticity
With so many of us seeking meaning in work and authenticity in ourselves and others, professional coaching is the missing link. It helps you cut through the noise and focus on your intention.
Through our professional coaching program, we guide you in achieving the vision you seek by clarifying your goals and building a plan that prioritizes the strategies to get you there. We use this plan as the backbone to track your progress and commitments.
During the program, we act as a sounding board and a place for you to process and make sense of what's happening. We move beyond the traditional questioning model to help you recognize the risks and opportunities around you. We help you make real traction to the future you have in mind.
Schedule a session to see if we're a fit!
Our 3 coaching focus areas
For Change Leaders
One-on-one coaching for you to successfully lead your organization in a significant change to your business.
See Program
For Change Professionals
One-on-one coaching for you to successfully lead your Change Management project, team and leadership team.
For Team Leaders
One-on-one coaching for you to develop the leadership skills to lead your team to high performance.
Meet Your Coaches
Roxanne Brown and Ed Cook are the founders of The Change Decision and believe that Joy at Work is about creating the conditions that help people thrive.
Roxanne is the CEO of The Change Decision and career change expert. Her background is in workplace culture, and data and information risk. She's a student of psychological safety and engaging workplace practices. Roxanne is also the former global President of the Association of Change Management Professionals (ACMP).
Ed is the President of The Change Decision and an expert in decision-making and analytics. His PhD thesis focused on multi-stakeholder high-risk decisions. Ed has led several large organizations in two Fortune 200 companies. He's also a former Navy pilot and flight instructor, and a Visiting Professor of Analytics at the University of Richmond.
Joy at Work
Practice conversations, design strategies, solve tricky situations in the safety of the Joy Learning Laboratory.
Joy at Work Learning Laboratory
© 2023 The Change Decision
Services Terms Privacy Joy Lab


The GTX-S features a sealed mechanism bearing and a lower (17mm) stack height.
Odyssey's original dual cable detangler system. Odyssey has been making the Gyro since 1986 and constantly improving it along the way.
The Sano detangler features a lightweight, 100% CNC 6061-T6 design with built in knarp screws for maximum cable adjustment.


The city recently published a catalogue of measures to improve air quality and nitrogen oxides levels so that further driving bans will not be necessary. The motto of the city is "do no more than absolutely necessary". Will the plan be sufficient in court? The ruling is expected before the end of the year, following the legal action of the environmental organization DUH.


We think of Lift as a work in progress. Like the lives of our readers, and the development of the Kingdom that we love and live in, we are always looking for ways that we can improve. In this issue, we are launching a number of new features that we think will make our magazine a more engaging experience, and useful resource, for our readers.
Lift is written by Cambodian youth, so we have a pretty good idea of what our peers find interesting and; however, we also know that you know what you want more than we do, and that is why many of our changes are meant to give you, our readers, more say in our decisions on what issues we cover and how we cover them.
Beginning this week, each issue will include Reader Generated News (page 3), a review of the week's top stories, as voted on by readers; Lift line (page 7), a platform for discussion and cooperation over Facebook, mobile phones and email; and Lift life, a page devoted to professional opportunities and preparation.
We can't wait to see your response to the new Lift. Send us your ideas, critiques and compliments and we will keep trying to make your magazine better.


BNP Paribas Large Cap Fund Direct-Growth is a Equity mutual fund scheme from BNP Paribas Mutual Fund. This scheme was launched on 01 Jan 2013 and is currently managed by its fund managers Karthikraj Lakshmanan and Abhijeet Dey. It has an AUM of ₹782.80 Crores and the latest NAV decalared is ₹94.410 as on 18 Apr 2019 at 9:30 pm.
BNP Paribas Large Cap Fund Direct-Growth scheme return performance in last 1 year is 6.51%, in last 3 years is 39.04% and 136.20% since scheme launch. The min. SIP amount to invest in this scheme is ₹300.


text:
Siege and Storm (Shadow and Bone Trilogy #2)
by Leigh Bardugo Leigh Bardugo
Hardcover-$16.99 Paperback-$9.89 eBook-$9.99 Large Print-$24.99 Audio MP3 on CD-$9.99 Audio CD-$14.99 View All Available Formats & Editions
$9.89 $10.99 Save 10% Current price is $9.89, Original price is $10.99. You Save 10%.
See the Grishaverse come to life on screen with Shadow and Bone, now a Netflix series.
Enter the Grishaverse with Book Two of the Shadow and Bone Trilogy by the #1 New York Times–bestselling author of Six of Crows and Crooked Kingdom.
Soldier. Summoner. Saint. Alina Starkov's power has grown, but not without a price. She is the Sun Summoner—hunted across the True Sea, haunted by the lives she took on the Shadow Fold. But she and Mal can't outrun their enemies for long.
The Darkling is more determined than ever to claim Alina's magic and use it to take the Ravkan throne. With nowhere else to turn, Alina enlists the help of an infamous privateer and sets out to lead the Grisha army.
But as the truth of Alina's destiny unfolds, she slips deeper into the Darkling's deadly game of forbidden magic, and further away from her humanity. To save her country, Alina will have to choose between her power and the love she thought would always be her shelter. No victory can come without sacrifice—and only she can face the oncoming storm.
Read all the books in the Grishaverse!
(previously published as The Grisha Trilogy)
The Six of Crows Duology
Crooked Kingdom
The King of Scars Duology
King of Scars
The Language of Thorns: Midnight Tales and Dangerous Magic
The Severed Moon: A Year-Long Journal of Magic
The Lives of Saints
Praise for the Grishaverse
"A master of fantasy." —The Huffington Post
"Utterly, extremely bewitching." —The Guardian
"This is what fantasy is for." —The New York Times Book Review
"[A] world that feels real enough to have its own passport stamp." —NPR
"The darker it gets for the good guys, the better." —Entertainment Weekly
"Sultry, sweeping and picturesque. . . . Impossible to put down." —USA Today
"There's a level of emotional and historical sophistication within Bardugo's original epic fantasy that sets it apart." —Vanity Fair
"Unlike anything I've ever read." —Veronica Roth, bestselling author of Divergent
"Bardugo crafts a first-rate adventure, a poignant romance, and an intriguing mystery!" —Rick Riordan, bestselling author of the Percy Jackson series
Shadow and Bone Series
Leigh Bardugo is the #1 New York Times bestselling author of Ninth House and the creator of the Grishaverse (now a Netflix series) which spans the Shadow and Bone trilogy, the Six of Crows duology, the King of Scars duology—and much more. Her short fiction has appeared in multiple anthologies including The Best American Science Fiction and Fantasy. She lives in Los Angeles and is an associate fellow of Pauli Murray College at Yale University.
TWO WEEKS WE'D been in Cofton, and I was still getting lost. The town lay inland, west of the Novyi Zem coast, miles from the harbor where we'd landed. Soon we would go farther, deep into the wilds of the Zemeni frontier. Maybe then we'd begin to feel safe.
I checked the little map I'd drawn for myself and retraced my steps. Mal and I met every day after work to walk back to the boardinghouse together, but today I'd gotten completely turned around when I'd detoured to buy our dinner. The calf and collard pies were stuffed into my satchel and giving off a very peculiar smell. The shopkeeper had claimed they were a Zemeni delicacy, but I had my doubts. It didn't much matter. Everything tasted like ashes to me lately.
Mal and I had come to Cofton to find work that would finance our trip west. It was the center of the jurda trade, surrounded by fields of the little orange flowers that people chewed by the bushel. The stimulant was considered a luxury in Ravka, but some of the sailors aboard the Verrhader had used it to stay awake on long watches. Zemeni men liked to tuck the dried blooms between lip and gum, and even the women carried them in embroidered pouches that dangled from their wrists. Each store window I passed advertised different brands: Brightleaf, Shade, Dhoka, the Burly. I saw a beautifully dressed girl in petticoats lean over and spit a stream of rust-colored juice right into one of the brass spittoons that sat outside every shop door. I stifled a gag. That was one Zemeni custom I didn't think I could get used to.
With a sigh of relief, I turned onto the city's main thoroughfare. At least now I knew where I was. Cofton still didn't feel quite real to me. There was something raw and unfinished about it. Most of the streets were unpaved, and I always felt like the flat-roofed buildings with their flimsy wooden walls might tip over at any minute. And yet they all had glass windows. The women dressed in velvet and lace. The shop displays overflowed with sweets and baubles and all manner of finery instead of rifles, knives, and tin cookpots. Here, even the beggars wore shoes. This was what a country looked like when it wasn't under siege.
As I passed a gin shop, I caught a flash of crimson out of the corner of my eye. Corporalki. Instantly, I drew back, pressing myself into the shadowy space between two buildings, heart hammering, my hand already reaching for the pistol at my hip.
Dagger first, I reminded myself, sliding the blade from my sleeve. Try not to draw attention. Pistol if you must. Power as a last resort. Not for the first time, I missed the Fabrikator-made gloves that I'd had to leave behind in Ravka. They'd been lined with mirrors that gave me an easy way to blind opponents in a hand-to-hand fight—and a nice alternative to slicing someone in half with the Cut. But if I'd been spotted by a Corporalnik Heartrender, I might not have a choice in the matter. They were the Darkling's favored soldiers and could stop my heart or crush my lungs without ever landing a blow.
I waited, my grip slippery on the dagger's handle, then finally dared to peek around the wall. I saw a cart piled high with barrels. The driver had stopped to talk to a woman whose daughter danced impatiently beside her, fluttering and twirling in her dark red skirt.
Just a little girl. Not a Corporalnik in sight. I sank back against the building and took a deep breath, trying to calm down.
It won't always be this way, I told myself. The longer you're free, the easier it will get.
One day I would wake from a sleep free of nightmares, walk down a street unafraid. Until then, I kept my flimsy dagger close and wished for the sure heft of Grisha steel in my palm.
I pushed my way back into the bustling street and clutched at the scarf around my neck, drawing it tighter. It had become a nervous habit. Beneath it lay Morozova's collar, the most powerful amplifier ever known, as well as the only way of identifying me. Without it, I was just another dirty, underfed Ravkan refugee.
I wasn't sure what I would do when the weather turned. I couldn't very well walk around in scarves and high-necked coats when summer came. But by then, hopefully, Mal and I would be far from crowded towns and unwanted questions. We'd be on our own for the first time since we'd fled Ravka. The thought sent a nervous flutter through me.
I crossed the street, dodging wagons and horses, still scanning the crowd, sure that at any moment I would see a troop of Grisha or oprichniki descending on me. Or maybe it would be Shu Han mercenaries, or Fjerdan assassins, or the soldiers of the Ravkan King, or even the Darkling himself. So many people might be hunting us. Hunting me, I amended. If it weren't for me, Mal would still be a tracker in the First Army, not a deserter running for his life.
A memory rose unbidden in my mind: black hair, slate eyes, the Darkling's face exultant in victory as he unleashed the power of the Fold. Before I'd snatched that victory away.
News was easy to come by in Novyi Zem, but none of it was good. Rumors had surfaced that the Darkling had somehow survived the battle on the Fold, that he had gone to ground to gather his forces before making another attempt on the Ravkan throne. I didn't want to believe it was possible, but I knew better than to underestimate him. The other stories were just as disturbing: that the Fold had begun to overflow its shores, driving refugees east and west; that a cult had risen up around a Saint who could summon the sun. I didn't want to think about it. Mal and I had a new life now. We'd left Ravka behind.
I hurried my steps, and soon I was in the square where Mal and I met every evening. I spotted him leaning against the lip of a fountain, talking with a Zemeni friend he'd met working at the warehouse. I couldn't remember his name … Jep, maybe? Jef?
Fed by four huge spigots, the fountain was less decorative than useful, a large basin where girls and house servants came to wash clothes. None of the washerwomen were paying much attention to the laundry, though. They were all gawking at Mal. It was hard not to. His hair had grown out of its short military cut and was starting to curl at the nape of his neck. The spray from the fountain had left his shirt damp, and it clung to skin bronzed by long days at sea. He threw his head back, laughing at something his friend had said, seemingly oblivious to the sly smiles thrown his way.
He's probably so used to it, he doesn't even notice anymore, I thought irritably.
When he caught sight of me, his face broke into a grin and he waved. The washerwomen turned to look and then exchanged glances of disbelief. I knew what they saw: a scrawny girl with stringy, dull brown hair and sallow cheeks, fingers stained orange from packing jurda. I'd never been much to look at, and weeks of not using my power had taken their toll. I wasn't eating or sleeping well, and the nightmares didn't help. The women's faces all said the same thing: What was a boy like Mal doing with a girl like me?
I straightened my spine and tried to ignore them as Mal threw his arm around me and drew me close. "Where were you?" he asked. "I was getting worried."
"I was waylaid by a gang of angry bears," I murmured into his shoulder.
"You got lost again?"
"I don't know where you get these ideas."
"You remember Jes, right?" he said, nodding to his friend.
"How do you go?" Jes asked in broken Ravkan, offering me his hand. His expression seemed unduly grave.
"Very well, thank you," I replied in Zemeni. He didn't return my smile, but gently patted my hand. Jes was definitely an odd one.
We chatted a short while longer, but I knew Mal could see I was getting anxious. I didn't like to be out in the open for too long. We said our goodbyes, and before Jes left, he shot me another grim look and leaned in to whisper something to Mal.
"What did he say?" I asked as we watched him stroll away across the square.
"Hmm? Oh, nothing. Did you know you have pollen in your brows?" He reached out to gently brush it away.
"Maybe I wanted it there."
"My mistake."
As we pushed off from the fountain, one of the washerwomen leaned forward, practically spilling out of her dress.
"If you ever get tired of skin and bones," she called to Mal, "I've got something to tempt you."
I stiffened. Mal glanced over his shoulder. Slowly, he looked her up and down. "No," he said flatly. "You don't."
The girl's face flushed an ugly red as the others jeered and cackled, splashing her with water. I tried for a haughtily arched brow, but it was hard to restrain the goofy grin pulling at the corners of my mouth.
"Thanks," I mumbled as we crossed the square, heading toward our boardinghouse.
"For what?"
I rolled my eyes. "For defending my honor, you dullard."
He yanked me beneath a shadowed awning. I had a moment's panic when I thought he'd spotted trouble, but then his arms were around me and his lips were pressed to mine.
When he finally drew back, my cheeks were warm and my legs had gone wobbly.
"Just to be clear," he said, "I'm not really interested in defending your honor."
"Understood," I managed, hoping I didn't sound too ridiculously breathless.
"Besides," he said, "I need to steal every minute I can before we're back at the Pit."
The Pit was what Mal called our boardinghouse. It was crowded and filthy and afforded us no privacy at all, but it was cheap. He grinned, cocky as ever, and pulled me back into the flow of people on the street. Despite my exhaustion, my steps felt decidedly lighter. I still wasn't used to the idea of us together. Another flutter passed through me. On the frontier there would be no curious boarders or unwanted interruptions. My pulse gave a little jump—whether from nerves or excitement, I wasn't sure.
"So what did Jes say?" I asked again, when my brain felt a bit less scrambled.
"He said I should take good care of you."
Mal cleared his throat. "And … he said he would pray to the God of Work to heal your affliction."
"My what?"
"I may have told him that you have a goiter."
I stumbled. "I beg your pardon?"
"Well, I had to explain why you were always clinging to that scarf."
I dropped my hand. I'd been doing it again without even realizing.
"So you told him I had a goiter?" I whispered incredulously.
"I had to say something. And it makes you quite a tragic figure. Pretty girl, giant growth, you know."
I punched him hard in the arm.
"Ow! Hey, in some countries, goiters are considered very fashionable."
"Do they like eunuchs, too? Because I can arrange that."
"So bloodthirsty!"
"My goiter makes me cranky."
Mal laughed, but I noticed that he kept his hand on his pistol. The Pit was located in one of the less savory parts of Cofton, and we were carrying a lot of coin, the wages we'd saved for the start of our new life. Just a few more days, and we'd have enough to leave Cofton behind—the noise, the pollen-filled air, the constant fear. We'd be safe in a place where nobody cared what happened to Ravka, where Grisha were scarce and no one had ever heard of a Sun Summoner.
And no one has any use for one. The thought soured my mood, but it had come to me more and more lately. What was I good for in this strange country? Mal could hunt, track, handle a gun. The only thing I'd ever been good at was being a Grisha. I missed summoning light, and each day I didn't use my power, I grew more weak and sickly. Just walking beside Mal left me winded, and I struggled beneath the weight of my satchel. I was so frail and clumsy that I'd barely managed to keep my job packing jurda at one of the fieldhouses. It brought in mere pennies, but I'd insisted on working, on trying to help. I felt like I had when we were kids: capable Mal and useless Alina.
I pushed the thought away. I might not be the Sun Summoner anymore, but I wasn't that sad little girl either. I'd find a way to be useful.
The sight of our boardinghouse didn't exactly lift my spirits. It was two stories high and in desperate need of a fresh coat of paint. The sign in the window advertised hot baths and tick-free beds in five different languages. Having sampled the bathtub and the bed, I knew the sign lied no matter how you translated it. Still, with Mal beside me, it didn't seem so bad.
We climbed the steps of the sagging porch and entered the tavern that took up most of the lower floor of the house. It was cool and quiet after the dusty clamor of the street. At this hour, there were usually a few workers at the pockmarked tables drinking off their day's wages, but today it was empty save for the surly-looking landlord standing behind the bar.
He was a Kerch immigrant, and I'd gotten the distinct feeling he didn't like Ravkans. Or maybe he just thought we were thieves. We'd shown up two weeks ago, ragged and grubby, with no baggage and no way to pay for lodging except a single golden hairpin that he probably thought we'd stolen. But that hadn't stopped him from snapping it up in exchange for a narrow bed in a room that we shared with six other boarders.
As we approached the bar, he slapped the room key on the counter and shoved it across to us without being asked. It was tied to a carved piece of chicken bone. Another charming touch.
In the stilted Kerch he'd picked up aboard the Verrhader, Mal requested a pitcher of hot water for washing.
"Extra," the landlord grunted. He was a heavyset man with thinning hair and the orange-stained teeth that came from chewing jurda. He was sweating, I noticed. Though the day wasn't particularly warm, beads of perspiration had broken out over his upper lip.
I glanced back at him as we headed for the staircase on the other side of the deserted tavern. He was still watching us, his arms crossed over his chest, his beady eyes narrowed. There was something about his expression that set my nerves jangling.
I hesitated at the base of the steps. "That guy really doesn't like us," I said.
Mal was already headed up the stairs. "No, but he likes our money just fine. And we'll be out of here in a few days."
I shook off my nervousness. I'd been jumpy all afternoon.
"Fine," I grumbled as I followed after Mal. "But just so I'm prepared, how do you say 'you're an ass' in Kerch?"
"Jer ven azel."
Mal laughed. "The first thing sailors teach you is how to swear."
The second story of the boardinghouse was in considerably worse shape than the public rooms below. The carpet was faded and threadbare, and the dim hallway stank of cabbage and tobacco. The doors to the private rooms were all closed, and not a sound came from behind them as we passed. The quiet was eerie. Maybe everyone was out for the day.
The only light came from a single grimy window at the end of the hall. As Mal fumbled with the key, I looked down through the smudged glass to the carts and carriages rumbling by below. Across the street, a man stood beneath a balcony, peering up at the boardinghouse. He pulled at his collar and his sleeves, as if his clothes were new and didn't quite fit right. His eyes met mine through the window, then darted quickly away.
I felt a sudden pang of fear.
"Mal," I whispered, reaching out to him.
But it was too late. The door flew open.
"No!" I shouted. I threw up my hands and light burst through the hallway in a blinding cascade. Then rough hands seized me, yanking my arms behind my back. I was dragged inside the room, kicking and thrashing.
"Easy now," said a cool voice from somewhere in the corner. "I'd hate to have to gut your friend so soon."
Time seemed to slow. I saw the shabby, low-ceilinged room, the cracked washbasin sitting on the battered table, dust motes swirling in a slender beam of sunlight, the bright edge of the blade pressed to Mal's throat. The man holding him wore a familiar sneer. Ivan. There were others, men and women. All wore the fitted coats and breeches of Zemeni merchants and laborers, but I recognized some of their faces from my time with the Second Army. They were Grisha.
Behind them, shrouded in shadow, lounging in a rickety chair as if it were a throne, was the Darkling.
For a moment, everything in the room was silent and still. I could hear Mal's breathing, the shuffle of feet. I heard a man calling a hello down on the street. I couldn't seem to stop staring at the Darkling's hands—his long white fingers resting casually on the arms of the chair. I had the foolish thought that I'd never seen him in ordinary clothes.
Then reality crashed in on me. This was how it ended? Without a fight? Without so much as a shot fired or a voice raised? A sob of pure rage and frustration tore free from my chest.
"Take her pistol, and search her for other weapons," the Darkling said softly. I felt the comforting weight of my firearm lifted from my hip, the dagger pulled from its sheath at my wrist. "I'm going to tell them to let you go," he said when they were done, "with the knowledge that if you so much as raise your hands, Ivan will end the tracker. Show me that you understand."
I gave a single stiff nod.
He raised a finger, and the men holding me let go. I stumbled forward and then stood frozen in the center of the room, my hands balled into fists.
I could cut the Darkling in two with my power. I could crack this whole saintsforsaken building right down the middle. But not before Ivan opened Mal's throat.
"How did you find us?" I rasped.
"You leave a very expensive trail," he said, and lazily tossed something onto the table. It landed with a plink beside the washbasin. I recognized one of the golden pins Genya had woven into my hair so many weeks ago. We'd used them to pay for passage across the True Sea, the wagon to Cofton, our miserable, not-quite-tick-free bed.
The Darkling rose, and a strange trepidation crackled through the room. It was as if every Grisha had taken a breath and was holding it, waiting. I could feel the fear coming off them, and that sent a spike of alarm through me. The Darkling's underlings had always treated him with awe and respect, but this was something new. Even Ivan looked a little ill.
The Darkling stepped into the light, and I saw a faint tracery of scars over his face. They'd been healed by a Corporalnik, but they were still visible. So the volcra had left their mark. Good, I thought with petty satisfaction. It was small comfort, but at least he wasn't quite as perfect as he had been.
He paused, studying me. "How are you finding life in hiding, Alina? You don't look well."
"Neither do you," I said. It wasn't just the scars. He wore his weariness like an elegant cloak, but it was still there. Faint smudges showed beneath his eyes, and the hollows of his sharp cheekbones cut a little deeper.
"A small price to pay," he said, his lips quirking in a half smile.
A chill snaked up my spine. For what?
He reached out, and it took everything in me not to flinch backward. But all he did was take hold of one end of my scarf. He tugged gently, and the rough wool slipped free, gliding over my neck and fluttering to the ground.
"Back to pretending to be less than you are, I see. The sham doesn't suit you."
A twinge of unease passed through me. Hadn't I had a similar thought just minutes ago? "Thanks for your concern," I muttered.
He let his fingers trail over the collar. "It's mine as much as yours, Alina."
I batted his hand away, and an anxious rustle rose from the Grisha. "Then you shouldn't have put it around my neck," I snapped. "What do you want?"
Of course, I already knew. He wanted everything—Ravka, the world, the power of the Fold. His answer didn't matter. I just needed to keep him talking. I'd known this moment might come, and I'd prepared for it. I wasn't going to let him take me again. I glanced at Mal, hoping he understood what I intended.
"I want to thank you," the Darkling said.
Now, that I hadn't expected. "Thank me?"
"For the gift you gave me."
My eyes flicked to the scars on his pale cheek.
"No," he said with a small smile, "not these. But they do make a good reminder."
"Of what?" I asked, curious despite myself.
His gaze was gray flint. "That all men can be made fools. No, Alina, the gift you've given me is so much greater."
He turned away. I darted another glance at Mal.
"Unlike you," the Darkling said, "I understand gratitude, and I wish to express it."
He raised his hands. Darkness tumbled through the room.
"Now!" I shouted.
Mal drove his elbow into Ivan's side. At the same moment, I threw up my hands and light blazed out, blinding the men around us. I focused my power, honing it to a scythe of pure light. I had only one goal. I wasn't going to leave the Darkling standing. I peered into the seething blackness, trying to find my target. But something was wrong.
I'd seen the Darkling use his power countless times before. This was different. The shadows whirled and skittered around the circle of my light, spinning faster, a writhing cloud that clicked and whirred like a fog of hungry insects. I pushed against them with my power, but they twisted and wriggled, drawing ever nearer.
Mal was beside me. Somehow he'd gotten hold of Ivan's knife.
"Stay close," I said. Better to take my chances and open a hole in the floor than to just stand there doing nothing. I concentrated and felt the power of the Cut vibrate through me. I raised my arm … and something stepped out of the darkness.
It's a trick, I thought as the thing came toward us. It has to be some kind of illusion.
It was a creature wrought from shadow, its face blank and devoid of features. Its body seemed to tremble and blur, then form again: arms, legs, long hands ending in the dim suggestion of claws, a broad back crested by wings that roiled and shifted as they unfurled like a black stain. It was almost like a volcra, but its shape was more human. And it did not fear the light. It did not fear me.
It's a trick, my panicked mind insisted. It isn't possible. It was a violation of everything I knew about Grisha power. We couldn't make matter. We couldn't create life. But the creature was coming toward us, and the Darkling's Grisha were cringing up against the walls in very real terror. This was what had so frightened them.
I pushed down my horror and refocused my power. I swung my arm, bringing it down in a shining, unforgiving arc. The light sliced through the creature. For a moment, I thought it might just keep coming. Then it wavered, glowing like a cloud lit by lightning, and blew apart into nothing. I had time for the barest surge of relief before the Darkling lifted his hand and another monster took its place, followed by another, and another.
"This is the gift you gave me," said the Darkling. "The gift I earned on the Fold." His face was alive with power and a kind of terrible joy. But I could see strain there, too. Whatever he was doing, it was costing him.
Mal and I backed toward the door as the creatures stalked closer. Suddenly, one of them shot forward with astonishing speed. Mal slashed out with his knife. The thing paused, wavered slightly, then grabbed hold of him and tossed him aside like a child's doll. This was no illusion.
"Mal!" I cried.
I lashed out with the Cut and the creature burned away to nothing, but the next monster was on me in seconds. It seized me, and revulsion shuddered through my body. Its grip was like a thousand crawling insects swarming over my arms.
It lifted me off my feet, and I saw how very wrong I'd been. It did have a mouth, a yawning, twisting hole that spread open to reveal row upon row of teeth. I felt them all as the thing bit deeply into my shoulder.
The pain was like nothing I'd ever known. It echoed inside me, multiplying on itself, cracking me open and scraping at the bone. From a distance, I heard Mal call my name. I heard myself scream.
The creature released me. I dropped to the floor in a limp heap. I was on my back, the pain still reverberating through me in endless waves. I could see the water-stained ceiling, the shadow creature looming high above, Mal's pale face as he knelt beside me. I saw his lips form the shape of my name, but I couldn't hear him. I was already slipping away.
The last thing I heard was the Darkling's voice—so clear, like he was lying right next to me, his lips pressed against my ear, whispering so that only I could hear: Thank you.
Copyright © 2013 by Leigh Bardugo
Fantasy->Alternate worlds->Teen fiction
An action-packed, heartbreaking ending will leave teens breathless for the final installment." —School Library Journal
"This action-packed, suspenseful grand tale of war, adventure and love, with a maritime setting, colorful battles, and female warriors, will appeal to a broad readership and is an enticing prelude to the anticipated Book 3." —VOYA
"Bardugo populates her fully realized world with appealing three-dimensional characters and an involving plot that keeps a steady pace. . . . The buzz will be big." —Booklist
"Bardugo builds on strengths she brought to the first volume, including a richly crafted fantasy world with its own twist on magic, a surfeit of handsome leading men, and plenty of teen-appropriate romantic angst." —The Horn Book
"Scheming and action carry readers at a breathless pace to an end that may surprise them and will definitely leave them panting for the series' conclusion." —Kirkus Reviews
"Mesmerizing. . . . Bardugo's set up is shiver-inducing, of the delicious variety. This is what fantasy is for." —Laini Taylor in The New York Times Book Review on Shadow and Bone
"This is one book series you want to get hooked on." —Seventeen.com on Shadow and Bone
"Set in a fascinating, unique world rich with detail, Shadow and Bone was unlike anything I've ever read. Alina is a clever, sympathetic character I will gladly follow into the next installment—which can't come soon enough!" —Veronica Roth, New York Times–bestselling author of Divergent on Shadow and Bone
"I loved it! This is just my kind of fantasy—rich, satisfying, and gorgeous, laced with heart-pounding action and pitch-perfect romance. The characters—protagonists and antagonists—are layered and complex. I'll be thinking about it for a good long time." —Cinda Williams Chima, bestselling author on Shadow and Bone
"* Fast-paced and unpredictable, this debut novel will be a hit with readers who love dark fantasy. . . . Bardugo creates a unique world complete with monsters, magic, danger, romance, corruption, and extravagance." —School Library Journal, starred review on Shadow and Bone
"Filled with lush descriptions, intriguing magic, and plenty of twists, this memorable adventure offers action and intrigue mixed with an undercurrent of romance and danger." —Publishers Weekly on Shadow and Bone
"Bardugo weaves a captivating spell with lushly descriptive writing, engaging characters, and an exotic, vivid world. Readers will wait impatiently for the next installment." —Booklist on Shadow and Bone
"Readers will be rooting for this lonely, tough heroine as she navigates perils physical, magical, and emotional." —BCCB on Shadow and Bone
"A rich fantasy landscape, an inspired magical structure, and a gratifying emotional hook keep the pages whirring." —The Horn Book on Shadow and Bone
Set in a fascinating, unique world rich with detail, Shadow and Bone was unlike anything I've ever read. Alina is a clever, sympathetic character I will gladly follow into the next installment--which can't come soon enough!
New York Times–bestselling author of Diverge Veronica Roth
Gr 8 Up—After narrowly escaping the Darkling at the end of Shadow and Bone (Holt, 2012), Alina and Mal are still on the run. Though many believe her dead, Alina knows he will never stop hunting her, and she is right-it isn't long before the Darkling finds and recaptures both Alina and Mal. Forced onto a boat, the imprisoned couple has little choice but to do as he commands: track a second amplifier so that he can use Alina's twice-amplified powers against Ravka. With the help of a pirate with questionable motives, Alina and Mal escape and seek a third amplifier that Alina hopes will give her the strength to combat the Darkling's increasingly evil power and influence before his dark power becomes unstoppable. As with Shadow and Bone, this is a dark fantasy best for patient readers: Bardugo takes her time developing the plot and keeping readers guessing. World-building and character development are top-notch, and relationships and motives are complex; Alina hungers for more power just as much as the Darkling does. Those who haven't read the previous novel recently may want to brush up as there is little rehashing of its plot. An action-packed, heartbreaking ending will leave teens breathless for the final installment.—Leigh Collazo, Ed Willkie Middle School, Fort Worth, TX
The Grisha Trilogy turns from bildungsroman to political thriller in its second installment. Sun Summoner Alina and former Ravkan army tracker Mal, once her childhood friend and now her would-be love, are on the run. All they want is to put Ravka and the megalomaniacal Darkling far behind them. Alas, this is not to be. Captured by the Darkling and forced onto a ship captained by the notorious pirate Sturmhond, they find themselves in pursuit of the second of three magical amplifiers that will make Alina powerful beyond belief--and bind her ever-closer to the ancient, evil Darkling. Sturmhond has an unexpected agenda of his own, though, and turns on the Darkling. Darkling temporarily thwarted, Alina and Mal find themselves back in Ravka's capital as part of the ailing king's younger son's attempt to find his way to the throne. Bardugo's sophomore effort smooths out many of the rookie wrinkles that marred Shadow and Bone (2012); Alina's wry voice does not interfere with worldbuilding, instead keeping readers immersed in the plot. Characters are rich and complex, particularly the Peter the Great–like younger prince and Alina herself, beset by competing claims and desires. Is she Mal's lover? Prince Nikolai's pawn? Commander of the Grisha Second Army? Saint? Scheming and action carry readers at a breathless pace to an end that may surprise them and will definitely leave them panting for the series' conclusion. (Fantasy. 13 & up)
Heir of Fire (Throne of Glass Series #3)
Kingdom of Ash (Throne of Glass Serie…
All three books in Leigh Bardugo's New York Times-bestselling Shadow and Bone Trilogy are now available together
Shadow and Bone (Shadow and Bone Trilogy #1)
Surrounded by enemies, the once-great nation of Ravka has been torn in two by the Shadow Fold, a swath of near impenetrable darkness crawling with monsters who feast on human flesh. Now its fate may
Ruin and Rising (Shadow and Bone Trilogy #3)
The capital has fallen. The Darkling rules Ravka from his shadow throne.
Now the nation's fate rests with a broken Sun Summoner, a disgraced tracker, and the shattered remnants of a once-great
Six of Crows (Six of Crows Series #1)
Discover what comes next for heist trio Kaz, Inej, and Jesper - and the star-crossed Nina and Matthias - in the
King of Scars (King of Scars Duology #1)
Enter the Grishaverse with the instant #1 New York Times-bestseller King of Scars by Leigh Bardugo.
"[Bardugo] touches on religion, class, family, love — all organically, all effortlessly, all
" data-ean="9781250618979" data-title="King of Scars (King of Scars Duology #1)">See Details
From #1 New York Times bestselling author Leigh Bardugo comes a mesmerizing tale of power, privilege, and dark magic set among the Ivy League elite.
Galaxy "Alex" Stern is the most
The wolves are circling and a young king will face his greatest challenge in the explosive finale of the instant
Shadow and Bone (French Edition)
Reino de ladrones
Six of Crows Boxed Set: Six of Crows, Crooked Kingdom
The gripping Six of Crows and Crooked Kingdom duology from #1 New York Times bestselling YA author Leigh Bardugo, is now available in a stunning paperback boxed set.
Six dangerous outcasts. One
Asedio y tormenta
Ruina y ascenso
Wonder Woman: Warbringer (DC Icons Series #1)
The highly anticipated DC Icons story of the world's greatest super hero—WONDER WOMAN—by #1 New York Times bestselling author LEIGH BARDUGO.
AN INSTANT NEW YORK TIMES
Crooked Kingdom (Six of Crows Series #2)
The Grishaverse will be coming to Netflix soon with Shadow and Bone, an original series!
Crooked Kingdom is the #1 New York Times-bestselling sequel to Six of Crows. Now in paperback with a brand-new


text:
A Pan-Africanist does not die: tribute to Kenneth Kaunda
NKOPANE MATHIBELI
"When we complain that even in our own countries we do not have control of the economic systems, when we see our people starving to death with the world's wealth under their soils, when we look everywhere and we see the black man at the bottom of every ladder, we must recognise then that the destiny of black children is revolutionary" – Dr Amos Wilson
Although Wilson wrote this when Kaunda was already out of power, his conceptualisation of the African child encapsulates the latter's transition from childhood to adulthood.
First and foremost, Kaunda was a revolutionary wired to reverse the societal order of his day in Zambia and elsewhere on the continent.
This had not only been shaped by the realities of the people of Zambia but the general condition of the African on the continent in relation to the imperialist encroachments of colonial office bearers. In essence, Kenneth Kaunda was not just a revolutionary, he was a Pan-Africanist revolutionary.
All the energies of his prime years were not only dedicated to reversing the economic subjugation of Africa to the Caucasian, but the mental/intellectual subjugation of the African.
Like all Pan-African revolutionaries of his time whether on the continent (Cabral; Sobukwe; Nyerere; Nkrumah) or in the Diaspora (Malcolm X, Huey Newton, Rosa Parks, Khalid Muhammad), only one ideal spurred Kaunda, which was to ensure that Africans acquire the right to determine their own destiny using their own resources and discretion, without the unsolicited supervision of self-appointed European experts who many timid Africans give demigod status.
Pan-Africanism and the Zambian revolution before Kaunda
During the October of 1945, the global Pan-Africanist movement held its Fifth Pan African Congress in Manchester and decided on how to confront colonialism and demand the rights and freedoms of African countries.
From then, the spirit of African nationalism, fuelled by the organic acceptance of Pan-Africanist ideas/philosophies, deepened its roots. Informed by the sentiments disseminated post this particular conference, just like elsewhere in Africa, the people of Zambia, then Northern Rhodesia, began demanding self-determination from Britain.
Already aware of the virtue of unity and as a remarkable show of solidarity, this nation of numerous, very impoverished tribes set their difference aside and pooled their power.
As a prelude and in order to reverse their economic exclusion and poverty, the people had, before WWII, established societies concerned with their own welfare in their own regions/communities throughout the country.
A year after WWII, fourteen of such societies tallied-up to form the Federation of Welfare societies.
Two years later (1948), the federation evolved to become a congress, the Northern Rhodesia Congress. Three years later (1951), the congress became a fully-fledged political party, the North Rhodesian African National Congress.
At this time, the 27-year-old Kaunda had only set his sight but not his feet on Zambia's political landscape.
Kenneth Kaunda and the Zambian revolution
When the North Rhodesian African National Congress was formed under the leadership of Harry Nkumbula, Kaunda was two years into his job as an interpreter and advisor on African affairs to a member of the Northern Rhodesian Legislative Council, Sir Stewart Gore-Browne. Before then, he was a teacher in both Zambia and Tanzania.
During those two years as an interpreter and advisor on African affairs, he learnt about the nature and dynamics of colonial governance.
It was his knowledge-based confidence and his desire to see the people of Zambia determining their own destiny that spurred him to throw his lot with Nkumbula's North Rhodesian African National Congress the year it was formed.
Quickly, he became the Secretary General of the organisation and the first battle it won was to push back the envisaged Central African Federation (CAF) which was meant to be an outcome of amalgamating Zambia, Tanzania and Malawi by 1953.
Five years later in 1958 when he and Nkumbula no longer saw eye to eye regarding the strategy towards decolonisation, he began sizing his options and in 1959, established the Zambian African National Congress (ZANC) and later that year got arrested for holding an illegal meeting.
After his release in 1960, he led the United National Independent Party (UNIP) through which he became Zambia's first president in 1964. He was now at the helm of political power and the real revolution was only beginning. What had merely happened was a change of the face of political power.
The pan-Africanist perspective and Kaunda's tenure
The only real low of his tenure was the economic deterioration of Zambia. It was, however, not largely due to economic mismanagement; the economy merely became a casualty of his progressive continentalism, an idea somewhat similar to that of progressive internationalism implemented by Fidel's Cuba in assisting friendly African revolutionary movements in decolonising their countries.
As a result of this, he contributed significantly to South Africa's battle against apartheid after having made Zambia one of the first five original members of the Front-Line States.
Just like the glorious battle he, arm-in-arm with his comrades, fought and won when Britain wanted to amalgamate Zambia, Zimbabwe and Malawi in 1953, again from 1976 to 1980 Kaunda was in the thick of things when Angola, Botswana, Mozambique, Tanzania, Zambia and Zimbabwe together fought against South Africa's attempt to establish what it called a Constellation of Southern African States (CONSAS).
Together, they won this battle in 1980 with the establishment of the Southern African Development Coordination Conference (SADCC). This is to also show that he even fought and won meaningful revolutionary battles beyond the borders of Zambia.
When Kaunda was in power, the Africanist school of thought dominated the intellectual debates within the Pan-Africanist movement. As a result of its high order intellectual gymnastics (so to speak), the period between WWII and 1980 came to be known as the period of Afro-centricity.
Its thrust was premised on understanding the old world of Africa in a new sense. It is on the background of internalising this strand of critical African political thought that he, in his 1967 book "Humanism in Zambia and a Guide to Its Implementation" formulated a philosophy on which Zambian nationalism was based, Zambian humanism.
Verbatim, one Zambian Theological intellectual, Mwangala Raymond Mwangala succinctly described it as:
"A philosophy and political ideology rooted in traditional African religion and culture and focused on the centrality of the individual human being (common man) in social, economic and political activity."
In retrospect, this shows us that both the Africanist school, within the Pan-Africanist movement and its loyal disciples like Kaunda, were decades ahead of a group of intellectuals led by Thabo Mbeki whose intellectualisation of African issues gave us the African Renaissance (1999).
Theirs was nothing but a watered-down version of the Afro-centricity that hardcore Pan-Africanists like Kaunda long implemented as philosophised by the Africanist school.
Kaunda, Afrocentricity, Zambian humanism and term limits
The Zambian Humanism of Kaunda, just like Nyerere's Ujamaa, was an important but largely misunderstood attempt to remodel the modern State of Zambia on Great Pre-colonial African States. For many modern-day Africans whose formal school history lessons began Africa's history with slavery followed by colonialism, pre-colonial Africa is synonymous to darkness.
This in itself is the epitome of the miseducation of the African about Africa. For many, to be told of splendid ancient African civilisations before slavery and colonialism borders on hallucination. Their doctored Eurocentric education conditions them to reject such truths.
Hence why at the height of the Civil rights movement, Malcom X cautioned how:
"You have to be careful introducing the truth to the black man. The black brother is so brainwashed that he may reject the truth when he first hears it. You have to drop a little bit on him at a time."
Nonetheless, these great ancient African civilisations that sprang up after the destruction of Pharaonic Egypt and other great Nile River civilizations such as the Kingdom of Kush did exist. Examples are Ghana, Mali, Songhay and the Kingdom of Kuba, among others.
When the dominant stream of the Pan-Africanism of Kaunda's time (Afro-centricity) stated that it sought for Africans to understand the old world of Africa in a new sense, the point of reference was these great ancient civilizations.
The greatest disciples such as Kaunda came to understand that an African society couldn't be modelled on European society. As a politician, his most obvious adherence to an African model was his rejection of European democracy and its two term limits.
With our Eurocentric political education that waxes lyrical about European democracy, even many of our Africa trained political scientists reject the idea of African democracy as practiced by all the aforementioned ancient civilizations.
As a justification for a one-party state in Zambia from 1972, Kaunda, in one of his books highlighted (quoted verbatim):
"The enduring importance of chiefly authority for it pointed to an authentically African model of unity and consensual and communitarian decision-making that made competing political parties not only inappropriate, but also potentially destabilising channels for tribally-based conflict."
There was great potential for this kind of conflict in Zambia. In many other countries like Lesotho without numerous tribes, the origin of conflict is the pursuit of power as an end in itself.
People like Kaunda were ahead of time because they realised that European democracy was not suited to the African condition characterised by the gross ignorance of the masses. What worsens the aftermath of the ignorance is the post-colonial aberration of leaders without the people's interests at heart despite having been democratically elected, according to European processes.
On the other hand, we have examples of those who were never elected but had the best interests of their people at heart (Thomas Sankara, Leabua Jonathan) and those despite staying in power by manipulating democratic processes (Magufuli, Kagame), work to improve the welfare of the people and those who like Kaunda, completely suspended democratic processes but still used their political power to honestly serve the people.
Despite the wailings from the headquarters of democracy, Africa can and must do with such leaders. After all, Great Men and Women who led some of Africa's forgotten civilisations never adhered to principles of European democracy but Africa's brand of democracy.
It is at junctures like these that we Africans must introspect lest we render lives like Kaunda's irrelevant. That in itself may as well keep us in our perpetual curse i.e., the curse of rejecting the messages of our best messengers but instead opting to travel on wrong roads. Africa has its own ways. The problem is Africans seeking validation from Europe to follow such ways.
With all of this said, I must conclude by mentioning that Kenneth Kaunda is a man I feel less qualified to eulogise appropriately. Greater anecdotes can best be told by Zambians who were much closer to his greatness…
HE WAS A GREAT PAN-AFRICANIST; A SOLDIER FOR ALL SEASONS. REST IN POWER GREAT ONE.
Previous BAP vows to challenge unity Bill
Next . . . Solar deal culprits named


text:
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import * as Common from '../../core/common/common.js';
import * as i18n from '../../core/i18n/i18n.js';
import * as Platform from '../../core/platform/platform.js';
import * as SDK from '../../core/sdk/sdk.js';
import * as InlineEditor from '../../ui/legacy/components/inline_editor/inline_editor.js';
import * as Components from '../../ui/legacy/components/utils/utils.js';
import * as UI from '../../ui/legacy/legacy.js';

import * as ElementsComponents from './components/components.js';
import computedStyleSidebarPaneStyles from './computedStyleSidebarPane.css.js';

import {ComputedStyleModel, Events, type ComputedStyle} from './ComputedStyleModel.js';
import {ImagePreviewPopover} from './ImagePreviewPopover.js';
import {PlatformFontsWidget} from './PlatformFontsWidget.js';

import {categorizePropertyName, DefaultCategoryOrder, type Category} from './PropertyNameCategories.js';
import {StylePropertiesSection} from './StylePropertiesSection.js';
import {StylesSidebarPane, StylesSidebarPropertyRenderer} from './StylesSidebarPane.js';
import * as TreeOutline from '../../ui/components/tree_outline/tree_outline.js';
import * as LitHtml from '../../ui/lit-html/lit-html.js';

const UIStrings = {
  /**
  * @description Placeholder text for a text input used to filter which CSS properties show up in
  * the list of computed properties. In the Computed Style Widget of the Elements panel.
  */
  filter: 'Filter',
  /**
  * @description ARIA accessible name for the text input used to filter which CSS properties show up
  * in the list of computed properties. In the Computed Style Widget of the Elements panel.
  */
  filterComputedStyles: 'Filter Computed Styles',
  /**
  * @description Text for a checkbox setting that controls whether the user-supplied filter text
  * excludes all CSS propreties which are filtered out, or just greys them out. In Computed Style
  * Widget of the Elements panel
  */
  showAll: 'Show all',
  /**
  * @description Text for a checkbox setting that controls whether similar CSS properties should be
  * grouped together or not. In Computed Style Widget of the Elements panel.
  */
  group: 'Group',
  /** [
  * @description Text shown to the user when a filter is applied to the computed CSS properties, but
  * no properties matched the filter and thus no results were returned.
  */
  noMatchingProperty: 'No matching property',
  /**
  * @description Context menu item in Elements panel to navigate to the source code location of the
  * CSS selector that was clicked on.
  */
  navigateToSelectorSource: 'Navigate to selector source',
  /**
  * @description Context menu item in Elements panel to navigate to the corresponding CSS style rule
  * for this computed property.
  */
  navigateToStyle: 'Navigate to style',
};
const str_ = i18n.i18n.registerUIStrings('panels/elements/ComputedStyleWidget.ts', UIStrings);
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);

const createPropertyElement =
    (node: SDK.DOMModel.DOMNode, propertyName: string, propertyValue: string, traceable: boolean, inherited: boolean,
     onNavigateToSource: ((event?: Event) => void)): ElementsComponents.ComputedStyleProperty.ComputedStyleProperty => {
      const propertyElement = new ElementsComponents.ComputedStyleProperty.ComputedStyleProperty();

      const renderer = new StylesSidebarPropertyRenderer(null, node, propertyName, propertyValue);
      renderer.setColorHandler(processColor);

      propertyElement.data = {
        propertyNameRenderer: renderer.renderName.bind(renderer),
        propertyValueRenderer: renderer.renderValue.bind(renderer),
        traceable,
        inherited,
        onNavigateToSource,
      };

      return propertyElement;
    };

const createTraceElement =
    (node: SDK.DOMModel.DOMNode, property: SDK.CSSProperty.CSSProperty, isPropertyOverloaded: boolean,
     matchedStyles: SDK.CSSMatchedStyles.CSSMatchedStyles,
     linkifier: Components.Linkifier.Linkifier): ElementsComponents.ComputedStyleTrace.ComputedStyleTrace => {
      const trace = new ElementsComponents.ComputedStyleTrace.ComputedStyleTrace();

      const renderer = new StylesSidebarPropertyRenderer(null, node, property.name, (property.value as string));
      renderer.setColorHandler(processColor);
      const valueElement = renderer.renderValue();
      valueElement.slot = 'trace-value';
      trace.appendChild(valueElement);

      const rule = (property.ownerStyle.parentRule as SDK.CSSRule.CSSStyleRule | null);
      let ruleOriginNode;
      if (rule) {
        ruleOriginNode = StylePropertiesSection.createRuleOriginNode(matchedStyles, linkifier, rule);
      }
      trace.data = {
        selector: rule ? rule.selectorText() : 'element.style',
        active: !isPropertyOverloaded,
        onNavigateToSource: navigateToSource.bind(null, property),
        ruleOriginNode,
      };

      return trace;
    };

const renderCircularSwatch = (text: string): Node => {
  const swatch = new InlineEditor.CircularColorSwatch.CircularColorSwatch();
  swatch.renderColor(text);
  const valueElement = document.createElement('span');
  valueElement.textContent = text;
  swatch.append(valueElement);
  return swatch;
};

const processColor = (text: string): Node => {
  if (Common.Color.Color.canBeWideGamut(text)) {
    return renderCircularSwatch(text);
  }

  const swatch = new InlineEditor.ColorSwatch.ColorSwatch();
  swatch.renderColor(text, true);
  const valueElement = document.createElement('span');
  valueElement.textContent = swatch.getText();
  swatch.append(valueElement);

  swatch.addEventListener(
      InlineEditor.ColorSwatch.FormatChangedEvent.eventName, (event: InlineEditor.ColorSwatch.FormatChangedEvent) => {
        const {data} = event;
        valueElement.textContent = data.text;
      });

  return swatch;
};

const navigateToSource = (cssProperty: SDK.CSSProperty.CSSProperty, event?: Event): void => {
  if (!event) {
    return;
  }
  void Common.Revealer.reveal(cssProperty);
  event.consume(true);
};

const propertySorter = (propA: string, propB: string): number => {
  if (propA.startsWith('--') !== propB.startsWith('--')) {
    return propA.startsWith('--') ? 1 : -1;
  }
  if (propA.startsWith('-webkit') !== propB.startsWith('-webkit')) {
    return propA.startsWith('-webkit') ? 1 : -1;
  }
  const canonicalA = SDK.CSSMetadata.cssMetadata().canonicalPropertyName(propA);
  const canonicalB = SDK.CSSMetadata.cssMetadata().canonicalPropertyName(propB);
  return Platform.StringUtilities.compare(canonicalA, canonicalB);
};

type ComputedStyleData = {
  tag: 'property',
  propertyName: string,
  propertyValue: string,
  inherited: boolean,
}|{
  tag: 'traceElement',
  property: SDK.CSSProperty.CSSProperty,
  rule: SDK.CSSRule.CSSRule | null,
}|{
  tag: 'category',
  name: string,
};

export class ComputedStyleWidget extends UI.ThrottledWidget.ThrottledWidget {
  private computedStyleModel: ComputedStyleModel;
  private readonly showInheritedComputedStylePropertiesSetting: Common.Settings.Setting<boolean>;
  private readonly groupComputedStylesSetting: Common.Settings.Setting<boolean>;
  input: Element;
  private filterRegex: RegExp|null;
  private readonly noMatchesElement: HTMLElement;
  private readonly linkifier: Components.Linkifier.Linkifier;
  private readonly imagePreviewPopover: ImagePreviewPopover;

  #computedStylesTree = new TreeOutline.TreeOutline.TreeOutline<ComputedStyleData>();
  #treeData?: TreeOutline.TreeOutline.TreeOutlineData<ComputedStyleData>;

  constructor() {
    super(true);

    this.contentElement.classList.add('styles-sidebar-computed-style-widget');

    this.computedStyleModel = new ComputedStyleModel();
    this.computedStyleModel.addEventListener(Events.ComputedStyleChanged, this.update, this);

    this.showInheritedComputedStylePropertiesSetting =
        Common.Settings.Settings.instance().createSetting('showInheritedComputedStyleProperties', false);
    this.showInheritedComputedStylePropertiesSetting.addChangeListener(this.update.bind(this));

    this.groupComputedStylesSetting = Common.Settings.Settings.instance().createSetting('groupComputedStyles', false);
    this.groupComputedStylesSetting.addChangeListener(() => {
      this.update();
    });

    const hbox = this.contentElement.createChild('div', 'hbox styles-sidebar-pane-toolbar');
    const filterContainerElement = hbox.createChild('div', 'styles-sidebar-pane-filter-box');
    const filterInput = StylesSidebarPane.createPropertyFilterElement(
        i18nString(UIStrings.filter), hbox, this.filterComputedStyles.bind(this));
    UI.ARIAUtils.setAccessibleName(filterInput, i18nString(UIStrings.filterComputedStyles));
    filterContainerElement.appendChild(filterInput);
    this.input = filterInput;
    this.filterRegex = null;

    const toolbar = new UI.Toolbar.Toolbar('styles-pane-toolbar', hbox);
    toolbar.appendToolbarItem(new UI.Toolbar.ToolbarSettingCheckbox(
        this.showInheritedComputedStylePropertiesSetting, undefined, i18nString(UIStrings.showAll)));
    toolbar.appendToolbarItem(
        new UI.Toolbar.ToolbarSettingCheckbox(this.groupComputedStylesSetting, undefined, i18nString(UIStrings.group)));

    this.noMatchesElement = this.contentElement.createChild('div', 'gray-info-message');
    this.noMatchesElement.textContent = i18nString(UIStrings.noMatchingProperty);

    this.contentElement.appendChild(this.#computedStylesTree);

    this.linkifier = new Components.Linkifier.Linkifier(_maxLinkLength);

    this.imagePreviewPopover = new ImagePreviewPopover(this.contentElement, event => {
      const link = event.composedPath()[0];
      if (link instanceof Element) {
        return link;
      }
      return null;
    }, () => this.computedStyleModel.node());

    const fontsWidget = new PlatformFontsWidget(this.computedStyleModel);
    fontsWidget.show(this.contentElement);

    Common.Settings.Settings.instance().moduleSetting('colorFormat').addChangeListener(this.update.bind(this));
  }

  onResize(): void {
    const isNarrow = this.contentElement.offsetWidth < 260;
    this.#computedStylesTree.classList.toggle('computed-narrow', isNarrow);
  }

  private showInheritedComputedStyleChanged(): void {
    this.update();
  }

  update(): void {
    super.update();
  }

  wasShown(): void {
    super.wasShown();
    this.registerCSSFiles([computedStyleSidebarPaneStyles]);
  }

  async doUpdate(): Promise<void> {
    const [nodeStyles, matchedStyles] =
        await Promise.all([this.computedStyleModel.fetchComputedStyle(), this.fetchMatchedCascade()]);
    if (!nodeStyles || !matchedStyles) {
      this.noMatchesElement.classList.remove('hidden');
      return;
    }
    const shouldGroupComputedStyles = this.groupComputedStylesSetting.get();
    if (shouldGroupComputedStyles) {
      await this.rebuildGroupedList(nodeStyles, matchedStyles);
    } else {
      await this.rebuildAlphabeticalList(nodeStyles, matchedStyles);
    }
  }

  private async fetchMatchedCascade(): Promise<SDK.CSSMatchedStyles.CSSMatchedStyles|null> {
    const node = this.computedStyleModel.node();
    if (!node || !this.computedStyleModel.cssModel()) {
      return null;
    }

    const cssModel = this.computedStyleModel.cssModel();
    if (!cssModel) {
      return null;
    }

    return cssModel.cachedMatchedCascadeForNode(node).then(validateStyles.bind(this));

    function validateStyles(this: ComputedStyleWidget, matchedStyles: SDK.CSSMatchedStyles.CSSMatchedStyles|null):
        SDK.CSSMatchedStyles.CSSMatchedStyles|null {
      return matchedStyles && matchedStyles.node() === this.computedStyleModel.node() ? matchedStyles : null;
    }
  }

  private async rebuildAlphabeticalList(nodeStyle: ComputedStyle, matchedStyles: SDK.CSSMatchedStyles.CSSMatchedStyles):
      Promise<void> {
    this.imagePreviewPopover.hide();
    this.linkifier.reset();
    const cssModel = this.computedStyleModel.cssModel();
    if (!cssModel) {
      return;
    }

    const uniqueProperties = [...nodeStyle.computedStyle.keys()];
    uniqueProperties.sort(propertySorter);

    const node = nodeStyle.node;
    const propertyTraces = this.computePropertyTraces(matchedStyles);
    const nonInheritedProperties = this.computeNonInheritedProperties(matchedStyles);
    const showInherited = this.showInheritedComputedStylePropertiesSetting.get();
    const tree: TreeOutline.TreeOutlineUtils.TreeNode<ComputedStyleData>[] = [];
    for (const propertyName of uniqueProperties) {
      const propertyValue = nodeStyle.computedStyle.get(propertyName) || '';
      const canonicalName = SDK.CSSMetadata.cssMetadata().canonicalPropertyName(propertyName);
      const isInherited = !nonInheritedProperties.has(canonicalName);
      if (!showInherited && isInherited && !_alwaysShownComputedProperties.has(propertyName)) {
        continue;
      }
      if (!showInherited && propertyName.startsWith('--')) {
        continue;
      }
      if (propertyName !== canonicalName && propertyValue === nodeStyle.computedStyle.get(canonicalName)) {
        continue;
      }
      tree.push(this.buildTreeNode(propertyTraces, propertyName, propertyValue, isInherited));
    }

    const defaultRenderer = this.createTreeNodeRenderer(propertyTraces, node, matchedStyles);
    this.#treeData = {
      tree,
      compact: true,
      defaultRenderer,
    };
    this.filterAlphabeticalList();
  }

  private async rebuildGroupedList(
      nodeStyle: ComputedStyle|null, matchedStyles: SDK.CSSMatchedStyles.CSSMatchedStyles|null): Promise<void> {
    this.imagePreviewPopover.hide();
    this.linkifier.reset();
    const cssModel = this.computedStyleModel.cssModel();
    if (!nodeStyle || !matchedStyles || !cssModel) {
      this.noMatchesElement.classList.remove('hidden');
      return;
    }

    const node = nodeStyle.node;
    const propertyTraces = this.computePropertyTraces(matchedStyles);
    const nonInheritedProperties = this.computeNonInheritedProperties(matchedStyles);
    const showInherited = this.showInheritedComputedStylePropertiesSetting.get();

    const propertiesByCategory = new Map<Category, string[]>();

    const tree: TreeOutline.TreeOutlineUtils.TreeNode<ComputedStyleData>[] = [];
    for (const [propertyName, propertyValue] of nodeStyle.computedStyle) {
      const canonicalName = SDK.CSSMetadata.cssMetadata().canonicalPropertyName(propertyName);
      const isInherited = !nonInheritedProperties.has(canonicalName);
      if (!showInherited && isInherited && !_alwaysShownComputedProperties.has(propertyName)) {
        continue;
      }
      if (!showInherited && propertyName.startsWith('--')) {
        continue;
      }
      if (propertyName !== canonicalName && propertyValue === nodeStyle.computedStyle.get(canonicalName)) {
        continue;
      }

      const categories = categorizePropertyName(propertyName);
      for (const category of categories) {
        if (!propertiesByCategory.has(category)) {
          propertiesByCategory.set(category, []);
        }
        propertiesByCategory.get(category)?.push(propertyName);
      }
    }

    this.#computedStylesTree.removeChildren();
    for (const category of DefaultCategoryOrder) {
      const properties = propertiesByCategory.get(category);
      if (properties && properties.length > 0) {
        const propertyNodes: TreeOutline.TreeOutlineUtils.TreeNode<ComputedStyleData>[] = [];
        for (const propertyName of properties) {
          const propertyValue = nodeStyle.computedStyle.get(propertyName) || '';
          const canonicalName = SDK.CSSMetadata.cssMetadata().canonicalPropertyName(propertyName);
          const isInherited = !nonInheritedProperties.has(canonicalName);
          propertyNodes.push(this.buildTreeNode(propertyTraces, propertyName, propertyValue, isInherited));
        }
        tree.push({id: category, treeNodeData: {tag: 'category', name: category}, children: async () => propertyNodes});
      }
    }
    const defaultRenderer = this.createTreeNodeRenderer(propertyTraces, node, matchedStyles);
    this.#treeData = {
      tree,
      compact: true,
      defaultRenderer,
    };
    return this.filterGroupLists();
  }

  private buildTraceNode(property: SDK.CSSProperty.CSSProperty):
      TreeOutline.TreeOutlineUtils.TreeNode<ComputedStyleData> {
    const rule = property.ownerStyle.parentRule as SDK.CSSRule.CSSStyleRule;
    return {
      treeNodeData: {
        tag: 'traceElement',
        property,
        rule,
      },
      id: rule.origin + ': ' + rule.styleSheetId + property.range,
    };
  }

  private createTreeNodeRenderer(
      propertyTraces: Map<string, SDK.CSSProperty.CSSProperty[]>,
      domNode: SDK.DOMModel.DOMNode,
      matchedStyles: SDK.CSSMatchedStyles.CSSMatchedStyles,
      ):
      (node: TreeOutline.TreeOutlineUtils.TreeNode<ComputedStyleData>,
       state: {isExpanded: boolean}) => LitHtml.TemplateResult {
    return node => {
      const data = node.treeNodeData;
      let navigate: (arg0?: Event) => void = () => {};
      if (data.tag === 'property') {
        const trace = propertyTraces.get(data.propertyName);
        const activeProperty = trace?.find(
            property => matchedStyles.propertyState(property) === SDK.CSSMatchedStyles.PropertyState.Active);
        if (activeProperty) {
          navigate = navigateToSource.bind(this, activeProperty);
        }
        const propertyElement = createPropertyElement(
            domNode, data.propertyName, data.propertyValue, propertyTraces.has(data.propertyName), data.inherited,
            navigate);
        if (activeProperty) {
          propertyElement.addEventListener(
              'contextmenu', this.handleContextMenuEvent.bind(this, matchedStyles, activeProperty));
        }
        return LitHtml.html`${propertyElement}`;
      }
      if (data.tag === 'traceElement') {
        const isPropertyOverloaded =
            matchedStyles.propertyState(data.property) === SDK.CSSMatchedStyles.PropertyState.Overloaded;
        const traceElement =
            createTraceElement(domNode, data.property, isPropertyOverloaded, matchedStyles, this.linkifier);
        traceElement.addEventListener(
            'contextmenu', this.handleContextMenuEvent.bind(this, matchedStyles, data.property));
        return LitHtml.html`${traceElement}`;
      }
      return LitHtml.html`<span style="cursor: text; color: var(--color-text-secondary);">${data.name}</span>`;
    };
  }

  private buildTreeNode(
      propertyTraces: Map<string, SDK.CSSProperty.CSSProperty[]>, propertyName: string, propertyValue: string,
      isInherited: boolean): TreeOutline.TreeOutlineUtils.TreeNode<ComputedStyleData> {
    const treeNodeData: ComputedStyleData = {
      tag: 'property',
      propertyName,
      propertyValue,
      inherited: isInherited,
    };
    const trace = propertyTraces.get(propertyName);
    if (!trace) {
      return {
        treeNodeData,
        id: propertyName,
      };
    }
    return {
      treeNodeData,
      id: propertyName,
      children: async () => trace.map(this.buildTraceNode),
    };
  }

  private handleContextMenuEvent(
      matchedStyles: SDK.CSSMatchedStyles.CSSMatchedStyles, property: SDK.CSSProperty.CSSProperty, event: Event): void {
    const contextMenu = new UI.ContextMenu.ContextMenu(event);
    const rule = property.ownerStyle.parentRule;

    if (rule) {
      const header = rule.styleSheetId ? matchedStyles.cssModel().styleSheetHeaderForId(rule.styleSheetId) : null;
      if (header && !header.isAnonymousInlineStyleSheet()) {
        contextMenu.defaultSection().appendItem(i18nString(UIStrings.navigateToSelectorSource), () => {
          StylePropertiesSection.tryNavigateToRuleLocation(matchedStyles, rule);
        });
      }
    }

    contextMenu.defaultSection().appendItem(
        i18nString(UIStrings.navigateToStyle), () => Common.Revealer.reveal(property));
    void contextMenu.show();
  }

  private computePropertyTraces(matchedStyles: SDK.CSSMatchedStyles.CSSMatchedStyles):
      Map<string, SDK.CSSProperty.CSSProperty[]> {
    const result = new Map<string, SDK.CSSProperty.CSSProperty[]>();
    for (const style of matchedStyles.nodeStyles()) {
      const allProperties = style.allProperties();
      for (const property of allProperties) {
        if (!property.activeInStyle() || !matchedStyles.propertyState(property)) {
          continue;
        }
        if (!result.has(property.name)) {
          result.set(property.name, []);
        }
        // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
        // @ts-expect-error
        result.get(property.name).push(property);
      }
    }
    return result;
  }

  private computeNonInheritedProperties(matchedStyles: SDK.CSSMatchedStyles.CSSMatchedStyles): Set<string> {
    const result = new Set<string>();
    for (const style of matchedStyles.nodeStyles()) {
      for (const property of style.allProperties()) {
        if (!matchedStyles.propertyState(property)) {
          continue;
        }
        result.add(SDK.CSSMetadata.cssMetadata().canonicalPropertyName(property.name));
      }
    }
    return result;
  }

  async filterComputedStyles(this: ComputedStyleWidget, regex: RegExp|null): Promise<void> {
    this.filterRegex = regex;
    if (this.groupComputedStylesSetting.get()) {
      return this.filterGroupLists();
    }
    return this.filterAlphabeticalList();
  }

  private nodeFilter(node: TreeOutline.TreeOutlineUtils.TreeNode<ComputedStyleData>): boolean {
    const regex = this.filterRegex;
    const data = node.treeNodeData;
    if (data.tag === 'property') {
      const matched = !regex || regex.test(data.propertyName) || regex.test(data.propertyValue);
      return matched;
    }
    return true;
  }

  private filterAlphabeticalList(): void {
    if (!this.#treeData) {
      return;
    }
    const tree = this.#treeData.tree.filter(this.nodeFilter.bind(this));
    this.#computedStylesTree.data = {
      tree,
      defaultRenderer: this.#treeData.defaultRenderer,
      compact: this.#treeData.compact,
    };
    this.noMatchesElement.classList.toggle('hidden', Boolean(tree.length));
  }

  private async filterGroupLists(): Promise<void> {
    if (!this.#treeData) {
      return;
    }
    const tree: TreeOutline.TreeOutlineUtils.TreeNode<ComputedStyleData>[] = [];
    for (const group of this.#treeData.tree) {
      const data = group.treeNodeData;
      if (data.tag !== 'category' || !group.children) {
        continue;
      }
      const properties = await group.children();
      const filteredChildren = properties.filter(this.nodeFilter.bind(this));
      if (filteredChildren.length) {
        tree.push(
            {id: data.name, treeNodeData: {tag: 'category', name: data.name}, children: async () => filteredChildren});
      }
    }

    this.#computedStylesTree.data = {
      tree,
      defaultRenderer: this.#treeData.defaultRenderer,
      compact: this.#treeData.compact,
    };
    await this.#computedStylesTree.expandRecursively(0);
    this.noMatchesElement.classList.toggle('hidden', Boolean(tree.length));
  }
}

// TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
// eslint-disable-next-line @typescript-eslint/naming-convention
const _maxLinkLength = 30;
// TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
// eslint-disable-next-line @typescript-eslint/naming-convention
const _alwaysShownComputedProperties = new Set<string>(['display', 'height', 'width']);

redpajama_set_name: RedPajamaGithub


Sebra Dino counting puzzle. A fun, educational toy for children to help them learn to count! Your little one will love to learn to count with the help of dinos and artic animals in this counting puzzle.
10 small puzzle sets from 1-10 with poetic colors and illustrations.