Browse Source

Converted OpenDocument/Calc directory and demo. WIP FSM and ClassGrapher.

Frederic G. MARAND 3 years ago
parent
commit
90aaf88bb0

+ 1 - 2
.gitignore

@@ -10,5 +10,4 @@
 php_error*
 
 # Library components
-OSInet
-
+vendor/

+ 6 - 0
.run/CalcReader.run.xml

@@ -0,0 +1,6 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="CalcReader" type="PhpLocalRunConfigurationType" factoryName="PHP Console" path="$PROJECT_DIR$/apps/odf_calc_reader/odf_calc_reader.php" scriptParameters="apps/odf_calc_reader/odf_sample.ods">
+    <CommandLine workingDirectory="$PROJECT_DIR$" />
+    <method v="2" />
+  </configuration>
+</component>

+ 1 - 1
OSInet/Class_Grapher/ClassInstance.php → Osinet/ClassGrapher/ClassInstance.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace OSInet\Class_Grapher;
+namespace Osinet\ClassGrapher;
 
 /**
  * Representation of a "class" symbol in source code.

+ 2 - 2
OSInet/Class_Grapher/Graph.php → Osinet/ClassGrapher/Graph.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace OSInet\Class_Grapher;
+namespace Osinet\ClassGrapher;
 
 /**
  * Graph builder.
@@ -47,7 +47,7 @@ class Graph {
    * @param int $level
    */
   public function debug($message = '\n', $level = LOG_DEBUG) {
-    $this->logger->debug($message, $level);
+    $this->logger->legacyLog($message, $level);
   }
 
   /**

+ 2 - 2
OSInet/Class_Grapher/InterfaceInstance.php → Osinet/ClassGrapher/InterfaceInstance.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace OSInet\Class_Grapher;
+namespace Osinet\ClassGrapher;
 
 /**
  * Representation of an "interface" symbol in source code.
@@ -60,7 +60,7 @@ class InterfaceInstance {
    * @param int $level
    */
   public function debug($message, $level = LOG_INFO) {
-    $this->logger->debug($message, $level);
+    $this->logger->legacyLog($message, $level);
   }
 
   public function getSymbolOrigin() {

+ 36 - 3
OSInet/Class_Grapher/Logger.php → Osinet/ClassGrapher/Logger.php

@@ -4,9 +4,31 @@
  * Trivial logger for easier debug.
  */
 
-namespace OSInet\Class_Grapher;
+namespace Osinet\ClassGrapher;
+
+
+use Psr\Log\LoggerInterface;
+use Psr\Log\LoggerTrait;
+use Psr\Log\LogLevel;
+
+class Logger implements LoggerInterface {
+
+  use LoggerTrait;
+
+  /**
+   * Map Syslog LOG_* constants to PSR/3 log levels.
+   */
+  public const Levels = [
+    LOG_EMERG => LogLevel::EMERGENCY,
+    LOG_ALERT => LogLevel::ALERT,
+    LOG_CRIT => LogLevel::CRITICAL,
+    LOG_ERR => LogLevel::ERROR,
+    LOG_WARNING => LogLevel::WARNING,
+    LOG_NOTICE => LogLevel::NOTICE,
+    LOG_INFO => LogLevel::INFO,
+    LOG_DEBUG => LogLevel::DEBUG,
+  ];
 
-class Logger {
   public $fDebugLevel;
 
   public function __construct($debugLevel = LOG_WARNING) {
@@ -47,10 +69,21 @@ class Logger {
    *   WATCHDOG_* constants in includes/bootstrap.inc for an explanation about
    *   syslog constants in PHP.
    */
-  public function debug($message = "\n", $level = LOG_INFO) {
+  public function legacyLog($message = "\n", $level = LOG_INFO) {
+    $psr3Level = static::Levels[$level] ?? LogLevel::ERROR;
+    $this->log($psr3Level, $message);
+  }
+
+  /**
+   * @param mixed $level
+   * @param string $message
+   * @param array $context
+   */
+  public function log($level, $message, array $context = []) {
     if ($level <= $this->fDebugLevel) {
       fputs(STDERR, $message);
       fflush(STDERR);
     }
   }
+
 }

+ 6 - 0
Osinet/ClassGrapher/README.md

@@ -0,0 +1,6 @@
+# ClassGrapher
+
+This package is meant to be use in Drupal projects, as it depends on the \PGPClass 
+provided by the Drupal Grammar Parser module.
+
+@see https://www.drupal.org/project/grammar_parser/issues/3190546

+ 67 - 0
Osinet/ClassGrapher/Tests/ClassInstanceTest.php

@@ -0,0 +1,67 @@
+<?php
+namespace Osinet\ClassGrapher\Tests;
+
+require_once "misc/psr0.php";
+spl_autoload_register('psr0_autoload');
+
+/**
+ * ClassInstance test case.
+ */
+class ClassInstanceTest extends \PHPUnit_Framework_TestCase {
+
+  /**
+   *
+   * @var ClassInstance
+   */
+  private $ClassInstance;
+
+  /**
+   * Prepares the environment before running a test.
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // TODO Auto-generated ClassInstanceTest::setUp()
+
+    $this->ClassInstance = new ClassInstance(/* parameters */);
+  }
+
+  /**
+   * Cleans up the environment after running a test.
+   */
+  protected function tearDown() {
+    // TODO Auto-generated ClassInstanceTest::tearDown()
+
+    $this->ClassInstance = null;
+
+    parent::tearDown();
+  }
+
+  /**
+   * Constructs the test case.
+   */
+  public function __construct() {
+    // TODO Auto-generated constructor
+  }
+
+  /**
+   * Tests ClassInstance->__construct()
+   */
+  public function test__construct() {
+    // TODO Auto-generated ClassInstanceTest->test__construct()
+    $this->markTestIncomplete("__construct test not implemented");
+
+    $this->ClassInstance->__construct(/* parameters */);
+  }
+
+  /**
+   * Tests ClassInstance->basicAttributes()
+   */
+  public function testBasicAttributes() {
+    // TODO Auto-generated ClassInstanceTest->testBasicAttributes()
+    $this->markTestIncomplete("basicAttributes test not implemented");
+
+    $this->ClassInstance->basicAttributes(/* parameters */);
+  }
+}
+

+ 170 - 0
Osinet/ClassGrapher/Tests/GraphTest.php

@@ -0,0 +1,170 @@
+<?php
+namespace Osinet\ClassGrapher\Tests;
+
+require_once 'Osinet/ClassGrapher/Graph.php';
+require_once 'PHPUnit/Framework/TestCase.php';
+
+/**
+ * Graph test case.
+ */
+class GraphTest extends \PHPUnit_Framework_TestCase {
+
+  /**
+   *
+   * @var Graph
+   */
+  private $Graph;
+
+  /**
+   * Prepares the environment before running a test.
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // TODO Auto-generated GraphTest::setUp()
+
+    $this->Graph = new Graph(/* parameters */);
+
+  }
+
+  /**
+   * Cleans up the environment after running a test.
+   */
+  protected function tearDown() {
+    // TODO Auto-generated GraphTest::tearDown()
+
+    $this->Graph = null;
+
+    parent::tearDown();
+  }
+
+  /**
+   * Constructs the test case.
+   */
+  public function __construct() {
+    // TODO Auto-generated constructor
+  }
+
+  /**
+   * Tests Graph->attributes()
+   */
+  public function testAttributes() {
+    // TODO Auto-generated GraphTest->testAttributes()
+    $this->markTestIncomplete("attributes test not implemented");
+
+    $this->Graph->attributes(/* parameters */);
+
+  }
+
+  /**
+   * Tests Graph->debug()
+   */
+  public function testDebug() {
+    // TODO Auto-generated GraphTest->testDebug()
+    $this->markTestIncomplete("debug test not implemented");
+
+    $this->Graph->debug(/* parameters */);
+
+  }
+
+  /**
+   * Tests Graph->getFiles()
+   */
+  public function testGetFiles() {
+    // TODO Auto-generated GraphTest->testGetFiles()
+    $this->markTestIncomplete("getFiles test not implemented");
+
+    $this->Graph->getFiles(/* parameters */);
+
+  }
+
+  /**
+   * Tests Graph->initGraph()
+   */
+  public function testInitGraph() {
+    // TODO Auto-generated GraphTest->testInitGraph()
+    $this->markTestIncomplete("initGraph test not implemented");
+
+    $this->Graph->initGraph(/* parameters */);
+
+  }
+
+  /**
+   * Tests Graph->registerClass()
+   */
+  public function testRegisterClass() {
+    // TODO Auto-generated GraphTest->testRegisterClass()
+    $this->markTestIncomplete("registerClass test not implemented");
+
+    $this->Graph->registerClass(/* parameters */);
+
+  }
+
+  /**
+   * Tests Graph->registerInterface()
+   */
+  public function testRegisterInterface() {
+    // TODO Auto-generated GraphTest->testRegisterInterface()
+    $this->markTestIncomplete("registerInterface test not implemented");
+
+    $this->Graph->registerInterface(/* parameters */);
+
+  }
+
+  /**
+   * Tests Graph->extractGrammar()
+   */
+  public function testExtractGrammar() {
+    // TODO Auto-generated GraphTest->testExtractGrammar()
+    $this->markTestIncomplete("extractGrammar test not implemented");
+
+    $this->Graph->extractGrammar(/* parameters */);
+
+  }
+
+  /**
+   * Tests Graph->__construct()
+   */
+  public function test__construct() {
+    // TODO Auto-generated GraphTest->test__construct()
+    $this->markTestIncomplete("__construct test not implemented");
+
+    $this->Graph->__construct(/* parameters */);
+
+  }
+
+  /**
+   * Tests Graph->implementsAttributes()
+   */
+  public function testImplementsAttributes() {
+    // TODO Auto-generated GraphTest->testImplementsAttributes()
+    $this->markTestIncomplete("implementsAttributes test not implemented");
+
+    $this->Graph->implementsAttributes(/* parameters */);
+
+  }
+
+  /**
+   * Tests Graph->buildSymbols()
+   */
+  public function testBuildSymbols() {
+    // TODO Auto-generated GraphTest->testBuildSymbols()
+    $this->markTestIncomplete("buildSymbols test not implemented");
+
+    $this->Graph->buildSymbols(/* parameters */);
+
+  }
+
+  /**
+   * Tests Graph->build()
+   */
+  public function testBuild() {
+    // TODO Auto-generated GraphTest->testBuild()
+    $this->markTestIncomplete("build test not implemented");
+
+    $this->Graph->build(/* parameters */);
+
+  }
+
+}
+

+ 2 - 2
OSInet/Class_Grapher/Tests/LoggerTest.php → Osinet/ClassGrapher/Tests/LoggerTest.php

@@ -1,7 +1,7 @@
 <?php
-namespace OSInet\Class_Grapher;
+namespace Osinet\ClassGrapher\Tests;
 
-require_once 'OSInet/Class_Grapher/Logger.php';
+require_once 'Osinet/ClassGrapher/Logger.php';
 require_once 'PHPUnit/Framework/TestCase.php';
 
 /**

+ 3 - 3
OSInet/Finite_State_Machine/BackgroundApplication.php → Osinet/FiniteStateMachine/BackgroundApplication.php

@@ -2,9 +2,9 @@
 /**
  *
  * Base application class for an application able to perform background work
- * based on an OSInet Finite_State_Machine (fsm).
+ * based on an Osinet FiniteStateMachine (fsm).
  *
- * This version relies on OSInet FSM >= 1.6
+ * This version relies on Osinet FSM >= 1.6
  *
  * @copyright  (c) 2007-2012 OSI
  * @license    Licensed under the CeCILL 2.0
@@ -15,7 +15,7 @@ error_reporting(E_ALL|E_STRICT);
 
 /**
  * Base application class for an application able to perform background work
- * based on an OSInet FSM (finite state machine).
+ * based on an Osinet FSM (finite state machine).
  * Concrete implementations should include a constructor defining the
  * backgroundGoals array along the FSM graph.
  */

+ 2 - 2
OSInet/Finite_State_Machine/DiaLoader.php → Osinet/FiniteStateMachine/DiaLoader.php

@@ -4,7 +4,7 @@
  *
  * This class converts an UML diagram from Dia 0.9.6 into an abstract FSM graph
  * which can then be output by another class to the FSM XML format used by
- * the OSInet FSM 1.6.
+ * the Osinet FSM 1.6.
  *
  * @copyright  (c) 2007-2012 Ouest Systèmes Informatiques
  * @author     Frederic G. MARAND
@@ -13,7 +13,7 @@
  * @since      FSM 1.6
  */
 
-namespace OSInet\Finite_State_Machine;
+namespace Osinet\FiniteStateMachine;
 
 $erFsmFromDia = error_reporting(E_ALL|E_STRICT);
 

+ 2 - 2
OSInet/Finite_State_Machine/FtpClient.php → Osinet/FiniteStateMachine/FtpClient.php

@@ -1,14 +1,14 @@
 <?php
 
 /**
- * An FTP transfer wrapper using the OSInet Finite_State_Machine
+ * An FTP transfer wrapper using the Osinet FiniteStateMachine
  *
  * @copyright  (c) 2007-2012 Ouest Systèmes Informatiques
  * @author     Frédéric G. MARAND
  * @license    Licensed under the CeCILL 2.0
  */
 
-namespace OSInet\Finite_State_Machine;
+namespace Osinet\FiniteStateMachine;
 
 /**
  * Save current reporting level while we set it

+ 1 - 1
OSInet/Finite_State_Machine/Grapher.php → Osinet/FiniteStateMachine/Grapher.php

@@ -12,7 +12,7 @@
  * @since      FSM 1.6
  */
 
-namespace OSInet\Finite_State_Machine;
+namespace Osinet\FiniteStateMachine;
 
 class Grapher {
   const STATE_SHAPE = 'octagon';

+ 1 - 1
OSInet/Finite_State_Machine/Machine.php → Osinet/FiniteStateMachine/Machine.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace OSInet\Finite_State_Machine;
+namespace Osinet\FiniteStateMachine;
 
 /**
  * Abstract state machine.

+ 1 - 1
OSInet/Finite_State_Machine/Result.php → Osinet/FiniteStateMachine/Result.php

@@ -11,7 +11,7 @@
  * @todo       replace setAttribute('id',...) by setIdAttribute when PHP5.2 becomes mandatory
  */
 
-namespace OSInet\Finite_State_Machine;
+namespace Osinet\FiniteStateMachine;
 
 /**
  * needed notably for func_name()

+ 16 - 17
OSInet/Finite_State_Machine/Writer.php → Osinet/FiniteStateMachine/Writer.php

@@ -12,7 +12,7 @@
  * @link       http://wiki.audean.com/fsm/fsm
  */
 
-namespace OSInet\Finite_State_Machine;
+namespace Osinet\FiniteStateMachine;
 
 /**
  * Needed notably for func_name()
@@ -24,7 +24,7 @@ $erFiniteStateMachine = error_reporting(E_ALL|E_STRICT);
 /**
  * Read/Write concrete FSM class.
  *
- * This (concrete) class extends the default abstract Finite_State_Machine to
+ * This (concrete) class extends the default abstract FiniteStateMachine to
  * add write behaviours. It is to be used by applications wishing to write FSM
  * files. Other applications should not use it to avoid code bloat.
  */
@@ -102,13 +102,13 @@ class Writer extends Machine {
       . ', ' . ($overwrite ? 'with' : 'without') . ' overwrite mode'
       . ".\n";
 
-    $doc = new DOMDocument('1.0', 'utf-8');
-    $comment = new DOMComment(' Generated by '
+    $doc = new \DOMDocument('1.0', 'utf-8');
+    $comment = new \DOMComment(' Generated by '
       . basename(__FILE__, '.php')
       . " version " . Fsm_Writer::VERSION
       . " ");
     $doc->appendChild($comment);
-    $fsm = new DOMElement('fsm');
+    $fsm = new \DOMElement('fsm');
     $doc->appendChild($fsm);
     $fsm->setAttribute('fsm_version',   "1.3");
     $fsm->setAttribute('idle_work',     "1");
@@ -118,10 +118,9 @@ class Writer extends Machine {
     $fsm->setAttribute('final', $final);
 
     foreach ($graph['states'] as $id => $state) {
-      $state_node = new DOMElement('state');
+      $state_node = new \DOMElement('state');
       $fsm->appendChild($state_node);
-      // setIdAttribute not yet implemented in php 5.1
-      $state_node->setAttribute('id', $state['name']);
+      $state_node->setIdAttribute('id', $state['name']);
       $transitions = $this->getTransitionsForState($graph, $id);
 
       /**
@@ -132,7 +131,7 @@ class Writer extends Machine {
        * qu'il faut créer 1 event et "n" next.
        */
       foreach ($transitions as $transition_id) {
-        $event_node = new DOMElement('event');
+        $event_node = new \DOMElement('event');
         $state_node->appendChild($event_node);
         $transition = $graph['transitions'][$transition_id];
         $event_node->setAttribute('name', $transition['trigger']);
@@ -237,7 +236,7 @@ class Writer extends Machine {
   /**
    * Defines the special states in the FSM
    *
-   * @param string $kind Finite_State_Machine::INIT_STATE or ..FINAL_STATE
+   * @param string $kind FiniteStateMachine::INIT_STATE or ..FINAL_STATE
    * @param string $name
    */
   public function setSpecialState($kind, $name) {
@@ -277,14 +276,14 @@ class Writer extends Machine {
       . ', ' . ($overwrite ? 'with' : 'without') . ' overwrite mode'
       . ".\n";
 
-    $doc = new DOMDocument('1.0', 'utf-8');
-    $comment = new DOMComment(' Generated by '
+    $doc = new \DOMDocument('1.0', 'utf-8');
+    $comment = new \DOMComment(' Generated by '
       . basename(__FILE__, '.php')
       . " version " . Writer::FORMAT_VERSION
       . " on FSM version " . Machine::VERSION
       . " ");
     $doc->appendChild($comment);
-    $fsm = new DOMElement('fsm');
+    $fsm = new \DOMElement('fsm');
     $doc->appendChild($fsm);
     $fsm->setAttribute('fsm_version',   "1.3");
     $fsm->setAttribute('idle_work',     "1");
@@ -297,11 +296,11 @@ class Writer extends Machine {
       if ($stateName[0] == '#') {
         continue; // ignore special state definitions
       }
-      $stateNode = new DOMElement('state', "\n");
+      $stateNode = new \DOMElement('state', "\n");
       $fsm->appendChild($stateNode);
-      $stateNode->setAttribute('id', $stateName);
+      $stateNode->setIdAttribute('id', $stateName);
       foreach ($state as $eventName => $event) {
-        $eventNode = new DOMElement('event', "\n");
+        $eventNode = new \DOMElement('event', "\n");
         $stateNode->appendChild($eventNode);
         $eventNode->setAttribute('name', $eventName);
         $eventNode->setAttribute('type', $event['#type']);
@@ -309,7 +308,7 @@ class Writer extends Machine {
           if ($outcomeName[0] == '#') {
             continue; // ignore special outcome definitions (event type)
           }
-          $outcomeNode = new DOMElement('next', "\n");
+          $outcomeNode = new \DOMElement('next', "\n");
           $eventNode->appendChild($outcomeNode);
           /**
            * Generated FSMs currently always use the "string" event handler type,

+ 0 - 0
OSInet/Finite_State_Machine/help/fsm_sample.dia → Osinet/FiniteStateMachine/help/fsm_sample.dia


+ 0 - 0
OSInet/Finite_State_Machine/help/trans.ods → Osinet/FiniteStateMachine/help/trans.ods


+ 0 - 0
OSInet/Finite_State_Machine/help/trans.odt → Osinet/FiniteStateMachine/help/trans.odt


+ 7 - 12
OSInet/Open_Document/Calc/Cell.php → Osinet/OpenDocument/Calc/Cell.php

@@ -2,15 +2,11 @@
 /**
  * Wrap an OpenDocument spreadsheet cell
  *
- * Requires PHP 5.3
- *
  * @license CeCILL 2.0
- * @copyright 2005-2012 Ouest Systemes Informatiques
+ * @copyright 2005-2012,2020 Ouest Systemes Informatiques
  */
 
-namespace OSInet\Open_Document\Calc;
-
-use OSInet\Open_Document\Calc\Reader;
+namespace Osinet\OpenDocument\Calc;
 
 /**
  * OpenDocument Spreadsheet cell
@@ -23,9 +19,9 @@ class Cell {
   const TYPE_FLOAT  = 'float';
   const TYPE_EMPTY  = 'empty'; // used if attribute is missing
 
-  public $dataType;
-  public $dataValue;
-  public $displayValue;
+  public string $dataType;
+  public ?string $dataValue;
+  public ?string $displayValue;
 
   /**
    * @param \DOMNode $cellNode
@@ -67,7 +63,7 @@ class Cell {
    *
    * @param mixed $x
    */
-  function set($x = NULL) {
+  function set($x = NULL): void {
     $type = gettype($x);
     switch ($type) {
       case 'NULL':
@@ -87,8 +83,7 @@ class Cell {
         break;
       default:
         $this->set();
-        throw new \Exception('Cell::set unsupported value type ', $type);
-        break;
+        throw new \Exception("Cell::set unsupported value type ${type}");
       }
     }
 

+ 18 - 12
OSInet/Open_Document/Calc/Reader.php → Osinet/OpenDocument/Calc/Reader.php

@@ -7,8 +7,9 @@
  * @license CeCILL 2.0
  * @copyright 2005-2012 Ouest Systemes Informatiques
  */
+declare(strict_types=1);
 
-namespace OSInet\Open_Document\Calc;
+namespace Osinet\OpenDocument\Calc;
 
 
 /**
@@ -19,16 +20,16 @@ class Reader {
   const NS_OFFICE = "urn:oasis:names:tc:opendocument:xmlns:office:1.0";
 
   /**
-   * @var DOMDocument $xml
+   * @var \DOMDocument $xml
    */
   public $xml;
 
   /**
-   * @var DOMXPath $xpath
+   * @var \DOMXPath $xpath
    */
   public $xpath;
 
-  function __construct($path) {
+  function __construct(string $path) {
     $this->xml = new \DOMDocument();
     $this->xml->preserveWhiteSpace = FALSE;
     $this->xml->load($path);
@@ -41,20 +42,22 @@ class Reader {
   /**
    * Return a DOMNodeList of the worksheets available in the document
    *
-   * @return \DOMNodeList
+   * @return \DOMNodeList<\DOMNode>
    */
-  function getCalcSheets() {
+  function getCalcSheets(): \DOMNodeList {
     $sq = '//table:table';
     $list = $this->xpath->query($sq);
     unset($sq);
-
+    if ($list === FALSE) {
+      $list = new \DOMNodeList();
+    }
     return $list;
   }
 
   /**
    * Return the names of the worksheets available in the document
    *
-   * @return array
+   * @return array<string>
    */
   function getCalcSheetNames() {
     $dnlSheets = $this->getCalcSheets();
@@ -75,16 +78,19 @@ class Reader {
    *
    * @param string $namedRange
    *   Optional name of range, notably Sheet name
-   * @return \DOMNodeList
+   * @return \DOMNodeList<\DOMNode>
    */
-  function getRows ($namedRange = NULL) {
+  function getRows ($namedRange = NULL): \DOMNodeList {
     $query = empty($namedRange)
       ? '//table:table-row'
       : '//table:table[@table:name="' . $namedRange . '"]/table:table-row';
 
-    $ret = $this->xpath->query($query);
+    $list = $this->xpath->query($query);
     unset($query);
+    if ($list === FALSE) {
+      $list = new \DOMNodeList();
+    }
 
-    return $ret;
+    return $list;
   }
 }

+ 28 - 25
OSInet/Open_Document/Calc/Row.php → Osinet/OpenDocument/Calc/Row.php

@@ -8,53 +8,56 @@
  * @copyright 2005-2012 Ouest Systemes Informatiques
  */
 
-namespace OSInet\Open_Document\Calc;
+namespace Osinet\OpenDocument\Calc;
 
 class Row {
+
   /**
-   * @var DOMElement $row
+   * @var \DOMElement $row
    */
   protected $row;
 
+  /**
+   * Construct a Row from the DOMElement representing it.
+   *
+   * This DOMElement must bear a table:table-row tag
+   *
+   * @param \DOMElement $row
+   *
+   * @return void
+   */
+  function __construct(\DOMElement $row) {
+    if ((!($row instanceof \DOMElement)) || ($row->tagName != 'table:table-row')) {
+      die('Row::__construct() needs a DOMElement parameter for a table-row element ');
+    }
+    $this->row = $row;
+  }
+
   /**
    * Analyze a spreadsheet row and return the cells as an array of Calc_Cell
    *
-   * @return array
+   * @return array<\Osinet\OpenDocument\Calc\Cell>
    */
-  function getCells () {
+  function getCells(): array {
     $cellNodeList = $this->row->childNodes;
-    $cells = array();
+    $cells = [];
 
     $iCell = 0;
-    for ($icol = 0 ; $icol < $cellNodeList->length ; $icol++) {
-      $cellElement = $cellNodeList->item($icol);
+    for ($icol = 0; $icol < $cellNodeList->length; $icol++) {
+      $cellNode = $cellNodeList->item($icol);
       $count = NULL;
-      if (is_object($cellElement)) {
-        $count = $cellElement->getAttributeNS(Reader::NS_TABLE, 'number-columns-repeated');
+      if ($cellNode instanceof \DOMElement) {
+        $count = $cellNode->getAttributeNS(Reader::NS_TABLE, 'number-columns-repeated');
       }
       if (empty($count)) {
         $count = 1;
       }
-      for ($j = 0 ; $j < $count  ; $j++) {
-        $cells[$iCell++] = new Cell($cellElement);
+      for ($j = 0; $j < $count; $j++) {
+        $cells[$iCell++] = new Cell($cellNode);
       }
     }
 
     return $cells;
   }
 
-  /**
-   * Construct a Row from the DOMElement representing it.
-   *
-   * This DOMElement must bear a table:table-row tag
-   *
-   * @param \DOMNodeList $row
-   * @return void
-   */
-  function __construct(\DOMElement $row) {
-    if ((!($row instanceof \DOMElement)) || ($row->tagName != 'table:table-row')) {
-      die('Row::__construct() needs a DOMElement parameter for a table-row element ');
-    }
-    $this->row = $row;
-  }
 }

+ 10 - 0
Osinet/OpenDocument/README.md

@@ -0,0 +1,10 @@
+# OpenDocument
+
+The OpenDocument\Calc package can read the content.xml file of an uncompressed
+ODS spreadsheet:
+
+- uncompress the ODS file to read to a temporary directory
+- locate its content file, usually `content.xml`
+- pass the path of that file to the `OpenDocument\Calc\Reader` constructor.
+
+See the `apps/open_calc_reader/odf_calc_reader.php` example.

+ 4 - 4
apps/class_grapher/class_grapher_demo.php

@@ -3,7 +3,7 @@
  * This code uses several external classes:
  *
  * - PSR0-compliant
- *   - OSInet Class_Grapher package.
+ *   - Osinet ClassGrapher package.
  * - PEAR
  *   - Image_GraphViz
  * - Miscellaneous
@@ -19,13 +19,13 @@
 // To use, adjust the grammar parser path to your deployment.
 $gpPath = '../../d7/sites/all/libraries/grammar_parser/engine';
 
-use \OSInet\Class_Grapher\Logger;
-use \OSInet\Class_Grapher\Graph;
+use \Osinet\ClassGrapher\Logger;
+use \Osinet\ClassGrapher\Graph;
 
 // Image_GraphViz throws notices, so keep it quiet.
 error_reporting(E_WARNING);
 
-// Include the OSInet PSR0 autoloader.
+// Include the Osinet PSR0 autoloader.
 require __DIR__ .'/../../misc/psr0.php';
 
 // Load Image_GraphViz: PEAR, not PSR0.

+ 2 - 2
apps/class_grapher/classgrapher.drush.inc

@@ -9,8 +9,8 @@
  *   graphs, less server load, and user interaction.
  */
 
-use \OSInet\Class_Grapher\Logger;
-use \OSInet\Class_Grapher\Graph;
+use \Osinet\ClassGrapher\Logger;
+use \Osinet\ClassGrapher\Graph;
 
 /**
  * Implement hook_drush_command().

+ 2 - 2
apps/ftp/ftp.php

@@ -5,8 +5,8 @@ require 'misc.php';
 
 spl_autoload_register('psr0_autoload', TRUE);
 
-use \OSInet\Finite_State_Machine\FtpClient;
-use \OSInet\Finite_State_Machine\Grapher;
+use \Osinet\FiniteStateMachine\FtpClient;
+use \Osinet\FiniteStateMachine\Grapher;
 
 $ftp = new FtpClient(array(
   'source' => 'ftp.xml',

File diff suppressed because it is too large
+ 1 - 0
apps/odf_calc_reader/content.xml


+ 12 - 17
apps/odf_calc_reader/odf_calc_reader.php

@@ -1,29 +1,24 @@
 <?php
+
 /**
- * This code uses several external classes:
+ * @file
+ * Demo application for LibreOffice Calc reader.
  *
- * - PSR0-compliant
- *   - OSInet Open_Document package.
- * - PHP 5.3
+ * Pass the path of "content.xml" in an unpacked ODF spreadsheet.
+ * Suggested: use the supplied odf_sample.ods, unpacked
  */
+declare(strict_types=1);
 
-use \OSInet\Open_Document\Calc\Reader as ODFReader;
-use \OSInet\Open_Document\Calc\Row as ODFRow;
-use \OSInet\Open_Document\Calc\Cell;
+use Osinet\OpenDocument\Calc\Reader;
+use Osinet\OpenDocument\Calc\Row;
 
 error_reporting(-1);
 
-// Include the OSInet PSR0 sample autoloader.
-require __DIR__ .'/../../misc/psr0.php';
-
-// Initialize PSR0 autoloader for remaining classes.
-spl_autoload_register('psr0_autoload', TRUE);
+require __DIR__ . '/../../vendor/autoload.php';
 
-// Use the path of "content.xml" in an unpacked ODF spreadsheet.
-// Suggested: use the supplied odf_sample.odf, unpacked
 $path = $argv[1];
 
-$reader = new ODFReader($path);
+$reader = new Reader($path);
 echo "This file contains the following sheets:\n";
 $sheetNames = $reader->getCalcSheetNames();
 print_r($sheetNames);
@@ -31,10 +26,10 @@ echo PHP_EOL;
 
 $rows = $reader->getRows();
 foreach ($rows as $rowNum => $nodeList) {
-  $row = new ODFRow($nodeList);
+  $row = new Row($nodeList);
   printf("%3d", $rowNum);
   $cells = $row->getCells();
-  for ($i = 0 ; $i < count($cells) ; $i++) {
+  for ($i = 0; $i < count($cells); $i++) {
     printf('|%11s', $cells[$i]->displayValue);
   }
   echo PHP_EOL;

+ 23 - 0
composer.json

@@ -0,0 +1,23 @@
+{
+  "autoload": {
+    "psr-4": {
+     "Osinet\\": "Osinet/"
+    }
+  },
+  "license": "AGPL-3.0-or-later",
+  "name": "fgm/phplib",
+  "repositories": [
+    {
+      "type": "composer",
+      "url": "https://packages.drupal.org/7"
+    }
+  ],
+  "require": {
+    "psr/log": "^1.1",
+    "drupal/grammar_parser": "^2.2"
+  },
+  "require-dev": {
+    "phpstan/phpstan": "^0.12.64",
+    "composer/composer": "^2.0"
+  }
+}

+ 1795 - 0
composer.lock

@@ -0,0 +1,1795 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "7c3c105d8cb63c4a5f5db03d7b58246e",
+    "packages": [
+        {
+            "name": "drupal/drupal",
+            "version": "7.77.0",
+            "source": {
+                "type": "git",
+                "url": "https://git.drupalcode.org/project/drupal.git",
+                "reference": "7.77"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://ftp.drupal.org/files/projects/drupal-7.77.zip",
+                "reference": "7.77",
+                "shasum": "3a1bc25eb3577b2670bc35a821626a45b217eb58"
+            },
+            "type": "drupal-core",
+            "extra": {
+                "drupal": {
+                    "version": "7.77",
+                    "datestamp": "1607003422",
+                    "security-coverage": {
+                        "status": "covered",
+                        "message": "Covered by Drupal's security advisory policy"
+                    }
+                }
+            },
+            "notification-url": "https://packages.drupal.org/7/downloads",
+            "license": [
+                "GPL-2.0-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "Dries",
+                    "homepage": "https://www.drupal.org/user/1"
+                },
+                {
+                    "name": "Drupal",
+                    "homepage": "https://www.drupal.org/user/3"
+                },
+                {
+                    "name": "Fabianx",
+                    "homepage": "https://www.drupal.org/user/693738"
+                },
+                {
+                    "name": "Gábor Hojtsy",
+                    "homepage": "https://www.drupal.org/user/4166"
+                },
+                {
+                    "name": "alexpott",
+                    "homepage": "https://www.drupal.org/user/157725"
+                },
+                {
+                    "name": "catch",
+                    "homepage": "https://www.drupal.org/user/35733"
+                },
+                {
+                    "name": "cilefen",
+                    "homepage": "https://www.drupal.org/user/1850070"
+                },
+                {
+                    "name": "drumm",
+                    "homepage": "https://www.drupal.org/user/3064"
+                },
+                {
+                    "name": "effulgentsia",
+                    "homepage": "https://www.drupal.org/user/78040"
+                },
+                {
+                    "name": "larowlan",
+                    "homepage": "https://www.drupal.org/user/395439"
+                },
+                {
+                    "name": "lauriii",
+                    "homepage": "https://www.drupal.org/user/1078742"
+                },
+                {
+                    "name": "mcdruid",
+                    "homepage": "https://www.drupal.org/user/255969"
+                },
+                {
+                    "name": "plach",
+                    "homepage": "https://www.drupal.org/user/183211"
+                },
+                {
+                    "name": "webchick",
+                    "homepage": "https://www.drupal.org/user/24967"
+                },
+                {
+                    "name": "xjm",
+                    "homepage": "https://www.drupal.org/user/65776"
+                },
+                {
+                    "name": "yoroy",
+                    "homepage": "https://www.drupal.org/user/41502"
+                }
+            ],
+            "homepage": "https://www.drupal.org/project/drupal",
+            "support": {
+                "source": "https://git.drupalcode.org/project/drupal"
+            }
+        },
+        {
+            "name": "drupal/grammar_parser",
+            "version": "2.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://git.drupalcode.org/project/grammar_parser.git",
+                "reference": "7.x-2.2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://ftp.drupal.org/files/projects/grammar_parser-7.x-2.2.zip",
+                "reference": "7.x-2.2",
+                "shasum": "c5a75a566bdb25c52492793df2a43679c23f38a5"
+            },
+            "require": {
+                "drupal/drupal": "~7.0"
+            },
+            "type": "drupal-module",
+            "extra": {
+                "drupal": {
+                    "version": "7.x-2.2",
+                    "datestamp": "1423708081",
+                    "security-coverage": {
+                        "status": "covered",
+                        "message": "Covered by Drupal's security advisory policy"
+                    }
+                }
+            },
+            "notification-url": "https://packages.drupal.org/7/downloads",
+            "license": [
+                "GPL-2.0-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "solotandem",
+                    "homepage": "https://www.drupal.org/user/240748"
+                }
+            ],
+            "description": "Grammar Parser -- an API for parsing, editing and rebuilding a code snippet\n               according to the grammar of the programming language.",
+            "homepage": "https://www.drupal.org/project/grammar_parser",
+            "support": {
+                "source": "https://git.drupalcode.org/project/grammar_parser"
+            }
+        },
+        {
+            "name": "psr/log",
+            "version": "1.1.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "time": "2020-03-23T09:12:05+00:00"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "composer/ca-bundle",
+            "version": "1.2.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/ca-bundle.git",
+                "reference": "8a7ecad675253e4654ea05505233285377405215"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8a7ecad675253e4654ea05505233285377405215",
+                "reference": "8a7ecad675253e4654ea05505233285377405215",
+                "shasum": ""
+            },
+            "require": {
+                "ext-openssl": "*",
+                "ext-pcre": "*",
+                "php": "^5.3.2 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
+                "psr/log": "^1.0",
+                "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\CaBundle\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+            "keywords": [
+                "cabundle",
+                "cacert",
+                "certificate",
+                "ssl",
+                "tls"
+            ],
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-08-23T12:54:47+00:00"
+        },
+        {
+            "name": "composer/composer",
+            "version": "2.0.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/composer.git",
+                "reference": "62139b2806178adb979d76bd3437534a1a9fd490"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/composer/zipball/62139b2806178adb979d76bd3437534a1a9fd490",
+                "reference": "62139b2806178adb979d76bd3437534a1a9fd490",
+                "shasum": ""
+            },
+            "require": {
+                "composer/ca-bundle": "^1.0",
+                "composer/semver": "^3.0",
+                "composer/spdx-licenses": "^1.2",
+                "composer/xdebug-handler": "^1.1",
+                "justinrainbow/json-schema": "^5.2.10",
+                "php": "^5.3.2 || ^7.0 || ^8.0",
+                "psr/log": "^1.0",
+                "react/promise": "^1.2 || ^2.7",
+                "seld/jsonlint": "^1.4",
+                "seld/phar-utils": "^1.0",
+                "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0",
+                "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0",
+                "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0",
+                "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0"
+            },
+            "require-dev": {
+                "phpspec/prophecy": "^1.10",
+                "symfony/phpunit-bridge": "^4.2 || ^5.0"
+            },
+            "suggest": {
+                "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
+                "ext-zip": "Enabling the zip extension allows you to unzip archives",
+                "ext-zlib": "Allow gzip compression of HTTP requests"
+            },
+            "bin": [
+                "bin/composer"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\": "src/Composer"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "https://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "https://seld.be"
+                }
+            ],
+            "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.",
+            "homepage": "https://getcomposer.org/",
+            "keywords": [
+                "autoload",
+                "dependency",
+                "package"
+            ],
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-12-03T16:20:39+00:00"
+        },
+        {
+            "name": "composer/semver",
+            "version": "3.2.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/semver.git",
+                "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/semver/zipball/a02fdf930a3c1c3ed3a49b5f63859c0c20e10464",
+                "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.2 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^0.12.54",
+                "symfony/phpunit-bridge": "^4.2 || ^5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\Semver\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "http://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                },
+                {
+                    "name": "Rob Bast",
+                    "email": "rob.bast@gmail.com",
+                    "homepage": "http://robbast.nl"
+                }
+            ],
+            "description": "Semver library that offers utilities, version constraint parsing and validation.",
+            "keywords": [
+                "semantic",
+                "semver",
+                "validation",
+                "versioning"
+            ],
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-11-13T08:59:24+00:00"
+        },
+        {
+            "name": "composer/spdx-licenses",
+            "version": "1.5.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/spdx-licenses.git",
+                "reference": "de30328a7af8680efdc03e396aad24befd513200"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200",
+                "reference": "de30328a7af8680efdc03e396aad24befd513200",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.2 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\Spdx\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "http://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                },
+                {
+                    "name": "Rob Bast",
+                    "email": "rob.bast@gmail.com",
+                    "homepage": "http://robbast.nl"
+                }
+            ],
+            "description": "SPDX licenses list and validation library.",
+            "keywords": [
+                "license",
+                "spdx",
+                "validator"
+            ],
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-12-03T16:04:16+00:00"
+        },
+        {
+            "name": "composer/xdebug-handler",
+            "version": "1.4.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/xdebug-handler.git",
+                "reference": "f28d44c286812c714741478d968104c5e604a1d4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f28d44c286812c714741478d968104c5e604a1d4",
+                "reference": "f28d44c286812c714741478d968104c5e604a1d4",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.2 || ^7.0 || ^8.0",
+                "psr/log": "^1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Composer\\XdebugHandler\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "John Stevenson",
+                    "email": "john-stevenson@blueyonder.co.uk"
+                }
+            ],
+            "description": "Restarts a process without Xdebug.",
+            "keywords": [
+                "Xdebug",
+                "performance"
+            ],
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-11-13T08:04:11+00:00"
+        },
+        {
+            "name": "justinrainbow/json-schema",
+            "version": "5.2.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/justinrainbow/json-schema.git",
+                "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b",
+                "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
+                "json-schema/json-schema-test-suite": "1.2.0",
+                "phpunit/phpunit": "^4.8.35"
+            },
+            "bin": [
+                "bin/validate-json"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "JsonSchema\\": "src/JsonSchema/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bruno Prieto Reis",
+                    "email": "bruno.p.reis@gmail.com"
+                },
+                {
+                    "name": "Justin Rainbow",
+                    "email": "justin.rainbow@gmail.com"
+                },
+                {
+                    "name": "Igor Wiedler",
+                    "email": "igor@wiedler.ch"
+                },
+                {
+                    "name": "Robert Schönthal",
+                    "email": "seroscho@googlemail.com"
+                }
+            ],
+            "description": "A library to validate a json schema.",
+            "homepage": "https://github.com/justinrainbow/json-schema",
+            "keywords": [
+                "json",
+                "schema"
+            ],
+            "time": "2020-05-27T16:41:55+00:00"
+        },
+        {
+            "name": "phpstan/phpstan",
+            "version": "0.12.64",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpstan.git",
+                "reference": "23eb1cb7ae125f45f1d0e48051bcf67a9a9b08aa"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/23eb1cb7ae125f45f1d0e48051bcf67a9a9b08aa",
+                "reference": "23eb1cb7ae125f45f1d0e48051bcf67a9a9b08aa",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1|^8.0"
+            },
+            "conflict": {
+                "phpstan/phpstan-shim": "*"
+            },
+            "bin": [
+                "phpstan",
+                "phpstan.phar"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.12-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "PHPStan - PHP Static Analysis Tool",
+            "funding": [
+                {
+                    "url": "https://github.com/ondrejmirtes",
+                    "type": "github"
+                },
+                {
+                    "url": "https://www.patreon.com/phpstan",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-12-21T11:59:02+00:00"
+        },
+        {
+            "name": "psr/container",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/container.git",
+                "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+                "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Container\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common Container Interface (PHP FIG PSR-11)",
+            "homepage": "https://github.com/php-fig/container",
+            "keywords": [
+                "PSR-11",
+                "container",
+                "container-interface",
+                "container-interop",
+                "psr"
+            ],
+            "time": "2017-02-14T16:28:37+00:00"
+        },
+        {
+            "name": "react/promise",
+            "version": "v2.8.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/promise.git",
+                "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4",
+                "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Promise\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com"
+                }
+            ],
+            "description": "A lightweight implementation of CommonJS Promises/A for PHP",
+            "keywords": [
+                "promise",
+                "promises"
+            ],
+            "time": "2020-05-12T15:16:56+00:00"
+        },
+        {
+            "name": "seld/jsonlint",
+            "version": "1.8.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/jsonlint.git",
+                "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57",
+                "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+            },
+            "bin": [
+                "bin/jsonlint"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Seld\\JsonLint\\": "src/Seld/JsonLint/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "JSON Linter",
+            "keywords": [
+                "json",
+                "linter",
+                "parser",
+                "validator"
+            ],
+            "funding": [
+                {
+                    "url": "https://github.com/Seldaek",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-11-11T09:19:24+00:00"
+        },
+        {
+            "name": "seld/phar-utils",
+            "version": "1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/phar-utils.git",
+                "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796",
+                "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Seld\\PharUtils\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be"
+                }
+            ],
+            "description": "PHAR file format utilities, for when PHP phars you up",
+            "keywords": [
+                "phar"
+            ],
+            "time": "2020-07-07T18:42:57+00:00"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v5.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git",
+                "reference": "47c02526c532fb381374dab26df05e7313978976"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/console/zipball/47c02526c532fb381374dab26df05e7313978976",
+                "reference": "47c02526c532fb381374dab26df05e7313978976",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php73": "^1.8",
+                "symfony/polyfill-php80": "^1.15",
+                "symfony/service-contracts": "^1.1|^2",
+                "symfony/string": "^5.1"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<4.4",
+                "symfony/dotenv": "<5.1",
+                "symfony/event-dispatcher": "<4.4",
+                "symfony/lock": "<4.4",
+                "symfony/process": "<4.4"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "^4.4|^5.0",
+                "symfony/dependency-injection": "^4.4|^5.0",
+                "symfony/event-dispatcher": "^4.4|^5.0",
+                "symfony/lock": "^4.4|^5.0",
+                "symfony/process": "^4.4|^5.0",
+                "symfony/var-dumper": "^4.4|^5.0"
+            },
+            "suggest": {
+                "psr/log": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/lock": "",
+                "symfony/process": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Console\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Console Component",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "cli",
+                "command line",
+                "console",
+                "terminal"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-12-18T08:03:05+00:00"
+        },
+        {
+            "name": "symfony/filesystem",
+            "version": "v5.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/filesystem.git",
+                "reference": "fa8f8cab6b65e2d99a118e082935344c5ba8c60d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/fa8f8cab6b65e2d99a118e082935344c5ba8c60d",
+                "reference": "fa8f8cab6b65e2d99a118e082935344c5ba8c60d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/polyfill-ctype": "~1.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Filesystem\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Filesystem Component",
+            "homepage": "https://symfony.com",
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-11-30T17:05:38+00:00"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "v5.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "0b9231a5922fd7287ba5b411893c0ecd2733e5ba"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/0b9231a5922fd7287ba5b411893c0ecd2733e5ba",
+                "reference": "0b9231a5922fd7287ba5b411893c0ecd2733e5ba",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Finder\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Finder Component",
+            "homepage": "https://symfony.com",
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-12-08T17:02:38+00:00"
+        },
+        {
+            "name": "symfony/polyfill-ctype",
+            "version": "v1.20.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-ctype.git",
+                "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41",
+                "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-ctype": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.20-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Ctype\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Gert de Pagter",
+                    "email": "BackEndTea@gmail.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for ctype functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "ctype",
+                "polyfill",
+                "portable"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-10-23T14:02:19+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-grapheme",
+            "version": "v1.20.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+                "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c",
+                "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.20-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's grapheme_* functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "grapheme",
+                "intl",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-10-23T14:02:19+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-normalizer",
+            "version": "v1.20.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+                "reference": "727d1096295d807c309fb01a851577302394c897"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897",
+                "reference": "727d1096295d807c309fb01a851577302394c897",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.20-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ],
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's Normalizer class and related functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "intl",
+                "normalizer",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-10-23T14:02:19+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.20.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "39d483bdf39be819deabf04ec872eb0b2410b531"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531",
+                "reference": "39d483bdf39be819deabf04ec872eb0b2410b531",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.20-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-10-23T14:02:19+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php73",
+            "version": "v1.20.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php73.git",
+                "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed",
+                "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.20-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php73\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ],
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-10-23T14:02:19+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php80",
+            "version": "v1.20.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php80.git",
+                "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de",
+                "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.20-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php80\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ],
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ion Bazan",
+                    "email": "ion.bazan@gmail.com"
+                },
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-10-23T14:02:19+00:00"
+        },
+        {
+            "name": "symfony/process",
+            "version": "v5.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/process.git",
+                "reference": "bd8815b8b6705298beaa384f04fabd459c10bedd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/process/zipball/bd8815b8b6705298beaa384f04fabd459c10bedd",
+                "reference": "bd8815b8b6705298beaa384f04fabd459c10bedd",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/polyfill-php80": "^1.15"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Process\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Process Component",
+            "homepage": "https://symfony.com",
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-12-08T17:03:37+00:00"
+        },
+        {
+            "name": "symfony/service-contracts",
+            "version": "v2.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/service-contracts.git",
+                "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+                "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/container": "^1.0"
+            },
+            "suggest": {
+                "symfony/service-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.2-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Service\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to writing services",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-09-07T11:33:47+00:00"
+        },
+        {
+            "name": "symfony/string",
+            "version": "v5.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/string.git",
+                "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/string/zipball/5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed",
+                "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-intl-grapheme": "~1.0",
+                "symfony/polyfill-intl-normalizer": "~1.0",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php80": "~1.15"
+            },
+            "require-dev": {
+                "symfony/error-handler": "^4.4|^5.0",
+                "symfony/http-client": "^4.4|^5.0",
+                "symfony/translation-contracts": "^1.1|^2",
+                "symfony/var-exporter": "^4.4|^5.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\String\\": ""
+                },
+                "files": [
+                    "Resources/functions.php"
+                ],
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony String component",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "grapheme",
+                "i18n",
+                "string",
+                "unicode",
+                "utf-8",
+                "utf8"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-12-05T07:33:16+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": [],
+    "plugin-api-version": "1.1.0"
+}

Some files were not shown because too many files changed in this diff