This page is about the Enchanter added by Extra Utilities 2. For other uses, see Enchanter.
The Enchanter is a block added by Extra Utilities 2. It is used to create different components and to enchant armors and tools combining two items. It consumes Redstone Flux (RF) and can be speed up with Speed Upgrades. However, it will consume Grid Power. The enchanter requires a full set of 15 Bookshelves or 6 Magical Wood to work.
By combining any tools or armor pieces with 1 Nether Star, the Enchanter will give a random enchantment at maximum level according to the type of the item (Sword = Sharpness V, Chestplate = Protection IV...). It will consume 72,000 RF for 1800s.
And combining any tools or armor pieces with 1 Lapis Lazuli, the item will be enchanted with a minimum level enchantment (Sword = Sharpness I, Chestplate = Protection I...).
This page was last edited on 11 August 2018, at 20:12.


Written by Dr S Hammans (Consultant Neurologist) Wessex Neurological Centre, Southampton for the Muscular Dystrophy Campaign.
What is inclusion body myositis?
Inclusion body myositis (IBM) is a disease of muscle, which causes muscles to become thin and weak. It was recognised as a disease in its own right in the 1960's. It usually occurs in middle to late life and is more common in men than women. We don't know how many people in the UK are affected but it is the most common muscle disease diagnosed after the age of 50. Nevertheless, it is sufficiently rare that most general practitioners will not have looked after patients with IBM before, and many doctors will not have heard of the condition.
IBM is a slowly progressive condition causing a gradual deterioration in muscle strength over the years. Most limb muscles can be affected. In particular the quadriceps (the thigh muscles which extend the knee joint), and forearm muscles that flex the wrists and fingers are commonly weak. Accordingly, patients often notice difficulty with stairs, getting out of a chair and a poor grip. Swallowing muscles are affected in some patients, but most do not encounter severe swallowing problems. The disease typically does not affect muscles of the heart, eye, gut or bladder. It does not affect the function of the brain or sensation, and speech is rarely affected. In general patients do not die of the disease, but most meet with some degree of disability as the disease progresses.
The disease itself is painless. However, weakened muscles can predispose to injuries affecting bones, joints and soft tissues.
The short answer is that no one knows! A number of theories have been put forward over the years though none have stood the test of time. In some families the condition is inherited, often with earlier onset than the more common sporadic (non-inherited) form. The presence of inflammatory cells in some muscle samples has led to the theory that muscle is damaged by inflammation, caused by a virus or a misdirected immune system.
No conclusive evidence to support these theories has been provided. Efforts to suppress the immune system have not led to clear benefit. More recently it has been suggested that IBM is primarily a degenerative disease of muscle with inflammation only secondary to this process. Many researchers in several countries continue to accumulate evidence to shed light on the cause of the disease.
Blood test: When muscles are damaged they release a protein into the blood stream called creatine kinase. This can be detected in a routine blood sample. In some people with IBM the level of this protein in the blood is slightly raised. This blood test may therefore alert the physician to the possibility of muscle disease.
Electromypgraphy (EMG): When healthy muscle contract they fire off a co-ordinated pattern of electrical impulses that can be detected by a tiny needle positioned in the muscle. When sick muscles contract abnormal electrical impulses can be detected. However, although EMG may be helpful it cannot make a definite diagnosis.
Muscle biopsy: The definitive test for IBM is a muscle biopsy. The biopsy involves taking a small sample of muscle under local anaesthetic. Laboratory analysis includes a series of stains and reactions, used to highlight different parts of the muscle. In IBM, muscle cells appear damaged. The hallmark of IBM is the inclusion body, which is an abnormal clump of proteins seen in damaged cells. This appearance will allow the pathologist and clinician to confirm the diagnosis of IBM.
Because of the indolent nature of muscle weakness in IBM, a diagnosis is sometimes delayed for years after the onset of weakness. In some patients, the initial biopsy may not disclose the diagnosis, and a second biopsy may be necessary.
In other forms of myositis steroid treatment may be helpful. If steroids fail to help then this may give rise to consideration of IBM as a possible diagnosis.
Are other members of the family at risk of IBM?
Every patient requires individual assessment. The inherited form appears to be rare in the UK. However if IBM is of typical age of onset without evidence of similar disease previously in the family, the risk to other members of the family is very small.
The presence of inflammatory cells in some biopsies led to suggestions that steroids and other drugs that suppress the immune system might be beneficial in this condition. This immunosuppressant treatment is controversial. Some neurologists are of the opinion that these drugs can give short-term improvement and possibly long-term benefit in slowing the rate of progression, although all agree that these drugs will not prevent muscles from continuing to weaken in the long-term. Other experts argue that any benefits are transient and are outweighed by long-term side effects from the drugs.
Recent trials have studied intravenous infusions of human immunoglobulin (IVIG) in IBM. Results have been contradictory, but provide no firm evidence of enduring benefit. Further trials continue, but currently the costs and side-effects do not justify routine treatment of IBM patients with IVIG.
In summary, there is currently no proven treatment. Further research into the cause of the disease will hopefully allow a rational basis to develop effective therapies.
What other help is there?
Physiotherapy: Physiotherapy is not able to make weak muscles strong again. However, appropriate exercises can help to maximise the efficiency of the relatively unaffected muscles. When walking is affected physiotherapists can advise on walking aids (sticks etc). Physiotherapists can also teach people how to transfer between chairs, beds and wheelchairs if and when they become necessary.
Occupational therapy: Occupational therapists (OTs) can provide advice and equipment to assist in tasks that become increasingly difficult with weakened muscles. More than any other professional they are in a position to provide valuable help in overcoming the everyday practical problems that IBM patients face. Typically they will observe a patient in their own home before advising on strategies, aids and equipment. Examples include cutlery with chunky handles to make gripping easier, aids to help stair climbing and advice on bathing or showering difficulties. OTs are employed in hospitals and by Social Services. Referral to OTs can be made by hospital doctors, GPs or patients themselves through Social Services.
Speech therapy: Speech therapists also have expertise in swallowing difficulties (dysphagia). In some IBM patients weakened swallowing muscles may cause dysphagia. This may cause fragments of food or drink to enter the windpipe resulting in coughing after meals or chest infections. Some IBM patients reduce their intake resulting in significant weight loss. Speech therapists can advise on strategies to help swallowing. Occasionally it is necessary to use other techniques to give adequate nutrition.
Can I help myself in any other way?
Exercise is generally helpful, and helps to get the most out of diseased muscles. Falls and injuries however can cause substantial disability. Patients therefore have the difficult task of undertaking regular exercise within their capability but avoiding injury through accident. Because weakened muscles cannot carry an excess load, keeping to an ideal weight is helpful. This may be obvious, but weight control is more difficult when exercise is limited. It is likely that in the future therapeutic trials of drugs in IBM will be organised. If you are interested you should mention this to your physician.
The Muscular Dystrophy Campaign (MDC) is a UK-wide charity that exists in order to create a world where muscle disease is not a barrier to quality or length of life.
To this end the charity invests over £1.5 million every year into research with the aim of finding treatments, cures and better management for muscular dystrophy and related conditions. (The charity encompasses over 60 different conditions.) MDC researchers significantly contribute to worldwide advances. The Campaign tracks research developments internationally and brings research information to the attention of scientists, medical and care professionals, MDC members, people with MD and the general public.
Information and Advice Services - a telephone, post and web/e-mail based service.
Fact Sheets - fact sheets on specific medical conditions and on living and care issues for people affected by muscle disease.
Family Care Officers - a nationwide team providing practical support and information.
Occupational Therapy - an advisor and provider of specialist information.
Specialist Medical Services - Specialist Muscle Centres based in some of the country's leading hospitals.
Training and Employment - through the partner charity Neuro Muscular Centre (NMC) providing employment, training and physiotherapy for people with MD.
Grants for Equipment to Individuals - through the Joseph Patrick Trust (JPT) contributory funding for some equipment is provided.
Local Branches and Representatives - provide a support and fundraising focus in their localities.
MDC Membership - through membership, enabling all of those affected by MD and or interested in MDC to have a voice in the future direction of the charity. Membership benefits include a bi-monthly magazine and up-to-date information on developments in research and medical and care services.
BECOME A MEMBER: Contact us on 020 7720 8055, e-mail info@muscular-dystrophy.org or write to Muscular Dystrophy Campaign, 7-11 Prescott Place, London SW4 6BS.


text:
Journal of Fluids Engineering (3)
Atherosclerosis: Aneurysms and Heart Valves Posters (1)
Flow (Dynamics) (4)
Laminar flow (3)
Annulus (2)
Entrance region (2)
Fluids (2)
Pressure drop (2)
Aneurysms (1)
S.-H. Lin
Hemodynamics of Abdominal Aortic Aneurysm and its Clinical Relevance in Patients With Infrarenal Stent-Graft Implantation
Y.-H. Lu, G.-T. Liu, S.-H. Lin, C.-Y. Chen
Proc. ASME. SBC2013, Volume 1A: Abdominal Aortic Aneurysms; Active and Reactive Soft Matter; Atherosclerosis; BioFluid Mechanics; Education; Biotransport Phenomena; Bone, Joint and Spine Mechanics; Brain Injury; Cardiac Mechanics; Cardiovascular Devices, Fluids and Imaging; Cartilage and Disc Mechanics; Cell and Tissue Engineering; Cerebral Aneurysms; Computational Biofluid Dynamics; Device Design, Human Dynamics, and Rehabilitation; Drug Delivery and Disease Treatment; Engineered Cellular Environments, V01AT04A013, June 26–29, 2013
In 2008 the overall rate of death attributable to cardiovascular disease, or CVD, is 244.8 per 100,000. On the basis of these mortality rate data, one American dies due to CVD on an average of every 39 seconds. Of these deaths, abdominal aortic aneurysm (AAA) accounts for 11,079 [1]. Although an estimate of the total economic burden of AAA is not available, the average cost per discharge for a ruptured AAA exceeded $93,000 in 2003 [2]. Generally, an abdominal aortic aneurysm (AAA) is an irreversible focal dilation of an artery to 1.5 times its normal diameter [3]. AAAs are characterized by the destruction of elastin and collagen in the media and adventitia, smooth muscle cell loss with thinning of the medial wall, infiltration of lymphocytes and macrophages, and neovascularization [4, 5].
Topics: Aneurysms, Hemodynamics, Stents, Chemical vapor deposition, Cardiovascular system, Diseases, Muscle
On Laminar Wakes Behind a Circular Cylinder in Stratified Fluids
Robert R. Hwang, S. H. Lin
Journal: Journal of Fluids Engineering
J. Fluids Eng. March 1992, 114(1): 20–28.
Published Online: March 1, 1992
Finite-difference techniques based on boundary-fitted coordinates have been developed to study the flow of a stably stratified viscous fluid past a circular cylinder. A time-dependent approach is used and an implicit solution is applied in the implementation of vorticity-stream function formulation. All field equations are approximated using central differences and solved simultaneously at each time step by the SOR iteration. Results show that the stratification tends to retard the vortex shedding from the two sides of the cylinder and to narrow down the wake behind the cylinder. With increasing stratification, the drag exerted by the fluid on the cylinder at first decreases and then increases. These solutions also indicate that the periodic configurations of the oscillatory character of the wake flow decrease with the increase of stratification.
Topics: Circular cylinders, Fluids, Wakes, Cylinders, Drag (Fluid dynamics), Flow (Dynamics), Vortex shedding, Vorticity
Heat Transfer to Generalized Couette Flow of a Non-Newtonian Fluid in Annuli with Moving Inner Cylinder
S. H. Lin, D. M. Hsieh
J. Heat Transfer. November 1980, 102(4): 786–789.
Topics: Annulus, Cylinders, Flow (Dynamics), Heat transfer, Non-Newtonian fluids
Heat Transfer to Power-Law Non-Newtonian Flow between Parallel Plates
S. H. Lin, W. K. Hsu
J. Heat Transfer. May 1980, 102(2): 382–384.
Published Online: May 1, 1980
Topics: Heat transfer, Non-Newtonian flow, Plates (structures)
Radiant Interchange Among Curved Specularly Reflecting Surfaces—Application to Cylindrical and Conical Cavities
S. H. Lin, E. M. Sparrow
J. Heat Transfer. May 1965, 87(2): 299–307.
A method of analysis is formulated for determining the radiant interchange among specularly reflecting surfaces, some or all of which may be nonplanar. The emitted radiant energy is diffusely distributed. The formulation makes use of the exchange factor, which has many of the properties of the diffuse-angle factor. Indeed, the exchange factor is constructed as a series, each term of which is a diffuse-angle factor multiplied by a power of the surface reflectance. A general formalism is developed for deriving the exchange factor. Application of the method of analysis is made to the cylindrical cavity of finite depth and to the conical cavity. Numerical results are then obtained both for the local and overall heat transfer for a wide range of the geometrical and radiative parameters. In general, it is found that specularly reflecting cavities are more efficient emitters and absorbers of radiant energy than are diffusely reflecting cavities.
Topics: Cavities, Heat transfer, Reflectance
The Developing Laminar Flow and Pressure Drop in the Entrance Region of Annular Ducts
E. M. Sparrow, S. H. Lin
J. Fluids Eng. December 1964, 86(4): 827–833.
Published Online: December 1, 1964
A new analytical method has been applied for determining the developing laminar flow in the hydrodynamic entrance region of annular ducts. Detailed results are presented for the development of the velocity distribution and the pressure drop over a wide range of annulus radius ratios r 1 /r 2 (r 1 = inner radius of annulus, r 2 = outer radius of annulus). It is found that the pressure drop and flow development in annular ducts with radius ratios substantially less than unity is quite similar to that in a parallel-plate channel (r 1 /r 2 → 1). On the other hand, the results far an annular duct with radius ratio as small as 0.001 depart significantly from those for a circular tube (r 1 /r 2 = 0). The hydrodynamic entrance length, measured as a multiple of the hydraulic radius, increases as the duct radius ratio decreases at a fixed Reynolds number.
Topics: Ducts, Entrance region, Laminar flow, Pressure drop, Annulus, Flow (Dynamics), Reynolds number
Closure to "Discussion of 'The Developing Laminar Flow and Pressure Drop in the Entrance Region of Annular Ducts'" (1964, ASME J. Basic Eng., 86, pp. 833–834)
Article Type: Discussions
J. Fluids Eng. December 1964, 86(4): 834.
Topics: Entrance region, Laminar flow, Pressure drop
Condensation Heat Transfer in the Presence of a Noncondensable Gas
J. Heat Transfer. August 1964, 86(3): 430–436.
Published Online: August 1, 1964
A theory has been devised for predicting condensation heat transfer in the presence of a noncondensable gas. The analysis is based on the conservation laws alone and does not utilize empirical data. It is shown that the presence of a very small amount of noncondensable gas in the bulk of the vapor can cause a large buildup of the noncondensable at the liquid-vapor interface. A consequence of this buildup is that the partial pressure of the vapor at the interface is reduced. This, in turn, lowers the temperature at which the vapor condenses and diminishes the effective thermal driving force. Heat-transfer reductions of well over fifty percent may be brought about by the presence of the noncondensable. The predictions of the analysis are compared with condensation heat-transfer measurements for steam with air as noncondensable. The agreement between theory and experiment is satisfactory.
Topics: Condensation, Heat transfer, Vapors, Pressure, Steam, Temperature
Laminar Heat Transfer in Tubes Under Slip-Flow Conditions
J. Heat Transfer. November 1962, 84(4): 363–369.
The effects of low-density phenomena on the fully developed heat-transfer characteristics for laminar flow in tubes has been studied analytically. Consideration is given to the slip-flow regime wherein the major rarefaction effects are manifested as velocity and temperature jumps at the tube wall. The analysis is carried out for both uniform wall temperature and uniform wall heat flux. In both cases, the slip-flow Nusselt numbers are lower than those for continuum flow and decrease with increasing mean free path. Extension of the results is made to include the effects of shear work at the wall, temperature jump modifications for a moving fluid, and thermal creep.
Topics: Heat transfer, Slip flow, Wall temperature, Creep, Density, Flow (Dynamics), Fluids, Heat flux, Laminar flow, Mean free path

redpajama_set_name: RedPajamaCommonCrawl


text:
Home Community Mr Hooper's fishing plans
Mr Hooper's fishing plans
John Hooper enjoying time teach ing education and lifelong skills to pupils.
John Hooper enjoying time teaching education and lifelong skills to pupils.John Hooper has been teaching for 40 years but next week steps back from full-time work to allow a younger generation of teachers to shine.
He is not planning a clean break from teaching, but will look for relieving work, ideally release work for a beginning teacher.
But with his 65th birthday looming on December 24, he thinks it's time to make way for younger teachers.
"I sense it's time to move on. It's been an amazing job, it's been incredible.
He and wife, Karen, who teaches part-time, will get to spend more time together but John is planning on doing more fishing and hunting.
They have a bach on the north side of the Rangitata River.
He has spent his time teaching education and lifelong skills, including passing on environmental and gardening passions to pupils around the district and beyond. He has been 19 years at Ashburton Borough School, where he will end his tenure at the end of the term.
He helped to instigate the Borough Greenies at the school, which won Green Gold Environschool awards in 2009, 2012, 2015 and 2019.
As a school they recycle and reuse, grow fruit and vegetables and kept chickens to feed on food scraps.
It had been great to pass environmental and gardening knowledge on to the pupils, he said.
And in his time he has seen some changes but the basics were still important.
important than it used to be, but math, reading and writing are just as important now.
Educators were also teaching more social, and self-management skills than in the past, he said.
He considered himself a structured teacher who liked to teach routine to the children so they knew what was planned.
As well as teaching, John has also been principal, deputy principal and an international teacher.
He started his career at Allenton School when he was an fitmanaging students.
It got a lot easier, he's learned a lot over the years, he said.
In Mid Canterbury he has also worked at Netherby School where he was deputy principal from 1987 to 1993 and then took over as principal of Rakaia School in 1993.
He has also worked at the now closed Lowcliffe School.
He went offshore to Korobosea International School in Papua New Guinea for five years where he was a syndicate leader.
He has also worked at Woolston (Christchurch), Wilden (West Otago), Cromwell, Oturehua (Central Otago), Netherby and spent two years in Britain on an OE.
-By Toni WilliamsRunning Sneakersfree shipping nike yeezy warehouse store locations
Previous articleTwo FTE jobs lost in nursing changes at Ashburton Hospital
Next articleTime out for basketball champions


Two men perform a ritual, a playful and animal-like choreography. Through repetetive movements and attacks they create rhythmical beats. As their bodies melt into one but yet get separated – their relation becomes more complex. As lights and shadows are forming the room, the duet intensifies through physical attacks, -creating a visually expressive and intimate world. Premieres in October 2016.
As dawns of existence "OBVIA" hovers between the concrete and the abstract. The piece was performed as a part of "Trippeldans" in Baerum Kulturhus in 2015.
Dancers: Anine, Tiril, Martine, Julie, Andrea, Caroline, Eva, Pernille, Hanna, Thilde, Rebecca, Else, Elin and Nikoline.
The piece was made for the students at Rønningen Folkehøyskole as a part of their new years performance in 2014.
Mainstream is what's the new trend. When one "style" gets old, a new one is reborn. A mainstream person is someone who jumps from trend to trend so that they fit in with the rest of the crowd. Mainstream is being what society thinks you should be, and look like. Premiered in february 2009.


text:
We just... clicked
Like many things in life, using a dating app here in Jersey is slightly different to how it works in the rest of the world.
It doesn't seem all that long ago that the idea of meeting someone from the internet, in any context, was largely taboo. Our childhoods were filled with 'Stranger Danger' and stark warnings against getting in a car with someone you don't know, or even answering the door to an unknown.
But the Millennial generation have been the first to grow up with the internet as a constant presence, and to whom being connected to and communicating with strangers all over the world is a daily occurrence. In 2018 we think nothing of ordering a stranger to come and pick us up in a Jersey Lift or allowing people on Instagram to influence our lives, so it makes sense that the dating scene has followed the same patterns.
Match.com started the revolution way back in 1995 and was swiftly followed by a host of copycats. By the mid-2000s there were dating sites available for every imaginable niche. From Christianmingle to VeggieDate and the controversial AshleyMadison promoting ex-marital affairs, singles (and not-so-singles) could seek matches based on their favourite books, preference for beards or unbridled love of Disney.
But even at that stage there remained a stigma attached to the idea of turning to the internet to find love. It was still considered at best a desperate measure, and at worst a sure way to throw yourself in the path of a serial killer. I remember back in 2006 meeting someone through an online forum, and both being slightly cagey when it came to explaining how we met to our families. Somehow saying that we were introduced by mutual friends seemed more legitimate and less likely to invite questions or raised eyebrows than telling the truth.
It wasn't really until the dawn of smartphones and apps that online dating really became something mainstream and socially acceptable.
With an impressive 50 million users worldwide (including 5% of the entire Australian population) it's Tinder that leads the now crowded market-place. Launched in 2012, the app now boasts 1.6 billion 'swipes' each day, resulting in 26 million matches. Simplicity is the key to this popularity; there are no lengthy questionnaires to complete or fancy algorithms employed, swipes right (yes) or left (no) are based purely on first impressions and once a mutual interest has been shown it opens the facility to chat and get to know each other a little better.
Like many things in life, using a dating app here in Jersey is slightly different to how it works in the rest of the world. For starters, depending on your filters, it takes around 10 minutes to swipe through all of the suggested matches before they're exhausted, and no matter how tight your location settings are, expect to see a lot of French profiles. Personally I've done a little swiping in other places (for research purposes only you understand) and it seems to me like the singles in Jersey make significantly less effort with their profiles than those who may be up against more competition elsewhere. On the upside the app becomes useful in a different way in such a small population. It's almost inevitable that you're going to bump into people you've swiped in the real world, and knowing in advance that they're also single and looking makes it a little easier to flash a smile or start a conversation than it might otherwise be.
Although Tinder carries a reputation as a 'hook-up' app, in my experience that doesn't often seem to be the case. Perhaps that is another quirk of island dating life; are we more cautious about making slightly sleazier intentions known, as the luxury of anonymity doesn't apply here?
While there are certainly positives to this method of meeting people becoming main-stream, not least providing a solution for those whose lifestyle or career makes conventional methods tricky, it's important not to ignore the drawbacks. Whilst 80% of users claim to be looking for a long term relationship, with all the compromise we know that involves, the perception that the next match is only a swipe away has a tendency to make people become fickle, thinking nothing of ditching a date and moving on in a constant search of something better, and regardless of the feelings of the person they've rejected. This in turn means dating apps aren't a great place for anyone lacking in self-confidence; it's tough to take when someone you feel like you've been getting on with just disappears without a word.
For better or for worse, with 19% of couples marrying in 2017 reporting that they met online, it seems like the apps are here to stay, and will continue to evolve with technology and ever-changing attitudes. Perhaps in another couple of decades we'll be so accustomed to scoping any potential match out online first that we'll raise eyebrows at the thought of getting together any other way? Watch this space.
#Women #Lifestyle #Dating


The lovely YA Reads is hosting a party for the entire month of June exclusively for 2016 debut authors. How nice of them, right?
Anyhow, I was cordially invited to visit today and my interview is now up on the blog. Come check it out and find out more about me and the upcoming MIDWINTER!! It's coming folks, it's coming.


Important website news. Feel free to reply to announcements & offer suggestions, but announcements made by people other than moderators *MAY* be deleted.
KSRC Sponsors - Get Discounts Here.!
A list of businesses that offer KSRC members a Discount.
Track Days and KSRC members that race, let us know about it here.
This section is for the long distance riders amongst us. Share information about your favourite long distance rides, how you get there in comfort and where to stay!


No I'm not dead and neither is this project! Far from it in fact as Hazaar 2.0 is well under way and full of awesomeness like Multiple Class Inheritance, Real-time signalling, Services and much much more.
So after the release of Hazaar 1.3 I sat down and started to think about what I could do to make Hazaar more than "just another PHP MVC Framework". What I came up with is quite frankly, cutting edge and earth-shatteringly awesome.
Inheritance PHP tried to do this in 5.4 and quite frankly, failed. While traits kinda do what multiple class inheritance is intended for, the main problem is you have to declare a class as a trait, and then you can't use it as a normal class.
With Hazaar's Extender class you can have multiple class inheritance and use it how you want.
Hazaar comes with a new piece of magic, aptly named Warlock. Warlock sits in the background once started and waits for client connections that request to listen for a named signal and then forwards on any signals that have been triggered with that name. What's useful about that? Will, think of building a real-time web-based chat application and you are scratching the surface at what is possible with real-time signalling and Warlock.
Another function of Warlock is it's ability to execute chunks of code in the background. These chunks of code can be defined as a 'service' which Warlock will attempt to keep running for the lifetime of the application. They can also be generated on the fly and executed "at some point in the future", be it "today at 5pm" or "in 35 minutes". Delayed execution is also a great way of "firing and forgetting" function calls that take some time to execute and you would rather return immediately.


text:
Assets & Markets Mutual Funds
How to Invest in Mutual Funds
d3sign / Getty Images
How Mutual Funds Work
Before You Buy a Mutual Fund
Consider the Best Funds for Beginners
Determine Your Investment Objective
Kent Thune
Kent Thune has spent more than two decades in the financial services industry and owns Atlantic Capital Investments, an investment advisory firm, in Hilton Head Island, South Carolina. He's written hundreds of articles for a range of outlets, including The Balance, Kiplinger, Marketwatch, and The Motley Fool.
Gordon Scott
Reviewed by Gordon Scott
Gordon Scott has been an active investor and technical analyst of securities, futures, forex, and penny stocks for 20+ years. He is a member of the Investopedia Financial Review Board and the co-author of Investing to Win. Gordon is a Chartered Market Technician (CMT). He is also a member of CMT Association.
Emily Ernsberger
Fact checked by Emily Ernsberger
Emily Ernsberger is a fact-checker and award-winning former newspaper reporter with experience covering local government and court cases. She also served as an editor for a weekly print publication. Her stint as a legal assistant at a law firm equipped her to track down legal, policy and financial information.
Fortunately, if you want to learn how to invest in mutual funds, there's only a handful of key points to know before you get started. Although mutual funds are used by investment advisors and professional money managers all over the world, mutual funds can be the best investment type for beginners, because they are diversified and straightforward, which means that investors of all kinds can be successful without a lot of skill, time, or money.
When you first look at buying a mutual fund, do your best to relax, save money, and keep your investment strategy simple.
There are several types of funds that are excellent for beginner investors.
The first things to decide on are why you are investing, how much time you need, and your risk tolerance.
A mutual fund is an investment security type that enables investors to pool their money together into one professionally managed investment. Mutual funds can invest in stocks, bonds, cash, or other assets. These underlying security types, called "holdings," combine to form one mutual fund, also called a "portfolio."
Before you choose a mutual fund to purchase, you will need to spend a little time learning the basics and studying a guide of best practices for investing in mutual funds. Success in almost anything and everything you seek to accomplish begins with knowing what to do and knowing what not to do.
Don't stress: Investing with mutual funds is much easier than you think. The hardest part is just taking the first step.
Save money: There are thousands of mutual funds in the universe, but very few allow investors to get started with less than $1,000. However, your options broaden significantly when you have at least $3,000. Try to build your investment funds to at least $1,000 before shopping for mutual funds.
Keep it simple: Don't make things more complex than they need to be. The most experienced (and honest) investors will tell you that you don't need any exotic investments or many mutual funds to be successful.
Choosing the best mutual funds for beginners is not a matter of finding the best performers of the day. Instead, beginners are wise to know their investment objectives and plans and prepare for a long-term strategy.
Buy no-load funds: A no-load fund is a fund that does not charge a load, which can be either a commission (front-load) or a contingent deferred sales charge (CDSC or back-load).
Start with one of the best no-load fund companies: There are numerous good no-load fund companies, but two of the best are Vanguard and Fidelity.
Use one of the discount brokerage firms: Discount brokers like Schwab and TD Ameritrade can be a smart, low-cost way for investors to gain access to thousands of different mutual funds.
Consider S&P 500 index funds: To keep things simple (and assuming you are a long-term investor), you may consider using an S&P 500 index fund that invests in hundreds of the largest companies in the United States. You can always add to your portfolio later for more diversification.
Determine Your Investment Objective and Start Investing
Before you invest, it is smart to know why you're investing. That is called your "investment objective." To discover what your investment objective is, ask yourself the following questions:
What is the purpose of your money?
What do you want it to do?
How much time do you have until you need this money?
How much risk are you willing to take to achieve above-average returns?
Do you want your money to grow, or do you want to preserve its current value?
The answers to these questions will help you arrive at your investment time horizon and risk tolerance, which are the fundamental elements of determining your investment objective.
Once you've taken all of the above steps, you'll contact the mutual fund company of your choice and select your first fund. You can do this easily on the Internet, or you can call a toll-free number and speak to a representative.
If you are not comfortable doing it yourself after taking these steps, look into meeting with an investment advisor.
Investor.gov. "What Are Mutual Funds?" Accessed Dec. 28, 2021.
How To Invest in REITs
What You Need to Know If You Want to Invest in Mutual Funds
How To Invest in Carbon Credits
Beginners Guide to Choosing Mutual Funds
How To Invest in The S&P 500
What Are Mutual Fund Class R Shares?
See the Top Advantages and Benefits of Investing in Mutual Funds
How Much Money Do You Need to Invest in Mutual Funds?
7 Tips for Choosing the Best Mutual Funds
How To Invest in the Dow Jones Industrial Average
Top 5 No-Load Mutual Fund Companies for DIY Investors
How To Invest in Private Companies
8 Tips for Investing in Mutual Funds
Best Investment Apps of 2022
How to Invest in Blockchain


The Israeli company Nano Textile can convert any textile into one with anti-bacterial properties. (Illustrative.) Photo: Edal Anton Leftebov via Wikimedia Commons.
JNS.org – The Israeli company Nano Textile has invented a technology capable of making any fabric capable of killing bacteria. The technology prevents bacteria growth on natural and synthetic fibers, which helps prevent the spread of infections acquired in hospitals and reduces cross-contamination between medical staff and patients.
Developed by Prof. Aharon Gedanken from the Department of Chemistry at Bar Ilan University in Israel and funded by about $17 million from the European Union's FP7 program, the technology works by embedding zinc-oxide (ZnO) nanoparticles into the fabric. ZnO, which has antibacterial properties, is even capable of eradicating antibiotic resistant bacteria such as MRSA. ZnO particles are created inside a solution and transferred onto the fabric through a chemical reaction. The process is cost-effective because it changes the fabric's appearance and still allows the fabric to withstand up to 65 wash cycles at 92 degrees Celsius, and up to 100 wash cycles at 75 degrees Celsius — much higher standards than what are required in medical facilities.
Patented in both the US and Israel, the technology is still awaiting approval in Asia and Europe. The process of making the fabric is outlined in a new article published in the scientific journal Cellulose.
"After establishing proof-of-concept, we are now in the process of raising the necessary capital to begin operations. The potential for our antibacterial fabric technology reaches far beyond medical applications, as it is relevant to a variety of industries such as airplanes, trains and luxury cars in the transportation industry; babywear, sports clothing and undergarments in the clothing industry, restaurants and hotels in the entertainment and tourist industries," said Nano Textile President Lilac Mandeles.


Lily has struggled for years with health issues. Through it all she's always kept an upbeat outlook and sought to help others first. Due to her health and other health issues in the family I had to leave my job to be a full time caregiver. This has put us under financial stress for the past few years, but we've always found a way to make the kids dreams come true on Christmas morning. Due to a LARGE weight loss Lily has started becoming a lot more physically active and has really enjoyed being able to play with her brother and sister more. She definitely has limitations due to weak muscles and balance issues but we find ways around them. This year her siblings have been begging and begging for bikes. The only catch is that Lily can't safely ride a standard bike and we can't afford the "beach bikes" or 3 wheeled versions she needs. We really don't want to make her feel left out or limited with our gift to her siblings. Can you help us to giv e her wheels to join them?
Lydia, your wish is GRANTED! Lily's 3-wheel bike should be at your door within a week.
BIANCA'S KIDS CHRISTMAS WISH GRANTED FOR KAYLA !!
2 brain tumors, severe scoliosis, dysautonomia, fainting, tachycardia, oxygen dependent, Iv, nutrition, hydration and medicines cannot eat or drink from mouth due to aspiration, digestive track paralysis and gastropersis, neuropathy, autoimmune disease, currently undergoing immune-therapy treat/chemo.
My daughter has been wanting an iPad for a while and I know it'll put a HUGE SMILE on her face!! She has lots of movies on iTunes so with an apple iPad she will be able to download and watch her movies & shows anywhere.
Kerri, your wish is granted! A shiny new iPad will be at your door next Wednesday. We know Kayla will be able to enjoy it during treatment and forever.
Bianca's Kids Holiday Wish #3 Granted for Sweet Little Trinity!!!
The Second thing is that she starts school in Feb and as Mum and Dad spend every cent they can get on her Therapy she would just love some assistance with her school uniforms and books as that $300 equates to 1.5 hours therapy for her. While both are vitally important there is only so much to go around and our goal is maximum therapy to get the best possible start to school. She starts school at Grand Avenue State Mainstream School and is determined to join in with all the other Kids.
Brendon, your wish is granted! We are asking our supporters to like & follow Trinity's journey by sharing her page & a check for $200 will be in the mail to you this week to help with uniforms.


Working for a global manufacturer in the engineering industry, this opportunity as site Financial Controller, brings a fantastic opportunity to blend technical and commercial skills to impact operational output and profitability.
Managing a small team of 3, you will be responsible for ensuring timely and robust financial controls and reporting. Supporting the manufacturing operation, you will drive their budgeting and forecasting process and reporting into the Site Manager, you will initiate and provide commentary on KPI, performance, profitability reporting and cost accounting.
A qualified accountant (preferably CIMA), you will have had extensive experience in the manufacturing sector. Conversant on SAP, you will have excellent stakeholder management skills, enjoy people leadership and will have the commercial flair to support decisions on cost and operational delivery on the site.


A Licensed Nursing Assistant (or CNA) is one who takes care of patients in the hospitals and clinics underneath the supervision of Registered Nurse. Denver Public Health is main the way in which in creating "upstream" prevention efforts by participating group members and youth in all phases of its prevention work. Provides all beneficial immunizations for children (birth by 18 years of age or until commencement from highschool), select grownup immunizations and most travel immunizations.
The President of the United States, with the assistance of the Department of Well being and Human Companies, is now launching a marketing campaign referred to as "Small Steps." This program's goal is to help Individuals by making 3 small decisions about their health to get huge outcomes, as a substitute of making a drastic lifestyle change.
Each municipality in New Jersey is required by legislation (N.J.S.A. 26:3-1) to have a Board of Health responsible for enacting ordinances and making rules and rules within the curiosity of defending and improving the general public well being of the group.
They want to be certain that the business is correctly sanitized, the workers are educated appropriately, food is being ready properly, and that there aren't any considerations for the well being of the individuals that eat in the business. Public well being education not solely offers with the right way to prevent diseases, it additionally provides details of how a disease works, which may dispel some myths and fallacies about it in society.
Many instances, one might want to investigate various establishments that provide care to individuals. Although we're made to consider that the worth of an individual's liberty could also be extra important than the interest of the general public health, and safety, this solely applies to the sure points however not in all conditions.
Vasectomy clinics in the United States are performing a easy male sterilization micro surgery referred to as a vasectomy. Our scientific care groups embrace well being care professionals comparable to a medical supplier, dentist, nurse, medical assistant, medical pharmacist, and different well being professionals as needed to meet YOUR specific needs and circumstances.
Though no federal assist program presently exists to help RHCs in gaining recognition as a PCMH, they are eligible to do so. The PCMH model of care usually requires that a patient have a seamless relationship with a healthcare group that coordinates affected person care to enhance entry, high quality, efficiency, and patient satisfaction.
Other services out there to our present sufferers embody different birth control methods equivalent to prescriptions for birth control tablets, pap smear checks, and sexually transmitted an infection tests together with HIV testing Please be aware – because of the high demand for appointments, presently we are solely taking new patients for abortion, miscarriage administration , and IUD services.
The mission of the Student Health Service is to offer access to high quality healthcare whereas promoting overall scholar properly-being. We provide medical companies to all sufferers no matter their means to pay. All worldwide college students are required to schedule an "International Student Screening" appointment with Pupil Health Service.


 Orthopaedic implant materials must combine high strength, corrosion resistance and tissue compatibility. The longevity of the implant is of prime importance especially if the recipient of the implant is relatively young because it is desirable that the implant function for the complete lifetime of a patient. Of the conventional materials typically used to fabricate orthopaedic implants, each has its comparative advantages and disadvantages. In the case of metallic materials, because certain metal alloys have the required mechanical strength and biocompatibility without a high risk of brittle fracture, they are ideal candidates for the fabrication of prostheses. These alloys include 316L stainless steel, chrome-cobalt-molybdenum alloys and, more recently, titanium alloys which have proven to be the most suitable materials for the fabrication of load-bearing prostheses.
6 PCT/US2005/032919 the body. Body fluids act upon the metals causing them to slowly corrode by an ionizing process that thereby releases metal ions into the body. Metal ion release from the prosthesis is also related to the rate of wear of load bearing surfaces because the passive oxide film, which is formed on the surface, is constantly removed. The repassivation process constantly releases metal ions during the ionizing process. Furthermore, the presence of thiid-body wear (cement or bone debris) accelerates this process and microfretted metal particles increase friction against opposing surfaces. Surface hardness is not ideal in most metallic materials, resulting in scratching and microfretting. Other common materials have, other advantages and disadvantages. Ceramics, for examples, have very hard surfaces which resist scratching and microfretting, however, they are more brittle than metals and generally have inferior thermal properties.
[00061 In addition, the application of ceramic coating to metal substrates often results in non-uniform, poorly adhering coatings which tend to crack due to the differences in elastic modulus or thermal expansion between the ceramic and underlying metal substrate.
Furthermore, such coatings tend to be relatively thick (50-300 microns) and since the bond between the metal and the ceramic coating is often weak, there is the risk of galling or separation of ceramic coatings.
 The use of oxidized zirconium surfaces in orthopaedic implants represented an advance in that it allowed one to realize the advantages of metallic materials and ceramics while minimizing the disadvantages of both. Previous attempts have been made to produce oxidized zirconium coatings on zirconium parts for the purpose of increasing their abrasion resistance. One such process is disclosed in U.S.
3,615,885 to Watson which discloses a procedure for developing thick (up to 0.23 mm) oxide layers on various zirconium alloys. However, this procedure results in significant dimensional changes especially for parts having a thickness below about 5 mm, and the oxide film produced does not exhibit especially high abrasion resistance.
 U.S. Patent No. 2,987,352 to Watson discloses a method of producing a blue-black oxide coating on zirconium alloy parts for the purpose of increasing their abrasion resistance. Both U.S. Patent 2,987,352 and U.S. Patent 3,615,885 produce an oxidized zirconium coating on zirconium alloy by means of air oxidation. U.S.
Patent 3,615,885 continues the air oxidation long enough to produce a beige coating of greater thickness than the blue-black coating of U.S. Patent No. 2,987,352. This beige coating does not have the wear resistance of the blue-black coating and is thus not applicable to many parts where there are two work faces in close proximity. The beige coating wears down more quickly than the blue-black oxide coating with the resulting formation of oxidized zirconium particles and the loss of the integrity of the oxidized zirconium surface. With the loss of the oxide surface the zirconium metal is then exposed to its environment and can lead to transport of zirconium joints away from the surface of the metal into the adjacent environment.
 The blue-black coatings have a thickness which is less than that of the beige coating although the hardness of the blue-black or black coating is higher than that of the beige coating. This harder blue-black oxide coating lends itself better to surfaces such as prosthetic devices. Although the blue-black or black coating is more abrasion resistant than the beige coating it is a relatively thin coating. It is therefore desirable to produce the blue-black coatings of increased abrasion resistance without producing the same type coatings of the prior art.
 U.S. Patent 5,037,438 to Davidson discloses a method of producing zirconium alloy prostheses with a oxidized zirconium surface. This specific form of oxidized zirconium, described therein as blue-black or black oxidized zirconium is unique with respect to the excellent thermal conductivity it possesses relative to other conventional prosthetic materials. It combines excellent surface roughness characteristics with very high thermal conductivity. In this way, it possesses the relevant beneficial characteristics of metal and ceramics while avoiding the relevant disadvantages of the former and outperforming the latter.
 In U.S. Patent 6,447,550, Hunter, et al. described a method for obtaining an oxidized zirconium coating of uniform thickness. Hunter taught that such is obtained by applying pre-oxidation treatment techniques to various zirconium-based materials that result in a refined microstructure and an altered surface roughness. Microstructure refinement is taught in the '550 patent by techniques which include the hot forge conversion of ingot to wrought barstock, closed die forging, rapid solidification, and powder consolidation. The altered surface roughness is accomplished by processes such as grinding, buffing, mass finishing, vibratory finishing, among others.
 Hunter, et al., in U.S. Patent 6,585,772, provide another method for forming a uniformly thick oxide coating on zirconium or a zirconium alloy. In the method of the '772 patent, Hunter teaches that by inducing an altered surface roughness on a single phase/single composition zirconium based substrate prior to oxidation, control and improvement of the thickness uniformity of the resulting oxidized zirconium layer can be realized. The '772 patent also provides a method for forming a uniformly thick oxide coating on a zirconium or zirconium alloy prosthesis, for implantation in a patient, by inducing an altered surface roughness on at least a portion of the zirconium or zirconium alloy prosthesis, wherein the zirconium or oxidized zirconium consists, at least in part, of a single phase crystalline structure and uniform composition, prior to oxidizing the prosthesis to form a blue-black oxidized zirconium coating of uniform and controlled thickness on at least a portion of the surface of the prosthesis.
 While both of these techniques of Hunter proved useful in promoting thickness uniformity, the present invention provides yet another distinct method to accomplish the same result. In the present invention, a uniform thickness layer of oxidized zirconium is accomplished using an amorphous zirconium-containing alloy. This represents another technique to produce a surface layer of oxidized zirconium having improved uniformity of thickness and provides another tool in the arsenal of one wishing to fabricate improved medical devices having oxidized zirconium surfaces.
 In another embodiment of the present invention, there is a medical implant characterized by at least one component, said component comprising a substrate comprising zirconium having an amorphous structure or a zirconium alloy having an amorphous structure; a surface layer of blue-black or black oxidized zirconium on at least a portion of said substrate, said surface layer of oxidized zirconium being formed by oxidation of said zirconium or zirconium alloy. In some embodiments, the zirconium or zirconium alloy comprises an altered surface roughness prior to said oxidation. In some embodiments, the altered surface roughness comprises a surface roughness (Ra) in the range of about 3 microinches to about 25 microinches. In some embodiments, the altered surface roughness comprises a surface roughness (Ra) in the range of about 3.5 microinches to about 7 microinches. In some embodiments, the layer of oxidized zirconium is of a thickness of up to about 20 microns. In some embodiments, the layer of oxidized zirconium coating is of a thickness of up to about 10 microns. In some embodiments, the implant portion of the prosthesis body further comprises an irregular surface adapted to accommodate tissue ingrowth on a portion of the prosthesis body. In some embodiments having an irregular surface, the irregular surface is formed of zirconium or zirconium alloy beads attached to the outer surface of the prosthesis body, wherein at least a portion of the surface of the beads is oxidized to blue-black or black oxidized ,zirconium. In some embodiments having an irregular surface, the irregular surface structure is formed of zirconium or zirconium alloy wire mesh connected to the outer surface of the prosthesis body, wherein at least a portion of the surface of the mesh is oxidized to blue-black or black oxidized zirconium.
In some embodiments having an irregular surface, the irregular surface is a chemically etched surface. In some embodiments having an irregular surface, the irregular surface is plasma spray-deposited surface. In some embodiments having an irregular surface, the irregular surface is a sintered surface. In some embodiments, the medical implant is a vertebral implant. In some embodiments, the medical implant is a dental implant. In some embodiments, the medical implant comprises bone implant hardware. In some embodiments wherein the medical implant comprises bone implant hardware, the bone implant hardware comprises a bone plate or a bone screw.
 FIG. 1 is a schematic diagram depicting a hip joint prosthesis in position.
 FIG. 2 is a schematic diagram showing a typical hip join prosthesis.
 FIG. 3 is a schematic diagram of a knee joint prosthesis in place.
 FIG. 4 is a schematic diagram of the parts of a typical knee joint.
 FIG. 5 shows a sample of zirconium alloy mounted on Bakelite after oxidation for 1 hour at 630 C.
 FIG. 6 shows a sample mounted on Bakelite after oxidation for 3 hours at 630 'C.
 As used herein, "a" or "an" may mean one or more. As used herein in the claim(s), when used in conjunction with the word "comprising", the words "a"
or "an" may mean one or more than one. As used herein, "another" may mean at least a second or more.
 The following discussion contains illustrations and examples of preferred embodiments for practicing the present invention. However, they are not limiting examples.
Other examples and methods are possible in practicing the present invention.
10031] A typical hip joint assembly is shown in situ in FIG. 1. FIG. 2 illustrates a typical hip prosthesis prior to implantation, providing details of the individual components.
The hip joint stem 2 fits into the femur while the femoral head 6 of the prosthesis fits into and articulates against the inner lining 8 of an acetabular cup 10 which in turn is affixed to the pelvis as shown in FIG. 1. A porous metal bead or wire mesh coating 12 may be incorporated to allow stabilization of the implant by ingrowth of surrounding tissue into the porous coating. Similarly, such a porous metal bead or wire mesh coating can also be applied to the acetabular component. The femoral head 6 may be an integral part of the hip joint stem 2 or may be a separate component mounted upon a conical taper at the end of the neck 4 of the hip joint prosthesis. This allows the fabrication of a prosthesis having a metallic stem and neck but a femoral head of some other material, such as ceramic. This method of construction is often desirable because ceramics have been found to generate less frictional torque and wear when articulating against UHMWPE, the typical lining of the acetabular cup. Additionally, zirconia ceramic has been shown to produce less wear of the UHMWPE than alumina. Regardless of the materials, however, the femoral head articulates against the inner surface of the acetabular cup thereby causing wear and, in the long term, this may necessitate prosthesis replacement. This is especially the case where the femoral head is of metal and the acetabular cup is lined with an organic polymer or composite thereof. While these polymeric surfaces provide good, relatively low friction surfaces and are biocompatible, they are subject to wear and accelerated creep due to the frictional heat and torque to which they are subjected during ordinary use.
 While UHMWPE that has been cross-linked through irradiation followed by a heating step has been shown to exhibit greater wear resistance, it has similar shortcomings. A typical knee joint prosthesis is shown in situ in FIG. 3. FIG.
4 illustrates a typical knee prosthesis prior to implantation, providing details of the individual components.
The knee joint includes a femoral component 20 and a tibial component 30. The femoral component includes condyles 22 which provide the articulating surface of the femoral component and pegs 24 for affixing the femoral component to the femur. The tibial component 30 includes a tibial base 32 with a peg 34 for mounting the tibial base onto the tibia. A tibia platform 36 is mounted atop the tibial base 32 and is supplied with grooves 38 similar to the shape of the condyles 22. The bottom surfaces of the condyles 26 contact the tibial platform's grooves 38 so that the condyles articulate within these grooves against the tibial platform. While condyles are typically fabricated of metals, the tibial platform may be made from an organic polymer or a polymer-based composite. Thus, the hard metallic condyle surfaces 26 would articulate against a relatively softer organic composition. This may result in wear of the organic material, i.e. the tibial platform, necessitating the replacement of the prosthesis. As in the case of the hip joint, porous bead or wire mesh coatings can also be applied to either the tibial or femoral components of the knee or both.
100331 The invention provides uniformly thick oxidized zirconium coated orthopedic implants or prostheses fabricated of zirconium or zirconium containing metal alloys or a thin coating of zirconium or zirconium alloy on conventional orthopedic implant materials. Uniformity of thickness is desirable to insure that the characteristics and properties of the layer of oxidized zirconium are relatively constant over the surface of the prosthetic device. In order to form continuous and useful oxidized zirconium coatings of uniform thickness over the desired surface of the metal alloy prosthesis substrate, the metal alloy preferably contains from about 80 to about 100 wt% zirconium, preferably from about 94 to about 100 wt%. Oxygen, and other common alloying elements may be used in the alloy. For example, in one preferred embodiment, the zirconium or zirconium alloy is about 0.3 % by weight of oxygen.
100341 Although not wishing to be bound to theory, it is believed that an amorphous zirconium or zirconium alloy is useful in the present invention because the lack of crystallinity necessarily eliminates grain boundaries in the material. The simplest repeating unit in a crystalline material is the unit cell. Unit cell crystals form colonies (dendrites). As solidification nears completion, the dendrites contact one another. These area of contacts are grain boundaries. In the oxidative process that forms the oxidized zirconium coating, the rate of oxidation is modified at grain boundaries relative to the rate in the bulk of the material. Eliminating or minimizing grain boundaries thereby minimizes channeling of oxidation through grain boundaries, resulting in non-uniformity of thickness of the resulting layer of oxidized zirconium. Optionally, altering the surface roughness of the amorphous zirconium or zirconium alloy serves to further enhance thickness uniformity and, as a result, oxide integrity. Again not wishing to be bound by theory, it is believed that roughening the surface to the values described herein increases the number of initiation sites for oxidation, resulting in uniform growth of the oxidation layer inward toward the substrate.
 The air, steam and water oxidation processes are described in now-expired U.S. Patent 2,987,352 to Watson. The oxidation process applied to an amorphous zirconium or zirconium alloy, preferably having an altered surface roughness, provides a firmly adherent black or blue-black layer of uniformly thick oxidized zirconium. If the oxidation is continued to excess, the coating will whiten and separate from the metal substrate. For convenience, the metal prosthesis substrate may be placed in a furnace having an oxygen-containing atmosphere (such as air) and typically heated at 9000 -1300 F for up to about 6 hours. However, other combinations of temperature and time are possible. When higher temperatures are employed, the oxidation time should be reduced to avoid the formation of the white oxide.
 One of the salt-bath methods that can be used to apply the oxidized zirconium coatings to the metal alloy prosthesis, is the method of U.S. Patent 4,671,824 to Haygarth. The salt-bath method provides a similar, slightly more abrasion resistant blue-black or black oxidized zirconium coating. This method requires the presence of an oxidation compound capable of oxidizing zirconium in a molten salt bath. The molten salts include chlorides, nitrates, cyanides, and the like. The oxidation compound, sodium carbonate, is present in small quantities, up to about 5 wt%. The addition of sodium carbonate lowers the melting point of the salt. As in air oxidation, the rate of oxidation is proportional to the temperature of the molten salt bath and the '824 patent prefers the range of 5500 - 800 C (1022 - 1470 F). However, the lower oxygen levels in the bath produce thinner coatings than for furnace air oxidation at the same time and temperature. A salt bath treatment at 1290 F for four hours produces an oxide coating thickness of roughly 7 microns.
 The overall thickness of the oxidized zirconium coating is primarily controlled by the variables of time and temperature of the in-situ growth process. The instant invention is concerned with the uniformity of thickness of the coating so created.
Creation of a uniform oxide coating during the oxidation process, by the here claimed method, is dependent on both a surface with appropriate altered surface roughness and amorphous composition. The oxide coating initiates and grows from surface asperities, so the oxide initiation sites may be spaced too far apart to produce a uniform coating thickness on a surface that is too smooth. The oxide layer grows by oxygen diffusion along grain boundaries and through microstructural grains. The oxidation rate can be different in grains of different structure and composition. Thus, the oxide coating may not grow with a uniform thickness through a heterogeneous microstructure. Although, specific limits for the necessary minimum surface roughness can be alloy and application dependent, sufficient phase homogeneity may be achieved through the use of an amorphous zirconium metal or amorphous zirconium alloy.
 The uniformly thick oxidized zirconium coating may range up to about 20 microns. It is preferred that a uniformly thick blue-black oxidized zirconium layer ranging in thickness from about 1 to about 10 microns should be formed. It is most preferred that the uniformly thick oxidized zirconium layer range from about 3 microns to about 7 microns.
zirconium with a surface roughness (Ra) of about 4 microinches. Longer oxidation times and higher oxidation temperatures will increase this thickness, but may compromise coating integrity.
Thicknesses of up to 20 microns or greater can be achieved under appropriate conditions.
For example, one hour at 1300 F will form an oxide coating thickness of about 9 microns.
Of course, because only a thin oxide is necessary on the surface, only very small dimensional changes, typically less than 10 microns over the thickness of the prosthesis, will result. In general, thinner coatings (1-10 microns) have better attachment strength.
However, depending upon the application coatings of greater thickness may be used.
 Blue-black or black oxidized zirconium coatings produced by any of the prior art methods are quite similar in hardness. For example, if the surface of a wrought zirconium alloy prosthesis substrate is oxidized, the hardness of the surface shows a dramatic increase over the 200 Knoop hardness of the original metal surface.
The surface hardness of the blue-black oxidized zirconium surface following oxidation by either salt bath or air oxidation process is approximately 1200 - 1700 Knoop hardness.
 In the medical implants fabricated using the invention described herein, it is sometimes desirable to have a textured surface to promote bone in-growth and on-growth.
A number of techniques, known to those of ordinary skill in the art may be combined with the teachings of the present invention to fabricate such medical implants.
Zirconium or zirconium alloy can also be used to provide a porous bead or wire mesh surface to which surrounding bone or other tissue may integrate to stabilize the prosthesis.
These porous coatings can be treated simultaneously by the oxidation of the base prosthesis for the elimination or reduction of metal ion release. Furthermore, zirconium or zirconium alloy can also be used as a surface layer applied over conventional implant materials prior to inducing an altered surface roughness, in situ oxidation and formation of the uniform oxidized zirconium coating. Other applicable means to achieve a textured surface, also known to those of ordinary skill in the art include chemical etching, various deposition methods such as chemical vapor deposition, plasma-spray deposition, etc., as well as others.
 The process of the present invention, by oxidizing an amorphous zirconium or zirconium alloy, preferably following a step of inducing an altered surface roughness on the amorphous zirconium or zirconium alloy, results in the formation of a blue-black oxidized zirconium coating of uniform thickness, the depth of which can be controlled by the proper choice of the oxidation conditions. The formation of a uniformly thick oxide coating provides an oxide coating of variable and controlled thickness with especially high abrasion resistance and reduced wear due to high integrity of the adhesion between the oxide layer and the underlying zirconium or zirconium alloy and the high integrity of the adhesion within the oxide layer. The term "high integrity"
denotes an oxide coating that is uniform in thickness with no visible cracks or pores when viewed in cross-section by optical microscopy.
 The invention provides an amorphous zirconium or zirconium-containing metal alloy prosthesis coated via in situ oxidation with a coating of oxidized zirconium of uniform thickness. The uniformly thick oxidized zirconium coating provides the invention prosthesis with a thin, dense, low friction, high integrity, wear resistant biocompatible surface ideally suited for use on articulating surfaces of joint prosthesis wherein a surface or surfaces of the joint articulates, translates or rotates against mating joint surfaces. The uniformly thick oxidized zirconium coating may therefore be usefully employed in joint prostheses such as on the femoral heads or inside surfaces of acetabular cups of hip-joint implants or on the articulating surfaces of other types of prostheses, such as knee joints.
Generally, such implants can be described as multi-component prostheses comprising a first component having a bearing surface and a second component having a counter-bearing surface, where at least one of the components comprises zirconium or a zirconium alloy having an amorphous structure and where a surface layer of blue-black or black oxidized zirconium exists on at least a portion of a component comprising zirconium or a zirconium alloy, the surface layer of oxidized zirconium being formed by oxidation of said zirconium or zirconium alloy. Alternatively, other implants amenable to the present invention are those having at least one component having a substrate comprising amorphous zirconium or an amorphous zirconium alloy; a surface layer of blue-black or black oxidized zirconium on at least a portion of the substrate; the surface layer of oxidized zirconium being formed by oxidation of the zirconium or zirconium alloy. The present invention is applicable to any prostheses, including shoulder, ankle, finger, wrist, toe, elbow, or other prostheses. Other possible applications include maxillofacial or temporomandibular implants.
Other implants such as dental and vertebral implants could be fabricated with uniform thickness oxidized zirconium surfaces according to the present invention. It is also applicable to implant hardware, such as bone plates and bone screws. Other possibilities are clear to one of ordinary skill in the art.
 The usefulness of oxidized zirconium coated prosthesis is not limited to load bearing prostheses, especially joints, where a high rate of wear may be encountered.
Other applications are possible in non-articulating implant devices such as bone plates, bone screws, etc. Because the uniformly thick oxidized zirconium coating is firmly bonded to the zirconium alloy prosthesis substrate, it provides an enhanced barrier between the body fluids and the zirconium alloy metal thereby preventing the corrosion of the alloy by the process of ionization and its associated metal ion release compared to non-uniform oxide coatings.
 Additionally, the natural in situ formation of a uniformly thick oxidized zirconium coating from the presence of zirconium in the substrate metal involves oxygen diffusion into the metal substrate below the oxide coating. Oxygen, an alloying constituent in zirconium, increases the strength of the metal substrate, particularly the fatigue strength.
A preferred embodiment is one having a zirconium or zirconium alloy with an oxygen content of about 0.3% (w/w). Furthermore, the high integrity of the uniformly thick coating reduces the number of fatigue crack initiation sits relative to a non-uniformly thick oxide coating that contains cracks or pores. Resistance to fatigue loading is paramount in many orthopedic implant applications such as the hip stem, and femoral and tibial knee components. Thus, not only does the formation of the uniformly thick oxidized zirconium coating improve wear, fiction, and corrosion resistance, it also improves the mechanical integrity of the implant device from a strength standpoint.
 An amorphous alloy of Zr-Ti-Cu-Ni-Be with Zr as the major alloying constituent (55%) demonstrates the usefulness of the present invention.
Samples were oxidized at 630 C for 1 and 3 hours. The thickness of the oxidized zirconium layer was measured by preparing the sample for metallographic inspection. The metallographic images of the oxidized samples are shown in FIGS. 5 (1 hour oxidation) and 6 (3 hour oxidation). The average oxide thickness ( standard deviation) after 1 hour of oxidation was 1.5 0.4 gm whereas after 3 hours it was 8.9 0.7 inn. FIG. 5 shows a cracked sample of zirconium alloy mounted on Bakelite after oxidation for 1 hour at 630 C. FIG.
6 shows a sample mounted on Bakelite after oxidation for 3 hours at 630 C. In each case, the zirconium-based amorphous alloy substrate material is shown with an oxidized zirconium layer. The thickness of the layer formed after 1 hour of oxidation had a coefficient of variation of 26.6%, while the thickness of the layer formed after 3 hours of oxidation had a coefficient of variation of 7.9%. The energy dispersive x-ray analysis of the oxide surface showed that it is mainly composed of oxidized zirconium.
 Although the invention has been described with reference to its preferred embodiments, those of ordinary skill in the art many, upon reading this disclosure, appreciate changes and modifications which may be made and which do not depart from the scope of the invention as described above or claimed hereafter.
 All patents and publications mentioned in the specification are indicative of the level of those skilled in the art to which the invention pertains.
 One skilled in the art readily appreciates that the present invention is well adapted to carry out the objectives and obtain the ends and advantages mentioned as well as those inherent therein. Systems, methods, procedures and techniques described herein are presently representative of the preferred embodiments and are intended to be exemplary and are not intended as limitations of the scope. Changes therein and other uses will occur to those skilled in the art which are encompassed within the scope of the invention or defined by the scope of the claims.
1. A method of producing a uniform coating of blue-black or black oxidized zirconium on zirconium or a zirconium alloy, comprising the steps of providing an amorphous zirconium or zirconium alloy substrate, and oxidizing said zirconium or zirconium alloy substrate to form a diffusion-bonded coating of blue-black or black oxidized zirconium.
a step selected from the group consisting of grinding, buffing, mass finishing, vibratory finishing, and any combination thereof.
6. The method according to any one of claims 1 to 5, wherein said step of oxidizing comprises the use of air as an oxidant.
7. The method according to any one of claims 1 to 5, wherein said step of oxidizing comprises the use of oxygen as an oxidant.
8. The method according to any one of claims 1 to 7, wherein said zirconium or zirconium alloy comprises about 0.3 percent oxygen by weight, after said step of oxidizing.
a substrate comprising zirconium having an amorphous structure or a zirconium alloy having an amorphous structure; and a surface layer of blue-black or black oxidized zirconium on at least a portion of said substrate, said surface layer of oxidized zirconium being formed by oxidation of said zirconium or zirconium alloy.
10. The medical implant according to claim 9, wherein said substrate comprises an altered surface roughness prior to said oxidation.
11. The medical implant according to claim 10, wherein said altered surface roughness comprises a surface roughness (R a) in the range of about 3 microinches to about 25 microinches.
12. The medical implant according to claim 10, wherein said altered surface roughness comprises a surface roughness (R a) in the range of about 3.5 microinches to about 7 microinches.
13. The medical implant according to any one of claims 9 to 12, wherein said medical implant is a vertebral implant.
14. The medical implant according to any one of claims 9 to 12, wherein said medical implant is a dental implant.
15. The medical implant according to any one of claims 9 to 12, wherein said medical implant comprises bone implant hardware.
16. The medical implant according to claim 15, wherein said bone implant hardware comprises a bone plate or a bone screw.
wherein at least one of said first component and said second component comprises zirconium having an amorphous structure or a zirconium alloy having an amorphous structure; and a surface layer of blue-black or black oxidized zirconium on at least a portion of said at least one of said first component and said second component comprising the zirconium or the zirconium alloy, said surface layer of oxidized zirconium being formed by oxidation of said zirconium or zirconium alloy.
18. The medical implant according to claim 17, wherein said medical implant is a joint prosthesis .
19. The medical implant according to claim 18, wherein said first component comprises a femoral component and said second component comprises an acetabular cup component to form a hip prosthesis.
20. The medical implant according to claim 18, wherein said first component comprises a femoral component which further comprises at least one condyle and said second component comprises a tibial component to form a knee prosthesis.
21. The medical implant according to claim 18, wherein said joint prosthesis is selected from the group consisting of shoulder, ankle, finger, wrist, toe, and elbow prostheses.
22. The medical implant according to claim 17, wherein said medical implant is a maxillofacial or temporomandibular implant.
23. The medical implant according to any one of claims 9 to 22, wherein said layer of oxidized zirconium is of a thickness of up to about 20 microns.
24. The medical implant according to any one of claims 9 to 22, wherein said layer of oxidized zirconium coating is of a thickness of up to about 10 microns.
25. The medical implant according to any one of claims 9 to 16, wherein the at least one component comprises a prosthesis body haying an implant portion that further comprises an irregular surface adapted to accommodate tissue ingrowth on a portion of the prosthesis body.
26. The medical implant according to any one of claims 17 to 24, wherein the at least one of said first component and said second component comprises a prosthesis body haying an implant portion that further comprises an irregular surface adapted to accommodate tissue ingrowth on a portion of the prosthesis body.
27. The medical implant according to claim 25 or 26, wherein the irregular surface is formed of zirconium or zirconium alloy beads attached to the outer surface of the prosthesis body, wherein at least a portion of the surface of the beads is oxidized to form the surface layer of blue-black or black oxidized zirconium.
28. The medical implant according to claim 25 or 26, wherein the irregular surface structure is formed of zirconium or zirconium alloy wire mesh connected to the outer surface of the prosthesis body, wherein at least a portion of the surface of the mesh is oxidized to form the surface layer of blue-black or black oxidized zirconium.
29. The medical implant according to claim 25 or 26, wherein the irregular surface is a chemically etched surface.
30. The medical implant according to claim 25 or 26, wherein the irregular surface is plasma spray-deposited surface.
31. The medical implant according to claim 25 or 26, wherein the irregular surface is a sintered surface.


text:
package tests

import (
	"context"
	"net/http"
	"os"
	"sync"
	"time"

	"github.com/coreos/go-semver/semver"
	"github.com/pingcap/check"
	"github.com/pingcap/errors"
	"github.com/pingcap/kvproto/pkg/metapb"
	"github.com/pingcap/kvproto/pkg/pdpb"
	"github.com/pingcap/log"
	"github.com/tikv/pd/pkg/autoscaling"
	"github.com/tikv/pd/pkg/dashboard"
	"github.com/tikv/pd/pkg/errs"
	"github.com/tikv/pd/pkg/swaggerserver"
	"github.com/tikv/pd/pkg/testutil"
	"github.com/tikv/pd/server"
	"github.com/tikv/pd/server/api"
	"github.com/tikv/pd/server/cluster"
	"github.com/tikv/pd/server/config"
	"github.com/tikv/pd/server/core"
	"github.com/tikv/pd/server/id"
	"github.com/tikv/pd/server/join"
	"github.com/tikv/pd/server/tso"
	"go.etcd.io/etcd/clientv3"
)

// TestServer states.
const (
	Initial int32 = iota
	Running
	Stop
	Destroy
)

var (
	// WaitLeaderReturnDelay represents the time interval of WaitLeader sleep before returning.
	WaitLeaderReturnDelay = 20 * time.Millisecond
	// WaitLeaderCheckInterval represents the time interval of WaitLeader running check.
	WaitLeaderCheckInterval = 500 * time.Millisecond
)

// TestServer is only for test.
type TestServer struct {
	sync.RWMutex
	server     *server.Server
	grpcServer *server.GrpcServer
	state      int32
}

var zapLogOnce sync.Once

// NewTestServer creates a new TestServer.
func NewTestServer(ctx context.Context, cfg *config.Config) (*TestServer, error) {
	err := cfg.SetupLogger()
	if err != nil {
		return nil, err
	}
	zapLogOnce.Do(func() {
		log.ReplaceGlobals(cfg.GetZapLogger(), cfg.GetZapLogProperties())
	})
	err = join.PrepareJoinCluster(cfg)
	if err != nil {
		return nil, err
	}
	serviceBuilders := []server.HandlerBuilder{api.NewHandler, swaggerserver.NewHandler, autoscaling.NewHandler}
	serviceBuilders = append(serviceBuilders, dashboard.GetServiceBuilders()...)
	svr, err := server.CreateServer(ctx, cfg, serviceBuilders...)
	if err != nil {
		return nil, err
	}
	return &TestServer{
		server:     svr,
		grpcServer: &server.GrpcServer{Server: svr},
		state:      Initial,
	}, nil
}

// Run starts to run a TestServer.
func (s *TestServer) Run() error {
	s.Lock()
	defer s.Unlock()
	if s.state != Initial && s.state != Stop {
		return errors.Errorf("server(state%d) cannot run", s.state)
	}
	if err := s.server.Run(); err != nil {
		return err
	}
	s.state = Running
	return nil
}

// Stop is used to stop a TestServer.
func (s *TestServer) Stop() error {
	s.Lock()
	defer s.Unlock()
	if s.state != Running {
		return errors.Errorf("server(state%d) cannot stop", s.state)
	}
	s.server.Close()
	s.state = Stop
	return nil
}

// Destroy is used to destroy a TestServer.
func (s *TestServer) Destroy() error {
	s.Lock()
	defer s.Unlock()
	if s.state == Running {
		s.server.Close()
	}
	if err := os.RemoveAll(s.server.GetConfig().DataDir); err != nil {
		return err
	}
	s.state = Destroy
	return nil
}

// ResignLeader resigns the leader of the server.
func (s *TestServer) ResignLeader() error {
	s.Lock()
	defer s.Unlock()
	s.server.GetMember().ResetLeader()
	return s.server.GetMember().ResignEtcdLeader(s.server.Context(), s.server.Name(), "")
}

// State returns the current TestServer's state.
func (s *TestServer) State() int32 {
	s.RLock()
	defer s.RUnlock()
	return s.state
}

// GetConfig returns the current TestServer's configuration.
func (s *TestServer) GetConfig() *config.Config {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetConfig()
}

// GetPersistOptions returns the current TestServer's schedule option.
func (s *TestServer) GetPersistOptions() *config.PersistOptions {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetPersistOptions()
}

// GetAllocator returns the current TestServer's ID allocator.
func (s *TestServer) GetAllocator() id.Allocator {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetAllocator()
}

// GetAddr returns the address of TestCluster.
func (s *TestServer) GetAddr() string {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetAddr()
}

// GetServer returns the real server of TestServer.
func (s *TestServer) GetServer() *server.Server {
	s.RLock()
	defer s.RUnlock()
	return s.server
}

// GetClusterID returns the cluster ID.
func (s *TestServer) GetClusterID() uint64 {
	s.RLock()
	defer s.RUnlock()
	return s.server.ClusterID()
}

// GetLeader returns current leader of PD cluster.
func (s *TestServer) GetLeader() *pdpb.Member {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetLeader()
}

// GetAllocatorLeader returns current allocator leader
// of PD cluster for given dc-location.
func (s *TestServer) GetAllocatorLeader(dcLocation string) *pdpb.Member {
	// For the leader of Global TSO Allocator, it's the PD leader
	if dcLocation == tso.GlobalDCLocation {
		return s.GetLeader()
	}
	tsoAllocatorManager := s.GetTSOAllocatorManager()
	allocator, err := tsoAllocatorManager.GetAllocator(dcLocation)
	if err != nil {
		return nil
	}
	return allocator.(*tso.LocalTSOAllocator).GetAllocatorLeader()
}

// GetCluster returns PD cluster.
func (s *TestServer) GetCluster() *metapb.Cluster {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetCluster()
}

// GetClusterVersion returns PD cluster version.
func (s *TestServer) GetClusterVersion() semver.Version {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetClusterVersion()
}

// GetServerID returns the unique etcd ID for this server in etcd cluster.
func (s *TestServer) GetServerID() uint64 {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetMember().ID()
}

// IsLeader returns whether the server is leader or not.
func (s *TestServer) IsLeader() bool {
	s.RLock()
	defer s.RUnlock()
	return !s.server.IsClosed() && s.server.GetMember().IsLeader()
}

// IsAllocatorLeader returns whether the server is a TSO Allocator leader or not.
func (s *TestServer) IsAllocatorLeader(dcLocation string) bool {
	if dcLocation == tso.GlobalDCLocation {
		return s.IsLeader()
	}
	tsoAllocatorManager := s.GetTSOAllocatorManager()
	allocator, err := tsoAllocatorManager.GetAllocator(dcLocation)
	if err != nil {
		return false
	}
	return !s.server.IsClosed() && allocator.(*tso.LocalTSOAllocator).IsAllocatorLeader()
}

// GetEtcdLeader returns the builtin etcd leader.
func (s *TestServer) GetEtcdLeader() (string, error) {
	s.RLock()
	defer s.RUnlock()
	req := &pdpb.GetMembersRequest{Header: &pdpb.RequestHeader{ClusterId: s.server.ClusterID()}}
	members, err := s.grpcServer.GetMembers(context.TODO(), req)
	if err != nil {
		return "", errors.WithStack(err)
	}
	return members.GetEtcdLeader().GetName(), nil
}

// GetEtcdLeaderID returns the builtin etcd leader ID.
func (s *TestServer) GetEtcdLeaderID() (uint64, error) {
	s.RLock()
	defer s.RUnlock()
	req := &pdpb.GetMembersRequest{Header: &pdpb.RequestHeader{ClusterId: s.server.ClusterID()}}
	members, err := s.grpcServer.GetMembers(context.TODO(), req)
	if err != nil {
		return 0, errors.WithStack(err)
	}
	return members.GetEtcdLeader().GetMemberId(), nil
}

// MoveEtcdLeader moves etcd leader from old to new.
func (s *TestServer) MoveEtcdLeader(old, new uint64) error {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetMember().MoveEtcdLeader(context.Background(), old, new)
}

// GetEtcdClient returns the builtin etcd client.
func (s *TestServer) GetEtcdClient() *clientv3.Client {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetClient()
}

// GetHTTPClient returns the builtin http client.
func (s *TestServer) GetHTTPClient() *http.Client {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetHTTPClient()
}

// GetStores returns the stores of the cluster.
func (s *TestServer) GetStores() []*metapb.Store {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetRaftCluster().GetMetaStores()
}

// GetStore returns the store with a given store ID.
func (s *TestServer) GetStore(storeID uint64) *core.StoreInfo {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetRaftCluster().GetStore(storeID)
}

// GetRaftCluster returns Raft cluster.
// If cluster has not been bootstrapped, return nil.
func (s *TestServer) GetRaftCluster() *cluster.RaftCluster {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetRaftCluster()
}

// GetRegions returns all regions' information in detail.
func (s *TestServer) GetRegions() []*core.RegionInfo {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetRaftCluster().GetRegions()
}

// GetRegionInfoByID returns regionInfo by regionID from cluster.
func (s *TestServer) GetRegionInfoByID(regionID uint64) *core.RegionInfo {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetRaftCluster().GetRegion(regionID)
}

// GetAdjacentRegions returns regions' information that are adjacent with the specific region ID.
func (s *TestServer) GetAdjacentRegions(region *core.RegionInfo) []*core.RegionInfo {
	s.RLock()
	defer s.RUnlock()
	left, right := s.server.GetRaftCluster().GetAdjacentRegions(region)
	return []*core.RegionInfo{left, right}
}

// GetRangeHoles returns all range holes, i.e the key ranges without any region info.
func (s *TestServer) GetRangeHoles() [][]string {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetRaftCluster().GetRangeHoles()
}

// GetStoreRegions returns all regions' information with a given storeID.
func (s *TestServer) GetStoreRegions(storeID uint64) []*core.RegionInfo {
	s.RLock()
	defer s.RUnlock()
	return s.server.GetRaftCluster().GetStoreRegions(storeID)
}

// BootstrapCluster is used to bootstrap the cluster.
func (s *TestServer) BootstrapCluster() error {
	bootstrapReq := &pdpb.BootstrapRequest{
		Header: &pdpb.RequestHeader{ClusterId: s.GetClusterID()},
		Store:  &metapb.Store{Id: 1, Address: "mock://1", LastHeartbeat: time.Now().UnixNano()},
		Region: &metapb.Region{Id: 2, Peers: []*metapb.Peer{{Id: 3, StoreId: 1, Role: metapb.PeerRole_Voter}}},
	}
	_, err := s.grpcServer.Bootstrap(context.Background(), bootstrapReq)
	if err != nil {
		return err
	}
	return nil
}

// WaitLeader is used to get instant leader info in order to
// make a test know the PD leader has been elected as soon as possible.
// If it exceeds the maximum number of loops, it will return nil.
func (s *TestServer) WaitLeader() bool {
	for i := 0; i < 100; i++ {
		if s.server.GetMember().IsLeader() {
			return true
		}
		time.Sleep(WaitLeaderCheckInterval)
	}
	return false
}

// GetTSOAllocatorManager returns the server's TSO Allocator Manager.
func (s *TestServer) GetTSOAllocatorManager() *tso.AllocatorManager {
	return s.server.GetTSOAllocatorManager()
}

// TestCluster is only for test.
type TestCluster struct {
	config  *clusterConfig
	servers map[string]*TestServer
	// tsPool is used to check the TSO uniqueness among the test cluster
	tsPool struct {
		sync.Mutex
		pool map[uint64]struct{}
	}
}

// ConfigOption is used to define customize settings in test.
// You can use serverName to customize a config for a certain
// server. Usually, the server name will be like `pd1`, `pd2`
// and so on, which determined by the number of servers you set.
type ConfigOption func(conf *config.Config, serverName string)

// NewTestCluster creates a new TestCluster.
func NewTestCluster(ctx context.Context, initialServerCount int, opts ...ConfigOption) (*TestCluster, error) {
	config := newClusterConfig(initialServerCount)
	servers := make(map[string]*TestServer)
	for _, conf := range config.InitialServers {
		serverConf, err := conf.Generate(opts...)
		if err != nil {
			return nil, err
		}
		s, err := NewTestServer(ctx, serverConf)
		if err != nil {
			return nil, err
		}
		servers[conf.Name] = s
	}
	return &TestCluster{
		config:  config,
		servers: servers,
		tsPool: struct {
			sync.Mutex
			pool map[uint64]struct{}
		}{
			pool: make(map[uint64]struct{}),
		},
	}, nil
}

// RunServer starts to run TestServer.
func (c *TestCluster) RunServer(server *TestServer) <-chan error {
	resC := make(chan error)
	go func() { resC <- server.Run() }()
	return resC
}

// RunServers starts to run multiple TestServer.
func (c *TestCluster) RunServers(servers []*TestServer) error {
	res := make([]<-chan error, len(servers))
	for i, s := range servers {
		res[i] = c.RunServer(s)
	}
	for _, c := range res {
		if err := <-c; err != nil {
			return errors.WithStack(err)
		}
	}
	return nil
}

// RunInitialServers starts to run servers in InitialServers.
func (c *TestCluster) RunInitialServers() error {
	servers := make([]*TestServer, 0, len(c.config.InitialServers))
	for _, conf := range c.config.InitialServers {
		servers = append(servers, c.GetServer(conf.Name))
	}
	return c.RunServers(servers)
}

// StopAll is used to stop all servers.
func (c *TestCluster) StopAll() error {
	for _, s := range c.servers {
		if err := s.Stop(); err != nil {
			return err
		}
	}
	return nil
}

// GetServer returns a server with a given name.
func (c *TestCluster) GetServer(name string) *TestServer {
	return c.servers[name]
}

// GetServers returns all servers.
func (c *TestCluster) GetServers() map[string]*TestServer {
	return c.servers
}

// GetLeader returns the leader of all servers
func (c *TestCluster) GetLeader() string {
	for name, s := range c.servers {
		if s.IsLeader() {
			return name
		}
	}
	return ""
}

// GetFollower returns an follower of all servers
func (c *TestCluster) GetFollower() string {
	for name, s := range c.servers {
		if !s.server.IsClosed() && !s.server.GetMember().IsLeader() {
			return name
		}
	}
	return ""
}

// WaitLeader is used to get leader.
// If it exceeds the maximum number of loops, it will return an empty string.
func (c *TestCluster) WaitLeader(ops ...WaitOption) string {
	option := &WaitOp{
		retryTimes:   100,
		waitInterval: WaitLeaderCheckInterval,
	}
	for _, op := range ops {
		op(option)
	}
	for i := 0; i < option.retryTimes; i++ {
		counter := make(map[string]int)
		running := 0
		for _, s := range c.servers {
			if s.state == Running {
				running++
			}
			n := s.GetLeader().GetName()
			if n != "" {
				counter[n]++
			}
		}
		for name, num := range counter {
			if num == running && c.GetServer(name).IsLeader() {
				time.Sleep(WaitLeaderReturnDelay)
				return name
			}
		}
		time.Sleep(option.waitInterval)
	}
	return ""
}

// WaitRegionSyncerClientsReady is used to wait the region syncer clients establish the connection.
// n means wait n clients.
func (c *TestCluster) WaitRegionSyncerClientsReady(n int) bool {
	option := &WaitOp{
		retryTimes:   40,
		waitInterval: WaitLeaderCheckInterval,
	}
	for i := 0; i < option.retryTimes; i++ {
		name := c.GetLeader()
		if len(name) == 0 {
			time.Sleep(option.waitInterval)
			continue
		}
		leaderServer := c.GetServer(name)
		clus := leaderServer.GetServer().GetRaftCluster()
		if clus != nil {
			if len(clus.GetRegionSyncer().GetAllDownstreamNames()) == n {
				return true
			}
		}
		time.Sleep(option.waitInterval)
	}
	return false
}

// ResignLeader resigns the leader of the cluster.
func (c *TestCluster) ResignLeader() error {
	leader := c.GetLeader()
	if leader != "" {
		return c.servers[leader].ResignLeader()
	}
	return errors.New("no leader")
}

// WaitAllocatorLeader is used to get the Local TSO Allocator leader.
// If it exceeds the maximum number of loops, it will return an empty string.
func (c *TestCluster) WaitAllocatorLeader(dcLocation string, ops ...WaitOption) string {
	option := &WaitOp{
		retryTimes:   100,
		waitInterval: WaitLeaderCheckInterval,
	}
	for _, op := range ops {
		op(option)
	}
	for i := 0; i < option.retryTimes; i++ {
		counter := make(map[string]int)
		running := 0
		for _, s := range c.servers {
			if s.state == Running && s.GetTSOAllocatorManager().EnableLocalTSO() {
				running++
			}
			serverName := s.GetAllocatorLeader(dcLocation).GetName()
			if serverName != "" {
				counter[serverName]++
			}
		}
		for serverName, num := range counter {
			if num == running && c.GetServer(serverName).IsAllocatorLeader(dcLocation) {
				return serverName
			}
		}
		time.Sleep(option.waitInterval)
	}
	return ""
}

// WaitAllLeaders will block and wait for the election of PD leader and all Local TSO Allocator leaders.
func (c *TestCluster) WaitAllLeaders(testC *check.C, dcLocations map[string]string) {
	c.WaitLeader()
	c.CheckClusterDCLocation()
	// Wait for each DC's Local TSO Allocator leader
	wg := sync.WaitGroup{}
	for _, dcLocation := range dcLocations {
		wg.Add(1)
		go func(dc string) {
			testutil.WaitUntil(testC, func() bool {
				leaderName := c.WaitAllocatorLeader(dc)
				return leaderName != ""
			})
			wg.Done()
		}(dcLocation)
	}
	wg.Wait()
}

// GetCluster returns PD cluster.
func (c *TestCluster) GetCluster() *metapb.Cluster {
	leader := c.GetLeader()
	return c.servers[leader].GetCluster()
}

// GetClusterStatus returns raft cluster status.
func (c *TestCluster) GetClusterStatus() (*cluster.Status, error) {
	leader := c.GetLeader()
	return c.servers[leader].GetRaftCluster().LoadClusterStatus()
}

// GetEtcdClient returns the builtin etcd client.
func (c *TestCluster) GetEtcdClient() *clientv3.Client {
	leader := c.GetLeader()
	return c.servers[leader].GetEtcdClient()
}

// GetHTTPClient returns the builtin http client.
func (c *TestCluster) GetHTTPClient() *http.Client {
	leader := c.GetLeader()
	return c.servers[leader].GetHTTPClient()
}

// GetConfig returns the current TestCluster's configuration.
func (c *TestCluster) GetConfig() *clusterConfig {
	return c.config
}

// HandleRegionHeartbeat processes RegionInfo reports from the client.
func (c *TestCluster) HandleRegionHeartbeat(region *core.RegionInfo) error {
	leader := c.GetLeader()
	cluster := c.servers[leader].GetRaftCluster()
	return cluster.HandleRegionHeartbeat(region)
}

// Join is used to add a new TestServer into the cluster.
func (c *TestCluster) Join(ctx context.Context, opts ...ConfigOption) (*TestServer, error) {
	conf, err := c.config.Join().Generate(opts...)
	if err != nil {
		return nil, err
	}
	s, err := NewTestServer(ctx, conf)
	if err != nil {
		return nil, err
	}
	c.servers[conf.Name] = s
	return s, nil
}

// Destroy is used to destroy a TestCluster.
func (c *TestCluster) Destroy() {
	for _, s := range c.servers {
		err := s.Destroy()
		if err != nil {
			log.Error("failed to destroy the cluster:", errs.ZapError(err))
		}
	}
}

// CheckClusterDCLocation will force the cluster to do the dc-location check in order to speed up the test.
func (c *TestCluster) CheckClusterDCLocation() {
	wg := sync.WaitGroup{}
	for _, server := range c.GetServers() {
		wg.Add(1)
		go func(ser *TestServer) {
			ser.GetTSOAllocatorManager().ClusterDCLocationChecker()
			wg.Done()
		}(server)
	}
	wg.Wait()
}

// CheckTSOUnique will check whether the TSO is unique among the cluster in the past and present.
func (c *TestCluster) CheckTSOUnique(ts uint64) bool {
	c.tsPool.Lock()
	defer c.tsPool.Unlock()
	if _, exist := c.tsPool.pool[ts]; exist {
		return false
	}
	c.tsPool.pool[ts] = struct{}{}
	return true
}

// WaitOp represent the wait configuration
type WaitOp struct {
	retryTimes   int
	waitInterval time.Duration
}

// WaitOption represent the wait configuration
type WaitOption func(*WaitOp)

// WithRetryTimes indicates the retry times
func WithRetryTimes(r int) WaitOption {
	return func(op *WaitOp) { op.retryTimes = r }
}

// WithWaitInterval indicates the wait interval
func WithWaitInterval(i time.Duration) WaitOption {
	return func(op *WaitOp) { op.waitInterval = i }
}

redpajama_set_name: RedPajamaGithub