├── .gitignore
├── tests
├── bootstrap.php
├── IpUtilsTest.php
└── RewriteTest.php
├── phpunit.xml.dist
├── .github
└── workflows
│ └── semgrep.yml
├── composer.json
├── readme.md
├── src
└── CloudFlare
│ ├── IpRewrite.php
│ └── IpUtils.php
└── composer.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | vendor/*
2 | coverage/*
3 |
--------------------------------------------------------------------------------
/tests/bootstrap.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ./tests/
7 |
8 |
9 |
10 |
11 |
12 | ./src
13 |
14 |
15 |
--------------------------------------------------------------------------------
/.github/workflows/semgrep.yml:
--------------------------------------------------------------------------------
1 | on:
2 | pull_request: {}
3 | workflow_dispatch: {}
4 | push:
5 | branches:
6 | - main
7 | - master
8 | schedule:
9 | - cron: '0 0 * * *'
10 | name: Semgrep config
11 | jobs:
12 | semgrep:
13 | name: semgrep/ci
14 | runs-on: ubuntu-latest
15 | env:
16 | SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
17 | SEMGREP_URL: https://cloudflare.semgrep.dev
18 | SEMGREP_APP_URL: https://cloudflare.semgrep.dev
19 | SEMGREP_VERSION_CHECK_URL: https://cloudflare.semgrep.dev/api/check-version
20 | container:
21 | image: semgrep/semgrep
22 | steps:
23 | - uses: actions/checkout@v4
24 | - run: semgrep ci
25 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cloudflare/cf-ip-rewrite",
3 | "description": "Library to rewrite CloudFlare IP Addresses to the end-user IP address",
4 | "version": "1.0.4",
5 | "homepage": "https://github.com/cloudflare/cf-ip-rewrite",
6 | "keywords": [
7 | "ip rewrite",
8 | "cloudflare"
9 | ],
10 | "authors": [
11 | {
12 | "name": "CloudFlare",
13 | "homepage": "http://www.cloudflare.com/"
14 | }
15 | ],
16 | "license": "MIT",
17 | "type": "library",
18 | "scripts": {
19 | "test": "vendor/bin/phpunit -c phpunit.xml.dist",
20 | "format": "vendor/bin/phpcs -n --standard=PSR2 --extensions=php,live.php src/"
21 | },
22 | "require": {
23 | "php": ">=5.3.0"
24 | },
25 | "autoload": {
26 | "psr-0": {
27 | "CloudFlare\\": "src/"
28 | }
29 | },
30 | "require-dev": {
31 | "phpunit/phpunit": "^4.8",
32 | "squizlabs/php_codesniffer": "2.*"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/tests/IpUtilsTest.php:
--------------------------------------------------------------------------------
1 | assertTrue(IpUtils::checkIp($addr, '192.168.1.1'));
12 | $this->assertTrue(IpUtils::checkIp($addr, '192.168.1.1/1'));
13 | $this->assertTrue(IpUtils::checkIp($addr, '192.168.1.0/24'));
14 | $this->assertFalse(IpUtils::checkIp($addr, '1.2.3.4/1'));
15 | $this->assertFalse(IpUtils::checkIp($addr, '192.168.1.1/33')); // invalid subnet
16 | $this->assertTrue(IpUtils::checkIp($addr, array('1.2.3.4/1', '192.168.1.0/24')));
17 | $this->assertTrue(IpUtils::checkIp($addr, array('192.168.1.0/24', '1.2.3.4/1')));
18 | $this->assertFalse(IpUtils::checkIp($addr, array('1.2.3.4/1', '4.3.2.1/1')));
19 | $this->assertTrue(IpUtils::checkIp($addr, '0.0.0.0/0'));
20 | $this->assertTrue(IpUtils::checkIp($addr, '192.168.1.0/0'));
21 | $this->assertFalse(IpUtils::checkIp($addr, '256.256.256/0')); // invalid CIDR notation
22 | }
23 |
24 | public function testIpv6()
25 | {
26 | if (!defined('AF_INET6')) {
27 | $this->markTestSkipped('Only works when PHP is compiled without the option "disable-ipv6".');
28 | }
29 |
30 | $this->assertTrue(IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65'));
31 | $this->assertFalse(IpUtils::checkIp('2a00:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65'));
32 | $this->assertFalse(IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', '::1'));
33 | $this->assertTrue(IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', array('::1', '2a01:198:603:0::/65')));
34 | $this->assertTrue(IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', array('2a01:198:603:0::/65', '::1')));
35 | $this->assertFalse(IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', array('::1', '1a01:198:603:0::/65')));
36 | $this->assertFalse(IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', 'unknown'));
37 | $this->assertTrue(IpUtils::checkIp('0:0:0:0:0:0:0:1', '::1'));
38 | $this->assertFalse(IpUtils::checkIp('0:0:603:0:396e:4789:8e99:0001', '::1'));
39 | $this->assertFalse(IpUtils::checkIp('}__test|O:21:"JDatabaseDriverMysqli":3:{s:2', '::1'));
40 | IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65');
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # Cloudflare PHP IP Rewriting
2 |
3 | This module makes it easy for developers to add rewrite Cloudflare IP Addresses for actual end-user IP Addresses at the application layer. It is recommended to either install mod_cloudflare for Apache or use nginx rewrite rules () if possible.
4 |
5 | For those cases, where the IP can not be guaranteed to be rewritten by one of these alternate means, this module can be used to rewrite the IP address.
6 |
7 | ### How it works
8 | ```php
9 | $ipRewrite = new CloudFlare\IpRewrite();
10 | $is_cf = $ipRewrite->isCloudFlare();
11 | $rewritten_ip = $ipRewrite->getRewrittenIP();
12 | $original_ip = $ipRewrite->getOriginalIP();
13 | ```
14 | The class exposes three methods for interaction and a constructor.
15 |
16 | Initializing `IpRewrite()` object will try to rewrite the IP. If the IP is rewritten, `$_SERVER["REMOTE_ADDR"]` will be updated to reflect the end-user's IP address.
17 |
18 | `isCloudFlare();` returns `true` if the `CF_CONNECTING_IP` header is present in the request and the request originates from a Cloudflare IP.
19 |
20 | `getRewrittenIP()` Returns the rewritten ip address if a rewrite occurs, otherwise it will return `null`.
21 |
22 | `getOriginalIP()` returns the saved original ip address from `$_SERVER["REMOTE_ADDR"]`.
23 |
24 | ### Best Pratice
25 |
26 | ```php
27 | // Initialize object to rewrite the headers
28 | try {
29 | $ipRewrite = new CloudFlare\IpRewrite();
30 | } catch (RuntimeException $e) {
31 | // PHP configurations does not support IPv6
32 | }
33 |
34 | // Check if the request is from Cloudflare
35 | $is_cf = $ipRewrite->isCloudFlare();
36 | if ($is_cf) {
37 | // Get original or rewritten ip
38 | // Order does not matter
39 | ...
40 | $rewritten_ip = $ipRewrite->getRewrittenIP();
41 | ...
42 | $original_ip = $ipRewrite->getOriginalIP();
43 | ...
44 | }
45 | ```
46 |
47 | #### Caution
48 |
49 | Rewrite action is triggered only once in constructor. If `getRewrittenIP()` or `getOriginalIP()` is called multiple times it'll return the first result regardless if a change happened after the first call. Since rewrite action was not triggered.
50 |
51 | To get the newest changes a new `IpRewrite` object should be used.
52 |
53 | ### Testing this module
54 |
55 | This module comes with a set of tests that can be run using phpunit. To run the tests, run `composer install` on the package and then one of the following commands:
56 |
57 | #### Basic Tests
58 |
59 | composer test
60 |
61 | #### With code coverage report in `coverage` folder
62 |
63 | vendor/bin/phpunit -c phpunit.xml.dist --coverage-html coverage
64 |
--------------------------------------------------------------------------------
/src/CloudFlare/IpRewrite.php:
--------------------------------------------------------------------------------
1 | rewrite();
42 | }
43 |
44 | /**
45 | * Is a request from CloudFlare?
46 | * @return bool
47 | */
48 | public function isCloudFlare()
49 | {
50 | if (!isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
51 | return false;
52 | } else {
53 | // Check if original ip has already been restored, e.g. by nginx - assume it was from cloudflare then
54 | if ($_SERVER['REMOTE_ADDR'] === $_SERVER['HTTP_CF_CONNECTING_IP']) {
55 | return true;
56 | }
57 | }
58 |
59 | return $this->isCloudFlareIP();
60 | }
61 |
62 | /**
63 | * Check if a request comes from a CloudFlare IP.
64 | * @return bool
65 | */
66 | public function isCloudFlareIP()
67 | {
68 | // Store original remote address in $original_ip
69 | $this->original_ip = $this->getOriginalIP();
70 | if (!isset($this->original_ip)) {
71 | return false;
72 | }
73 |
74 | // Process original_ip if on cloudflare
75 | $ip_ranges = $this->cf_ipv4;
76 | if (IpUtils::isIpv6($this->original_ip)) {
77 | $ip_ranges = $this->cf_ipv6;
78 | }
79 |
80 | foreach ($ip_ranges as $range) {
81 | if (IpUtils::checkIp($this->original_ip, $range)) {
82 | return true;
83 | }
84 | }
85 |
86 | return false;
87 | }
88 |
89 | /**
90 | * Get the original IP Address of a given request.
91 | * @return IP Address or null on error
92 | */
93 | public function getOriginalIP()
94 | {
95 | // If $original_ip is not set, return the REMOTE_ADDR
96 | if (!isset($this->original_ip)) {
97 | $this->original_ip = $_SERVER['REMOTE_ADDR'];
98 | }
99 |
100 | return $this->original_ip;
101 | }
102 |
103 | /**
104 | * Gets the re-written IP after rewrite() is run.
105 | * @return IP Address or null on error
106 | */
107 | public function getRewrittenIP()
108 | {
109 | return $this->rewritten_ip;
110 | }
111 |
112 | /**
113 | * Handle the rewriting of CloudFlare IP Addresses to end-user IP Addresses.
114 | * NOTE: This function will ultimately rewrite $_SERVER["REMOTE_ADDR"] if the site is on CloudFlare
115 | * @return bool
116 | * @
117 | */
118 | public function rewrite()
119 | {
120 | // only should be run once per page load
121 | if ($this->is_loaded) {
122 | return false;
123 | }
124 | $this->is_loaded = true;
125 |
126 | $is_cf = $this->isCloudFlare();
127 | if (!$is_cf) {
128 | return false;
129 | }
130 |
131 | $this->rewritten_ip = $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
132 | return true;
133 | }
134 | }
135 |
--------------------------------------------------------------------------------
/src/CloudFlare/IpUtils.php:
--------------------------------------------------------------------------------
1 | 1) {
48 | return false;
49 | }
50 |
51 | return true;
52 | }
53 |
54 | /**
55 | * Checks if the ip is v6.
56 | *
57 | * @param string $ip IP to check
58 | *
59 | * @return bool return true if ipv6
60 | */
61 | public static function isIpv6($ip)
62 | {
63 | return !self::isIpv4($ip);
64 | }
65 |
66 | /**
67 | * Compares two IPv4 addresses.
68 | * In case a subnet is given, it checks if it contains the request IP.
69 | *
70 | * @param string $requestIp IPv4 address to check
71 | * @param string $ip IPv4 address or subnet in CIDR notation
72 | *
73 | * @return bool Whether the request IP matches the IP, or whether the request IP is within the CIDR subnet.
74 | */
75 | public static function checkIp4($requestIp, $ip)
76 | {
77 | if (false !== strpos($ip, '/')) {
78 | list($address, $netmask) = explode('/', $ip, 2);
79 |
80 | if ($netmask === '0') {
81 | // Ensure IP is valid - using ip2long below implicitly validates, but we need to do it manually here
82 | return filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
83 | }
84 |
85 | if ($netmask < 0 || $netmask > 32) {
86 | return false;
87 | }
88 | } else {
89 | $address = $ip;
90 | $netmask = 32;
91 | }
92 |
93 | return 0 === substr_compare(sprintf('%032b', ip2long($requestIp)), sprintf('%032b', ip2long($address)), 0, $netmask);
94 | }
95 |
96 | /**
97 | * Compares two IPv6 addresses.
98 | * In case a subnet is given, it checks if it contains the request IP.
99 | *
100 | * @author David Soria Parra
101 | *
102 | * @see https://github.com/dsp/v6tools
103 | *
104 | * @param string $requestIp IPv6 address to check
105 | * @param string $ip IPv6 address or subnet in CIDR notation
106 | *
107 | * @return bool Whether the IP is valid
108 | *
109 | * @throws \RuntimeException When IPV6 support is not enabled
110 | */
111 | public static function checkIp6($requestIp, $ip)
112 | {
113 | if (!((extension_loaded('sockets') && defined('AF_INET6')) || @inet_pton('::1'))) {
114 | throw new \RuntimeException('Unable to check Ipv6. Check that PHP was not compiled with option "disable-ipv6".');
115 | }
116 |
117 | if (false !== strpos($ip, '/')) {
118 | list($address, $netmask) = explode('/', $ip, 2);
119 |
120 | if ($netmask < 1 || $netmask > 128) {
121 | return false;
122 | }
123 | } else {
124 | $address = $ip;
125 | $netmask = 128;
126 | }
127 |
128 | $bytesAddr = unpack('n*', @inet_pton($address));
129 | $bytesTest = unpack('n*', @inet_pton($requestIp));
130 |
131 | if (!$bytesAddr || !$bytesTest) {
132 | return false;
133 | }
134 |
135 | for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; ++$i) {
136 | $left = $netmask - 16 * ($i - 1);
137 | $left = ($left <= 16) ? $left : 16;
138 | $mask = ~(0xffff >> $left) & 0xffff;
139 | if (($bytesAddr[$i] & $mask) != ($bytesTest[$i] & $mask)) {
140 | return false;
141 | }
142 | }
143 |
144 | return true;
145 | }
146 | }
147 |
--------------------------------------------------------------------------------
/tests/RewriteTest.php:
--------------------------------------------------------------------------------
1 | ipRewrite = new IpRewrite();
24 |
25 | $this->assertTrue($this->ipRewrite->isCloudFlare());
26 | $this->assertTrue($this->ipRewrite->isCloudFlareIP());
27 | $this->assertEquals($this->ipRewrite->getRewrittenIP(), $connecting_ip);
28 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr);
29 | }
30 |
31 |
32 | public function testRequestFromCloudFlareNoConnectingIPHeader()
33 | {
34 | $remote_addr = '103.21.244.2';
35 |
36 | $_SERVER['REMOTE_ADDR'] = $remote_addr;
37 |
38 | $this->ipRewrite = new IpRewrite();
39 |
40 | $this->assertFalse($this->ipRewrite->isCloudFlare());
41 | $this->assertTrue($this->ipRewrite->isCloudFlareIP());
42 | $this->assertNull($this->ipRewrite->getRewrittenIP());
43 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr);
44 | }
45 |
46 | public function testOffCloudFlareIPv4()
47 | {
48 | $remote_addr = '8.8.8.8';
49 |
50 | $_SERVER['REMOTE_ADDR'] = $remote_addr;
51 |
52 | $this->ipRewrite = new IpRewrite();
53 |
54 | $this->assertFalse($this->ipRewrite->isCloudFlare());
55 | $this->assertFalse($this->ipRewrite->isCloudFlareIP());
56 | $this->assertNull($this->ipRewrite->getRewrittenIP());
57 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr);
58 | }
59 |
60 | public function testOffCloudFlareIPv4FakeModCloudflare()
61 | {
62 | $remote_addr = '8.8.8.8';
63 | $connecting_ip = '8.8.4.4';
64 |
65 | $_SERVER['REMOTE_ADDR'] = $remote_addr;
66 | $_SERVER['HTTP_CF_CONNECTING_IP'] = $connecting_ip;
67 |
68 | $this->ipRewrite = new IpRewrite();
69 |
70 | $this->assertFalse($this->ipRewrite->isCloudFlare());
71 | $this->assertFalse($this->ipRewrite->isCloudFlareIP());
72 | $this->assertNull($this->ipRewrite->getRewrittenIP());
73 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr);
74 | }
75 |
76 | public function testOnlyProcessOnce()
77 | {
78 | $remote_addr = '108.162.192.2';
79 | $connecting_ip = '8.8.8.8';
80 |
81 | $_SERVER['REMOTE_ADDR'] = $remote_addr;
82 | $_SERVER['HTTP_CF_CONNECTING_IP'] = $connecting_ip;
83 |
84 | $this->ipRewrite = new IpRewrite();
85 |
86 | $this->assertTrue($this->ipRewrite->isCloudFlare());
87 | $this->assertTrue($this->ipRewrite->isCloudFlareIP());
88 | $this->assertEquals($this->ipRewrite->getRewrittenIP(), $connecting_ip);
89 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr);
90 |
91 | // swap values and expect the original still, since it only allows one run per load
92 | $remote_addr2 = '103.21.244.2';
93 | $connecting_ip2 = '8.8.4.4';
94 |
95 | $_SERVER['REMOTE_ADDR'] = $remote_addr2;
96 | $_SERVER['HTTP_CF_CONNECTING_IP'] = $connecting_ip2;
97 |
98 | $this->assertTrue($this->ipRewrite->isCloudFlare());
99 | $this->assertEquals($this->ipRewrite->getRewrittenIP(), $connecting_ip);
100 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr);
101 | }
102 |
103 | public function testOnCloudFlareIPv6()
104 | {
105 | $remote_addr = '2803:f800::23';
106 | $connecting_ip = '2001:4860:4860::8888';
107 |
108 | $_SERVER['REMOTE_ADDR'] = $remote_addr;
109 | $_SERVER['HTTP_CF_CONNECTING_IP'] = $connecting_ip;
110 |
111 | $this->ipRewrite = new IpRewrite();
112 |
113 | $this->assertTrue($this->ipRewrite->isCloudFlare());
114 | $this->assertTrue($this->ipRewrite->isCloudFlareIP());
115 | $this->assertEquals($this->ipRewrite->getRewrittenIP(), $connecting_ip);
116 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr);
117 | }
118 |
119 | public function testOffCloudFlareIPv6()
120 | {
121 | $remote_addr = '2001:4860:4860::8888';
122 |
123 | $_SERVER['REMOTE_ADDR'] = $remote_addr;
124 |
125 | $this->ipRewrite = new IpRewrite();
126 |
127 | $this->assertFalse($this->ipRewrite->isCloudFlare());
128 | $this->assertFalse($this->ipRewrite->isCloudFlare());
129 | $this->assertNull($this->ipRewrite->getRewrittenIP());
130 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr);
131 | }
132 |
133 | public function testRequestFromCloudflareNginxRealIp()
134 | {
135 | $connecting_ip = '8.8.8.8';
136 |
137 | // REMOTE_ADDR already rewritten by Nginx
138 | $_SERVER['REMOTE_ADDR'] = $connecting_ip;
139 | $_SERVER['HTTP_CF_CONNECTING_IP'] = $connecting_ip;
140 |
141 | $this->ipRewrite = new IpRewrite();
142 |
143 | $this->assertTrue($this->ipRewrite->isCloudFlare());
144 | $this->assertEquals($this->ipRewrite->getRewrittenIP(), $connecting_ip);
145 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $connecting_ip);
146 | }
147 | }
148 |
--------------------------------------------------------------------------------
/composer.lock:
--------------------------------------------------------------------------------
1 | {
2 | "_readme": [
3 | "This file locks the dependencies of your project to a known state",
4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5 | "This file is @generated automatically"
6 | ],
7 | "content-hash": "e9a6fb32abac8d89674cef520b820139",
8 | "packages": [],
9 | "packages-dev": [
10 | {
11 | "name": "doctrine/instantiator",
12 | "version": "1.0.5",
13 | "source": {
14 | "type": "git",
15 | "url": "https://github.com/doctrine/instantiator.git",
16 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
17 | },
18 | "dist": {
19 | "type": "zip",
20 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
21 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
22 | "shasum": ""
23 | },
24 | "require": {
25 | "php": ">=5.3,<8.0-DEV"
26 | },
27 | "require-dev": {
28 | "athletic/athletic": "~0.1.8",
29 | "ext-pdo": "*",
30 | "ext-phar": "*",
31 | "phpunit/phpunit": "~4.0",
32 | "squizlabs/php_codesniffer": "~2.0"
33 | },
34 | "type": "library",
35 | "extra": {
36 | "branch-alias": {
37 | "dev-master": "1.0.x-dev"
38 | }
39 | },
40 | "autoload": {
41 | "psr-4": {
42 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
43 | }
44 | },
45 | "notification-url": "https://packagist.org/downloads/",
46 | "license": [
47 | "MIT"
48 | ],
49 | "authors": [
50 | {
51 | "name": "Marco Pivetta",
52 | "email": "ocramius@gmail.com",
53 | "homepage": "http://ocramius.github.com/"
54 | }
55 | ],
56 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
57 | "homepage": "https://github.com/doctrine/instantiator",
58 | "keywords": [
59 | "constructor",
60 | "instantiate"
61 | ],
62 | "time": "2015-06-14T21:17:01+00:00"
63 | },
64 | {
65 | "name": "phpdocumentor/reflection-common",
66 | "version": "1.0.1",
67 | "source": {
68 | "type": "git",
69 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
70 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
71 | },
72 | "dist": {
73 | "type": "zip",
74 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
75 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
76 | "shasum": ""
77 | },
78 | "require": {
79 | "php": ">=5.5"
80 | },
81 | "require-dev": {
82 | "phpunit/phpunit": "^4.6"
83 | },
84 | "type": "library",
85 | "extra": {
86 | "branch-alias": {
87 | "dev-master": "1.0.x-dev"
88 | }
89 | },
90 | "autoload": {
91 | "psr-4": {
92 | "phpDocumentor\\Reflection\\": [
93 | "src"
94 | ]
95 | }
96 | },
97 | "notification-url": "https://packagist.org/downloads/",
98 | "license": [
99 | "MIT"
100 | ],
101 | "authors": [
102 | {
103 | "name": "Jaap van Otterdijk",
104 | "email": "opensource@ijaap.nl"
105 | }
106 | ],
107 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
108 | "homepage": "http://www.phpdoc.org",
109 | "keywords": [
110 | "FQSEN",
111 | "phpDocumentor",
112 | "phpdoc",
113 | "reflection",
114 | "static analysis"
115 | ],
116 | "time": "2017-09-11T18:02:19+00:00"
117 | },
118 | {
119 | "name": "phpdocumentor/reflection-docblock",
120 | "version": "4.1.1",
121 | "source": {
122 | "type": "git",
123 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
124 | "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2"
125 | },
126 | "dist": {
127 | "type": "zip",
128 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/2d3d238c433cf69caeb4842e97a3223a116f94b2",
129 | "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2",
130 | "shasum": ""
131 | },
132 | "require": {
133 | "php": "^7.0",
134 | "phpdocumentor/reflection-common": "^1.0@dev",
135 | "phpdocumentor/type-resolver": "^0.4.0",
136 | "webmozart/assert": "^1.0"
137 | },
138 | "require-dev": {
139 | "mockery/mockery": "^0.9.4",
140 | "phpunit/phpunit": "^4.4"
141 | },
142 | "type": "library",
143 | "autoload": {
144 | "psr-4": {
145 | "phpDocumentor\\Reflection\\": [
146 | "src/"
147 | ]
148 | }
149 | },
150 | "notification-url": "https://packagist.org/downloads/",
151 | "license": [
152 | "MIT"
153 | ],
154 | "authors": [
155 | {
156 | "name": "Mike van Riel",
157 | "email": "me@mikevanriel.com"
158 | }
159 | ],
160 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
161 | "time": "2017-08-30T18:51:59+00:00"
162 | },
163 | {
164 | "name": "phpdocumentor/type-resolver",
165 | "version": "0.4.0",
166 | "source": {
167 | "type": "git",
168 | "url": "https://github.com/phpDocumentor/TypeResolver.git",
169 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
170 | },
171 | "dist": {
172 | "type": "zip",
173 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7",
174 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
175 | "shasum": ""
176 | },
177 | "require": {
178 | "php": "^5.5 || ^7.0",
179 | "phpdocumentor/reflection-common": "^1.0"
180 | },
181 | "require-dev": {
182 | "mockery/mockery": "^0.9.4",
183 | "phpunit/phpunit": "^5.2||^4.8.24"
184 | },
185 | "type": "library",
186 | "extra": {
187 | "branch-alias": {
188 | "dev-master": "1.0.x-dev"
189 | }
190 | },
191 | "autoload": {
192 | "psr-4": {
193 | "phpDocumentor\\Reflection\\": [
194 | "src/"
195 | ]
196 | }
197 | },
198 | "notification-url": "https://packagist.org/downloads/",
199 | "license": [
200 | "MIT"
201 | ],
202 | "authors": [
203 | {
204 | "name": "Mike van Riel",
205 | "email": "me@mikevanriel.com"
206 | }
207 | ],
208 | "time": "2017-07-14T14:27:02+00:00"
209 | },
210 | {
211 | "name": "phpspec/prophecy",
212 | "version": "v1.7.2",
213 | "source": {
214 | "type": "git",
215 | "url": "https://github.com/phpspec/prophecy.git",
216 | "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6"
217 | },
218 | "dist": {
219 | "type": "zip",
220 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6",
221 | "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6",
222 | "shasum": ""
223 | },
224 | "require": {
225 | "doctrine/instantiator": "^1.0.2",
226 | "php": "^5.3|^7.0",
227 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
228 | "sebastian/comparator": "^1.1|^2.0",
229 | "sebastian/recursion-context": "^1.0|^2.0|^3.0"
230 | },
231 | "require-dev": {
232 | "phpspec/phpspec": "^2.5|^3.2",
233 | "phpunit/phpunit": "^4.8 || ^5.6.5"
234 | },
235 | "type": "library",
236 | "extra": {
237 | "branch-alias": {
238 | "dev-master": "1.7.x-dev"
239 | }
240 | },
241 | "autoload": {
242 | "psr-0": {
243 | "Prophecy\\": "src/"
244 | }
245 | },
246 | "notification-url": "https://packagist.org/downloads/",
247 | "license": [
248 | "MIT"
249 | ],
250 | "authors": [
251 | {
252 | "name": "Konstantin Kudryashov",
253 | "email": "ever.zet@gmail.com",
254 | "homepage": "http://everzet.com"
255 | },
256 | {
257 | "name": "Marcello Duarte",
258 | "email": "marcello.duarte@gmail.com"
259 | }
260 | ],
261 | "description": "Highly opinionated mocking framework for PHP 5.3+",
262 | "homepage": "https://github.com/phpspec/prophecy",
263 | "keywords": [
264 | "Double",
265 | "Dummy",
266 | "fake",
267 | "mock",
268 | "spy",
269 | "stub"
270 | ],
271 | "time": "2017-09-04T11:05:03+00:00"
272 | },
273 | {
274 | "name": "phpunit/php-code-coverage",
275 | "version": "2.2.4",
276 | "source": {
277 | "type": "git",
278 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
279 | "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
280 | },
281 | "dist": {
282 | "type": "zip",
283 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
284 | "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
285 | "shasum": ""
286 | },
287 | "require": {
288 | "php": ">=5.3.3",
289 | "phpunit/php-file-iterator": "~1.3",
290 | "phpunit/php-text-template": "~1.2",
291 | "phpunit/php-token-stream": "~1.3",
292 | "sebastian/environment": "^1.3.2",
293 | "sebastian/version": "~1.0"
294 | },
295 | "require-dev": {
296 | "ext-xdebug": ">=2.1.4",
297 | "phpunit/phpunit": "~4"
298 | },
299 | "suggest": {
300 | "ext-dom": "*",
301 | "ext-xdebug": ">=2.2.1",
302 | "ext-xmlwriter": "*"
303 | },
304 | "type": "library",
305 | "extra": {
306 | "branch-alias": {
307 | "dev-master": "2.2.x-dev"
308 | }
309 | },
310 | "autoload": {
311 | "classmap": [
312 | "src/"
313 | ]
314 | },
315 | "notification-url": "https://packagist.org/downloads/",
316 | "license": [
317 | "BSD-3-Clause"
318 | ],
319 | "authors": [
320 | {
321 | "name": "Sebastian Bergmann",
322 | "email": "sb@sebastian-bergmann.de",
323 | "role": "lead"
324 | }
325 | ],
326 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
327 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
328 | "keywords": [
329 | "coverage",
330 | "testing",
331 | "xunit"
332 | ],
333 | "time": "2015-10-06T15:47:00+00:00"
334 | },
335 | {
336 | "name": "phpunit/php-file-iterator",
337 | "version": "1.4.2",
338 | "source": {
339 | "type": "git",
340 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
341 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
342 | },
343 | "dist": {
344 | "type": "zip",
345 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
346 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
347 | "shasum": ""
348 | },
349 | "require": {
350 | "php": ">=5.3.3"
351 | },
352 | "type": "library",
353 | "extra": {
354 | "branch-alias": {
355 | "dev-master": "1.4.x-dev"
356 | }
357 | },
358 | "autoload": {
359 | "classmap": [
360 | "src/"
361 | ]
362 | },
363 | "notification-url": "https://packagist.org/downloads/",
364 | "license": [
365 | "BSD-3-Clause"
366 | ],
367 | "authors": [
368 | {
369 | "name": "Sebastian Bergmann",
370 | "email": "sb@sebastian-bergmann.de",
371 | "role": "lead"
372 | }
373 | ],
374 | "description": "FilterIterator implementation that filters files based on a list of suffixes.",
375 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
376 | "keywords": [
377 | "filesystem",
378 | "iterator"
379 | ],
380 | "time": "2016-10-03T07:40:28+00:00"
381 | },
382 | {
383 | "name": "phpunit/php-text-template",
384 | "version": "1.2.1",
385 | "source": {
386 | "type": "git",
387 | "url": "https://github.com/sebastianbergmann/php-text-template.git",
388 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
389 | },
390 | "dist": {
391 | "type": "zip",
392 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
393 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
394 | "shasum": ""
395 | },
396 | "require": {
397 | "php": ">=5.3.3"
398 | },
399 | "type": "library",
400 | "autoload": {
401 | "classmap": [
402 | "src/"
403 | ]
404 | },
405 | "notification-url": "https://packagist.org/downloads/",
406 | "license": [
407 | "BSD-3-Clause"
408 | ],
409 | "authors": [
410 | {
411 | "name": "Sebastian Bergmann",
412 | "email": "sebastian@phpunit.de",
413 | "role": "lead"
414 | }
415 | ],
416 | "description": "Simple template engine.",
417 | "homepage": "https://github.com/sebastianbergmann/php-text-template/",
418 | "keywords": [
419 | "template"
420 | ],
421 | "time": "2015-06-21T13:50:34+00:00"
422 | },
423 | {
424 | "name": "phpunit/php-timer",
425 | "version": "1.0.9",
426 | "source": {
427 | "type": "git",
428 | "url": "https://github.com/sebastianbergmann/php-timer.git",
429 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
430 | },
431 | "dist": {
432 | "type": "zip",
433 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
434 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
435 | "shasum": ""
436 | },
437 | "require": {
438 | "php": "^5.3.3 || ^7.0"
439 | },
440 | "require-dev": {
441 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
442 | },
443 | "type": "library",
444 | "extra": {
445 | "branch-alias": {
446 | "dev-master": "1.0-dev"
447 | }
448 | },
449 | "autoload": {
450 | "classmap": [
451 | "src/"
452 | ]
453 | },
454 | "notification-url": "https://packagist.org/downloads/",
455 | "license": [
456 | "BSD-3-Clause"
457 | ],
458 | "authors": [
459 | {
460 | "name": "Sebastian Bergmann",
461 | "email": "sb@sebastian-bergmann.de",
462 | "role": "lead"
463 | }
464 | ],
465 | "description": "Utility class for timing",
466 | "homepage": "https://github.com/sebastianbergmann/php-timer/",
467 | "keywords": [
468 | "timer"
469 | ],
470 | "time": "2017-02-26T11:10:40+00:00"
471 | },
472 | {
473 | "name": "phpunit/php-token-stream",
474 | "version": "1.4.11",
475 | "source": {
476 | "type": "git",
477 | "url": "https://github.com/sebastianbergmann/php-token-stream.git",
478 | "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7"
479 | },
480 | "dist": {
481 | "type": "zip",
482 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7",
483 | "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7",
484 | "shasum": ""
485 | },
486 | "require": {
487 | "ext-tokenizer": "*",
488 | "php": ">=5.3.3"
489 | },
490 | "require-dev": {
491 | "phpunit/phpunit": "~4.2"
492 | },
493 | "type": "library",
494 | "extra": {
495 | "branch-alias": {
496 | "dev-master": "1.4-dev"
497 | }
498 | },
499 | "autoload": {
500 | "classmap": [
501 | "src/"
502 | ]
503 | },
504 | "notification-url": "https://packagist.org/downloads/",
505 | "license": [
506 | "BSD-3-Clause"
507 | ],
508 | "authors": [
509 | {
510 | "name": "Sebastian Bergmann",
511 | "email": "sebastian@phpunit.de"
512 | }
513 | ],
514 | "description": "Wrapper around PHP's tokenizer extension.",
515 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
516 | "keywords": [
517 | "tokenizer"
518 | ],
519 | "time": "2017-02-27T10:12:30+00:00"
520 | },
521 | {
522 | "name": "phpunit/phpunit",
523 | "version": "4.8.36",
524 | "source": {
525 | "type": "git",
526 | "url": "https://github.com/sebastianbergmann/phpunit.git",
527 | "reference": "46023de9a91eec7dfb06cc56cb4e260017298517"
528 | },
529 | "dist": {
530 | "type": "zip",
531 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517",
532 | "reference": "46023de9a91eec7dfb06cc56cb4e260017298517",
533 | "shasum": ""
534 | },
535 | "require": {
536 | "ext-dom": "*",
537 | "ext-json": "*",
538 | "ext-pcre": "*",
539 | "ext-reflection": "*",
540 | "ext-spl": "*",
541 | "php": ">=5.3.3",
542 | "phpspec/prophecy": "^1.3.1",
543 | "phpunit/php-code-coverage": "~2.1",
544 | "phpunit/php-file-iterator": "~1.4",
545 | "phpunit/php-text-template": "~1.2",
546 | "phpunit/php-timer": "^1.0.6",
547 | "phpunit/phpunit-mock-objects": "~2.3",
548 | "sebastian/comparator": "~1.2.2",
549 | "sebastian/diff": "~1.2",
550 | "sebastian/environment": "~1.3",
551 | "sebastian/exporter": "~1.2",
552 | "sebastian/global-state": "~1.0",
553 | "sebastian/version": "~1.0",
554 | "symfony/yaml": "~2.1|~3.0"
555 | },
556 | "suggest": {
557 | "phpunit/php-invoker": "~1.1"
558 | },
559 | "bin": [
560 | "phpunit"
561 | ],
562 | "type": "library",
563 | "extra": {
564 | "branch-alias": {
565 | "dev-master": "4.8.x-dev"
566 | }
567 | },
568 | "autoload": {
569 | "classmap": [
570 | "src/"
571 | ]
572 | },
573 | "notification-url": "https://packagist.org/downloads/",
574 | "license": [
575 | "BSD-3-Clause"
576 | ],
577 | "authors": [
578 | {
579 | "name": "Sebastian Bergmann",
580 | "email": "sebastian@phpunit.de",
581 | "role": "lead"
582 | }
583 | ],
584 | "description": "The PHP Unit Testing framework.",
585 | "homepage": "https://phpunit.de/",
586 | "keywords": [
587 | "phpunit",
588 | "testing",
589 | "xunit"
590 | ],
591 | "time": "2017-06-21T08:07:12+00:00"
592 | },
593 | {
594 | "name": "phpunit/phpunit-mock-objects",
595 | "version": "2.3.8",
596 | "source": {
597 | "type": "git",
598 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
599 | "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
600 | },
601 | "dist": {
602 | "type": "zip",
603 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
604 | "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
605 | "shasum": ""
606 | },
607 | "require": {
608 | "doctrine/instantiator": "^1.0.2",
609 | "php": ">=5.3.3",
610 | "phpunit/php-text-template": "~1.2",
611 | "sebastian/exporter": "~1.2"
612 | },
613 | "require-dev": {
614 | "phpunit/phpunit": "~4.4"
615 | },
616 | "suggest": {
617 | "ext-soap": "*"
618 | },
619 | "type": "library",
620 | "extra": {
621 | "branch-alias": {
622 | "dev-master": "2.3.x-dev"
623 | }
624 | },
625 | "autoload": {
626 | "classmap": [
627 | "src/"
628 | ]
629 | },
630 | "notification-url": "https://packagist.org/downloads/",
631 | "license": [
632 | "BSD-3-Clause"
633 | ],
634 | "authors": [
635 | {
636 | "name": "Sebastian Bergmann",
637 | "email": "sb@sebastian-bergmann.de",
638 | "role": "lead"
639 | }
640 | ],
641 | "description": "Mock Object library for PHPUnit",
642 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
643 | "keywords": [
644 | "mock",
645 | "xunit"
646 | ],
647 | "time": "2015-10-02T06:51:40+00:00"
648 | },
649 | {
650 | "name": "sebastian/comparator",
651 | "version": "1.2.4",
652 | "source": {
653 | "type": "git",
654 | "url": "https://github.com/sebastianbergmann/comparator.git",
655 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
656 | },
657 | "dist": {
658 | "type": "zip",
659 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
660 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
661 | "shasum": ""
662 | },
663 | "require": {
664 | "php": ">=5.3.3",
665 | "sebastian/diff": "~1.2",
666 | "sebastian/exporter": "~1.2 || ~2.0"
667 | },
668 | "require-dev": {
669 | "phpunit/phpunit": "~4.4"
670 | },
671 | "type": "library",
672 | "extra": {
673 | "branch-alias": {
674 | "dev-master": "1.2.x-dev"
675 | }
676 | },
677 | "autoload": {
678 | "classmap": [
679 | "src/"
680 | ]
681 | },
682 | "notification-url": "https://packagist.org/downloads/",
683 | "license": [
684 | "BSD-3-Clause"
685 | ],
686 | "authors": [
687 | {
688 | "name": "Jeff Welch",
689 | "email": "whatthejeff@gmail.com"
690 | },
691 | {
692 | "name": "Volker Dusch",
693 | "email": "github@wallbash.com"
694 | },
695 | {
696 | "name": "Bernhard Schussek",
697 | "email": "bschussek@2bepublished.at"
698 | },
699 | {
700 | "name": "Sebastian Bergmann",
701 | "email": "sebastian@phpunit.de"
702 | }
703 | ],
704 | "description": "Provides the functionality to compare PHP values for equality",
705 | "homepage": "http://www.github.com/sebastianbergmann/comparator",
706 | "keywords": [
707 | "comparator",
708 | "compare",
709 | "equality"
710 | ],
711 | "time": "2017-01-29T09:50:25+00:00"
712 | },
713 | {
714 | "name": "sebastian/diff",
715 | "version": "1.4.3",
716 | "source": {
717 | "type": "git",
718 | "url": "https://github.com/sebastianbergmann/diff.git",
719 | "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
720 | },
721 | "dist": {
722 | "type": "zip",
723 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
724 | "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
725 | "shasum": ""
726 | },
727 | "require": {
728 | "php": "^5.3.3 || ^7.0"
729 | },
730 | "require-dev": {
731 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
732 | },
733 | "type": "library",
734 | "extra": {
735 | "branch-alias": {
736 | "dev-master": "1.4-dev"
737 | }
738 | },
739 | "autoload": {
740 | "classmap": [
741 | "src/"
742 | ]
743 | },
744 | "notification-url": "https://packagist.org/downloads/",
745 | "license": [
746 | "BSD-3-Clause"
747 | ],
748 | "authors": [
749 | {
750 | "name": "Kore Nordmann",
751 | "email": "mail@kore-nordmann.de"
752 | },
753 | {
754 | "name": "Sebastian Bergmann",
755 | "email": "sebastian@phpunit.de"
756 | }
757 | ],
758 | "description": "Diff implementation",
759 | "homepage": "https://github.com/sebastianbergmann/diff",
760 | "keywords": [
761 | "diff"
762 | ],
763 | "time": "2017-05-22T07:24:03+00:00"
764 | },
765 | {
766 | "name": "sebastian/environment",
767 | "version": "1.3.8",
768 | "source": {
769 | "type": "git",
770 | "url": "https://github.com/sebastianbergmann/environment.git",
771 | "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
772 | },
773 | "dist": {
774 | "type": "zip",
775 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
776 | "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
777 | "shasum": ""
778 | },
779 | "require": {
780 | "php": "^5.3.3 || ^7.0"
781 | },
782 | "require-dev": {
783 | "phpunit/phpunit": "^4.8 || ^5.0"
784 | },
785 | "type": "library",
786 | "extra": {
787 | "branch-alias": {
788 | "dev-master": "1.3.x-dev"
789 | }
790 | },
791 | "autoload": {
792 | "classmap": [
793 | "src/"
794 | ]
795 | },
796 | "notification-url": "https://packagist.org/downloads/",
797 | "license": [
798 | "BSD-3-Clause"
799 | ],
800 | "authors": [
801 | {
802 | "name": "Sebastian Bergmann",
803 | "email": "sebastian@phpunit.de"
804 | }
805 | ],
806 | "description": "Provides functionality to handle HHVM/PHP environments",
807 | "homepage": "http://www.github.com/sebastianbergmann/environment",
808 | "keywords": [
809 | "Xdebug",
810 | "environment",
811 | "hhvm"
812 | ],
813 | "time": "2016-08-18T05:49:44+00:00"
814 | },
815 | {
816 | "name": "sebastian/exporter",
817 | "version": "1.2.2",
818 | "source": {
819 | "type": "git",
820 | "url": "https://github.com/sebastianbergmann/exporter.git",
821 | "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
822 | },
823 | "dist": {
824 | "type": "zip",
825 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
826 | "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
827 | "shasum": ""
828 | },
829 | "require": {
830 | "php": ">=5.3.3",
831 | "sebastian/recursion-context": "~1.0"
832 | },
833 | "require-dev": {
834 | "ext-mbstring": "*",
835 | "phpunit/phpunit": "~4.4"
836 | },
837 | "type": "library",
838 | "extra": {
839 | "branch-alias": {
840 | "dev-master": "1.3.x-dev"
841 | }
842 | },
843 | "autoload": {
844 | "classmap": [
845 | "src/"
846 | ]
847 | },
848 | "notification-url": "https://packagist.org/downloads/",
849 | "license": [
850 | "BSD-3-Clause"
851 | ],
852 | "authors": [
853 | {
854 | "name": "Jeff Welch",
855 | "email": "whatthejeff@gmail.com"
856 | },
857 | {
858 | "name": "Volker Dusch",
859 | "email": "github@wallbash.com"
860 | },
861 | {
862 | "name": "Bernhard Schussek",
863 | "email": "bschussek@2bepublished.at"
864 | },
865 | {
866 | "name": "Sebastian Bergmann",
867 | "email": "sebastian@phpunit.de"
868 | },
869 | {
870 | "name": "Adam Harvey",
871 | "email": "aharvey@php.net"
872 | }
873 | ],
874 | "description": "Provides the functionality to export PHP variables for visualization",
875 | "homepage": "http://www.github.com/sebastianbergmann/exporter",
876 | "keywords": [
877 | "export",
878 | "exporter"
879 | ],
880 | "time": "2016-06-17T09:04:28+00:00"
881 | },
882 | {
883 | "name": "sebastian/global-state",
884 | "version": "1.1.1",
885 | "source": {
886 | "type": "git",
887 | "url": "https://github.com/sebastianbergmann/global-state.git",
888 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
889 | },
890 | "dist": {
891 | "type": "zip",
892 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
893 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
894 | "shasum": ""
895 | },
896 | "require": {
897 | "php": ">=5.3.3"
898 | },
899 | "require-dev": {
900 | "phpunit/phpunit": "~4.2"
901 | },
902 | "suggest": {
903 | "ext-uopz": "*"
904 | },
905 | "type": "library",
906 | "extra": {
907 | "branch-alias": {
908 | "dev-master": "1.0-dev"
909 | }
910 | },
911 | "autoload": {
912 | "classmap": [
913 | "src/"
914 | ]
915 | },
916 | "notification-url": "https://packagist.org/downloads/",
917 | "license": [
918 | "BSD-3-Clause"
919 | ],
920 | "authors": [
921 | {
922 | "name": "Sebastian Bergmann",
923 | "email": "sebastian@phpunit.de"
924 | }
925 | ],
926 | "description": "Snapshotting of global state",
927 | "homepage": "http://www.github.com/sebastianbergmann/global-state",
928 | "keywords": [
929 | "global state"
930 | ],
931 | "time": "2015-10-12T03:26:01+00:00"
932 | },
933 | {
934 | "name": "sebastian/recursion-context",
935 | "version": "1.0.5",
936 | "source": {
937 | "type": "git",
938 | "url": "https://github.com/sebastianbergmann/recursion-context.git",
939 | "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7"
940 | },
941 | "dist": {
942 | "type": "zip",
943 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7",
944 | "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7",
945 | "shasum": ""
946 | },
947 | "require": {
948 | "php": ">=5.3.3"
949 | },
950 | "require-dev": {
951 | "phpunit/phpunit": "~4.4"
952 | },
953 | "type": "library",
954 | "extra": {
955 | "branch-alias": {
956 | "dev-master": "1.0.x-dev"
957 | }
958 | },
959 | "autoload": {
960 | "classmap": [
961 | "src/"
962 | ]
963 | },
964 | "notification-url": "https://packagist.org/downloads/",
965 | "license": [
966 | "BSD-3-Clause"
967 | ],
968 | "authors": [
969 | {
970 | "name": "Jeff Welch",
971 | "email": "whatthejeff@gmail.com"
972 | },
973 | {
974 | "name": "Sebastian Bergmann",
975 | "email": "sebastian@phpunit.de"
976 | },
977 | {
978 | "name": "Adam Harvey",
979 | "email": "aharvey@php.net"
980 | }
981 | ],
982 | "description": "Provides functionality to recursively process PHP variables",
983 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
984 | "time": "2016-10-03T07:41:43+00:00"
985 | },
986 | {
987 | "name": "sebastian/version",
988 | "version": "1.0.6",
989 | "source": {
990 | "type": "git",
991 | "url": "https://github.com/sebastianbergmann/version.git",
992 | "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
993 | },
994 | "dist": {
995 | "type": "zip",
996 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
997 | "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
998 | "shasum": ""
999 | },
1000 | "type": "library",
1001 | "autoload": {
1002 | "classmap": [
1003 | "src/"
1004 | ]
1005 | },
1006 | "notification-url": "https://packagist.org/downloads/",
1007 | "license": [
1008 | "BSD-3-Clause"
1009 | ],
1010 | "authors": [
1011 | {
1012 | "name": "Sebastian Bergmann",
1013 | "email": "sebastian@phpunit.de",
1014 | "role": "lead"
1015 | }
1016 | ],
1017 | "description": "Library that helps with managing the version number of Git-hosted PHP projects",
1018 | "homepage": "https://github.com/sebastianbergmann/version",
1019 | "time": "2015-06-21T13:59:46+00:00"
1020 | },
1021 | {
1022 | "name": "squizlabs/php_codesniffer",
1023 | "version": "2.9.1",
1024 | "source": {
1025 | "type": "git",
1026 | "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
1027 | "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62"
1028 | },
1029 | "dist": {
1030 | "type": "zip",
1031 | "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dcbed1074f8244661eecddfc2a675430d8d33f62",
1032 | "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62",
1033 | "shasum": ""
1034 | },
1035 | "require": {
1036 | "ext-simplexml": "*",
1037 | "ext-tokenizer": "*",
1038 | "ext-xmlwriter": "*",
1039 | "php": ">=5.1.2"
1040 | },
1041 | "require-dev": {
1042 | "phpunit/phpunit": "~4.0"
1043 | },
1044 | "bin": [
1045 | "scripts/phpcs",
1046 | "scripts/phpcbf"
1047 | ],
1048 | "type": "library",
1049 | "extra": {
1050 | "branch-alias": {
1051 | "dev-master": "2.x-dev"
1052 | }
1053 | },
1054 | "autoload": {
1055 | "classmap": [
1056 | "CodeSniffer.php",
1057 | "CodeSniffer/CLI.php",
1058 | "CodeSniffer/Exception.php",
1059 | "CodeSniffer/File.php",
1060 | "CodeSniffer/Fixer.php",
1061 | "CodeSniffer/Report.php",
1062 | "CodeSniffer/Reporting.php",
1063 | "CodeSniffer/Sniff.php",
1064 | "CodeSniffer/Tokens.php",
1065 | "CodeSniffer/Reports/",
1066 | "CodeSniffer/Tokenizers/",
1067 | "CodeSniffer/DocGenerators/",
1068 | "CodeSniffer/Standards/AbstractPatternSniff.php",
1069 | "CodeSniffer/Standards/AbstractScopeSniff.php",
1070 | "CodeSniffer/Standards/AbstractVariableSniff.php",
1071 | "CodeSniffer/Standards/IncorrectPatternException.php",
1072 | "CodeSniffer/Standards/Generic/Sniffs/",
1073 | "CodeSniffer/Standards/MySource/Sniffs/",
1074 | "CodeSniffer/Standards/PEAR/Sniffs/",
1075 | "CodeSniffer/Standards/PSR1/Sniffs/",
1076 | "CodeSniffer/Standards/PSR2/Sniffs/",
1077 | "CodeSniffer/Standards/Squiz/Sniffs/",
1078 | "CodeSniffer/Standards/Zend/Sniffs/"
1079 | ]
1080 | },
1081 | "notification-url": "https://packagist.org/downloads/",
1082 | "license": [
1083 | "BSD-3-Clause"
1084 | ],
1085 | "authors": [
1086 | {
1087 | "name": "Greg Sherwood",
1088 | "role": "lead"
1089 | }
1090 | ],
1091 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
1092 | "homepage": "http://www.squizlabs.com/php-codesniffer",
1093 | "keywords": [
1094 | "phpcs",
1095 | "standards"
1096 | ],
1097 | "time": "2017-05-22T02:43:20+00:00"
1098 | },
1099 | {
1100 | "name": "symfony/yaml",
1101 | "version": "v3.3.10",
1102 | "source": {
1103 | "type": "git",
1104 | "url": "https://github.com/symfony/yaml.git",
1105 | "reference": "8c7bf1e7d5d6b05a690b715729cb4cd0c0a99c46"
1106 | },
1107 | "dist": {
1108 | "type": "zip",
1109 | "url": "https://api.github.com/repos/symfony/yaml/zipball/8c7bf1e7d5d6b05a690b715729cb4cd0c0a99c46",
1110 | "reference": "8c7bf1e7d5d6b05a690b715729cb4cd0c0a99c46",
1111 | "shasum": ""
1112 | },
1113 | "require": {
1114 | "php": "^5.5.9|>=7.0.8"
1115 | },
1116 | "require-dev": {
1117 | "symfony/console": "~2.8|~3.0"
1118 | },
1119 | "suggest": {
1120 | "symfony/console": "For validating YAML files using the lint command"
1121 | },
1122 | "type": "library",
1123 | "extra": {
1124 | "branch-alias": {
1125 | "dev-master": "3.3-dev"
1126 | }
1127 | },
1128 | "autoload": {
1129 | "psr-4": {
1130 | "Symfony\\Component\\Yaml\\": ""
1131 | },
1132 | "exclude-from-classmap": [
1133 | "/Tests/"
1134 | ]
1135 | },
1136 | "notification-url": "https://packagist.org/downloads/",
1137 | "license": [
1138 | "MIT"
1139 | ],
1140 | "authors": [
1141 | {
1142 | "name": "Fabien Potencier",
1143 | "email": "fabien@symfony.com"
1144 | },
1145 | {
1146 | "name": "Symfony Community",
1147 | "homepage": "https://symfony.com/contributors"
1148 | }
1149 | ],
1150 | "description": "Symfony Yaml Component",
1151 | "homepage": "https://symfony.com",
1152 | "time": "2017-10-05T14:43:42+00:00"
1153 | },
1154 | {
1155 | "name": "webmozart/assert",
1156 | "version": "1.2.0",
1157 | "source": {
1158 | "type": "git",
1159 | "url": "https://github.com/webmozart/assert.git",
1160 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
1161 | },
1162 | "dist": {
1163 | "type": "zip",
1164 | "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f",
1165 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
1166 | "shasum": ""
1167 | },
1168 | "require": {
1169 | "php": "^5.3.3 || ^7.0"
1170 | },
1171 | "require-dev": {
1172 | "phpunit/phpunit": "^4.6",
1173 | "sebastian/version": "^1.0.1"
1174 | },
1175 | "type": "library",
1176 | "extra": {
1177 | "branch-alias": {
1178 | "dev-master": "1.3-dev"
1179 | }
1180 | },
1181 | "autoload": {
1182 | "psr-4": {
1183 | "Webmozart\\Assert\\": "src/"
1184 | }
1185 | },
1186 | "notification-url": "https://packagist.org/downloads/",
1187 | "license": [
1188 | "MIT"
1189 | ],
1190 | "authors": [
1191 | {
1192 | "name": "Bernhard Schussek",
1193 | "email": "bschussek@gmail.com"
1194 | }
1195 | ],
1196 | "description": "Assertions to validate method input/output with nice error messages.",
1197 | "keywords": [
1198 | "assert",
1199 | "check",
1200 | "validate"
1201 | ],
1202 | "time": "2016-11-23T20:04:58+00:00"
1203 | }
1204 | ],
1205 | "aliases": [],
1206 | "minimum-stability": "stable",
1207 | "stability-flags": [],
1208 | "prefer-stable": false,
1209 | "prefer-lowest": false,
1210 | "platform": {
1211 | "php": ">=5.3.0"
1212 | },
1213 | "platform-dev": []
1214 | }
1215 |
--------------------------------------------------------------------------------