Guest User

Untitled

a guest
Aug 12th, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.15 KB | None | 0 0
  1. import java.awt.BasicStroke;
  2. import java.awt.Color;
  3. import java.awt.Container;
  4. import java.awt.Dimension;
  5. import java.awt.Font;
  6. import java.awt.Graphics;
  7. import java.awt.Graphics2D;
  8. import java.awt.Insets;
  9. import java.awt.Point;
  10. import java.awt.Rectangle;
  11. import java.awt.RenderingHints;
  12. import java.awt.event.ActionEvent;
  13. import java.awt.event.MouseEvent;
  14. import java.awt.event.MouseListener;
  15. import java.text.DecimalFormat;
  16. import java.util.ArrayList;
  17.  
  18. import javax.swing.DefaultComboBoxModel;
  19. import javax.swing.JButton;
  20. import javax.swing.JCheckBox;
  21. import javax.swing.JComboBox;
  22. import javax.swing.JFrame;
  23. import javax.swing.JLabel;
  24. import javax.swing.JOptionPane;
  25. import javax.swing.JPasswordField;
  26. import javax.swing.JScrollPane;
  27. import javax.swing.JSlider;
  28. import javax.swing.JTextField;
  29. import javax.swing.JTextPane;
  30. import javax.swing.SwingConstants;
  31. import javax.swing.SwingUtilities;
  32.  
  33. import scripts.Script;
  34. import scripts.ScriptManifest;
  35.  
  36. import com.bsbot.api.Calculations;
  37. import com.bsbot.api.TilePath;
  38. import com.bsbot.wrappers.RSGroundItem;
  39. import com.bsbot.wrappers.RSItem;
  40. import com.bsbot.wrappers.RSNPC;
  41. import com.bsbot.wrappers.RSTile;
  42.  
  43. @ScriptManifest(authors = { "Kenneh" }, name = "kennehfighter", version = 1, description = "Fights anything")
  44. public class AIOFighter extends Script implements MouseListener {
  45.  
  46. Calculations c;
  47. MousePaint mt = new MousePaint();
  48.  
  49. private RSTile startTile = null;
  50. private RSGroundItem loot = null;
  51.  
  52. private String foodName = "", PASS = "z", USER = "z";
  53.  
  54. private int startLvl = 0, startXp = 0, xpGained = 0, eatPercent = 50;
  55.  
  56. private long startTime = 0;
  57.  
  58. private boolean buryBones = false;
  59.  
  60. private int strXpS, defXpS, rngXpS, mageXpS, attXpS, strLvlS, defLvlS, rngLvlS, mageLvlS, attLvlS;
  61.  
  62. private final Color color1 = new Color(255, 255, 255), color2 = new Color(0, 0, 0), color3 = new Color(0, 0, 0, 145);
  63.  
  64. private final BasicStroke stroke1 = new BasicStroke(1);
  65.  
  66. private final Font font1 = new Font("Arial", 0, 9);
  67.  
  68. Rectangle rect = new Rectangle(456, 312, 59, 25);
  69.  
  70. ArrayList<String> npcList = new ArrayList<String>();
  71. ArrayList<String> lootList = new ArrayList<String>();
  72.  
  73. public String[] lootItems() {
  74. return lootList.toArray(new String[lootList.size()]);
  75. }
  76.  
  77. public String[] mobNames() {
  78. return npcList.toArray(new String[npcList.size()]);
  79. }
  80.  
  81. public void doLogin() {
  82. if (USER != null && PASS != null) {
  83. mouse.clickMouse(new Point(286, 191), true);
  84. keyboard.sendKeys(USER);
  85. sleep(500);
  86. mouse.clickMouse(new Point(286, 247), true);
  87. keyboard.sendKeys(PASS);
  88. sleep(7000);
  89. mouse.clickMouse(new Point(383, 341), true);
  90. sleep(2500);
  91. }
  92. return;
  93. }
  94.  
  95. public String getSkillName() {
  96. if(getSkill() == skills.STRENGTH) {
  97. return "Strength Lvl: ";
  98. }
  99. if(getSkill() == skills.DEFENSE) {
  100. return "Defense Lvl: ";
  101. }
  102. if(getSkill() == skills.RANGED) {
  103. return "Ranged Lvl: ";
  104. }
  105. if(getSkill() == skills.MAGIC){
  106. return "Magic Lvl: ";
  107. }
  108. if(getSkill() == skills.ATTACK){
  109. return "Attack Lvl: ";
  110. }
  111. return "NaN";
  112. }
  113.  
  114. public int getSkill() {
  115. int strXp = skills.getExperience(skills.STRENGTH);
  116. int defXp = skills.getExperience(skills.DEFENSE);
  117. int rngXp = skills.getExperience(skills.RANGED);
  118. int mageXp = skills.getExperience(skills.MAGIC);
  119. int attXp = skills.getExperience(skills.ATTACK);
  120.  
  121. if(strXp > strXpS) {
  122. startXp = strXpS;
  123. startLvl = strLvlS;
  124. return skills.STRENGTH;
  125. }
  126.  
  127. if(defXp > defXpS) {
  128. startXp = defXpS;
  129. startLvl = defLvlS;
  130. return skills.DEFENSE;
  131. }
  132.  
  133. if(rngXp > rngXpS) {
  134. startXp = rngXpS;
  135. startLvl = rngLvlS;
  136. return skills.RANGED;
  137. }
  138.  
  139. if(mageXp > mageXpS) {
  140. startXp = mageXpS;
  141. startLvl = mageLvlS;
  142. return skills.MAGIC;
  143. }
  144.  
  145. if(attXp > attXpS) {
  146. startXp = attXpS;
  147. startLvl = attLvlS;
  148. return skills.ATTACK;
  149. }
  150.  
  151. return 0;
  152. }
  153.  
  154. public enum State {
  155. Fight, Eat, Loot, Sleep, OpenCasket, Walkback, Bury,Login
  156. }
  157.  
  158. public State getStage() {
  159. if(isLoggedIn() && startTile == null){
  160. startTile = getMyPlayer().getLocation();
  161. }
  162. if(!isLoggedIn() && !USER.equals("z") && !PASS.equals("z")) {
  163. return State.Login;
  164. }
  165. if(Calculations.distanceBetween(getMyPlayer().getLocation(), startTile) > 15) {
  166. return State.Walkback;
  167. }
  168. if(inventory.containsItem("Casket")) {
  169. return State.OpenCasket;
  170. }
  171. if(buryBones && inventory.containsItem("Bones") || inventory.containsItem("Big bones") && inventory.isFull()) {
  172. return State.Bury;
  173. }
  174. if(getMyPlayer().getHpPercent() <= eatPercent) {
  175. return State.Eat;
  176. }
  177. for(String i : lootItems()) {
  178. loot = grounditems.getNearest(i);
  179. if(loot != null && !getMyPlayer().isInCombat()) {
  180. if(c.distanceTo(loot.getLocation()) <= 15) {
  181. return State.Loot;
  182. }
  183. }
  184. }
  185. if(getMyPlayer().getAnimation() == -1) {
  186. if(!getMyPlayer().isInCombat()) {
  187. if(getMyPlayer().getHpPercent() >= eatPercent) {
  188. return State.Fight;
  189. }
  190. }
  191. }
  192. return State.Sleep;
  193. }
  194.  
  195. @Override
  196. public int loop() {
  197. switch(getStage()) {
  198. case Fight:
  199. RSNPC mob = null;
  200. for(String i : mobNames()) {
  201. mob = getNearestNpc(i);
  202. }
  203. if(mob != null) {
  204. if(!mob.isInCombat()) {
  205. camera.turnTo(mob);
  206. if(mob.isOnScreen()) {
  207. mob.interact("Attack");
  208. return 500;
  209. }
  210. }
  211. }
  212. break;
  213. case Eat:
  214. if(inventory.containsItem(foodName)) {
  215. RSItem food = inventory.getItem(foodName);
  216. if(food != null) {
  217. food.interact("Eat");
  218. return 500;
  219. }
  220. } else {
  221. System.out.println("No food, stopping script!");
  222. stop();
  223. }
  224. break;
  225. case Walkback:
  226. TilePath a = createTilePath(startTile);
  227. a.traverse();
  228. break;
  229. case Loot:
  230. if(!inventory.isFull()) {
  231. TilePath i = createTilePath(loot.getLocation());
  232. if(Calculations.distanceBetween(getMyPlayer().getLocation(), loot.getLocation()) > 5) {
  233. i.traverse();
  234. }
  235. loot.interact("Take");
  236. return 500;
  237. } else {
  238. if(inventory.containsItem(foodName)) {
  239. RSItem food = inventory.getItem(foodName);
  240. if(food != null) {
  241. food.interact("Eat");
  242. return 500;
  243. }
  244. }
  245. }
  246. break;
  247. case OpenCasket:
  248. RSItem i = inventory.getItem("Casket");
  249. i.interact("Open");
  250. break;
  251. case Bury:
  252. RSItem[] i2 = inventory.getItems();
  253. for(RSItem i3 : i2) {
  254. if(i3.getName().toLowerCase().contains("bones")) {
  255. i3.interact("Bury");
  256. }
  257. }
  258. case Sleep:
  259. return 1000;
  260. }
  261. return 0;
  262. }
  263.  
  264. @Override
  265. public void onBegin() {
  266.  
  267. SwingUtilities.invokeLater(new Runnable() {
  268. @Override
  269. public void run() {
  270. afpGUI i = new afpGUI();
  271. i.setVisible(true);
  272. }
  273. });
  274.  
  275. startTime = System.currentTimeMillis();
  276.  
  277. strXpS = skills.getExperience(skills.STRENGTH);
  278. defXpS = skills.getExperience(skills.DEFENSE);
  279. rngXpS = skills.getExperience(skills.RANGED);
  280. mageXpS = skills.getExperience(skills.MAGIC);
  281. attXpS = skills.getExperience(skills.ATTACK);
  282.  
  283. strLvlS = skills.getLevel(skills.STRENGTH);
  284. defLvlS = skills.getLevel(skills.DEFENSE);
  285. rngLvlS = skills.getLevel(skills.RANGED);
  286. mageLvlS = skills.getLevel(skills.MAGIC);
  287. attLvlS = skills.getLevel(skills.ATTACK);
  288.  
  289. }
  290.  
  291. @Override
  292. public void onFinish() {
  293.  
  294. }
  295.  
  296. public String runtime(long start) {
  297. long millis = System.currentTimeMillis() - start;
  298. long hours = millis / (1000 * 60 * 60);
  299. millis -= hours * (1000 * 60 * 60);
  300. long minutes = millis / (1000 * 60);
  301. millis -= minutes * (1000 * 60);
  302. long seconds = millis / 1000;
  303. return "Time Running: "+ hours + ":" + minutes + ":" + seconds;
  304. }
  305.  
  306. public String formatNumber(int start) {
  307. DecimalFormat nf = new DecimalFormat("0.0");
  308. double i = start;
  309. if(i >= 1000000) {
  310. return nf.format((i / 1000000)) + "m";
  311. }
  312. if(i >= 1000) {
  313. return nf.format((i / 1000)) + "k";
  314. }
  315. return ""+start;
  316. }
  317.  
  318. public String perHour(int gained) {
  319. return formatNumber((int) ((gained) * 3600000D / (System.currentTimeMillis() - startTime)));
  320. }
  321.  
  322. public void drawCharInfo(Graphics g, int y, Graphics2D g1) {
  323. if(getMyPlayer() != null) {
  324. g.setColor(Color.WHITE);
  325. g.drawString("AIOFighter by Kenneh", 7, y);
  326. y = y + 15;
  327. g.drawString(runtime(startTime), 7, y);
  328. y = y + 15;
  329. g.drawString("State: " + getStage().toString(), 7, y);
  330. y = y + 15;
  331. g.drawString(getSkillName() + skills.getLevel(getSkill())+"(+"+(skills.getLevel(getSkill()) - startLvl) + ")",7 , y);
  332. y = y + 15;
  333. g.drawString("Exp /hr: " + perHour(xpGained) + "(+" + formatNumber(xpGained) + ")", 7, y);
  334. y = y + 15;
  335. y = y + 15;
  336. for(String i : mobNames()) {
  337. g.drawString("Fighting: " + i, 7, y);
  338. y = y + 15;
  339. }
  340. y = y + 15;
  341. for(String i : lootItems()) {
  342. g.drawString("Looting: " + i, 7, y);
  343. y = y + 15;
  344. }
  345. g.setColor(color3);
  346. g.fillRect(3, 35, 149, y - 30);
  347. g.setColor(color2);
  348. g1.setStroke(stroke1);
  349. g.drawRect(3, 35, 149, y - 30);
  350. }
  351. }
  352.  
  353. @Override
  354. public void paint(Graphics g) {
  355. Graphics2D g1 = (Graphics2D)g;
  356. g1.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
  357. g1.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
  358. xpGained = skills.getExperience(getSkill()) - startXp;
  359. drawCharInfo(g, 65, g1);
  360. g.setColor(color1);
  361. g.fillRect(456, 312, 59, 25);
  362. g.setColor(color2);
  363. g1.setStroke(stroke1);
  364. g.drawRect(456, 312, 59, 25);
  365. g.setFont(font1);
  366. g.drawString("Add loot", 468, 330);
  367. mt.add(mouse.getLocation());
  368. mt.drawCursor(g);
  369. mt.drawTrail(g);
  370. }
  371.  
  372. @Override
  373. public void mouseClicked(MouseEvent arg0) {
  374. Point p = arg0.getPoint();
  375. if(rect.contains(p)) {
  376. String loot1 = JOptionPane.showInputDialog(null, "Enter the items you want to loot seperated by a comma");
  377. String[] loot2 = loot1.split(",");
  378. for(String loot3:loot2) {
  379. lootList.add(loot3.trim());
  380. }
  381. }
  382. }
  383.  
  384. @Override
  385. public void mouseEntered(MouseEvent arg0) {
  386.  
  387. }
  388.  
  389. @Override
  390. public void mouseExited(MouseEvent arg0) {
  391.  
  392. }
  393.  
  394. @Override
  395. public void mousePressed(MouseEvent arg0) {
  396.  
  397. }
  398.  
  399. @Override
  400. public void mouseReleased(MouseEvent arg0) {
  401.  
  402. }
  403.  
  404. public class afpGUI extends JFrame {
  405. /**
  406. *
  407. */
  408. private static final long serialVersionUID = -5606088774883000944L;
  409. public afpGUI() {
  410. initComponents();
  411. }
  412.  
  413. @SuppressWarnings("deprecation")
  414. private void button1ActionPerformed(ActionEvent e) {
  415.  
  416. foodName = comboBox1.getSelectedItem().toString();
  417.  
  418. String loot1 = textPane2.getText();
  419. String[] loot2 = loot1.split(",");
  420. for(String loot3 : loot2) {
  421. lootList.add(loot3.trim());
  422. }
  423.  
  424. String npc1 = textPane1.getText();
  425. String[] npc2 = npc1.split(",");
  426. for(String npc3 : npc2) {
  427. npcList.add(npc3.trim());
  428. }
  429.  
  430. eatPercent = slider1.getValue();
  431.  
  432. buryBones = checkBox1.isSelected();
  433.  
  434. checkBox2.isSelected();
  435.  
  436. PASS = passwordField1.getText();
  437. USER = textField1.getText();
  438.  
  439. System.out.println("Food name: "+ foodName);
  440. System.out.println("Eat percent: " + eatPercent);
  441. System.out.println("Burying bones: " + buryBones);
  442.  
  443. dispose();
  444. }
  445.  
  446. private void initComponents() {
  447. label1 = new JLabel();
  448. scrollPane1 = new JScrollPane();
  449. textPane1 = new JTextPane();
  450. label2 = new JLabel();
  451. scrollPane2 = new JScrollPane();
  452. textPane2 = new JTextPane();
  453. button1 = new JButton();
  454. label3 = new JLabel();
  455. slider1 = new JSlider();
  456. label4 = new JLabel();
  457. comboBox1 = new JComboBox<Object>();
  458. checkBox1 = new JCheckBox();
  459. checkBox2 = new JCheckBox();
  460. label5 = new JLabel();
  461. textField1 = new JTextField();
  462. label6 = new JLabel();
  463. passwordField1 = new JPasswordField();
  464.  
  465. //======== this ========
  466. setTitle("AutoFighterPro GUI");
  467. setBackground(Color.black);
  468. Container contentPane = getContentPane();
  469. contentPane.setLayout(null);
  470.  
  471. //---- label1 ----
  472. label1.setText("Enter mob names");
  473. label1.setHorizontalAlignment(SwingConstants.CENTER);
  474. contentPane.add(label1);
  475. label1.setBounds(10, 10, 105, 15);
  476.  
  477. //======== scrollPane1 ========
  478. {
  479. scrollPane1.setViewportView(textPane1);
  480. }
  481. contentPane.add(scrollPane1);
  482. scrollPane1.setBounds(5, 25, 115, 50);
  483.  
  484. //---- label2 ----
  485. label2.setText("Enter loot names");
  486. label2.setHorizontalAlignment(SwingConstants.CENTER);
  487. contentPane.add(label2);
  488. label2.setBounds(145, 10, 99, label2.getPreferredSize().height);
  489.  
  490. //======== scrollPane2 ========
  491. {
  492. scrollPane2.setViewportView(textPane2);
  493. }
  494. contentPane.add(scrollPane2);
  495. scrollPane2.setBounds(140, 25, 110, 50);
  496.  
  497. //---- button1 ----
  498. button1.setText("Start Script");
  499. button1.addActionListener(new java.awt.event.ActionListener() {
  500.  
  501. @Override
  502. public void actionPerformed(java.awt.event.ActionEvent evt) {
  503. button1ActionPerformed(evt);
  504. }
  505. });
  506. contentPane.add(button1);
  507. button1.setBounds(0, 285, 255, 35);
  508.  
  509. //---- label3 ----
  510. label3.setText("Enter percent to eat at");
  511. contentPane.add(label3);
  512. label3.setBounds(new Rectangle(new Point(65, 85), label3.getPreferredSize()));
  513.  
  514. //---- slider1 ----
  515. slider1.setMinorTickSpacing(5);
  516. contentPane.add(slider1);
  517. slider1.setBounds(new Rectangle(new Point(25, 105), slider1.getPreferredSize()));
  518.  
  519. //---- label4 ----
  520. label4.setText("Choose what food to eat");
  521. contentPane.add(label4);
  522. label4.setBounds(new Rectangle(new Point(60, 135), label4.getPreferredSize()));
  523. contentPane.add(comboBox1);
  524. String[] food = {"Monkfish", "Shark", "Lobster", "Manta Ray", "Swordfish"};
  525. comboBox1.setModel(new DefaultComboBoxModel<Object>(food));
  526. comboBox1.setBounds(30, 155, 195, comboBox1.getPreferredSize().height);
  527.  
  528. //---- checkBox1 ----
  529. checkBox1.setText("Bury bones");
  530. contentPane.add(checkBox1);
  531. checkBox1.setBounds(new Rectangle(new Point(10, 195), checkBox1.getPreferredSize()));
  532.  
  533. //---- checkBox2 ----
  534. checkBox2.setText("Use potions");
  535. checkBox2.setEnabled(false);
  536. contentPane.add(checkBox2);
  537. checkBox2.setBounds(new Rectangle(new Point(155, 195), checkBox2.getPreferredSize()));
  538.  
  539. //---- label5 ----
  540. label5.setText("Username");
  541. contentPane.add(label5);
  542. label5.setBounds(10, 225, 60, 20);
  543. contentPane.add(textField1);
  544. textField1.setBounds(85, 225, 150, 25);
  545.  
  546. //---- label6 ----
  547. label6.setText("Password");
  548. contentPane.add(label6);
  549. label6.setBounds(10, 255, label6.getPreferredSize().width, 20);
  550. contentPane.add(passwordField1);
  551. passwordField1.setBounds(85, 255, 150, 25);
  552. //passwordField1.setBounds(85, 255, 150, passwordField1.getPreferredSize().height);
  553.  
  554. { // compute preferred size
  555. Dimension preferredSize = new Dimension();
  556. for(int i = 0; i < contentPane.getComponentCount(); i++) {
  557. Rectangle bounds = contentPane.getComponent(i).getBounds();
  558. preferredSize.width = Math.max(bounds.x + bounds.width, preferredSize.width);
  559. preferredSize.height = Math.max(bounds.y + bounds.height, preferredSize.height);
  560. }
  561. Insets insets = contentPane.getInsets();
  562. preferredSize.width += insets.right;
  563. preferredSize.height += insets.bottom;
  564. contentPane.setMinimumSize(preferredSize);
  565. contentPane.setPreferredSize(preferredSize);
  566. }
  567. pack();
  568. setLocationRelativeTo(getOwner());
  569. }
  570.  
  571. private JLabel label1;
  572. private JScrollPane scrollPane1;
  573. private JTextPane textPane1;
  574. private JLabel label2;
  575. private JScrollPane scrollPane2;
  576. private JTextPane textPane2;
  577. private JButton button1;
  578. private JLabel label3;
  579. private JSlider slider1;
  580. private JLabel label4;
  581. private JComboBox<Object> comboBox1;
  582. private JCheckBox checkBox1;
  583. private JCheckBox checkBox2;
  584. private JLabel label5;
  585. private JTextField textField1;
  586. private JLabel label6;
  587. private JPasswordField passwordField1;
  588. }
  589.  
  590. private class MousePaint {
  591. /**
  592. * Length of the trail
  593. */
  594. private final int SIZE = 50;
  595. /**
  596. * Gets the color of the trail depending on the SIZE
  597. */
  598. private final float rainbowStep = (float) (1.0/SIZE);
  599. /**
  600. * Gets the alpha of the trail depending on the SIZE
  601. */
  602. private final double alphaStep = (255.0/SIZE);
  603.  
  604. /**
  605. * Declares the mouse points
  606. */
  607. private Point[] points;
  608. /**
  609. * Counts up the points
  610. */
  611. private int index;
  612. /**
  613. * Trail offset
  614. */
  615. private float offSet = 0.05f;
  616. /**
  617. * Trail start
  618. */
  619. private float start = 0;
  620.  
  621. /**
  622. * Construter for MousePaint()
  623. */
  624. public MousePaint() {
  625. points = new Point[SIZE];
  626. index = 0;
  627. }
  628.  
  629. /**
  630. * Adds the current mouse location as a point to draw the trail
  631. * @param p MouseLocation()
  632. */
  633. public void add(Point p) {
  634. points[index++] = p;
  635. index %= SIZE;
  636. }
  637.  
  638. /**
  639. * Draws the cursor on the screen
  640. * @param graphics
  641. */
  642. public void drawCursor(Graphics graphics) {
  643. int x = (int)mouse.getLocation().getX();
  644. int y = (int)mouse.getLocation().getY();
  645. Graphics2D g2D = (Graphics2D) graphics;
  646. graphics.setColor(new Color((int) (Math.random() * 256), (int) (Math.random() * 256), (int) (Math.random() * 256)));
  647. Graphics2D spinner = (Graphics2D) g2D.create();
  648. spinner.rotate(System.currentTimeMillis() % 2000d / 2000d * (360d) * 2 * Math.PI / 180.0, x, y);
  649. spinner.drawLine(x - 6, y, x + 6, y);
  650. spinner.drawLine(x, y - 6, x, y +6);
  651. }
  652.  
  653. /**
  654. * Draws the trail on screen
  655. * @param graphics
  656. */
  657. public void drawTrail(Graphics graphics) {
  658. Graphics2D g2D = (Graphics2D) graphics;
  659. g2D.setStroke(new BasicStroke(1F));
  660. double alpha = 0;
  661. float rainbow = start;
  662.  
  663. start += offSet;
  664. if (start > 1) {
  665. start -= 1;
  666. }
  667.  
  668. for (int i = index; i != (index == 0 ? SIZE-1 : index-1); i = (i+1)%SIZE) {
  669. if (points[i] != null && points[(i+1)%SIZE] != null) {
  670. int rgb = Color.HSBtoRGB(rainbow, 0.9f, 0.9f);
  671. rainbow += rainbowStep;
  672.  
  673. if (rainbow > 1) {
  674. rainbow -= 1;
  675. }
  676. g2D.setColor(new Color((rgb >> 16) & 0xff, (rgb >> 8) & 0xff, rgb & 0xff, (int)alpha));
  677. g2D.drawLine(points[i].x, points[i].y, points[(i+1)%SIZE].x, points[(i+1)%SIZE].y);
  678.  
  679.  
  680. alpha += alphaStep;
  681. }
  682. }
  683. }
  684. }
  685.  
  686. }
Add Comment
Please, Sign In to add comment