Add GE limits to Grand Exchange Plugin Search

Fixes #4533
This commit is contained in:
Alessio
2018-08-14 16:39:29 -04:00
committed by Tomas Slusny
parent 2a81f11770
commit eab5848ab7
8 changed files with 881 additions and 28 deletions

View File

@@ -63,4 +63,15 @@ public interface GrandExchangeConfig extends Config
{ {
return false; return false;
} }
@ConfigItem(
position = 4,
keyName = "enableGeLimits",
name = "Enable GE Limits on GE",
description = "Shows the GE Limits on the GE"
)
default boolean enableGELimits()
{
return true;
}
} }

View File

@@ -33,11 +33,14 @@ import java.awt.Dimension;
import java.awt.GridLayout; import java.awt.GridLayout;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder; import javax.swing.border.EmptyBorder;
import net.runelite.client.ui.ColorScheme;
import net.runelite.client.game.AsyncBufferedImage; import net.runelite.client.game.AsyncBufferedImage;
import net.runelite.client.ui.ColorScheme;
import net.runelite.client.util.LinkBrowser; import net.runelite.client.util.LinkBrowser;
import net.runelite.client.util.StackFormatter; import net.runelite.client.util.StackFormatter;
@@ -50,7 +53,7 @@ class GrandExchangeItemPanel extends JPanel
private static final Dimension ICON_SIZE = new Dimension(32, 32); private static final Dimension ICON_SIZE = new Dimension(32, 32);
GrandExchangeItemPanel(AsyncBufferedImage icon, String name, int itemID, int gePrice, Double GrandExchangeItemPanel(AsyncBufferedImage icon, String name, int itemID, int gePrice, Double
haPrice) haPrice, int geItemLimit)
{ {
BorderLayout layout = new BorderLayout(); BorderLayout layout = new BorderLayout();
layout.setHgap(5); layout.setHgap(5);
@@ -59,16 +62,17 @@ class GrandExchangeItemPanel extends JPanel
setBackground(ColorScheme.MEDIUM_GRAY_COLOR); setBackground(ColorScheme.MEDIUM_GRAY_COLOR);
Color background = getBackground(); Color background = getBackground();
List<JPanel> panels = new ArrayList();
panels.add(this);
addMouseListener(new MouseAdapter() MouseAdapter itemPanelMouseListener = new MouseAdapter()
{ {
@Override @Override
public void mouseEntered(MouseEvent e) public void mouseEntered(MouseEvent e)
{ {
setBackground(background.brighter()); for (JPanel panel : panels)
for (Component component : getComponents())
{ {
component.setBackground(component.getBackground().brighter()); matchComponentBackground(panel, background.brighter());
} }
setCursor(new Cursor(Cursor.HAND_CURSOR)); setCursor(new Cursor(Cursor.HAND_CURSOR));
} }
@@ -76,10 +80,9 @@ class GrandExchangeItemPanel extends JPanel
@Override @Override
public void mouseExited(MouseEvent e) public void mouseExited(MouseEvent e)
{ {
setBackground(background); for (JPanel panel : panels)
for (Component component : getComponents())
{ {
component.setBackground(background); matchComponentBackground(panel, background);
} }
setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
} }
@@ -89,7 +92,9 @@ class GrandExchangeItemPanel extends JPanel
{ {
geLink(name, itemID); geLink(name, itemID);
} }
}); };
addMouseListener(itemPanelMouseListener);
setBorder(new EmptyBorder(5, 5, 5, 0)); setBorder(new EmptyBorder(5, 5, 5, 0));
@@ -104,7 +109,8 @@ class GrandExchangeItemPanel extends JPanel
// Item details panel // Item details panel
JPanel rightPanel = new JPanel(new GridLayout(3, 1)); JPanel rightPanel = new JPanel(new GridLayout(3, 1));
rightPanel.setBackground(ColorScheme.MEDIUM_GRAY_COLOR); panels.add(rightPanel);
rightPanel.setBackground(background);
// Item name // Item name
JLabel itemName = new JLabel(); JLabel itemName = new JLabel();
@@ -127,15 +133,38 @@ class GrandExchangeItemPanel extends JPanel
gePriceLabel.setForeground(ColorScheme.GRAND_EXCHANGE_PRICE); gePriceLabel.setForeground(ColorScheme.GRAND_EXCHANGE_PRICE);
rightPanel.add(gePriceLabel); rightPanel.add(gePriceLabel);
JPanel alchAndLimitPanel = new JPanel(new BorderLayout());
panels.add(alchAndLimitPanel);
alchAndLimitPanel.setBackground(background);
// Alch price // Alch price
JLabel haPriceLabel = new JLabel(); JLabel haPriceLabel = new JLabel();
haPriceLabel.setText(StackFormatter.formatNumber(haPrice.intValue()) + " alch"); haPriceLabel.setText(StackFormatter.formatNumber(haPrice.intValue()) + " alch");
haPriceLabel.setForeground(ColorScheme.GRAND_EXCHANGE_ALCH); haPriceLabel.setForeground(ColorScheme.GRAND_EXCHANGE_ALCH);
rightPanel.add(haPriceLabel); alchAndLimitPanel.add(haPriceLabel, BorderLayout.WEST);
// GE Limit
JLabel geLimitLabel = new JLabel();
String limitLabelText = geItemLimit == 0 ? "" : "Limit " + StackFormatter.formatNumber(geItemLimit);
geLimitLabel.setText(limitLabelText);
geLimitLabel.setForeground(ColorScheme.GRAND_EXCHANGE_LIMIT);
geLimitLabel.setBorder(new CompoundBorder(geLimitLabel.getBorder(), new EmptyBorder(0, 0, 0, 7)));
alchAndLimitPanel.add(geLimitLabel, BorderLayout.EAST);
rightPanel.add(alchAndLimitPanel);
add(rightPanel, BorderLayout.CENTER); add(rightPanel, BorderLayout.CENTER);
} }
private void matchComponentBackground(JPanel panel, Color color)
{
panel.setBackground(color);
for (Component c : panel.getComponents())
{
c.setBackground(color);
}
}
private void geLink(String name, int itemID) private void geLink(String name, int itemID)
{ {
final String url = "http://services.runescape.com/m=itemdb_oldschool/" final String url = "http://services.runescape.com/m=itemdb_oldschool/"

View File

@@ -24,10 +24,10 @@
*/ */
package net.runelite.client.plugins.grandexchange; package net.runelite.client.plugins.grandexchange;
import lombok.Data; import lombok.Value;
import net.runelite.client.game.AsyncBufferedImage; import net.runelite.client.game.AsyncBufferedImage;
@Data @Value
public class GrandExchangeItems public class GrandExchangeItems
{ {
private final AsyncBufferedImage icon; private final AsyncBufferedImage icon;
@@ -35,13 +35,5 @@ public class GrandExchangeItems
private final int itemId; private final int itemId;
private final int gePrice; private final int gePrice;
private final double haPrice; private final double haPrice;
private final int geItemLimit;
GrandExchangeItems(AsyncBufferedImage icon, String name, int itemId, int gePrice, double haPrice)
{
this.icon = icon;
this.name = name;
this.itemId = itemId;
this.gePrice = gePrice;
this.haPrice = haPrice;
}
} }

View File

@@ -27,6 +27,7 @@
package net.runelite.client.plugins.grandexchange; package net.runelite.client.plugins.grandexchange;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import javax.inject.Inject; import javax.inject.Inject;
import javax.swing.JPanel; import javax.swing.JPanel;
@@ -90,4 +91,9 @@ class GrandExchangePanel extends PluginPanel
tabGroup.select(searchTab); tabGroup.select(searchTab);
revalidate(); revalidate();
} }
void setGELimits(Map<Integer, Integer> itemGELimits)
{
searchPanel.setItemGELimits(itemGELimits);
}
} }

View File

@@ -28,9 +28,14 @@
package net.runelite.client.plugins.grandexchange; package net.runelite.client.plugins.grandexchange;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.inject.Provides; import com.google.inject.Provides;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import javax.inject.Inject; import javax.inject.Inject;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
@@ -84,6 +89,12 @@ public class GrandExchangePlugin extends Plugin
private static final GrandExchangeClient CLIENT = new GrandExchangeClient(); private static final GrandExchangeClient CLIENT = new GrandExchangeClient();
private static final String OSB_GE_TEXT = "<br>OSBuddy Actively traded price: "; private static final String OSB_GE_TEXT = "<br>OSBuddy Actively traded price: ";
private static final String BUY_LIMIT_GE_TEXT = "<br>Buy limit: ";
private static final Gson GSON = new Gson();
private static final TypeToken<Map<Integer, Integer>> BUY_LIMIT_TOKEN = new TypeToken<Map<Integer, Integer>>()
{
};
static final String SEARCH_GRAND_EXCHANGE = "Search Grand Exchange"; static final String SEARCH_GRAND_EXCHANGE = "Search Grand Exchange";
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@@ -125,6 +136,7 @@ public class GrandExchangePlugin extends Plugin
private Widget grandExchangeText; private Widget grandExchangeText;
private Widget grandExchangeItem; private Widget grandExchangeItem;
private Map<Integer, Integer> itemGELimits;
@Provides @Provides
GrandExchangeConfig provideConfig(ConfigManager configManager) GrandExchangeConfig provideConfig(ConfigManager configManager)
@@ -135,7 +147,9 @@ public class GrandExchangePlugin extends Plugin
@Override @Override
protected void startUp() protected void startUp()
{ {
itemGELimits = loadGELimits();
panel = injector.getInstance(GrandExchangePanel.class); panel = injector.getInstance(GrandExchangePanel.class);
panel.setGELimits(itemGELimits);
final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "ge_icon.png"); final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "ge_icon.png");
@@ -163,6 +177,7 @@ public class GrandExchangePlugin extends Plugin
keyManager.unregisterKeyListener(inputListener); keyManager.unregisterKeyListener(inputListener);
grandExchangeText = null; grandExchangeText = null;
grandExchangeItem = null; grandExchangeItem = null;
itemGELimits = null;
} }
@Subscribe @Subscribe
@@ -301,6 +316,18 @@ public class GrandExchangePlugin extends Plugin
return; return;
} }
if (config.enableGELimits() && itemGELimits != null && !geTextString.contains(BUY_LIMIT_GE_TEXT))
{
final Integer itemLimit = itemGELimits.get(itemId);
// If we have item buy limit, append it
if (itemLimit != null)
{
final String text = geText.getText() + BUY_LIMIT_GE_TEXT + StackFormatter.formatNumber(itemLimit);
geText.setText(text);
}
}
if (!config.enableOsbPrices() || geTextString.contains(OSB_GE_TEXT)) if (!config.enableOsbPrices() || geTextString.contains(OSB_GE_TEXT))
{ {
// OSB prices are disabled or price was already looked up, so no need to set it again // OSB prices are disabled or price was already looked up, so no need to set it again
@@ -323,4 +350,12 @@ public class GrandExchangePlugin extends Plugin
} }
}); });
} }
private static Map<Integer, Integer> loadGELimits()
{
final InputStream geLimitData = GrandExchangePlugin.class.getResourceAsStream("ge_limits.json");
final Map<Integer, Integer> itemGELimits = GSON.fromJson(new InputStreamReader(geLimitData), BUY_LIMIT_TOKEN.getType());
log.debug("Loaded {} limits", itemGELimits.size());
return itemGELimits;
}
} }

View File

@@ -32,13 +32,16 @@ import java.awt.Dimension;
import java.awt.GridBagConstraints; import java.awt.GridBagConstraints;
import java.awt.GridBagLayout; import java.awt.GridBagLayout;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder; import javax.swing.border.EmptyBorder;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.ItemComposition; import net.runelite.api.ItemComposition;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
@@ -92,6 +95,9 @@ class GrandExchangeSearchPanel extends JPanel
private List<GrandExchangeItems> itemsList = new ArrayList<>(); private List<GrandExchangeItems> itemsList = new ArrayList<>();
@Setter
private Map<Integer, Integer> itemGELimits = Collections.emptyMap();
static static
{ {
SEARCH_ICON = new ImageIcon(ImageUtil.alphaOffset(ImageUtil.grayscaleOffset(ImageUtil.getResourceStreamFromClass(IconTextField.class, "search.png"), 0f), 1.75f)); SEARCH_ICON = new ImageIcon(ImageUtil.alphaOffset(ImageUtil.grayscaleOffset(ImageUtil.getResourceStreamFromClass(IconTextField.class, "search.png"), 0f), 1.75f));
@@ -222,9 +228,10 @@ class GrandExchangeSearchPanel extends JPanel
} }
int itemPrice = itemManager.getItemPrice(itemId); int itemPrice = itemManager.getItemPrice(itemId);
int itemLimit = itemGELimits.getOrDefault(itemId, 0);
AsyncBufferedImage itemImage = itemManager.getImage(itemId); AsyncBufferedImage itemImage = itemManager.getImage(itemId);
itemsList.add(new GrandExchangeItems(itemImage, item.getName(), itemId, itemPrice, itemComp.getPrice() * 0.6)); itemsList.add(new GrandExchangeItems(itemImage, item.getName(), itemId, itemPrice, itemComp.getPrice() * 0.6, itemLimit));
// If using hotkey to lookup item, stop after finding match. // If using hotkey to lookup item, stop after finding match.
if (exactMatch && item.getName().equalsIgnoreCase(lookup)) if (exactMatch && item.getName().equalsIgnoreCase(lookup))
@@ -246,7 +253,7 @@ class GrandExchangeSearchPanel extends JPanel
for (GrandExchangeItems item : itemsList) for (GrandExchangeItems item : itemsList)
{ {
GrandExchangeItemPanel panel = new GrandExchangeItemPanel(item.getIcon(), item.getName(), GrandExchangeItemPanel panel = new GrandExchangeItemPanel(item.getIcon(), item.getName(),
item.getItemId(), item.getGePrice(), item.getHaPrice()); item.getItemId(), item.getGePrice(), item.getHaPrice(), item.getGeItemLimit());
/* /*
Add the first item directly, wrap the rest with margin. This margin hack is because Add the first item directly, wrap the rest with margin. This margin hack is because

View File

@@ -42,7 +42,7 @@ public class ColorScheme
public static final Color MEDIUM_GRAY_COLOR = new Color(77, 77, 77); public static final Color MEDIUM_GRAY_COLOR = new Color(77, 77, 77);
public static final Color LIGHT_GRAY_COLOR = new Color(165, 165, 165); public static final Color LIGHT_GRAY_COLOR = new Color(165, 165, 165);
public static final Color DARKER_GRAY_HOVER_COLOR = new Color(60, 60 , 60); public static final Color DARKER_GRAY_HOVER_COLOR = new Color(60, 60, 60);
public static final Color DARK_GRAY_HOVER_COLOR = new Color(35, 35, 35); public static final Color DARK_GRAY_HOVER_COLOR = new Color(35, 35, 35);
/* The color for the green progress bar (used in ge offers, farming tracker, etc)*/ /* The color for the green progress bar (used in ge offers, farming tracker, etc)*/
@@ -60,6 +60,10 @@ public class ColorScheme
/* The color for the high alch indicator in the ge search results */ /* The color for the high alch indicator in the ge search results */
public static final Color GRAND_EXCHANGE_ALCH = new Color(240, 207, 123); public static final Color GRAND_EXCHANGE_ALCH = new Color(240, 207, 123);
/* The color for the limit indicator in the ge search results */
public static final Color GRAND_EXCHANGE_LIMIT = new Color(50, 160, 250);
/* The background color of the scrollbar's track */ /* The background color of the scrollbar's track */
public static final Color SCROLL_TRACK_COLOR = new Color(25, 25, 25); public static final Color SCROLL_TRACK_COLOR = new Color(25, 25, 25);
} }

View File

@@ -0,0 +1,769 @@
{
"2": 7000,
"41": 10000,
"43": 10000,
"44": 10000,
"45": 11000,
"52": 7000,
"53": 7000,
"62": 10000,
"64": 10000,
"66": 10000,
"68": 10000,
"70": 10000,
"103": 10000,
"105": 10000,
"107": 10000,
"199": 11000,
"201": 11000,
"203": 11000,
"205": 11000,
"207": 11000,
"209": 11000,
"211": 11000,
"213": 11000,
"215": 11000,
"217": 11000,
"219": 11000,
"221": 13000,
"225": 13000,
"227": 13000,
"229": 13000,
"231": 13000,
"239": 13000,
"245": 10000,
"249": 11000,
"251": 11000,
"253": 13000,
"255": 12000,
"257": 12000,
"259": 2000,
"261": 2000,
"263": 13000,
"265": 2000,
"267": 2000,
"269": 2000,
"288": 15,
"313": 8000,
"314": 13000,
"315": 15000,
"331": 15000,
"359": 15000,
"361": 6000,
"371": 15000,
"373": 6000,
"377": 15000,
"379": 6000,
"383": 15000,
"385": 10000,
"401": 13000,
"434": 13000,
"436": 13000,
"438": 13000,
"440": 13000,
"442": 13000,
"444": 13000,
"447": 13000,
"449": 4500,
"451": 4500,
"453": 13000,
"526": 7500,
"532": 3000,
"536": 7500,
"542": 125,
"544": 125,
"554": 20000,
"555": 20000,
"556": 20000,
"557": 20000,
"558": 12000,
"559": 12000,
"560": 10000,
"561": 12000,
"562": 12000,
"563": 12000,
"564": 12000,
"565": 10000,
"566": 10000,
"567": 10000,
"573": 10000,
"577": 250,
"581": 125,
"590": 40,
"592": 13000,
"753": 15,
"805": 70,
"806": 7000,
"807": 7000,
"808": 7000,
"809": 7000,
"810": 11000,
"811": 7000,
"819": 13000,
"822": 13000,
"823": 11000,
"824": 11000,
"829": 11000,
"830": 11000,
"839": 14000,
"845": 14000,
"847": 14000,
"851": 14000,
"855": 18000,
"857": 125,
"859": 18000,
"863": 7000,
"865": 7000,
"866": 7000,
"868": 7000,
"882": 7000,
"884": 7000,
"886": 7000,
"888": 7000,
"890": 11000,
"892": 11000,
"950": 18000,
"954": 250,
"960": 13000,
"962": 50,
"981": 5,
"985": 11000,
"987": 11000,
"1038": 15,
"1040": 15,
"1042": 15,
"1044": 15,
"1046": 15,
"1048": 15,
"1050": 5,
"1059": 125,
"1063": 125,
"1065": 125,
"1067": 125,
"1069": 125,
"1071": 125,
"1073": 125,
"1079": 70,
"1085": 125,
"1087": 125,
"1091": 125,
"1093": 70,
"1095": 125,
"1099": 125,
"1105": 125,
"1109": 100,
"1113": 70,
"1115": 125,
"1119": 125,
"1121": 125,
"1123": 125,
"1127": 70,
"1129": 125,
"1131": 125,
"1135": 125,
"1143": 125,
"1145": 125,
"1147": 70,
"1149": 8,
"1159": 125,
"1161": 125,
"1163": 70,
"1167": 125,
"1169": 125,
"1171": 125,
"1185": 70,
"1193": 125,
"1197": 125,
"1199": 125,
"1201": 70,
"1207": 125,
"1213": 70,
"1215": 70,
"1243": 125,
"1247": 70,
"1249": 70,
"1265": 40,
"1267": 40,
"1269": 40,
"1271": 40,
"1273": 40,
"1275": 40,
"1289": 70,
"1295": 125,
"1303": 70,
"1305": 70,
"1307": 125,
"1309": 125,
"1315": 125,
"1319": 70,
"1325": 125,
"1329": 125,
"1333": 70,
"1339": 125,
"1343": 125,
"1347": 70,
"1349": 40,
"1351": 40,
"1353": 40,
"1355": 40,
"1357": 40,
"1359": 40,
"1361": 40,
"1369": 125,
"1371": 125,
"1373": 70,
"1377": 70,
"1379": 125,
"1391": 11000,
"1393": 500,
"1395": 14000,
"1397": 14000,
"1399": 500,
"1432": 70,
"1434": 70,
"1464": 14000,
"1478": 5,
"1511": 14000,
"1513": 12000,
"1515": 12000,
"1517": 15000,
"1519": 15000,
"1521": 14000,
"1607": 13000,
"1609": 10000,
"1617": 10000,
"1619": 10000,
"1621": 10000,
"1623": 10000,
"1637": 10000,
"1649": 10000,
"1673": 18000,
"1704": 10000,
"1725": 125,
"1731": 125,
"1734": 7000,
"1739": 10000,
"1741": 13000,
"1743": 10000,
"1745": 13000,
"1747": 10000,
"1749": 10000,
"1751": 13000,
"1753": 13000,
"1759": 13000,
"1761": 13000,
"1771": 150,
"1775": 13000,
"1777": 13000,
"1779": 13000,
"1781": 13000,
"1783": 13000,
"1785": 40,
"1925": 13000,
"1927": 13000,
"1931": 13000,
"1935": 13000,
"1937": 13000,
"1939": 13000,
"1949": 150,
"1961": 50,
"1965": 6000,
"1967": 6000,
"1973": 13000,
"1975": 13000,
"1987": 13000,
"1993": 6000,
"2003": 10000,
"2114": 13000,
"2132": 13000,
"2309": 6000,
"2313": 50,
"2347": 40,
"2351": 10000,
"2353": 10000,
"2355": 10000,
"2357": 10000,
"2359": 10000,
"2361": 10000,
"2389": 13000,
"2390": 13000,
"2422": 15,
"2481": 2000,
"2483": 10000,
"2485": 11000,
"2487": 125,
"2489": 70,
"2493": 125,
"2495": 70,
"2497": 70,
"2499": 125,
"2501": 70,
"2503": 70,
"2505": 13000,
"2509": 11000,
"2511": 14000,
"2513": 70,
"2530": 7500,
"2550": 10000,
"2577": 6,
"2581": 8,
"2621": 8,
"2864": 5000,
"2961": 15,
"2970": 13000,
"2998": 12000,
"3000": 2000,
"3049": 11000,
"3051": 11000,
"3053": 8,
"3054": 8,
"3099": 125,
"3101": 70,
"3105": 20,
"3140": 70,
"3142": 12500,
"3144": 10000,
"3147": 10000,
"3187": 7500,
"3190": 15,
"3202": 70,
"3204": 70,
"3385": 70,
"3387": 70,
"3389": 70,
"3391": 70,
"3393": 70,
"3481": 8,
"3483": 8,
"3749": 70,
"3751": 70,
"3753": 70,
"4087": 70,
"4089": 125,
"4091": 125,
"4093": 125,
"4131": 70,
"4151": 10,
"4153": 70,
"4178": 10,
"4180": 70,
"4287": 13000,
"4498": 250,
"4544": null,
"4561": 10000,
"4585": 70,
"4587": 70,
"4694": 12000,
"4695": 12000,
"4696": 12000,
"4697": 12000,
"4698": 12000,
"4699": 12000,
"4712": 15,
"4740": 11000,
"5100": 600,
"5288": 200,
"5289": 200,
"5295": 200,
"5296": 600,
"5300": 200,
"5312": 200,
"5313": 200,
"5314": 200,
"5316": 200,
"5320": 600,
"5321": 200,
"5331": 40,
"5333": 40,
"5334": 40,
"5335": 40,
"5336": 40,
"5337": 40,
"5338": 40,
"5339": 40,
"5340": 40,
"5354": 600,
"5374": 200,
"5502": 200,
"5982": 11000,
"6032": 600,
"6034": 600,
"6306": 18000,
"6313": 15,
"6319": 100,
"6322": 125,
"6324": 125,
"6328": 100,
"6332": 11000,
"6422": 20000,
"6424": 20000,
"6426": 20000,
"6428": 20000,
"6430": 12000,
"6432": 10000,
"6434": 12000,
"6436": 12000,
"6438": 12000,
"6568": 70,
"6571": 11000,
"6573": 11000,
"6583": 8,
"6585": 8,
"6693": 11000,
"6724": 8,
"6729": 7500,
"6731": 8,
"6733": 6,
"6735": 8,
"6737": 8,
"6739": 40,
"6797": 40,
"6812": 7500,
"6889": 15,
"6894": 125,
"6895": 125,
"6897": 70,
"6918": 10,
"6920": 24,
"6924": 10,
"6967": 8,
"6969": 10000,
"7147": 7000,
"7155": 250,
"7156": 40,
"7158": 8,
"7198": 10000,
"7200": 10000,
"7416": 50,
"7418": 50,
"7552": 7000,
"7554": 20000,
"7556": 20000,
"7558": 20000,
"7560": 12000,
"7676": 125,
"7928": 50,
"7929": 50,
"7930": 50,
"7931": 50,
"7932": 50,
"7933": 50,
"7936": 20000,
"7944": 13000,
"7946": 13000,
"8007": 10000,
"8008": 10000,
"8009": 10000,
"8010": 10000,
"8011": 10000,
"8012": 10000,
"8013": 10000,
"8283": 10000,
"8714": 70,
"8716": 70,
"8718": 70,
"8720": 70,
"8722": 70,
"8724": 70,
"8726": 70,
"8728": 70,
"8730": 70,
"8732": 70,
"8734": 70,
"8736": 70,
"8738": 70,
"8740": 70,
"8742": 70,
"8744": 70,
"8746": 125,
"8748": 125,
"8750": 125,
"8752": 125,
"8754": 125,
"8756": 125,
"8758": 125,
"8760": 125,
"8762": 125,
"8764": 125,
"8766": 125,
"8768": 125,
"8770": 125,
"8772": 125,
"8774": 125,
"8776": 125,
"8778": 13000,
"8780": 13000,
"8782": 13000,
"8882": 13000,
"8986": 13000,
"9054": 15,
"9055": 15,
"9056": 15,
"9057": 15,
"9058": 15,
"9075": 10000,
"9086": 13000,
"9143": 11000,
"9144": 11000,
"9183": 70,
"9185": 70,
"9191": 11000,
"9192": 11000,
"9339": 11000,
"9342": 11000,
"9379": 13000,
"9380": 13000,
"9660": 13000,
"9691": 20000,
"9693": 20000,
"9695": 20000,
"9697": 12000,
"9699": 20000,
"9976": 7000,
"9977": 7000,
"10006": 250,
"10008": 250,
"10033": 7000,
"10034": 7000,
"10069": 125,
"10073": 125,
"10144": 7000,
"10145": 11000,
"10148": 125,
"10150": 40,
"10476": 10000,
"10601": 125,
"10606": 70,
"10636": 70,
"10663": 125,
"10696": 6,
"10782": 8,
"10796": 8,
"10828": 70,
"11027": 50,
"11028": 50,
"11029": 50,
"11030": 50,
"11037": 8,
"11046": 250,
"11068": 18000,
"11069": 18000,
"11088": 505,
"11133": 10,
"11212": 11000,
"11230": 11000,
"11235": 8,
"11248": 18000,
"11260": 13000,
"11283": 10,
"11284": 10,
"11286": 5,
"11335": 8,
"11371": 125,
"11377": 70,
"11686": 20000,
"11687": 20000,
"11688": 20000,
"11689": 20000,
"11690": 12000,
"11691": 12000,
"11692": 10000,
"11693": 12000,
"11694": 12000,
"11695": 12000,
"11696": 12000,
"11697": 10000,
"11698": 10000,
"11699": 10000,
"11700": 7000,
"11701": 7000,
"11702": 7000,
"11703": 7000,
"11712": 12000,
"11713": 10000,
"11714": 10000,
"11715": 20000,
"11717": 20000,
"11718": 20000,
"11719": 40,
"11720": 40,
"11721": 40,
"11787": 8,
"11789": 6,
"11791": 8,
"11802": 8,
"11804": 8,
"11806": 8,
"11808": 8,
"11824": 8,
"11826": 10,
"11828": 10,
"11830": 10,
"11832": 10,
"11834": 10,
"11836": 8,
"11838": 8,
"11840": 70,
"11875": 7000,
"11876": 7000,
"11889": 8,
"11902": 70,
"11905": 8,
"11920": 40,
"11924": 8,
"11926": 8,
"11940": 8000,
"11959": 6000,
"11972": 100,
"11994": 11000,
"12000": 6,
"12002": 5,
"12004": 70,
"12297": 40,
"12377": 3,
"12389": 70,
"12526": 4,
"12596": 4,
"12601": 8,
"12603": 8,
"12605": 8,
"12640": 11000,
"12746": 100,
"12765": 8,
"12766": 8,
"12767": 8,
"12768": 8,
"12769": 4,
"12771": 6,
"12795": 8,
"12796": 6,
"12797": 40,
"12806": 8,
"12807": 8,
"12817": 8,
"12821": 8,
"12829": 8,
"12831": 8,
"12833": 4,
"12848": 70,
"12877": 8,
"12913": 2000,
"12922": 5,
"12926": 8,
"12927": 5,
"12931": 8,
"12932": 10,
"12934": 30000,
"12938": 10000,
"13024": 8,
"13026": 8,
"13066": 2000,
"13227": 10,
"13229": 15,
"13231": 10,
"13235": 15,
"13237": 8,
"13239": 6,
"13263": 8,
"13265": 8,
"13385": 124,
"13387": 124,
"13391": 13000,
"13474": 3000,
"13475": 3000,
"13510": 9000,
"13511": 9000,
"13573": 13000,
"13576": 8,
"13652": 8,
"19478": 8,
"19481": 8,
"19484": 10000,
"19544": 8,
"19547": 8,
"19550": 8,
"19553": 8,
"19559": 8,
"19580": 10000,
"19582": 11000,
"19584": 7000,
"19669": 12000,
"19991": 4,
"19994": 8,
"20002": 5,
"20388": 11000,
"20389": 11000,
"20390": 10000,
"20401": 125,
"20402": 70,
"20405": 10,
"20406": 70,
"20407": 70,
"20408": 8,
"20415": 125,
"20416": 125,
"20417": 125,
"20418": 125,
"20421": 70,
"20422": 70,
"20423": 70,
"20424": 70,
"20425": 125,
"20426": 125,
"20428": 70,
"20429": 70,
"20547": 13000,
"20552": 70,
"20555": 70,
"20557": 70,
"20559": 8,
"20561": 125,
"20562": 125,
"20566": 70,
"20567": 70,
"20568": 70,
"20571": 70,
"20572": 70,
"20575": 10,
"20578": 20,
"20580": 100,
"20584": 5,
"20585": 125,
"20586": 10000,
"20587": 250,
"20593": 8,
"20598": 15,
"20600": 11000,
"20601": 8,
"20714": 15,
"20716": 15,
"20724": 8,
"20727": 70,
"20733": 6,
"20782": 8,
"20784": 8,
"20785": 8,
"21000": 8,
"21003": 8,
"21009": 8,
"21012": 8,
"21018": 8,
"21021": 8,
"21024": 8,
"21028": 5,
"21034": 8,
"21060": 8,
"21079": 8,
"21198": 8,
"21200": 8,
"21205": 8,
"21206": 8,
"21298": 10,
"21304": 70,
"21326": 11000,
"21338": 11000,
"21555": 18000,
"21622": 13000,
"21736": 8,
"21820": 30000
}