Shef-Guard have been installing electronic security equipment for OVER 25 years. we pride ourselves in neat and tidy installations with the minimum possible disruption.
We have spent years building a client base which has been increased by recommendation.
We believe maintaining high standards and going that extra mile is what makes our clients use us time and time again.
To help maintain our high standards and to ensure that work continues to be of the quality demanded by both the Police and the Insurance Industry, our work and office procedures are regularly inspected by the SSAIB (Security Systems & Alarms Inspection Board).


Are you ready to explore the world of funded travel opportunities?
Whether it's eco-tourism in Mexico or a high school in Japan, EIL Explore offer a variety of diverse experiences throughout the world for participants to travel, learn, and change — both personally and within their community. On your return, all participants are required to complete an Action Project that reflects and shares their learning with their community.
EIL Explore awards are funded travel opportunities for people who are interested in the personal challenge of becoming a global citizen, while exploring and immersing themselves world cultures. See the lists of Explore awards below to learn more about what options are available to you. With a wide range of ages and themes, there is an EIL Explore award for everybody!


text:
Topics in Middle East History
Chapter 13: The Birth of the Ottoman Empire
Copyright ©2010, 2011, 2012 by T. Pavlidis
The year 1300 can be seen as the one that divides the period when the Middle East was ahead of Western Europe (certainly as late as 1200, see Gibbon's quote in Chapter 12) and the modern era where the West is ahead of the Middle East (certainly true by 1400). There are several explanations for the western cultural and scientific advance, but why the Middle East stagnated? Sure the Crusaders "took knowledge" from the East, but "taking knowledge" does not deprive its original owner of the possession.
In Chapter 8 we discussed the Arab Golden Age and attributed its end to the rise of religious fundamentalism. We should remember 1195 as the year when the famous Arab scholar Ibn Rushd (Averroes to the Europeans) was exiled at the instigation of religious authorities. It is an interesting coincidence that Magna Carta was granted in 1215 and that year is often remembered as the beginning of the "rule of Law" in England (see Chapter 12). Was it a pure coincidence that religious fundamentalism rose in Islam as the power of the nobles declined in Europe as a result of the Crusades [ibid]? Or was the rise of fundamentalism in Islam also a result of the Crusades? These are interesting speculations but we should not ignore the local political factors.
The major political entity in the Middle East at that time was the Mamluk empire centered in Egypt and stretching up to Syria. It was the Mamluk armies that defeated the Mongols of Genghis Khan. But a new power was rising, the Ottoman Turks who dominated the region until the early 20th century (end of World War I). Rather than the effects of the Crusades and the Mongol invasions, the new regional power and its policies may offer the answer for the decline of intellectual activity in the Middle East.
The Ottoman Turks (1300-1400)
One of the principalities into which the Seljuk empire had broken up, eventually grew to be the mighty Ottoman empire. The name Ottoman is derived from Osman, the founder of the principality in 1299, in the western part of the Seljuk lands. In 1326 the Ottomans captured Bursa from the Byzantines and made it the capital of their state [BL95, p. 107]. Gibbon considers that event the start of the Ottoman Empire. The office of Vizir was instituted and its first occupant was Aladin, the brother of sultan Orhan (son of Osman). A college of Islamic studies was founded and a military re-organization was carried out establishing infantry troops in addition to the traditional Turkish cavalry. [EG, Chapter LXIV, vol. 6, pp. 292-294]. During that time the Byzantines were engaged in a ruinous civil war between the emperor Andonicus II and his grandson Andronicus III who eventually won and became undisputed emperor in 1328. Gibbon remarks that "The Greeks, by their intestine divisions, were the authors of their final ruin" [ibid, p. 295]. Indeed, the conquest of Bythinia (the province surrounding Bursa) took place during the civil war between the two Andronicus.
In addition to the Ottomans, the Byzantines were facing threats in the Balkans from the Serbians and in the Aegean from the Venetians and the Genovese. In 1347 the bubonic plague (Black Death) broke out in Constantinople. Because the plague was spread by rats from port to port it affected the coastal areas more than it did the interior lands of the Serbians and the Turks [WT97, p. 773]. To make things worse another civil war broke out amongst the Byzantines and the co-emperor John VI Cantacuzenos relied on Ottoman mercenaries. At the end of the war he tried to dismiss them but they did not oblige. When an earthquake in 1354 destroyed the fortifications of Callipolis on the straights of the Dardanelles the Ottomans repaired the fortress and occupied the city achieving for the first time a foothold in Europe [ibid, p. 776]. Orhan was succeeded by his son Murad I who is credited with establishing the corps of the Janissaries (meaning new soldiers in Turkish). They consisted of young European captives who were converted to Islam and raised to become soldiers, not unlike the Mamluks [EG, Chapter LXIV, vol. 6, pp. 299-300]. Gibbon quotes Murad as giving a blessing to the Janissaries that ends with the phrase "and wheresoever they go, may they return with a while face" [ibid]. The expression "white face" is used (In both Turkish and Greek) to denote someone who is proud of what he has accomplished.
In 1365 the Ottomans captured Adrianopolis and made it their capital, encircling Constantinople from both the East and the West. In 1387 they captured the major port of Thessaloniki from the Venetians and in 1389 they defeated the Serbians at Kosovo. While the Ottoman sultan Murad I was killed in the battle [CF05, p. 21] the Serbians lost their state and the defeat at Kosovo still reverberates at modern times. Within 35 years from their first foray into the European lands of the Byzantines, the Ottomans ended up controlling most of them. In addition, in 1352, they had signed a commercial treaty with the Genoese [BL95, pp. 107-108]. In 1371 the Byzantine emperor John V had agreed to pay tribute to Murad I and become his vassal [WT97, p. 780, EG, Chapter LXIV, vol. 6, p. 299]. The same emperor also tried to obtain help from the West by traveling to Italy and submitting the Eastern Church to the authority of the Pope, thus reversing the schisms of 1054. However, the so called union of the churches was rejected in Constantinople and no military help came from the West. The humiliation of the once mighty Roman empire was complete.
When Murad I was killed in Kosovo he was succeeded by son Bayezid I who was given the surname Yildirim or Thunderbolt. [EG, Chapter LXIV, vol. 6, pp. 300-301] (However I use the modern Turkish spelling of the word as well as its most prevalent meaning.) Bayezid completed the conquest of the Turkish principalities in Asia Minor capturing the old Seljuk capital of Iconium (Konya) [ibid].
Bayezid asked the caliph to recognize him as "Sultan of Rum" aiming at inheriting the authority of the Seljuk sultans of Anatolia. In 1396 his army met a European (mostly French and Hungarian) army in Nicopolis, a city on the south shore of Danube in Bulgaria. The Turks inflicted a crushing defeat on the European knights, thus solidifying their control of the Balkans [BL95, p. 108]. (See also http://en.wikipedia.org/wiki/Battle_of_Nicopolis.) As the fourteenth century was ending the Ottoman Turks controlled most of the Balkan peninsula (including the modern countries of Greece, Bulgaria, Albania, and Serbia) as well as most of Asia Minor. It would seem that the end of the Byzantine Empire would be imminent but help came from the Far East with a second Mongol invasion.
The Second Mongol Invasion
This time the Mongol leader was Timur the lame, or Tamerlane. He was born in what is today Uzbekistan and his reign began in 1370. He had risen from relatively humble circumstances and quickly became the ruler of an empire that covered Persia, what is now the central Asia states, parts of Russia, and parts of India [EG, Chapter LXV, vol. 6, pp.308- 317]. Tamerlane may have decided to attack the Middle East rather than China, the usual target of Mongol raiders, because in 1368 China saw the rise of the strong Ming dynasty. Eventually, Ming emperors built the Great Wall of China but the latter was completed more than 40 years after Timur's death.
Tamerlane was a Muslim, but that did not stop him from attacking other Muslim rulers. Gibbon [ibid, pp. 318-19] reports a correspondence between Timur and the Ottoman sultan Bayezid, son of Murad I. Timur sent a haughty letter that enraged Bayezid, who flush from his victories in Europe replied in an even more insulting way. Timur postponed dealing with Bayezid and directed his attention first against Syria. His army included elephants that carried turrets filled with archers or with devices spewing Greek fire [ibid, p. 321] and easily defeated the Mamluk troops. Then the Mongols sacked and burned Aleppo, a major Syrian city about 100 miles from the Mediterranean coast. The Mongols had a practice of erecting a pyramid of human heads from their victims when they took a city. In the case of Baghdad the pyramid consisted of 90,000 heads [ibid, p. 322].
In 1402 Timur moved into Anatolia, occupied the major city of Kayseri and met Bayezid's army in the plain of Ankara. The Ottoman armies suffered a crashing defeat and Bayezid himself was captured by the Mongols [ibid, 323-326, also CF05, p. 29]. The Mongol troops took over most of Asia Minor and Bayezid died a prisoner. Timur died in 1405 and his empire dissolved after his death. His main legacy has been the wanton destruction of cities and the slaughter of people from India to Persia to Syria to Asia Minor [EG, Chapter LXV, vol. 6, pp. 334-336]. The destruction caused by the two Mongol invasions is sometimes seen as the cause for the stagnation of the Arab countries but not everybody agrees with that assessment.
The damage inflicted by the Mongols on the Ottomans served to prolong the life of the Byzantine state for a few more decades but it could not change its ultimate fate.
Recovery from the Mongol Attack
Bayazid I died in captivity and his succession unleashed a civil war amongst his sons that was eventually won by Mehmed I who reigned as sultan during 1413-1421. He was succeeded by his son Murad II but the latter faced immediately a pretender to the throne. "False" Mustafa had first appeared in 1415 claiming to be Bayazid's son [CF05, pp.33-34] but failed to depose Mehmed I and he had found refuge in Constantinople. In 1422 Mustafa was released by the Byzantine emperor Manuel II in the hope of causing internal strife amongst the Ottomans [EG, Chapter LXV, vol. 6, pp. 340-341]. However Murad II defeated Mustafa quickly and he started a siege of Constantinople but he had to suspend it because of internal challenges to his rule [ibid, p. 342].
Murad further developed the corps of the Janissaries that had been established by his grandfather [FB78, p. 15]. The recruits were young boys (12-14 years of age) that were selected mainly from amongst European Christians under the devsirme system. This was a human tax system under which Christian communities had to provide a certain number of boys at regular time intervals. The boys were converted into Islam and educated in special schools. They were educated not only in the military matters but also in the knowledge of the Koran and the Arabic and Persian languages [EG, Chapter LXV, vol. 6, pp. 343-345]. The recruits of the devsirme ended up not only as soldiers but also, depending on their aptitude, as administrators or as religious scholars. Those serving in the army were required to stay single but were allowed to marry upon retirement. (The father of the famous corsair Hayreddin Barbarossa was a retired Jannissary who had married the widow of a Christian priest.) While the recruits of the devsirme were considered slaves of the sultan, they held a high status and occupied many powerful positions in the empire not unlike the Mamluks. One difference from the latter was that the Janissary troops were infantry rather than horsemen. Ottoman cavalry was provided by the landed gentry.
Even though Murad failed to capture Constantinople, he was able to re-capture the major port of Thessaloniki in 1430. The city had been ceded to Venice by Manuel II in 1422 on condition that Orthodox Christianity be respected but the Venetian forces were unable to withstand the Ottoman assault [CF05, pp. 40-41]. The fall of Thessaloniki was followed by the capture of Yannina, a major city in Epirus [FB78, p. 10]. Murad spent the next year (1432) in his capital Adrianopolis (modern Edirne) and that is where his third son Mehmed, the future conqueror of Byzantium, was born [ibid, p. 11].
By this time the Ottoman state employed Christian Greek converts to Islam in high positions. One of them, Ishak Pasha had been the first vizier, although, in 1439, he was demoted to second vizier. The third vizier was Zaganos Pasha, another Greek convert to Islam [ibid, pp. 14-15]. There was tension between these converts and the old Turkish nobility that interfered with the smooth functioning of the state machinery. On the other hand the animosity between these two groups ensured that they would never conspire against the sultan. This divide-and-conquer policy became a cornerstone of the power of the Ottoman dynasty.
Murad re-established Ottoman hegemony in the Balkans that had been eroded since his grandfather's victory at Kosovo. The conquest of Serbia was completed in August 1441 but a new opponent appeared. John Hunyadi, a Transylvanian nobleman whose mother was Greek started raiding Turkish possessions inflicting a serious defeat on the Ottomans in 1441 [ibid, pp. 20-21]. Hunyadi's victories raised hopes in Europe and a new crusade was launched but, after some initial successes, it failed. Hunyadi and the Albanian nobleman George Castriot (known as Skanderbeg, Turkish for Alexander Bey) were able to inflict damage on the Ottomans but eventually they were defeated by Murad. The final battle took place in Kosovo in 1448 [ibid, p. 56]. (Also [EG, Chapter LXVII, vol. 6, pp. 407-413].)
Murad had abdicated in favor of his young son Mehmed in 1444 but he returned to the throne two years later as a result of a Janissary revolt. Apparently the Janissaries were unhappy with certain economy measures instituted by Mehmed [CF05, p. 46]. Murad II died in 1451 at the age of 49. His son was only 19 years old when he became sultan as Mehmed II [FB78, pp. 62-63]. Mehmed's first order of business was to kill his younger brother who was only an infant. Later he enacted the fratricide law that stated "whichever of the sultan's sons inherits the throne, it behooves him to kill his brothers in the interest of the world order" [ibid, pp. 65-66]. It would take only two years for Mehmed II to finish with the Byzantine empire.
Who Were the Ottomans?
In barely 100 years a tiny Turkish principality had become the mighty Ottoman empire, in spite of the setbacks inflicted by the Mongol invasion led by Tamerlane. Such a rapid growth exceeds the Arab conquests of the seventh and eighth centuries and we have to back to Alexander's time to see a comparable growth. (And Alexander's empire did not outlive his death while the Ottoman empire lasted for over 600 years). Therefore it is natural to ask who were really the Ottomans?
This topic is the subject of a monograph by H. W. Lowry ,The Nature of the Early Ottoman State [HL03] and I rely on that work in this section.
Lowry is critical of earlier claims that religious zeal fueled Ottoman expansion and instead provides strong evidence that the Ottomans started as a "Predatory Confederacy" [ibid, p. 57] between Muslim and Christian warlords. The Ottoman negotiator for the surrender of Bursa in 1326 was Köse Mihal, a recent convert to Islam who had been a Greek-Christian. His descendents were the Ottoman warrior family Mihalogullari [ibid, p. 59]. Another Ottoman warrior family, the Evrenosguallari, were certainly not of Turkic origin and he suggests a Catalan ancestry for them. (Catalans had served as mercenaries with the Crusaders and the Byzantines.) Both families have been using the title "King of the Warriors", putting them only just a notch below the sultan [ibid, p. 65]. A list of timariots in Albania in the year 1431 has survived to modern times and it is quite revealing. Timars were fiefs who owners were obliged to provide cavalry (spahis) for the Ottoman army. 16% of the timars were held by Christians, 30% by Muslims from Anatolia, and the rest by recent Muslim converts [ibid, p. 90]. No small part in the process of integration was played by the practice of Muslim men to marry Christian women [ibid, p. 93].
Lowry quotes the Greek scholar Arnakis who states that the "Ottomans initially encountered a peasantry which had been abused by their Byzantine rulers with a resultant loss of morale. ... the lenient attitude of the Ottomans ... facilitated widespread conversion and subsequent assimilation". In short, the fast growth of the early Ottoman state was due to the "absorption of the indigenous Greek population of Bithynia." [ibid, p. 9] An Ottoman chronicler provides the following description for the aftermath of an Ottoman conquest. "All the villagers came back and settled in their places. Their state was better than it had been in the time of the unbelievers" [ibid, p. 81].
There is a modern parallel to this process. For the last 200 years impoverished and persecuted people from Europe have been migrating to the North American states and more recently to Australia. While these people kept, nominally, their religion, they adopted the language and culture of their new homelands. After a few generations the connection to the old countries is lost.
The Byzantine aristocracy was also eager to enter Ottoman service. The last Byzantine emperor, Constantine XI had no children, so his successor would have been one of his three nephews, children of his older brother. All three converted to Islam and entered Ottoman service. One, renamed Mesih Pasha started as Admiral of the Ottoman fleet and rose to become Grand Vizier. A second, Has Murad Pasha, served as governor of the Balkans and died in 1472 while leading Ottoman troops against a Turkman chief. The third, Gedik Ahmed Pasha, also served as Grand Vizier. [ibid, p. 116].
There were 16 individuals who held the office of Grand Vizier. during the 64 years between 1453 and 1517, several serving more than one term. This was a most important office, equivalent to prime minister in Western kingdoms. Of the 16 only three were Muslim Turks. Five others were products of the Devsirme system (see previous section) where young Christian boys from the Balkans would be drafted and then covert to Islam and enter either the Army (Janissary troops) or the palace service. The other eight were all members of noble Christian families, Greek, Serbian, Albanian, or Bosnian [ibid, pp. 120-122]. Some of these individuals were mentioned in the previous section. Note also that at that time Bosnians and Albanians were predominantly Christian. Islamization of these areas came later.
A historical fact that is often ignored, especially by Greek historians, is that there were close family connections between the Ottoman and Byzantine rulers. Sultans selected wives (as opposed to concubines) with political goals in mind. They often married Byzantine noblewomen in order to cement alliances with Byzantine emperors. Figure 1 encapsulates those ties. Because sultans could have several wives (up to four by Islamic law) and countless concubines, the role of the queen was assumed by the mother of the sultan who took the title of Valide Sultana. Here are a few details.
Orhan I (reigned 1324-1362) married Theodora, daughter of emperor John VI Cantacuzene in 1346. Earlier (in 1299) he had married a Byzantine noblewoman Helen who, upon converting to Islam, changed her name to Nulifer. She was the mother of Murad I (reigned 1362-1389). When he became Sultan, she became the Valide Sultana. This makes Murad I half Greek. He also married a Greek woman (Gulcicek) who was the mother of the next sultan Bayezid I (1389-1402). So the famous Thunderbolt sultan (see above) was 3/4 Greek! The mother of Mehmet I (reigned 1413-1421) was a convert to Islam most likely of Greek origin. The mother of the next sultan, Murad II (1421-1451) was Turkish.
We are not sure about the ethnicity of Mehmed's II (1451-1481) mother. Most likely she was Serbian. The next sultan Bayezid II was Mehmed's son by a Greek woman, Gulbahar. Suleyman I was the first sultan to marry a woman that started as a concubine, the famous Roxelana.
Figure 1: The ancestry of the early Ottoman Sultans. The name of each sultans is in a rectangle and the ethnicity of the wife who was the mother of the sultan's successor (in other words the Valide Sultana) is in an ellipse. The line under the name of each sultan depicts the mixture of his ancestry. (My main source for the ancestry of the sultans is [HL03, pp. 153-154].)
The End of the Byzantine Empire
The defeat of the Ottomans by the Mongols in 1402 provided some breathing space for the Byzantines but it was not put to good use. During 1399-1403 the emperor Manuel II traveled to Europe visiting France, Germany, and England but while he was treated with honors, he was unable to obtain any substantive help. One reason that the trip is memorable is that a member of his retinue, Chalcocondyles, wrote his impressions about those countries. He was impressed by London but also shocked by the habit of English women greeting strangers by kissing them. Scholars argue on the exact meaning of the words Chalcocondyles used [EG, Chapter LXVI, vol. 6, pp. 356-359]. Manuel II reigned for over 20 years after his return from Europe and he devoted his time in writing theological treatises. He composed 26 of them in defending orthodox Christianity against Islam [ibid, pp. 359-360]. In 2006 the Pope Benedict XVI quote parts of one of these treatises causing an outcry amongst Muslims who found the passages insulting.
Manuel had married a Serbian noblewoman, Helena Dragas, and had six sons with her. He was succeeded by the oldest son, John VIII Paleologus in 1425. The latter traveled to Italy with Byzantine clergy and reached an agreement with the Pope for a union between the Greek and the Roman churches. The decree for the union was signed in Florence in 1439 [FB78, p. 17] [EG, Chapter LXVI, vol. 6, pp. 367-379]. Historians claim that the Greek scholars who accompanied the emperor contributed to the revival of interesting in the Greek classics amongst Italian scholars [ibid, pp. 383-392].
While the emperor and the church leaders had agreed to the union of the churches the result was not accepted by the Byzantine clergy and laity. Because there was no military help from the West the union agreement seemed like a sell-out. The union was also rejected by the patriarchs of Antioch, Alexandria, and Jerusalem. While a Russian primate had taken part in the Florence agreement he was met with opposition when he returned home. [EG, Chapter LXVII, vol. 6, pp. 392-397]. Typical of the attitude of the Byzantines towards the Pope was the statement of a high official of the empire that he would rather see a Turk's turban in Constantinople than a cardinal's hat [EG, Chapter LXVIII, vol. 6, p. 433]. For the Byzantines the union meant complete subjugation of their church to Rome, while a Muslim conquest would have allowed them religious autonomy. The latter had been consistent practice of Muslim rulers as we saw in Chapter 6. There was also the view amongst Greeks that any help from the West would result in the revival of the Latin Empire of Constantinople rather than the saving the Byzantine empire [FB78, pp. 68-69]. (See also [CF05, p. 43].)
A few churches accepted the union and their descendents are today's Eastern-rite Catholics that follow the Byzantine rituals while recognizing the Pope as the head of the Christian church. (An eastern-rite bishop took part in the funeral of Pope John-Paul II in 2005 and the Greek words of the hymn of resurrection were heard in St Peter's square.)
Figure 2: Lands of the Byzantine Empire in 1452 (in blue). The empire consists only of Peloponese and the small area around Constantinople. There is also another small state under Byzantine rulers centered around Trabizon on the Black Sea (outside the area of the map).
Adapted from http://www.ict.griffith.edu.au/wiseman/Roman/RomanEmpire.html
John VIII died childless in 1448 and he was supposed to be succeeded by the eldest of his surviving brothers Constantine who was despot of Mystra in Peloponese. However another brother, Demetrius, also raised claims to the throne and the Byzantines asked Murad II to arbitrate the dispute. Murad decided in favor of Constantine who sailed from Peloponese to Constantinople on a Catalan ship in March 1449 [FB78, p. 56], [EG, Chapter LXVII, vol. 6, pp. 413-414]. As Constantine XI he was the last Roman emperor. By that time the once mighty Roman empire had been reduced to minuscule size shown in Figure 2. Given the pitiful state of the empire it is amazing that the office of the emperor would be the subject of a dispute and that the Ottoman sultan would be asked to decide. What were these people thinking?
When Constantine became emperor he was a widower, so he asked his great chamberlain Phrantzes to find him a wife from the royal houses of the region. Phrantzes found a prospective bride in the daughter of a Georgian prince. But the marriage did not take place because Mehmed II laid siege to Constantinople [EG, Chapter LXVII, vol. 6, pp. 414-416]. He had the advantage of a new military technology, gunpowder, and shots from his canons breached the walls of the city. It fell on May 29, 1453 and Constantine XI was killed in the battle. According to Greek folklore, he did not really die but he was converted into marble (Μαρμαρομενος Βασιλιας). He is supposed to rise (I forget what will be the triggering event) and resume ruling the empire.
A lot has been written about the final battle of Constantinople (for example, [EG, Chapter LXVIII, vol. 6, pp. 433-449], [FB78, pp. 75-98]) and it is remember as a dark day in Greek history. Some of the writings include "what ifs" of events that may have saved the city. The sad truth is that the Fall of Constantinople may have had great symbolic significance (for both the Ottomans and the Christians) but it was only the final step in a process that had started at least a century earlier. Comparing the map of Figure 5 in Chapter 11 to the map of Figure 2 tells the story of the long decline.
It was only after the disastrous war of 1919-22 that Greeks gave up the idea of restoring the Byzantine empire with Constantinople as its capital.
First Posted: April 17, 2010. Latest Revision: February 12, 2012.
Back to Mid. East History Index Page

redpajama_set_name: RedPajamaCommonCrawl


text:
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.openapi.vcs.changes.ui;

import com.intellij.ide.dnd.DnDAware;
import com.intellij.ide.util.PsiNavigationSupport;
import com.intellij.ide.util.treeView.TreeState;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.fileChooser.actions.VirtualFileDeleteProvider;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vcs.VcsDataKeys;
import com.intellij.openapi.vcs.changes.*;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.PopupHandler;
import com.intellij.util.EditSourceOnDoubleClickHandler;
import com.intellij.util.EditSourceOnEnterKeyHandler;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.UtilKt;
import com.intellij.util.ui.tree.TreeUtil;
import com.intellij.vcsUtil.VcsUtil;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.util.List;
import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Stream;

import static com.intellij.openapi.vcs.changes.ChangesUtil.*;
import static com.intellij.openapi.vcs.changes.ui.ChangesBrowserNode.*;
import static com.intellij.util.containers.UtilKt.*;
import static com.intellij.vcs.commit.ChangesViewCommitPanelKt.subtreeRootObject;
import static java.util.stream.Collectors.toList;

// TODO: Check if we could extend DnDAwareTree here instead of directly implementing DnDAware
public class ChangesListView extends ChangesTree implements DataProvider, DnDAware {
  @NonNls public static final String HELP_ID = "ideaInterface.changes";
  @NonNls public static final DataKey<ChangesListView> DATA_KEY = DataKey.create("ChangeListView");
  @NonNls public static final DataKey<Stream<FilePath>> UNVERSIONED_FILE_PATHS_DATA_KEY = DataKey.create("ChangeListView.UnversionedFiles");
  @NonNls public static final DataKey<Stream<VirtualFile>> EXACTLY_SELECTED_FILES_DATA_KEY = DataKey.create("ChangeListView.ExactlySelectedFiles");
  @NonNls public static final DataKey<Stream<FilePath>> IGNORED_FILE_PATHS_DATA_KEY = DataKey.create("ChangeListView.IgnoredFiles");
  @NonNls public static final DataKey<List<FilePath>> MISSING_FILES_DATA_KEY = DataKey.create("ChangeListView.MissingFiles");
  @NonNls public static final DataKey<List<LocallyDeletedChange>> LOCALLY_DELETED_CHANGES = DataKey.create("ChangeListView.LocallyDeletedChanges");

  public ChangesListView(@NotNull Project project, boolean showCheckboxes) {
    super(project, showCheckboxes, true);

    setDragEnabled(true);
  }

  @Override
  protected void installEnterKeyHandler() {
    EditSourceOnEnterKeyHandler.install(this);
  }

  @Override
  protected void installDoubleClickHandler() {
    EditSourceOnDoubleClickHandler.install(this);
  }

  @NotNull
  @Override
  protected ChangesGroupingSupport installGroupingSupport() {
    return new ChangesGroupingSupport(myProject, this, true);
  }

  @Override
  public int getToggleClickCount() {
    return 2;
  }

  @Override
  protected boolean isInclusionVisible(@NotNull ChangesBrowserNode<?> node) {
    Object subtreeRootObject = subtreeRootObject(node);

    if (subtreeRootObject instanceof LocalChangeList) return !((LocalChangeList)subtreeRootObject).getChanges().isEmpty();
    if (subtreeRootObject == UNVERSIONED_FILES_TAG) return true;
    return false;
  }

  @Override
  public DefaultTreeModel getModel() {
    return (DefaultTreeModel)super.getModel();
  }

  public void updateModel(@NotNull DefaultTreeModel newModel) {
    TreeState state = TreeState.createOn(this, getRoot());
    state.setScrollToSelection(false);
    ChangesBrowserNode<?> oldRoot = getRoot();
    setModel(newModel);
    ChangesBrowserNode<?> newRoot = getRoot();
    state.applyTo(this, newRoot);

    initTreeStateIfNeeded(oldRoot, newRoot);
  }

  @Override
  public void rebuildTree() {
    // currently not used in ChangesListView code flow
  }

  private void initTreeStateIfNeeded(ChangesBrowserNode<?> oldRoot, ChangesBrowserNode<?> newRoot) {
    ChangesBrowserNode<?> defaultListNode = getDefaultChangelistNode(newRoot);
    if (defaultListNode == null) return;

    if (getSelectionCount() == 0) {
      TreeUtil.selectNode(this, defaultListNode);
    }

    if (oldRoot.getFileCount() == 0 && TreeUtil.collectExpandedPaths(this).size() == 0) {
      expandSafe(defaultListNode);
    }
  }

  @Nullable
  private static ChangesBrowserNode<?> getDefaultChangelistNode(@NotNull ChangesBrowserNode<?> root) {
    //noinspection unchecked
    Iterator<ChangesBrowserNode<?>> nodes = ContainerUtil.<ChangesBrowserNode<?>>iterate(root.children());
    return ContainerUtil.find(nodes, node -> {
      if (node instanceof ChangesBrowserChangeListNode) {
        ChangeList list = ((ChangesBrowserChangeListNode)node).getUserObject();
        return list instanceof LocalChangeList && ((LocalChangeList)list).isDefault();
      }
      return false;
    });
  }

  @Nullable
  @Override
  public Object getData(@NotNull String dataId) {
    if (DATA_KEY.is(dataId)) {
      return this;
    }
    if (VcsDataKeys.CHANGES.is(dataId)) {
      return getSelectedChanges().toArray(Change[]::new);
    }
    if (VcsDataKeys.CHANGE_LEAD_SELECTION.is(dataId)) {
      return getLeadSelection().toArray(Change[]::new);
    }
    if (VcsDataKeys.CHANGE_LISTS.is(dataId)) {
      return getSelectedChangeLists().toArray(ChangeList[]::new);
    }
    if (CommonDataKeys.VIRTUAL_FILE_ARRAY.is(dataId)) {
      return getSelectedFiles().toArray(VirtualFile[]::new);
    }
    if (VcsDataKeys.VIRTUAL_FILE_STREAM.is(dataId)) {
      return getSelectedFiles();
    }
    if (VcsDataKeys.FILE_PATH_STREAM.is(dataId)) {
      return getSelectedFilePaths();
    }
    if (CommonDataKeys.NAVIGATABLE.is(dataId)) {
      VirtualFile file = getIfSingle(getNavigatableFiles());
      return file != null && !file.isDirectory() ? PsiNavigationSupport.getInstance()
                                                                       .createNavigatable(myProject, file, 0) : null;
    }
    if (CommonDataKeys.NAVIGATABLE_ARRAY.is(dataId)) {
      return getNavigatableArray(myProject, getNavigatableFiles());
    }
    if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.is(dataId)) {
      return getSelectionObjectsStream().anyMatch(userObject -> !(userObject instanceof ChangeList))
             ? new VirtualFileDeleteProvider()
             : null;
    }
    if (UNVERSIONED_FILE_PATHS_DATA_KEY.is(dataId)) {
      return getSelectedUnversionedFiles();
    }
    if (EXACTLY_SELECTED_FILES_DATA_KEY.is(dataId)) {
      return getExactlySelectedVirtualFiles(this);
    }
    if (IGNORED_FILE_PATHS_DATA_KEY.is(dataId)) {
      return getSelectedIgnoredFiles();
    }
    if (VcsDataKeys.MODIFIED_WITHOUT_EDITING_DATA_KEY.is(dataId)) {
      return getSelectedModifiedWithoutEditing().collect(toList());
    }
    if (LOCALLY_DELETED_CHANGES.is(dataId)) {
      return getSelectedLocallyDeletedChanges().collect(toList());
    }
    if (MISSING_FILES_DATA_KEY.is(dataId)) {
      return getSelectedMissingFiles().collect(toList());
    }
    if (VcsDataKeys.HAVE_LOCALLY_DELETED.is(dataId)) {
      return getSelectedMissingFiles().findAny().isPresent();
    }
    if (VcsDataKeys.HAVE_MODIFIED_WITHOUT_EDITING.is(dataId)) {
      return getSelectedModifiedWithoutEditing().findAny().isPresent();
    }
    if (VcsDataKeys.HAVE_SELECTED_CHANGES.is(dataId)) {
      return !UtilKt.isEmpty(getSelectedChanges());
    }
    if (PlatformDataKeys.HELP_ID.is(dataId)) {
      return HELP_ID;
    }
    return super.getData(dataId);
  }

  @NotNull
  public Stream<FilePath> getUnversionedFiles() {
    //noinspection unchecked
    Enumeration<ChangesBrowserNode<?>> nodes = getRoot().children();
    ChangesBrowserUnversionedFilesNode node = ContainerUtil.findInstance(ContainerUtil.iterate(nodes),
                                                                         ChangesBrowserUnversionedFilesNode.class);
    if (node == null) return Stream.empty();
    return node.getFilePathsUnderStream();
  }

  @NotNull
  public Stream<FilePath> getSelectedUnversionedFiles() {
    return getSelectedFilePaths(UNVERSIONED_FILES_TAG);
  }

  @NotNull
  private Stream<FilePath> getSelectedIgnoredFiles() {
    return getSelectedFilePaths(IGNORED_FILES_TAG);
  }

  @NotNull
  private Stream<VirtualFile> getSelectedModifiedWithoutEditing() {
    return getSelectedVirtualFiles(MODIFIED_WITHOUT_EDITING_TAG);
  }

  @NotNull
  protected Stream<VirtualFile> getSelectedVirtualFiles(@Nullable Object tag) {
    return getSelectionNodesStream(tag)
      .flatMap(ChangesBrowserNode::getFilesUnderStream)
      .distinct();
  }

  @NotNull
  protected Stream<FilePath> getSelectedFilePaths(@Nullable Object tag) {
    return getSelectionNodesStream(tag)
      .flatMap(ChangesBrowserNode::getFilePathsUnderStream)
      .distinct();
  }

  @NotNull
  static Stream<VirtualFile> getExactlySelectedVirtualFiles(@NotNull JTree tree) {
    VcsTreeModelData exactlySelected = VcsTreeModelData.exactlySelected(tree);

    return exactlySelected.rawUserObjectsStream().map(object -> {
      if (object instanceof VirtualFile) return (VirtualFile)object;
      if (object instanceof FilePath) return ((FilePath)object).getVirtualFile();
      return null;
    }).filter(Objects::nonNull);
  }

  @NotNull
  private Stream<ChangesBrowserNode<?>> getSelectionNodesStream() {
    return getSelectionNodesStream(null);
  }

  @NotNull
  private Stream<ChangesBrowserNode<?>> getSelectionNodesStream(@Nullable Object tag) {
    return stream(getSelectionPaths())
      .filter(path -> isUnderTag(path, tag))
      .map(TreePath::getLastPathComponent)
      .map(node -> ((ChangesBrowserNode<?>)node));
  }

  @NotNull
  private Stream<Object> getSelectionObjectsStream() {
    return getSelectionNodesStream().map(ChangesBrowserNode::getUserObject);
  }

  @NotNull
  static Stream<VirtualFile> getVirtualFiles(TreePath @Nullable [] paths, @Nullable Object tag) {
    return stream(paths)
      .filter(path -> isUnderTag(path, tag))
      .map(TreePath::getLastPathComponent)
      .map(node -> ((ChangesBrowserNode<?>)node))
      .flatMap(ChangesBrowserNode::getFilesUnderStream)
      .distinct();
  }

  @NotNull
  static Stream<FilePath> getFilePaths(TreePath @Nullable [] paths, @Nullable Object tag) {
    return stream(paths)
      .filter(path -> isUnderTag(path, tag))
      .map(TreePath::getLastPathComponent)
      .map(node -> ((ChangesBrowserNode<?>)node))
      .flatMap(ChangesBrowserNode::getFilePathsUnderStream)
      .distinct();
  }

  static boolean isUnderTag(@NotNull TreePath path, @Nullable Object tag) {
    boolean result = true;

    if (tag != null) {
      result = path.getPathCount() > 1 && ((ChangesBrowserNode<?>)path.getPathComponent(1)).getUserObject() == tag;
    }

    return result;
  }

  @NotNull
  static Stream<Change> getChanges(@NotNull Project project, TreePath @Nullable [] paths) {
    Stream<Change> changes = stream(paths)
      .map(TreePath::getLastPathComponent)
      .map(node -> ((ChangesBrowserNode<?>)node))
      .flatMap(node -> node.getObjectsUnderStream(Change.class))
      .map(Change.class::cast);
    Stream<Change> hijackedChanges = getVirtualFiles(paths, MODIFIED_WITHOUT_EDITING_TAG)
      .map(file -> toHijackedChange(project, file))
      .filter(Objects::nonNull);

    return Stream.concat(changes, hijackedChanges)
      .filter(new DistinctChangePredicate());
  }

  @Nullable
  private static Change toHijackedChange(@NotNull Project project, @NotNull VirtualFile file) {
    VcsCurrentRevisionProxy before = VcsCurrentRevisionProxy.create(file, project);
    if (before != null) {
      ContentRevision afterRevision = new CurrentContentRevision(VcsUtil.getFilePath(file));
      return new Change(before, afterRevision, FileStatus.HIJACKED);
    }
    return null;
  }

  @NotNull
  private Stream<LocallyDeletedChange> getSelectedLocallyDeletedChanges() {
    return getSelectionNodesStream(LOCALLY_DELETED_NODE_TAG)
      .flatMap(node -> node.getObjectsUnderStream(LocallyDeletedChange.class))
      .distinct();
  }

  @NotNull
  private Stream<FilePath> getSelectedMissingFiles() {
    return getSelectedLocallyDeletedChanges().map(LocallyDeletedChange::getPath);
  }

  @NotNull
  private Stream<FilePath> getSelectedFilePaths() {
    return concat(
      getSelectedChanges().map(ChangesUtil::getFilePath),
      getSelectedVirtualFiles(null).map(VcsUtil::getFilePath),
      getSelectedFilePaths(null)
    ).distinct();
  }

  @NotNull
  private Stream<VirtualFile> getSelectedFiles() {
    return concat(
      getAfterRevisionsFiles(getSelectedChanges()),
      getSelectedVirtualFiles(null),
      getFilesFromPaths(getSelectedFilePaths(null))
    ).distinct();
  }

  @NotNull
  private Stream<VirtualFile> getNavigatableFiles() {
    return concat(
      getFiles(getSelectedChanges()),
      getSelectedVirtualFiles(null),
      getFilesFromPaths(getSelectedFilePaths(null))
    ).distinct();
  }

  @NotNull
  private Stream<Change> getLeadSelection() {
    return getSelectionNodesStream()
      .filter(node -> node instanceof ChangesBrowserChangeNode)
      .map(ChangesBrowserChangeNode.class::cast)
      .map(ChangesBrowserChangeNode::getUserObject)
      .filter(new DistinctChangePredicate());
  }

  @NotNull
  public Stream<Change> getChanges() {
    return getRoot().getObjectsUnderStream(Change.class);
  }

  @Nullable
  public List<Change> getAllChangesFromSameChangelist(@NotNull Change change) {
    DefaultMutableTreeNode node = findNodeInTree(change);
    while (node != null) {
      if (node instanceof ChangesBrowserChangeListNode) {
        return ((ChangesBrowserChangeListNode)node).getAllChangesUnder();
      }
      if (node == getRoot() && Registry.is("vcs.skip.single.default.changelist")) {
        return getRoot().getAllChangesUnder();
      }
      node = (DefaultMutableTreeNode)node.getParent();
    }
    return null;
  }

  @NotNull
  public Stream<Change> getSelectedChanges() {
    return getChanges(myProject, getSelectionPaths());
  }

  @NotNull
  private Stream<ChangeList> getSelectedChangeLists() {
    return getSelectionObjectsStream()
      .filter(userObject -> userObject instanceof ChangeList)
      .map(ChangeList.class::cast)
      .distinct();
  }

  @Override
  public void installPopupHandler(@NotNull ActionGroup group) {
    PopupHandler.installPopupHandler(this, group, ActionPlaces.CHANGES_VIEW_POPUP, ActionManager.getInstance());
  }

  @Override
  @NotNull
  public JComponent getComponent() {
    return this;
  }

  @Override
  public void processMouseEvent(final MouseEvent e) {
    if (MouseEvent.MOUSE_RELEASED == e.getID() && !isSelectionEmpty() && !e.isShiftDown() && !e.isControlDown()  &&
        !e.isMetaDown() && !e.isPopupTrigger()) {
      if (isOverSelection(e.getPoint())) {
        clearSelection();
        final TreePath path = getPathForLocation(e.getPoint().x, e.getPoint().y);
        if (path != null) {
          setSelectionPath(path);
        }
      }
    }

    super.processMouseEvent(e);
  }

  @Override
  public boolean isOverSelection(final Point point) {
    return TreeUtil.isOverSelection(this, point);
  }

  @Override
  public void dropSelectionButUnderPoint(final Point point) {
    TreeUtil.dropSelectionButUnderPoint(this, point);
  }

  @Nullable
  public DefaultMutableTreeNode findNodeInTree(Object userObject) {
    if (userObject instanceof LocalChangeList) {
      return TreeUtil.nodeChildren(getRoot()).filter(DefaultMutableTreeNode.class).find(node -> userObject.equals(node.getUserObject()));
    }
    if (userObject instanceof ChangeListChange) {
      return TreeUtil.findNode(getRoot(), node -> ChangeListChange.HASHING_STRATEGY.equals(node.getUserObject(), userObject));
    }
    return TreeUtil.findNodeWithObject(getRoot(), userObject);
  }

  @Nullable
  public TreePath findNodePathInTree(Object userObject) {
    DefaultMutableTreeNode node = findNodeInTree(userObject);
    return node != null ? TreeUtil.getPathFromRoot(node) : null;
  }

  /**
   * Expands node only if its child count is small enough.
   * As expanding node with large child count is a slow operation (and result is not very useful).
   */
  public void expandSafe(@NotNull DefaultMutableTreeNode node) {
    if (node.getChildCount() <= 10000) {
      expandPath(TreeUtil.getPathFromRoot(node));
    }
  }

  private static class DistinctChangePredicate implements Predicate<Change> {
    private final Set<Object> seen = new THashSet<>(ChangeListChange.HASHING_STRATEGY);

    @Override
    public boolean test(Change change) {
      return seen.add(change);
    }
  }
}

redpajama_set_name: RedPajamaGithub


CarTrawler, an online global car rental platform, will be moving beyond car rental to offer a range of ground transportation solutions.
As customer expectations have extended beyond car rental, CarTrawler has anticipated the need for a more comprehensive range of ground transportation solutions that can be personalized by customer, by country and by continent, says the company.
From early 2015, over 500 million airline passengers will be able to choose the car, limousine with driver, taxi, shuttle service or GPS-located transport solution (i.e. Uber, Lyft) that best suits their needs, their location and their budget — all delivered through the CarTrawler online marketplace, according to the company.
Many of these products are already available, and CarTrawler has plans for expansion of this portfolio in 2015.


Learn how to set a multi-state complex match and trigger a capture for a USB mouse, and view all of the pre-trigger data using the Beagle USB 5000 v2 SuperSpeed Protocol Analyzer.
Working with I2C? Learn how to quickly and easily program an I2C EEPROM using the Aardvark I2C/SPI Host Adapter and the Control Center Software.
Visit Total Phase at Design West and Receive a Special Gift!
Total Phase will be exhibiting at the Design West Expo in San Jose, California from April 23-25. Drop by our booth to say hello and experience a live demonstration of any of our USB, I2C, SPI, and CAN tools, including the award-winning Beagle USB 5000 v2 SuperSpeed Protocol Analyzer as well as the 2013 Best in Test/Test of Time Finalist, the Aardvark I2C/SPI Host Adapter. Learn more about our new support for the full line of Spansion NOR flash memory and the addition of the latest Micron NOR flash memory as well.
Additionally, we will be giving away a special gift – your choice of a free 10-pin split cable or flash SOIC-8 board. Quantities of both items are limited, so be sure to stop by and ask any representative at the Total Phase booth 1824 to claim your free gift!
Total Phase is excited to take part in a hands-on training session at Design West this year, titled "Essentials of USB Device Development." This class will focus on providing a foundation of important factors for successful USB device development. Attendees will be introduced to time-saving USB software and tools through several hands-on exercises.
This is not the first time the Beagle USB 480 analyzer has been featured at a Design West class! In 2011, Total Phase hosted a hands-on training lab emphasizing efficient I2C, SPI, and USB debugging and development. We are thrilled to have the Beagle USB 480 Protocol Analyzer included as one of the time-saving tools in "Essentials of USB Device Development."
This class will be held on Monday, April 22, 2013 at 1:30PM in room 210 CD at the McEnery Convention Center. Christian Legare, Executive VP and CTO of Micrium, will be the main speaker while Total Phase's own Tabitha Miller will also be present at this session to assist and answer any questions attendees may have about the Beagle USB 480 analyzer. Space is limited and available on a first come, first serve basis, so be sure to arrive early! For more information on other conference sessions at Design West, click here.
Hot off the virtual press – Total Phase recently released our latest white paper, which is available for download from our website. Here at Total Phase, one of our core values is to provide trusted and innovative development tools for engineers for debugging and programming across USB, I2C, SPI, and CAN. Our latest white paper, Trusted Debugging with Compliant PHYs, zooms in on how PHYs are a crucial part of a SuperSpeed USB analyzer's performance in capturing, receiving, and analyzing data from a USB 3.0 bus.
Interested in downloading other white papers from Total Phase? Our library of white papers is always growing. Some other topics include enhancing productivity with true real-time USB protocol analyzers and case studies on how engineers have used our Beagle protocol analyzers for their projects. Read more here.
The Aardvark I2C/SPI Host Adapter is a really cool little tool and great job on the software! It was very easy to get going.


From the examples in the previous post in the Search series, we have seen that searching is a more constructive activity than punching in search terms and consuming the result. One aspect of this is the ability of the user to quickly scan information looking for characteristics which they can employ to assess relevance. These characteristics are collectively are known as "information scent".
The definition "those characteristics of information which the user can employ to determine relevance" might sound a bit too vague to be useful, but in reality it invites us to think broadly about what those characteristics might be, and how as designers we might apply them to the information or interfaces we are involved with. It also invites us to consider how the user interacts with these characteristics.
The title "Upcoming series on search" – not bad scent, but I'm looking for the series itself, not an announcement. A user however might follow the link to see the pages had links to the series.
The description "I've had an interesting few months … " is nicely conversational within a blog, but not high scent here; a short description "We will be exploring such topics as information foraging, information scent, and sensemaking" would be better for a quick assessment.
So do these observations help anyone? Personally, I suspect they could be applied to corporate settings where I am trying to improve enterprise search through the application of metadata and smarter formatting of search results. I decide to give it a try.
A blog is an example of a type of content. Others might be News, or Reference Material. Coming up with content types to the finest level of granularity is hard work, but some high level typology might be helpful to categorize or refine search results. We might find that not all content needs to get tagged with a content type.
The description should be constructed to have high information scent. Scraping the first elements of the content does not give good results. For example, the search result description for some of my blog posts include the names of the blog navigation elements; spreadsheets are even worse, showing the contents of a number of cells 3.14, 1.41, 999.
We will be exploring such topics as information foraging, information scent, and sensemaking.
To proceed, we can stress test the concept on paper, explore business rules for any metadata needed, and talk to our UX colleagues to do usability testing on some of these ideas. They can also suggest some visual treatments and iconography.
Information scent does not apply just to search results, but can apply to documents, pages, links and navigation, among others.
When it comes to links, the simplest implementation is a text link. If the name does not provide high enough scent, then we can add a short description and/or a picture to increase the scent. Another approach is to give the user a chance to lean in for a closer sniff, by providing alt text, or revealing more information when the cursor hovers over the link.
Here's an example involving documents. I enjoy reading lecture notes in physics and have noticed distinctive aspects of scent that affect my assessment and seem reliable. If the document is all text or all mathematics, it has a low information scent for me. If the math is too hard for me, I rule out the document immediately. Diagrams provide a positive scent. Interestingly, I can make this assessment almost as soon as the document loads in the browser.
I have also noticed characteristics of lecture notes that reflect a distinct bias on my part. If the format is PowerPoint slides, I notice myself downgrading the information scent, but am prepared to persist if the authority is high. If the format is scanned handwritten lecture notes, I rule the document out without further investigation.
This last case is interesting. Most literature on information scent seems to focus on the user selecting stuff to pursue, but this example suggests that information scent is also useful for letting the user select stuff to rule out. Likewise, in our previous examples, somebody not interested in blogs could easily bypass them in a search results page, if they were easily identifiable. This is quite consistent with the biological origins of the concept, which is how animals use scent to identify good foraging opportunities. It also challenges the notion that we want to make content sticky. Maybe traversable might be a better notion.
To summarize, information scent consists of characteristics of information that we can use to make decisions about the value of that information, without having to read the information itself.
I'm not sure about the boundaries of the concept. People are influenced by branding, layout, tone, and a host of other things that we can manipulate. Some people are influenced by US vs. British spellings. Some people discount content with incorrect semi-colon usage. Does this make all of these characteristics part of information scent or something else?
Looking back to the biological origins, we know that bees are attracted to flowers by their shape and colour as well as scent. So maybe we could factor out visual elements. You probably didn't know that bees can also detect the shape of cells comprising a leaf, and hence whether the leaf will afford their feet a good grip. http://www.botanic.cam.ac.uk/Botanic/Page.aspx?p=27&ix=2847&pi..
Personally, I'm not going to attempt to define the boundaries of information scent. I will just adopt it as a useful concept to have in my toolkit, and apply where it might add value.
This entry was posted in Search by thei9791. Bookmark the permalink.


text:
Loktar!
For Doomhammer!
Fanax and his cousins recognize the blue-skinned goblin. He's very familiar.
Lok'tar ogar!
What would be a decent guess at how many miles the horde covers on the average day?
About eight to ten miles, depending a little bit on the weather, exact conditions on the ground, etc.
Elements of the horde are capable of moving faster by quite a bit—goblin wolf-riders in particular can cover a good 40 miles without pushing hard, if they're only trying to sustain that pace for a day or two. I think we've discussed the basic reasons why they have to slow down after that, in terms having to do with the need to pack food for mounts and riders. They can push that figure to 45 or 50 miles, if they're willing to be a little hard on the wolves.
The main body of the horde is that portion which carries all the supplies, however, and a wagon is only going to go so fast. The steppe is largely devoid of tracks and roads, so that slows things a bit, although not the way it might in a forest or hills. Still, that's the limiting factor on how fast the horde can cover ground.
Also, the hobgoblins are herding animals across this whole trip. They're not exactly going in a straight line when they do that because they have to let the animals graze, although they do their best not to allow the animals to spread out too much.
If the map's scale is accurate, then it should take about 14-16 days to cover the distance between the horde's current camp and the Abbey of St. Fiacrius. The herds and other supplies are undoubtedly sufficient for a longer period than that, but Lwazi also is undoubtedly correct in his assertion that it'd be best to move right along. There are about 3,000 fighting goblinoids (call it ~1,000 goblins, ~1,500 hobs, and ~500 bugbears) in the horde, plus roughly that man again who're non-combatants of various kinds. Families, craftspeople, cooks, herders, horse doctors, etc.
Camp followers, basically. Often, when you read that phrase in fantasy novels, you get the impression that these are pretty much just whores, pimps, gamblers, and other unsavory types, but in fact they are in many respects part of the logistics chain for any non-professional army.
Let's see if Grimvaalk knows anything about dragons -- Knowledge (something) roll...
The keyed skill for dragons is Knowledge (arcana). In any case, Grimvaalk doesn't know anything useful even if he has ranks.
Does he know they like cold and not fire?
I think the conventional model for setting Knowledge DCs would have a baseline of 15 and from there you add the creature's CR to determine even very generic information about it; like the dragon type and maybe knowing that a white dragon has the (Cold) subtype, and what those terms mean.
When I said, "He doesn't know anything useful," I meant what I said. Knowing that white dragons dislike fire and are fond of cold would be useful.
So no, Grimvaalk does not know it. :P
What does Zathrus know about white dragons?
Knowledge (arcana)
Shit. Not much.
Zathrus is aware that dragons, regardless of the kind, have both low-light vision and darkvision out to at least 60 ft., that they're immune to most paralytic effects, and that it's futile to try to ensorcel one into a charmed sleep. Some dragons are capable of changing their shapes, including into credible imitations of humanoids. Despite their immunity to magical sleep, Zathrus is quite sure that dragons sleep naturally, and that they eat and breathe like other living things.
But as a rule, dragons are physically robust for their size. They can soak up a lot of punishment in a confrontation, and they can dish out a lot of punishment in turn‐universally, they are adept with their claws, bites, and other natural weaponry. Most have extremely quick reflexes, and they resist mental and physical insult very stoutly. It's difficult to hurt them by magic, poison, or even just a clever trap.
Often, dragons show a disturbing facility for learning, as well. There are a few dragons that are nothing more than animalistic brutes, but a majority of dragons are sentient enough to speak, or at least to understand a little speech. And as might be expected of creatures that are smart enough to talk, they also are smart enough to plan ahead, use deception, and show tactical adaptability. True dragons, as he understands it, are generally as smart or smarter than most humanoids.
He doesn't think all dragons are capable of flying, but the discussion so far has made it abundantly clear to him that this one can and does.
Fanax will now and henceforth address Gorx as Dutch.
Where's your god damn faith, Fanax?
It went out the front of the tent along with this groups common sense. But, hey, it will be interesting.
Did "Gorx" just become an adjective?
Gorx modifies Gorx.
Gorx2.
Gorx, much like Buffalo, is a very versatile word.
https://en.wikipedia.org/wiki/Buffalo_buffalo_Buffalo_buffalo_buffalo_buffalo_Buffalo_buffalo
It's also a verb "Don't Gorx this up."
Speaking as a recovering English major, this entire discussion has given me a throbbing grammar-boner.
The grammar discussion is really cutting a little close to the reason I chose Zathrus for Zathrus's name.
https://www.youtube.com/watch?v=1j-76eLz1hc
I thought you named him after Zathrus. My mistake.
I need to watch more television.
It doesn't look like anyone's going to knife anyone else just yet, so I guess we'll move ahead with the game.
This is a last chance for you to add/delete gear before you start your first excursion away from the camp and its market for supplies. So please review your character sheets one last time, and address any last requests or changes to me. When you're squared away, post your sheet here: https://www.dndarchive.com/forums/immigrant-song/character-sheets, since we'll be using open sheets for this campaign.
Hmmmm... maybe I'll pick up a few flaming arrows... you know, to start campfires. And a dragon bane arrow... for... reasons.
I don't really buy the flaming arrow argument, but fair's fair. Grimvaalk knows he'll be facing a dragon. We'll say that the Great Horde is (being somewhat impoverished because the goblinoids of the horde are, in general, operating barely above subsistence) equivalent to a Small Town in terms of its market size.
So you can buy individual items worth up to 800 gp.
A +2 equivalent arrow, such as a +1 bane (dragon) arrow, costs 166 gp, 5 sp.
Well, that would probably make the task at hand somewhat easier.
It would if we could pick up a good number of them. Alone, a single arrow or two (the maximum that Grimvaalk could buy) might do an average of 7 hp more damage an arrow IF they scored hits. Sure, if all the archers had such arrows, we might be able to take out an even bigger dragon in a couple of rounds.
If we had someone to cast it, a scroll of Flame Arrow would make much more sense, costing 375 gp, but enchanting 50 arrows with +1d6 fire for 30 minutes. But I don't really think we'll have that hard of a time anyway. Basically, make sure we stay mobile so the dragon can't make a full attack (or in the case of the wolf riders, has to double move just to keep up with them). Don't cluster so it can't score multiple hits with its breath weapon -- and use some protection or resisting to keep the energy damage down.
Shamans can cast Magic Weapon, but I don't see any other buffs as being applicable from Gorx's spell list.
You guys have a difficult battle ahead of you, for sure. To a great extent, I think that you will have to make up your mind about how you want to approach the encounter with the dragon before you make any specialized preparations about how to fight it. I don't think I'm tipping my hand very much if I remark that the most fundamental choice facing you is whether you fight it inside its lair, or somewhere outside it, in hand with an assumption that its lair is relatively enclosed.
If your planning relies heavily on "stay mobile and avoid clustering up," then you may have problems in a confined space (which its lair may be). But conversely, if you're trying to fight this thing in the open where you can move around freely, then you're likely to be operating in a setting that will allow it to fight on the wing. That certainly will play to your wolf-riders' strengths, but it will severely limit the bugbears' ability to contribute to the fighting. They won't be useless, but neither will they be able to apply their brawn as effectively as you might like. That doesn't mean you shouldn't proceed with a plan involving combat outside of the lair, but it's probably something you should give due consideration. It's also the case that you are virtually assured of being able to arrange for a fight to happen outside—if the dragon knows that a hostile force is in the area and aware of the lair's location, then you've basically forced a confrontation. So if you can figure out a way to deal with the basic shortcomings of this overall approach, it has the general benefit of being one that you can count in being able to use.
An opposite approach may be possible, to the effect that you will hope to fight inside of the lair, in circumstances that will afford you the ability to use a natural choke point that will allow the bugbears to hold the dragon at bay while the goblins pile on with arrows/spells. Life could be a little bit difficult for you if the lair doesn't include such a choke point, although there is a high probability that it does—unless the dragon has bedded down in some kind of extremely large cavern or ruin in which all passages are a good 25 feet in diameter, or has chosen a location that has many entry and exit points, it just doesn't make sense to assume that there'll be nothing to work with.
Other than these two broad avenues of planning, you've got some sneakier options at hand. You could try to cook up ways to turn the environment against your foe, such as by figuring out a way to cause a cave-in or landslide that might hit the dragon. I think Gorx can cast soften earth and stone, so it's at least a plausible approach. But all of the problems associated with the idea of fighting inside the lair are applicable to such a stratagem, except that they are magnified because of its specificity: it would require you to find a PERFECT spot.
On the other side, you could try to figure out some way to knock the dragon out of the sky. That would be extremely difficult, I think, but I am not prepared to rule it out; it's less difficult for smaller fliers than for larger ones. Flying creatures with average maneuverability or worse have a "stall" speed, usually half their rated flight speed. If something prevents them from moving at least that fast, they lose lift and begin to fall, dropping 150 ft. If the ground is at least that close, they take falling damage proportional to their altitude. Otherwise they get a Reflex save to pull out of the stall; if it fails, then they fall 300 more feet that round, and the save repeats until they hit the ground or pull up.
The Core rules for aerial movement are sketchy beyond this, however; there isn't much in the way of defined mechanics to determine what, if anything, might prevent a flying creature from moving fast enough to prevent a stall. However, WotC has published non-core guidance on this score. See: http://archive.wizards.com/default.asp?x=dnd/rg/20040706a, all of which I think was later absorbed into the Rules Compendium. The punchline is that if you can figure out some way of executing an aerial bull rush, trip, or similar effect that would check a flying creature's forward movement, WotC unofficially suggests treating that as a stall.
Obviously, if you could make it happen, this would be fantastic from your perspective because it has some potential to inflict damage in addition to grounding the dragon.
Less exotically, Gorx is capable of casting resist energy as a shaman, so if you can obtain scrolls of that spell, you at least have a fix for the dragon's breath weapon.
We've bungled a number of Knowledge(Arcana) rolls to know useful things about the Dragon. Is it safe to say that we know everything from this post?
The rangers should also manage protection spells as well, right? I think 4th level can cast 1st level ranger spells.
Cronono wrote:
By virtue of Zathrus's result on his K: Arcana check, you guys know all of the information provided at http://www.d20srd.org/srd/typesSubtypes.htm#dragonType. Additionally, you're aware that most dragons are smarter than a brute animal (smart enough to talk), and that some dragons, especially 'true' dragons, are considerably smarter than that. See https://www.dndarchive.com/comment/30070#comment-30070 for the particulars of what Zathrus knows.
Additionally, you know that most dragons have breath weapons that deal some sort of supernatural injury; classically they breathe fire, but Zathrus is sort of vaguely aware that some dragons may breathe other things, and you know that the specific one that you'll have to deal with is capable of flight—you have eyewitness accounts to verify that. You know that this one is white in color and was big enough to carry off livestock (I don't think Lwazi specified what, but the vast majority of the hobgoblin herds and flocks are goats, sheep, and ponies rather than beeves or horses), which is at least useful in making sure you get the right one.
You specifically do NOT know anything regarding the specifics of true dragons in general, except that they tend to grow in cunning and power as they age. And you know nothing of the specific powers and vulnerabilities of white dragons. And although I haven't spelled it out, Pradha, Ganbataar, and Lwazi aren't in possession of this knowledge, either, or they would have told you. As may be indicated by his dragonhide armor, Lwazi has some prior experience with dragons, but he's not really an expert on their habits and capabilities.
None of this would prevent you from seeking advice from other NPCs if you were so inclined, however. There are around three thousand goblinoids in the Great Horde, so it's entirely possible that someone, somewhere, may be able to tell you more.
Oh. Also, you know that dragons have a strong, almost universal tendency to establish and defend a territory, and to reside in a lair of some kind.
As far as my post regarding tactics goes, I think that its contents are not really knowledge about dragons, so much as it's reasoning that follows from what you know about dragons. I don't think any of it is beyond what your characters could work out for themselves if they chatted about the task at hand with relationship to what they know about their own capabilities.
Grimvaalk can cast 1st-level ranger spells, yes. As I recall, his Wisdom score is sufficient to allow him a bonus spell of first level, and he's a rng 4, so he gets "0" 1st-level spells, plus the bonus; this means he can cast spells. Fanax is not currently able to cast spells.
Fanax could use a wand of any spell that appears on the ranger's class spell list, but until he actually has a caster level, he cannot use scrolls. Grimvaalk can use divine scrolls of spells from the ranger list.
I assume it was stated at some point, but I can't remember if we're using Psionics is Magic or Psionics Is Different. Can you clarify, Talanall?
We use the Psionics-Magic Transparency rules from http://www.d20srd.org/srd/psionic/psionicPowersOverview.htm#combiningPsionicAndMagicalEffects et sequelæ. There's a degree of interchangeability, but it's not total. In particular, it's important to remember that Psicraft and Knowledge (psionics) are scoped to allow characters to understand psionic effects, and Spellcraft and Knowledge (arcana) for magical effects.
Additionally, it's wise to keep in mind that http://www.d20srd.org/srd/psionic/psionicPowersOverview.htm#disciplineSubdiscipline includes further, discipline-specific information regarding psi/magic transparency.
In general psionics are rarer than magic in Tolrea, although I think Cataclysm has already made it clear that Zathrus isn't the only psionic character running around. They're common enough that I'm sure Zathrus has met others than his own teacher, but rare enough that many psionic talents never bump into another. By contrast, a wizard, sorcerer or other Core spellcaster is virtually certain to know other people who can do the same things as they can, in the same ways they would do them.
Heard. Thank you muchly.
Okay, last call if you're adding/deleting gear. If you haven't already, please also paste your character sheet into the thread reserved for that purpose.
We'll move on once I have the most up-to-day version of @Cronono's character sheet in https://www.dndarchive.com/forums/immigrant-song/character-sheets. Please be patient; we had some last-minute gear purchases.
I'm the worst, sorry.
Oh, no. Not even close.
The worst was Min_Max.
OMG that guy was the worst. Way more than anyone really knew. Well, Tal knew how bad he really was, but if anyone really knew about all the childish, asinine, PM's he sent Tal bitching about being treated like the little shit he was, then you'd REALLY know how bad he was.
By the way Tal, I guess now is a good time to tell you that while searching the PM XML files we created I found Min_Max's PMs and realized he was even worse than I thought. He complained about Alannah in them, which is why the keyword search brought them up in my queue to review. That was when I was looking for the lost details of her back story. Man that guy was the worst.
Yeah. Also there was the time I caught him cheating.
On the bright side, Sighild's reaction when I killed his character to remove him from the Aureshan Saints campaign was absolutely priceless, and remains one of my favorite In Character moments ever.
Suffice it to say that a little waiting on a character sheet doesn't even register as a blip on my radar, @Cronono. You're in the clear, I promise you.
Azov shoulders past the stragglers waiting to escape from the Sloop, looking for a hole in the sea of bodies and holding his staff out before him to clear the way. When he sees Sighild over Mandy's body, his face drops.
"Gods, what happened here?" The half-orc approaches, stopping well outside the expanding pool of blood, not wanting to get any on his shoes.
Looking up at Azov when he speaks, Sig says without missing a beat, "Spider bite. BIG ONE." She holds her arms wide to indicate just how big of a spider it was. "Just came out o' no where and bit the shit out of him. Don't know what Mandy did to piss off the spider gods, but that damn thing was on a kill mission." Looking down at the carnage, she adds, "It weren't no normal spider."
"It's gone, then?" asks Skunk from the doorway.
Sig shrugs at the question, but the tight grip on her ax tells the cleric she's still leaning toward "no" rather than "yes".
What did I just read there?
Min_Max could catch fire and die screaming in front of his entire family and I'd only feel relief that we're all one car length ahead in traffic tomorrow.
That escalated quickly.


text:
{% extends "dashboard/home.html" %}
{% block title %}Registration — WSGC{% endblock %}
{% block content %}

Success

        Thank you for updating your profile with the WSGC.
        Your registration is complete.

{% endblock %}


text:
Enter to win tickets to Disney On Ice presents Frozen & Encanto
Enter To Win Tickets To Nickelback: Get Rollin' Tour
Enter To Win Tickets To Stevie Nicks
Mel B Talks Competing on FOX's 'Special Forces', Her New Royal Title & More
Spice Girl and friend of the show Mel B zoomed in today to talk about competing on the new FOX reality show 'Special Forces'! Mel B and a ton of other celebrities compete in some of the toughest work outs, events and challenges that only the US Special Forces face! Mel was eliminated from the show recently but you can still catch new episodes of The World's Toughest Test Wednesday nights on FOX at 9/8c! Mel also talked about a few other projects in the worlds, motherhood and her new Royal title she recently received! Check out the full interview below and some clips of Mel competing on 'Special Forces'!