anxietypb
8 years ago
commit
b79c55cc63
193 changed files with 35930 additions and 0 deletions
-
1README.md
-
4api/.htaccess
-
47api/cron.php
-
105api/index.php
-
35app/index/controllers/ApplicationController.js
-
78app/index/controllers/IndexCtrl.js
-
26app/topologyManager.js
-
5composer.json
-
255composer.lock
-
2css/bootstrap-material-design.min.css
-
6css/bootstrap.min.css
-
BINfonts/glyphicons-halflings-regular.eot
-
288fonts/glyphicons-halflings-regular.svg
-
BINfonts/glyphicons-halflings-regular.ttf
-
BINfonts/glyphicons-halflings-regular.woff
-
BINfonts/glyphicons-halflings-regular.woff2
-
62index.html
-
1022js/angular-route.js
-
314js/angular.min.js
-
16404js/lodash.js
-
492js/moment.js
-
6js/restangular.min.js
-
10js/ui-bootstrap-tpls-2.2.0.min.js
-
111partials/index.html
-
25partials/navbar.html
-
7vendor/autoload.php
-
415vendor/composer/ClassLoader.php
-
21vendor/composer/LICENSE
-
9vendor/composer/autoload_classmap.php
-
10vendor/composer/autoload_files.php
-
10vendor/composer/autoload_namespaces.php
-
13vendor/composer/autoload_psr4.php
-
70vendor/composer/autoload_real.php
-
70vendor/composer/autoload_static.php
-
248vendor/composer/installed.json
-
3vendor/container-interop/container-interop/.gitignore
-
20vendor/container-interop/container-interop/LICENSE
-
85vendor/container-interop/container-interop/README.md
-
11vendor/container-interop/container-interop/composer.json
-
114vendor/container-interop/container-interop/docs/ContainerInterface-meta.md
-
153vendor/container-interop/container-interop/docs/ContainerInterface.md
-
259vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md
-
60vendor/container-interop/container-interop/docs/Delegate-lookup.md
-
BINvendor/container-interop/container-interop/docs/images/interoperating_containers.png
-
BINvendor/container-interop/container-interop/docs/images/priority.png
-
BINvendor/container-interop/container-interop/docs/images/side_by_side_containers.png
-
37vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php
-
13vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php
-
13vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php
-
1vendor/nikic/fast-route/.hhconfig
-
12vendor/nikic/fast-route/.travis.yml
-
126vendor/nikic/fast-route/FastRoute.hhi
-
31vendor/nikic/fast-route/LICENSE
-
273vendor/nikic/fast-route/README.md
-
21vendor/nikic/fast-route/composer.json
-
24vendor/nikic/fast-route/phpunit.xml
-
6vendor/nikic/fast-route/src/BadRouteException.php
-
25vendor/nikic/fast-route/src/DataGenerator.php
-
28vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php
-
28vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php
-
25vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php
-
25vendor/nikic/fast-route/src/DataGenerator/MarkBased.php
-
144vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php
-
25vendor/nikic/fast-route/src/Dispatcher.php
-
28vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php
-
28vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php
-
30vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php
-
28vendor/nikic/fast-route/src/Dispatcher/MarkBased.php
-
80vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php
-
38vendor/nikic/fast-route/src/Route.php
-
46vendor/nikic/fast-route/src/RouteCollector.php
-
36vendor/nikic/fast-route/src/RouteParser.php
-
81vendor/nikic/fast-route/src/RouteParser/Std.php
-
12vendor/nikic/fast-route/src/bootstrap.php
-
70vendor/nikic/fast-route/src/functions.php
-
13vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php
-
561vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php
-
13vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php
-
13vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php
-
20vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php
-
39vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php
-
29vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php
-
11vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php
-
11vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php
-
147vendor/nikic/fast-route/test/RouteParser/StdTest.php
-
11vendor/nikic/fast-route/test/bootstrap.php
-
3vendor/pimple/pimple/.gitignore
-
32vendor/pimple/pimple/.travis.yml
-
35vendor/pimple/pimple/CHANGELOG
-
19vendor/pimple/pimple/LICENSE
-
201vendor/pimple/pimple/README.rst
-
25vendor/pimple/pimple/composer.json
-
30vendor/pimple/pimple/ext/pimple/.gitignore
-
12vendor/pimple/pimple/ext/pimple/README.md
-
63vendor/pimple/pimple/ext/pimple/config.m4
-
13vendor/pimple/pimple/ext/pimple/config.w32
-
121vendor/pimple/pimple/ext/pimple/php_pimple.h
-
922vendor/pimple/pimple/ext/pimple/pimple.c
-
81vendor/pimple/pimple/ext/pimple/pimple_compat.h
-
45vendor/pimple/pimple/ext/pimple/tests/001.phpt
@ -0,0 +1 @@ |
|||
# virl-scheduler |
@ -0,0 +1,4 @@ |
|||
RewriteEngine On |
|||
RewriteCond %{REQUEST_FILENAME} !-f |
|||
RewriteCond %{REQUEST_FILENAME} !-d |
|||
RewriteRule ^ /virl-scheduler/api/index.php [L,QSA] |
@ -0,0 +1,47 @@ |
|||
<?php |
|||
|
|||
$pdo = new PDO('sqlite:db.sqlite3'); |
|||
$time = time(); |
|||
echo "Cronjob<br>"; |
|||
echo "Current time: ".$time."<br>"; |
|||
|
|||
$query = $pdo->prepare('SELECT * FROM simulations WHERE timestamp+repeat_interval * repeat_count < ? AND (status="scheduled" OR status="repeating");'); |
|||
$query->execute(array($time)); |
|||
|
|||
//if this has any rows, we got sims that should be started now.
|
|||
$sims = $query->fetchAll(); |
|||
|
|||
|
|||
|
|||
foreach ($sims as $sim){ |
|||
$url = "192.168.76.210:19399/simengine/rest/launch"; |
|||
echo "Attempting to start simulation called ".$sim["sessionname"]."<br>"; |
|||
if ($sim["status"] == "scheduled") |
|||
$query = $pdo->prepare("UPDATE simulations SET status = 'Done' WHERE id = ?"); |
|||
elseif($sim["status"] == "repeating") |
|||
$query = $pdo->prepare("UPDATE simulations SET repeat_count = repeat_count+1 WHERE id = ?"); |
|||
|
|||
|
|||
$query->execute(array($sim["id"])); |
|||
|
|||
$headers = array("authorization: Basic ".$sim["token"],"Content-type: text/xml;charset=\"utf-8\""); |
|||
var_dump($headers); |
|||
echo "<br><br>"; |
|||
$content = $sim["topo_xml"]; |
|||
$url.="?session=".$sim["sessionname"]; |
|||
$ch = curl_init(); |
|||
curl_setopt($ch,CURLOPT_URL,$url); |
|||
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); |
|||
curl_setopt($ch,CURLOPT_HEADER, 0); |
|||
curl_setopt($ch, CURLOPT_POSTFIELDS,$content); |
|||
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); |
|||
$output=curl_exec($ch); |
|||
var_dump($output); |
|||
$curlinfo = curl_getinfo ($ch); |
|||
echo "<br><br>"; |
|||
var_dump($curlinfo); |
|||
$response = json_decode($output,true); |
|||
$return = array("response"=>$response,"httpinfo"=>$curlinfo); |
|||
|
|||
curl_close($ch); |
|||
} |
@ -0,0 +1,105 @@ |
|||
<?php |
|||
error_reporting(0); |
|||
use \Psr\Http\Message\ServerRequestInterface as Request; |
|||
use \Psr\Http\Message\ResponseInterface as Response; |
|||
require '../vendor/autoload.php'; |
|||
|
|||
$app = new \Slim\App; |
|||
|
|||
$container = $app->getContainer(); |
|||
|
|||
|
|||
$container['db'] = function ($c) { |
|||
$db = $c['settings']['db']; |
|||
$pdo = new PDO('sqlite:db.sqlite3'); |
|||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
|||
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); |
|||
$pdo-> exec("CREATE TABLE IF NOT EXISTS `simulations` (
|
|||
`id` INTEGER PRIMARY KEY AUTOINCREMENT, |
|||
`timestamp` INTEGER, |
|||
`status` VARCHAR NOT NULL DEFAULT 'scheduled', |
|||
`token` VARCHAR NOT NULL, |
|||
`username` VARCHAR NOT NULL, |
|||
`topo_xml` TEXT NOT NULL DEFAULT '', |
|||
`sessionname` VARCHAR, |
|||
`repeat_interval` INTEGER, |
|||
`repeat_count` INTEGER NOT NULL DEFAULT 0 |
|||
);");
|
|||
return $pdo; |
|||
}; |
|||
|
|||
$container['errorHandler'] = function ($container) { |
|||
return function ($request, $response, $exception) use ($container) { |
|||
|
|||
return $container['response']->withStatus(500) |
|||
->withHeader('Content-Type', 'text/html') |
|||
->withJson(["statusText"=>$exception->getMessage()]); |
|||
}; |
|||
}; |
|||
|
|||
|
|||
|
|||
|
|||
$app->get('/plannedsims/{id}', function (Request $request, Response $response) { |
|||
$id = $request->getAttribute('id'); |
|||
$query = $this->db->prepare('SELECT * FROM simulations WHERE id = ? LIMIT 1;'); |
|||
|
|||
$array = array($id); |
|||
$query->execute($array); |
|||
$result = $query->fetch(); |
|||
if ($result) |
|||
return $response->withJson(); |
|||
|
|||
}); |
|||
|
|||
$app->delete('/plannedsims/{id}', function (Request $request, Response $response) { |
|||
$id = $request->getAttribute('id'); |
|||
$query = $this->db->prepare('DELETE FROM simulations WHERE id = ?;'); |
|||
|
|||
$array = array($id); |
|||
$query->execute($array); |
|||
|
|||
return $response->withJson(array("statusText"=>"Simulation mit id ".$id." erfolgreich gelöscht.")); |
|||
}); |
|||
|
|||
|
|||
$app->get('/plannedsims', function (Request $request, Response $response ) { |
|||
$data=$this->db->query("SELECT * FROM simulations;")->fetchAll(); |
|||
|
|||
$newResponse = $response->withJson($data); |
|||
return $newResponse; |
|||
}); |
|||
|
|||
|
|||
$app->post('/plannedsims/new', function (Request $request, Response $response) { |
|||
$params = $request->getQueryParams(); |
|||
$sessionName = $params["session"]; |
|||
$timestamp = $params["timestamp"]; |
|||
$token = $params["token"]; |
|||
$username = $params["username"]; |
|||
$repeat = $params["repeat"]; |
|||
|
|||
switch ($repeat){ |
|||
case "daily": |
|||
$repeat = strtotime('+1 day',0); |
|||
break; |
|||
case "weekly": |
|||
$repeat = strtotime('1 week',0); |
|||
break; |
|||
default: |
|||
$repeat = 0; |
|||
break; |
|||
} |
|||
if (!is_numeric($repeat) && $repeat <=0) |
|||
$repeat = null; |
|||
|
|||
$XML = $request->getBody()->getContents(); |
|||
if ($repeat != 0) |
|||
$sth = $this->db->prepare('INSERT INTO simulations (timestamp, topo_xml,sessionname,token,username,repeat_interval,repeat_count,status) VALUES (?, ?, ?,?,?,?,0,"repeating");'); |
|||
else |
|||
$sth = $this->db->prepare('INSERT INTO simulations (timestamp, topo_xml,sessionname,token,username,repeat_interval,repeat_count) VALUES (?, ?, ?,?,?,?,0);'); |
|||
$sth->execute([intval($timestamp),$XML,$sessionName,$token,$username,$repeat]); |
|||
|
|||
return $response->withJson(array("statusText"=>"Simulation erfolgreich hinzugefügt.")); |
|||
}); |
|||
$app->run(); |
@ -0,0 +1,35 @@ |
|||
angular.module('topologyManager').controller('ApplicationController', function($scope,VIRLRestangular,CustomSimRestangular) { |
|||
console.log("Application Controller initialized"); |
|||
$scope.credentials = {username:"",password:"",token:""}; |
|||
|
|||
$scope.generateToken = function(){ |
|||
$scope.credentials.token = btoa($scope.credentials.username+":"+$scope.credentials.password); |
|||
VIRLRestangular.setDefaultHeaders({authorization: "Basic ".concat($scope.credentials.token)}); |
|||
console.log($scope.credentials.token); |
|||
}; |
|||
|
|||
$scope.verifyCredentials = function() { |
|||
|
|||
VIRLRestangular.one('/simengine/rest/test').get() // GET: /users
|
|||
.then(function(response) { |
|||
$scope.addAlert("Valid credentials","success"); |
|||
|
|||
|
|||
}, function(response) { |
|||
console.log(response); |
|||
|
|||
}); |
|||
}; |
|||
|
|||
$scope.alerts = [ |
|||
]; |
|||
|
|||
$scope.addAlert = function(message,alertType) { |
|||
$scope.alerts.push({msg: message,type:alertType}); |
|||
}; |
|||
|
|||
$scope.closeAlert = function(index) { |
|||
$scope.alerts.splice(index, 1); |
|||
}; |
|||
|
|||
}); |
@ -0,0 +1,78 @@ |
|||
angular.module('topologyManager').controller('IndexCtrl', function($scope,VIRLRestangular,CustomSimRestangular,$interval) { |
|||
console.log("IndexCtrl initialized"); |
|||
|
|||
$scope.repeat = "none"; |
|||
$scope.plannedSims = []; |
|||
$scope.topology = {sessionName: "",filecontent: "",repeat:"none",datetime: new Date()}; |
|||
|
|||
$scope.removePlannedSim = function(id){ |
|||
console.log(id); |
|||
CustomSimRestangular.one('plannedsims',id).remove(); |
|||
} |
|||
|
|||
$scope.stopSim = function(key){ |
|||
console.log(key); |
|||
VIRLRestangular.one('/simengine/rest/stop',key).get().then(function(response){ |
|||
console.log(response); |
|||
|
|||
}); |
|||
} |
|||
|
|||
$scope.updater = function(){ |
|||
stop = $interval(function() { |
|||
$scope.getScheduledSims(); |
|||
$scope.getRunningSims(); |
|||
}, 1000); |
|||
}; |
|||
|
|||
$scope.updater(); |
|||
|
|||
$scope.getScheduledSims = function (){ |
|||
CustomSimRestangular.all("plannedsims").getList().then(function(response){ |
|||
// console.log(response);
|
|||
$scope.plannedSims = response; |
|||
}); |
|||
}; |
|||
|
|||
$scope.getRunningSims = function(){ |
|||
VIRLRestangular.one('/simengine/rest/list').get().then(function(response){ |
|||
// console.log(response);
|
|||
$scope.runningSims = response.data.simulations; |
|||
}); |
|||
}; |
|||
|
|||
$scope.send = function () { |
|||
var topology = $scope.topology; |
|||
var unix_timestamp = new moment(topology.datetime).unix(); |
|||
|
|||
CustomSimRestangular.one('plannedsims/new').customPOST(topology.filecontent,undefined,{session:topology.sessionName,timestamp:unix_timestamp,token:$scope.credentials.token,username:$scope.credentials.username,repeat:$scope.topology.repeat}, |
|||
{ 'Content-Type': "text/xml;charset=UTF-8"} |
|||
) |
|||
.then(function(response) { |
|||
// returns a list of users
|
|||
$scope.addAlert(response.statusText,"success"); |
|||
|
|||
}, function(response) { |
|||
console.log(response); |
|||
$scope.addAlert(response.statusText,"danger"); |
|||
}); |
|||
}; |
|||
|
|||
$scope.popup1 = { |
|||
opened: false |
|||
}; |
|||
|
|||
$scope.dateOptions = { |
|||
dateDisabled: false, |
|||
formatYear: 'yy', |
|||
maxDate: new Date(2020, 5, 22), |
|||
minDate: new Date(), |
|||
startingDay: 1 |
|||
}; |
|||
|
|||
$scope.openDatePicker = function() { |
|||
console.log("h"); |
|||
$scope.popup1.opened = true; |
|||
}; |
|||
|
|||
}); |
@ -0,0 +1,26 @@ |
|||
angular.module('topologyManager', ['ngRoute','restangular','ui.bootstrap']) |
|||
|
|||
.config(function($routeProvider, $locationProvider) { |
|||
$locationProvider.html5Mode(true); |
|||
|
|||
$routeProvider |
|||
.when('/', { |
|||
templateUrl: 'partials/index.html', |
|||
controller: 'IndexCtrl', |
|||
|
|||
}) |
|||
_.contains = _.includes; |
|||
}) |
|||
|
|||
.factory('VIRLRestangular', function(Restangular) { |
|||
return Restangular.withConfig(function(RestangularConfigurer) { |
|||
RestangularConfigurer.setBaseUrl('http://192.168.76.210:19399'); |
|||
RestangularConfigurer.setFullResponse(true); |
|||
}); |
|||
}) |
|||
.factory('CustomSimRestangular', function(Restangular) { |
|||
return Restangular.withConfig(function(RestangularConfigurer) { |
|||
RestangularConfigurer.setBaseUrl('/virl-scheduler/api/'); |
|||
}); |
|||
}) |
|||
|
@ -0,0 +1,5 @@ |
|||
{ |
|||
"require": { |
|||
"slim/slim": "^3.0" |
|||
} |
|||
} |
@ -0,0 +1,255 @@ |
|||
{ |
|||
"_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#composer-lock-the-lock-file", |
|||
"This file is @generated automatically" |
|||
], |
|||
"hash": "6f5d3d05d70b58db9144bb1ca70c8698", |
|||
"content-hash": "3b0766dbcef4dfb1a4a2012fef8611d8", |
|||
"packages": [ |
|||
{ |
|||
"name": "container-interop/container-interop", |
|||
"version": "1.1.0", |
|||
"source": { |
|||
"type": "git", |
|||
"url": "https://github.com/container-interop/container-interop.git", |
|||
"reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e" |
|||
}, |
|||
"dist": { |
|||
"type": "zip", |
|||
"url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e", |
|||
"reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e", |
|||
"shasum": "" |
|||
}, |
|||
"type": "library", |
|||
"autoload": { |
|||
"psr-4": { |
|||
"Interop\\Container\\": "src/Interop/Container/" |
|||
} |
|||
}, |
|||
"notification-url": "https://packagist.org/downloads/", |
|||
"license": [ |
|||
"MIT" |
|||
], |
|||
"description": "Promoting the interoperability of container objects (DIC, SL, etc.)", |
|||
"time": "2014-12-30 15:22:37" |
|||
}, |
|||
{ |
|||
"name": "nikic/fast-route", |
|||
"version": "v1.0.1", |
|||
"source": { |
|||
"type": "git", |
|||
"url": "https://github.com/nikic/FastRoute.git", |
|||
"reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af" |
|||
}, |
|||
"dist": { |
|||
"type": "zip", |
|||
"url": "https://api.github.com/repos/nikic/FastRoute/zipball/8ea928195fa9b907f0d6e48312d323c1a13cc2af", |
|||
"reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af", |
|||
"shasum": "" |
|||
}, |
|||
"require": { |
|||
"php": ">=5.4.0" |
|||
}, |
|||
"type": "library", |
|||
"autoload": { |
|||
"psr-4": { |
|||
"FastRoute\\": "src/" |
|||
}, |
|||
"files": [ |
|||
"src/functions.php" |
|||
] |
|||
}, |
|||
"notification-url": "https://packagist.org/downloads/", |
|||
"license": [ |
|||
"BSD-3-Clause" |
|||
], |
|||
"authors": [ |
|||
{ |
|||
"name": "Nikita Popov", |
|||
"email": "nikic@php.net" |
|||
} |
|||
], |
|||
"description": "Fast request router for PHP", |
|||
"keywords": [ |
|||
"router", |
|||
"routing" |
|||
], |
|||
"time": "2016-06-12 19:08:51" |
|||
}, |
|||
{ |
|||
"name": "pimple/pimple", |
|||
"version": "v3.0.2", |
|||
"source": { |
|||
"type": "git", |
|||
"url": "https://github.com/silexphp/Pimple.git", |
|||
"reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a" |
|||
}, |
|||
"dist": { |
|||
"type": "zip", |
|||
"url": "https://api.github.com/repos/silexphp/Pimple/zipball/a30f7d6e57565a2e1a316e1baf2a483f788b258a", |
|||
"reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a", |
|||
"shasum": "" |
|||
}, |
|||
"require": { |
|||
"php": ">=5.3.0" |
|||
}, |
|||
"type": "library", |
|||
"extra": { |
|||
"branch-alias": { |
|||
"dev-master": "3.0.x-dev" |
|||
} |
|||
}, |
|||
"autoload": { |
|||
"psr-0": { |
|||
"Pimple": "src/" |
|||
} |
|||
}, |
|||
"notification-url": "https://packagist.org/downloads/", |
|||
"license": [ |
|||
"MIT" |
|||
], |
|||
"authors": [ |
|||
{ |
|||
"name": "Fabien Potencier", |
|||
"email": "fabien@symfony.com" |
|||
} |
|||
], |
|||
"description": "Pimple, a simple Dependency Injection Container", |
|||
"homepage": "http://pimple.sensiolabs.org", |
|||
"keywords": [ |
|||
"container", |
|||
"dependency injection" |
|||
], |
|||
"time": "2015-09-11 15:10:35" |
|||
}, |
|||
{ |
|||
"name": "psr/http-message", |
|||
"version": "1.0.1", |
|||
"source": { |
|||
"type": "git", |
|||
"url": "https://github.com/php-fig/http-message.git", |
|||
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" |
|||
}, |
|||
"dist": { |
|||
"type": "zip", |
|||
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", |
|||
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", |
|||
"shasum": "" |
|||
}, |
|||
"require": { |
|||
"php": ">=5.3.0" |
|||
}, |
|||
"type": "library", |
|||
"extra": { |
|||
"branch-alias": { |
|||
"dev-master": "1.0.x-dev" |
|||
} |
|||
}, |
|||
"autoload": { |
|||
"psr-4": { |
|||
"Psr\\Http\\Message\\": "src/" |
|||
} |
|||
}, |
|||
"notification-url": "https://packagist.org/downloads/", |
|||
"license": [ |
|||
"MIT" |
|||
], |
|||
"authors": [ |
|||
{ |
|||
"name": "PHP-FIG", |
|||
"homepage": "http://www.php-fig.org/" |
|||
} |
|||
], |
|||
"description": "Common interface for HTTP messages", |
|||
"homepage": "https://github.com/php-fig/http-message", |
|||
"keywords": [ |
|||
"http", |
|||
"http-message", |
|||
"psr", |
|||
"psr-7", |
|||
"request", |
|||
"response" |
|||
], |
|||
"time": "2016-08-06 14:39:51" |
|||
}, |
|||
{ |
|||
"name": "slim/slim", |
|||
"version": "3.5.0", |
|||
"source": { |
|||
"type": "git", |
|||
"url": "https://github.com/slimphp/Slim.git", |
|||
"reference": "184352bc1913d7ba552ab4131d62f4730ddb0893" |
|||
}, |
|||
"dist": { |
|||
"type": "zip", |
|||
"url": "https://api.github.com/repos/slimphp/Slim/zipball/184352bc1913d7ba552ab4131d62f4730ddb0893", |
|||
"reference": "184352bc1913d7ba552ab4131d62f4730ddb0893", |
|||
"shasum": "" |
|||
}, |
|||
"require": { |
|||
"container-interop/container-interop": "^1.1", |
|||
"nikic/fast-route": "^1.0", |
|||
"php": ">=5.5.0", |
|||
"pimple/pimple": "^3.0", |
|||
"psr/http-message": "^1.0" |
|||
}, |
|||
"provide": { |
|||
"psr/http-message-implementation": "1.0" |
|||
}, |
|||
"require-dev": { |
|||
"phpunit/phpunit": "^4.0", |
|||
"squizlabs/php_codesniffer": "^2.5" |
|||
}, |
|||
"type": "library", |
|||
"autoload": { |
|||
"psr-4": { |
|||
"Slim\\": "Slim" |
|||
} |
|||
}, |
|||
"notification-url": "https://packagist.org/downloads/", |
|||
"license": [ |
|||
"MIT" |
|||
], |
|||
"authors": [ |
|||
{ |
|||
"name": "Rob Allen", |
|||
"email": "rob@akrabat.com", |
|||
"homepage": "http://akrabat.com" |
|||
}, |
|||
{ |
|||
"name": "Josh Lockhart", |
|||
"email": "hello@joshlockhart.com", |
|||
"homepage": "https://joshlockhart.com" |
|||
}, |
|||
{ |
|||
"name": "Gabriel Manricks", |
|||
"email": "gmanricks@me.com", |
|||
"homepage": "http://gabrielmanricks.com" |
|||
}, |
|||
{ |
|||
"name": "Andrew Smith", |
|||
"email": "a.smith@silentworks.co.uk", |
|||
"homepage": "http://silentworks.co.uk" |
|||
} |
|||
], |
|||
"description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", |
|||
"homepage": "http://slimframework.com", |
|||
"keywords": [ |
|||
"api", |
|||
"framework", |
|||
"micro", |
|||
"router" |
|||
], |
|||
"time": "2016-07-26 15:12:13" |
|||
} |
|||
], |
|||
"packages-dev": [], |
|||
"aliases": [], |
|||
"minimum-stability": "stable", |
|||
"stability-flags": [], |
|||
"prefer-stable": false, |
|||
"prefer-lowest": false, |
|||
"platform": [], |
|||
"platform-dev": [] |
|||
} |
2
css/bootstrap-material-design.min.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
6
css/bootstrap.min.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,288 @@ |
|||
<?xml version="1.0" standalone="no"?> |
|||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > |
|||
<svg xmlns="http://www.w3.org/2000/svg"> |
|||
<metadata></metadata> |
|||
<defs> |
|||
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > |
|||
<font-face units-per-em="1200" ascent="960" descent="-240" /> |
|||
<missing-glyph horiz-adv-x="500" /> |
|||
<glyph horiz-adv-x="0" /> |
|||
<glyph horiz-adv-x="400" /> |
|||
<glyph unicode=" " /> |
|||
<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" /> |
|||
<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode=" " /> |
|||
<glyph unicode="¥" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" /> |
|||
<glyph unicode=" " horiz-adv-x="650" /> |
|||
<glyph unicode=" " horiz-adv-x="1300" /> |
|||
<glyph unicode=" " horiz-adv-x="650" /> |
|||
<glyph unicode=" " horiz-adv-x="1300" /> |
|||
<glyph unicode=" " horiz-adv-x="433" /> |
|||
<glyph unicode=" " horiz-adv-x="325" /> |
|||
<glyph unicode=" " horiz-adv-x="216" /> |
|||
<glyph unicode=" " horiz-adv-x="216" /> |
|||
<glyph unicode=" " horiz-adv-x="162" /> |
|||
<glyph unicode=" " horiz-adv-x="260" /> |
|||
<glyph unicode=" " horiz-adv-x="72" /> |
|||
<glyph unicode=" " horiz-adv-x="260" /> |
|||
<glyph unicode=" " horiz-adv-x="325" /> |
|||
<glyph unicode="€" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" /> |
|||
<glyph unicode="₽" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" /> |
|||
<glyph unicode="−" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="⌛" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" /> |
|||
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> |
|||
<glyph unicode="☁" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" /> |
|||
<glyph unicode="⛺" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " /> |
|||
<glyph unicode="✉" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" /> |
|||
<glyph unicode="✏" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" /> |
|||
<glyph unicode="" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" /> |
|||
<glyph unicode="" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" /> |
|||
<glyph unicode="" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" /> |
|||
<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" /> |
|||
<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" /> |
|||
<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" /> |
|||
<glyph unicode="" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" /> |
|||
<glyph unicode="" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" /> |
|||
<glyph unicode="" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" /> |
|||
<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" /> |
|||
<glyph unicode="" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" /> |
|||
<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" /> |
|||
<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> |
|||
<glyph unicode="" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" /> |
|||
<glyph unicode="" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" /> |
|||
<glyph unicode="" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" /> |
|||
<glyph unicode="" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" /> |
|||
<glyph unicode="" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" /> |
|||
<glyph unicode="" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" /> |
|||
<glyph unicode="" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" /> |
|||
<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" /> |
|||
<glyph unicode="" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> |
|||
<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" /> |
|||
<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" /> |
|||
<glyph unicode="" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" /> |
|||
<glyph unicode="" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" /> |
|||
<glyph unicode="" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" /> |
|||
<glyph unicode="" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" /> |
|||
<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" /> |
|||
<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" /> |
|||
<glyph unicode="" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" /> |
|||
<glyph unicode="" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" /> |
|||
<glyph unicode="" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" /> |
|||
<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> |
|||
<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> |
|||
<glyph unicode="" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" /> |
|||
<glyph unicode="" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" /> |
|||
<glyph unicode="" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" /> |
|||
<glyph unicode="" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" /> |
|||
<glyph unicode="" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" /> |
|||
<glyph unicode="" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" /> |
|||
<glyph unicode="" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" /> |
|||
<glyph unicode="" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" /> |
|||
<glyph unicode="" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" /> |
|||
<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" /> |
|||
<glyph unicode="" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" /> |
|||
<glyph unicode="" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" /> |
|||
<glyph unicode="" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" /> |
|||
<glyph unicode="" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" /> |
|||
<glyph unicode="" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" /> |
|||
<glyph unicode="" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" /> |
|||
<glyph unicode="" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" /> |
|||
<glyph unicode="" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" /> |
|||
<glyph unicode="" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" /> |
|||
<glyph unicode="" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" /> |
|||
<glyph unicode="" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" /> |
|||
<glyph unicode="" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" /> |
|||
<glyph unicode="" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" /> |
|||
<glyph unicode="" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" /> |
|||
<glyph unicode="" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" /> |
|||
<glyph unicode="" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" /> |
|||
<glyph unicode="" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" /> |
|||
<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" /> |
|||
<glyph unicode="" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" /> |
|||
<glyph unicode="" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" /> |
|||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> |
|||
<glyph unicode="" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" /> |
|||
<glyph unicode="" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" /> |
|||
<glyph unicode="" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" /> |
|||
<glyph unicode="" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> |
|||
<glyph unicode="" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> |
|||
<glyph unicode="" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" /> |
|||
<glyph unicode="" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" /> |
|||
<glyph unicode="" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" /> |
|||
<glyph unicode="" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" /> |
|||
<glyph unicode="" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" /> |
|||
<glyph unicode="" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" /> |
|||
<glyph unicode="" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" /> |
|||
<glyph unicode="" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" /> |
|||
<glyph unicode="" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> |
|||
<glyph unicode="" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" /> |
|||
<glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" /> |
|||
<glyph unicode="" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" /> |
|||
<glyph unicode="" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> |
|||
<glyph unicode="" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" /> |
|||
<glyph unicode="" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" /> |
|||
<glyph unicode="" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" /> |
|||
<glyph unicode="" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" /> |
|||
<glyph unicode="" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" /> |
|||
<glyph unicode="" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" /> |
|||
<glyph unicode="" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" /> |
|||
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" /> |
|||
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" /> |
|||
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" /> |
|||
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" /> |
|||
<glyph unicode="" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" /> |
|||
<glyph unicode="" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" /> |
|||
<glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " /> |
|||
<glyph unicode="" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" /> |
|||
<glyph unicode="" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" /> |
|||
<glyph unicode="" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" /> |
|||
<glyph unicode="" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" /> |
|||
<glyph unicode="" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" /> |
|||
<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" /> |
|||
<glyph unicode="" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" /> |
|||
<glyph unicode="" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" /> |
|||
<glyph unicode="" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" /> |
|||
<glyph unicode="" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" /> |
|||
<glyph unicode="" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" /> |
|||
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> |
|||
<glyph unicode="" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " /> |
|||
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " /> |
|||
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" /> |
|||
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" /> |
|||
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" /> |
|||
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" /> |
|||
<glyph unicode="" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" /> |
|||
<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> |
|||
<glyph unicode="" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" /> |
|||
<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" /> |
|||
<glyph unicode="" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> |
|||
<glyph unicode="" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" /> |
|||
<glyph unicode="" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> |
|||
<glyph unicode="" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" /> |
|||
<glyph unicode="" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" /> |
|||
<glyph unicode="" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> |
|||
<glyph unicode="" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> |
|||
<glyph unicode="" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" /> |
|||
<glyph unicode="" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> |
|||
<glyph unicode="" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> |
|||
<glyph unicode="" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" /> |
|||
<glyph unicode="" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" /> |
|||
<glyph unicode="" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" /> |
|||
<glyph unicode="" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" /> |
|||
<glyph unicode="" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" /> |
|||
<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" /> |
|||
<glyph unicode="" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" /> |
|||
<glyph unicode="" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" /> |
|||
<glyph unicode="" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" /> |
|||
<glyph unicode="" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" /> |
|||
<glyph unicode="" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" /> |
|||
<glyph unicode="" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" /> |
|||
<glyph unicode="" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " /> |
|||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> |
|||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> |
|||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" /> |
|||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" /> |
|||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" /> |
|||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" /> |
|||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" /> |
|||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" /> |
|||
<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" /> |
|||
<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" /> |
|||
<glyph unicode="" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" /> |
|||
<glyph unicode="" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" /> |
|||
<glyph unicode="" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" /> |
|||
<glyph unicode="" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" /> |
|||
<glyph unicode="" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" /> |
|||
<glyph unicode="" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" /> |
|||
<glyph unicode="" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" /> |
|||
<glyph unicode="" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" /> |
|||
<glyph unicode="" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" /> |
|||
<glyph unicode="" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" /> |
|||
<glyph unicode="" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" /> |
|||
<glyph unicode="" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> |
|||
<glyph unicode="" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" /> |
|||
<glyph unicode="" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" /> |
|||
<glyph unicode="" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" /> |
|||
<glyph unicode="" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" /> |
|||
<glyph unicode="" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " /> |
|||
<glyph unicode="" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" /> |
|||
<glyph unicode="" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" /> |
|||
<glyph unicode="" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" /> |
|||
<glyph unicode="" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" /> |
|||
<glyph unicode="" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> |
|||
<glyph unicode="" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> |
|||
<glyph unicode="" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" /> |
|||
<glyph unicode="" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> |
|||
<glyph unicode="" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> |
|||
<glyph unicode="" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> |
|||
<glyph unicode="" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" /> |
|||
<glyph unicode="" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" /> |
|||
<glyph unicode="" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" /> |
|||
<glyph unicode="" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" /> |
|||
<glyph unicode="" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" /> |
|||
<glyph unicode="" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" /> |
|||
<glyph unicode="" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" /> |
|||
<glyph unicode="" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" /> |
|||
<glyph unicode="" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" /> |
|||
<glyph unicode="" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" /> |
|||
<glyph unicode="" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> |
|||
<glyph unicode="" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" /> |
|||
<glyph unicode="" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" /> |
|||
<glyph unicode="" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" /> |
|||
<glyph unicode="" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" /> |
|||
<glyph unicode="" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" /> |
|||
<glyph unicode="" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" /> |
|||
<glyph unicode="" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" /> |
|||
<glyph unicode="" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" /> |
|||
<glyph unicode="" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" /> |
|||
<glyph unicode="" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" /> |
|||
<glyph unicode="" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" /> |
|||
<glyph unicode="" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" /> |
|||
<glyph unicode="🔑" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" /> |
|||
<glyph unicode="🚪" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" /> |
|||
</font> |
|||
</defs></svg> |
@ -0,0 +1,62 @@ |
|||
<html lang="en" ng-app="topologyManager" > |
|||
<head> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|||
<!-- Angular Material style sheet --> |
|||
<link rel="stylesheet" href="css/bootstrap.min.css"> |
|||
<link rel="stylesheet" href="css/bootstrap-material-design.min.css"> |
|||
<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Roboto:300,400,500,700"> |
|||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> |
|||
<base href="/virl-scheduler/"> |
|||
</head> |
|||
<style> |
|||
.navbar .btn { |
|||
margin:0; |
|||
} |
|||
|
|||
.alerts { |
|||
position:absolute; |
|||
right:0px; |
|||
top:50px; |
|||
max-width:500px; |
|||
} |
|||
|
|||
</style> |
|||
|
|||
<body ng-cloak ng-controller="ApplicationController"> |
|||
|
|||
<ng-include |
|||
src="'partials/navbar.html'"> |
|||
|
|||
</ng-include> |
|||
<div class="alerts"> |
|||
|
|||
|
|||
<div uib-alert ng-repeat="alert in alerts" ng-class="'alert-' + (alert.type || 'warning')" close="closeAlert($index)">{{alert.msg}}</div> |
|||
|
|||
</div> |
|||
|
|||
<div ng-view > |
|||
|
|||
</div> |
|||
|
|||
|
|||
<!-- Angular Material requires Angular.js Libraries --> |
|||
<script src="js/angular.min.js"></script> |
|||
|
|||
<script src="js/angular-route.js"></script> |
|||
<script src="js/lodash.js"></script> |
|||
|
|||
<script src="js/restangular.min.js"></script> |
|||
<script src="js/moment.js"></script> |
|||
|
|||
<script src="js/ui-bootstrap-tpls-2.2.0.min.js"></script> |
|||
<!-- Angular Material Library --> |
|||
|
|||
|
|||
<!-- Your application bootstrap --> |
|||
<script src="app/topologyManager.js"></script> |
|||
<script src="app/index/controllers/ApplicationController.js"></script> |
|||
<script src="app/index/controllers/IndexCtrl.js"></script> |
|||
|
|||
</body> |
|||
</html> |
1022
js/angular-route.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,314 @@ |
|||
/* |
|||
AngularJS v1.5.5 |
|||
(c) 2010-2016 Google, Inc. http://angularjs.org
|
|||
License: MIT |
|||
*/ |
|||
(function(v){'use strict';function O(a){return function(){var b=arguments[0],d;d="["+(a?a+":":"")+b+"] http://errors.angularjs.org/1.5.5/"+(a?a+"/":"")+b;for(b=1;b<arguments.length;b++){d=d+(1==b?"?":"&")+"p"+(b-1)+"=";var c=encodeURIComponent,e;e=arguments[b];e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e;d+=c(e)}return Error(d)}}function ya(a){if(null==a||Va(a))return!1;if(K(a)||F(a)||B&&a instanceof B)return!0; |
|||
var b="length"in Object(a)&&a.length;return Q(b)&&(0<=b&&(b-1 in a||a instanceof Array)||"function"==typeof a.item)}function q(a,b,d){var c,e;if(a)if(E(a))for(c in a)"prototype"==c||"length"==c||"name"==c||a.hasOwnProperty&&!a.hasOwnProperty(c)||b.call(d,a[c],c,a);else if(K(a)||ya(a)){var f="object"!==typeof a;c=0;for(e=a.length;c<e;c++)(f||c in a)&&b.call(d,a[c],c,a)}else if(a.forEach&&a.forEach!==q)a.forEach(b,d,a);else if(oc(a))for(c in a)b.call(d,a[c],c,a);else if("function"===typeof a.hasOwnProperty)for(c in a)a.hasOwnProperty(c)&& |
|||
b.call(d,a[c],c,a);else for(c in a)ua.call(a,c)&&b.call(d,a[c],c,a);return a}function pc(a,b,d){for(var c=Object.keys(a).sort(),e=0;e<c.length;e++)b.call(d,a[c[e]],c[e]);return c}function qc(a){return function(b,d){a(d,b)}}function Xd(){return++nb}function Nb(a,b,d){for(var c=a.$$hashKey,e=0,f=b.length;e<f;++e){var g=b[e];if(G(g)||E(g))for(var h=Object.keys(g),k=0,l=h.length;k<l;k++){var n=h[k],m=g[n];d&&G(m)?fa(m)?a[n]=new Date(m.valueOf()):Wa(m)?a[n]=new RegExp(m):m.nodeName?a[n]=m.cloneNode(!0): |
|||
Ob(m)?a[n]=m.clone():(G(a[n])||(a[n]=K(m)?[]:{}),Nb(a[n],[m],!0)):a[n]=m}}c?a.$$hashKey=c:delete a.$$hashKey;return a}function R(a){return Nb(a,za.call(arguments,1),!1)}function Yd(a){return Nb(a,za.call(arguments,1),!0)}function X(a){return parseInt(a,10)}function Pb(a,b){return R(Object.create(a),b)}function C(){}function Xa(a){return a}function da(a){return function(){return a}}function rc(a){return E(a.toString)&&a.toString!==ma}function y(a){return"undefined"===typeof a}function x(a){return"undefined"!== |
|||
typeof a}function G(a){return null!==a&&"object"===typeof a}function oc(a){return null!==a&&"object"===typeof a&&!sc(a)}function F(a){return"string"===typeof a}function Q(a){return"number"===typeof a}function fa(a){return"[object Date]"===ma.call(a)}function E(a){return"function"===typeof a}function Wa(a){return"[object RegExp]"===ma.call(a)}function Va(a){return a&&a.window===a}function Ya(a){return a&&a.$evalAsync&&a.$watch}function Da(a){return"boolean"===typeof a}function Zd(a){return a&&Q(a.length)&& |
|||
$d.test(ma.call(a))}function Ob(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function ae(a){var b={};a=a.split(",");var d;for(d=0;d<a.length;d++)b[a[d]]=!0;return b}function va(a){return P(a.nodeName||a[0]&&a[0].nodeName)}function Za(a,b){var d=a.indexOf(b);0<=d&&a.splice(d,1);return d}function qa(a,b){function d(a,b){var d=b.$$hashKey,e;if(K(a)){e=0;for(var f=a.length;e<f;e++)b.push(c(a[e]))}else if(oc(a))for(e in a)b[e]=c(a[e]);else if(a&&"function"===typeof a.hasOwnProperty)for(e in a)a.hasOwnProperty(e)&& |
|||
(b[e]=c(a[e]));else for(e in a)ua.call(a,e)&&(b[e]=c(a[e]));d?b.$$hashKey=d:delete b.$$hashKey;return b}function c(a){if(!G(a))return a;var b=f.indexOf(a);if(-1!==b)return g[b];if(Va(a)||Ya(a))throw Aa("cpws");var b=!1,c=e(a);void 0===c&&(c=K(a)?[]:Object.create(sc(a)),b=!0);f.push(a);g.push(c);return b?d(a,c):c}function e(a){switch(ma.call(a)){case "[object Int8Array]":case "[object Int16Array]":case "[object Int32Array]":case "[object Float32Array]":case "[object Float64Array]":case "[object Uint8Array]":case "[object Uint8ClampedArray]":case "[object Uint16Array]":case "[object Uint32Array]":return new a.constructor(c(a.buffer)); |
|||
case "[object ArrayBuffer]":if(!a.slice){var b=new ArrayBuffer(a.byteLength);(new Uint8Array(b)).set(new Uint8Array(a));return b}return a.slice(0);case "[object Boolean]":case "[object Number]":case "[object String]":case "[object Date]":return new a.constructor(a.valueOf());case "[object RegExp]":return b=new RegExp(a.source,a.toString().match(/[^\/]*$/)[0]),b.lastIndex=a.lastIndex,b;case "[object Blob]":return new a.constructor([a],{type:a.type})}if(E(a.cloneNode))return a.cloneNode(!0)}var f=[], |
|||
g=[];if(b){if(Zd(b)||"[object ArrayBuffer]"===ma.call(b))throw Aa("cpta");if(a===b)throw Aa("cpi");K(b)?b.length=0:q(b,function(a,d){"$$hashKey"!==d&&delete b[d]});f.push(a);g.push(b);return d(a,b)}return c(a)}function ha(a,b){if(K(a)){b=b||[];for(var d=0,c=a.length;d<c;d++)b[d]=a[d]}else if(G(a))for(d in b=b||{},a)if("$"!==d.charAt(0)||"$"!==d.charAt(1))b[d]=a[d];return b||a}function pa(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var d=typeof a,c;if(d==typeof b&& |
|||
"object"==d)if(K(a)){if(!K(b))return!1;if((d=a.length)==b.length){for(c=0;c<d;c++)if(!pa(a[c],b[c]))return!1;return!0}}else{if(fa(a))return fa(b)?pa(a.getTime(),b.getTime()):!1;if(Wa(a))return Wa(b)?a.toString()==b.toString():!1;if(Ya(a)||Ya(b)||Va(a)||Va(b)||K(b)||fa(b)||Wa(b))return!1;d=T();for(c in a)if("$"!==c.charAt(0)&&!E(a[c])){if(!pa(a[c],b[c]))return!1;d[c]=!0}for(c in b)if(!(c in d)&&"$"!==c.charAt(0)&&x(b[c])&&!E(b[c]))return!1;return!0}return!1}function $a(a,b,d){return a.concat(za.call(b, |
|||
d))}function tc(a,b){var d=2<arguments.length?za.call(arguments,2):[];return!E(b)||b instanceof RegExp?b:d.length?function(){return arguments.length?b.apply(a,$a(d,arguments,0)):b.apply(a,d)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function be(a,b){var d=b;"string"===typeof a&&"$"===a.charAt(0)&&"$"===a.charAt(1)?d=void 0:Va(b)?d="$WINDOW":b&&v.document===b?d="$DOCUMENT":Ya(b)&&(d="$SCOPE");return d}function ab(a,b){if(!y(a))return Q(b)||(b=b?2:null),JSON.stringify(a,be, |
|||
b)}function uc(a){return F(a)?JSON.parse(a):a}function vc(a,b){a=a.replace(ce,"");var d=Date.parse("Jan 01, 1970 00:00:00 "+a)/6E4;return isNaN(d)?b:d}function Qb(a,b,d){d=d?-1:1;var c=a.getTimezoneOffset();b=vc(b,c);d*=b-c;a=new Date(a.getTime());a.setMinutes(a.getMinutes()+d);return a}function wa(a){a=B(a).clone();try{a.empty()}catch(b){}var d=B("<div>").append(a).html();try{return a[0].nodeType===Ma?P(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+P(b)})}catch(c){return P(d)}} |
|||
function wc(a){try{return decodeURIComponent(a)}catch(b){}}function xc(a){var b={};q((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=wc(e),x(e)&&(f=x(f)?wc(f):!0,ua.call(b,e)?K(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Rb(a){var b=[];q(a,function(a,c){K(a)?q(a,function(a){b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))}):b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))});return b.length?b.join("&"):""} |
|||
function ob(a){return ja(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ja(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function de(a,b){var d,c,e=Na.length;for(c=0;c<e;++c)if(d=Na[c]+b,F(d=a.getAttribute(d)))return d;return null}function ee(a,b){var d,c,e={};q(Na,function(b){b+="app";!d&&a.hasAttribute&&a.hasAttribute(b)&&(d=a,c=a.getAttribute(b))}); |
|||
q(Na,function(b){b+="app";var e;!d&&(e=a.querySelector("["+b.replace(":","\\:")+"]"))&&(d=e,c=e.getAttribute(b))});d&&(e.strictDi=null!==de(d,"strict-di"),b(d,c?[c]:[],e))}function yc(a,b,d){G(d)||(d={});d=R({strictDi:!1},d);var c=function(){a=B(a);if(a.injector()){var c=a[0]===v.document?"document":wa(a);throw Aa("btstrpd",c.replace(/</,"<").replace(/>/,">"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]); |
|||
b.unshift("ng");c=bb(b,d.strictDi);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;v&&e.test(v.name)&&(d.debugInfoEnabled=!0,v.name=v.name.replace(e,""));if(v&&!f.test(v.name))return c();v.name=v.name.replace(f,"");ea.resumeBootstrap=function(a){q(a,function(a){b.push(a)});return c()};E(ea.resumeDeferredBootstrap)&&ea.resumeDeferredBootstrap()}function fe(){v.name= |
|||
"NG_ENABLE_DEBUG_INFO!"+v.name;v.location.reload()}function ge(a){a=ea.element(a).injector();if(!a)throw Aa("test");return a.get("$$testability")}function zc(a,b){b=b||"_";return a.replace(he,function(a,c){return(c?b:"")+a.toLowerCase()})}function ie(){var a;if(!Ac){var b=pb();(Z=y(b)?v.jQuery:b?v[b]:void 0)&&Z.fn.on?(B=Z,R(Z.fn,{scope:Oa.scope,isolateScope:Oa.isolateScope,controller:Oa.controller,injector:Oa.injector,inheritedData:Oa.inheritedData}),a=Z.cleanData,Z.cleanData=function(b){for(var c, |
|||
e=0,f;null!=(f=b[e]);e++)(c=Z._data(f,"events"))&&c.$destroy&&Z(f).triggerHandler("$destroy");a(b)}):B=U;ea.element=B;Ac=!0}}function qb(a,b,d){if(!a)throw Aa("areq",b||"?",d||"required");return a}function Pa(a,b,d){d&&K(a)&&(a=a[a.length-1]);qb(E(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Qa(a,b){if("hasOwnProperty"===a)throw Aa("badname",b);}function Bc(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g<f;g++)c= |
|||
b[g],a&&(a=(e=a)[c]);return!d&&E(a)?tc(e,a):a}function rb(a){for(var b=a[0],d=a[a.length-1],c,e=1;b!==d&&(b=b.nextSibling);e++)if(c||a[e]!==b)c||(c=B(za.call(a,0,e))),c.push(b);return c||a}function T(){return Object.create(null)}function je(a){function b(a,b,c){return a[b]||(a[b]=c())}var d=O("$injector"),c=O("ng");a=b(a,"angular",Object);a.$$minErr=a.$$minErr||O;return b(a,"module",function(){var a={};return function(f,g,h){if("hasOwnProperty"===f)throw c("badname","module");g&&a.hasOwnProperty(f)&& |
|||
(a[f]=null);return b(a,f,function(){function a(b,d,e,f){f||(f=c);return function(){f[e||"push"]([b,d,arguments]);return M}}function b(a,d){return function(b,e){e&&E(e)&&(e.$$moduleName=f);c.push([a,d,arguments]);return M}}if(!g)throw d("nomod",f);var c=[],e=[],r=[],N=a("$injector","invoke","push",e),M={_invokeQueue:c,_configBlocks:e,_runBlocks:r,requires:g,name:f,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:a("$provide","value"),constant:a("$provide", |
|||
"constant","unshift"),decorator:b("$provide","decorator"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),component:b("$compileProvider","component"),config:N,run:function(a){r.push(a);return this}};h&&N(h);return M})}})}function ke(a){R(a,{bootstrap:yc,copy:qa,extend:R,merge:Yd,equals:pa,element:B,forEach:q,injector:bb,noop:C,bind:tc,toJson:ab,fromJson:uc,identity:Xa,isUndefined:y, |
|||
isDefined:x,isString:F,isFunction:E,isObject:G,isNumber:Q,isElement:Ob,isArray:K,version:le,isDate:fa,lowercase:P,uppercase:sb,callbacks:{counter:0},getTestability:ge,$$minErr:O,$$csp:Ea,reloadWithDebugInfo:fe});Sb=je(v);Sb("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:me});a.provider("$compile",Cc).directive({a:ne,input:Dc,textarea:Dc,form:oe,script:pe,select:qe,style:re,option:se,ngBind:te,ngBindHtml:ue,ngBindTemplate:ve,ngClass:we,ngClassEven:xe,ngClassOdd:ye,ngCloak:ze,ngController:Ae, |
|||
ngForm:Be,ngHide:Ce,ngIf:De,ngInclude:Ee,ngInit:Fe,ngNonBindable:Ge,ngPluralize:He,ngRepeat:Ie,ngShow:Je,ngStyle:Ke,ngSwitch:Le,ngSwitchWhen:Me,ngSwitchDefault:Ne,ngOptions:Oe,ngTransclude:Pe,ngModel:Qe,ngList:Re,ngChange:Se,pattern:Ec,ngPattern:Ec,required:Fc,ngRequired:Fc,minlength:Gc,ngMinlength:Gc,maxlength:Hc,ngMaxlength:Hc,ngValue:Te,ngModelOptions:Ue}).directive({ngInclude:Ve}).directive(tb).directive(Ic);a.provider({$anchorScroll:We,$animate:Xe,$animateCss:Ye,$$animateJs:Ze,$$animateQueue:$e, |
|||
$$AnimateRunner:af,$$animateAsyncRun:bf,$browser:cf,$cacheFactory:df,$controller:ef,$document:ff,$exceptionHandler:gf,$filter:Jc,$$forceReflow:hf,$interpolate:jf,$interval:kf,$http:lf,$httpParamSerializer:mf,$httpParamSerializerJQLike:nf,$httpBackend:of,$xhrFactory:pf,$location:qf,$log:rf,$parse:sf,$rootScope:tf,$q:uf,$$q:vf,$sce:wf,$sceDelegate:xf,$sniffer:yf,$templateCache:zf,$templateRequest:Af,$$testability:Bf,$timeout:Cf,$window:Df,$$rAF:Ef,$$jqLite:Ff,$$HashMap:Gf,$$cookieReader:Hf})}])}function cb(a){return a.replace(If, |
|||
function(a,d,c,e){return e?c.toUpperCase():c}).replace(Jf,"Moz$1")}function Kc(a){a=a.nodeType;return 1===a||!a||9===a}function Lc(a,b){var d,c,e=b.createDocumentFragment(),f=[];if(Tb.test(a)){d=d||e.appendChild(b.createElement("div"));c=(Kf.exec(a)||["",""])[1].toLowerCase();c=ia[c]||ia._default;d.innerHTML=c[1]+a.replace(Lf,"<$1></$2>")+c[2];for(c=c[0];c--;)d=d.lastChild;f=$a(f,d.childNodes);d=e.firstChild;d.textContent=""}else f.push(b.createTextNode(a));e.textContent="";e.innerHTML="";q(f,function(a){e.appendChild(a)}); |
|||
return e}function Mc(a,b){var d=a.parentNode;d&&d.replaceChild(b,a);b.appendChild(a)}function U(a){if(a instanceof U)return a;var b;F(a)&&(a=V(a),b=!0);if(!(this instanceof U)){if(b&&"<"!=a.charAt(0))throw Ub("nosel");return new U(a)}if(b){b=v.document;var d;a=(d=Mf.exec(a))?[b.createElement(d[1])]:(d=Lc(a,b))?d.childNodes:[]}Nc(this,a)}function Vb(a){return a.cloneNode(!0)}function ub(a,b){b||db(a);if(a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,e=d.length;c<e;c++)db(d[c])}function Oc(a, |
|||
b,d,c){if(x(c))throw Ub("offargs");var e=(c=vb(a))&&c.events,f=c&&c.handle;if(f)if(b){var g=function(b){var c=e[b];x(d)&&Za(c||[],d);x(d)&&c&&0<c.length||(a.removeEventListener(b,f,!1),delete e[b])};q(b.split(" "),function(a){g(a);wb[a]&&g(wb[a])})}else for(b in e)"$destroy"!==b&&a.removeEventListener(b,f,!1),delete e[b]}function db(a,b){var d=a.ng339,c=d&&eb[d];c&&(b?delete c.data[b]:(c.handle&&(c.events.$destroy&&c.handle({},"$destroy"),Oc(a)),delete eb[d],a.ng339=void 0))}function vb(a,b){var d= |
|||
a.ng339,d=d&&eb[d];b&&!d&&(a.ng339=d=++Nf,d=eb[d]={events:{},data:{},handle:void 0});return d}function Wb(a,b,d){if(Kc(a)){var c=x(d),e=!c&&b&&!G(b),f=!b;a=(a=vb(a,!e))&&a.data;if(c)a[b]=d;else{if(f)return a;if(e)return a&&a[b];R(a,b)}}}function xb(a,b){return a.getAttribute?-1<(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" "):!1}function yb(a,b){b&&a.setAttribute&&q(b.split(" "),function(b){a.setAttribute("class",V((" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g, |
|||
" ").replace(" "+V(b)+" "," ")))})}function zb(a,b){if(b&&a.setAttribute){var d=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");q(b.split(" "),function(a){a=V(a);-1===d.indexOf(" "+a+" ")&&(d+=a+" ")});a.setAttribute("class",V(d))}}function Nc(a,b){if(b)if(b.nodeType)a[a.length++]=b;else{var d=b.length;if("number"===typeof d&&b.window!==b){if(d)for(var c=0;c<d;c++)a[a.length++]=b[c]}else a[a.length++]=b}}function Pc(a,b){return Ab(a,"$"+(b||"ngController")+"Controller")}function Ab(a, |
|||
b,d){9==a.nodeType&&(a=a.documentElement);for(b=K(b)?b:[b];a;){for(var c=0,e=b.length;c<e;c++)if(x(d=B.data(a,b[c])))return d;a=a.parentNode||11===a.nodeType&&a.host}}function Qc(a){for(ub(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function Bb(a,b){b||ub(a);var d=a.parentNode;d&&d.removeChild(a)}function Of(a,b){b=b||v;if("complete"===b.document.readyState)b.setTimeout(a);else B(b).on("load",a)}function Rc(a,b){var d=Cb[b.toLowerCase()];return d&&Sc[va(a)]&&d}function Pf(a,b){var d=function(c, |
|||
d){c.isDefaultPrevented=function(){return c.defaultPrevented};var f=b[d||c.type],g=f?f.length:0;if(g){if(y(c.immediatePropagationStopped)){var h=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();h&&h.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};var k=f.specialHandlerWrapper||Qf;1<g&&(f=ha(f));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||k(a,c,f[l])}};d.elem= |
|||
a;return d}function Qf(a,b,d){d.call(a,b)}function Rf(a,b,d){var c=b.relatedTarget;c&&(c===a||Sf.call(a,c))||d.call(a,b)}function Ff(){this.$get=function(){return R(U,{hasClass:function(a,b){a.attr&&(a=a[0]);return xb(a,b)},addClass:function(a,b){a.attr&&(a=a[0]);return zb(a,b)},removeClass:function(a,b){a.attr&&(a=a[0]);return yb(a,b)}})}}function Fa(a,b){var d=a&&a.$$hashKey;if(d)return"function"===typeof d&&(d=a.$$hashKey()),d;d=typeof a;return d="function"==d||"object"==d&&null!==a?a.$$hashKey= |
|||
d+":"+(b||Xd)():d+":"+a}function Ra(a,b){if(b){var d=0;this.nextUid=function(){return++d}}q(a,this.put,this)}function Tc(a){a=Function.prototype.toString.call(a).replace(Tf,"");return a.match(Uf)||a.match(Vf)}function Wf(a){return(a=Tc(a))?"function("+(a[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function bb(a,b){function d(a){return function(b,c){if(G(b))q(b,qc(a));else return a(b,c)}}function c(a,b){Qa(a,"service");if(E(b)||K(b))b=r.instantiate(b);if(!b.$get)throw Ga("pget",a);return m[a+"Provider"]= |
|||
b}function e(a,b){return function(){var c=w.invoke(b,this);if(y(c))throw Ga("undef",a);return c}}function f(a,b,d){return c(a,{$get:!1!==d?e(a,b):b})}function g(a){qb(y(a)||K(a),"modulesToLoad","not an array");var b=[],c;q(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=r.get(e[0]);f[e[1]].apply(f,e[2])}}if(!n.get(a)){n.put(a,!0);try{F(a)?(c=Sb(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):E(a)?b.push(r.invoke(a)):K(a)?b.push(r.invoke(a)): |
|||
Pa(a,"module")}catch(e){throw K(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ga("modulerr",a,e.stack||e.message||e);}}});return b}function h(a,c){function d(b,e){if(a.hasOwnProperty(b)){if(a[b]===k)throw Ga("cdep",b+" <- "+l.join(" <- "));return a[b]}try{return l.unshift(b),a[b]=k,a[b]=c(b,e)}catch(f){throw a[b]===k&&delete a[b],f;}finally{l.shift()}}function e(a,c,f){var g=[];a=bb.$$annotate(a,b,f);for(var h=0,k=a.length;h<k;h++){var l=a[h]; |
|||
if("string"!==typeof l)throw Ga("itkn",l);g.push(c&&c.hasOwnProperty(l)?c[l]:d(l,f))}return g}return{invoke:function(a,b,c,d){"string"===typeof c&&(d=c,c=null);c=e(a,c,d);K(a)&&(a=a[a.length-1]);d=11>=Ca?!1:"function"===typeof a&&/^(?:class\s|constructor\()/.test(Function.prototype.toString.call(a));return d?(c.unshift(null),new (Function.prototype.bind.apply(a,c))):a.apply(b,c)},instantiate:function(a,b,c){var d=K(a)?a[a.length-1]:a;a=e(a,b,c);a.unshift(null);return new (Function.prototype.bind.apply(d, |
|||
a))},get:d,annotate:bb.$$annotate,has:function(b){return m.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],n=new Ra([],!0),m={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,da(b),!1)}),constant:d(function(a,b){Qa(a,"constant");m[a]=b;N[a]=b}),decorator:function(a,b){var c=r.get(a+"Provider"),d=c.$get;c.$get=function(){var a=w.invoke(d,c);return w.invoke(b,null, |
|||
{$delegate:a})}}}},r=m.$injector=h(m,function(a,b){ea.isString(b)&&l.push(b);throw Ga("unpr",l.join(" <- "));}),N={},M=h(N,function(a,b){var c=r.get(a+"Provider",b);return w.invoke(c.$get,c,void 0,a)}),w=M;m.$injectorProvider={$get:da(M)};var p=g(a),w=M.get("$injector");w.strictDi=b;q(p,function(a){a&&w.invoke(a)});return w}function We(){var a=!0;this.disableAutoScrolling=function(){a=!1};this.$get=["$window","$location","$rootScope",function(b,d,c){function e(a){var b=null;Array.prototype.some.call(a, |
|||
function(a){if("a"===va(a))return b=a,!0});return b}function f(a){if(a){a.scrollIntoView();var c;c=g.yOffset;E(c)?c=c():Ob(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):Q(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=F(a)?a:d.hash();var b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var h=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a=== |
|||
b&&""===a||Of(function(){c.$evalAsync(g)})});return g}]}function fb(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;K(a)&&(a=a.join(" "));K(b)&&(b=b.join(" "));return a+" "+b}function Xf(a){F(a)&&(a=a.split(" "));var b=T();q(a,function(a){a.length&&(b[a]=!0)});return b}function Ha(a){return G(a)?a:{}}function Yf(a,b,d,c){function e(a){try{a.apply(null,za.call(arguments,1))}finally{if(M--,0===M)for(;w.length;)try{w.pop()()}catch(b){d.error(b)}}}function f(){u=null;g();h()}function g(){p=I(); |
|||
p=y(p)?null:p;pa(p,L)&&(p=L);L=p}function h(){if(t!==k.url()||H!==p)t=k.url(),H=p,q(J,function(a){a(k.url(),p)})}var k=this,l=a.location,n=a.history,m=a.setTimeout,r=a.clearTimeout,N={};k.isMock=!1;var M=0,w=[];k.$$completeOutstandingRequest=e;k.$$incOutstandingRequestCount=function(){M++};k.notifyWhenNoOutstandingRequests=function(a){0===M?a():w.push(a)};var p,H,t=l.href,z=b.find("base"),u=null,I=c.history?function(){try{return n.state}catch(a){}}:C;g();H=p;k.url=function(b,d,e){y(e)&&(e=null);l!== |
|||
a.location&&(l=a.location);n!==a.history&&(n=a.history);if(b){var f=H===e;if(t===b&&(!c.history||f))return k;var h=t&&Ia(t)===Ia(b);t=b;H=e;if(!c.history||h&&f){if(!h||u)u=b;d?l.replace(b):h?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b;l.href!==b&&(u=b)}else n[d?"replaceState":"pushState"](e,"",b),g(),H=p;return k}return u||l.href.replace(/%27/g,"'")};k.state=function(){return p};var J=[],D=!1,L=null;k.onUrlChange=function(b){if(!D){if(c.history)B(a).on("popstate",f);B(a).on("hashchange", |
|||
f);D=!0}J.push(b);return b};k.$$applicationDestroyed=function(){B(a).off("hashchange popstate",f)};k.$$checkUrlChange=h;k.baseHref=function(){var a=z.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};k.defer=function(a,b){var c;M++;c=m(function(){delete N[c];e(a)},b||0);N[c]=!0;return c};k.defer.cancel=function(a){return N[a]?(delete N[a],r(a),e(C),!0):!1}}function cf(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new Yf(a,c,b,d)}]}function df(){this.$get= |
|||
function(){function a(a,c){function e(a){a!=m&&(r?r==a&&(r=a.n):r=a,f(a.n,a.p),f(a,m),m=a,m.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw O("$cacheFactory")("iid",a);var g=0,h=R({},c,{id:a}),k=T(),l=c&&c.capacity||Number.MAX_VALUE,n=T(),m=null,r=null;return b[a]={put:function(a,b){if(!y(b)){if(l<Number.MAX_VALUE){var c=n[a]||(n[a]={key:a});e(c)}a in k||g++;k[a]=b;g>l&&this.remove(r.key);return b}},get:function(a){if(l<Number.MAX_VALUE){var b=n[a];if(!b)return;e(b)}return k[a]}, |
|||
remove:function(a){if(l<Number.MAX_VALUE){var b=n[a];if(!b)return;b==m&&(m=b.p);b==r&&(r=b.n);f(b.n,b.p);delete n[a]}a in k&&(delete k[a],g--)},removeAll:function(){k=T();g=0;n=T();m=r=null},destroy:function(){n=h=k=null;delete b[a]},info:function(){return R({},h,{size:g})}}}var b={};a.info=function(){var a={};q(b,function(b,e){a[e]=b.info()});return a};a.get=function(a){return b[a]};return a}}function zf(){this.$get=["$cacheFactory",function(a){return a("templates")}]}function Cc(a,b){function d(a, |
|||
b,c){var d=/^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/,e=T();q(a,function(a,f){if(a in n)e[f]=n[a];else{var g=a.match(d);if(!g)throw ga("iscp",b,f,a,c?"controller bindings definition":"isolate scope definition");e[f]={mode:g[1][0],collection:"*"===g[2],optional:"?"===g[3],attrName:g[4]||f};g[4]&&(n[a]=e[f])}});return e}function c(a){var b=a.charAt(0);if(!b||b!==P(b))throw ga("baddir",a);if(a!==a.trim())throw ga("baddir",a);}var e={},f=/^\s*directive\:\s*([\w\-]+)\s+(.*)$/,g=/(([\w\-]+)(?:\:([^;]+))?;?)/, |
|||
h=ae("ngSrc,ngSrcset,src,srcset"),k=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,l=/^(on[a-z]+|formaction)$/,n=T();this.directive=function M(b,d){Qa(b,"directive");F(b)?(c(b),qb(d,"directiveFactory"),e.hasOwnProperty(b)||(e[b]=[],a.factory(b+"Directive",["$injector","$exceptionHandler",function(a,c){var d=[];q(e[b],function(e,f){try{var g=a.invoke(e);E(g)?g={compile:da(g)}:!g.compile&&g.link&&(g.compile=da(g.link));g.priority=g.priority||0;g.index=f;g.name=g.name||b;g.require=g.require||g.controller&&g.name;g.restrict= |
|||
g.restrict||"EA";g.$$moduleName=e.$$moduleName;d.push(g)}catch(h){c(h)}});return d}])),e[b].push(d)):q(b,qc(M));return this};this.component=function(a,b){function c(a){function e(b){return E(b)||K(b)?function(c,d){return a.invoke(b,this,{$element:c,$attrs:d})}:b}var f=b.template||b.templateUrl?b.template:"",g={controller:d,controllerAs:Uc(b.controller)||b.controllerAs||"$ctrl",template:e(f),templateUrl:e(b.templateUrl),transclude:b.transclude,scope:{},bindToController:b.bindings||{},restrict:"E", |
|||
require:b.require};q(b,function(a,b){"$"===b.charAt(0)&&(g[b]=a)});return g}var d=b.controller||function(){};q(b,function(a,b){"$"===b.charAt(0)&&(c[b]=a,E(d)&&(d[b]=a))});c.$inject=["$injector"];return this.directive(a,c)};this.aHrefSanitizationWhitelist=function(a){return x(a)?(b.aHrefSanitizationWhitelist(a),this):b.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(a){return x(a)?(b.imgSrcSanitizationWhitelist(a),this):b.imgSrcSanitizationWhitelist()};var m=!0;this.debugInfoEnabled= |
|||
function(a){return x(a)?(m=a,this):m};var r=10;this.onChangesTtl=function(a){return arguments.length?(r=a,this):r};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(a,b,c,n,t,z,u,I,J,D){function L(){try{if(!--qa)throw Z=void 0,ga("infchng",r);u.$apply(function(){for(var a=0,b=Z.length;a<b;++a)Z[a]();Z=void 0})}finally{qa++}}function S(a,b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d< |
|||
e;d++)f=c[d],this[f]=b[f]}else this.$attr={};this.$$element=a}function $(a,b,c){na.innerHTML="<span "+b+">";b=na.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function A(a,b){try{a.addClass(b)}catch(c){}}function ba(a,b,c,d,e){a instanceof B||(a=B(a));for(var f=/\S+/,g=0,h=a.length;g<h;g++){var k=a[g];k.nodeType===Ma&&k.nodeValue.match(f)&&Mc(k,a[g]=v.document.createElement("span"))}var l=s(a,b,a,c,d,e);ba.$$addScopeClass(a);var m=null;return function(b, |
|||
c,d){qb(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var f=d.parentBoundTranscludeFn,g=d.transcludeControllers;d=d.futureParentElement;f&&f.$$boundTransclude&&(f=f.$$boundTransclude);m||(m=(d=d&&d[0])?"foreignobject"!==va(d)&&ma.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==m?B(ca(m,B("<div>").append(a).html())):c?Oa.clone.call(a):a;if(g)for(var h in g)d.data("$"+h+"Controller",g[h].instance);ba.$$addScopeInfo(d,b);c&&c(d,b);l&&l(b,d,d,f);return d}}function s(a,b,c,d,e,f){function g(a, |
|||
c,d,e){var f,k,l,m,n,t,p;if(r)for(p=Array(c.length),m=0;m<h.length;m+=3)f=h[m],p[f]=c[f];else p=c;m=0;for(n=h.length;m<n;)k=p[h[m++]],c=h[m++],f=h[m++],c?(c.scope?(l=a.$new(),ba.$$addScopeInfo(B(k),l)):l=a,t=c.transcludeOnThisElement?ka(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?ka(a,b):null,c(f,l,k,d,t)):f&&f(a,k.childNodes,void 0,e)}for(var h=[],k,l,m,n,r,t=0;t<a.length;t++){k=new S;l=x(a[t],[],k,0===t?d:void 0,e);(f=l.length?Ba(l,a[t],k,b,c,null,[],[],f):null)&&f.scope&&ba.$$addScopeClass(k.$$element); |
|||
k=f&&f.terminal||!(m=a[t].childNodes)||!m.length?null:s(m,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b);if(f||k)h.push(t,f,k),n=!0,r=r||f;f=null}return n?g:null}function ka(a,b,c){function d(e,f,g,h,k){e||(e=a.$new(!1,k),e.$$transcluded=!0);return b(e,f,{parentBoundTranscludeFn:c,transcludeControllers:g,futureParentElement:h})}var e=d.$$slots=T(),f;for(f in b.$$slots)e[f]=b.$$slots[f]?ka(a,b.$$slots[f],c):null;return d}function x(a,b,c,d,e){var h=c.$attr,k;switch(a.nodeType){case 1:la(b, |
|||
xa(va(a)),"E",d,e);for(var l,m,n,t=a.attributes,r=0,p=t&&t.length;r<p;r++){var I=!1,D=!1;l=t[r];k=l.name;m=V(l.value);l=xa(k);if(n=ya.test(l))k=k.replace(Vc,"").substr(8).replace(/_(.)/g,function(a,b){return b.toUpperCase()});(l=l.match(Aa))&&Q(l[1])&&(I=k,D=k.substr(0,k.length-5)+"end",k=k.substr(0,k.length-6));l=xa(k.toLowerCase());h[l]=k;if(n||!c.hasOwnProperty(l))c[l]=m,Rc(a,l)&&(c[l]=!0);fa(a,b,m,l,n);la(b,l,"A",d,e,I,D)}a=a.className;G(a)&&(a=a.animVal);if(F(a)&&""!==a)for(;k=g.exec(a);)l=xa(k[2]), |
|||
la(b,l,"C",d,e)&&(c[l]=V(k[3])),a=a.substr(k.index+k[0].length);break;case Ma:if(11===Ca)for(;a.parentNode&&a.nextSibling&&a.nextSibling.nodeType===Ma;)a.nodeValue+=a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);X(b,a.nodeValue);break;case 8:try{if(k=f.exec(a.nodeValue))l=xa(k[1]),la(b,l,"M",d,e)&&(c[l]=V(k[2]))}catch(J){}}b.sort(Y);return b}function Wc(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ga("uterdir",b,c);1==a.nodeType&&(a.hasAttribute(b)&& |
|||
e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return B(d)}function Xc(a,b,c){return function(d,e,f,g,h){e=Wc(e[0],b,c);return a(d,e,f,g,h)}}function Yb(a,b,c,d,e,f){var g;return a?ba(b,c,d,e,f):function(){g||(g=ba(b,c,d,e,f),b=c=f=null);return g.apply(this,arguments)}}function Ba(a,b,d,e,f,g,h,k,l){function m(a,b,c,d){if(a){c&&(a=Xc(a,c,d));a.require=A.require;a.directiveName=M;if(D===A||A.$$isolateScope)a=ha(a,{isolateScope:!0});h.push(a)}if(b){c&&(b=Xc(b,c,d)); |
|||
b.require=A.require;b.directiveName=M;if(D===A||A.$$isolateScope)b=ha(b,{isolateScope:!0});k.push(b)}}function n(a,c,e,f,g){function l(a,b,c,d){var e;Ya(a)||(d=c,c=b,b=a,a=void 0);H&&(e=u);c||(c=H?z.parent():z);if(d){var f=g.$$slots[d];if(f)return f(a,b,e,c,$);if(y(f))throw ga("noslot",d,wa(z));}else return g(a,b,e,c,$)}var m,t,p,A,w,u,L,z;b===e?(f=d,z=d.$$element):(z=B(e),f=new S(z,d));w=c;D?A=c.$new(!0):r&&(w=c.$parent);g&&(L=l,L.$$boundTransclude=g,L.isSlotFilled=function(a){return!!g.$$slots[a]}); |
|||
I&&(u=O(z,f,L,I,A,c,D));D&&(ba.$$addScopeInfo(z,A,!0,!(J&&(J===D||J===D.$$originalDirective))),ba.$$addScopeClass(z,!0),A.$$isolateBindings=D.$$isolateBindings,t=ia(c,f,A,A.$$isolateBindings,D),t.removeWatches&&A.$on("$destroy",t.removeWatches));for(m in u){t=I[m];p=u[m];var Xb=t.$$bindings.bindToController;p.bindingInfo=p.identifier&&Xb?ia(w,f,p.instance,Xb,t):{};var M=p();M!==p.instance&&(p.instance=M,z.data("$"+t.name+"Controller",M),p.bindingInfo.removeWatches&&p.bindingInfo.removeWatches(),p.bindingInfo= |
|||
ia(w,f,p.instance,Xb,t))}q(I,function(a,b){var c=a.require;a.bindToController&&!K(c)&&G(c)&&R(u[b].instance,gb(b,c,z,u))});q(u,function(a){var b=a.instance;E(b.$onChanges)&&b.$onChanges(a.bindingInfo.initialChanges);E(b.$onInit)&&b.$onInit();E(b.$onDestroy)&&w.$on("$destroy",function(){b.$onDestroy()})});m=0;for(t=h.length;m<t;m++)p=h[m],ja(p,p.isolateScope?A:c,z,f,p.require&&gb(p.directiveName,p.require,z,u),L);var $=c;D&&(D.template||null===D.templateUrl)&&($=A);a&&a($,e.childNodes,void 0,g);for(m= |
|||
k.length-1;0<=m;m--)p=k[m],ja(p,p.isolateScope?A:c,z,f,p.require&&gb(p.directiveName,p.require,z,u),L);q(u,function(a){a=a.instance;E(a.$postLink)&&a.$postLink()})}l=l||{};for(var t=-Number.MAX_VALUE,r=l.newScopeDirective,I=l.controllerDirectives,D=l.newIsolateScopeDirective,J=l.templateDirective,w=l.nonTlbTranscludeDirective,u=!1,L=!1,H=l.hasElementTranscludeDirective,z=d.$$element=B(b),A,M,$,s=e,Sa,ka=!1,C=!1,v,F=0,Ba=a.length;F<Ba;F++){A=a[F];var P=A.$$start,Q=A.$$end;P&&(z=Wc(b,P,Q));$=void 0; |
|||
if(t>A.priority)break;if(v=A.scope)A.templateUrl||(G(v)?(W("new/isolated scope",D||r,A,z),D=A):W("new/isolated scope",D,A,z)),r=r||A;M=A.name;if(!ka&&(A.replace&&(A.templateUrl||A.template)||A.transclude&&!A.$$tlb)){for(v=F+1;ka=a[v++];)if(ka.transclude&&!ka.$$tlb||ka.replace&&(ka.templateUrl||ka.template)){C=!0;break}ka=!0}!A.templateUrl&&A.controller&&(v=A.controller,I=I||T(),W("'"+M+"' controller",I[M],A,z),I[M]=A);if(v=A.transclude)if(u=!0,A.$$tlb||(W("transclusion",w,A,z),w=A),"element"==v)H= |
|||
!0,t=A.priority,$=z,z=d.$$element=B(ba.$$createComment(M,d[M])),b=z[0],da(f,za.call($,0),b),$[0].$$parentNode=$[0].parentNode,s=Yb(C,$,e,t,g&&g.name,{nonTlbTranscludeDirective:w});else{var la=T();$=B(Vb(b)).contents();if(G(v)){$=[];var Y=T(),X=T();q(v,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;Y[a]=b;la[b]=null;X[b]=c});q(z.contents(),function(a){var b=Y[xa(va(a))];b?(X[b]=!0,la[b]=la[b]||[],la[b].push(a)):$.push(a)});q(X,function(a,b){if(!a)throw ga("reqslot",b);});for(var Z in la)la[Z]&& |
|||
(la[Z]=Yb(C,la[Z],e))}z.empty();s=Yb(C,$,e,void 0,void 0,{needsNewScope:A.$$isolateScope||A.$$newScope});s.$$slots=la}if(A.template)if(L=!0,W("template",J,A,z),J=A,v=E(A.template)?A.template(z,d):A.template,v=ta(v),A.replace){g=A;$=Tb.test(v)?Yc(ca(A.templateNamespace,V(v))):[];b=$[0];if(1!=$.length||1!==b.nodeType)throw ga("tplrt",M,"");da(f,z,b);Ba={$attr:{}};v=x(b,[],Ba);var ea=a.splice(F+1,a.length-(F+1));(D||r)&&Zc(v,D,r);a=a.concat(v).concat(ea);U(d,Ba);Ba=a.length}else z.html(v);if(A.templateUrl)L= |
|||
!0,W("template",J,A,z),J=A,A.replace&&(g=A),n=aa(a.splice(F,a.length-F),z,d,f,u&&s,h,k,{controllerDirectives:I,newScopeDirective:r!==A&&r,newIsolateScopeDirective:D,templateDirective:J,nonTlbTranscludeDirective:w}),Ba=a.length;else if(A.compile)try{Sa=A.compile(z,d,s),E(Sa)?m(null,Sa,P,Q):Sa&&m(Sa.pre,Sa.post,P,Q)}catch(fa){c(fa,wa(z))}A.terminal&&(n.terminal=!0,t=Math.max(t,A.priority))}n.scope=r&&!0===r.scope;n.transcludeOnThisElement=u;n.templateOnThisElement=L;n.transclude=s;l.hasElementTranscludeDirective= |
|||
H;return n}function gb(a,b,c,d){var e;if(F(b)){var f=b.match(k);b=b.substring(f[0].length);var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e=g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw ga("ctreq",b,a);}else if(K(b))for(e=[],g=0,f=b.length;g<f;g++)e[g]=gb(a,b[g],c,d);else G(b)&&(e={},q(b,function(b,f){e[f]=gb(a,b,c,d)}));return e||null}function O(a,b,c,d,e,f,g){var h=T(),k;for(k in d){var l=d[k],m={$scope:l===g||l.$$isolateScope?e:f, |
|||
$element:a,$attrs:b,$transclude:c},n=l.controller;"@"==n&&(n=b[l.name]);m=z(n,m,!0,l.controllerAs);h[l.name]=m;a.data("$"+l.name+"Controller",m.instance)}return h}function Zc(a,b,c){for(var d=0,e=a.length;d<e;d++)a[d]=Pb(a[d],{$$isolateScope:b,$$newScope:c})}function la(b,f,g,h,k,l,m){if(f===k)return null;k=null;if(e.hasOwnProperty(f)){var n;f=a.get(f+"Directive");for(var t=0,r=f.length;t<r;t++)try{if(n=f[t],(y(h)||h>n.priority)&&-1!=n.restrict.indexOf(g)){l&&(n=Pb(n,{$$start:l,$$end:m}));if(!n.$$bindings){var I= |
|||
n,D=n,A=n.name,J={isolateScope:null,bindToController:null};G(D.scope)&&(!0===D.bindToController?(J.bindToController=d(D.scope,A,!0),J.isolateScope={}):J.isolateScope=d(D.scope,A,!1));G(D.bindToController)&&(J.bindToController=d(D.bindToController,A,!0));if(G(J.bindToController)){var w=D.controller,z=D.controllerAs;if(!w)throw ga("noctrl",A);if(!Uc(w,z))throw ga("noident",A);}var u=I.$$bindings=J;G(u.isolateScope)&&(n.$$isolateBindings=u.isolateScope)}b.push(n);k=n}}catch(L){c(L)}}return k}function Q(b){if(e.hasOwnProperty(b))for(var c= |
|||
a.get(b+"Directive"),d=0,f=c.length;d<f;d++)if(b=c[d],b.multiElement)return!0;return!1}function U(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;q(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});q(b,function(b,f){"class"==f?(A(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function aa(a,b,c,d,e,f, |
|||
g,h){var k=[],l,m,t=b[0],p=a.shift(),r=Pb(p,{templateUrl:null,transclude:null,replace:null,$$originalDirective:p}),I=E(p.templateUrl)?p.templateUrl(b,c):p.templateUrl,D=p.templateNamespace;b.empty();n(I).then(function(n){var J,w;n=ta(n);if(p.replace){n=Tb.test(n)?Yc(ca(D,V(n))):[];J=n[0];if(1!=n.length||1!==J.nodeType)throw ga("tplrt",p.name,I);n={$attr:{}};da(d,b,J);var z=x(J,[],n);G(p.scope)&&Zc(z,!0);a=z.concat(a);U(c,n)}else J=t,b.html(n);a.unshift(r);l=Ba(a,J,c,e,b,p,f,g,h);q(d,function(a,c){a== |
|||
J&&(d[c]=b[0])});for(m=s(b[0].childNodes,e);k.length;){n=k.shift();w=k.shift();var u=k.shift(),L=k.shift(),z=b[0];if(!n.$$destroyed){if(w!==t){var S=w.className;h.hasElementTranscludeDirective&&p.replace||(z=Vb(J));da(u,B(w),z);A(B(z),S)}w=l.transcludeOnThisElement?ka(n,l.transclude,L):L;l(m,n,z,d,w)}}k=null});return function(a,b,c,d,e){a=e;b.$$destroyed||(k?k.push(b,c,d,a):(l.transcludeOnThisElement&&(a=ka(b,l.transclude,e)),l(m,b,c,d,a)))}}function Y(a,b){var c=b.priority-a.priority;return 0!== |
|||
c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function W(a,b,c,d){function e(a){return a?" (module: "+a+")":""}if(b)throw ga("multidir",b.name,e(b.$$moduleName),c.name,e(c.$$moduleName),a,wa(d));}function X(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&ba.$$addBindingClass(a);return function(a,c){var e=c.parent();b||ba.$$addBindingClass(e);ba.$$addBindingInfo(e,d.expressions);a.$watch(d,function(a){c[0].nodeValue=a})}}})}function ca(a,b){a= |
|||
P(a||"html");switch(a){case "svg":case "math":var c=v.document.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function ea(a,b){if("srcdoc"==b)return I.HTML;var c=va(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return I.RESOURCE_URL}function fa(a,c,d,e,f){var g=ea(a,e);f=h[e]||f;var k=b(d,!0,g,f);if(k){if("multiple"===e&&"select"===va(a))throw ga("selmulti",wa(a));c.push({priority:100,compile:function(){return{pre:function(a, |
|||
c,h){c=h.$$observers||(h.$$observers=T());if(l.test(e))throw ga("nodomevents");var m=h[e];m!==d&&(k=m&&b(m,!0,g,f),d=m);k&&(h[e]=k(a),(c[e]||(c[e]=[])).$$inter=!0,(h.$$observers&&h.$$observers[e].$$scope||a).$watch(k,function(a,b){"class"===e&&a!=b?h.$updateClass(a,b):h.$set(e,a)}))}}}})}}function da(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&(a.context= |
|||
c);break}f&&f.replaceChild(c,d);a=v.document.createDocumentFragment();for(g=0;g<e;g++)a.appendChild(b[g]);B.hasData(d)&&(B.data(c,B.data(d)),B(d).off("$destroy"));B.cleanData(a.querySelectorAll("*"));for(g=1;g<e;g++)delete b[g];b[0]=c;b.length=1}function ha(a,b){return R(function(){return a.apply(null,arguments)},a,b)}function ja(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,wa(d))}}function ia(a,c,d,e,f){function g(b,c,e){E(d.$onChanges)&&c!==e&&(Z||(a.$$postDigest(L),Z=[]),m||(m={},Z.push(h)),m[b]&& |
|||
(e=m[b].previousValue),m[b]=new Db(e,c))}function h(){d.$onChanges(m);m=void 0}var k=[],l={},m;q(e,function(e,h){var m=e.attrName,n=e.optional,p,r,I,D;switch(e.mode){case "@":n||ua.call(c,m)||(d[h]=c[m]=void 0);c.$observe(m,function(a){if(F(a)||Da(a))g(h,a,d[h]),d[h]=a});c.$$observers[m].$$scope=a;p=c[m];F(p)?d[h]=b(p)(a):Da(p)&&(d[h]=p);l[h]=new Db(Zb,d[h]);break;case "=":if(!ua.call(c,m)){if(n)break;c[m]=void 0}if(n&&!c[m])break;r=t(c[m]);D=r.literal?pa:function(a,b){return a===b||a!==a&&b!==b}; |
|||
I=r.assign||function(){p=d[h]=r(a);throw ga("nonassign",c[m],m,f.name);};p=d[h]=r(a);n=function(b){D(b,d[h])||(D(b,p)?I(a,b=d[h]):d[h]=b);return p=b};n.$stateful=!0;n=e.collection?a.$watchCollection(c[m],n):a.$watch(t(c[m],n),null,r.literal);k.push(n);break;case "<":if(!ua.call(c,m)){if(n)break;c[m]=void 0}if(n&&!c[m])break;r=t(c[m]);d[h]=r(a);l[h]=new Db(Zb,d[h]);n=a.$watch(r,function(a,b){a===b&&(b=d[h]);g(h,a,b);d[h]=a},r.literal);k.push(n);break;case "&":r=c.hasOwnProperty(m)?t(c[m]):C;if(r=== |
|||
C&&n)break;d[h]=function(b){return r(a,b)}}});return{initialChanges:l,removeWatches:k.length&&function(){for(var a=0,b=k.length;a<b;++a)k[a]()}}}var oa=/^\w/,na=v.document.createElement("div"),qa=r,Z;S.prototype={$normalize:xa,$addClass:function(a){a&&0<a.length&&J.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&J.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=$c(a,b);c&&c.length&&J.addClass(this.$$element,c);(c=$c(b,a))&&c.length&&J.removeClass(this.$$element, |
|||
c)},$set:function(a,b,d,e){var f=Rc(this.$$element[0],a),g=ad[a],h=a;f?(this.$$element.prop(a,b),e=f):g&&(this[g]=b,h=g);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=zc(a,"-"));f=va(this.$$element);if("a"===f&&("href"===a||"xlinkHref"===a)||"img"===f&&"src"===a)this[a]=b=D(b,"src"===a);else if("img"===f&&"srcset"===a){for(var f="",g=V(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(g)?k:/(,)/,g=g.split(k),k=Math.floor(g.length/2),l=0;l<k;l++)var m=2*l,f=f+D(V(g[m]),!0),f= |
|||
f+(" "+V(g[m+1]));g=V(g[2*l]).split(/\s/);f+=D(V(g[0]),!0);2===g.length&&(f+=" "+V(g[1]));this[a]=b=f}!1!==d&&(null===b||y(b)?this.$$element.removeAttr(e):oa.test(e)?this.$$element.attr(e,b):$(this.$$element[0],e,b));(a=this.$$observers)&&q(a[h],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=T()),e=d[a]||(d[a]=[]);e.push(b);u.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||y(c[a])||b(c[a])});return function(){Za(e,b)}}};var ra=b.startSymbol(), |
|||
sa=b.endSymbol(),ta="{{"==ra&&"}}"==sa?Xa:function(a){return a.replace(/\{\{/g,ra).replace(/}}/g,sa)},ya=/^ngAttr[A-Z]/,Aa=/^(.+)Start$/;ba.$$addBindingInfo=m?function(a,b){var c=a.data("$binding")||[];K(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:C;ba.$$addBindingClass=m?function(a){A(a,"ng-binding")}:C;ba.$$addScopeInfo=m?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:C;ba.$$addScopeClass=m?function(a,b){A(a,b?"ng-isolate-scope":"ng-scope")}:C;ba.$$createComment= |
|||
function(a,b){var c="";m&&(c=" "+(a||"")+": "+(b||"")+" ");return v.document.createComment(c)};return ba}]}function Db(a,b){this.previousValue=a;this.currentValue=b}function xa(a){return cb(a.replace(Vc,""))}function $c(a,b){var d="",c=a.split(/\s+/),e=b.split(/\s+/),f=0;a:for(;f<c.length;f++){for(var g=c[f],h=0;h<e.length;h++)if(g==e[h])continue a;d+=(0<d.length?" ":"")+g}return d}function Yc(a){a=B(a);var b=a.length;if(1>=b)return a;for(;b--;)8===a[b].nodeType&&Zf.call(a,b,1);return a}function Uc(a, |
|||
b){if(b&&F(b))return b;if(F(a)){var d=bd.exec(a);if(d)return d[3]}}function ef(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,c){Qa(b,"controller");G(b)?R(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=["$injector","$window",function(d,c){function e(a,b,c,d){if(!a||!G(a.$scope))throw O("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,g,h,k){var l,n,m;h=!0===h;k&&F(k)&&(m=k);if(F(f)){k=f.match(bd);if(!k)throw $f("ctrlfmt",f);n=k[1];m= |
|||
m||k[3];f=a.hasOwnProperty(n)?a[n]:Bc(g.$scope,n,!0)||(b?Bc(c,n,!0):void 0);Pa(f,n,!0)}if(h)return h=(K(f)?f[f.length-1]:f).prototype,l=Object.create(h||null),m&&e(g,m,l,n||f.name),R(function(){var a=d.invoke(f,l,g,n);a!==l&&(G(a)||E(a))&&(l=a,m&&e(g,m,l,n||f.name));return l},{instance:l,identifier:m});l=d.instantiate(f,g,n);m&&e(g,m,l,n||f.name);return l}}]}function ff(){this.$get=["$window",function(a){return B(a.document)}]}function gf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a, |
|||
arguments)}}]}function $b(a){return G(a)?fa(a)?a.toISOString():ab(a):a}function mf(){this.$get=function(){return function(a){if(!a)return"";var b=[];pc(a,function(a,c){null===a||y(a)||(K(a)?q(a,function(a){b.push(ja(c)+"="+ja($b(a)))}):b.push(ja(c)+"="+ja($b(a))))});return b.join("&")}}}function nf(){this.$get=function(){return function(a){function b(a,e,f){null===a||y(a)||(K(a)?q(a,function(a,c){b(a,e+"["+(G(a)?c:"")+"]")}):G(a)&&!fa(a)?pc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):d.push(ja(e)+ |
|||
"="+ja($b(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function ac(a,b){if(F(a)){var d=a.replace(ag,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf(cd))||(c=(c=d.match(bg))&&cg[c[0]].test(d));c&&(a=uc(d))}}return a}function dd(a){var b=T(),d;F(a)?q(a.split("\n"),function(a){d=a.indexOf(":");var e=P(V(a.substr(0,d)));a=V(a.substr(d+1));e&&(b[e]=b[e]?b[e]+", "+a:a)}):G(a)&&q(a,function(a,d){var f=P(d),g=V(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function ed(a){var b; |
|||
return function(d){b||(b=dd(a));return d?(d=b[P(d)],void 0===d&&(d=null),d):b}}function fd(a,b,d,c){if(E(c))return c(a,b,d);q(c,function(c){a=c(a,b,d)});return a}function lf(){var a=this.defaults={transformResponse:[ac],transformRequest:[function(a){return G(a)&&"[object File]"!==ma.call(a)&&"[object Blob]"!==ma.call(a)&&"[object FormData]"!==ma.call(a)?ab(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ha(bc),put:ha(bc),patch:ha(bc)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN", |
|||
paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return x(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return x(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(e,f,g,h,k,l){function n(b){function c(a){var b=R({},a);b.data=fd(a.data,a.headers,a.status,f.transformResponse);a=a.status;return 200<=a&&300>a?b:k.reject(b)}function e(a,b){var c,d={};q(a,function(a, |
|||
e){E(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}if(!G(b))throw O("$http")("badreq",b);if(!F(b.url))throw O("$http")("badreq",b.url);var f=R({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);f.headers=function(b){var c=a.headers,d=R({},b.headers),f,g,h,c=R({},c.common,c[P(b.method)]);a:for(f in c){g=P(f);for(h in d)if(P(h)===g)continue a;d[f]=c[f]}return e(d,ha(b))}(b);f.method=sb(f.method);f.paramSerializer=F(f.paramSerializer)? |
|||
l.get(f.paramSerializer):f.paramSerializer;var g=[function(b){var d=b.headers,e=fd(b.data,ed(d),void 0,b.transformRequest);y(e)&&q(d,function(a,b){"content-type"===P(b)&&delete d[b]});y(b.withCredentials)&&!y(a.withCredentials)&&(b.withCredentials=a.withCredentials);return m(b,e).then(c,c)},void 0],h=k.when(f);for(q(M,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;){b=g.shift();var n=g.shift(), |
|||
h=h.then(b,n)}d?(h.success=function(a){Pa(a,"fn");h.then(function(b){a(b.data,b.status,b.headers,f)});return h},h.error=function(a){Pa(a,"fn");h.then(null,function(b){a(b.data,b.status,b.headers,f)});return h}):(h.success=gd("success"),h.error=gd("error"));return h}function m(c,d){function g(a){if(a){var c={};q(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}});return c}}function l(a,c,d,e){function f(){m(c,a,d,e)}L&&(200<=a&&300>a?L.put(A,[a,c,dd(d), |
|||
e]):L.remove(A));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function m(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?J.resolve:J.reject)({data:a,status:b,headers:ed(d),config:c,statusText:e})}function u(a){m(a.data,a.status,ha(a.headers()),a.statusText)}function I(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,1)}var J=k.defer(),D=J.promise,L,S,M=c.headers,A=r(c.url,c.paramSerializer(c.params));n.pendingRequests.push(c);D.then(I,I);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&& |
|||
"JSONP"!==c.method||(L=G(c.cache)?c.cache:G(a.cache)?a.cache:N);L&&(S=L.get(A),x(S)?S&&E(S.then)?S.then(u,u):K(S)?m(S[1],S[0],ha(S[2]),S[3]):m(S,200,{},"OK"):L.put(A,D));y(S)&&((S=hd(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(M[c.xsrfHeaderName||a.xsrfHeaderName]=S),e(c.method,A,d,l,M,c.timeout,c.withCredentials,c.responseType,g(c.eventHandlers),g(c.uploadEventHandlers)));return D}function r(a,b){0<b.length&&(a+=(-1==a.indexOf("?")?"?":"&")+b);return a}var N=g("$http");a.paramSerializer= |
|||
F(a.paramSerializer)?l.get(a.paramSerializer):a.paramSerializer;var M=[];q(c,function(a){M.unshift(F(a)?l.get(a):l.invoke(a))});n.pendingRequests=[];(function(a){q(arguments,function(a){n[a]=function(b,c){return n(R({},c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){q(arguments,function(a){n[a]=function(b,c,d){return n(R({},d||{},{method:a,url:b,data:c}))}})})("post","put","patch");n.defaults=a;return n}]}function pf(){this.$get=function(){return function(){return new v.XMLHttpRequest}}} |
|||
function of(){this.$get=["$browser","$window","$document","$xhrFactory",function(a,b,d,c){return dg(a,c,a.defer,b.angular.callbacks,d[0])}]}function dg(a,b,d,c,e){function f(a,b,d){var f=e.createElement("script"),n=null;f.type="text/javascript";f.src=a;f.async=!0;n=function(a){f.removeEventListener("load",n,!1);f.removeEventListener("error",n,!1);e.body.removeChild(f);f=null;var g=-1,N="unknown";a&&("load"!==a.type||c[b].called||(a={type:"error"}),N=a.type,g="error"===a.type?404:200);d&&d(g,N)};f.addEventListener("load", |
|||
n,!1);f.addEventListener("error",n,!1);e.body.appendChild(f);return n}return function(e,h,k,l,n,m,r,N,M,w){function p(){z&&z();u&&u.abort()}function H(b,c,e,f,g){x(J)&&d.cancel(J);z=u=null;b(c,e,f,g);a.$$completeOutstandingRequest(C)}a.$$incOutstandingRequestCount();h=h||a.url();if("jsonp"==P(e)){var t="_"+(c.counter++).toString(36);c[t]=function(a){c[t].data=a;c[t].called=!0};var z=f(h.replace("JSON_CALLBACK","angular.callbacks."+t),t,function(a,b){H(l,a,c[t].data,"",b);c[t]=C})}else{var u=b(e,h); |
|||
u.open(e,h,!0);q(n,function(a,b){x(a)&&u.setRequestHeader(b,a)});u.onload=function(){var a=u.statusText||"",b="response"in u?u.response:u.responseText,c=1223===u.status?204:u.status;0===c&&(c=b?200:"file"==ra(h).protocol?404:0);H(l,c,b,u.getAllResponseHeaders(),a)};e=function(){H(l,-1,null,null,"")};u.onerror=e;u.onabort=e;q(M,function(a,b){u.addEventListener(b,a)});q(w,function(a,b){u.upload.addEventListener(b,a)});r&&(u.withCredentials=!0);if(N)try{u.responseType=N}catch(I){if("json"!==N)throw I; |
|||
}u.send(y(k)?null:k)}if(0<m)var J=d(p,m);else m&&E(m.then)&&m.then(p)}}function jf(){var a="{{",b="}}";this.startSymbol=function(b){return b?(a=b,this):a};this.endSymbol=function(a){return a?(b=a,this):b};this.$get=["$parse","$exceptionHandler","$sce",function(d,c,e){function f(a){return"\\\\\\"+a}function g(c){return c.replace(m,a).replace(r,b)}function h(a,b,c,d){var e;return e=a.$watch(function(a){e();return d(a)},b,c)}function k(f,k,m,r){function H(a){try{var b=a;a=m?e.getTrusted(m,b):e.valueOf(b); |
|||
var d;if(r&&!x(a))d=a;else if(null==a)d="";else{switch(typeof a){case "string":break;case "number":a=""+a;break;default:a=ab(a)}d=a}return d}catch(g){c(Ja.interr(f,g))}}if(!f.length||-1===f.indexOf(a)){var t;k||(k=g(f),t=da(k),t.exp=f,t.expressions=[],t.$$watchDelegate=h);return t}r=!!r;var z,u,I=0,J=[],D=[];t=f.length;for(var L=[],S=[];I<t;)if(-1!=(z=f.indexOf(a,I))&&-1!=(u=f.indexOf(b,z+l)))I!==z&&L.push(g(f.substring(I,z))),I=f.substring(z+l,u),J.push(I),D.push(d(I,H)),I=u+n,S.push(L.length),L.push(""); |
|||
else{I!==t&&L.push(g(f.substring(I)));break}m&&1<L.length&&Ja.throwNoconcat(f);if(!k||J.length){var q=function(a){for(var b=0,c=J.length;b<c;b++){if(r&&y(a[b]))return;L[S[b]]=a[b]}return L.join("")};return R(function(a){var b=0,d=J.length,e=Array(d);try{for(;b<d;b++)e[b]=D[b](a);return q(e)}catch(g){c(Ja.interr(f,g))}},{exp:f,expressions:J,$$watchDelegate:function(a,b){var c;return a.$watchGroup(D,function(d,e){var f=q(d);E(b)&&b.call(this,f,d!==e?c:f,a);c=f})}})}}var l=a.length,n=b.length,m=new RegExp(a.replace(/./g, |
|||
f),"g"),r=new RegExp(b.replace(/./g,f),"g");k.startSymbol=function(){return a};k.endSymbol=function(){return b};return k}]}function kf(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(a,b,d,c,e){function f(f,k,l,n){function m(){r?f.apply(null,N):f(p)}var r=4<arguments.length,N=r?za.call(arguments,4):[],q=b.setInterval,w=b.clearInterval,p=0,H=x(n)&&!n,t=(H?c:d).defer(),z=t.promise;l=x(l)?l:0;z.$$intervalId=q(function(){H?e.defer(m):a.$evalAsync(m);t.notify(p++);0<l&&p>=l&&(t.resolve(p), |
|||
w(z.$$intervalId),delete g[z.$$intervalId]);H||a.$apply()},k);g[z.$$intervalId]=t;return z}var g={};f.cancel=function(a){return a&&a.$$intervalId in g?(g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete g[a.$$intervalId],!0):!1};return f}]}function cc(a){a=a.split("/");for(var b=a.length;b--;)a[b]=ob(a[b]);return a.join("/")}function id(a,b){var d=ra(a);b.$$protocol=d.protocol;b.$$host=d.hostname;b.$$port=X(d.port)||eg[d.protocol]||null}function jd(a,b){var d="/"!==a.charAt(0); |
|||
d&&(a="/"+a);var c=ra(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname);b.$$search=xc(c.search);b.$$hash=decodeURIComponent(c.hash);b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function na(a,b){if(0===b.indexOf(a))return b.substr(a.length)}function Ia(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function hb(a){return a.replace(/(#.+)|#$/,"$1")}function dc(a,b,d){this.$$html5=!0;d=d||"";id(a,this);this.$$parse=function(a){var d=na(b, |
|||
a);if(!F(d))throw Eb("ipthprfx",a,b);jd(d,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Rb(this.$$search),d=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=cc(this.$$path)+(a?"?"+a:"")+d;this.$$absUrl=b+this.$$url.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;x(f=na(a,c))?(g=f,g=x(f=na(d,f))?b+(na("/",f)||f):a+g):x(f=na(b,c))?g=b+f:b==c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function ec(a,b,d){id(a,this); |
|||
this.$$parse=function(c){var e=na(a,c)||na(b,c),f;y(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",y(e)&&(a=c,this.replace())):(f=na(d,e),y(f)&&(f=e));jd(f,this);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;0===f.indexOf(e)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b=Rb(this.$$search),e=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=cc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+(this.$$url?d+this.$$url:"")};this.$$parseLinkUrl= |
|||
function(b,d){return Ia(a)==Ia(b)?(this.$$parse(b),!0):!1}}function kd(a,b,d){this.$$html5=!0;ec.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a==Ia(c)?f=c:(g=na(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$compose=function(){var b=Rb(this.$$search),e=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=cc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+d+this.$$url}}function Fb(a){return function(){return this[a]}}function ld(a, |
|||
b){return function(d){if(y(d))return this[a];this[a]=b(d);this.$$compose();return this}}function qf(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return x(b)?(a=b,this):a};this.html5Mode=function(a){return Da(a)?(b.enabled=a,this):G(a)?(Da(a.enabled)&&(b.enabled=a.enabled),Da(a.requireBase)&&(b.requireBase=a.requireBase),Da(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d, |
|||
c,e,f,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g;}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,n;n=c.baseHref();var m=c.url(),r;if(b.enabled){if(!n&&b.requireBase)throw Eb("nobase");r=m.substring(0,m.indexOf("/",m.indexOf("//")+2))+(n||"/");n=e.history?dc:kd}else r=Ia(m),n=ec;var N=r.substr(0,Ia(r).lastIndexOf("/")+1);l=new n(r,N,"#"+a);l.$$parseLinkUrl(m,m);l.$$state=c.state(); |
|||
var q=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=B(a.target);"a"!==va(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");G(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=ra(h.animVal).href);q.test(h)||!h||e.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(h,k)||(a.preventDefault(),l.absUrl()!=c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]= |
|||
!0))}});hb(l.absUrl())!=hb(m)&&c.url(l.absUrl(),!0);var w=!0;c.onUrlChange(function(a,b){y(na(N,a))?g.location.href=a:(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,f;a=hb(a);l.$$parse(a);l.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(w=!1,k(c,e)))}),d.$$phase||d.$digest())});d.$watch(function(){var a=hb(c.url()),b=hb(l.absUrl()),f=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&e.history&&f!==l.$$state;if(w|| |
|||
m)w=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,f).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=f):(m&&h(b,g,f===l.$$state?null:l.$$state),k(a,f)))});l.$$replace=!1});return l}]}function rf(){var a=!0,b=this;this.debugEnabled=function(b){return x(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&& |
|||
(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||C;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];q(arguments,function(b){a.push(c(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Ta(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"=== |
|||
a||"__proto__"===a)throw ca("isecfld",b);return a}function fg(a){return a+""}function sa(a,b){if(a){if(a.constructor===a)throw ca("isecfn",b);if(a.window===a)throw ca("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw ca("isecdom",b);if(a===Object)throw ca("isecobj",b);}return a}function md(a,b){if(a){if(a.constructor===a)throw ca("isecfn",b);if(a===gg||a===hg||a===ig)throw ca("isecff",b);}}function Gb(a,b){if(a&&(a===(0).constructor||a===(!1).constructor||a==="".constructor|| |
|||
a==={}.constructor||a===[].constructor||a===Function.constructor))throw ca("isecaf",b);}function jg(a,b){return"undefined"!==typeof a?a:b}function nd(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function aa(a,b){var d,c;switch(a.type){case s.Program:d=!0;q(a.body,function(a){aa(a.expression,b);d=d&&a.expression.constant});a.constant=d;break;case s.Literal:a.constant=!0;a.toWatch=[];break;case s.UnaryExpression:aa(a.argument,b);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch; |
|||
break;case s.BinaryExpression:aa(a.left,b);aa(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case s.LogicalExpression:aa(a.left,b);aa(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case s.ConditionalExpression:aa(a.test,b);aa(a.alternate,b);aa(a.consequent,b);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case s.Identifier:a.constant= |
|||
!1;a.toWatch=[a];break;case s.MemberExpression:aa(a.object,b);a.computed&&aa(a.property,b);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=[a];break;case s.CallExpression:d=a.filter?!b(a.callee.name).$stateful:!1;c=[];q(a.arguments,function(a){aa(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=a.filter&&!b(a.callee.name).$stateful?c:[a];break;case s.AssignmentExpression:aa(a.left,b);aa(a.right,b);a.constant=a.left.constant&&a.right.constant; |
|||
a.toWatch=[a];break;case s.ArrayExpression:d=!0;c=[];q(a.elements,function(a){aa(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=c;break;case s.ObjectExpression:d=!0;c=[];q(a.properties,function(a){aa(a.value,b);d=d&&a.value.constant;a.value.constant||c.push.apply(c,a.value.toWatch)});a.constant=d;a.toWatch=c;break;case s.ThisExpression:a.constant=!1;a.toWatch=[];break;case s.LocalsExpression:a.constant=!1,a.toWatch=[]}}function od(a){if(1==a.length){a=a[0].expression; |
|||
var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function pd(a){return a.type===s.Identifier||a.type===s.MemberExpression}function qd(a){if(1===a.body.length&&pd(a.body[0].expression))return{type:s.AssignmentExpression,left:a.body[0].expression,right:{type:s.NGValueParameter},operator:"="}}function rd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===s.Literal||a.body[0].expression.type===s.ArrayExpression||a.body[0].expression.type===s.ObjectExpression)}function sd(a, |
|||
b){this.astBuilder=a;this.$filter=b}function td(a,b){this.astBuilder=a;this.$filter=b}function Hb(a){return"constructor"==a}function fc(a){return E(a.valueOf)?a.valueOf():kg.call(a)}function sf(){var a=T(),b=T(),d={"true":!0,"false":!1,"null":null,undefined:void 0},c,e;this.addLiteral=function(a,b){d[a]=b};this.setIdentifierFns=function(a,b){c=a;e=b;return this};this.$get=["$filter",function(f){function g(c,d,e){var g,k,D;e=e||H;switch(typeof c){case "string":D=c=c.trim();var q=e?b:a;g=q[D];if(!g){":"=== |
|||
c.charAt(0)&&":"===c.charAt(1)&&(k=!0,c=c.substring(2));g=e?p:w;var S=new gc(g);g=(new hc(S,f,g)).parse(c);g.constant?g.$$watchDelegate=r:k?g.$$watchDelegate=g.literal?m:n:g.inputs&&(g.$$watchDelegate=l);e&&(g=h(g));q[D]=g}return N(g,d);case "function":return N(c,d);default:return N(C,d)}}function h(a){function b(c,d,e,f){var g=H;H=!0;try{return a(c,d,e,f)}finally{H=g}}if(!a)return a;b.$$watchDelegate=a.$$watchDelegate;b.assign=h(a.assign);b.constant=a.constant;b.literal=a.literal;for(var c=0;a.inputs&& |
|||
c<a.inputs.length;++c)a.inputs[c]=h(a.inputs[c]);b.inputs=a.inputs;return b}function k(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=fc(a),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function l(a,b,c,d,e){var f=d.inputs,g;if(1===f.length){var h=k,f=f[0];return a.$watch(function(a){var b=f(a);k(b,h)||(g=d(a,void 0,void 0,[b]),h=b&&fc(b));return g},b,c,e)}for(var l=[],m=[],n=0,r=f.length;n<r;n++)l[n]=k,m[n]=null;return a.$watch(function(a){for(var b=!1,c=0,e=f.length;c<e;c++){var h=f[c](a); |
|||
if(b||(b=!k(h,l[c])))m[c]=h,l[c]=h&&fc(h)}b&&(g=d(a,void 0,void 0,m));return g},b,c,e)}function n(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;E(b)&&b.apply(this,arguments);x(a)&&d.$$postDigest(function(){x(f)&&e()})},c)}function m(a,b,c,d){function e(a){var b=!0;q(a,function(a){x(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,c,d){g=a;E(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function r(a,b,c,d){var e; |
|||
return e=a.$watch(function(a){e();return d(a)},b,c)}function N(a,b){if(!b)return a;var c=a.$$watchDelegate,d=!1,c=c!==m&&c!==n?function(c,e,f,g){f=d&&g?g[0]:a(c,e,f,g);return b(f,c,e)}:function(c,d,e,f){e=a(c,d,e,f);c=b(e,c,d);return x(e)?c:e};a.$$watchDelegate&&a.$$watchDelegate!==l?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=l,d=!a.inputs,c.inputs=a.inputs?a.inputs:[a]);return c}var M=Ea().noUnsafeEval,w={csp:M,expensiveChecks:!1,literals:qa(d),isIdentifierStart:E(c)&&c, |
|||
isIdentifierContinue:E(e)&&e},p={csp:M,expensiveChecks:!0,literals:qa(d),isIdentifierStart:E(c)&&c,isIdentifierContinue:E(e)&&e},H=!1;g.$$runningExpensiveChecks=function(){return H};return g}]}function uf(){this.$get=["$rootScope","$exceptionHandler",function(a,b){return ud(function(b){a.$evalAsync(b)},b)}]}function vf(){this.$get=["$browser","$exceptionHandler",function(a,b){return ud(function(b){a.defer(b)},b)}]}function ud(a,b){function d(){this.$$state={status:0}}function c(a,b){return function(c){b.call(a, |
|||
c)}}function e(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,a(function(){var a,d,e;e=c.pending;c.processScheduled=!1;c.pending=void 0;for(var f=0,g=e.length;f<g;++f){d=e[f][0];a=e[f][c.status];try{E(a)?d.resolve(a(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),b(h)}}}))}function f(){this.promise=new d}var g=O("$q",TypeError);R(d.prototype,{then:function(a,b,c){if(y(a)&&y(b)&&y(c))return this;var d=new f;this.$$state.pending=this.$$state.pending||[];this.$$state.pending.push([d, |
|||
a,b,c]);0<this.$$state.status&&e(this.$$state);return d.promise},"catch":function(a){return this.then(null,a)},"finally":function(a,b){return this.then(function(b){return k(b,!0,a)},function(b){return k(b,!1,a)},b)}});R(f.prototype,{resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(g("qcycle",a)):this.$$resolve(a))},$$resolve:function(a){function d(a){k||(k=!0,h.$$resolve(a))}function f(a){k||(k=!0,h.$$reject(a))}var g,h=this,k=!1;try{if(G(a)||E(a))g=a&&a.then;E(g)? |
|||
(this.promise.$$state.status=-1,g.call(a,d,f,c(this,this.notify))):(this.promise.$$state.value=a,this.promise.$$state.status=1,e(this.promise.$$state))}catch(l){f(l),b(l)}},reject:function(a){this.promise.$$state.status||this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a;this.promise.$$state.status=2;e(this.promise.$$state)},notify:function(c){var d=this.promise.$$state.pending;0>=this.promise.$$state.status&&d&&d.length&&a(function(){for(var a,e,f=0,g=d.length;f<g;f++){e=d[f][0]; |
|||
a=d[f][3];try{e.notify(E(a)?a(c):c)}catch(h){b(h)}}})}});var h=function(a,b){var c=new f;b?c.resolve(a):c.reject(a);return c.promise},k=function(a,b,c){var d=null;try{E(c)&&(d=c())}catch(e){return h(e,!1)}return d&&E(d.then)?d.then(function(){return h(a,b)},function(a){return h(a,!1)}):h(a,b)},l=function(a,b,c,d){var e=new f;e.resolve(a);return e.promise.then(b,c,d)},n=function(a){if(!E(a))throw g("norslvr",a);var b=new f;a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise};n.prototype= |
|||
d.prototype;n.defer=function(){var a=new f;a.resolve=c(a,a.resolve);a.reject=c(a,a.reject);a.notify=c(a,a.notify);return a};n.reject=function(a){var b=new f;b.reject(a);return b.promise};n.when=l;n.resolve=l;n.all=function(a){var b=new f,c=0,d=K(a)?[]:{};q(a,function(a,e){c++;l(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise};return n}function Ef(){this.$get=["$window","$timeout",function(a, |
|||
b){var d=a.requestAnimationFrame||a.webkitRequestAnimationFrame,c=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.webkitCancelRequestAnimationFrame,e=!!d,f=e?function(a){var b=d(a);return function(){c(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};f.supported=e;return f}]}function tf(){function a(a){function b(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$id=++nb;this.$$ChildScope= |
|||
null}b.prototype=a;return b}var b=10,d=O("$rootScope"),c=null,e=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$exceptionHandler","$parse","$browser",function(f,g,h){function k(a){a.currentScope.$$destroyed=!0}function l(a){9===Ca&&(a.$$childHead&&l(a.$$childHead),a.$$nextSibling&&l(a.$$nextSibling));a.$parent=a.$$nextSibling=a.$$prevSibling=a.$$childHead=a.$$childTail=a.$root=a.$$watchers=null}function n(){this.$id=++nb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling= |
|||
this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=!1;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$$isolateBindings=null}function m(a){if(H.$$phase)throw d("inprog",H.$$phase);H.$$phase=a}function r(a,b){do a.$$watchersCount+=b;while(a=a.$parent)}function N(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function s(){}function w(){for(;u.length;)try{u.shift()()}catch(a){f(a)}e= |
|||
null}function p(){null===e&&(e=h.defer(function(){H.$apply(w)}))}n.prototype={constructor:n,$new:function(b,c){var d;c=c||this;b?(d=new n,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=a(this)),d=new this.$$ChildScope);d.$parent=c;d.$$prevSibling=c.$$childTail;c.$$childHead?(c.$$childTail.$$nextSibling=d,c.$$childTail=d):c.$$childHead=c.$$childTail=d;(b||c!=this)&&d.$on("$destroy",k);return d},$watch:function(a,b,d,e){var f=g(a);if(f.$$watchDelegate)return f.$$watchDelegate(this,b,d,f, |
|||
a);var h=this,k=h.$$watchers,l={fn:b,last:s,get:f,exp:e||a,eq:!!d};c=null;E(b)||(l.fn=C);k||(k=h.$$watchers=[]);k.unshift(l);r(this,1);return function(){0<=Za(k,l)&&r(h,-1);c=null}},$watchGroup:function(a,b){function c(){h=!1;k?(k=!1,b(e,e,g)):b(e,d,g)}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,k=!0;if(!a.length){var l=!0;g.$evalAsync(function(){l&&b(e,e,g)});return function(){l=!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});q(a,function(a, |
|||
b){var k=g.$watch(a,function(a,f){e[b]=a;d[b]=f;h||(h=!0,g.$evalAsync(c))});f.push(k)});return function(){for(;f.length;)f.shift()()}},$watchCollection:function(a,b){function c(a){e=a;var b,d,g,h;if(!y(e)){if(G(e))if(ya(e))for(f!==m&&(f=m,t=f.length=0,l++),a=e.length,t!==a&&(l++,f.length=t=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h===g||(l++,f[b]=g);else{f!==r&&(f=r={},t=0,l++);a=0;for(b in e)ua.call(e,b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(t++,f[b]=g,l++));if(t> |
|||
a)for(b in l++,f)ua.call(e,b)||(t--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1<b.length,l=0,n=g(a,c),m=[],r={},p=!0,t=0;return this.$watch(n,function(){p?(p=!1,b(e,e,d)):b(e,h,d);if(k)if(G(e))if(ya(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)ua.call(e,a)&&(h[a]=e[a]);else h=e})},$digest:function(){var a,g,k,l,n,r,p,q,N=b,u,x=[],y,v;m("$digest");h.$$checkUrlChange();this===H&&null!==e&&(h.defer.cancel(e),w());c=null;do{q=!1; |
|||
for(u=this;t.length;){try{v=t.shift(),v.scope.$eval(v.expression,v.locals)}catch(C){f(C)}c=null}a:do{if(r=u.$$watchers)for(p=r.length;p--;)try{if(a=r[p])if(n=a.get,(g=n(u))!==(k=a.last)&&!(a.eq?pa(g,k):"number"===typeof g&&"number"===typeof k&&isNaN(g)&&isNaN(k)))q=!0,c=a,a.last=a.eq?qa(g,null):g,l=a.fn,l(g,k===s?g:k,u),5>N&&(y=4-N,x[y]||(x[y]=[]),x[y].push({msg:E(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,newVal:g,oldVal:k}));else if(a===c){q=!1;break a}}catch(F){f(F)}if(!(r=u.$$watchersCount&& |
|||
u.$$childHead||u!==this&&u.$$nextSibling))for(;u!==this&&!(r=u.$$nextSibling);)u=u.$parent}while(u=r);if((q||t.length)&&!N--)throw H.$$phase=null,d("infdig",b,x);}while(q||t.length);for(H.$$phase=null;z.length;)try{z.shift()()}catch(B){f(B)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this===H&&h.$$applicationDestroyed();r(this,-this.$$watchersCount);for(var b in this.$$listenerCount)N(this,this.$$listenerCount[b],b);a&&a.$$childHead== |
|||
this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=C;this.$on=this.$watch=this.$watchGroup=function(){return C};this.$$listeners={};this.$$nextSibling=null;l(this)}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){H.$$phase|| |
|||
t.length||h.defer(function(){t.length&&H.$digest()});t.push({scope:this,expression:g(a),locals:b})},$$postDigest:function(a){z.push(a)},$apply:function(a){try{m("$apply");try{return this.$eval(a)}finally{H.$$phase=null}}catch(b){f(b)}finally{try{H.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&u.push(b);a=g(a);p()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]= |
|||
0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,N(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=$a([h],arguments,1),l,n;do{d=e.$$listeners[a]||c;h.currentScope=e;l=0;for(n=d.length;l<n;l++)if(d[l])try{d[l].apply(null,k)}catch(m){f(m)}else d.splice(l,1),l--,n--;if(g)return h.currentScope=null,h;e=e.$parent}while(e); |
|||
h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return e;for(var g=$a([e],arguments,1),h,k;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,g)}catch(l){f(l)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope= |
|||
null;return e}};var H=new n,t=H.$$asyncQueue=[],z=H.$$postDigestQueue=[],u=H.$$applyAsyncQueue=[];return H}]}function me(){var a=/^\s*(https?|ftp|mailto|tel|file):/,b=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(b){return x(b)?(a=b,this):a};this.imgSrcSanitizationWhitelist=function(a){return x(a)?(b=a,this):b};this.$get=function(){return function(d,c){var e=c?b:a,f;f=ra(d).href;return""===f||f.match(e)?d:"unsafe:"+f}}}function lg(a){if("self"===a)return a; |
|||
if(F(a)){if(-1<a.indexOf("***"))throw ta("iwcard",a);a=vd(a).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*");return new RegExp("^"+a+"$")}if(Wa(a))return new RegExp("^"+a.source+"$");throw ta("imatcher");}function wd(a){var b=[];x(a)&&q(a,function(a){b.push(lg(a))});return b}function xf(){this.SCE_CONTEXTS=oa;var a=["self"],b=[];this.resourceUrlWhitelist=function(b){arguments.length&&(a=wd(b));return a};this.resourceUrlBlacklist=function(a){arguments.length&&(b=wd(a));return b};this.$get=["$injector", |
|||
function(d){function c(a,b){return"self"===a?hd(b):!!a.exec(b.href)}function e(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var f=function(a){throw ta("unsafe");};d.has("$sanitize")&&(f=d.get("$sanitize"));var g=e(),h={};h[oa.HTML]=e(g);h[oa.CSS]=e(g);h[oa.URL]=e(g);h[oa.JS]=e(g);h[oa.RESOURCE_URL]= |
|||
e(h[oa.URL]);return{trustAs:function(a,b){var c=h.hasOwnProperty(a)?h[a]:null;if(!c)throw ta("icontext",a,b);if(null===b||y(b)||""===b)return b;if("string"!==typeof b)throw ta("itype",a);return new c(b)},getTrusted:function(d,e){if(null===e||y(e)||""===e)return e;var g=h.hasOwnProperty(d)?h[d]:null;if(g&&e instanceof g)return e.$$unwrapTrustedValue();if(d===oa.RESOURCE_URL){var g=ra(e.toString()),m,r,q=!1;m=0;for(r=a.length;m<r;m++)if(c(a[m],g)){q=!0;break}if(q)for(m=0,r=b.length;m<r;m++)if(c(b[m], |
|||
g)){q=!1;break}if(q)return e;throw ta("insecurl",e.toString());}if(d===oa.HTML)return f(e);throw ta("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function wf(){var a=!0;this.enabled=function(b){arguments.length&&(a=!!b);return a};this.$get=["$parse","$sceDelegate",function(b,d){if(a&&8>Ca)throw ta("iequirks");var c=ha(oa);c.isEnabled=function(){return a};c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b}, |
|||
c.valueOf=Xa);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;q(oa,function(a,b){var d=P(b);c[cb("parse_as_"+d)]=function(b){return e(a,b)};c[cb("get_trusted_"+d)]=function(b){return f(a,b)};c[cb("trust_as_"+d)]=function(b){return g(a,b)}});return c}]}function yf(){this.$get=["$window","$document",function(a,b){var d={},c=!(a.chrome&&a.chrome.app&&a.chrome.app.runtime)&&a.history&&a.history.pushState, |
|||
e=X((/android (\d+)/.exec(P((a.navigator||{}).userAgent))||[])[1]),f=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},h,k=/^(Moz|webkit|ms)(?=[A-Z])/,l=g.body&&g.body.style,n=!1,m=!1;if(l){for(var r in l)if(n=k.exec(r)){h=n[0];h=h.substr(0,1).toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in l&&"webkit");n=!!("transition"in l||h+"Transition"in l);m=!!("animation"in l||h+"Animation"in l);!e||n&&m||(n=F(l.webkitTransition),m=F(l.webkitAnimation))}return{history:!(!c||4>e||f),hasEvent:function(a){if("input"=== |
|||
a&&11>=Ca)return!1;if(y(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ea(),vendorPrefix:h,transitions:n,animations:m,android:e}}]}function Af(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$templateCache","$http","$q","$sce",function(b,d,c,e){function f(g,h){f.totalPendingRequests++;F(g)&&b.get(g)||(g=e.getTrustedResourceUrl(g));var k=d.defaults&&d.defaults.transformResponse;K(k)?k=k.filter(function(a){return a!==ac}):k===ac&&(k=null);return d.get(g, |
|||
R({cache:b,transformResponse:k},a))["finally"](function(){f.totalPendingRequests--}).then(function(a){b.put(g,a.data);return a.data},function(a){if(!h)throw mg("tpload",g,a.status,a.statusText);return c.reject(a)})}f.totalPendingRequests=0;return f}]}function Bf(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];q(a,function(a){var c=ea.element(a).data("$binding");c&&q(c,function(c){d?(new RegExp("(^|\\s)"+ |
|||
vd(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!=c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-","data-ng-","ng\\:"],h=0;h<g.length;++h){var k=a.querySelectorAll("["+g[h]+"model"+(d?"=":"*=")+'"'+b+'"]');if(k.length)return k}},getLocation:function(){return d.url()},setLocation:function(b){b!==d.url()&&(d.url(b),a.$digest())},whenStable:function(a){b.notifyWhenNoOutstandingRequests(a)}}}]}function Cf(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler", |
|||
function(a,b,d,c,e){function f(f,k,l){E(f)||(l=k,k=f,f=C);var n=za.call(arguments,3),m=x(l)&&!l,r=(m?c:d).defer(),q=r.promise,s;s=b.defer(function(){try{r.resolve(f.apply(null,n))}catch(b){r.reject(b),e(b)}finally{delete g[q.$$timeoutId]}m||a.$apply()},k);q.$$timeoutId=s;g[s]=r;return q}var g={};f.cancel=function(a){return a&&a.$$timeoutId in g?(g[a.$$timeoutId].reject("canceled"),delete g[a.$$timeoutId],b.defer.cancel(a.$$timeoutId)):!1};return f}]}function ra(a){Ca&&(Y.setAttribute("href",a),a= |
|||
Y.href);Y.setAttribute("href",a);return{href:Y.href,protocol:Y.protocol?Y.protocol.replace(/:$/,""):"",host:Y.host,search:Y.search?Y.search.replace(/^\?/,""):"",hash:Y.hash?Y.hash.replace(/^#/,""):"",hostname:Y.hostname,port:Y.port,pathname:"/"===Y.pathname.charAt(0)?Y.pathname:"/"+Y.pathname}}function hd(a){a=F(a)?ra(a):a;return a.protocol===xd.protocol&&a.host===xd.host}function Df(){this.$get=da(v)}function yd(a){function b(a){try{return decodeURIComponent(a)}catch(b){return a}}var d=a[0]||{}, |
|||
c={},e="";return function(){var a,g,h,k,l;a=d.cookie||"";if(a!==e)for(e=a,a=e.split("; "),c={},h=0;h<a.length;h++)g=a[h],k=g.indexOf("="),0<k&&(l=b(g.substring(0,k)),y(c[l])&&(c[l]=b(g.substring(k+1))));return c}}function Hf(){this.$get=yd}function Jc(a){function b(d,c){if(G(d)){var e={};q(d,function(a,c){e[c]=b(c,a)});return e}return a.factory(d+"Filter",c)}this.register=b;this.$get=["$injector",function(a){return function(b){return a.get(b+"Filter")}}];b("currency",zd);b("date",Ad);b("filter",ng); |
|||
b("json",og);b("limitTo",pg);b("lowercase",qg);b("number",Bd);b("orderBy",Cd);b("uppercase",rg)}function ng(){return function(a,b,d){if(!ya(a)){if(null==a)return a;throw O("filter")("notarray",a);}var c;switch(ic(b)){case "function":break;case "boolean":case "null":case "number":case "string":c=!0;case "object":b=sg(b,d,c);break;default:return a}return Array.prototype.filter.call(a,b)}}function sg(a,b,d){var c=G(a)&&"$"in a;!0===b?b=pa:E(b)||(b=function(a,b){if(y(a))return!1;if(null===a||null===b)return a=== |
|||
b;if(G(b)||G(a)&&!rc(a))return!1;a=P(""+a);b=P(""+b);return-1!==a.indexOf(b)});return function(e){return c&&!G(e)?Ka(e,a.$,b,!1):Ka(e,a,b,d)}}function Ka(a,b,d,c,e){var f=ic(a),g=ic(b);if("string"===g&&"!"===b.charAt(0))return!Ka(a,b.substring(1),d,c);if(K(a))return a.some(function(a){return Ka(a,b,d,c)});switch(f){case "object":var h;if(c){for(h in a)if("$"!==h.charAt(0)&&Ka(a[h],b,d,!0))return!0;return e?!1:Ka(a,b,d,!1)}if("object"===g){for(h in b)if(e=b[h],!E(e)&&!y(e)&&(f="$"===h,!Ka(f?a:a[h], |
|||
e,d,f,f)))return!1;return!0}return d(a,b);case "function":return!1;default:return d(a,b)}}function ic(a){return null===a?"null":typeof a}function zd(a){var b=a.NUMBER_FORMATS;return function(a,c,e){y(c)&&(c=b.CURRENCY_SYM);y(e)&&(e=b.PATTERNS[1].maxFrac);return null==a?a:Dd(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,e).replace(/\u00A4/g,c)}}function Bd(a){var b=a.NUMBER_FORMATS;return function(a,c){return null==a?a:Dd(a,b.PATTERNS[0],b.GROUP_SEP,b.DECIMAL_SEP,c)}}function tg(a){var b=0,d,c,e,f,g;-1< |
|||
(c=a.indexOf(Ed))&&(a=a.replace(Ed,""));0<(e=a.search(/e/i))?(0>c&&(c=e),c+=+a.slice(e+1),a=a.substring(0,e)):0>c&&(c=a.length);for(e=0;a.charAt(e)==jc;e++);if(e==(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)==jc;)g--;c-=e;d=[];for(f=0;e<=g;e++,f++)d[f]=+a.charAt(e)}c>Fd&&(d=d.splice(0,Fd-1),b=c-1,c=1);return{d:d,e:b,i:c}}function ug(a,b,d,c){var e=a.d,f=e.length-a.i;b=y(b)?Math.min(Math.max(d,f),c):+b;d=b+a.i;c=e[d];if(0<d){e.splice(Math.max(a.i,d));for(var g=d;g<e.length;g++)e[g]=0}else for(f= |
|||
Math.max(0,f),a.i=1,e.length=Math.max(1,d=b+1),e[0]=0,g=1;g<d;g++)e[g]=0;if(5<=c)if(0>d-1){for(c=0;c>d;c--)e.unshift(0),a.i++;e.unshift(1);a.i++}else e[d-1]++;for(;f<Math.max(0,b);f++)e.push(0);if(b=e.reduceRight(function(a,b,c,d){b+=a;d[c]=b%10;return Math.floor(b/10)},0))e.unshift(b),a.i++}function Dd(a,b,d,c,e){if(!F(a)&&!Q(a)||isNaN(a))return"";var f=!isFinite(a),g=!1,h=Math.abs(a)+"",k="";if(f)k="\u221e";else{g=tg(h);ug(g,e,b.minFrac,b.maxFrac);k=g.d;h=g.i;e=g.e;f=[];for(g=k.reduce(function(a, |
|||
b){return a&&!b},!0);0>h;)k.unshift(0),h++;0<h?f=k.splice(h):(f=k,k=[0]);h=[];for(k.length>=b.lgSize&&h.unshift(k.splice(-b.lgSize).join(""));k.length>b.gSize;)h.unshift(k.splice(-b.gSize).join(""));k.length&&h.unshift(k.join(""));k=h.join(d);f.length&&(k+=c+f.join(""));e&&(k+="e+"+e)}return 0>a&&!g?b.negPre+k+b.negSuf:b.posPre+k+b.posSuf}function Ib(a,b,d,c){var e="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,e="-");for(a=""+a;a.length<b;)a=jc+a;d&&(a=a.substr(a.length-b));return e+a}function W(a,b,d,c,e){d= |
|||
d||0;return function(f){f=f["get"+a]();if(0<d||f>-d)f+=d;0===f&&-12==d&&(f=12);return Ib(f,b,c,e)}}function ib(a,b,d){return function(c,e){var f=c["get"+a](),g=sb((d?"STANDALONE":"")+(b?"SHORT":"")+a);return e[g][f]}}function Gd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Hd(a){return function(b){var d=Gd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Ib(b,a)}}function kc(a,b){return 0>=a.getFullYear()? |
|||
b.ERAS[0]:b.ERAS[1]}function Ad(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=X(b[9]+b[10]),g=X(b[9]+b[11]));h.call(a,X(b[1]),X(b[2])-1,X(b[3]));f=X(b[4]||0)-f;g=X(b[5]||0)-g;h=X(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));k.call(a,f,g,h,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d,f){var g="",h= |
|||
[],k,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;F(c)&&(c=vg.test(c)?X(c):b(c));Q(c)&&(c=new Date(c));if(!fa(c)||!isFinite(c.getTime()))return c;for(;d;)(l=wg.exec(d))?(h=$a(h,l,1),d=h.pop()):(h.push(d),d=null);var n=c.getTimezoneOffset();f&&(n=vc(f,n),c=Qb(c,f,!0));q(h,function(b){k=xg[b];g+=k?k(c,a.DATETIME_FORMATS,n):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function og(){return function(a,b){y(b)&&(b=2);return ab(a,b)}}function pg(){return function(a,b,d){b=Infinity=== |
|||
Math.abs(Number(b))?Number(b):X(b);if(isNaN(b))return a;Q(a)&&(a=a.toString());if(!K(a)&&!F(a))return a;d=!d||isNaN(d)?0:X(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?a.slice(d,d+b):0===d?a.slice(b,a.length):a.slice(Math.max(0,d+b),d)}}function Cd(a){function b(b,d){d=d?-1:1;return b.map(function(b){var c=1,h=Xa;if(E(b))h=b;else if(F(b)){if("+"==b.charAt(0)||"-"==b.charAt(0))c="-"==b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(h=a(b),h.constant))var k=h(),h=function(a){return a[k]}}return{get:h, |
|||
descending:c*d}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}return function(a,e,f){if(null==a)return a;if(!ya(a))throw O("orderBy")("notarray",a);K(e)||(e=[e]);0===e.length&&(e=["+"]);var g=b(e,f);g.push({get:function(){return{}},descending:f?-1:1});a=Array.prototype.map.call(a,function(a,b){return{value:a,predicateValues:g.map(function(c){var e=c.get(a);c=typeof e;if(null===e)c="string",e="null";else if("string"===c)e=e.toLowerCase();else if("object"=== |
|||
c)a:{if("function"===typeof e.valueOf&&(e=e.valueOf(),d(e)))break a;if(rc(e)&&(e=e.toString(),d(e)))break a;e=b}return{value:e,type:c}})}});a.sort(function(a,b){for(var c=0,d=0,e=g.length;d<e;++d){var c=a.predicateValues[d],f=b.predicateValues[d],q=0;c.type===f.type?c.value!==f.value&&(q=c.value<f.value?-1:1):q=c.type<f.type?-1:1;if(c=q*g[d].descending)break}return c});return a=a.map(function(a){return a.value})}}function La(a){E(a)&&(a={link:a});a.restrict=a.restrict||"AC";return da(a)}function Id(a, |
|||
b,d,c,e){var f=this,g=[];f.$error={};f.$$success={};f.$pending=void 0;f.$name=e(b.name||b.ngForm||"")(d);f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;f.$submitted=!1;f.$$parentForm=Jb;f.$rollbackViewValue=function(){q(g,function(a){a.$rollbackViewValue()})};f.$commitViewValue=function(){q(g,function(a){a.$commitViewValue()})};f.$addControl=function(a){Qa(a.$name,"input");g.push(a);a.$name&&(f[a.$name]=a);a.$$parentForm=f};f.$$renameControl=function(a,b){var c=a.$name;f[c]===a&&delete f[c]; |
|||
f[b]=a;a.$name=b};f.$removeControl=function(a){a.$name&&f[a.$name]===a&&delete f[a.$name];q(f.$pending,function(b,c){f.$setValidity(c,null,a)});q(f.$error,function(b,c){f.$setValidity(c,null,a)});q(f.$$success,function(b,c){f.$setValidity(c,null,a)});Za(g,a);a.$$parentForm=Jb};Jd({ctrl:this,$element:a,set:function(a,b,c){var d=a[b];d?-1===d.indexOf(c)&&d.push(c):a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(Za(d,c),0===d.length&&delete a[b])},$animate:c});f.$setDirty=function(){c.removeClass(a,Ua); |
|||
c.addClass(a,Kb);f.$dirty=!0;f.$pristine=!1;f.$$parentForm.$setDirty()};f.$setPristine=function(){c.setClass(a,Ua,Kb+" ng-submitted");f.$dirty=!1;f.$pristine=!0;f.$submitted=!1;q(g,function(a){a.$setPristine()})};f.$setUntouched=function(){q(g,function(a){a.$setUntouched()})};f.$setSubmitted=function(){c.addClass(a,"ng-submitted");f.$submitted=!0;f.$$parentForm.$setSubmitted()}}function lc(a){a.$formatters.push(function(b){return a.$isEmpty(b)?b:b.toString()})}function jb(a,b,d,c,e,f){var g=P(b[0].type); |
|||
if(!e.android){var h=!1;b.on("compositionstart",function(){h=!0});b.on("compositionend",function(){h=!1;l()})}var k,l=function(a){k&&(f.defer.cancel(k),k=null);if(!h){var e=b.val();a=a&&a.type;"password"===g||d.ngTrim&&"false"===d.ngTrim||(e=V(e));(c.$viewValue!==e||""===e&&c.$$hasNativeValidators)&&c.$setViewValue(e,a)}};if(e.hasEvent("input"))b.on("input",l);else{var n=function(a,b,c){k||(k=f.defer(function(){k=null;b&&b.value===c||l(a)}))};b.on("keydown",function(a){var b=a.keyCode;91===b||15< |
|||
b&&19>b||37<=b&&40>=b||n(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut",n)}b.on("change",l);if(Kd[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!k){var b=this.validity,c=b.badInput,d=b.typeMismatch;k=f.defer(function(){k=null;b.badInput===c&&b.typeMismatch===d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Lb(a,b){return function(d,c){var e,f;if(fa(d))return d;if(F(d)){'"'==d.charAt(0)&& |
|||
'"'==d.charAt(d.length-1)&&(d=d.substring(1,d.length-1));if(yg.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},q(e,function(a,c){c<b.length&&(f[b[c]]=+a)}),new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0,1E3*f.sss||0)}return NaN}}function kb(a,b,d,c){return function(e,f,g,h,k,l,n){function m(a){return a&& |
|||
!(a.getTime&&a.getTime()!==a.getTime())}function r(a){return x(a)&&!fa(a)?d(a)||void 0:a}Ld(e,f,g,h);jb(e,f,g,h,k,l);var q=h&&h.$options&&h.$options.timezone,s;h.$$parserName=a;h.$parsers.push(function(a){if(h.$isEmpty(a))return null;if(b.test(a))return a=d(a,s),q&&(a=Qb(a,q)),a});h.$formatters.push(function(a){if(a&&!fa(a))throw lb("datefmt",a);if(m(a))return(s=a)&&q&&(s=Qb(s,q,!0)),n("date")(a,c,q);s=null;return""});if(x(g.min)||g.ngMin){var w;h.$validators.min=function(a){return!m(a)||y(w)||d(a)>= |
|||
w};g.$observe("min",function(a){w=r(a);h.$validate()})}if(x(g.max)||g.ngMax){var p;h.$validators.max=function(a){return!m(a)||y(p)||d(a)<=p};g.$observe("max",function(a){p=r(a);h.$validate()})}}}function Ld(a,b,d,c){(c.$$hasNativeValidators=G(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{};return c.badInput||c.typeMismatch?void 0:a})}function Md(a,b,d,c,e){if(x(c)){a=a(c);if(!a.constant)throw lb("constexpr",d,c);return a(b)}return e}function mc(a,b){a="ngClass"+a;return["$animate", |
|||
function(d){function c(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],n=0;n<b.length;n++)if(e==b[n])continue a;c.push(e)}return c}function e(a){var b=[];return K(a)?(q(a,function(a){b=b.concat(e(a))}),b):F(a)?a.split(" "):G(a)?(q(a,function(a,c){a&&(b=b.concat(c.split(" ")))}),b):a}return{restrict:"AC",link:function(f,g,h){function k(a){a=l(a,1);h.$addClass(a)}function l(a,b){var c=g.data("$classCounts")||T(),d=[];q(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data("$classCounts", |
|||
c);return d.join(" ")}function n(a,b){var e=c(b,a),f=c(a,b),e=l(e,1),f=l(f,-1);e&&e.length&&d.addClass(g,e);f&&f.length&&d.removeClass(g,f)}function m(a){if(!0===b||f.$index%2===b){var c=e(a||[]);if(!r)k(c);else if(!pa(a,r)){var d=e(r);n(d,c)}}r=K(a)?a.map(function(a){return ha(a)}):ha(a)}var r;f.$watch(h[a],m,!0);h.$observe("class",function(b){m(f.$eval(h[a]))});"ngClass"!==a&&f.$watch("$index",function(c,d){var g=c&1;if(g!==(d&1)){var m=e(f.$eval(h[a]));g===b?k(m):(g=l(m,-1),h.$removeClass(g))}})}}}]} |
|||
function Jd(a){function b(a,b){b&&!f[a]?(k.addClass(e,a),f[a]=!0):!b&&f[a]&&(k.removeClass(e,a),f[a]=!1)}function d(a,c){a=a?"-"+zc(a,"-"):"";b(mb+a,!0===c);b(Nd+a,!1===c)}var c=a.ctrl,e=a.$element,f={},g=a.set,h=a.unset,k=a.$animate;f[Nd]=!(f[mb]=e.hasClass(mb));c.$setValidity=function(a,e,f){y(e)?(c.$pending||(c.$pending={}),g(c.$pending,a,f)):(c.$pending&&h(c.$pending,a,f),Od(c.$pending)&&(c.$pending=void 0));Da(e)?e?(h(c.$error,a,f),g(c.$$success,a,f)):(g(c.$error,a,f),h(c.$$success,a,f)):(h(c.$error, |
|||
a,f),h(c.$$success,a,f));c.$pending?(b(Pd,!0),c.$valid=c.$invalid=void 0,d("",null)):(b(Pd,!1),c.$valid=Od(c.$error),c.$invalid=!c.$valid,d("",c.$valid));e=c.$pending&&c.$pending[a]?void 0:c.$error[a]?!1:c.$$success[a]?!0:null;d(a,e);c.$$parentForm.$setValidity(a,e,c)}}function Od(a){if(a)for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}var zg=/^\/(.+)\/([a-z]*)$/,ua=Object.prototype.hasOwnProperty,P=function(a){return F(a)?a.toLowerCase():a},sb=function(a){return F(a)?a.toUpperCase():a},Ca, |
|||
B,Z,za=[].slice,Zf=[].splice,Ag=[].push,ma=Object.prototype.toString,sc=Object.getPrototypeOf,Aa=O("ng"),ea=v.angular||(v.angular={}),Sb,nb=0;Ca=v.document.documentMode;C.$inject=[];Xa.$inject=[];var K=Array.isArray,$d=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\]$/,V=function(a){return F(a)?a.trim():a},vd=function(a){return a.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},Ea=function(){if(!x(Ea.rules)){var a=v.document.querySelector("[ng-csp]")|| |
|||
v.document.querySelector("[data-ng-csp]");if(a){var b=a.getAttribute("ng-csp")||a.getAttribute("data-ng-csp");Ea.rules={noUnsafeEval:!b||-1!==b.indexOf("no-unsafe-eval"),noInlineStyle:!b||-1!==b.indexOf("no-inline-style")}}else{a=Ea;try{new Function(""),b=!1}catch(d){b=!0}a.rules={noUnsafeEval:b,noInlineStyle:!1}}}return Ea.rules},pb=function(){if(x(pb.name_))return pb.name_;var a,b,d=Na.length,c,e;for(b=0;b<d;++b)if(c=Na[b],a=v.document.querySelector("["+c.replace(":","\\:")+"jq]")){e=a.getAttribute(c+ |
|||
"jq");break}return pb.name_=e},ce=/:/g,Na=["ng-","data-ng-","ng:","x-ng-"],he=/[A-Z]/g,Ac=!1,Ma=3,le={full:"1.5.5",major:1,minor:5,dot:5,codeName:"material-conspiration"};U.expando="ng339";var eb=U.cache={},Nf=1;U._data=function(a){return this.cache[a[this.expando]]||{}};var If=/([\:\-\_]+(.))/g,Jf=/^moz([A-Z])/,wb={mouseleave:"mouseout",mouseenter:"mouseover"},Ub=O("jqLite"),Mf=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Tb=/<|&#?\w+;/,Kf=/<([\w:-]+)/,Lf=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, |
|||
ia={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option;ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead;ia.th=ia.td;var Sf=v.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Oa=U.prototype={ready:function(a){function b(){d||(d=!0,a())}var d=!1;"complete"=== |
|||
v.document.readyState?v.setTimeout(b):(this.on("DOMContentLoaded",b),U(v).on("load",b))},toString:function(){var a=[];q(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"},eq:function(a){return 0<=a?B(this[a]):B(this[this.length+a])},length:0,push:Ag,sort:[].sort,splice:[].splice},Cb={};q("multiple selected checked disabled readOnly required open".split(" "),function(a){Cb[P(a)]=a});var Sc={};q("input select option textarea button form details".split(" "),function(a){Sc[a]=!0});var ad={ngMinlength:"minlength", |
|||
ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};q({data:Wb,removeData:db,hasData:function(a){for(var b in eb[a.ng339])return!0;return!1},cleanData:function(a){for(var b=0,d=a.length;b<d;b++)db(a[b])}},function(a,b){U[b]=a});q({data:Wb,inheritedData:Ab,scope:function(a){return B.data(a,"$scope")||Ab(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return B.data(a,"$isolateScope")||B.data(a,"$isolateScopeNoTemplate")},controller:Pc,injector:function(a){return Ab(a, |
|||
"$injector")},removeAttr:function(a,b){a.removeAttribute(b)},hasClass:xb,css:function(a,b,d){b=cb(b);if(x(d))a.style[b]=d;else return a.style[b]},attr:function(a,b,d){var c=a.nodeType;if(c!==Ma&&2!==c&&8!==c)if(c=P(b),Cb[c])if(x(d))d?(a[b]=!0,a.setAttribute(b,c)):(a[b]=!1,a.removeAttribute(c));else return a[b]||(a.attributes.getNamedItem(b)||C).specified?c:void 0;else if(x(d))a.setAttribute(b,d);else if(a.getAttribute)return a=a.getAttribute(b,2),null===a?void 0:a},prop:function(a,b,d){if(x(d))a[b]= |
|||
d;else return a[b]},text:function(){function a(a,d){if(y(d)){var c=a.nodeType;return 1===c||c===Ma?a.textContent:""}a.textContent=d}a.$dv="";return a}(),val:function(a,b){if(y(b)){if(a.multiple&&"select"===va(a)){var d=[];q(a.options,function(a){a.selected&&d.push(a.value||a.text)});return 0===d.length?null:d}return a.value}a.value=b},html:function(a,b){if(y(b))return a.innerHTML;ub(a,!0);a.innerHTML=b},empty:Qc},function(a,b){U.prototype[b]=function(b,c){var e,f,g=this.length;if(a!==Qc&&y(2==a.length&& |
|||
a!==xb&&a!==Pc?b:c)){if(G(b)){for(e=0;e<g;e++)if(a===Wb)a(this[e],b);else for(f in b)a(this[e],f,b[f]);return this}e=a.$dv;g=y(e)?Math.min(g,1):g;for(f=0;f<g;f++){var h=a(this[f],b,c);e=e?e+h:h}return e}for(e=0;e<g;e++)a(this[e],b,c);return this}});q({removeData:db,on:function(a,b,d,c){if(x(c))throw Ub("onargs");if(Kc(a)){c=vb(a,!0);var e=c.events,f=c.handle;f||(f=c.handle=Pf(a,e));c=0<=b.indexOf(" ")?b.split(" "):[b];for(var g=c.length,h=function(b,c,g){var h=e[b];h||(h=e[b]=[],h.specialHandlerWrapper= |
|||
c,"$destroy"===b||g||a.addEventListener(b,f,!1));h.push(d)};g--;)b=c[g],wb[b]?(h(wb[b],Rf),h(b,void 0,!0)):h(b)}},off:Oc,one:function(a,b,d){a=B(a);a.on(b,function e(){a.off(b,d);a.off(b,e)});a.on(b,d)},replaceWith:function(a,b){var d,c=a.parentNode;ub(a);q(new U(b),function(b){d?c.insertBefore(b,d.nextSibling):c.replaceChild(b,a);d=b})},children:function(a){var b=[];q(a.childNodes,function(a){1===a.nodeType&&b.push(a)});return b},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a, |
|||
b){var d=a.nodeType;if(1===d||11===d){b=new U(b);for(var d=0,c=b.length;d<c;d++)a.appendChild(b[d])}},prepend:function(a,b){if(1===a.nodeType){var d=a.firstChild;q(new U(b),function(b){a.insertBefore(b,d)})}},wrap:function(a,b){Mc(a,B(b).eq(0).clone()[0])},remove:Bb,detach:function(a){Bb(a,!0)},after:function(a,b){var d=a,c=a.parentNode;b=new U(b);for(var e=0,f=b.length;e<f;e++){var g=b[e];c.insertBefore(g,d.nextSibling);d=g}},addClass:zb,removeClass:yb,toggleClass:function(a,b,d){b&&q(b.split(" "), |
|||
function(b){var e=d;y(e)&&(e=!xb(a,b));(e?zb:yb)(a,b)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},find:function(a,b){return a.getElementsByTagName?a.getElementsByTagName(b):[]},clone:Vb,triggerHandler:function(a,b,d){var c,e,f=b.type||b,g=vb(a);if(g=(g=g&&g.events)&&g[f])c={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped= |
|||
!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:C,type:f,target:a},b.type&&(c=R(c,b)),b=ha(g),e=d?[c].concat(d):[c],q(b,function(b){c.isImmediatePropagationStopped()||b.apply(a,e)})}},function(a,b){U.prototype[b]=function(b,c,e){for(var f,g=0,h=this.length;g<h;g++)y(f)?(f=a(this[g],b,c,e),x(f)&&(f=B(f))):Nc(f,a(this[g],b,c,e));return x(f)?f:this};U.prototype.bind=U.prototype.on;U.prototype.unbind=U.prototype.off});Ra.prototype={put:function(a, |
|||
b){this[Fa(a,this.nextUid)]=b},get:function(a){return this[Fa(a,this.nextUid)]},remove:function(a){var b=this[a=Fa(a,this.nextUid)];delete this[a];return b}};var Gf=[function(){this.$get=[function(){return Ra}]}],Uf=/^([^\(]+?)=>/,Vf=/^[^\(]*\(\s*([^\)]*)\)/m,Bg=/,/,Cg=/^\s*(_?)(\S+?)\1\s*$/,Tf=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ga=O("$injector");bb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw F(d)&&d||(d=a.name||Wf(a)),Ga("strictdi",d); |
|||
b=Tc(a);q(b[1].split(Bg),function(a){a.replace(Cg,function(a,b,d){c.push(d)})})}a.$inject=c}}else K(a)?(b=a.length-1,Pa(a[b],"fn"),c=a.slice(0,b)):Pa(a,"fn",!0);return c};var Qd=O("$animate"),Ze=function(){this.$get=C},$e=function(){var a=new Ra,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function e(a,b,c){var d=!1;b&&(b=F(b)?b.split(" "):K(b)?b:[],q(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){q(b,function(b){var c=a.get(b);if(c){var d=Xf(b.attr("class")),e="",f="";q(c, |
|||
function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});q(b,function(a){e&&zb(a,e);f&&yb(a,f)});a.remove(b)}});b.length=0}return{enabled:C,on:C,off:C,pin:C,push:function(g,h,k,l){l&&l();k=k||{};k.from&&g.css(k.from);k.to&&g.css(k.to);if(k.addClass||k.removeClass)if(h=k.addClass,l=k.removeClass,k=a.get(g)||{},h=e(k,h,!0),l=e(k,l,!1),h||l)a.put(g,k),b.push(g),1===b.length&&c.$$postDigest(f);g=new d;g.complete();return g}}}]},Xe=["$provide",function(a){var b=this;this.$$registeredAnimations= |
|||
Object.create(null);this.register=function(d,c){if(d&&"."!==d.charAt(0))throw Qd("notcsel",d);var e=d+"-animation";b.$$registeredAnimations[d.substr(1)]=e;a.factory(e,c)};this.classNameFilter=function(a){if(1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null)&&/(\s+|\/)ng-animate(\s+|\/)/.test(this.$$classNameFilter.toString()))throw Qd("nongcls","ng-animate");return this.$$classNameFilter};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var h;a:{for(h=0;h<d.length;h++){var k= |
|||
d[h];if(1===k.nodeType){h=k;break a}}h=void 0}!h||h.parentNode||h.previousElementSibling||(d=null)}d?d.after(a):c.prepend(a)}return{on:a.on,off:a.off,pin:a.pin,enabled:a.enabled,cancel:function(a){a.end&&a.end()},enter:function(e,f,g,h){f=f&&B(f);g=g&&B(g);f=f||g.parent();b(e,f,g);return a.push(e,"enter",Ha(h))},move:function(e,f,g,h){f=f&&B(f);g=g&&B(g);f=f||g.parent();b(e,f,g);return a.push(e,"move",Ha(h))},leave:function(b,c){return a.push(b,"leave",Ha(c),function(){b.remove()})},addClass:function(b, |
|||
c,g){g=Ha(g);g.addClass=fb(g.addclass,c);return a.push(b,"addClass",g)},removeClass:function(b,c,g){g=Ha(g);g.removeClass=fb(g.removeClass,c);return a.push(b,"removeClass",g)},setClass:function(b,c,g,h){h=Ha(h);h.addClass=fb(h.addClass,c);h.removeClass=fb(h.removeClass,g);return a.push(b,"setClass",h)},animate:function(b,c,g,h,k){k=Ha(k);k.from=k.from?R(k.from,c):c;k.to=k.to?R(k.to,g):g;k.tempClasses=fb(k.tempClasses,h||"ng-inline-animate");return a.push(b,"animate",k)}}}]}],bf=function(){this.$get= |
|||
["$$rAF",function(a){function b(b){d.push(b);1<d.length||a(function(){for(var a=0;a<d.length;a++)d[a]();d=[]})}var d=[];return function(){var a=!1;b(function(){a=!0});return function(d){a?d():b(d)}}}]},af=function(){this.$get=["$q","$sniffer","$$animateAsyncRun","$document","$timeout",function(a,b,d,c,e){function f(a){this.setHost(a);var b=d();this._doneCallbacks=[];this._tick=function(a){var d=c[0];d&&d.hidden?e(a,0,!1):b(a)};this._state=0}f.chain=function(a,b){function c(){if(d===a.length)b(!0); |
|||
else a[d](function(a){!1===a?b(!1):(d++,c())})}var d=0;c()};f.all=function(a,b){function c(f){e=e&&f;++d===a.length&&b(e)}var d=0,e=!0;q(a,function(a){a.done(c)})};f.prototype={setHost:function(a){this.host=a||{}},done:function(a){2===this._state?a():this._doneCallbacks.push(a)},progress:C,getPromise:function(){if(!this.promise){var b=this;this.promise=a(function(a,c){b.done(function(b){!1===b?c():a()})})}return this.promise},then:function(a,b){return this.getPromise().then(a,b)},"catch":function(a){return this.getPromise()["catch"](a)}, |
|||
"finally":function(a){return this.getPromise()["finally"](a)},pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end();this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel();this._resolve(!1)},complete:function(a){var b=this;0===b._state&&(b._state=1,b._tick(function(){b._resolve(a)}))},_resolve:function(a){2!==this._state&&(q(this._doneCallbacks,function(b){b(a)}),this._doneCallbacks.length= |
|||
0,this._state=2)}};return f}]},Ye=function(){this.$get=["$$rAF","$q","$$AnimateRunner",function(a,b,d){return function(b,e){function f(){a(function(){g.addClass&&(b.addClass(g.addClass),g.addClass=null);g.removeClass&&(b.removeClass(g.removeClass),g.removeClass=null);g.to&&(b.css(g.to),g.to=null);h||k.complete();h=!0});return k}var g=e||{};g.$$prepared||(g=qa(g));g.cleanupStyles&&(g.from=g.to=null);g.from&&(b.css(g.from),g.from=null);var h,k=new d;return{start:f,end:f}}}]},ga=O("$compile"),Zb=new function(){}; |
|||
Cc.$inject=["$provide","$$sanitizeUriProvider"];Db.prototype.isFirstChange=function(){return this.previousValue===Zb};var Vc=/^((?:x|data)[\:\-_])/i,$f=O("$controller"),bd=/^(\S+)(\s+as\s+([\w$]+))?$/,hf=function(){this.$get=["$document",function(a){return function(b){b?!b.nodeType&&b instanceof B&&(b=b[0]):b=a[0].body;return b.offsetWidth+1}}]},cd="application/json",bc={"Content-Type":cd+";charset=utf-8"},bg=/^\[|^\{(?!\{)/,cg={"[":/]$/,"{":/}$/},ag=/^\)\]\}',?\n/,Dg=O("$http"),gd=function(a){return function(){throw Dg("legacy", |
|||
a);}},Ja=ea.$interpolateMinErr=O("$interpolate");Ja.throwNoconcat=function(a){throw Ja("noconcat",a);};Ja.interr=function(a,b){return Ja("interr",a,b.toString())};var Eg=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,eg={http:80,https:443,ftp:21},Eb=O("$location"),Fg={$$html5:!1,$$replace:!1,absUrl:Fb("$$absUrl"),url:function(a){if(y(a))return this.$$url;var b=Eg.exec(a);(b[1]||""===a)&&this.path(decodeURIComponent(b[1]));(b[2]||b[1]||""===a)&&this.search(b[3]||"");this.hash(b[5]||"");return this},protocol:Fb("$$protocol"), |
|||
host:Fb("$$host"),port:Fb("$$port"),path:ld("$$path",function(a){a=null!==a?a.toString():"";return"/"==a.charAt(0)?a:"/"+a}),search:function(a,b){switch(arguments.length){case 0:return this.$$search;case 1:if(F(a)||Q(a))a=a.toString(),this.$$search=xc(a);else if(G(a))a=qa(a,{}),q(a,function(b,c){null==b&&delete a[c]}),this.$$search=a;else throw Eb("isrcharg");break;default:y(b)||null===b?delete this.$$search[a]:this.$$search[a]=b}this.$$compose();return this},hash:ld("$$hash",function(a){return null!== |
|||
a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};q([kd,ec,dc],function(a){a.prototype=Object.create(Fg);a.prototype.state=function(b){if(!arguments.length)return this.$$state;if(a!==dc||!this.$$html5)throw Eb("nostate");this.$$state=y(b)?null:b;return this}});var ca=O("$parse"),gg=Function.prototype.call,hg=Function.prototype.apply,ig=Function.prototype.bind,Mb=T();q("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),function(a){Mb[a]=!0});var Gg={n:"\n",f:"\f",r:"\r", |
|||
t:"\t",v:"\v","'":"'",'"':'"'},gc=function(a){this.options=a};gc.prototype={constructor:gc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index<this.text.length;)if(a=this.text.charAt(this.index),'"'===a||"'"===a)this.readString(a);else if(this.isNumber(a)||"."===a&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdentifierStart(this.peekMultichar()))this.readIdent();else if(this.is(a,"(){}[].,;:?"))this.tokens.push({index:this.index,text:a}),this.index++;else if(this.isWhitespace(a))this.index++; |
|||
else{var b=a+this.peek(),d=b+this.peek(2),c=Mb[b],e=Mb[d];Mb[a]||c||e?(a=e?d:c?b:a,this.tokens.push({index:this.index,text:a,operator:!0}),this.index+=a.length):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a,b){return-1!==b.indexOf(a)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a|| |
|||
"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdentifierStart:function(a){return this.options.isIdentifierStart?this.options.isIdentifierStart(a,this.codePointAt(a)):this.isValidIdentifierStart(a)},isValidIdentifierStart:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isIdentifierContinue:function(a){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(a,this.codePointAt(a)):this.isValidIdentifierContinue(a)},isValidIdentifierContinue:function(a,b){return this.isValidIdentifierStart(a, |
|||
b)||this.isNumber(a)},codePointAt:function(a){return 1===a.length?a.charCodeAt(0):(a.charCodeAt(0)<<10)+a.charCodeAt(1)-56613888},peekMultichar:function(){var a=this.text.charAt(this.index),b=this.peek();if(!b)return a;var d=a.charCodeAt(0),c=b.charCodeAt(0);return 55296<=d&&56319>=d&&56320<=c&&57343>=c?a+b:a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b=x(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw ca("lexerr", |
|||
a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index<this.text.length;){var d=P(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var c=this.peek();if("e"==d&&this.isExpOperator(c))a+=d;else if(this.isExpOperator(d)&&c&&this.isNumber(c)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||c&&this.isNumber(c)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}this.tokens.push({index:b,text:a,constant:!0,value:Number(a)})}, |
|||
readIdent:function(){var a=this.index;for(this.index+=this.peekMultichar().length;this.index<this.text.length;){var b=this.peekMultichar();if(!this.isIdentifierContinue(b))break;this.index+=b.length}this.tokens.push({index:a,text:this.text.slice(a,this.index),identifier:!0})},readString:function(a){var b=this.index;this.index++;for(var d="",c=a,e=!1;this.index<this.text.length;){var f=this.text.charAt(this.index),c=c+f;if(e)"u"===f?(e=this.text.substring(this.index+1,this.index+5),e.match(/[\da-f]{4}/i)|| |
|||
this.throwError("Invalid unicode escape [\\u"+e+"]"),this.index+=4,d+=String.fromCharCode(parseInt(e,16))):d+=Gg[f]||f,e=!1;else if("\\"===f)e=!0;else{if(f===a){this.index++;this.tokens.push({index:b,text:c,constant:!0,value:d});return}d+=f}this.index++}this.throwError("Unterminated quote",b)}};var s=function(a,b){this.lexer=a;this.options=b};s.Program="Program";s.ExpressionStatement="ExpressionStatement";s.AssignmentExpression="AssignmentExpression";s.ConditionalExpression="ConditionalExpression"; |
|||
s.LogicalExpression="LogicalExpression";s.BinaryExpression="BinaryExpression";s.UnaryExpression="UnaryExpression";s.CallExpression="CallExpression";s.MemberExpression="MemberExpression";s.Identifier="Identifier";s.Literal="Literal";s.ArrayExpression="ArrayExpression";s.Property="Property";s.ObjectExpression="ObjectExpression";s.ThisExpression="ThisExpression";s.LocalsExpression="LocalsExpression";s.NGValueParameter="NGValueParameter";s.prototype={ast:function(a){this.text=a;this.tokens=this.lexer.lex(a); |
|||
a=this.program();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);return a},program:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.expressionStatement()),!this.expect(";"))return{type:s.Program,body:a}},expressionStatement:function(){return{type:s.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var a=this.expression();this.expect("|");)a=this.filter(a);return a},expression:function(){return this.assignment()}, |
|||
assignment:function(){var a=this.ternary();this.expect("=")&&(a={type:s.AssignmentExpression,left:a,right:this.assignment(),operator:"="});return a},ternary:function(){var a=this.logicalOR(),b,d;return this.expect("?")&&(b=this.expression(),this.consume(":"))?(d=this.expression(),{type:s.ConditionalExpression,test:a,alternate:b,consequent:d}):a},logicalOR:function(){for(var a=this.logicalAND();this.expect("||");)a={type:s.LogicalExpression,operator:"||",left:a,right:this.logicalAND()};return a},logicalAND:function(){for(var a= |
|||
this.equality();this.expect("&&");)a={type:s.LogicalExpression,operator:"&&",left:a,right:this.equality()};return a},equality:function(){for(var a=this.relational(),b;b=this.expect("==","!=","===","!==");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.relational()};return a},relational:function(){for(var a=this.additive(),b;b=this.expect("<",">","<=",">=");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(), |
|||
b;b=this.expect("+","-");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:s.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")): |
|||
this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=qa(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:s.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:s.CallExpression, |
|||
callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:s.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:s.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:s.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression());return b},parseArguments:function(){var a=[];if(")"!== |
|||
this.peekToken().text){do a.push(this.expression());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:s.Identifier,name:a.text}},constant:function(){return{type:s.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");return{type:s.ArrayExpression,elements:a}}, |
|||
object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:s.Property,kind:"init"};this.peek().constant?b.key=this.constant():this.peek().identifier?b.key=this.identifier():this.throwError("invalid key",this.peek());this.consume(":");b.value=this.expression();a.push(b)}while(this.expect(","))}this.consume("}");return{type:s.ObjectExpression,properties:a}},throwError:function(a,b){throw ca("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0=== |
|||
this.tokens.length)throw ca("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw ca("ueoe",this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))? |
|||
(this.tokens.shift(),a):!1},selfReferential:{"this":{type:s.ThisExpression},$locals:{type:s.LocalsExpression}}};sd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:b,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};aa(c,d.$filter);var e="",f;this.stage="assign";if(f=qd(c))this.state.computing="assign",e=this.nextId(),this.recurse(f,e),this.return_(e),e="fn.assign="+this.generateFunction("assign","s,v,l");f=od(c.body); |
|||
d.stage="inputs";q(f,function(a,b){var c="fn"+b;d.state[c]={vars:[],body:[],own:{}};d.state.computing=c;var e=d.nextId();d.recurse(a,e);d.return_(e);d.state.inputs.push(c);a.watchId=b});this.state.computing="fn";this.stage="main";this.recurse(c);e='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+e+this.watchFns()+"return fn;";e=(new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue","ensureSafeAssignContext", |
|||
"ifDefined","plus","text",e))(this.$filter,Ta,sa,md,fg,Gb,jg,nd,a);this.state=this.stage=void 0;e.literal=rd(c);e.constant=c.constant;return e},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;q(b,function(b){a.push("var "+b+"="+d.generateFunction(b,"s"))});b.length&&a.push("fn.inputs=["+b.join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;q(this.state.filters, |
|||
function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b,d,c,e,f){var g,h,k=this,l,n;c=c||C;if(!f&&x(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case s.Program:q(a.body,function(b,c){k.recurse(b.expression, |
|||
void 0,void 0,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,";"):k.return_(h)});break;case s.Literal:n=this.escape(a.value);this.assign(b,n);c(n);break;case s.UnaryExpression:this.recurse(a.argument,void 0,void 0,function(a){h=a});n=a.operator+"("+this.ifDefined(h,0)+")";this.assign(b,n);c(n);break;case s.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,function(a){h=a});n="+"===a.operator?this.plus(g,h):"-"===a.operator?this.ifDefined(g, |
|||
0)+a.operator+this.ifDefined(h,0):"("+g+")"+a.operator+"("+h+")";this.assign(b,n);c(n);break;case s.LogicalExpression:b=b||this.nextId();k.recurse(a.left,b);k.if_("&&"===a.operator?b:k.not(b),k.lazyRecurse(a.right,b));c(b);break;case s.ConditionalExpression:b=b||this.nextId();k.recurse(a.test,b);k.if_(b,k.lazyRecurse(a.alternate,b),k.lazyRecurse(a.consequent,b));c(b);break;case s.Identifier:b=b||this.nextId();d&&(d.context="inputs"===k.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l", |
|||
a.name)+"?l:s"),d.computed=!1,d.name=a.name);Ta(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage||"s",function(){e&&1!==e&&k.if_(k.not(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(b,k.nonComputedMember("s",a.name))})},b&&k.lazyAssign(b,k.nonComputedMember("l",a.name)));(k.state.expensiveChecks||Hb(a.name))&&k.addEnsureSafeObject(b);c(b);break;case s.MemberExpression:g=d&&(d.context=this.nextId())|| |
|||
this.nextId();b=b||this.nextId();k.recurse(a.object,g,void 0,function(){k.if_(k.notNull(g),function(){e&&1!==e&&k.addEnsureSafeAssignContext(g);if(a.computed)h=k.nextId(),k.recurse(a.property,h),k.getStringValue(h),k.addEnsureSafeMemberName(h),e&&1!==e&&k.if_(k.not(k.computedMember(g,h)),k.lazyAssign(k.computedMember(g,h),"{}")),n=k.ensureSafeObject(k.computedMember(g,h)),k.assign(b,n),d&&(d.computed=!0,d.name=h);else{Ta(a.property.name);e&&1!==e&&k.if_(k.not(k.nonComputedMember(g,a.property.name)), |
|||
k.lazyAssign(k.nonComputedMember(g,a.property.name),"{}"));n=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Hb(a.property.name))n=k.ensureSafeObject(n);k.assign(b,n);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(b,"undefined")});c(b)},!!e);break;case s.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],q(a.arguments,function(a){var b=k.nextId();k.recurse(a,b);l.push(b)}),n=h+"("+l.join(",")+")",k.assign(b,n),c(b)):(h=k.nextId(),g={},l= |
|||
[],k.recurse(a.callee,h,g,function(){k.if_(k.notNull(h),function(){k.addEnsureSafeFunction(h);q(a.arguments,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(k.ensureSafeObject(a))})});g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),n=k.member(g.context,g.name,g.computed)+"("+l.join(",")+")"):n=h+"("+l.join(",")+")";n=k.ensureSafeObject(n);k.assign(b,n)},function(){k.assign(b,"undefined")});c(b)}));break;case s.AssignmentExpression:h=this.nextId();g={};if(!pd(a.left))throw ca("lval"); |
|||
this.recurse(a.left,void 0,g,function(){k.if_(k.notNull(g.context),function(){k.recurse(a.right,h);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);n=k.member(g.context,g.name,g.computed)+a.operator+h;k.assign(b,n);c(b||n)})},1);break;case s.ArrayExpression:l=[];q(a.elements,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(a)})});n="["+l.join(",")+"]";this.assign(b,n);c(n);break;case s.ObjectExpression:l=[];q(a.properties,function(a){k.recurse(a.value, |
|||
k.nextId(),void 0,function(b){l.push(k.escape(a.key.type===s.Identifier?a.key.name:""+a.key.value)+":"+b)})});n="{"+l.join(",")+"}";this.assign(b,n);c(n);break;case s.ThisExpression:this.assign(b,"s");c("s");break;case s.LocalsExpression:this.assign(b,"l");c("l");break;case s.NGValueParameter:this.assign(b,"v"),c("v")}},getHasOwnProperty:function(a,b){var d=a+"."+b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a, |
|||
"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+ |
|||
"!=null"},nonComputedMember:function(a,b){var d=/[^$_a-zA-Z0-9]/g;return/[$_a-zA-Z][$_a-zA-Z0-9]*/.test(b)?a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")},addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a), |
|||
";")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),";")},ensureSafeObject:function(a){return"ensureSafeObject("+a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"},getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},ensureSafeAssignContext:function(a){return"ensureSafeAssignContext("+a+",text)"},lazyRecurse:function(a,b,d,c,e,f){var g= |
|||
this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(F(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(Q(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw ca("esc");},nextId:function(a, |
|||
b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};td.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=b;aa(c,d.$filter);var e,f;if(e=qd(c))f=this.recurse(e);e=od(c.body);var g;e&&(g=[],q(e,function(a,b){var c=d.recurse(a);a.input=c;g.push(c);a.watchId=b}));var h=[];q(c.body,function(a){h.push(d.recurse(a.expression))});e=0===c.body.length?C:1=== |
|||
c.body.length?h[0]:function(a,b){var c;q(h,function(d){c=d(a,b)});return c};f&&(e.assign=function(a,b,c){return f(a,c,b)});g&&(e.inputs=g);e.literal=rd(c);e.constant=c.constant;return e},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case s.Literal:return this.value(a.value,b);case s.UnaryExpression:return e=this.recurse(a.argument),this["unary"+a.operator](e,b);case s.BinaryExpression:return c=this.recurse(a.left),e=this.recurse(a.right), |
|||
this["binary"+a.operator](c,e,b);case s.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case s.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case s.Identifier:return Ta(a.name,f.expression),f.identifier(a.name,f.expensiveChecks||Hb(a.name),b,d,f.expression);case s.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(Ta(a.property.name,f.expression), |
|||
e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c,e,b,d,f.expression):this.nonComputedMember(c,e,f.expensiveChecks,b,d,f.expression);case s.CallExpression:return g=[],q(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var m=[],r=0;r<g.length;++r)m.push(g[r](a,c,d,f));a=e.apply(void 0,m,f);return b?{context:void 0,name:void 0,value:a}:a}:function(a, |
|||
c,d,n){var m=e(a,c,d,n),r;if(null!=m.value){sa(m.context,f.expression);md(m.value,f.expression);r=[];for(var q=0;q<g.length;++q)r.push(sa(g[q](a,c,d,n),f.expression));r=sa(m.value.apply(m.context,r),f.expression)}return b?{value:r}:r};case s.AssignmentExpression:return c=this.recurse(a.left,!0,1),e=this.recurse(a.right),function(a,d,g,n){var m=c(a,d,g,n);a=e(a,d,g,n);sa(m.value,f.expression);Gb(m.context);m.context[m.name]=a;return b?{value:a}:a};case s.ArrayExpression:return g=[],q(a.elements,function(a){g.push(f.recurse(a))}), |
|||
function(a,c,d,e){for(var f=[],r=0;r<g.length;++r)f.push(g[r](a,c,d,e));return b?{value:f}:f};case s.ObjectExpression:return g=[],q(a.properties,function(a){g.push({key:a.key.type===s.Identifier?a.key.name:""+a.key.value,value:f.recurse(a.value)})}),function(a,c,d,e){for(var f={},r=0;r<g.length;++r)f[g[r].key]=g[r].value(a,c,d,e);return b?{value:f}:f};case s.ThisExpression:return function(a){return b?{value:a}:a};case s.LocalsExpression:return function(a,c){return b?{value:c}:c};case s.NGValueParameter:return function(a, |
|||
c,d){return b?{value:d}:d}}},"unary+":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=x(d)?+d:0;return b?{value:d}:d}},"unary-":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=x(d)?-d:0;return b?{value:d}:d}},"unary!":function(a,b){return function(d,c,e,f){d=!a(d,c,e,f);return b?{value:d}:d}},"binary+":function(a,b,d){return function(c,e,f,g){var h=a(c,e,f,g);c=b(c,e,f,g);h=nd(h,c);return d?{value:h}:h}},"binary-":function(a,b,d){return function(c,e,f,g){var h=a(c,e,f,g);c=b(c,e,f,g); |
|||
h=(x(h)?h:0)-(x(c)?c:0);return d?{value:h}:h}},"binary*":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)*b(c,e,f,g);return d?{value:c}:c}},"binary/":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)/b(c,e,f,g);return d?{value:c}:c}},"binary%":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)%b(c,e,f,g);return d?{value:c}:c}},"binary===":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)===b(c,e,f,g);return d?{value:c}:c}},"binary!==":function(a,b,d){return function(c,e,f,g){c=a(c, |
|||
e,f,g)!==b(c,e,f,g);return d?{value:c}:c}},"binary==":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)==b(c,e,f,g);return d?{value:c}:c}},"binary!=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)!=b(c,e,f,g);return d?{value:c}:c}},"binary<":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<b(c,e,f,g);return d?{value:c}:c}},"binary>":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f, |
|||
g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,h){e=a(e,f,g,h)?b(e,f,g,h):d(e,f,g,h);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:void 0, |
|||
name:void 0,value:a}:a}},identifier:function(a,b,d,c,e){return function(f,g,h,k){f=g&&a in g?g:f;c&&1!==c&&f&&!f[a]&&(f[a]={});g=f?f[a]:void 0;b&&sa(g,e);return d?{context:f,name:a,value:g}:g}},computedMember:function(a,b,d,c,e){return function(f,g,h,k){var l=a(f,g,h,k),n,m;null!=l&&(n=b(f,g,h,k),n+="",Ta(n,e),c&&1!==c&&(Gb(l),l&&!l[n]&&(l[n]={})),m=l[n],sa(m,e));return d?{context:l,name:n,value:m}:m}},nonComputedMember:function(a,b,d,c,e,f){return function(g,h,k,l){g=a(g,h,k,l);e&&1!==e&&(Gb(g), |
|||
g&&!g[b]&&(g[b]={}));h=null!=g?g[b]:void 0;(d||Hb(b))&&sa(h,f);return c?{context:g,name:b,value:h}:h}},inputs:function(a,b){return function(d,c,e,f){return f?f[b]:a(d,c,e)}}};var hc=function(a,b,d){this.lexer=a;this.$filter=b;this.options=d;this.ast=new s(a,d);this.astCompiler=d.csp?new td(this.ast,b):new sd(this.ast,b)};hc.prototype={constructor:hc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};var kg=Object.prototype.valueOf,ta=O("$sce"),oa={HTML:"html",CSS:"css", |
|||
URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},mg=O("$compile"),Y=v.document.createElement("a"),xd=ra(v.location.href);yd.$inject=["$document"];Jc.$inject=["$provide"];var Fd=22,Ed=".",jc="0";zd.$inject=["$locale"];Bd.$inject=["$locale"];var xg={yyyy:W("FullYear",4,0,!1,!0),yy:W("FullYear",2,0,!0,!0),y:W("FullYear",1,0,!1,!0),MMMM:ib("Month"),MMM:ib("Month",!0),MM:W("Month",2,1),M:W("Month",1,1),LLLL:ib("Month",!1,!0),dd:W("Date",2),d:W("Date",1),HH:W("Hours",2),H:W("Hours",1),hh:W("Hours",2,-12), |
|||
h:W("Hours",1,-12),mm:W("Minutes",2),m:W("Minutes",1),ss:W("Seconds",2),s:W("Seconds",1),sss:W("Milliseconds",3),EEEE:ib("Day"),EEE:ib("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Ib(Math[0<a?"floor":"ceil"](a/60),2)+Ib(Math.abs(a%60),2))},ww:Hd(2),w:Hd(1),G:kc,GG:kc,GGG:kc,GGGG:function(a,b){return 0>=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},wg=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/, |
|||
vg=/^\-?\d+$/;Ad.$inject=["$locale"];var qg=da(P),rg=da(sb);Cd.$inject=["$parse"];var ne=da({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===ma.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),tb={};q(Cb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!=a){var c=xa("ng-"+b),e=d;"checked"===a&&(e=function(a, |
|||
b,e){e.ngModel!==e[c]&&d(a,b,e)});tb[c]=function(){return{restrict:"A",priority:100,link:e}}}});q(ad,function(a,b){tb[b]=function(){return{priority:100,link:function(a,c,e){if("ngPattern"===b&&"/"==e.ngPattern.charAt(0)&&(c=e.ngPattern.match(zg))){e.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});q(["src","srcset","href"],function(a){var b=xa("ng-"+a);tb[b]=function(){return{priority:99,link:function(d,c,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"=== |
|||
ma.call(c.prop("href"))&&(g="xlinkHref",e.$attr[g]="xlink:href",f=null);e.$observe(b,function(b){b?(e.$set(g,b),Ca&&f&&c.prop(f,e[g])):"href"===a&&e.$set(g,null)})}}}});var Jb={$addControl:C,$$renameControl:function(a,b){a.$name=b},$removeControl:C,$setValidity:C,$setDirty:C,$setPristine:C,$setSubmitted:C};Id.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Rd=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||C}return{name:"form", |
|||
restrict:a?"EAC":"E",require:["form","^^?form"],controller:Id,compile:function(d,f){d.addClass(Ua).addClass(mb);var g=f.name?"name":a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var m=f[0];if(!("action"in e)){var r=function(b){a.$apply(function(){m.$commitViewValue();m.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",r,!1);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",r,!1)},0,!1)})}(f[1]||m.$$parentForm).$addControl(m);var q=g?c(m.$name):C;g&& |
|||
(q(a,m),e.$observe(g,function(b){m.$name!==b&&(q(a,void 0),m.$$parentForm.$$renameControl(m,b),q=c(m.$name),q(a,m))}));d.on("$destroy",function(){m.$$parentForm.$removeControl(m);q(a,void 0);R(m,Jb)})}}}}}]},oe=Rd(),Be=Rd(!0),yg=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,Hg=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,Ig=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i, |
|||
Jg=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Sd=/^(\d{4,})-(\d{2})-(\d{2})$/,Td=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,nc=/^(\d{4,})-W(\d\d)$/,Ud=/^(\d{4,})-(\d\d)$/,Vd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Kd=T();q(["date","datetime-local","month","time","week"],function(a){Kd[a]=!0});var Wd={text:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);lc(c)},date:kb("date",Sd,Lb(Sd,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":kb("datetimelocal",Td,Lb(Td,"yyyy MM dd HH mm ss sss".split(" ")), |
|||
"yyyy-MM-ddTHH:mm:ss.sss"),time:kb("time",Vd,Lb(Vd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:kb("week",nc,function(a,b){if(fa(a))return a;if(F(a)){nc.lastIndex=0;var d=nc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,h=0,k=Gd(c),e=7*(e-1);b&&(d=b.getHours(),f=b.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds());return new Date(c,0,k.getDate()+e,d,f,g,h)}}return NaN},"yyyy-Www"),month:kb("month",Ud,Lb(Ud,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f){Ld(a,b,d,c);jb(a,b,d,c,e,f);c.$$parserName= |
|||
"number";c.$parsers.push(function(a){if(c.$isEmpty(a))return null;if(Jg.test(a))return parseFloat(a)});c.$formatters.push(function(a){if(!c.$isEmpty(a)){if(!Q(a))throw lb("numfmt",a);a=a.toString()}return a});if(x(d.min)||d.ngMin){var g;c.$validators.min=function(a){return c.$isEmpty(a)||y(g)||a>=g};d.$observe("min",function(a){x(a)&&!Q(a)&&(a=parseFloat(a,10));g=Q(a)&&!isNaN(a)?a:void 0;c.$validate()})}if(x(d.max)||d.ngMax){var h;c.$validators.max=function(a){return c.$isEmpty(a)||y(h)||a<=h};d.$observe("max", |
|||
function(a){x(a)&&!Q(a)&&(a=parseFloat(a,10));h=Q(a)&&!isNaN(a)?a:void 0;c.$validate()})}},url:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);lc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||Hg.test(d)}},email:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);lc(c);c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||Ig.test(d)}},radio:function(a,b,d,c){y(d.name)&&b.attr("name",++nb);b.on("click",function(a){b[0].checked&&c.$setViewValue(d.value, |
|||
a&&a.type)});c.$render=function(){b[0].checked=d.value==c.$viewValue};d.$observe("value",c.$render)},checkbox:function(a,b,d,c,e,f,g,h){var k=Md(h,a,"ngTrueValue",d.ngTrueValue,!0),l=Md(h,a,"ngFalseValue",d.ngFalseValue,!1);b.on("click",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty=function(a){return!1===a};c.$formatters.push(function(a){return pa(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:C,button:C,submit:C,reset:C, |
|||
file:C},Dc=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,h){h[0]&&(Wd[P(g.type)]||Wd.text)(e,f,g,h[0],b,a,d,c)}}}}],Kg=/^(true|false|\d+)$/,Te=function(){return{restrict:"A",priority:100,compile:function(a,b){return Kg.test(b.ngValue)?function(a,b,e){e.$set("value",a.$eval(e.ngValue))}:function(a,b,e){a.$watch(e.ngValue,function(a){e.$set("value",a)})}}}},te=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b); |
|||
return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=y(a)?"":a})}}}}],ve=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=y(a)?"":a})}}}}],ue=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g= |
|||
b(e.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){c.html(a.getTrustedHtml(f(b))||"")})}}}}],Se=da({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),we=mc("",!0),ye=mc("Odd",0),xe=mc("Even",1),ze=La({compile:function(a,b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),Ae=[function(){return{restrict:"A",scope:!0,controller:"@", |
|||
priority:500}}],Ic={},Lg={blur:!0,focus:!0};q("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=xa("ng-"+a);Ic[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(e,f){var g=d(f[b],null,!0);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};Lg[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var De=["$animate","$compile",function(a, |
|||
b){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,e,f,g){var h,k,l;d.$watch(e.ngIf,function(d){d?k||g(function(d,f){k=f;d[d.length++]=b.$$createComment("end ngIf",e.ngIf);h={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l=rb(h.clone),a.leave(l).then(function(){l=null}),h=null))})}}}],Ee=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0, |
|||
transclude:"element",controller:ea.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",h=e.autoscroll;return function(c,e,n,m,r){var q=0,s,w,p,y=function(){w&&(w.remove(),w=null);s&&(s.$destroy(),s=null);p&&(d.leave(p).then(function(){w=null}),w=p,p=null)};c.$watch(f,function(f){var n=function(){!x(h)||h&&!c.$eval(h)||b()},u=++q;f?(a(f,!0).then(function(a){if(!c.$$destroyed&&u===q){var b=c.$new();m.template=a;a=r(b,function(a){y();d.enter(a,null,e).then(n)});s=b;p=a;s.$emit("$includeContentLoaded", |
|||
f);c.$eval(g)}},function(){c.$$destroyed||u!==q||(y(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(y(),m.template=null)})}}}}],Ve=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){ma.call(d[0]).match(/SVG/)?(d.empty(),a(Lc(e.template,v.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],Fe=La({priority:450,compile:function(){return{pre:function(a, |
|||
b,d){a.$eval(d.ngInit)}}}}),Re=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=b.attr(d.$attr.ngList)||", ",f="false"!==d.ngTrim,g=f?V(e):e;c.$parsers.push(function(a){if(!y(a)){var b=[];a&&q(a.split(g),function(a){a&&b.push(f?V(a):a)});return b}});c.$formatters.push(function(a){if(K(a))return a.join(e)});c.$isEmpty=function(a){return!a||!a.length}}}},mb="ng-valid",Nd="ng-invalid",Ua="ng-pristine",Kb="ng-dirty",Pd="ng-pending",lb=O("ngModel"),Mg=["$scope", |
|||
"$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,b,d,c,e,f,g,h,k,l){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=void 0;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=void 0;this.$name=l(d.name||"",!1)(a); |
|||
this.$$parentForm=Jb;var n=e(d.ngModel),m=n.assign,r=n,s=m,v=null,w,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var b=e(d.ngModel+"()"),f=e(d.ngModel+"($$$p)");r=function(a){var c=n(a);E(c)&&(c=b(a));return c};s=function(a,b){E(n(a))?f(a,{$$$p:b}):m(a,b)}}else if(!n.assign)throw lb("nonassign",d.ngModel,wa(c));};this.$render=C;this.$isEmpty=function(a){return y(a)||""===a||null===a||a!==a};this.$$updateEmptyClasses=function(a){p.$isEmpty(a)?(f.removeClass(c,"ng-not-empty"), |
|||
f.addClass(c,"ng-empty")):(f.removeClass(c,"ng-empty"),f.addClass(c,"ng-not-empty"))};var H=0;Jd({ctrl:this,$element:c,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:f});this.$setPristine=function(){p.$dirty=!1;p.$pristine=!0;f.removeClass(c,Kb);f.addClass(c,Ua)};this.$setDirty=function(){p.$dirty=!0;p.$pristine=!1;f.removeClass(c,Ua);f.addClass(c,Kb);p.$$parentForm.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;f.setClass(c,"ng-untouched","ng-touched")}; |
|||
this.$setTouched=function(){p.$touched=!0;p.$untouched=!1;f.setClass(c,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){g.cancel(v);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!Q(p.$modelValue)||!isNaN(p.$modelValue)){var a=p.$$rawModelValue,b=p.$valid,c=p.$modelValue,d=p.$options&&p.$options.allowInvalid;p.$$runValidators(a,p.$$lastCommittedViewValue,function(e){d||b===e||(p.$modelValue=e?a:void 0,p.$modelValue!==c&&p.$$writeModelToScope())})}}; |
|||
this.$$runValidators=function(a,b,c){function d(){var c=!0;q(p.$validators,function(d,e){var g=d(a,b);c=c&&g;f(e,g)});return c?!0:(q(p.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;q(p.$asyncValidators,function(e,g){var h=e(a,b);if(!h||!E(h.then))throw lb("nopromise",h);f(g,void 0);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?k.all(c).then(function(){g(d)},C):g(!0)}function f(a,b){h===H&&p.$setValidity(a,b)}function g(a){h===H&&c(a)}H++;var h= |
|||
H;(function(){var a=p.$$parserName||"parse";if(y(w))f(a,null);else return w||(q(p.$validators,function(a,b){f(b,null)}),q(p.$asyncValidators,function(a,b){f(b,null)})),f(a,w),w;return!0})()?d()?e():g(!1):g(!1)};this.$commitViewValue=function(){var a=p.$viewValue;g.cancel(v);if(p.$$lastCommittedViewValue!==a||""===a&&p.$$hasNativeValidators)p.$$updateEmptyClasses(a),p.$$lastCommittedViewValue=a,p.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var b=p.$$lastCommittedViewValue; |
|||
if(w=y(b)?void 0:!0)for(var c=0;c<p.$parsers.length;c++)if(b=p.$parsers[c](b),y(b)){w=!1;break}Q(p.$modelValue)&&isNaN(p.$modelValue)&&(p.$modelValue=r(a));var d=p.$modelValue,e=p.$options&&p.$options.allowInvalid;p.$$rawModelValue=b;e&&(p.$modelValue=b,p.$modelValue!==d&&p.$$writeModelToScope());p.$$runValidators(b,p.$$lastCommittedViewValue,function(a){e||(p.$modelValue=a?b:void 0,p.$modelValue!==d&&p.$$writeModelToScope())})};this.$$writeModelToScope=function(){s(a,p.$modelValue);q(p.$viewChangeListeners, |
|||
function(a){try{a()}catch(c){b(c)}})};this.$setViewValue=function(a,b){p.$viewValue=a;p.$options&&!p.$options.updateOnDefault||p.$$debounceViewValueCommit(b)};this.$$debounceViewValueCommit=function(b){var c=0,d=p.$options;d&&x(d.debounce)&&(d=d.debounce,Q(d)?c=d:Q(d[b])?c=d[b]:Q(d["default"])&&(c=d["default"]));g.cancel(v);c?v=g(function(){p.$commitViewValue()},c):h.$$phase?p.$commitViewValue():a.$apply(function(){p.$commitViewValue()})};a.$watch(function(){var b=r(a);if(b!==p.$modelValue&&(p.$modelValue=== |
|||
p.$modelValue||b===b)){p.$modelValue=p.$$rawModelValue=b;w=void 0;for(var c=p.$formatters,d=c.length,e=b;d--;)e=c[d](e);p.$viewValue!==e&&(p.$$updateEmptyClasses(e),p.$viewValue=p.$$lastCommittedViewValue=e,p.$render(),p.$$runValidators(b,e,C))}return b})}],Qe=["$rootScope",function(a){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:Mg,priority:1,compile:function(b){b.addClass(Ua).addClass("ng-untouched").addClass(mb);return{pre:function(a,b,e,f){var g=f[0];b=f[1]|| |
|||
g.$$parentForm;g.$$setOptions(f[2]&&f[2].$options);b.$addControl(g);e.$observe("name",function(a){g.$name!==a&&g.$$parentForm.$$renameControl(g,a)});a.$on("$destroy",function(){g.$$parentForm.$removeControl(g)})},post:function(b,c,e,f){var g=f[0];if(g.$options&&g.$options.updateOn)c.on(g.$options.updateOn,function(a){g.$$debounceViewValueCommit(a&&a.type)});c.on("blur",function(){g.$touched||(a.$$phase?b.$evalAsync(g.$setTouched):b.$apply(g.$setTouched))})}}}}}],Ng=/(\s+|^)default(\s+|$)/,Ue=function(){return{restrict:"A", |
|||
controller:["$scope","$attrs",function(a,b){var d=this;this.$options=qa(a.$eval(b.ngModelOptions));x(this.$options.updateOn)?(this.$options.updateOnDefault=!1,this.$options.updateOn=V(this.$options.updateOn.replace(Ng,function(){d.$options.updateOnDefault=!0;return" "}))):this.$options.updateOnDefault=!0}]}},Ge=La({terminal:!0,priority:1E3}),Og=O("ngOptions"),Pg=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/, |
|||
Oe=["$compile","$document","$parse",function(a,b,d){function c(a,b,c){function e(a,b,c,d,f){this.selectValue=a;this.viewValue=b;this.label=c;this.group=d;this.disabled=f}function f(a){var b;if(!q&&ya(a))b=a;else{b=[];for(var c in a)a.hasOwnProperty(c)&&"$"!==c.charAt(0)&&b.push(c)}return b}var m=a.match(Pg);if(!m)throw Og("iexp",a,wa(b));var r=m[5]||m[7],q=m[6];a=/ as /.test(m[0])&&m[1];var s=m[9];b=d(m[2]?m[1]:r);var w=a&&d(a)||b,p=s&&d(s),v=s?function(a,b){return p(c,b)}:function(a){return Fa(a)}, |
|||
t=function(a,b){return v(a,L(a,b))},z=d(m[2]||m[1]),u=d(m[3]||""),y=d(m[4]||""),x=d(m[8]),D={},L=q?function(a,b){D[q]=b;D[r]=a;return D}:function(a){D[r]=a;return D};return{trackBy:s,getTrackByValue:t,getWatchables:d(x,function(a){var b=[];a=a||[];for(var d=f(a),e=d.length,g=0;g<e;g++){var h=a===d?g:d[g],l=a[h],h=L(l,h),l=v(l,h);b.push(l);if(m[2]||m[1])l=z(c,h),b.push(l);m[4]&&(h=y(c,h),b.push(h))}return b}),getOptions:function(){for(var a=[],b={},d=x(c)||[],g=f(d),h=g.length,m=0;m<h;m++){var p=d=== |
|||
g?m:g[m],q=L(d[p],p),r=w(c,q),p=v(r,q),D=z(c,q),N=u(c,q),q=y(c,q),r=new e(p,r,D,N,q);a.push(r);b[p]=r}return{items:a,selectValueMap:b,getOptionFromViewValue:function(a){return b[t(a)]},getViewValueFromOption:function(a){return s?ea.copy(a.viewValue):a.viewValue}}}}}var e=v.document.createElement("option"),f=v.document.createElement("optgroup");return{restrict:"A",terminal:!0,require:["select","ngModel"],link:{pre:function(a,b,c,d){d[0].registerOption=C},post:function(d,h,k,l){function n(a,b){a.element= |
|||
b;b.disabled=a.disabled;a.label!==b.label&&(b.label=a.label,b.textContent=a.label);a.value!==b.value&&(b.value=a.selectValue)}function m(){var a=u&&r.readValue();if(u)for(var b=u.items.length-1;0<=b;b--){var c=u.items[b];c.group?Bb(c.element.parentNode):Bb(c.element)}u=I.getOptions();var d={};t&&h.prepend(w);u.items.forEach(function(a){var b;if(x(a.group)){b=d[a.group];b||(b=f.cloneNode(!1),E.appendChild(b),b.label=a.group,d[a.group]=b);var c=e.cloneNode(!1)}else b=E,c=e.cloneNode(!1);b.appendChild(c); |
|||
n(a,c)});h[0].appendChild(E);s.$render();s.$isEmpty(a)||(b=r.readValue(),(I.trackBy||v?pa(a,b):a===b)||(s.$setViewValue(b),s.$render()))}var r=l[0],s=l[1],v=k.multiple,w;l=0;for(var p=h.children(),y=p.length;l<y;l++)if(""===p[l].value){w=p.eq(l);break}var t=!!w,z=B(e.cloneNode(!1));z.val("?");var u,I=c(k.ngOptions,h,d),E=b[0].createDocumentFragment();v?(s.$isEmpty=function(a){return!a||0===a.length},r.writeValue=function(a){u.items.forEach(function(a){a.element.selected=!1});a&&a.forEach(function(a){if(a= |
|||
u.getOptionFromViewValue(a))a.element.selected=!0})},r.readValue=function(){var a=h.val()||[],b=[];q(a,function(a){(a=u.selectValueMap[a])&&!a.disabled&&b.push(u.getViewValueFromOption(a))});return b},I.trackBy&&d.$watchCollection(function(){if(K(s.$viewValue))return s.$viewValue.map(function(a){return I.getTrackByValue(a)})},function(){s.$render()})):(r.writeValue=function(a){var b=u.getOptionFromViewValue(a);b?(h[0].value!==b.selectValue&&(z.remove(),t||w.remove(),h[0].value=b.selectValue,b.element.selected= |
|||
!0),b.element.setAttribute("selected","selected")):null===a||t?(z.remove(),t||h.prepend(w),h.val(""),w.prop("selected",!0),w.attr("selected",!0)):(t||w.remove(),h.prepend(z),h.val("?"),z.prop("selected",!0),z.attr("selected",!0))},r.readValue=function(){var a=u.selectValueMap[h.val()];return a&&!a.disabled?(t||w.remove(),z.remove(),u.getViewValueFromOption(a)):null},I.trackBy&&d.$watch(function(){return I.getTrackByValue(s.$viewValue)},function(){s.$render()}));t?(w.remove(),a(w)(d),w.removeClass("ng-scope")): |
|||
w=B(e.cloneNode(!1));h.empty();m();d.$watchCollection(I.getWatchables,m)}}}}],He=["$locale","$interpolate","$log",function(a,b,d){var c=/{}/g,e=/^when(Minus)?(.+)$/;return{link:function(f,g,h){function k(a){g.text(a||"")}var l=h.count,n=h.$attr.when&&g.attr(h.$attr.when),m=h.offset||0,r=f.$eval(n)||{},s={},v=b.startSymbol(),w=b.endSymbol(),p=v+l+"-"+m+w,x=ea.noop,t;q(h,function(a,b){var c=e.exec(b);c&&(c=(c[1]?"-":"")+P(c[2]),r[c]=g.attr(h.$attr[b]))});q(r,function(a,d){s[d]=b(a.replace(c,p))});f.$watch(l, |
|||
function(b){var c=parseFloat(b),e=isNaN(c);e||c in r||(c=a.pluralCat(c-m));c===t||e&&Q(t)&&isNaN(t)||(x(),e=s[c],y(e)?(null!=b&&d.debug("ngPluralize: no rule defined for '"+c+"' in "+n),x=C,k()):x=f.$watch(e,k),t=c)})}}}],Ie=["$parse","$animate","$compile",function(a,b,d){var c=O("ngRepeat"),e=function(a,b,c,d,e,n,m){a[c]=d;e&&(a[e]=n);a.$index=b;a.$first=0===b;a.$last=b===m-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(b&1))};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3, |
|||
terminal:!0,$$tlb:!0,compile:function(f,g){var h=g.ngRepeat,k=d.$$createComment("end ngRepeat",h),l=h.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!l)throw c("iexp",h);var n=l[1],m=l[2],r=l[3],s=l[4],l=n.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/);if(!l)throw c("iidexp",n);var v=l[3]||l[1],w=l[2];if(r&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(r)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(r)))throw c("badident", |
|||
r);var p,y,t,z,u={$id:Fa};s?p=a(s):(t=function(a,b){return Fa(b)},z=function(a){return a});return function(a,d,f,g,l){p&&(y=function(b,c,d){w&&(u[w]=b);u[v]=c;u.$index=d;return p(a,u)});var n=T();a.$watchCollection(m,function(f){var g,m,p=d[0],s,u=T(),x,D,E,C,F,B,G;r&&(a[r]=f);if(ya(f))F=f,m=y||t;else for(G in m=y||z,F=[],f)ua.call(f,G)&&"$"!==G.charAt(0)&&F.push(G);x=F.length;G=Array(x);for(g=0;g<x;g++)if(D=f===F?g:F[g],E=f[D],C=m(D,E,g),n[C])B=n[C],delete n[C],u[C]=B,G[g]=B;else{if(u[C])throw q(G, |
|||
function(a){a&&a.scope&&(n[a.id]=a)}),c("dupes",h,C,E);G[g]={id:C,scope:void 0,clone:void 0};u[C]=!0}for(s in n){B=n[s];C=rb(B.clone);b.leave(C);if(C[0].parentNode)for(g=0,m=C.length;g<m;g++)C[g].$$NG_REMOVED=!0;B.scope.$destroy()}for(g=0;g<x;g++)if(D=f===F?g:F[g],E=f[D],B=G[g],B.scope){s=p;do s=s.nextSibling;while(s&&s.$$NG_REMOVED);B.clone[0]!=s&&b.move(rb(B.clone),null,p);p=B.clone[B.clone.length-1];e(B.scope,g,v,E,w,D,x)}else l(function(a,c){B.scope=c;var d=k.cloneNode(!1);a[a.length++]=d;b.enter(a, |
|||
null,p);p=d;B.clone=a;u[B.id]=B;e(B.scope,g,v,E,w,D,x)});n=u})}}}}],Je=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngShow,function(b){a[b?"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],Ce=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngHide,function(b){a[b?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],Ke=La(function(a,b,d){a.$watch(d.ngStyle,function(a, |
|||
d){d&&a!==d&&q(d,function(a,c){b.css(c,"")});a&&b.css(a)},!0)}),Le=["$animate","$compile",function(a,b){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(d,c,e,f){var g=[],h=[],k=[],l=[],n=function(a,b){return function(){a.splice(b,1)}};d.$watch(e.ngSwitch||e.on,function(c){var d,e;d=0;for(e=k.length;d<e;++d)a.cancel(k[d]);d=k.length=0;for(e=l.length;d<e;++d){var s=rb(h[d].clone);l[d].$destroy();(k[d]=a.leave(s)).then(n(k,d))}h.length=0;l.length=0;(g=f.cases["!"+ |
|||
c]||f.cases["?"])&&q(g,function(c){c.transclude(function(d,e){l.push(e);var f=c.element;d[d.length++]=b.$$createComment("end ngSwitchWhen");h.push({clone:d});a.enter(d,f.parent(),f)})})})}}}],Me=La({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,e){c.cases["!"+d.ngSwitchWhen]=c.cases["!"+d.ngSwitchWhen]||[];c.cases["!"+d.ngSwitchWhen].push({transclude:e,element:b})}}),Ne=La({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a, |
|||
b,d,c,e){c.cases["?"]=c.cases["?"]||[];c.cases["?"].push({transclude:e,element:b})}}),Qg=O("ngTransclude"),Pe=La({restrict:"EAC",link:function(a,b,d,c,e){d.ngTransclude===d.$attr.ngTransclude&&(d.ngTransclude="");if(!e)throw Qg("orphan",wa(b));e(function(a){a.length&&(b.empty(),b.append(a))},null,d.ngTransclude||d.ngTranscludeSlot)}}),pe=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(b,d){"text/ng-template"==d.type&&a.put(d.id,b[0].text)}}}],Rg={$setViewValue:C,$render:C}, |
|||
Sg=["$element","$scope",function(a,b){var d=this,c=new Ra;d.ngModelCtrl=Rg;d.unknownOption=B(v.document.createElement("option"));d.renderUnknownOption=function(b){b="? "+Fa(b)+" ?";d.unknownOption.val(b);a.prepend(d.unknownOption);a.val(b)};b.$on("$destroy",function(){d.renderUnknownOption=C});d.removeUnknownOption=function(){d.unknownOption.parent()&&d.unknownOption.remove()};d.readValue=function(){d.removeUnknownOption();return a.val()};d.writeValue=function(b){d.hasOption(b)?(d.removeUnknownOption(), |
|||
a.val(b),""===b&&d.emptyOption.prop("selected",!0)):null==b&&d.emptyOption?(d.removeUnknownOption(),a.val("")):d.renderUnknownOption(b)};d.addOption=function(a,b){if(8!==b[0].nodeType){Qa(a,'"option value"');""===a&&(d.emptyOption=b);var g=c.get(a)||0;c.put(a,g+1);d.ngModelCtrl.$render();b[0].hasAttribute("selected")&&(b[0].selected=!0)}};d.removeOption=function(a){var b=c.get(a);b&&(1===b?(c.remove(a),""===a&&(d.emptyOption=void 0)):c.put(a,b-1))};d.hasOption=function(a){return!!c.get(a)};d.registerOption= |
|||
function(a,b,c,h,k){if(h){var l;c.$observe("value",function(a){x(l)&&d.removeOption(l);l=a;d.addOption(a,b)})}else k?a.$watch(k,function(a,e){c.$set("value",a);e!==a&&d.removeOption(e);d.addOption(a,b)}):d.addOption(c.value,b);b.on("$destroy",function(){d.removeOption(c.value);d.ngModelCtrl.$render()})}}],qe=function(){return{restrict:"E",require:["select","?ngModel"],controller:Sg,priority:1,link:{pre:function(a,b,d,c){var e=c[1];if(e){var f=c[0];f.ngModelCtrl=e;b.on("change",function(){a.$apply(function(){e.$setViewValue(f.readValue())})}); |
|||
if(d.multiple){f.readValue=function(){var a=[];q(b.find("option"),function(b){b.selected&&a.push(b.value)});return a};f.writeValue=function(a){var c=new Ra(a);q(b.find("option"),function(a){a.selected=x(c.get(a.value))})};var g,h=NaN;a.$watch(function(){h!==e.$viewValue||pa(g,e.$viewValue)||(g=ha(e.$viewValue),e.$render());h=e.$viewValue});e.$isEmpty=function(a){return!a||0===a.length}}}},post:function(a,b,d,c){var e=c[1];if(e){var f=c[0];e.$render=function(){f.writeValue(e.$viewValue)}}}}}},se=["$interpolate", |
|||
function(a){return{restrict:"E",priority:100,compile:function(b,d){if(x(d.value))var c=a(d.value,!0);else{var e=a(b.text(),!0);e||d.$set("value",b.text())}return function(a,b,d){var k=b.parent();(k=k.data("$selectController")||k.parent().data("$selectController"))&&k.registerOption(a,b,d,c,e)}}}}],re=da({restrict:"E",terminal:!1}),Fc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){c&&(d.required=!0,c.$validators.required=function(a,b){return!d.required||!c.$isEmpty(b)},d.$observe("required", |
|||
function(){c.$validate()}))}}},Ec=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e,f=d.ngPattern||d.pattern;d.$observe("pattern",function(a){F(a)&&0<a.length&&(a=new RegExp("^"+a+"$"));if(a&&!a.test)throw O("ngPattern")("noregexp",f,a,wa(b));e=a||void 0;c.$validate()});c.$validators.pattern=function(a,b){return c.$isEmpty(b)||y(e)||e.test(b)}}}}},Hc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=-1;d.$observe("maxlength",function(a){a= |
|||
X(a);e=isNaN(a)?-1:a;c.$validate()});c.$validators.maxlength=function(a,b){return 0>e||c.$isEmpty(b)||b.length<=e}}}}},Gc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=0;d.$observe("minlength",function(a){e=X(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=e}}}}};v.angular.bootstrap?v.console&&console.log("WARNING: Tried to load angular more than once."):(ie(),ke(ea),ea.module("ngLocale",[],["$provide",function(a){function b(a){a+= |
|||
"";var b=a.indexOf(".");return-1==b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),STANDALONEMONTH:"January February March April May June July August September October November December".split(" "), |
|||
WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a, |
|||
c){var e=a|0,f=c;void 0===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),B(v.document).ready(function(){ee(v.document,yc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>'); |
|||
//# sourceMappingURL=angular.min.js.map
|
16404
js/lodash.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,492 @@ |
|||
//! moment.js
|
|||
//! version : 2.14.1
|
|||
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
|
|||
//! license : MIT
|
|||
//! momentjs.com
|
|||
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return md.apply(null,arguments)} |
|||
// This is done to register the method called with moment()
|
|||
// without creating circular dependencies.
|
|||
function b(a){md=a}function c(a){return a instanceof Array||"[object Array]"===Object.prototype.toString.call(a)}function d(a){return"[object Object]"===Object.prototype.toString.call(a)}function e(a){var b;for(b in a) |
|||
// even if its not own property I'd still call it non-empty
|
|||
return!1;return!0}function f(a){return a instanceof Date||"[object Date]"===Object.prototype.toString.call(a)}function g(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function h(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function i(a,b){for(var c in b)h(b,c)&&(a[c]=b[c]);return h(b,"toString")&&(a.toString=b.toString),h(b,"valueOf")&&(a.valueOf=b.valueOf),a}function j(a,b,c,d){return qb(a,b,c,d,!0).utc()}function k(){ |
|||
// We need to deep clone this object.
|
|||
return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null}}function l(a){return null==a._pf&&(a._pf=k()),a._pf}function m(a){if(null==a._isValid){var b=l(a),c=nd.call(b.parsedDateParts,function(a){return null!=a});a._isValid=!isNaN(a._d.getTime())&&b.overflow<0&&!b.empty&&!b.invalidMonth&&!b.invalidWeekday&&!b.nullInput&&!b.invalidFormat&&!b.userInvalidated&&(!b.meridiem||b.meridiem&&c),a._strict&&(a._isValid=a._isValid&&0===b.charsLeftOver&&0===b.unusedTokens.length&&void 0===b.bigHour)}return a._isValid}function n(a){var b=j(NaN);return null!=a?i(l(b),a):l(b).userInvalidated=!0,b}function o(a){return void 0===a}function p(a,b){var c,d,e;if(o(b._isAMomentObject)||(a._isAMomentObject=b._isAMomentObject),o(b._i)||(a._i=b._i),o(b._f)||(a._f=b._f),o(b._l)||(a._l=b._l),o(b._strict)||(a._strict=b._strict),o(b._tzm)||(a._tzm=b._tzm),o(b._isUTC)||(a._isUTC=b._isUTC),o(b._offset)||(a._offset=b._offset),o(b._pf)||(a._pf=l(b)),o(b._locale)||(a._locale=b._locale),od.length>0)for(c in od)d=od[c],e=b[d],o(e)||(a[d]=e);return a} |
|||
// Moment prototype object
|
|||
function q(b){p(this,b),this._d=new Date(null!=b._d?b._d.getTime():NaN),pd===!1&&(pd=!0,a.updateOffset(this),pd=!1)}function r(a){return a instanceof q||null!=a&&null!=a._isAMomentObject}function s(a){return 0>a?Math.ceil(a)||0:Math.floor(a)}function t(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=s(b)),c} |
|||
// compare two arrays, return the number of differences
|
|||
function u(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&t(a[d])!==t(b[d]))&&g++;return g+f}function v(b){a.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function w(b,c){var d=!0;return i(function(){return null!=a.deprecationHandler&&a.deprecationHandler(null,b),d&&(v(b+"\nArguments: "+Array.prototype.slice.call(arguments).join(", ")+"\n"+(new Error).stack),d=!1),c.apply(this,arguments)},c)}function x(b,c){null!=a.deprecationHandler&&a.deprecationHandler(b,c),qd[b]||(v(c),qd[b]=!0)}function y(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}function z(a){var b,c;for(c in a)b=a[c],y(b)?this[c]=b:this["_"+c]=b;this._config=a, |
|||
// Lenient ordinal parsing accepts just a number in addition to
|
|||
// number + (possibly) stuff coming from _ordinalParseLenient.
|
|||
this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function A(a,b){var c,e=i({},a);for(c in b)h(b,c)&&(d(a[c])&&d(b[c])?(e[c]={},i(e[c],a[c]),i(e[c],b[c])):null!=b[c]?e[c]=b[c]:delete e[c]);for(c in a)h(a,c)&&!h(b,c)&&d(a[c])&&( |
|||
// make sure changes to properties don't modify parent config
|
|||
e[c]=i({},e[c]));return e}function B(a){null!=a&&this.set(a)}function C(a,b,c){var d=this._calendar[a]||this._calendar.sameElse;return y(d)?d.call(b,c):d}function D(a){var b=this._longDateFormat[a],c=this._longDateFormat[a.toUpperCase()];return b||!c?b:(this._longDateFormat[a]=c.replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a])}function E(){return this._invalidDate}function F(a){return this._ordinal.replace("%d",a)}function G(a,b,c,d){var e=this._relativeTime[c];return y(e)?e(a,b,c,d):e.replace(/%d/i,a)}function H(a,b){var c=this._relativeTime[a>0?"future":"past"];return y(c)?c(b):c.replace(/%s/i,b)}function I(a,b){var c=a.toLowerCase();zd[c]=zd[c+"s"]=zd[b]=a}function J(a){return"string"==typeof a?zd[a]||zd[a.toLowerCase()]:void 0}function K(a){var b,c,d={};for(c in a)h(a,c)&&(b=J(c),b&&(d[b]=a[c]));return d}function L(a,b){Ad[a]=b}function M(a){var b=[];for(var c in a)b.push({unit:c,priority:Ad[c]});return b.sort(function(a,b){return a.priority-b.priority}),b}function N(b,c){return function(d){return null!=d?(P(this,b,d),a.updateOffset(this,c),this):O(this,b)}}function O(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function P(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)} |
|||
// MOMENTS
|
|||
function Q(a){return a=J(a),y(this[a])?this[a]():this}function R(a,b){if("object"==typeof a){a=K(a);for(var c=M(a),d=0;d<c.length;d++)this[c[d].unit](a[c[d].unit])}else if(a=J(a),y(this[a]))return this[a](b);return this}function S(a,b,c){var d=""+Math.abs(a),e=b-d.length,f=a>=0;return(f?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d} |
|||
// token: 'M'
|
|||
// padded: ['MM', 2]
|
|||
// ordinal: 'Mo'
|
|||
// callback: function () { this.month() + 1 }
|
|||
function T(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(Ed[a]=e),b&&(Ed[b[0]]=function(){return S(e.apply(this,arguments),b[1],b[2])}),c&&(Ed[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function U(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function V(a){var b,c,d=a.match(Bd);for(b=0,c=d.length;c>b;b++)Ed[d[b]]?d[b]=Ed[d[b]]:d[b]=U(d[b]);return function(b){var e,f="";for(e=0;c>e;e++)f+=d[e]instanceof Function?d[e].call(b,a):d[e];return f}} |
|||
// format date using native date object
|
|||
function W(a,b){return a.isValid()?(b=X(b,a.localeData()),Dd[b]=Dd[b]||V(b),Dd[b](a)):a.localeData().invalidDate()}function X(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Cd.lastIndex=0;d>=0&&Cd.test(a);)a=a.replace(Cd,c),Cd.lastIndex=0,d-=1;return a}function Y(a,b,c){Wd[a]=y(b)?b:function(a,d){return a&&c?c:b}}function Z(a,b){return h(Wd,a)?Wd[a](b._strict,b._locale):new RegExp($(a))} |
|||
// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
|
|||
function $(a){return _(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function _(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function aa(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),"number"==typeof b&&(d=function(a,c){c[b]=t(a)}),c=0;c<a.length;c++)Xd[a[c]]=d}function ba(a,b){aa(a,function(a,c,d,e){d._w=d._w||{},b(a,d._w,d,e)})}function ca(a,b,c){null!=b&&h(Xd,a)&&Xd[a](b,c._a,c,a)}function da(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function ea(a,b){return c(this._months)?this._months[a.month()]:this._months[(this._months.isFormat||fe).test(b)?"format":"standalone"][a.month()]}function fa(a,b){return c(this._monthsShort)?this._monthsShort[a.month()]:this._monthsShort[fe.test(b)?"format":"standalone"][a.month()]}function ga(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._monthsParse)for( |
|||
// this is not used
|
|||
this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],d=0;12>d;++d)f=j([2e3,d]),this._shortMonthsParse[d]=this.monthsShort(f,"").toLocaleLowerCase(),this._longMonthsParse[d]=this.months(f,"").toLocaleLowerCase();return c?"MMM"===b?(e=sd.call(this._shortMonthsParse,g),-1!==e?e:null):(e=sd.call(this._longMonthsParse,g),-1!==e?e:null):"MMM"===b?(e=sd.call(this._shortMonthsParse,g),-1!==e?e:(e=sd.call(this._longMonthsParse,g),-1!==e?e:null)):(e=sd.call(this._longMonthsParse,g),-1!==e?e:(e=sd.call(this._shortMonthsParse,g),-1!==e?e:null))}function ha(a,b,c){var d,e,f;if(this._monthsParseExact)return ga.call(this,a,b,c); |
|||
// TODO: add sorting
|
|||
// Sorting makes sure if one month (or abbr) is a prefix of another
|
|||
// see sorting in computeMonthsParse
|
|||
for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){ |
|||
// test the regex
|
|||
if(e=j([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}} |
|||
// MOMENTS
|
|||
function ia(a,b){var c;if(!a.isValid()) |
|||
// No op
|
|||
return a;if("string"==typeof b)if(/^\d+$/.test(b))b=t(b);else |
|||
// TODO: Another silent failure?
|
|||
if(b=a.localeData().monthsParse(b),"number"!=typeof b)return a;return c=Math.min(a.date(),da(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a}function ja(b){return null!=b?(ia(this,b),a.updateOffset(this,!0),this):O(this,"Month")}function ka(){return da(this.year(),this.month())}function la(a){return this._monthsParseExact?(h(this,"_monthsRegex")||na.call(this),a?this._monthsShortStrictRegex:this._monthsShortRegex):(h(this,"_monthsShortRegex")||(this._monthsShortRegex=ie),this._monthsShortStrictRegex&&a?this._monthsShortStrictRegex:this._monthsShortRegex)}function ma(a){return this._monthsParseExact?(h(this,"_monthsRegex")||na.call(this),a?this._monthsStrictRegex:this._monthsRegex):(h(this,"_monthsRegex")||(this._monthsRegex=je),this._monthsStrictRegex&&a?this._monthsStrictRegex:this._monthsRegex)}function na(){function a(a,b){return b.length-a.length}var b,c,d=[],e=[],f=[];for(b=0;12>b;b++)c=j([2e3,b]),d.push(this.monthsShort(c,"")),e.push(this.months(c,"")),f.push(this.months(c,"")),f.push(this.monthsShort(c,""));for( |
|||
// Sorting makes sure if one month (or abbr) is a prefix of another it
|
|||
// will match the longer piece.
|
|||
d.sort(a),e.sort(a),f.sort(a),b=0;12>b;b++)d[b]=_(d[b]),e[b]=_(e[b]);for(b=0;24>b;b++)f[b]=_(f[b]);this._monthsRegex=new RegExp("^("+f.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+e.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+d.join("|")+")","i")} |
|||
// HELPERS
|
|||
function oa(a){return pa(a)?366:365}function pa(a){return a%4===0&&a%100!==0||a%400===0}function qa(){return pa(this.year())}function ra(a,b,c,d,e,f,g){ |
|||
//can't just apply() to create a date:
|
|||
//http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
|
|||
var h=new Date(a,b,c,d,e,f,g); |
|||
//the date constructor remaps years 0-99 to 1900-1999
|
|||
return 100>a&&a>=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function sa(a){var b=new Date(Date.UTC.apply(null,arguments)); |
|||
//the Date.UTC function remaps years 0-99 to 1900-1999
|
|||
return 100>a&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b} |
|||
// start-of-first-week - start-of-year
|
|||
function ta(a,b,c){var// first-week day -- which january is always in the first week (4 for iso, 1 for other)
|
|||
d=7+b-c, |
|||
// first-week day local weekday -- which local weekday is fwd
|
|||
e=(7+sa(a,0,d).getUTCDay()-b)%7;return-e+d-1} |
|||
//http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
|
|||
function ua(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=ta(a,d,e),j=1+7*(b-1)+h+i;return 0>=j?(f=a-1,g=oa(f)+j):j>oa(a)?(f=a+1,g=j-oa(a)):(f=a,g=j),{year:f,dayOfYear:g}}function va(a,b,c){var d,e,f=ta(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return 1>g?(e=a.year()-1,d=g+wa(e,b,c)):g>wa(a.year(),b,c)?(d=g-wa(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function wa(a,b,c){var d=ta(a,b,c),e=ta(a+1,b,c);return(oa(a)-d+e)/7} |
|||
// HELPERS
|
|||
// LOCALES
|
|||
function xa(a){return va(a,this._week.dow,this._week.doy).week}function ya(){return this._week.dow}function za(){return this._week.doy} |
|||
// MOMENTS
|
|||
function Aa(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function Ba(a){var b=va(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")} |
|||
// HELPERS
|
|||
function Ca(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function Da(a,b){return"string"==typeof a?b.weekdaysParse(a)%7||7:isNaN(a)?null:a}function Ea(a,b){return c(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?"format":"standalone"][a.day()]}function Fa(a){return this._weekdaysShort[a.day()]}function Ga(a){return this._weekdaysMin[a.day()]}function Ha(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],d=0;7>d;++d)f=j([2e3,1]).day(d),this._minWeekdaysParse[d]=this.weekdaysMin(f,"").toLocaleLowerCase(),this._shortWeekdaysParse[d]=this.weekdaysShort(f,"").toLocaleLowerCase(),this._weekdaysParse[d]=this.weekdays(f,"").toLocaleLowerCase();return c?"dddd"===b?(e=sd.call(this._weekdaysParse,g),-1!==e?e:null):"ddd"===b?(e=sd.call(this._shortWeekdaysParse,g),-1!==e?e:null):(e=sd.call(this._minWeekdaysParse,g),-1!==e?e:null):"dddd"===b?(e=sd.call(this._weekdaysParse,g),-1!==e?e:(e=sd.call(this._shortWeekdaysParse,g),-1!==e?e:(e=sd.call(this._minWeekdaysParse,g),-1!==e?e:null))):"ddd"===b?(e=sd.call(this._shortWeekdaysParse,g),-1!==e?e:(e=sd.call(this._weekdaysParse,g),-1!==e?e:(e=sd.call(this._minWeekdaysParse,g),-1!==e?e:null))):(e=sd.call(this._minWeekdaysParse,g),-1!==e?e:(e=sd.call(this._weekdaysParse,g),-1!==e?e:(e=sd.call(this._shortWeekdaysParse,g),-1!==e?e:null)))}function Ia(a,b,c){var d,e,f;if(this._weekdaysParseExact)return Ha.call(this,a,b,c);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;7>d;d++){ |
|||
// test the regex
|
|||
if(e=j([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}} |
|||
// MOMENTS
|
|||
function Ja(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Ca(a,this.localeData()),this.add(a-b,"d")):b}function Ka(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function La(a){if(!this.isValid())return null!=a?this:NaN; |
|||
// behaves the same as moment#day except
|
|||
// as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
|
|||
// as a setter, sunday should belong to the previous week.
|
|||
if(null!=a){var b=Da(a,this.localeData());return this.day(this.day()%7?b:b-7)}return this.day()||7}function Ma(a){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||Pa.call(this),a?this._weekdaysStrictRegex:this._weekdaysRegex):(h(this,"_weekdaysRegex")||(this._weekdaysRegex=pe),this._weekdaysStrictRegex&&a?this._weekdaysStrictRegex:this._weekdaysRegex)}function Na(a){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||Pa.call(this),a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(h(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=qe),this._weekdaysShortStrictRegex&&a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Oa(a){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||Pa.call(this),a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(h(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=re),this._weekdaysMinStrictRegex&&a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Pa(){function a(a,b){return b.length-a.length}var b,c,d,e,f,g=[],h=[],i=[],k=[];for(b=0;7>b;b++)c=j([2e3,1]).day(b),d=this.weekdaysMin(c,""),e=this.weekdaysShort(c,""),f=this.weekdays(c,""),g.push(d),h.push(e),i.push(f),k.push(d),k.push(e),k.push(f);for( |
|||
// Sorting makes sure if one weekday (or abbr) is a prefix of another it
|
|||
// will match the longer piece.
|
|||
g.sort(a),h.sort(a),i.sort(a),k.sort(a),b=0;7>b;b++)h[b]=_(h[b]),i[b]=_(i[b]),k[b]=_(k[b]);this._weekdaysRegex=new RegExp("^("+k.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+g.join("|")+")","i")} |
|||
// FORMATTING
|
|||
function Qa(){return this.hours()%12||12}function Ra(){return this.hours()||24}function Sa(a,b){T(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})} |
|||
// PARSING
|
|||
function Ta(a,b){return b._meridiemParse} |
|||
// LOCALES
|
|||
function Ua(a){ |
|||
// IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
|
|||
// Using charAt should be more compatible.
|
|||
return"p"===(a+"").toLowerCase().charAt(0)}function Va(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function Wa(a){return a?a.toLowerCase().replace("_","-"):a} |
|||
// pick the locale from the array
|
|||
// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
|
|||
// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
|
|||
function Xa(a){for(var b,c,d,e,f=0;f<a.length;){for(e=Wa(a[f]).split("-"),b=e.length,c=Wa(a[f+1]),c=c?c.split("-"):null;b>0;){if(d=Ya(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&u(e,c,!0)>=b-1) |
|||
//the next array item is better than a shallower substring of this one
|
|||
break;b--}f++}return null}function Ya(a){var b=null; |
|||
// TODO: Find a better way to register and load all the locales in Node
|
|||
if(!we[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=se._abbr,require("./locale/"+a), |
|||
// because defineLocale currently also sets the global locale, we
|
|||
// want to undo that for lazy loaded locales
|
|||
Za(b)}catch(c){}return we[a]} |
|||
// This function will load locale and then set the global locale. If
|
|||
// no arguments are passed in, it will simply return the current global
|
|||
// locale key.
|
|||
function Za(a,b){var c; |
|||
// moment.duration._locale = moment._locale = data;
|
|||
return a&&(c=o(b)?ab(a):$a(a,b),c&&(se=c)),se._abbr}function $a(a,b){if(null!==b){var c=ve; |
|||
// treat as if there is no base config
|
|||
// backwards compat for now: also set the locale
|
|||
return b.abbr=a,null!=we[a]?(x("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),c=we[a]._config):null!=b.parentLocale&&(null!=we[b.parentLocale]?c=we[b.parentLocale]._config:x("parentLocaleUndefined","specified parentLocale is not defined yet. See http://momentjs.com/guides/#/warnings/parent-locale/")),we[a]=new B(A(c,b)),Za(a),we[a]} |
|||
// useful for testing
|
|||
return delete we[a],null}function _a(a,b){if(null!=b){var c,d=ve; |
|||
// MERGE
|
|||
null!=we[a]&&(d=we[a]._config),b=A(d,b),c=new B(b),c.parentLocale=we[a],we[a]=c, |
|||
// backwards compat for now: also set the locale
|
|||
Za(a)}else |
|||
// pass null for config to unupdate, useful for tests
|
|||
null!=we[a]&&(null!=we[a].parentLocale?we[a]=we[a].parentLocale:null!=we[a]&&delete we[a]);return we[a]} |
|||
// returns locale data
|
|||
function ab(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return se;if(!c(a)){if(b=Ya(a))return b;a=[a]}return Xa(a)}function bb(){return rd(we)}function cb(a){var b,c=a._a;return c&&-2===l(a).overflow&&(b=c[Zd]<0||c[Zd]>11?Zd:c[$d]<1||c[$d]>da(c[Yd],c[Zd])?$d:c[_d]<0||c[_d]>24||24===c[_d]&&(0!==c[ae]||0!==c[be]||0!==c[ce])?_d:c[ae]<0||c[ae]>59?ae:c[be]<0||c[be]>59?be:c[ce]<0||c[ce]>999?ce:-1,l(a)._overflowDayOfYear&&(Yd>b||b>$d)&&(b=$d),l(a)._overflowWeeks&&-1===b&&(b=de),l(a)._overflowWeekday&&-1===b&&(b=ee),l(a).overflow=b),a} |
|||
// date from iso format
|
|||
function db(a){var b,c,d,e,f,g,h=a._i,i=xe.exec(h)||ye.exec(h);if(i){for(l(a).iso=!0,b=0,c=Ae.length;c>b;b++)if(Ae[b][1].exec(i[1])){e=Ae[b][0],d=Ae[b][2]!==!1;break}if(null==e)return void(a._isValid=!1);if(i[3]){for(b=0,c=Be.length;c>b;b++)if(Be[b][1].exec(i[3])){ |
|||
// match[2] should be 'T' or space
|
|||
f=(i[2]||" ")+Be[b][0];break}if(null==f)return void(a._isValid=!1)}if(!d&&null!=f)return void(a._isValid=!1);if(i[4]){if(!ze.exec(i[4]))return void(a._isValid=!1);g="Z"}a._f=e+(f||"")+(g||""),jb(a)}else a._isValid=!1} |
|||
// date from iso format or fallback
|
|||
function eb(b){var c=Ce.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(db(b),void(b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b))))} |
|||
// Pick the first defined of two or three arguments.
|
|||
function fb(a,b,c){return null!=a?a:null!=b?b:c}function gb(b){ |
|||
// hooks is actually the exported moment object
|
|||
var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]} |
|||
// convert an array to a date.
|
|||
// the array should mirror the parameters below
|
|||
// note: all values past the year are optional and will default to the lowest possible value.
|
|||
// [year, month, day , hour, minute, second, millisecond]
|
|||
function hb(a){var b,c,d,e,f=[];if(!a._d){ |
|||
// Default to current date.
|
|||
// * if no year, month, day of month are given, default to today
|
|||
// * if day of month is given, default month and year
|
|||
// * if month is given, default only year
|
|||
// * if year is given, don't default anything
|
|||
for(d=gb(a),a._w&&null==a._a[$d]&&null==a._a[Zd]&&ib(a),a._dayOfYear&&(e=fb(a._a[Yd],d[Yd]),a._dayOfYear>oa(e)&&(l(a)._overflowDayOfYear=!0),c=sa(e,0,a._dayOfYear),a._a[Zd]=c.getUTCMonth(),a._a[$d]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=f[b]=d[b]; |
|||
// Zero out whatever was not defaulted, including time
|
|||
for(;7>b;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b]; |
|||
// Check for 24:00:00.000
|
|||
24===a._a[_d]&&0===a._a[ae]&&0===a._a[be]&&0===a._a[ce]&&(a._nextDay=!0,a._a[_d]=0),a._d=(a._useUTC?sa:ra).apply(null,f), |
|||
// Apply timezone offset from input. The actual utcOffset can be changed
|
|||
// with parseZone.
|
|||
null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[_d]=24)}}function ib(a){var b,c,d,e,f,g,h,i;b=a._w,null!=b.GG||null!=b.W||null!=b.E?(f=1,g=4,c=fb(b.GG,a._a[Yd],va(rb(),1,4).year),d=fb(b.W,1),e=fb(b.E,1),(1>e||e>7)&&(i=!0)):(f=a._locale._week.dow,g=a._locale._week.doy,c=fb(b.gg,a._a[Yd],va(rb(),f,g).year),d=fb(b.w,1),null!=b.d?(e=b.d,(0>e||e>6)&&(i=!0)):null!=b.e?(e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):e=f),1>d||d>wa(c,f,g)?l(a)._overflowWeeks=!0:null!=i?l(a)._overflowWeekday=!0:(h=ua(c,d,e,f,g),a._a[Yd]=h.year,a._dayOfYear=h.dayOfYear)} |
|||
// date from string and format string
|
|||
function jb(b){ |
|||
// TODO: Move this to another part of the creation flow to prevent circular deps
|
|||
if(b._f===a.ISO_8601)return void db(b);b._a=[],l(b).empty=!0; |
|||
// This array is used to make a Date, either with `new Date` or `Date.UTC`
|
|||
var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=X(b._f,b._locale).match(Bd)||[],c=0;c<e.length;c++)f=e[c],d=(h.match(Z(f,b))||[])[0],d&&(g=h.substr(0,h.indexOf(d)),g.length>0&&l(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),Ed[f]?(d?l(b).empty=!1:l(b).unusedTokens.push(f),ca(f,d,b)):b._strict&&!d&&l(b).unusedTokens.push(f); |
|||
// add remaining unparsed input length to the string
|
|||
l(b).charsLeftOver=i-j,h.length>0&&l(b).unusedInput.push(h), |
|||
// clear _12h flag if hour is <= 12
|
|||
b._a[_d]<=12&&l(b).bigHour===!0&&b._a[_d]>0&&(l(b).bigHour=void 0),l(b).parsedDateParts=b._a.slice(0),l(b).meridiem=b._meridiem, |
|||
// handle meridiem
|
|||
b._a[_d]=kb(b._locale,b._a[_d],b._meridiem),hb(b),cb(b)}function kb(a,b,c){var d; |
|||
// Fallback
|
|||
return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b} |
|||
// date from string and array of format strings
|
|||
function lb(a){var b,c,d,e,f;if(0===a._f.length)return l(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;e<a._f.length;e++)f=0,b=p({},a),null!=a._useUTC&&(b._useUTC=a._useUTC),b._f=a._f[e],jb(b),m(b)&&(f+=l(b).charsLeftOver,f+=10*l(b).unusedTokens.length,l(b).score=f,(null==d||d>f)&&(d=f,c=b));i(a,c||b)}function mb(a){if(!a._d){var b=K(a._i);a._a=g([b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],function(a){return a&&parseInt(a,10)}),hb(a)}}function nb(a){var b=new q(cb(ob(a))); |
|||
// Adding is smart enough around DST
|
|||
return b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b}function ob(a){var b=a._i,d=a._f;return a._locale=a._locale||ab(a._l),null===b||void 0===d&&""===b?n({nullInput:!0}):("string"==typeof b&&(a._i=b=a._locale.preparse(b)),r(b)?new q(cb(b)):(c(d)?lb(a):f(b)?a._d=b:d?jb(a):pb(a),m(a)||(a._d=null),a))}function pb(b){var d=b._i;void 0===d?b._d=new Date(a.now()):f(d)?b._d=new Date(d.valueOf()):"string"==typeof d?eb(b):c(d)?(b._a=g(d.slice(0),function(a){return parseInt(a,10)}),hb(b)):"object"==typeof d?mb(b):"number"==typeof d? |
|||
// from milliseconds
|
|||
b._d=new Date(d):a.createFromInputFallback(b)}function qb(a,b,f,g,h){var i={}; |
|||
// object construction must be done this way.
|
|||
// https://github.com/moment/moment/issues/1423
|
|||
return"boolean"==typeof f&&(g=f,f=void 0),(d(a)&&e(a)||c(a)&&0===a.length)&&(a=void 0),i._isAMomentObject=!0,i._useUTC=i._isUTC=h,i._l=f,i._i=a,i._f=b,i._strict=g,nb(i)}function rb(a,b,c,d){return qb(a,b,c,d,!1)} |
|||
// Pick a moment m from moments so that m[fn](other) is true for all
|
|||
// other. This relies on the function fn to be transitive.
|
|||
//
|
|||
// moments should either be an array of moment objects or an array, whose
|
|||
// first element is an array of moment objects.
|
|||
function sb(a,b){var d,e;if(1===b.length&&c(b[0])&&(b=b[0]),!b.length)return rb();for(d=b[0],e=1;e<b.length;++e)b[e].isValid()&&!b[e][a](d)||(d=b[e]);return d} |
|||
// TODO: Use [].sort instead?
|
|||
function tb(){var a=[].slice.call(arguments,0);return sb("isBefore",a)}function ub(){var a=[].slice.call(arguments,0);return sb("isAfter",a)}function vb(a){var b=K(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0; |
|||
// representation for dateAddRemove
|
|||
this._milliseconds=+k+1e3*j+// 1000
|
|||
6e4*i+// 1000 * 60
|
|||
1e3*h*60*60,//using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
|
|||
// Because of dateAddRemove treats 24 hours as different from a
|
|||
// day when working around DST, we need to store them separately
|
|||
this._days=+g+7*f, |
|||
// It is impossible translate months into days without knowing
|
|||
// which months you are are talking about, so we have to store
|
|||
// it separately.
|
|||
this._months=+e+3*d+12*c,this._data={},this._locale=ab(),this._bubble()}function wb(a){return a instanceof vb} |
|||
// FORMATTING
|
|||
function xb(a,b){T(a,0,0,function(){var a=this.utcOffset(),c="+";return 0>a&&(a=-a,c="-"),c+S(~~(a/60),2)+b+S(~~a%60,2)})}function yb(a,b){var c=(b||"").match(a)||[],d=c[c.length-1]||[],e=(d+"").match(Ge)||["-",0,0],f=+(60*e[1])+t(e[2]);return"+"===e[0]?f:-f} |
|||
// Return a moment from input, that is local/utc/zone equivalent to model.
|
|||
function zb(b,c){var d,e; |
|||
// Use low-level api, because this fn is low-level api.
|
|||
return c._isUTC?(d=c.clone(),e=(r(b)||f(b)?b.valueOf():rb(b).valueOf())-d.valueOf(),d._d.setTime(d._d.valueOf()+e),a.updateOffset(d,!1),d):rb(b).local()}function Ab(a){ |
|||
// On Firefox.24 Date#getTimezoneOffset returns a floating point.
|
|||
// https://github.com/moment/moment/pull/1871
|
|||
return 15*-Math.round(a._d.getTimezoneOffset()/15)} |
|||
// MOMENTS
|
|||
// keepLocalTime = true means only change the timezone, without
|
|||
// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
|
|||
// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
|
|||
// +0200, so we adjust the time as needed, to be valid.
|
|||
//
|
|||
// Keeping the time actually adds/subtracts (one hour)
|
|||
// from the actual represented time. That is why we call updateOffset
|
|||
// a second time. In case it wants us to change the offset again
|
|||
// _changeInProgress == true case, then we have to adjust, because
|
|||
// there is no such time in the given timezone.
|
|||
function Bb(b,c){var d,e=this._offset||0;return this.isValid()?null!=b?("string"==typeof b?b=yb(Td,b):Math.abs(b)<16&&(b=60*b),!this._isUTC&&c&&(d=Ab(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,"m"),e!==b&&(!c||this._changeInProgress?Sb(this,Mb(b-e,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?e:Ab(this):null!=b?this:NaN}function Cb(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function Db(a){return this.utcOffset(0,a)}function Eb(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Ab(this),"m")),this}function Fb(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(yb(Sd,this._i)),this}function Gb(a){return this.isValid()?(a=a?rb(a).utcOffset():0,(this.utcOffset()-a)%60===0):!1}function Hb(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ib(){if(!o(this._isDSTShifted))return this._isDSTShifted;var a={};if(p(a,this),a=ob(a),a._a){var b=a._isUTC?j(a._a):rb(a._a);this._isDSTShifted=this.isValid()&&u(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Jb(){return this.isValid()?!this._isUTC:!1}function Kb(){return this.isValid()?this._isUTC:!1}function Lb(){return this.isValid()?this._isUTC&&0===this._offset:!1}function Mb(a,b){var c,d,e,f=a, |
|||
// matching against regexp is expensive, do it on demand
|
|||
g=null;// checks for null or undefined
|
|||
return wb(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(g=He.exec(a))?(c="-"===g[1]?-1:1,f={y:0,d:t(g[$d])*c,h:t(g[_d])*c,m:t(g[ae])*c,s:t(g[be])*c,ms:t(g[ce])*c}):(g=Ie.exec(a))?(c="-"===g[1]?-1:1,f={y:Nb(g[2],c),M:Nb(g[3],c),w:Nb(g[4],c),d:Nb(g[5],c),h:Nb(g[6],c),m:Nb(g[7],c),s:Nb(g[8],c)}):null==f?f={}:"object"==typeof f&&("from"in f||"to"in f)&&(e=Pb(rb(f.from),rb(f.to)),f={},f.ms=e.milliseconds,f.M=e.months),d=new vb(f),wb(a)&&h(a,"_locale")&&(d._locale=a._locale),d}function Nb(a,b){ |
|||
// We'd normally use ~~inp for this, but unfortunately it also
|
|||
// converts floats to ints.
|
|||
// inp may be undefined, so careful calling replace on it.
|
|||
var c=a&&parseFloat(a.replace(",",".")); |
|||
// apply sign while we're at it
|
|||
return(isNaN(c)?0:c)*b}function Ob(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function Pb(a,b){var c;return a.isValid()&&b.isValid()?(b=zb(b,a),a.isBefore(b)?c=Ob(a,b):(c=Ob(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}function Qb(a){return 0>a?-1*Math.round(-1*a):Math.round(a)} |
|||
// TODO: remove 'name' arg after deprecation is removed
|
|||
function Rb(a,b){return function(c,d){var e,f; |
|||
//invert the arguments, but complain about it
|
|||
return null===d||isNaN(+d)||(x(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Mb(c,d),Sb(this,e,a),this}}function Sb(b,c,d,e){var f=c._milliseconds,g=Qb(c._days),h=Qb(c._months);b.isValid()&&(e=null==e?!0:e,f&&b._d.setTime(b._d.valueOf()+f*d),g&&P(b,"Date",O(b,"Date")+g*d),h&&ia(b,O(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function Tb(a,b){var c=a.diff(b,"days",!0);return-6>c?"sameElse":-1>c?"lastWeek":0>c?"lastDay":1>c?"sameDay":2>c?"nextDay":7>c?"nextWeek":"sameElse"}function Ub(b,c){ |
|||
// We want to compare the start of today, vs this.
|
|||
// Getting start-of-today depends on whether we're local/utc/offset or not.
|
|||
var d=b||rb(),e=zb(d,this).startOf("day"),f=a.calendarFormat(this,e)||"sameElse",g=c&&(y(c[f])?c[f].call(this,d):c[f]);return this.format(g||this.localeData().calendar(f,this,rb(d)))}function Vb(){return new q(this)}function Wb(a,b){var c=r(a)?a:rb(a);return this.isValid()&&c.isValid()?(b=J(o(b)?"millisecond":b),"millisecond"===b?this.valueOf()>c.valueOf():c.valueOf()<this.clone().startOf(b).valueOf()):!1}function Xb(a,b){var c=r(a)?a:rb(a);return this.isValid()&&c.isValid()?(b=J(o(b)?"millisecond":b),"millisecond"===b?this.valueOf()<c.valueOf():this.clone().endOf(b).valueOf()<c.valueOf()):!1}function Yb(a,b,c,d){return d=d||"()",("("===d[0]?this.isAfter(a,c):!this.isBefore(a,c))&&(")"===d[1]?this.isBefore(b,c):!this.isAfter(b,c))}function Zb(a,b){var c,d=r(a)?a:rb(a);return this.isValid()&&d.isValid()?(b=J(b||"millisecond"),"millisecond"===b?this.valueOf()===d.valueOf():(c=d.valueOf(),this.clone().startOf(b).valueOf()<=c&&c<=this.clone().endOf(b).valueOf())):!1}function $b(a,b){return this.isSame(a,b)||this.isAfter(a,b)}function _b(a,b){return this.isSame(a,b)||this.isBefore(a,b)}function ac(a,b,c){var d,e,f,g;// 1000
|
|||
// 1000 * 60
|
|||
// 1000 * 60 * 60
|
|||
// 1000 * 60 * 60 * 24, negate dst
|
|||
// 1000 * 60 * 60 * 24 * 7, negate dst
|
|||
return this.isValid()?(d=zb(a,this),d.isValid()?(e=6e4*(d.utcOffset()-this.utcOffset()),b=J(b),"year"===b||"month"===b||"quarter"===b?(g=bc(this,d),"quarter"===b?g/=3:"year"===b&&(g/=12)):(f=this-d,g="second"===b?f/1e3:"minute"===b?f/6e4:"hour"===b?f/36e5:"day"===b?(f-e)/864e5:"week"===b?(f-e)/6048e5:f),c?g:s(g)):NaN):NaN}function bc(a,b){ |
|||
// difference in months
|
|||
var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()), |
|||
// b is in (anchor - 1 month, anchor + 1 month)
|
|||
f=a.clone().add(e,"months"); |
|||
//check for negative zero, return zero if negative zero
|
|||
// linear across the month
|
|||
// linear across the month
|
|||
return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)||0}function cc(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function dc(){var a=this.clone().utc();return 0<a.year()&&a.year()<=9999?y(Date.prototype.toISOString)?this.toDate().toISOString():W(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):W(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function ec(b){b||(b=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var c=W(this,b);return this.localeData().postformat(c)}function fc(a,b){return this.isValid()&&(r(a)&&a.isValid()||rb(a).isValid())?Mb({to:this,from:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function gc(a){return this.from(rb(),a)}function hc(a,b){return this.isValid()&&(r(a)&&a.isValid()||rb(a).isValid())?Mb({from:this,to:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function ic(a){return this.to(rb(),a)} |
|||
// If passed a locale key, it will set the locale for this
|
|||
// instance. Otherwise, it will return the locale configuration
|
|||
// variables for this instance.
|
|||
function jc(a){var b;return void 0===a?this._locale._abbr:(b=ab(a),null!=b&&(this._locale=b),this)}function kc(){return this._locale}function lc(a){ |
|||
// the following switch intentionally omits break keywords
|
|||
// to utilize falling through the cases.
|
|||
switch(a=J(a)){case"year":this.month(0);/* falls through */ |
|||
case"quarter":case"month":this.date(1);/* falls through */ |
|||
case"week":case"isoWeek":case"day":case"date":this.hours(0);/* falls through */ |
|||
case"hour":this.minutes(0);/* falls through */ |
|||
case"minute":this.seconds(0);/* falls through */ |
|||
case"second":this.milliseconds(0)} |
|||
// weeks are a special case
|
|||
// quarters are also special
|
|||
return"week"===a&&this.weekday(0),"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this}function mc(a){ |
|||
// 'date' is an alias for 'day', so it should be considered as such.
|
|||
return a=J(a),void 0===a||"millisecond"===a?this:("date"===a&&(a="day"),this.startOf(a).add(1,"isoWeek"===a?"week":a).subtract(1,"ms"))}function nc(){return this._d.valueOf()-6e4*(this._offset||0)}function oc(){return Math.floor(this.valueOf()/1e3)}function pc(){return new Date(this.valueOf())}function qc(){var a=this;return[a.year(),a.month(),a.date(),a.hour(),a.minute(),a.second(),a.millisecond()]}function rc(){var a=this;return{years:a.year(),months:a.month(),date:a.date(),hours:a.hours(),minutes:a.minutes(),seconds:a.seconds(),milliseconds:a.milliseconds()}}function sc(){ |
|||
// new Date(NaN).toJSON() === null
|
|||
return this.isValid()?this.toISOString():null}function tc(){return m(this)}function uc(){return i({},l(this))}function vc(){return l(this).overflow}function wc(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function xc(a,b){T(0,[a,a.length],0,b)} |
|||
// MOMENTS
|
|||
function yc(a){return Cc.call(this,a,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function zc(a){return Cc.call(this,a,this.isoWeek(),this.isoWeekday(),1,4)}function Ac(){return wa(this.year(),1,4)}function Bc(){var a=this.localeData()._week;return wa(this.year(),a.dow,a.doy)}function Cc(a,b,c,d,e){var f;return null==a?va(this,d,e).year:(f=wa(a,d,e),b>f&&(b=f),Dc.call(this,a,b,c,d,e))}function Dc(a,b,c,d,e){var f=ua(a,b,c,d,e),g=sa(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this} |
|||
// MOMENTS
|
|||
function Ec(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)} |
|||
// HELPERS
|
|||
// MOMENTS
|
|||
function Fc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function Gc(a,b){b[ce]=t(1e3*("0."+a))} |
|||
// MOMENTS
|
|||
function Hc(){return this._isUTC?"UTC":""}function Ic(){return this._isUTC?"Coordinated Universal Time":""}function Jc(a){return rb(1e3*a)}function Kc(){return rb.apply(null,arguments).parseZone()}function Lc(a){return a}function Mc(a,b,c,d){var e=ab(),f=j().set(d,b);return e[c](f,a)}function Nc(a,b,c){if("number"==typeof a&&(b=a,a=void 0),a=a||"",null!=b)return Mc(a,b,c,"month");var d,e=[];for(d=0;12>d;d++)e[d]=Mc(a,d,c,"month");return e} |
|||
// ()
|
|||
// (5)
|
|||
// (fmt, 5)
|
|||
// (fmt)
|
|||
// (true)
|
|||
// (true, 5)
|
|||
// (true, fmt, 5)
|
|||
// (true, fmt)
|
|||
function Oc(a,b,c,d){"boolean"==typeof a?("number"==typeof b&&(c=b,b=void 0),b=b||""):(b=a,c=b,a=!1,"number"==typeof b&&(c=b,b=void 0),b=b||"");var e=ab(),f=a?e._week.dow:0;if(null!=c)return Mc(b,(c+f)%7,d,"day");var g,h=[];for(g=0;7>g;g++)h[g]=Mc(b,(g+f)%7,d,"day");return h}function Pc(a,b){return Nc(a,b,"months")}function Qc(a,b){return Nc(a,b,"monthsShort")}function Rc(a,b,c){return Oc(a,b,c,"weekdays")}function Sc(a,b,c){return Oc(a,b,c,"weekdaysShort")}function Tc(a,b,c){return Oc(a,b,c,"weekdaysMin")}function Uc(){var a=this._data;return this._milliseconds=Ue(this._milliseconds),this._days=Ue(this._days),this._months=Ue(this._months),a.milliseconds=Ue(a.milliseconds),a.seconds=Ue(a.seconds),a.minutes=Ue(a.minutes),a.hours=Ue(a.hours),a.months=Ue(a.months),a.years=Ue(a.years),this}function Vc(a,b,c,d){var e=Mb(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()} |
|||
// supports only 2.0-style add(1, 's') or add(duration)
|
|||
function Wc(a,b){return Vc(this,a,b,1)} |
|||
// supports only 2.0-style subtract(1, 's') or subtract(duration)
|
|||
function Xc(a,b){return Vc(this,a,b,-1)}function Yc(a){return 0>a?Math.floor(a):Math.ceil(a)}function Zc(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data; |
|||
// if we have a mix of positive and negative values, bubble down first
|
|||
// check: https://github.com/moment/moment/issues/2166
|
|||
// The following code bubbles up values, see the tests for
|
|||
// examples of what that means.
|
|||
// convert days to months
|
|||
// 12 months -> 1 year
|
|||
return f>=0&&g>=0&&h>=0||0>=f&&0>=g&&0>=h||(f+=864e5*Yc(_c(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=s(f/1e3),i.seconds=a%60,b=s(a/60),i.minutes=b%60,c=s(b/60),i.hours=c%24,g+=s(c/24),e=s($c(g)),h+=e,g-=Yc(_c(e)),d=s(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function $c(a){ |
|||
// 400 years have 146097 days (taking into account leap year rules)
|
|||
// 400 years have 12 months === 4800
|
|||
return 4800*a/146097}function _c(a){ |
|||
// the reverse of daysToMonths
|
|||
return 146097*a/4800}function ad(a){var b,c,d=this._milliseconds;if(a=J(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+$c(b),"month"===a?c:c/12;switch(b=this._days+Math.round(_c(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3; |
|||
// Math.floor prevents floating point math errors here
|
|||
case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}} |
|||
// TODO: Use this.as('ms')?
|
|||
function bd(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*t(this._months/12)}function cd(a){return function(){return this.as(a)}}function dd(a){return a=J(a),this[a+"s"]()}function ed(a){return function(){return this._data[a]}}function fd(){return s(this.days()/7)} |
|||
// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
|
|||
function gd(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function hd(a,b,c){var d=Mb(a).abs(),e=jf(d.as("s")),f=jf(d.as("m")),g=jf(d.as("h")),h=jf(d.as("d")),i=jf(d.as("M")),j=jf(d.as("y")),k=e<kf.s&&["s",e]||1>=f&&["m"]||f<kf.m&&["mm",f]||1>=g&&["h"]||g<kf.h&&["hh",g]||1>=h&&["d"]||h<kf.d&&["dd",h]||1>=i&&["M"]||i<kf.M&&["MM",i]||1>=j&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,gd.apply(null,k)} |
|||
// This function allows you to set the rounding function for relative time strings
|
|||
function id(a){return void 0===a?jf:"function"==typeof a?(jf=a,!0):!1} |
|||
// This function allows you to set a threshold for relative time strings
|
|||
function jd(a,b){return void 0===kf[a]?!1:void 0===b?kf[a]:(kf[a]=b,!0)}function kd(a){var b=this.localeData(),c=hd(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function ld(){ |
|||
// for ISO strings we do not use the normal bubbling rules:
|
|||
// * milliseconds bubble up until they become hours
|
|||
// * days do not bubble at all
|
|||
// * months bubble up until they become years
|
|||
// This is because there is no context-free conversion between hours and days
|
|||
// (think of clock changes)
|
|||
// and also not between days and months (28-31 days per month)
|
|||
var a,b,c,d=lf(this._milliseconds)/1e3,e=lf(this._days),f=lf(this._months);a=s(d/60),b=s(a/60),d%=60,a%=60,c=s(f/12),f%=12; |
|||
// inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
|
|||
var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(0>m?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}var md,nd;nd=Array.prototype.some?Array.prototype.some:function(a){for(var b=Object(this),c=b.length>>>0,d=0;c>d;d++)if(d in b&&a.call(this,b[d],d,b))return!0;return!1}; |
|||
// Plugins that add properties should also add the key here (null value),
|
|||
// so we can properly clone ourselves.
|
|||
var od=a.momentProperties=[],pd=!1,qd={};a.suppressDeprecationWarnings=!1,a.deprecationHandler=null;var rd;rd=Object.keys?Object.keys:function(a){var b,c=[];for(b in a)h(a,b)&&c.push(b);return c};var sd,td={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},ud={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},vd="Invalid date",wd="%d",xd=/\d{1,2}/,yd={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},zd={},Ad={},Bd=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Cd=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Dd={},Ed={},Fd=/\d/,Gd=/\d\d/,Hd=/\d{3}/,Id=/\d{4}/,Jd=/[+-]?\d{6}/,Kd=/\d\d?/,Ld=/\d\d\d\d?/,Md=/\d\d\d\d\d\d?/,Nd=/\d{1,3}/,Od=/\d{1,4}/,Pd=/[+-]?\d{1,6}/,Qd=/\d+/,Rd=/[+-]?\d+/,Sd=/Z|[+-]\d\d:?\d\d/gi,Td=/Z|[+-]\d\d(?::?\d\d)?/gi,Ud=/[+-]?\d+(\.\d{1,3})?/,Vd=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Wd={},Xd={},Yd=0,Zd=1,$d=2,_d=3,ae=4,be=5,ce=6,de=7,ee=8;sd=Array.prototype.indexOf?Array.prototype.indexOf:function(a){ |
|||
// I know
|
|||
var b;for(b=0;b<this.length;++b)if(this[b]===a)return b;return-1},T("M",["MM",2],"Mo",function(){return this.month()+1}),T("MMM",0,0,function(a){return this.localeData().monthsShort(this,a)}),T("MMMM",0,0,function(a){return this.localeData().months(this,a)}),I("month","M"),L("month",8),Y("M",Kd),Y("MM",Kd,Gd),Y("MMM",function(a,b){return b.monthsShortRegex(a)}),Y("MMMM",function(a,b){return b.monthsRegex(a)}),aa(["M","MM"],function(a,b){b[Zd]=t(a)-1}),aa(["MMM","MMMM"],function(a,b,c,d){var e=c._locale.monthsParse(a,d,c._strict);null!=e?b[Zd]=e:l(c).invalidMonth=a}); |
|||
// LOCALES
|
|||
var fe=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/,ge="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),he="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),ie=Vd,je=Vd; |
|||
// FORMATTING
|
|||
T("Y",0,0,function(){var a=this.year();return 9999>=a?""+a:"+"+a}),T(0,["YY",2],0,function(){return this.year()%100}),T(0,["YYYY",4],0,"year"),T(0,["YYYYY",5],0,"year"),T(0,["YYYYYY",6,!0],0,"year"), |
|||
// ALIASES
|
|||
I("year","y"), |
|||
// PRIORITIES
|
|||
L("year",1), |
|||
// PARSING
|
|||
Y("Y",Rd),Y("YY",Kd,Gd),Y("YYYY",Od,Id),Y("YYYYY",Pd,Jd),Y("YYYYYY",Pd,Jd),aa(["YYYYY","YYYYYY"],Yd),aa("YYYY",function(b,c){c[Yd]=2===b.length?a.parseTwoDigitYear(b):t(b)}),aa("YY",function(b,c){c[Yd]=a.parseTwoDigitYear(b)}),aa("Y",function(a,b){b[Yd]=parseInt(a,10)}), |
|||
// HOOKS
|
|||
a.parseTwoDigitYear=function(a){return t(a)+(t(a)>68?1900:2e3)}; |
|||
// MOMENTS
|
|||
var ke=N("FullYear",!0); |
|||
// FORMATTING
|
|||
T("w",["ww",2],"wo","week"),T("W",["WW",2],"Wo","isoWeek"), |
|||
// ALIASES
|
|||
I("week","w"),I("isoWeek","W"), |
|||
// PRIORITIES
|
|||
L("week",5),L("isoWeek",5), |
|||
// PARSING
|
|||
Y("w",Kd),Y("ww",Kd,Gd),Y("W",Kd),Y("WW",Kd,Gd),ba(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=t(a)});var le={dow:0,// Sunday is the first day of the week.
|
|||
doy:6}; |
|||
// FORMATTING
|
|||
T("d",0,"do","day"),T("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),T("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),T("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),T("e",0,0,"weekday"),T("E",0,0,"isoWeekday"), |
|||
// ALIASES
|
|||
I("day","d"),I("weekday","e"),I("isoWeekday","E"), |
|||
// PRIORITY
|
|||
L("day",11),L("weekday",11),L("isoWeekday",11), |
|||
// PARSING
|
|||
Y("d",Kd),Y("e",Kd),Y("E",Kd),Y("dd",function(a,b){return b.weekdaysMinRegex(a)}),Y("ddd",function(a,b){return b.weekdaysShortRegex(a)}),Y("dddd",function(a,b){return b.weekdaysRegex(a)}),ba(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict); |
|||
// if we didn't get a weekday name, mark the date as invalid
|
|||
null!=e?b.d=e:l(c).invalidWeekday=a}),ba(["d","e","E"],function(a,b,c,d){b[d]=t(a)}); |
|||
// LOCALES
|
|||
var me="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),ne="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),oe="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),pe=Vd,qe=Vd,re=Vd;T("H",["HH",2],0,"hour"),T("h",["hh",2],0,Qa),T("k",["kk",2],0,Ra),T("hmm",0,0,function(){return""+Qa.apply(this)+S(this.minutes(),2)}),T("hmmss",0,0,function(){return""+Qa.apply(this)+S(this.minutes(),2)+S(this.seconds(),2)}),T("Hmm",0,0,function(){return""+this.hours()+S(this.minutes(),2)}),T("Hmmss",0,0,function(){return""+this.hours()+S(this.minutes(),2)+S(this.seconds(),2)}),Sa("a",!0),Sa("A",!1), |
|||
// ALIASES
|
|||
I("hour","h"), |
|||
// PRIORITY
|
|||
L("hour",13),Y("a",Ta),Y("A",Ta),Y("H",Kd),Y("h",Kd),Y("HH",Kd,Gd),Y("hh",Kd,Gd),Y("hmm",Ld),Y("hmmss",Md),Y("Hmm",Ld),Y("Hmmss",Md),aa(["H","HH"],_d),aa(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),aa(["h","hh"],function(a,b,c){b[_d]=t(a),l(c).bigHour=!0}),aa("hmm",function(a,b,c){var d=a.length-2;b[_d]=t(a.substr(0,d)),b[ae]=t(a.substr(d)),l(c).bigHour=!0}),aa("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[_d]=t(a.substr(0,d)),b[ae]=t(a.substr(d,2)),b[be]=t(a.substr(e)),l(c).bigHour=!0}),aa("Hmm",function(a,b,c){var d=a.length-2;b[_d]=t(a.substr(0,d)),b[ae]=t(a.substr(d))}),aa("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[_d]=t(a.substr(0,d)),b[ae]=t(a.substr(d,2)),b[be]=t(a.substr(e))});var se,te=/[ap]\.?m?\.?/i,ue=N("Hours",!0),ve={calendar:td,longDateFormat:ud,invalidDate:vd,ordinal:wd,ordinalParse:xd,relativeTime:yd,months:ge,monthsShort:he,week:le,weekdays:me,weekdaysMin:oe,weekdaysShort:ne,meridiemParse:te},we={},xe=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,ye=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,ze=/Z|[+-]\d\d(?::?\d\d)?/,Ae=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/], |
|||
// YYYYMM is NOT allowed by the standard
|
|||
["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Be=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Ce=/^\/?Date\((\-?\d+)/i;a.createFromInputFallback=w("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}), |
|||
// constant that refers to the ISO standard
|
|||
a.ISO_8601=function(){};var De=w("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=rb.apply(null,arguments);return this.isValid()&&a.isValid()?this>a?this:a:n()}),Ee=w("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=rb.apply(null,arguments);return this.isValid()&&a.isValid()?a>this?this:a:n()}),Fe=function(){return Date.now?Date.now():+new Date};xb("Z",":"),xb("ZZ",""), |
|||
// PARSING
|
|||
Y("Z",Td),Y("ZZ",Td),aa(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=yb(Td,a)}); |
|||
// HELPERS
|
|||
// timezone chunker
|
|||
// '+10:00' > ['10', '00']
|
|||
// '-1530' > ['-15', '30']
|
|||
var Ge=/([\+\-]|\d\d)/gi; |
|||
// HOOKS
|
|||
// This function will be called whenever a moment is mutated.
|
|||
// It is intended to keep the offset in sync with the timezone.
|
|||
a.updateOffset=function(){}; |
|||
// ASP.NET json date format regex
|
|||
var He=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/,Ie=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Mb.fn=vb.prototype;var Je=Rb(1,"add"),Ke=Rb(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Le=w("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)}); |
|||
// FORMATTING
|
|||
T(0,["gg",2],0,function(){return this.weekYear()%100}),T(0,["GG",2],0,function(){return this.isoWeekYear()%100}),xc("gggg","weekYear"),xc("ggggg","weekYear"),xc("GGGG","isoWeekYear"),xc("GGGGG","isoWeekYear"), |
|||
// ALIASES
|
|||
I("weekYear","gg"),I("isoWeekYear","GG"), |
|||
// PRIORITY
|
|||
L("weekYear",1),L("isoWeekYear",1), |
|||
// PARSING
|
|||
Y("G",Rd),Y("g",Rd),Y("GG",Kd,Gd),Y("gg",Kd,Gd),Y("GGGG",Od,Id),Y("gggg",Od,Id),Y("GGGGG",Pd,Jd),Y("ggggg",Pd,Jd),ba(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=t(a)}),ba(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}), |
|||
// FORMATTING
|
|||
T("Q",0,"Qo","quarter"), |
|||
// ALIASES
|
|||
I("quarter","Q"), |
|||
// PRIORITY
|
|||
L("quarter",7), |
|||
// PARSING
|
|||
Y("Q",Fd),aa("Q",function(a,b){b[Zd]=3*(t(a)-1)}), |
|||
// FORMATTING
|
|||
T("D",["DD",2],"Do","date"), |
|||
// ALIASES
|
|||
I("date","D"), |
|||
// PRIOROITY
|
|||
L("date",9), |
|||
// PARSING
|
|||
Y("D",Kd),Y("DD",Kd,Gd),Y("Do",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),aa(["D","DD"],$d),aa("Do",function(a,b){b[$d]=t(a.match(Kd)[0],10)}); |
|||
// MOMENTS
|
|||
var Me=N("Date",!0); |
|||
// FORMATTING
|
|||
T("DDD",["DDDD",3],"DDDo","dayOfYear"), |
|||
// ALIASES
|
|||
I("dayOfYear","DDD"), |
|||
// PRIORITY
|
|||
L("dayOfYear",4), |
|||
// PARSING
|
|||
Y("DDD",Nd),Y("DDDD",Hd),aa(["DDD","DDDD"],function(a,b,c){c._dayOfYear=t(a)}), |
|||
// FORMATTING
|
|||
T("m",["mm",2],0,"minute"), |
|||
// ALIASES
|
|||
I("minute","m"), |
|||
// PRIORITY
|
|||
L("minute",14), |
|||
// PARSING
|
|||
Y("m",Kd),Y("mm",Kd,Gd),aa(["m","mm"],ae); |
|||
// MOMENTS
|
|||
var Ne=N("Minutes",!1); |
|||
// FORMATTING
|
|||
T("s",["ss",2],0,"second"), |
|||
// ALIASES
|
|||
I("second","s"), |
|||
// PRIORITY
|
|||
L("second",15), |
|||
// PARSING
|
|||
Y("s",Kd),Y("ss",Kd,Gd),aa(["s","ss"],be); |
|||
// MOMENTS
|
|||
var Oe=N("Seconds",!1); |
|||
// FORMATTING
|
|||
T("S",0,0,function(){return~~(this.millisecond()/100)}),T(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),T(0,["SSS",3],0,"millisecond"),T(0,["SSSS",4],0,function(){return 10*this.millisecond()}),T(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),T(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),T(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),T(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),T(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}), |
|||
// ALIASES
|
|||
I("millisecond","ms"), |
|||
// PRIORITY
|
|||
L("millisecond",16), |
|||
// PARSING
|
|||
Y("S",Nd,Fd),Y("SS",Nd,Gd),Y("SSS",Nd,Hd);var Pe;for(Pe="SSSS";Pe.length<=9;Pe+="S")Y(Pe,Qd);for(Pe="S";Pe.length<=9;Pe+="S")aa(Pe,Gc); |
|||
// MOMENTS
|
|||
var Qe=N("Milliseconds",!1); |
|||
// FORMATTING
|
|||
T("z",0,0,"zoneAbbr"),T("zz",0,0,"zoneName");var Re=q.prototype;Re.add=Je,Re.calendar=Ub,Re.clone=Vb,Re.diff=ac,Re.endOf=mc,Re.format=ec,Re.from=fc,Re.fromNow=gc,Re.to=hc,Re.toNow=ic,Re.get=Q,Re.invalidAt=vc,Re.isAfter=Wb,Re.isBefore=Xb,Re.isBetween=Yb,Re.isSame=Zb,Re.isSameOrAfter=$b,Re.isSameOrBefore=_b,Re.isValid=tc,Re.lang=Le,Re.locale=jc,Re.localeData=kc,Re.max=Ee,Re.min=De,Re.parsingFlags=uc,Re.set=R,Re.startOf=lc,Re.subtract=Ke,Re.toArray=qc,Re.toObject=rc,Re.toDate=pc,Re.toISOString=dc,Re.toJSON=sc,Re.toString=cc,Re.unix=oc,Re.valueOf=nc,Re.creationData=wc, |
|||
// Year
|
|||
Re.year=ke,Re.isLeapYear=qa, |
|||
// Week Year
|
|||
Re.weekYear=yc,Re.isoWeekYear=zc, |
|||
// Quarter
|
|||
Re.quarter=Re.quarters=Ec, |
|||
// Month
|
|||
Re.month=ja,Re.daysInMonth=ka, |
|||
// Week
|
|||
Re.week=Re.weeks=Aa,Re.isoWeek=Re.isoWeeks=Ba,Re.weeksInYear=Bc,Re.isoWeeksInYear=Ac, |
|||
// Day
|
|||
Re.date=Me,Re.day=Re.days=Ja,Re.weekday=Ka,Re.isoWeekday=La,Re.dayOfYear=Fc, |
|||
// Hour
|
|||
Re.hour=Re.hours=ue, |
|||
// Minute
|
|||
Re.minute=Re.minutes=Ne, |
|||
// Second
|
|||
Re.second=Re.seconds=Oe, |
|||
// Millisecond
|
|||
Re.millisecond=Re.milliseconds=Qe, |
|||
// Offset
|
|||
Re.utcOffset=Bb,Re.utc=Db,Re.local=Eb,Re.parseZone=Fb,Re.hasAlignedHourOffset=Gb,Re.isDST=Hb,Re.isLocal=Jb,Re.isUtcOffset=Kb,Re.isUtc=Lb,Re.isUTC=Lb, |
|||
// Timezone
|
|||
Re.zoneAbbr=Hc,Re.zoneName=Ic, |
|||
// Deprecations
|
|||
Re.dates=w("dates accessor is deprecated. Use date instead.",Me),Re.months=w("months accessor is deprecated. Use month instead",ja),Re.years=w("years accessor is deprecated. Use year instead",ke),Re.zone=w("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Cb),Re.isDSTShifted=w("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ib);var Se=Re,Te=B.prototype;Te.calendar=C,Te.longDateFormat=D,Te.invalidDate=E,Te.ordinal=F,Te.preparse=Lc,Te.postformat=Lc,Te.relativeTime=G,Te.pastFuture=H,Te.set=z, |
|||
// Month
|
|||
Te.months=ea,Te.monthsShort=fa,Te.monthsParse=ha,Te.monthsRegex=ma,Te.monthsShortRegex=la, |
|||
// Week
|
|||
Te.week=xa,Te.firstDayOfYear=za,Te.firstDayOfWeek=ya, |
|||
// Day of Week
|
|||
Te.weekdays=Ea,Te.weekdaysMin=Ga,Te.weekdaysShort=Fa,Te.weekdaysParse=Ia,Te.weekdaysRegex=Ma,Te.weekdaysShortRegex=Na,Te.weekdaysMinRegex=Oa, |
|||
// Hours
|
|||
Te.isPM=Ua,Te.meridiem=Va,Za("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===t(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}), |
|||
// Side effect imports
|
|||
a.lang=w("moment.lang is deprecated. Use moment.locale instead.",Za),a.langData=w("moment.langData is deprecated. Use moment.localeData instead.",ab);var Ue=Math.abs,Ve=cd("ms"),We=cd("s"),Xe=cd("m"),Ye=cd("h"),Ze=cd("d"),$e=cd("w"),_e=cd("M"),af=cd("y"),bf=ed("milliseconds"),cf=ed("seconds"),df=ed("minutes"),ef=ed("hours"),ff=ed("days"),gf=ed("months"),hf=ed("years"),jf=Math.round,kf={s:45,// seconds to minute
|
|||
m:45,// minutes to hour
|
|||
h:22,// hours to day
|
|||
d:26,// days to month
|
|||
M:11},lf=Math.abs,mf=vb.prototype;mf.abs=Uc,mf.add=Wc,mf.subtract=Xc,mf.as=ad,mf.asMilliseconds=Ve,mf.asSeconds=We,mf.asMinutes=Xe,mf.asHours=Ye,mf.asDays=Ze,mf.asWeeks=$e,mf.asMonths=_e,mf.asYears=af,mf.valueOf=bd,mf._bubble=Zc,mf.get=dd,mf.milliseconds=bf,mf.seconds=cf,mf.minutes=df,mf.hours=ef,mf.days=ff,mf.weeks=fd,mf.months=gf,mf.years=hf,mf.humanize=kd,mf.toISOString=ld,mf.toString=ld,mf.toJSON=ld,mf.locale=jc,mf.localeData=kc, |
|||
// Deprecations
|
|||
mf.toIsoString=w("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ld),mf.lang=Le, |
|||
// Side effect imports
|
|||
// FORMATTING
|
|||
T("X",0,0,"unix"),T("x",0,0,"valueOf"), |
|||
// PARSING
|
|||
Y("x",Rd),Y("X",Ud),aa("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),aa("x",function(a,b,c){c._d=new Date(t(a))}), |
|||
// Side effect imports
|
|||
a.version="2.14.1",b(rb),a.fn=Se,a.min=tb,a.max=ub,a.now=Fe,a.utc=j,a.unix=Jc,a.months=Pc,a.isDate=f,a.locale=Za,a.invalid=n,a.duration=Mb,a.isMoment=r,a.weekdays=Rc,a.parseZone=Kc,a.localeData=ab,a.isDuration=wb,a.monthsShort=Qc,a.weekdaysMin=Tc,a.defineLocale=$a,a.updateLocale=_a,a.locales=bb,a.weekdaysShort=Sc,a.normalizeUnits=J,a.relativeTimeRounding=id,a.relativeTimeThreshold=jd,a.calendarFormat=Tb,a.prototype=Se;var nf=a;return nf}); |
6
js/restangular.min.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
10
js/ui-bootstrap-tpls-2.2.0.min.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,111 @@ |
|||
<div class="container-fluid"> |
|||
<div class="row"> |
|||
<div class="col-md-4"> |
|||
<div class="well"> |
|||
<fieldset> |
|||
<legend>Neue Topologie starten</legend> |
|||
<div class="form-group"> |
|||
<label for="inputSession" class="col-md-2 control-label">Session Name</label> |
|||
|
|||
<div class="col-md-10"> |
|||
<input type="text" ng-model="topology.sessionName" class="form-control" id="inputSession" placeholder="Sessionname"> |
|||
</div> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="inputXML" class="col-md-2 control-label">Topologie-XML</label> |
|||
|
|||
<div class="col-md-10"> |
|||
<textarea rows="10" id="inputXML" style="width:100%;" ng-model="topology.filecontent" style="max-height:200px;overflow:scroll;"></textarea> |
|||
</div> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="startDate" class="col-md-2 control-label">Topologie-Startzeitpunkt</label> |
|||
|
|||
<div class="col-md-10"> |
|||
<input type="text" class="form-control" uib-datepicker-popup="dd.MM.yyyy" ng-model="topology.datetime" is-open="popup1.opened" datepicker-options="dateOptions" ng-required="true" close-text="Close" readonly/> |
|||
<span class="input-group-btn"> |
|||
<button type="button" class="btn btn-default" ng-click="openDatePicker()"><i class="glyphicon glyphicon-calendar"></i></button> |
|||
</span> |
|||
</div> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="startDate" class="col-md-2 control-label">Topologie-Startzeitpunkt</label> |
|||
|
|||
<div class="col-md-10"> |
|||
|
|||
<div uib-timepicker ng-model="topology.datetime" minute-step="15" ng-change="" show-meridian="false"></div> |
|||
|
|||
</div> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="repeat" class="col-md-2 control-label">Wiederholen</label> |
|||
|
|||
<div class="col-md-10"> |
|||
<div class="btn-group btn-group-justified btn-group-raised"> |
|||
<label class="btn btn-raised" ng-model="topology.repeat" uib-btn-radio="'none'">Einmalig</label> |
|||
<label class="btn btn-raised" ng-model="topology.repeat" uib-btn-radio="'daily'">Täglich</label> |
|||
<label class="btn btn-raised" ng-model="topology.repeat" uib-btn-radio="'weekly'">Wöchentlich</label> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<button class="btn btn-primary btn-raised btn-block" ng-click="send()">Planen</button> |
|||
|
|||
</fieldset> |
|||
|
|||
</div> |
|||
|
|||
</div> |
|||
|
|||
|
|||
<div class="col-md-4"> |
|||
<div class="well"> |
|||
<legend>geplante Simulationen</legend> |
|||
<div class="list-group "> |
|||
<div class="list-group-item" ng-repeat-start="sim in plannedSims"> |
|||
<div class="row-action-primary"> |
|||
<i class="material-icons" ng-if="sim.status=='done'">done</i> |
|||
<i class="material-icons" ng-if="sim.status=='repeating'">cached</i> |
|||
<i class="material-icons" ng-if="sim.status=='scheduled'">access_time</i> |
|||
</div> |
|||
<div class="row-content"> |
|||
<div class="least-content">{{sim.timestamp*1000 | date:'EEEE, dd.MM.yyyy HH:mm'}}</div> |
|||
<h4 class="list-group-item-heading">{{sim.sessionname}}</h4> |
|||
|
|||
<p class="list-group-item-text">Status: {{sim.status}}</p> |
|||
<p class="list-group-item-text">Benutzer: {{sim.username}}</p> |
|||
<p class="list-group-item-text" ng-if="sim.status == 'repeating'">Nächste Ausführung: {{sim.timestamp*1000 + sim.repeat_interval*1000 * sim.repeat_count | date:'EEEE, dd.MM.yyyy HH:mm'}}</p> |
|||
<button class="btn btn-danger" ng-click="removePlannedSim(sim.id)">Delete</button> |
|||
</div> |
|||
</div> |
|||
<div class="list-group-separator" ng-repeat-end></div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
<div class="col-md-4"> |
|||
<div class="well"> |
|||
<legend>laufende Simulationen für {{credentials.username}}</legend> |
|||
<div class="list-group"> |
|||
<div class="list-group-item" ng-repeat-start="(key,value) in runningSims"> |
|||
<div class="row-action-primary"> |
|||
<i class="material-icons">folder</i> |
|||
</div> |
|||
<div class="row-content"> |
|||
<div class="least-content"></div> |
|||
<h4 class="list-group-item-heading">{{key}}</h4> |
|||
|
|||
<p class="list-group-item-text">Status: {{value.status}}</p> |
|||
<p class="list-group-item-text">Launched: {{value.launched}}</p> |
|||
<button class="btn btn-danger" ng-click="stopSim(key)">Stop</button> |
|||
</div> |
|||
</div> |
|||
<div class="list-group-separator" ng-repeat-end></div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
</div> |
|||
|
|||
|
@ -0,0 +1,25 @@ |
|||
<div class="navbar navbar-default"> |
|||
<div class="container-fluid"> |
|||
<div class="navbar-header"> |
|||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-responsive-collapse"> |
|||
<span class="icon-bar"></span> |
|||
<span class="icon-bar"></span> |
|||
<span class="icon-bar"></span> |
|||
</button> |
|||
<a class="navbar-brand" >VIRL-Scheduler</a> |
|||
</div> |
|||
<div class="navbar-collapse collapse navbar-responsive-collapse"> |
|||
|
|||
<form class="navbar-form navbar-left"> |
|||
<div class="form-group is-empty"> |
|||
<input type="text" ng-model="credentials.username" class="form-control col-md-8" placeholder="Benutzername"> |
|||
<input type="password" ng-change="generateToken()"ng-model="credentials.password" class="form-control col-md-8" placeholder="Passwort"> |
|||
<button class="btn btn-info btn-xs" ng-click="verifyCredentials()">Verify</button> |
|||
</div> |
|||
</form> |
|||
|
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
|
@ -0,0 +1,7 @@ |
|||
<?php |
|||
|
|||
// autoload.php @generated by Composer
|
|||
|
|||
require_once __DIR__ . '/composer' . '/autoload_real.php'; |
|||
|
|||
return ComposerAutoloaderInitd54f12fb5bd1b34598360c61119b8df4::getLoader(); |
@ -0,0 +1,415 @@ |
|||
<?php |
|||
|
|||
/* |
|||
* This file is part of Composer. |
|||
* |
|||
* (c) Nils Adermann <naderman@naderman.de> |
|||
* Jordi Boggiano <j.boggiano@seld.be> |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
*/ |
|||
|
|||
namespace Composer\Autoload; |
|||
|
|||
/** |
|||
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader. |
|||
* |
|||
* $loader = new \Composer\Autoload\ClassLoader(); |
|||
* |
|||
* // register classes with namespaces
|
|||
* $loader->add('Symfony\Component', __DIR__.'/component'); |
|||
* $loader->add('Symfony', __DIR__.'/framework'); |
|||
* |
|||
* // activate the autoloader
|
|||
* $loader->register(); |
|||
* |
|||
* // to enable searching the include path (eg. for PEAR packages)
|
|||
* $loader->setUseIncludePath(true); |
|||
* |
|||
* In this example, if you try to use a class in the Symfony\Component |
|||
* namespace or one of its children (Symfony\Component\Console for instance), |
|||
* the autoloader will first look for the class under the component/ |
|||
* directory, and it will then fallback to the framework/ directory if not |
|||
* found before giving up. |
|||
* |
|||
* This class is loosely based on the Symfony UniversalClassLoader. |
|||
* |
|||
* @author Fabien Potencier <fabien@symfony.com> |
|||
* @author Jordi Boggiano <j.boggiano@seld.be> |
|||
* @see http://www.php-fig.org/psr/psr-0/ |
|||
* @see http://www.php-fig.org/psr/psr-4/ |
|||
*/ |
|||
class ClassLoader |
|||
{ |
|||
// PSR-4
|
|||
private $prefixLengthsPsr4 = array(); |
|||
private $prefixDirsPsr4 = array(); |
|||
private $fallbackDirsPsr4 = array(); |
|||
|
|||
// PSR-0
|
|||
private $prefixesPsr0 = array(); |
|||
private $fallbackDirsPsr0 = array(); |
|||
|
|||
private $useIncludePath = false; |
|||
private $classMap = array(); |
|||
private $classMapAuthoritative = false; |
|||
private $missingClasses = array(); |
|||
|
|||
public function getPrefixes() |
|||
{ |
|||
if (!empty($this->prefixesPsr0)) { |
|||
return call_user_func_array('array_merge', $this->prefixesPsr0); |
|||
} |
|||
|
|||
return array(); |
|||
} |
|||
|
|||
public function getPrefixesPsr4() |
|||
{ |
|||
return $this->prefixDirsPsr4; |
|||
} |
|||
|
|||
public function getFallbackDirs() |
|||
{ |
|||
return $this->fallbackDirsPsr0; |
|||
} |
|||
|
|||
public function getFallbackDirsPsr4() |
|||
{ |
|||
return $this->fallbackDirsPsr4; |
|||
} |
|||
|
|||
public function getClassMap() |
|||
{ |
|||
return $this->classMap; |
|||
} |
|||
|
|||
/** |
|||
* @param array $classMap Class to filename map |
|||
*/ |
|||
public function addClassMap(array $classMap) |
|||
{ |
|||
if ($this->classMap) { |
|||
$this->classMap = array_merge($this->classMap, $classMap); |
|||
} else { |
|||
$this->classMap = $classMap; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Registers a set of PSR-0 directories for a given prefix, either |
|||
* appending or prepending to the ones previously set for this prefix. |
|||
* |
|||
* @param string $prefix The prefix |
|||
* @param array|string $paths The PSR-0 root directories |
|||
* @param bool $prepend Whether to prepend the directories |
|||
*/ |
|||
public function add($prefix, $paths, $prepend = false) |
|||
{ |
|||
if (!$prefix) { |
|||
if ($prepend) { |
|||
$this->fallbackDirsPsr0 = array_merge( |
|||
(array) $paths, |
|||
$this->fallbackDirsPsr0 |
|||
); |
|||
} else { |
|||
$this->fallbackDirsPsr0 = array_merge( |
|||
$this->fallbackDirsPsr0, |
|||
(array) $paths |
|||
); |
|||
} |
|||
|
|||
return; |
|||
} |
|||
|
|||
$first = $prefix[0]; |
|||
if (!isset($this->prefixesPsr0[$first][$prefix])) { |
|||
$this->prefixesPsr0[$first][$prefix] = (array) $paths; |
|||
|
|||
return; |
|||
} |
|||
if ($prepend) { |
|||
$this->prefixesPsr0[$first][$prefix] = array_merge( |
|||
(array) $paths, |
|||
$this->prefixesPsr0[$first][$prefix] |
|||
); |
|||
} else { |
|||
$this->prefixesPsr0[$first][$prefix] = array_merge( |
|||
$this->prefixesPsr0[$first][$prefix], |
|||
(array) $paths |
|||
); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Registers a set of PSR-4 directories for a given namespace, either |
|||
* appending or prepending to the ones previously set for this namespace. |
|||
* |
|||
* @param string $prefix The prefix/namespace, with trailing '\\' |
|||
* @param array|string $paths The PSR-4 base directories |
|||
* @param bool $prepend Whether to prepend the directories |
|||
* |
|||
* @throws \InvalidArgumentException |
|||
*/ |
|||
public function addPsr4($prefix, $paths, $prepend = false) |
|||
{ |
|||
if (!$prefix) { |
|||
// Register directories for the root namespace.
|
|||
if ($prepend) { |
|||
$this->fallbackDirsPsr4 = array_merge( |
|||
(array) $paths, |
|||
$this->fallbackDirsPsr4 |
|||
); |
|||
} else { |
|||
$this->fallbackDirsPsr4 = array_merge( |
|||
$this->fallbackDirsPsr4, |
|||
(array) $paths |
|||
); |
|||
} |
|||
} elseif (!isset($this->prefixDirsPsr4[$prefix])) { |
|||
// Register directories for a new namespace.
|
|||
$length = strlen($prefix); |
|||
if ('\\' !== $prefix[$length - 1]) { |
|||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); |
|||
} |
|||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; |
|||
$this->prefixDirsPsr4[$prefix] = (array) $paths; |
|||
} elseif ($prepend) { |
|||
// Prepend directories for an already registered namespace.
|
|||
$this->prefixDirsPsr4[$prefix] = array_merge( |
|||
(array) $paths, |
|||
$this->prefixDirsPsr4[$prefix] |
|||
); |
|||
} else { |
|||
// Append directories for an already registered namespace.
|
|||
$this->prefixDirsPsr4[$prefix] = array_merge( |
|||
$this->prefixDirsPsr4[$prefix], |
|||
(array) $paths |
|||
); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Registers a set of PSR-0 directories for a given prefix, |
|||
* replacing any others previously set for this prefix. |
|||
* |
|||
* @param string $prefix The prefix |
|||
* @param array|string $paths The PSR-0 base directories |
|||
*/ |
|||
public function set($prefix, $paths) |
|||
{ |
|||
if (!$prefix) { |
|||
$this->fallbackDirsPsr0 = (array) $paths; |
|||
} else { |
|||
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Registers a set of PSR-4 directories for a given namespace, |
|||
* replacing any others previously set for this namespace. |
|||
* |
|||
* @param string $prefix The prefix/namespace, with trailing '\\' |
|||
* @param array|string $paths The PSR-4 base directories |
|||
* |
|||
* @throws \InvalidArgumentException |
|||
*/ |
|||
public function setPsr4($prefix, $paths) |
|||
{ |
|||
if (!$prefix) { |
|||
$this->fallbackDirsPsr4 = (array) $paths; |
|||
} else { |
|||
$length = strlen($prefix); |
|||
if ('\\' !== $prefix[$length - 1]) { |
|||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); |
|||
} |
|||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; |
|||
$this->prefixDirsPsr4[$prefix] = (array) $paths; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Turns on searching the include path for class files. |
|||
* |
|||
* @param bool $useIncludePath |
|||
*/ |
|||
public function setUseIncludePath($useIncludePath) |
|||
{ |
|||
$this->useIncludePath = $useIncludePath; |
|||
} |
|||
|
|||
/** |
|||
* Can be used to check if the autoloader uses the include path to check |
|||
* for classes. |
|||
* |
|||
* @return bool |
|||
*/ |
|||
public function getUseIncludePath() |
|||
{ |
|||
return $this->useIncludePath; |
|||
} |
|||
|
|||
/** |
|||
* Turns off searching the prefix and fallback directories for classes |
|||
* that have not been registered with the class map. |
|||
* |
|||
* @param bool $classMapAuthoritative |
|||
*/ |
|||
public function setClassMapAuthoritative($classMapAuthoritative) |
|||
{ |
|||
$this->classMapAuthoritative = $classMapAuthoritative; |
|||
} |
|||
|
|||
/** |
|||
* Should class lookup fail if not found in the current class map? |
|||
* |
|||
* @return bool |
|||
*/ |
|||
public function isClassMapAuthoritative() |
|||
{ |
|||
return $this->classMapAuthoritative; |
|||
} |
|||
|
|||
/** |
|||
* Registers this instance as an autoloader. |
|||
* |
|||
* @param bool $prepend Whether to prepend the autoloader or not |
|||
*/ |
|||
public function register($prepend = false) |
|||
{ |
|||
spl_autoload_register(array($this, 'loadClass'), true, $prepend); |
|||
} |
|||
|
|||
/** |
|||
* Unregisters this instance as an autoloader. |
|||
*/ |
|||
public function unregister() |
|||
{ |
|||
spl_autoload_unregister(array($this, 'loadClass')); |
|||
} |
|||
|
|||
/** |
|||
* Loads the given class or interface. |
|||
* |
|||
* @param string $class The name of the class |
|||
* @return bool|null True if loaded, null otherwise |
|||
*/ |
|||
public function loadClass($class) |
|||
{ |
|||
if ($file = $this->findFile($class)) { |
|||
includeFile($file); |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Finds the path to the file where the class is defined. |
|||
* |
|||
* @param string $class The name of the class |
|||
* |
|||
* @return string|false The path if found, false otherwise |
|||
*/ |
|||
public function findFile($class) |
|||
{ |
|||
// work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
|
|||
if ('\\' == $class[0]) { |
|||
$class = substr($class, 1); |
|||
} |
|||
|
|||
// class map lookup
|
|||
if (isset($this->classMap[$class])) { |
|||
return $this->classMap[$class]; |
|||
} |
|||
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { |
|||
return false; |
|||
} |
|||
|
|||
$file = $this->findFileWithExtension($class, '.php'); |
|||
|
|||
// Search for Hack files if we are running on HHVM
|
|||
if (false === $file && defined('HHVM_VERSION')) { |
|||
$file = $this->findFileWithExtension($class, '.hh'); |
|||
} |
|||
|
|||
if (false === $file) { |
|||
// Remember that this class does not exist.
|
|||
$this->missingClasses[$class] = true; |
|||
} |
|||
|
|||
return $file; |
|||
} |
|||
|
|||
private function findFileWithExtension($class, $ext) |
|||
{ |
|||
// PSR-4 lookup
|
|||
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; |
|||
|
|||
$first = $class[0]; |
|||
if (isset($this->prefixLengthsPsr4[$first])) { |
|||
foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { |
|||
if (0 === strpos($class, $prefix)) { |
|||
foreach ($this->prefixDirsPsr4[$prefix] as $dir) { |
|||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { |
|||
return $file; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// PSR-4 fallback dirs
|
|||
foreach ($this->fallbackDirsPsr4 as $dir) { |
|||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { |
|||
return $file; |
|||
} |
|||
} |
|||
|
|||
// PSR-0 lookup
|
|||
if (false !== $pos = strrpos($class, '\\')) { |
|||
// namespaced class name
|
|||
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) |
|||
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); |
|||
} else { |
|||
// PEAR-like class name
|
|||
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; |
|||
} |
|||
|
|||
if (isset($this->prefixesPsr0[$first])) { |
|||
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { |
|||
if (0 === strpos($class, $prefix)) { |
|||
foreach ($dirs as $dir) { |
|||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { |
|||
return $file; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// PSR-0 fallback dirs
|
|||
foreach ($this->fallbackDirsPsr0 as $dir) { |
|||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { |
|||
return $file; |
|||
} |
|||
} |
|||
|
|||
// PSR-0 include paths.
|
|||
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { |
|||
return $file; |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Scope isolated include. |
|||
* |
|||
* Prevents access to $this/self from included files. |
|||
*/ |
|||
function includeFile($file) |
|||
{ |
|||
include $file; |
|||
} |
@ -0,0 +1,21 @@ |
|||
|
|||
Copyright (c) 2016 Nils Adermann, Jordi Boggiano |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is furnished |
|||
to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
|||
|
@ -0,0 +1,9 @@ |
|||
<?php |
|||
|
|||
// autoload_classmap.php @generated by Composer
|
|||
|
|||
$vendorDir = dirname(dirname(__FILE__)); |
|||
$baseDir = dirname($vendorDir); |
|||
|
|||
return array( |
|||
); |
@ -0,0 +1,10 @@ |
|||
<?php |
|||
|
|||
// autoload_files.php @generated by Composer
|
|||
|
|||
$vendorDir = dirname(dirname(__FILE__)); |
|||
$baseDir = dirname($vendorDir); |
|||
|
|||
return array( |
|||
'253c157292f75eb38082b5acb06f3f01' => $vendorDir . '/nikic/fast-route/src/functions.php', |
|||
); |
@ -0,0 +1,10 @@ |
|||
<?php |
|||
|
|||
// autoload_namespaces.php @generated by Composer
|
|||
|
|||
$vendorDir = dirname(dirname(__FILE__)); |
|||
$baseDir = dirname($vendorDir); |
|||
|
|||
return array( |
|||
'Pimple' => array($vendorDir . '/pimple/pimple/src'), |
|||
); |
@ -0,0 +1,13 @@ |
|||
<?php |
|||
|
|||
// autoload_psr4.php @generated by Composer
|
|||
|
|||
$vendorDir = dirname(dirname(__FILE__)); |
|||
$baseDir = dirname($vendorDir); |
|||
|
|||
return array( |
|||
'Slim\\' => array($vendorDir . '/slim/slim/Slim'), |
|||
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), |
|||
'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'), |
|||
'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'), |
|||
); |
@ -0,0 +1,70 @@ |
|||
<?php |
|||
|
|||
// autoload_real.php @generated by Composer
|
|||
|
|||
class ComposerAutoloaderInitd54f12fb5bd1b34598360c61119b8df4 |
|||
{ |
|||
private static $loader; |
|||
|
|||
public static function loadClassLoader($class) |
|||
{ |
|||
if ('Composer\Autoload\ClassLoader' === $class) { |
|||
require __DIR__ . '/ClassLoader.php'; |
|||
} |
|||
} |
|||
|
|||
public static function getLoader() |
|||
{ |
|||
if (null !== self::$loader) { |
|||
return self::$loader; |
|||
} |
|||
|
|||
spl_autoload_register(array('ComposerAutoloaderInitd54f12fb5bd1b34598360c61119b8df4', 'loadClassLoader'), true, true); |
|||
self::$loader = $loader = new \Composer\Autoload\ClassLoader(); |
|||
spl_autoload_unregister(array('ComposerAutoloaderInitd54f12fb5bd1b34598360c61119b8df4', 'loadClassLoader')); |
|||
|
|||
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION'); |
|||
if ($useStaticLoader) { |
|||
require_once __DIR__ . '/autoload_static.php'; |
|||
|
|||
call_user_func(\Composer\Autoload\ComposerStaticInitd54f12fb5bd1b34598360c61119b8df4::getInitializer($loader)); |
|||
} else { |
|||
$map = require __DIR__ . '/autoload_namespaces.php'; |
|||
foreach ($map as $namespace => $path) { |
|||
$loader->set($namespace, $path); |
|||
} |
|||
|
|||
$map = require __DIR__ . '/autoload_psr4.php'; |
|||
foreach ($map as $namespace => $path) { |
|||
$loader->setPsr4($namespace, $path); |
|||
} |
|||
|
|||
$classMap = require __DIR__ . '/autoload_classmap.php'; |
|||
if ($classMap) { |
|||
$loader->addClassMap($classMap); |
|||
} |
|||
} |
|||
|
|||
$loader->register(true); |
|||
|
|||
if ($useStaticLoader) { |
|||
$includeFiles = Composer\Autoload\ComposerStaticInitd54f12fb5bd1b34598360c61119b8df4::$files; |
|||
} else { |
|||
$includeFiles = require __DIR__ . '/autoload_files.php'; |
|||
} |
|||
foreach ($includeFiles as $fileIdentifier => $file) { |
|||
composerRequired54f12fb5bd1b34598360c61119b8df4($fileIdentifier, $file); |
|||
} |
|||
|
|||
return $loader; |
|||
} |
|||
} |
|||
|
|||
function composerRequired54f12fb5bd1b34598360c61119b8df4($fileIdentifier, $file) |
|||
{ |
|||
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { |
|||
require $file; |
|||
|
|||
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; |
|||
} |
|||
} |
@ -0,0 +1,70 @@ |
|||
<?php |
|||
|
|||
// autoload_static.php @generated by Composer
|
|||
|
|||
namespace Composer\Autoload; |
|||
|
|||
class ComposerStaticInitd54f12fb5bd1b34598360c61119b8df4 |
|||
{ |
|||
public static $files = array ( |
|||
'253c157292f75eb38082b5acb06f3f01' => __DIR__ . '/..' . '/nikic/fast-route/src/functions.php', |
|||
); |
|||
|
|||
public static $prefixLengthsPsr4 = array ( |
|||
'S' => |
|||
array ( |
|||
'Slim\\' => 5, |
|||
), |
|||
'P' => |
|||
array ( |
|||
'Psr\\Http\\Message\\' => 17, |
|||
), |
|||
'I' => |
|||
array ( |
|||
'Interop\\Container\\' => 18, |
|||
), |
|||
'F' => |
|||
array ( |
|||
'FastRoute\\' => 10, |
|||
), |
|||
); |
|||
|
|||
public static $prefixDirsPsr4 = array ( |
|||
'Slim\\' => |
|||
array ( |
|||
0 => __DIR__ . '/..' . '/slim/slim/Slim', |
|||
), |
|||
'Psr\\Http\\Message\\' => |
|||
array ( |
|||
0 => __DIR__ . '/..' . '/psr/http-message/src', |
|||
), |
|||
'Interop\\Container\\' => |
|||
array ( |
|||
0 => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container', |
|||
), |
|||
'FastRoute\\' => |
|||
array ( |
|||
0 => __DIR__ . '/..' . '/nikic/fast-route/src', |
|||
), |
|||
); |
|||
|
|||
public static $prefixesPsr0 = array ( |
|||
'P' => |
|||
array ( |
|||
'Pimple' => |
|||
array ( |
|||
0 => __DIR__ . '/..' . '/pimple/pimple/src', |
|||
), |
|||
), |
|||
); |
|||
|
|||
public static function getInitializer(ClassLoader $loader) |
|||
{ |
|||
return \Closure::bind(function () use ($loader) { |
|||
$loader->prefixLengthsPsr4 = ComposerStaticInitd54f12fb5bd1b34598360c61119b8df4::$prefixLengthsPsr4; |
|||
$loader->prefixDirsPsr4 = ComposerStaticInitd54f12fb5bd1b34598360c61119b8df4::$prefixDirsPsr4; |
|||
$loader->prefixesPsr0 = ComposerStaticInitd54f12fb5bd1b34598360c61119b8df4::$prefixesPsr0; |
|||
|
|||
}, null, ClassLoader::class); |
|||
} |
|||
} |
@ -0,0 +1,248 @@ |
|||
[ |
|||
{ |
|||
"name": "container-interop/container-interop", |
|||
"version": "1.1.0", |
|||
"version_normalized": "1.1.0.0", |
|||
"source": { |
|||
"type": "git", |
|||
"url": "https://github.com/container-interop/container-interop.git", |
|||
"reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e" |
|||
}, |
|||
"dist": { |
|||
"type": "zip", |
|||
"url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e", |
|||
"reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e", |
|||
"shasum": "" |
|||
}, |
|||
"time": "2014-12-30 15:22:37", |
|||
"type": "library", |
|||
"installation-source": "dist", |
|||
"autoload": { |
|||
"psr-4": { |
|||
"Interop\\Container\\": "src/Interop/Container/" |
|||
} |
|||
}, |
|||
"notification-url": "https://packagist.org/downloads/", |
|||
"license": [ |
|||
"MIT" |
|||
], |
|||
"description": "Promoting the interoperability of container objects (DIC, SL, etc.)" |
|||
}, |
|||
{ |
|||
"name": "nikic/fast-route", |
|||
"version": "v1.0.1", |
|||
"version_normalized": "1.0.1.0", |
|||
"source": { |
|||
"type": "git", |
|||
"url": "https://github.com/nikic/FastRoute.git", |
|||
"reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af" |
|||
}, |
|||
"dist": { |
|||
"type": "zip", |
|||
"url": "https://api.github.com/repos/nikic/FastRoute/zipball/8ea928195fa9b907f0d6e48312d323c1a13cc2af", |
|||
"reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af", |
|||
"shasum": "" |
|||
}, |
|||
"require": { |
|||
"php": ">=5.4.0" |
|||
}, |
|||
"time": "2016-06-12 19:08:51", |
|||
"type": "library", |
|||
"installation-source": "dist", |
|||
"autoload": { |
|||
"psr-4": { |
|||
"FastRoute\\": "src/" |
|||
}, |
|||
"files": [ |
|||
"src/functions.php" |
|||
] |
|||
}, |
|||
"notification-url": "https://packagist.org/downloads/", |
|||
"license": [ |
|||
"BSD-3-Clause" |
|||
], |
|||
"authors": [ |
|||
{ |
|||
"name": "Nikita Popov", |
|||
"email": "nikic@php.net" |
|||
} |
|||
], |
|||
"description": "Fast request router for PHP", |
|||
"keywords": [ |
|||
"router", |
|||
"routing" |
|||
] |
|||
}, |
|||
{ |
|||
"name": "psr/http-message", |
|||
"version": "1.0.1", |
|||
"version_normalized": "1.0.1.0", |
|||
"source": { |
|||
"type": "git", |
|||
"url": "https://github.com/php-fig/http-message.git", |
|||
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" |
|||
}, |
|||
"dist": { |
|||
"type": "zip", |
|||
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", |
|||
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", |
|||
"shasum": "" |
|||
}, |
|||
"require": { |
|||
"php": ">=5.3.0" |
|||
}, |
|||
"time": "2016-08-06 14:39:51", |
|||
"type": "library", |
|||
"extra": { |
|||
"branch-alias": { |
|||
"dev-master": "1.0.x-dev" |
|||
} |
|||
}, |
|||
"installation-source": "dist", |
|||
"autoload": { |
|||
"psr-4": { |
|||
"Psr\\Http\\Message\\": "src/" |
|||
} |
|||
}, |
|||
"notification-url": "https://packagist.org/downloads/", |
|||
"license": [ |
|||
"MIT" |
|||
], |
|||
"authors": [ |
|||
{ |
|||
"name": "PHP-FIG", |
|||
"homepage": "http://www.php-fig.org/" |
|||
} |
|||
], |
|||
"description": "Common interface for HTTP messages", |
|||
"homepage": "https://github.com/php-fig/http-message", |
|||
"keywords": [ |
|||
"http", |
|||
"http-message", |
|||
"psr", |
|||
"psr-7", |
|||
"request", |
|||
"response" |
|||
] |
|||
}, |
|||
{ |
|||
"name": "pimple/pimple", |
|||
"version": "v3.0.2", |
|||
"version_normalized": "3.0.2.0", |
|||
"source": { |
|||
"type": "git", |
|||
"url": "https://github.com/silexphp/Pimple.git", |
|||
"reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a" |
|||
}, |
|||
"dist": { |
|||
"type": "zip", |
|||
"url": "https://api.github.com/repos/silexphp/Pimple/zipball/a30f7d6e57565a2e1a316e1baf2a483f788b258a", |
|||
"reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a", |
|||
"shasum": "" |
|||
}, |
|||
"require": { |
|||
"php": ">=5.3.0" |
|||
}, |
|||
"time": "2015-09-11 15:10:35", |
|||
"type": "library", |
|||
"extra": { |
|||
"branch-alias": { |
|||
"dev-master": "3.0.x-dev" |
|||
} |
|||
}, |
|||
"installation-source": "dist", |
|||
"autoload": { |
|||
"psr-0": { |
|||
"Pimple": "src/" |
|||
} |
|||
}, |
|||
"notification-url": "https://packagist.org/downloads/", |
|||
"license": [ |
|||
"MIT" |
|||
], |
|||
"authors": [ |
|||
{ |
|||
"name": "Fabien Potencier", |
|||
"email": "fabien@symfony.com" |
|||
} |
|||
], |
|||
"description": "Pimple, a simple Dependency Injection Container", |
|||
"homepage": "http://pimple.sensiolabs.org", |
|||
"keywords": [ |
|||
"container", |
|||
"dependency injection" |
|||
] |
|||
}, |
|||
{ |
|||
"name": "slim/slim", |
|||
"version": "3.5.0", |
|||
"version_normalized": "3.5.0.0", |
|||
"source": { |
|||
"type": "git", |
|||
"url": "https://github.com/slimphp/Slim.git", |
|||
"reference": "184352bc1913d7ba552ab4131d62f4730ddb0893" |
|||
}, |
|||
"dist": { |
|||
"type": "zip", |
|||
"url": "https://api.github.com/repos/slimphp/Slim/zipball/184352bc1913d7ba552ab4131d62f4730ddb0893", |
|||
"reference": "184352bc1913d7ba552ab4131d62f4730ddb0893", |
|||
"shasum": "" |
|||
}, |
|||
"require": { |
|||
"container-interop/container-interop": "^1.1", |
|||
"nikic/fast-route": "^1.0", |
|||
"php": ">=5.5.0", |
|||
"pimple/pimple": "^3.0", |
|||
"psr/http-message": "^1.0" |
|||
}, |
|||
"provide": { |
|||
"psr/http-message-implementation": "1.0" |
|||
}, |
|||
"require-dev": { |
|||
"phpunit/phpunit": "^4.0", |
|||
"squizlabs/php_codesniffer": "^2.5" |
|||
}, |
|||
"time": "2016-07-26 15:12:13", |
|||
"type": "library", |
|||
"installation-source": "dist", |
|||
"autoload": { |
|||
"psr-4": { |
|||
"Slim\\": "Slim" |
|||
} |
|||
}, |
|||
"notification-url": "https://packagist.org/downloads/", |
|||
"license": [ |
|||
"MIT" |
|||
], |
|||
"authors": [ |
|||
{ |
|||
"name": "Rob Allen", |
|||
"email": "rob@akrabat.com", |
|||
"homepage": "http://akrabat.com" |
|||
}, |
|||
{ |
|||
"name": "Josh Lockhart", |
|||
"email": "hello@joshlockhart.com", |
|||
"homepage": "https://joshlockhart.com" |
|||
}, |
|||
{ |
|||
"name": "Gabriel Manricks", |
|||
"email": "gmanricks@me.com", |
|||
"homepage": "http://gabrielmanricks.com" |
|||
}, |
|||
{ |
|||
"name": "Andrew Smith", |
|||
"email": "a.smith@silentworks.co.uk", |
|||
"homepage": "http://silentworks.co.uk" |
|||
} |
|||
], |
|||
"description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", |
|||
"homepage": "http://slimframework.com", |
|||
"keywords": [ |
|||
"api", |
|||
"framework", |
|||
"micro", |
|||
"router" |
|||
] |
|||
} |
|||
] |
@ -0,0 +1,3 @@ |
|||
composer.lock |
|||
composer.phar |
|||
/vendor/ |
@ -0,0 +1,20 @@ |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2013 container-interop |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy of |
|||
this software and associated documentation files (the "Software"), to deal in |
|||
the Software without restriction, including without limitation the rights to |
|||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
|||
the Software, and to permit persons to whom the Software is furnished to do so, |
|||
subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |
|||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
|||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
|||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
|||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@ -0,0 +1,85 @@ |
|||
# Container Interoperability |
|||
|
|||
[![Latest Stable Version](https://poser.pugx.org/container-interop/container-interop/v/stable.png)](https://packagist.org/packages/container-interop/container-interop) |
|||
|
|||
*container-interop* tries to identify and standardize features in *container* objects (service locators, |
|||
dependency injection containers, etc.) to achieve interopererability. |
|||
|
|||
Through discussions and trials, we try to create a standard, made of common interfaces but also recommendations. |
|||
|
|||
If PHP projects that provide container implementations begin to adopt these common standards, then PHP |
|||
applications and projects that use containers can depend on the common interfaces instead of specific |
|||
implementations. This facilitates a high-level of interoperability and flexibility that allows users to consume |
|||
*any* container implementation that can be adapted to these interfaces. |
|||
|
|||
The work done in this project is not officially endorsed by the [PHP-FIG](http://www.php-fig.org/), but it is being |
|||
worked on by members of PHP-FIG and other good developers. We adhere to the spirit and ideals of PHP-FIG, and hope |
|||
this project will pave the way for one or more future PSRs. |
|||
|
|||
|
|||
## Installation |
|||
|
|||
You can install this package through Composer: |
|||
|
|||
```json |
|||
{ |
|||
"require": { |
|||
"container-interop/container-interop": "~1.0" |
|||
} |
|||
} |
|||
``` |
|||
|
|||
The packages adheres to the [SemVer](http://semver.org/) specification, and there will be full backward compatibility |
|||
between minor versions. |
|||
|
|||
## Standards |
|||
|
|||
### Available |
|||
|
|||
- [`ContainerInterface`](src/Interop/Container/ContainerInterface.php). |
|||
[Description](docs/ContainerInterface.md) [Meta Document](docs/ContainerInterface-meta.md). |
|||
Describes the interface of a container that exposes methods to read its entries. |
|||
- [*Delegate lookup feature*](docs/Delegate-lookup.md). |
|||
[Meta Document](docs/Delegate-lookup-meta.md). |
|||
Describes the ability for a container to delegate the lookup of its dependencies to a third-party container. This |
|||
feature lets several containers work together in a single application. |
|||
|
|||
### Proposed |
|||
|
|||
View open [request for comments](https://github.com/container-interop/container-interop/labels/RFC) |
|||
|
|||
## Compatible projects |
|||
|
|||
### Projects implementing `ContainerInterface` |
|||
|
|||
- [Acclimate](https://github.com/jeremeamia/acclimate-container) |
|||
- [dcp-di](https://github.com/estelsmith/dcp-di) |
|||
- [Mouf](http://mouf-php.com) |
|||
- [Njasm Container](https://github.com/njasm/container) |
|||
- [PHP-DI](http://php-di.org) |
|||
- [PimpleInterop](https://github.com/moufmouf/pimple-interop) |
|||
- [XStatic](https://github.com/jeremeamia/xstatic) |
|||
|
|||
### Projects implementing the *delegate lookup* feature |
|||
|
|||
- [Mouf](http://mouf-php.com) |
|||
- [PHP-DI](http://php-di.org) |
|||
- [PimpleInterop](https://github.com/moufmouf/pimple-interop) |
|||
|
|||
## Workflow |
|||
|
|||
Everyone is welcome to join and contribute. |
|||
|
|||
The general workflow looks like this: |
|||
|
|||
1. Someone opens a discussion (GitHub issue) to suggest an interface |
|||
1. Feedback is gathered |
|||
1. The interface is added to a development branch |
|||
1. We release alpha versions so that the interface can be experimented with |
|||
1. Discussions and edits ensue until the interface is deemed stable by a general consensus |
|||
1. A new minor version of the package is released |
|||
|
|||
We try to not break BC by creating new interfaces instead of editing existing ones. |
|||
|
|||
While we currently work on interfaces, we are open to anything that might help towards interoperability, may that |
|||
be code, best practices, etc. |
@ -0,0 +1,11 @@ |
|||
{ |
|||
"name": "container-interop/container-interop", |
|||
"type": "library", |
|||
"description": "Promoting the interoperability of container objects (DIC, SL, etc.)", |
|||
"license": "MIT", |
|||
"autoload": { |
|||
"psr-4": { |
|||
"Interop\\Container\\": "src/Interop/Container/" |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,114 @@ |
|||
# ContainerInterface Meta Document |
|||
|
|||
## Introduction |
|||
|
|||
This document describes the process and discussions that lead to the `ContainerInterface`. |
|||
Its goal is to explain the reasons behind each decision. |
|||
|
|||
## Goal |
|||
|
|||
The goal set by `ContainerInterface` is to standardize how frameworks and libraries make use of a |
|||
container to obtain objects and parameters. |
|||
|
|||
By standardizing such a behavior, frameworks and libraries using the `ContainerInterface` |
|||
could work with any compatible container. |
|||
That would allow end users to choose their own container based on their own preferences. |
|||
|
|||
It is important to distinguish the two usages of a container: |
|||
|
|||
- configuring entries |
|||
- fetching entries |
|||
|
|||
Most of the time, those two sides are not used by the same party. |
|||
While it is often end users who tend to configure entries, it is generally the framework that fetch |
|||
entries to build the application. |
|||
|
|||
This is why this interface focuses only on how entries can be fetched from a container. |
|||
|
|||
## Interface name |
|||
|
|||
The interface name has been thoroughly discussed and was decided by a vote. |
|||
|
|||
The list of options considered with their respective votes are: |
|||
|
|||
- `ContainerInterface`: +8 |
|||
- `ProviderInterface`: +2 |
|||
- `LocatorInterface`: 0 |
|||
- `ReadableContainerInterface`: -5 |
|||
- `ServiceLocatorInterface`: -6 |
|||
- `ObjectFactory`: -6 |
|||
- `ObjectStore`: -8 |
|||
- `ConsumerInterface`: -9 |
|||
|
|||
[Full results of the vote](https://github.com/container-interop/container-interop/wiki/%231-interface-name:-Vote) |
|||
|
|||
The complete discussion can be read in [the issue #1](https://github.com/container-interop/container-interop/issues/1). |
|||
|
|||
## Interface methods |
|||
|
|||
The choice of which methods the interface would contain was made after a statistical analysis of existing containers. |
|||
The results of this analysis are available [in this document](https://gist.github.com/mnapoli/6159681). |
|||
|
|||
The summary of the analysis showed that: |
|||
|
|||
- all containers offer a method to get an entry by its id |
|||
- a large majority name such method `get()` |
|||
- for all containers, the `get()` method has 1 mandatory parameter of type string |
|||
- some containers have an optional additional argument for `get()`, but it doesn't same the same purpose between containers |
|||
- a large majority of the containers offer a method to test if it can return an entry by its id |
|||
- a majority name such method `has()` |
|||
- for all containers offering `has()`, the method has exactly 1 parameter of type string |
|||
- a large majority of the containers throw an exception rather than returning null when an entry is not found in `get()` |
|||
- a large majority of the containers don't implement `ArrayAccess` |
|||
|
|||
The question of whether to include methods to define entries has been discussed in |
|||
[issue #1](https://github.com/container-interop/container-interop/issues/1). |
|||
It has been judged that such methods do not belong in the interface described here because it is out of its scope |
|||
(see the "Goal" section). |
|||
|
|||
As a result, the `ContainerInterface` contains two methods: |
|||
|
|||
- `get()`, returning anything, with one mandatory string parameter. Should throw an exception if the entry is not found. |
|||
- `has()`, returning a boolean, with one mandatory string parameter. |
|||
|
|||
### Number of parameters in `get()` method |
|||
|
|||
While `ContainerInterface` only defines one mandatory parameter in `get()`, it is not incompatible with |
|||
existing containers that have additional optional parameters. PHP allows an implementation to offer more parameters |
|||
as long as they are optional, because the implementation *does* satisfy the interface. |
|||
|
|||
This issue has been discussed in [issue #6](https://github.com/container-interop/container-interop/issues/6). |
|||
|
|||
### Type of the `$id` parameter |
|||
|
|||
The type of the `$id` parameter in `get()` and `has()` has been discussed in |
|||
[issue #6](https://github.com/container-interop/container-interop/issues/6). |
|||
While `string` is used in all the containers that were analyzed, it was suggested that allowing |
|||
anything (such as objects) could allow containers to offer a more advanced query API. |
|||
|
|||
An example given was to use the container as an object builder. The `$id` parameter would then be an |
|||
object that would describe how to create an instance. |
|||
|
|||
The conclusion of the discussion was that this was beyond the scope of getting entries from a container without |
|||
knowing how the container provided them, and it was more fit for a factory. |
|||
|
|||
## Contributors |
|||
|
|||
Are listed here all people that contributed in the discussions or votes, by alphabetical order: |
|||
|
|||
- [Amy Stephen](https://github.com/AmyStephen) |
|||
- [David Négrier](https://github.com/moufmouf) |
|||
- [Don Gilbert](https://github.com/dongilbert) |
|||
- [Jason Judge](https://github.com/judgej) |
|||
- [Jeremy Lindblom](https://github.com/jeremeamia) |
|||
- [Marco Pivetta](https://github.com/Ocramius) |
|||
- [Matthieu Napoli](https://github.com/mnapoli) |
|||
- [Paul M. Jones](https://github.com/pmjones) |
|||
- [Stephan Hochdörfer](https://github.com/shochdoerfer) |
|||
- [Taylor Otwell](https://github.com/taylorotwell) |
|||
|
|||
## Relevant links |
|||
|
|||
- [`ContainerInterface.php`](https://github.com/container-interop/container-interop/blob/master/src/Interop/Container/ContainerInterface.php) |
|||
- [List of all issues](https://github.com/container-interop/container-interop/issues?labels=ContainerInterface&milestone=&page=1&state=closed) |
|||
- [Vote for the interface name](https://github.com/container-interop/container-interop/wiki/%231-interface-name:-Vote) |
@ -0,0 +1,153 @@ |
|||
Container interface |
|||
=================== |
|||
|
|||
This document describes a common interface for dependency injection containers. |
|||
|
|||
The goal set by `ContainerInterface` is to standardize how frameworks and libraries make use of a |
|||
container to obtain objects and parameters (called *entries* in the rest of this document). |
|||
|
|||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", |
|||
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be |
|||
interpreted as described in [RFC 2119][]. |
|||
|
|||
The word `implementor` in this document is to be interpreted as someone |
|||
implementing the `ContainerInterface` in a depency injection-related library or framework. |
|||
Users of dependency injections containers (DIC) are refered to as `user`. |
|||
|
|||
[RFC 2119]: http://tools.ietf.org/html/rfc2119 |
|||
|
|||
1. Specification |
|||
----------------- |
|||
|
|||
### 1.1 Basics |
|||
|
|||
- The `Interop\Container\ContainerInterface` exposes two methods : `get` and `has`. |
|||
|
|||
- `get` takes one mandatory parameter: an entry identifier. It MUST be a string. |
|||
A call to `get` can return anything (a *mixed* value), or throws an exception if the identifier |
|||
is not known to the container. Two successive calls to `get` with the same |
|||
identifier SHOULD return the same value. However, depending on the `implementor` |
|||
design and/or `user` configuration, different values might be returned, so |
|||
`user` SHOULD NOT rely on getting the same value on 2 successive calls. |
|||
While `ContainerInterface` only defines one mandatory parameter in `get()`, implementations |
|||
MAY accept additional optional parameters. |
|||
|
|||
- `has` takes one unique parameter: an entry identifier. It MUST return `true` |
|||
if an entry identifier is known to the container and `false` if it is not. |
|||
|
|||
### 1.2 Exceptions |
|||
|
|||
Exceptions directly thrown by the container MUST implement the |
|||
[`Interop\Container\Exception\ContainerException`](../src/Interop/Container/Exception/ContainerException.php). |
|||
|
|||
A call to the `get` method with a non-existing id should throw a |
|||
[`Interop\Container\Exception\NotFoundException`](../src/Interop/Container/Exception/NotFoundException.php). |
|||
|
|||
### 1.3 Additional features |
|||
|
|||
This section describes additional features that MAY be added to a container. Containers are not |
|||
required to implement these features to respect the ContainerInterface. |
|||
|
|||
#### 1.3.1 Delegate lookup feature |
|||
|
|||
The goal of the *delegate lookup* feature is to allow several containers to share entries. |
|||
Containers implementing this feature can perform dependency lookups in other containers. |
|||
|
|||
Containers implementing this feature will offer a greater lever of interoperability |
|||
with other containers. Implementation of this feature is therefore RECOMMENDED. |
|||
|
|||
A container implementing this feature: |
|||
|
|||
- MUST implement the `ContainerInterface` |
|||
- MUST provide a way to register a delegate container (using a constructor parameter, or a setter, |
|||
or any possible way). The delegate container MUST implement the `ContainerInterface`. |
|||
|
|||
When a container is configured to use a delegate container for dependencies: |
|||
|
|||
- Calls to the `get` method should only return an entry if the entry is part of the container. |
|||
If the entry is not part of the container, an exception should be thrown |
|||
(as requested by the `ContainerInterface`). |
|||
- Calls to the `has` method should only return `true` if the entry is part of the container. |
|||
If the entry is not part of the container, `false` should be returned. |
|||
- If the fetched entry has dependencies, **instead** of performing |
|||
the dependency lookup in the container, the lookup is performed on the *delegate container*. |
|||
|
|||
Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself. |
|||
|
|||
It is however allowed for containers to provide exception cases for special entries, and a way to lookup |
|||
into the same container (or another container) instead of the delegate container. |
|||
|
|||
2. Package |
|||
---------- |
|||
|
|||
The interfaces and classes described as well as relevant exception are provided as part of the |
|||
[container-interop/container-interop](https://packagist.org/packages/container-interop/container-interop) package. |
|||
|
|||
3. `Interop\Container\ContainerInterface` |
|||
----------------------------------------- |
|||
|
|||
```php |
|||
<?php |
|||
namespace Interop\Container; |
|||
|
|||
use Interop\Container\Exception\ContainerException; |
|||
use Interop\Container\Exception\NotFoundException; |
|||
|
|||
/** |
|||
* Describes the interface of a container that exposes methods to read its entries. |
|||
*/ |
|||
interface ContainerInterface |
|||
{ |
|||
/** |
|||
* Finds an entry of the container by its identifier and returns it. |
|||
* |
|||
* @param string $id Identifier of the entry to look for. |
|||
* |
|||
* @throws NotFoundException No entry was found for this identifier. |
|||
* @throws ContainerException Error while retrieving the entry. |
|||
* |
|||
* @return mixed Entry. |
|||
*/ |
|||
public function get($id); |
|||
|
|||
/** |
|||
* Returns true if the container can return an entry for the given identifier. |
|||
* Returns false otherwise. |
|||
* |
|||
* @param string $id Identifier of the entry to look for. |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function has($id); |
|||
} |
|||
``` |
|||
|
|||
4. `Interop\Container\Exception\ContainerException` |
|||
--------------------------------------------------- |
|||
|
|||
```php |
|||
<?php |
|||
namespace Interop\Container\Exception; |
|||
|
|||
/** |
|||
* Base interface representing a generic exception in a container. |
|||
*/ |
|||
interface ContainerException |
|||
{ |
|||
} |
|||
``` |
|||
|
|||
5. `Interop\Container\Exception\NotFoundException` |
|||
--------------------------------------------------- |
|||
|
|||
```php |
|||
<?php |
|||
namespace Interop\Container\Exception; |
|||
|
|||
/** |
|||
* No entry was found in the container. |
|||
*/ |
|||
interface NotFoundException extends ContainerException |
|||
{ |
|||
} |
|||
``` |
@ -0,0 +1,259 @@ |
|||
Delegate lookup feature Meta Document |
|||
===================================== |
|||
|
|||
1. Summary |
|||
---------- |
|||
|
|||
This document describes the *delegate lookup feature*. |
|||
Containers are not required to implement this feature to respect the `ContainerInterface`. |
|||
However, containers implementing this feature will offer a greater lever of interoperability |
|||
with other containers, allowing multiple containers to share entries in the same application. |
|||
Implementation of this feature is therefore recommanded. |
|||
|
|||
2. Why Bother? |
|||
-------------- |
|||
|
|||
The [`ContainerInterface`](../src/Interop/Container/ContainerInterface.php) ([meta doc](ContainerInterface.md)) |
|||
standardizes how frameworks and libraries make use of a container to obtain objects and parameters. |
|||
|
|||
By standardizing such a behavior, frameworks and libraries relying on the `ContainerInterface` |
|||
could work with any compatible container. |
|||
That would allow end users to choose their own container based on their own preferences. |
|||
|
|||
The `ContainerInterface` is also enough if we want to have several containers side-by-side in the same |
|||
application. For instance, this is what the [CompositeContainer](https://github.com/jeremeamia/acclimate-container/blob/master/src/CompositeContainer.php) |
|||
class of [Acclimate](https://github.com/jeremeamia/acclimate-container) is designed for: |
|||
|
|||
![Side by side containers](images/side_by_side_containers.png) |
|||
|
|||
However, an instance in container 1 cannot reference an instance in container 2. |
|||
|
|||
It would be better if an instance of container 1 could reference an instance in container 2, |
|||
and the opposite should be true. |
|||
|
|||
![Interoperating containers](images/interoperating_containers.png) |
|||
|
|||
In the sample above, entry 1 in container 1 is referencing entry 3 in container 2. |
|||
|
|||
3. Scope |
|||
-------- |
|||
|
|||
### 3.1 Goals |
|||
|
|||
The goal of the *delegate lookup* feature is to allow several containers to share entries. |
|||
|
|||
4. Approaches |
|||
------------- |
|||
|
|||
### 4.1 Chosen Approach |
|||
|
|||
Containers implementing this feature can perform dependency lookups in other containers. |
|||
|
|||
A container implementing this feature: |
|||
|
|||
- must implement the `ContainerInterface` |
|||
- must provide a way to register a *delegate container* (using a constructor parameter, or a setter, or any |
|||
possible way). The *delegate container* must implement the `ContainerInterface`. |
|||
|
|||
When a *delegate container* is configured on a container: |
|||
|
|||
- Calls to the `get` method should only return an entry if the entry is part of the container. |
|||
If the entry is not part of the container, an exception should be thrown (as required in the `ContainerInterface`). |
|||
- Calls to the `has` method should only return *true* if the entry is part of the container. |
|||
If the entry is not part of the container, *false* should be returned. |
|||
- Finally, the important part: if the entry we are fetching has dependencies, |
|||
**instead** of perfoming the dependency lookup in the container, the lookup is performed on the *delegate container*. |
|||
|
|||
Important! By default, the lookup should be performed on the delegate container **only**, not on the container itself. |
|||
|
|||
It is however allowed for containers to provide exception cases for special entries, and a way to lookup into |
|||
the same container (or another container) instead of the delegate container. |
|||
|
|||
### 4.2 Typical usage |
|||
|
|||
The *delegate container* will usually be a composite container. A composite container is a container that |
|||
contains several other containers. When performing a lookup on a composite container, the inner containers are |
|||
queried until one container returns an entry. |
|||
An inner container implementing the *delegate lookup feature* will return entries it contains, but if these |
|||
entries have dependencies, the dependencies lookup calls will be performed on the composite container, giving |
|||
a chance to all containers to answer. |
|||
|
|||
Interestingly enough, the order in which containers are added in the composite container matters. Indeed, |
|||
the first containers to be added in the composite container can "override" the entries of containers with |
|||
lower priority. |
|||
|
|||
![Containers priority](images/priority.png) |
|||
|
|||
In the example above, "container 2" contains a controller "myController" and the controller is referencing an |
|||
"entityManager" entry. "Container 1" contains also an entry named "entityManager". |
|||
Without the *delegate lookup* feature, when requesting the "myController" instance to container 2, it would take |
|||
in charge the instanciation of both entries. |
|||
|
|||
However, using the *delegate lookup* feature, here is what happens when we ask the composite controller for the |
|||
"myController" instance: |
|||
|
|||
- The composite controller asks container 1 if if contains the "myController" instance. The answer is no. |
|||
- The composite controller asks container 2 if if contains the "myController" instance. The answer is yes. |
|||
- The composite controller performs a `get` call on container 2 for the "myController" instance. |
|||
- Container 2 sees that "myController" has a dependency on "entityManager". |
|||
- Container 2 delegates the lookup of "entityManager" to the composite controller. |
|||
- The composite controller asks container 1 if if contains the "entityManager" instance. The answer is yes. |
|||
- The composite controller performs a `get` call on container 1 for the "entityManager" instance. |
|||
|
|||
In the end, we get a controller instanciated by container 2 that references an entityManager instanciated |
|||
by container 1. |
|||
|
|||
### 4.3 Alternative: the fallback strategy |
|||
|
|||
The first proposed approach we tried was to perform all the lookups in the "local" container, |
|||
and if a lookup fails in the container, to use the delegate container. In this scenario, the |
|||
delegate container is used in "fallback" mode. |
|||
|
|||
This strategy has been described in @moufmouf blog post: http://mouf-php.com/container-interop-whats-next (solution 1). |
|||
It was also discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-33570697) and |
|||
[here](https://github.com/container-interop/container-interop/pull/20#issuecomment-56599631). |
|||
|
|||
Problems with this strategy: |
|||
|
|||
- Heavy problem regarding infinite loops |
|||
- Unable to overload a container entry with the delegate container entry |
|||
|
|||
### 4.4 Alternative: force implementing an interface |
|||
|
|||
The first proposed approach was to develop a `ParentAwareContainerInterface` interface. |
|||
It was proposed here: https://github.com/container-interop/container-interop/pull/8 |
|||
|
|||
The interface would have had the behaviour of the delegate lookup feature but would have forced the addition of |
|||
a `setParentContainter` method: |
|||
|
|||
```php |
|||
interface ParentAwareContainerInterface extends ReadableContainerInterface { |
|||
/** |
|||
* Sets the parent container associated to that container. This container will call |
|||
* the parent container to fetch dependencies. |
|||
* |
|||
* @param ContainerInterface $container |
|||
*/ |
|||
public function setParentContainer(ContainerInterface $container); |
|||
} |
|||
``` |
|||
|
|||
The interface idea was first questioned by @Ocramius [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51721777). |
|||
@Ocramius expressed the idea that an interface should not contain setters, otherwise, it is forcing implementation |
|||
details on the class implementing the interface. |
|||
Then @mnapoli made a proposal for a "convention" [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51841079), |
|||
this idea was further discussed until all participants in the discussion agreed to remove the interface idea |
|||
and replace it with a "standard" feature. |
|||
|
|||
**Pros:** |
|||
|
|||
If we had had an interface, we could have delegated the registration of the delegate/composite container to the |
|||
the delegate/composite container itself. |
|||
For instance: |
|||
|
|||
```php |
|||
$containerA = new ContainerA(); |
|||
$containerB = new ContainerB(); |
|||
|
|||
$compositeContainer = new CompositeContainer([$containerA, $containerB]); |
|||
|
|||
// The call to 'setParentContainer' is delegated to the CompositeContainer |
|||
// It is not the responsibility of the user anymore. |
|||
class CompositeContainer { |
|||
... |
|||
|
|||
public function __construct($containers) { |
|||
foreach ($containers as $container) { |
|||
if ($container instanceof ParentAwareContainerInterface) { |
|||
$container->setParentContainer($this); |
|||
} |
|||
} |
|||
... |
|||
} |
|||
} |
|||
|
|||
``` |
|||
|
|||
**Cons:** |
|||
|
|||
Cons have been extensively discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51721777). |
|||
Basically, forcing a setter into an interface is a bad idea. Setters are similar to constructor arguments, |
|||
and it's a bad idea to standardize a constructor: how the delegate container is configured into a container is an implementation detail. This outweights the benefits of the interface. |
|||
|
|||
### 4.4 Alternative: no exception case for delegate lookups |
|||
|
|||
Originally, the proposed wording for delegate lookup calls was: |
|||
|
|||
> Important! The lookup MUST be performed on the delegate container **only**, not on the container itself. |
|||
|
|||
This was later replaced by: |
|||
|
|||
> Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself. |
|||
> |
|||
> It is however allowed for containers to provide exception cases for special entries, and a way to lookup |
|||
> into the same container (or another container) instead of the delegate container. |
|||
|
|||
Exception cases have been allowed to avoid breaking dependencies with some services that must be provided |
|||
by the container (on @njasm proposal). This was proposed here: https://github.com/container-interop/container-interop/pull/20#issuecomment-56597235 |
|||
|
|||
### 4.5 Alternative: having one of the containers act as the composite container |
|||
|
|||
In real-life scenarios, we usually have a big framework (Symfony 2, Zend Framework 2, etc...) and we want to |
|||
add another DI container to this container. Most of the time, the "big" framework will be responsible for |
|||
creating the controller's instances, using it's own DI container. Until *container-interop* is fully adopted, |
|||
the "big" framework will not be aware of the existence of a composite container that it should use instead |
|||
of its own container. |
|||
|
|||
For this real-life use cases, @mnapoli and @moufmouf proposed to extend the "big" framework's DI container |
|||
to make it act as a composite container. |
|||
|
|||
This has been discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-40367194) |
|||
and [here](http://mouf-php.com/container-interop-whats-next#solution4). |
|||
|
|||
This was implemented in Symfony 2 using: |
|||
|
|||
- [interop.symfony.di](https://github.com/thecodingmachine/interop.symfony.di/tree/v0.1.0) |
|||
- [framework interop](https://github.com/mnapoli/framework-interop/) |
|||
|
|||
This was implemented in Silex using: |
|||
|
|||
- [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di) |
|||
|
|||
Having a container act as the composite container is not part of the delegate lookup standard because it is |
|||
simply a temporary design pattern used to make existing frameworks that do not support yet ContainerInterop |
|||
play nice with other DI containers. |
|||
|
|||
|
|||
5. Implementations |
|||
------------------ |
|||
|
|||
The following projects already implement the delegate lookup feature: |
|||
|
|||
- [Mouf](http://mouf-php.com), through the [`setDelegateLookupContainer` method](https://github.com/thecodingmachine/mouf/blob/2.0/src/Mouf/MoufManager.php#L2120) |
|||
- [PHP-DI](http://php-di.org/), through the [`$wrapperContainer` parameter of the constructor](https://github.com/mnapoli/PHP-DI/blob/master/src/DI/Container.php#L72) |
|||
- [pimple-interop](https://github.com/moufmouf/pimple-interop), through the [`$container` parameter of the constructor](https://github.com/moufmouf/pimple-interop/blob/master/src/Interop/Container/Pimple/PimpleInterop.php#L62) |
|||
|
|||
6. People |
|||
--------- |
|||
|
|||
Are listed here all people that contributed in the discussions, by alphabetical order: |
|||
|
|||
- [Alexandru Pătrănescu](https://github.com/drealecs) |
|||
- [Ben Peachey](https://github.com/potherca) |
|||
- [David Négrier](https://github.com/moufmouf) |
|||
- [Jeremy Lindblom](https://github.com/jeremeamia) |
|||
- [Marco Pivetta](https://github.com/Ocramius) |
|||
- [Matthieu Napoli](https://github.com/mnapoli) |
|||
- [Nelson J Morais](https://github.com/njasm) |
|||
- [Phil Sturgeon](https://github.com/philsturgeon) |
|||
- [Stephan Hochdörfer](https://github.com/shochdoerfer) |
|||
|
|||
7. Relevant Links |
|||
----------------- |
|||
|
|||
_**Note:** Order descending chronologically._ |
|||
|
|||
- [Pull request on the delegate lookup feature](https://github.com/container-interop/container-interop/pull/20) |
|||
- [Pull request on the interface idea](https://github.com/container-interop/container-interop/pull/8) |
|||
- [Original article exposing the delegate lookup idea along many others](http://mouf-php.com/container-interop-whats-next) |
|||
|
@ -0,0 +1,60 @@ |
|||
Delegate lookup feature |
|||
======================= |
|||
|
|||
This document describes a standard for dependency injection containers. |
|||
|
|||
The goal set by the *delegate lookup* feature is to allow several containers to share entries. |
|||
Containers implementing this feature can perform dependency lookups in other containers. |
|||
|
|||
Containers implementing this feature will offer a greater lever of interoperability |
|||
with other containers. Implementation of this feature is therefore RECOMMENDED. |
|||
|
|||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", |
|||
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be |
|||
interpreted as described in [RFC 2119][]. |
|||
|
|||
The word `implementor` in this document is to be interpreted as someone |
|||
implementing the delegate lookup feature in a dependency injection-related library or framework. |
|||
Users of dependency injections containers (DIC) are refered to as `user`. |
|||
|
|||
[RFC 2119]: http://tools.ietf.org/html/rfc2119 |
|||
|
|||
1. Vocabulary |
|||
------------- |
|||
|
|||
In a dependency injection container, the container is used to fetch entries. |
|||
Entries can have dependencies on other entries. Usually, these other entries are fetched by the container. |
|||
|
|||
The *delegate lookup* feature is the ability for a container to fetch dependencies in |
|||
another container. In the rest of the document, the word "container" will reference the container |
|||
implemented by the implementor. The word "delegate container" will reference the container we are |
|||
fetching the dependencies from. |
|||
|
|||
2. Specification |
|||
---------------- |
|||
|
|||
A container implementing the *delegate lookup* feature: |
|||
|
|||
- MUST implement the [`ContainerInterface`](ContainerInterface.md) |
|||
- MUST provide a way to register a delegate container (using a constructor parameter, or a setter, |
|||
or any possible way). The delegate container MUST implement the [`ContainerInterface`](ContainerInterface.md). |
|||
|
|||
When a container is configured to use a delegate container for dependencies: |
|||
|
|||
- Calls to the `get` method should only return an entry if the entry is part of the container. |
|||
If the entry is not part of the container, an exception should be thrown |
|||
(as requested by the [`ContainerInterface`](ContainerInterface.md)). |
|||
- Calls to the `has` method should only return `true` if the entry is part of the container. |
|||
If the entry is not part of the container, `false` should be returned. |
|||
- If the fetched entry has dependencies, **instead** of performing |
|||
the dependency lookup in the container, the lookup is performed on the *delegate container*. |
|||
|
|||
Important: By default, the dependency lookups SHOULD be performed on the delegate container **only**, not on the container itself. |
|||
|
|||
It is however allowed for containers to provide exception cases for special entries, and a way to lookup |
|||
into the same container (or another container) instead of the delegate container. |
|||
|
|||
3. Package / Interface |
|||
---------------------- |
|||
|
|||
This feature is not tied to any code, interface or package. |
After Width: 603 | Height: 548 | Size: 35 KiB |
After Width: 595 | Height: 383 | Size: 22 KiB |
After Width: 594 | Height: 382 | Size: 22 KiB |
@ -0,0 +1,37 @@ |
|||
<?php |
|||
/** |
|||
* @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file) |
|||
*/ |
|||
|
|||
namespace Interop\Container; |
|||
|
|||
use Interop\Container\Exception\ContainerException; |
|||
use Interop\Container\Exception\NotFoundException; |
|||
|
|||
/** |
|||
* Describes the interface of a container that exposes methods to read its entries. |
|||
*/ |
|||
interface ContainerInterface |
|||
{ |
|||
/** |
|||
* Finds an entry of the container by its identifier and returns it. |
|||
* |
|||
* @param string $id Identifier of the entry to look for. |
|||
* |
|||
* @throws NotFoundException No entry was found for this identifier. |
|||
* @throws ContainerException Error while retrieving the entry. |
|||
* |
|||
* @return mixed Entry. |
|||
*/ |
|||
public function get($id); |
|||
|
|||
/** |
|||
* Returns true if the container can return an entry for the given identifier. |
|||
* Returns false otherwise. |
|||
* |
|||
* @param string $id Identifier of the entry to look for. |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function has($id); |
|||
} |
@ -0,0 +1,13 @@ |
|||
<?php |
|||
/** |
|||
* @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file) |
|||
*/ |
|||
|
|||
namespace Interop\Container\Exception; |
|||
|
|||
/** |
|||
* Base interface representing a generic exception in a container. |
|||
*/ |
|||
interface ContainerException |
|||
{ |
|||
} |
@ -0,0 +1,13 @@ |
|||
<?php |
|||
/** |
|||
* @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file) |
|||
*/ |
|||
|
|||
namespace Interop\Container\Exception; |
|||
|
|||
/** |
|||
* No entry was found in the container. |
|||
*/ |
|||
interface NotFoundException extends ContainerException |
|||
{ |
|||
} |
@ -0,0 +1 @@ |
|||
assume_php=false |
@ -0,0 +1,12 @@ |
|||
language: php |
|||
|
|||
php: |
|||
- 5.4 |
|||
- 5.5 |
|||
- 5.6 |
|||
- 7.0 |
|||
- hhvm |
|||
|
|||
matrix: |
|||
allow_failures: |
|||
- php: 7.0 |
@ -0,0 +1,126 @@ |
|||
<?hh // decl |
|||
|
|||
namespace FastRoute { |
|||
class BadRouteException extends \LogicException { |
|||
} |
|||
|
|||
interface RouteParser { |
|||
public function parse(string $route): array<array>; |
|||
} |
|||
|
|||
class RouteCollector { |
|||
public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator); |
|||
public function addRoute(mixed $httpMethod, string $route, mixed $handler): void; |
|||
public function getData(): array; |
|||
} |
|||
|
|||
class Route { |
|||
public function __construct(string $httpMethod, mixed $handler, string $regex, array $variables); |
|||
public function matches(string $str): bool; |
|||
} |
|||
|
|||
interface DataGenerator { |
|||
public function addRoute(string $httpMethod, array $routeData, mixed $handler); |
|||
public function getData(): array; |
|||
} |
|||
|
|||
interface Dispatcher { |
|||
const int NOT_FOUND = 0; |
|||
const int FOUND = 1; |
|||
const int METHOD_NOT_ALLOWED = 2; |
|||
public function dispatch(string $httpMethod, string $uri): array; |
|||
} |
|||
|
|||
function simpleDispatcher( |
|||
(function(RouteCollector): void) $routeDefinitionCallback, |
|||
shape( |
|||
'routeParser' => ?classname<RouteParser>, |
|||
'dataGenerator' => ?classname<DataGenerator>, |
|||
'dispatcher' => ?classname<Dispatcher>, |
|||
'routeCollector' => ?classname<RouteCollector>, |
|||
) $options = shape()): Dispatcher; |
|||
|
|||
function cachedDispatcher( |
|||
(function(RouteCollector): void) $routeDefinitionCallback, |
|||
shape( |
|||
'routeParser' => ?classname<RouteParser>, |
|||
'dataGenerator' => ?classname<DataGenerator>, |
|||
'dispatcher' => ?classname<Dispatcher>, |
|||
'routeCollector' => ?classname<RouteCollector>, |
|||
'cacheDisabled' => ?bool, |
|||
'cacheFile' => ?string, |
|||
) $options = shape()): Dispatcher; |
|||
} |
|||
|
|||
namespace FastRoute\DataGenerator { |
|||
abstract class RegexBasedAbstract implements \FastRoute\DataGenerator { |
|||
protected abstract function getApproxChunkSize(); |
|||
protected abstract function processChunk($regexToRoutesMap); |
|||
|
|||
public function addRoute(string $httpMethod, array $routeData, mixed $handler): void; |
|||
public function getData(): array; |
|||
} |
|||
|
|||
class CharCountBased extends RegexBasedAbstract { |
|||
protected function getApproxChunkSize(): int; |
|||
protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>; |
|||
} |
|||
|
|||
class GroupCountBased extends RegexBasedAbstract { |
|||
protected function getApproxChunkSize(): int; |
|||
protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>; |
|||
} |
|||
|
|||
class GroupPosBased extends RegexBasedAbstract { |
|||
protected function getApproxChunkSize(): int; |
|||
protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>; |
|||
} |
|||
|
|||
class MarkBased extends RegexBasedAbstract { |
|||
protected function getApproxChunkSize(): int; |
|||
protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>; |
|||
} |
|||
} |
|||
|
|||
namespace FastRoute\Dispatcher { |
|||
abstract class RegexBasedAbstract implements \FastRoute\Dispatcher { |
|||
protected abstract function dispatchVariableRoute(array<array> $routeData, string $uri): array; |
|||
|
|||
public function dispatch(string $httpMethod, string $uri): array; |
|||
} |
|||
|
|||
class GroupPosBased extends RegexBasedAbstract { |
|||
public function __construct(array $data); |
|||
protected function dispatchVariableRoute(array<array> $routeData, string $uri): array; |
|||
} |
|||
|
|||
class GroupCountBased extends RegexBasedAbstract { |
|||
public function __construct(array $data); |
|||
protected function dispatchVariableRoute(array<array> $routeData, string $uri): array; |
|||
} |
|||
|
|||
class CharCountBased extends RegexBasedAbstract { |
|||
public function __construct(array $data); |
|||
protected function dispatchVariableRoute(array<array> $routeData, string $uri): array; |
|||
} |
|||
|
|||
class MarkBased extends RegexBasedAbstract { |
|||
public function __construct(array $data); |
|||
protected function dispatchVariableRoute(array<array> $routeData, string $uri): array; |
|||
} |
|||
} |
|||
|
|||
namespace FastRoute\RouteParser { |
|||
class Std implements \FastRoute\RouteParser { |
|||
const string VARIABLE_REGEX = <<<'REGEX' |
|||
\{ |
|||
\s* ([a-zA-Z][a-zA-Z0-9_]*) \s* |
|||
(?: |
|||
: \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*) |
|||
)? |
|||
\} |
|||
REGEX; |
|||
const string DEFAULT_DISPATCH_REGEX = '[^/]+'; |
|||
public function parse(string $route): array<array>; |
|||
} |
|||
} |
@ -0,0 +1,31 @@ |
|||
Copyright (c) 2013 by Nikita Popov. |
|||
|
|||
Some rights reserved. |
|||
|
|||
Redistribution and use in source and binary forms, with or without |
|||
modification, are permitted provided that the following conditions are |
|||
met: |
|||
|
|||
* Redistributions of source code must retain the above copyright |
|||
notice, this list of conditions and the following disclaimer. |
|||
|
|||
* Redistributions in binary form must reproduce the above |
|||
copyright notice, this list of conditions and the following |
|||
disclaimer in the documentation and/or other materials provided |
|||
with the distribution. |
|||
|
|||
* The names of the contributors may not be used to endorse or |
|||
promote products derived from this software without specific |
|||
prior written permission. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,273 @@ |
|||
FastRoute - Fast request router for PHP |
|||
======================================= |
|||
|
|||
This library provides a fast implementation of a regular expression based router. [Blog post explaining how the |
|||
implementation works and why it is fast.][blog_post] |
|||
|
|||
Install |
|||
------- |
|||
|
|||
To install with composer: |
|||
|
|||
```sh |
|||
composer require nikic/fast-route |
|||
``` |
|||
|
|||
Requires PHP 5.4 or newer. |
|||
|
|||
Usage |
|||
----- |
|||
|
|||
Here's a basic usage example: |
|||
|
|||
```php |
|||
<?php |
|||
|
|||
require '/path/to/vendor/autoload.php'; |
|||
|
|||
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) { |
|||
$r->addRoute('GET', '/users', 'get_all_users_handler'); |
|||
// {id} must be a number (\d+) |
|||
$r->addRoute('GET', '/user/{id:\d+}', 'get_user_handler'); |
|||
// The /{title} suffix is optional |
|||
$r->addRoute('GET', '/articles/{id:\d+}[/{title}]', 'get_article_handler'); |
|||
}); |
|||
|
|||
// Fetch method and URI from somewhere |
|||
$httpMethod = $_SERVER['REQUEST_METHOD']; |
|||
$uri = $_SERVER['REQUEST_URI']; |
|||
|
|||
// Strip query string (?foo=bar) and decode URI |
|||
if (false !== $pos = strpos($uri, '?')) { |
|||
$uri = substr($uri, 0, $pos); |
|||
} |
|||
$uri = rawurldecode($uri); |
|||
|
|||
$routeInfo = $dispatcher->dispatch($httpMethod, $uri); |
|||
switch ($routeInfo[0]) { |
|||
case FastRoute\Dispatcher::NOT_FOUND: |
|||
// ... 404 Not Found |
|||
break; |
|||
case FastRoute\Dispatcher::METHOD_NOT_ALLOWED: |
|||
$allowedMethods = $routeInfo[1]; |
|||
// ... 405 Method Not Allowed |
|||
break; |
|||
case FastRoute\Dispatcher::FOUND: |
|||
$handler = $routeInfo[1]; |
|||
$vars = $routeInfo[2]; |
|||
// ... call $handler with $vars |
|||
break; |
|||
} |
|||
``` |
|||
|
|||
### Defining routes |
|||
|
|||
The routes are defined by calling the `FastRoute\simpleDispatcher()` function, which accepts |
|||
a callable taking a `FastRoute\RouteCollector` instance. The routes are added by calling |
|||
`addRoute()` on the collector instance: |
|||
|
|||
```php |
|||
$r->addRoute($method, $routePattern, $handler); |
|||
``` |
|||
|
|||
The `$method` is an uppercase HTTP method string for which a certain route should match. It |
|||
is possible to specify multiple valid methods using an array: |
|||
|
|||
```php |
|||
// These two calls |
|||
$r->addRoute('GET', '/test', 'handler'); |
|||
$r->addRoute('POST', '/test', 'handler'); |
|||
// Are equivalent to this one call |
|||
$r->addRoute(['GET', 'POST'], '/test', 'handler'); |
|||
``` |
|||
|
|||
By default the `$routePattern` uses a syntax where `{foo}` specifies a placeholder with name `foo` |
|||
and matching the regex `[^/]+`. To adjust the pattern the placeholder matches, you can specify |
|||
a custom pattern by writing `{bar:[0-9]+}`. Some examples: |
|||
|
|||
```php |
|||
// Matches /user/42, but not /user/xyz |
|||
$r->addRoute('GET', '/user/{id:\d+}', 'handler'); |
|||
|
|||
// Matches /user/foobar, but not /user/foo/bar |
|||
$r->addRoute('GET', '/user/{name}', 'handler'); |
|||
|
|||
// Matches /user/foo/bar as well |
|||
$r->addRoute('GET', '/user/{name:.+}', 'handler'); |
|||
``` |
|||
|
|||
Custom patterns for route placeholders cannot use capturing groups. For example `{lang:(en|de)}` |
|||
is not a valid placeholder, because `()` is a capturing group. Instead you can use either |
|||
`{lang:en|de}` or `{lang:(?:en|de)}`. |
|||
|
|||
Furthermore parts of the route enclosed in `[...]` are considered optional, so that `/foo[bar]` |
|||
will match both `/foo` and `/foobar`. Optional parts are only supported in a trailing position, |
|||
not in the middle of a route. |
|||
|
|||
```php |
|||
// This route |
|||
$r->addRoute('GET', '/user/{id:\d+}[/{name}]', 'handler'); |
|||
// Is equivalent to these two routes |
|||
$r->addRoute('GET', '/user/{id:\d+}', 'handler'); |
|||
$r->addRoute('GET', '/user/{id:\d+}/{name}', 'handler'); |
|||
|
|||
// Multiple nested optional parts are possible as well |
|||
$r->addRoute('GET', '/user[/{id:\d+}[/{name}]]', 'handler'); |
|||
|
|||
// This route is NOT valid, because optional parts can only occur at the end |
|||
$r->addRoute('GET', '/user[/{id:\d+}]/{name}', 'handler'); |
|||
``` |
|||
|
|||
The `$handler` parameter does not necessarily have to be a callback, it could also be a controller |
|||
class name or any other kind of data you wish to associate with the route. FastRoute only tells you |
|||
which handler corresponds to your URI, how you interpret it is up to you. |
|||
|
|||
### Caching |
|||
|
|||
The reason `simpleDispatcher` accepts a callback for defining the routes is to allow seamless |
|||
caching. By using `cachedDispatcher` instead of `simpleDispatcher` you can cache the generated |
|||
routing data and construct the dispatcher from the cached information: |
|||
|
|||
```php |
|||
<?php |
|||
|
|||
$dispatcher = FastRoute\cachedDispatcher(function(FastRoute\RouteCollector $r) { |
|||
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); |
|||
$r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); |
|||
$r->addRoute('GET', '/user/{name}', 'handler2'); |
|||
}, [ |
|||
'cacheFile' => __DIR__ . '/route.cache', /* required */ |
|||
'cacheDisabled' => IS_DEBUG_ENABLED, /* optional, enabled by default */ |
|||
]); |
|||
``` |
|||
|
|||
The second parameter to the function is an options array, which can be used to specify the cache |
|||
file location, among other things. |
|||
|
|||
### Dispatching a URI |
|||
|
|||
A URI is dispatched by calling the `dispatch()` method of the created dispatcher. This method |
|||
accepts the HTTP method and a URI. Getting those two bits of information (and normalizing them |
|||
appropriately) is your job - this library is not bound to the PHP web SAPIs. |
|||
|
|||
The `dispatch()` method returns an array whose first element contains a status code. It is one |
|||
of `Dispatcher::NOT_FOUND`, `Dispatcher::METHOD_NOT_ALLOWED` and `Dispatcher::FOUND`. For the |
|||
method not allowed status the second array element contains a list of HTTP methods allowed for |
|||
the supplied URI. For example: |
|||
|
|||
[FastRoute\Dispatcher::METHOD_NOT_ALLOWED, ['GET', 'POST']] |
|||
|
|||
> **NOTE:** The HTTP specification requires that a `405 Method Not Allowed` response include the |
|||
`Allow:` header to detail available methods for the requested resource. Applications using FastRoute |
|||
should use the second array element to add this header when relaying a 405 response. |
|||
|
|||
For the found status the second array element is the handler that was associated with the route |
|||
and the third array element is a dictionary of placeholder names to their values. For example: |
|||
|
|||
/* Routing against GET /user/nikic/42 */ |
|||
|
|||
[FastRoute\Dispatcher::FOUND, 'handler0', ['name' => 'nikic', 'id' => '42']] |
|||
|
|||
### Overriding the route parser and dispatcher |
|||
|
|||
The routing process makes use of three components: A route parser, a data generator and a |
|||
dispatcher. The three components adhere to the following interfaces: |
|||
|
|||
```php |
|||
<?php |
|||
|
|||
namespace FastRoute; |
|||
|
|||
interface RouteParser { |
|||
public function parse($route); |
|||
} |
|||
|
|||
interface DataGenerator { |
|||
public function addRoute($httpMethod, $routeData, $handler); |
|||
public function getData(); |
|||
} |
|||
|
|||
interface Dispatcher { |
|||
const NOT_FOUND = 0, FOUND = 1, METHOD_NOT_ALLOWED = 2; |
|||
|
|||
public function dispatch($httpMethod, $uri); |
|||
} |
|||
``` |
|||
|
|||
The route parser takes a route pattern string and converts it into an array of route infos, where |
|||
each route info is again an array of it's parts. The structure is best understood using an example: |
|||
|
|||
/* The route /user/{id:\d+}[/{name}] converts to the following array: */ |
|||
[ |
|||
[ |
|||
'/user/', |
|||
['id', '\d+'], |
|||
], |
|||
[ |
|||
'/user/', |
|||
['id', '\d+'], |
|||
'/', |
|||
['name', '[^/]+'], |
|||
], |
|||
] |
|||
|
|||
This array can then be passed to the `addRoute()` method of a data generator. After all routes have |
|||
been added the `getData()` of the generator is invoked, which returns all the routing data required |
|||
by the dispatcher. The format of this data is not further specified - it is tightly coupled to |
|||
the corresponding dispatcher. |
|||
|
|||
The dispatcher accepts the routing data via a constructor and provides a `dispatch()` method, which |
|||
you're already familiar with. |
|||
|
|||
The route parser can be overwritten individually (to make use of some different pattern syntax), |
|||
however the data generator and dispatcher should always be changed as a pair, as the output from |
|||
the former is tightly coupled to the input of the latter. The reason the generator and the |
|||
dispatcher are separate is that only the latter is needed when using caching (as the output of |
|||
the former is what is being cached.) |
|||
|
|||
When using the `simpleDispatcher` / `cachedDispatcher` functions from above the override happens |
|||
through the options array: |
|||
|
|||
```php |
|||
<?php |
|||
|
|||
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) { |
|||
/* ... */ |
|||
}, [ |
|||
'routeParser' => 'FastRoute\\RouteParser\\Std', |
|||
'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', |
|||
'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased', |
|||
]); |
|||
``` |
|||
|
|||
The above options array corresponds to the defaults. By replacing `GroupCountBased` by |
|||
`GroupPosBased` you could switch to a different dispatching strategy. |
|||
|
|||
### A Note on HEAD Requests |
|||
|
|||
The HTTP spec requires servers to [support both GET and HEAD methods][2616-511]: |
|||
|
|||
> The methods GET and HEAD MUST be supported by all general-purpose servers |
|||
|
|||
To avoid forcing users to manually register HEAD routes for each resource we fallback to matching an |
|||
available GET route for a given resource. The PHP web SAPI transparently removes the entity body |
|||
from HEAD responses so this behavior has no effect on the vast majority of users. |
|||
|
|||
However, implementers using FastRoute outside the web SAPI environment (e.g. a custom server) MUST |
|||
NOT send entity bodies generated in response to HEAD requests. If you are a non-SAPI user this is |
|||
*your responsibility*; FastRoute has no purview to prevent you from breaking HTTP in such cases. |
|||
|
|||
Finally, note that applications MAY always specify their own HEAD method route for a given |
|||
resource to bypass this behavior entirely. |
|||
|
|||
### Credits |
|||
|
|||
This library is based on a router that [Levi Morrison][levi] implemented for the Aerys server. |
|||
|
|||
A large number of tests, as well as HTTP compliance considerations, were provided by [Daniel Lowrey][rdlowrey]. |
|||
|
|||
|
|||
[2616-511]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.1 "RFC 2616 Section 5.1.1" |
|||
[blog_post]: http://nikic.github.io/2014/02/18/Fast-request-routing-using-regular-expressions.html |
|||
[levi]: https://github.com/morrisonlevi |
|||
[rdlowrey]: https://github.com/rdlowrey |
@ -0,0 +1,21 @@ |
|||
{ |
|||
"name": "nikic/fast-route", |
|||
"description": "Fast request router for PHP", |
|||
"keywords": ["routing", "router"], |
|||
"license": "BSD-3-Clause", |
|||
"authors": [ |
|||
{ |
|||
"name": "Nikita Popov", |
|||
"email": "nikic@php.net" |
|||
} |
|||
], |
|||
"require": { |
|||
"php": ">=5.4.0" |
|||
}, |
|||
"autoload": { |
|||
"psr-4": { |
|||
"FastRoute\\": "src/" |
|||
}, |
|||
"files": ["src/functions.php"] |
|||
} |
|||
} |
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
|
|||
<phpunit backupGlobals="false" |
|||
backupStaticAttributes="false" |
|||
colors="true" |
|||
convertErrorsToExceptions="true" |
|||
convertNoticesToExceptions="true" |
|||
convertWarningsToExceptions="true" |
|||
processIsolation="false" |
|||
syntaxCheck="false" |
|||
bootstrap="test/bootstrap.php" |
|||
> |
|||
<testsuites> |
|||
<testsuite name="FastRoute Tests"> |
|||
<directory>./test/</directory> |
|||
</testsuite> |
|||
</testsuites> |
|||
|
|||
<filter> |
|||
<whitelist> |
|||
<directory>./src/</directory> |
|||
</whitelist> |
|||
</filter> |
|||
</phpunit> |
@ -0,0 +1,6 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute; |
|||
|
|||
class BadRouteException extends \LogicException { |
|||
} |
@ -0,0 +1,25 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute; |
|||
|
|||
interface DataGenerator { |
|||
/** |
|||
* Adds a route to the data generator. The route data uses the |
|||
* same format that is returned by RouterParser::parser(). |
|||
* |
|||
* The handler doesn't necessarily need to be a callable, it |
|||
* can be arbitrary data that will be returned when the route |
|||
* matches. |
|||
* |
|||
* @param string $httpMethod |
|||
* @param array $routeData |
|||
* @param mixed $handler |
|||
*/ |
|||
public function addRoute($httpMethod, $routeData, $handler); |
|||
|
|||
/** |
|||
* Returns dispatcher data in some unspecified format, which |
|||
* depends on the used method of dispatch. |
|||
*/ |
|||
public function getData(); |
|||
} |
@ -0,0 +1,28 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\DataGenerator; |
|||
|
|||
class CharCountBased extends RegexBasedAbstract { |
|||
protected function getApproxChunkSize() { |
|||
return 30; |
|||
} |
|||
|
|||
protected function processChunk($regexToRoutesMap) { |
|||
$routeMap = []; |
|||
$regexes = []; |
|||
|
|||
$suffixLen = 0; |
|||
$suffix = ''; |
|||
$count = count($regexToRoutesMap); |
|||
foreach ($regexToRoutesMap as $regex => $route) { |
|||
$suffixLen++; |
|||
$suffix .= "\t"; |
|||
|
|||
$regexes[] = '(?:' . $regex . '/(\t{' . $suffixLen . '})\t{' . ($count - $suffixLen) . '})'; |
|||
$routeMap[$suffix] = [$route->handler, $route->variables]; |
|||
} |
|||
|
|||
$regex = '~^(?|' . implode('|', $regexes) . ')$~'; |
|||
return ['regex' => $regex, 'suffix' => '/' . $suffix, 'routeMap' => $routeMap]; |
|||
} |
|||
} |
@ -0,0 +1,28 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\DataGenerator; |
|||
|
|||
class GroupCountBased extends RegexBasedAbstract { |
|||
protected function getApproxChunkSize() { |
|||
return 10; |
|||
} |
|||
|
|||
protected function processChunk($regexToRoutesMap) { |
|||
$routeMap = []; |
|||
$regexes = []; |
|||
$numGroups = 0; |
|||
foreach ($regexToRoutesMap as $regex => $route) { |
|||
$numVariables = count($route->variables); |
|||
$numGroups = max($numGroups, $numVariables); |
|||
|
|||
$regexes[] = $regex . str_repeat('()', $numGroups - $numVariables); |
|||
$routeMap[$numGroups + 1] = [$route->handler, $route->variables]; |
|||
|
|||
++$numGroups; |
|||
} |
|||
|
|||
$regex = '~^(?|' . implode('|', $regexes) . ')$~'; |
|||
return ['regex' => $regex, 'routeMap' => $routeMap]; |
|||
} |
|||
} |
|||
|
@ -0,0 +1,25 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\DataGenerator; |
|||
|
|||
class GroupPosBased extends RegexBasedAbstract { |
|||
protected function getApproxChunkSize() { |
|||
return 10; |
|||
} |
|||
|
|||
protected function processChunk($regexToRoutesMap) { |
|||
$routeMap = []; |
|||
$regexes = []; |
|||
$offset = 1; |
|||
foreach ($regexToRoutesMap as $regex => $route) { |
|||
$regexes[] = $regex; |
|||
$routeMap[$offset] = [$route->handler, $route->variables]; |
|||
|
|||
$offset += count($route->variables); |
|||
} |
|||
|
|||
$regex = '~^(?:' . implode('|', $regexes) . ')$~'; |
|||
return ['regex' => $regex, 'routeMap' => $routeMap]; |
|||
} |
|||
} |
|||
|
@ -0,0 +1,25 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\DataGenerator; |
|||
|
|||
class MarkBased extends RegexBasedAbstract { |
|||
protected function getApproxChunkSize() { |
|||
return 30; |
|||
} |
|||
|
|||
protected function processChunk($regexToRoutesMap) { |
|||
$routeMap = []; |
|||
$regexes = []; |
|||
$markName = 'a'; |
|||
foreach ($regexToRoutesMap as $regex => $route) { |
|||
$regexes[] = $regex . '(*MARK:' . $markName . ')'; |
|||
$routeMap[$markName] = [$route->handler, $route->variables]; |
|||
|
|||
++$markName; |
|||
} |
|||
|
|||
$regex = '~^(?|' . implode('|', $regexes) . ')$~'; |
|||
return ['regex' => $regex, 'routeMap' => $routeMap]; |
|||
} |
|||
} |
|||
|
@ -0,0 +1,144 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\DataGenerator; |
|||
|
|||
use FastRoute\DataGenerator; |
|||
use FastRoute\BadRouteException; |
|||
use FastRoute\Route; |
|||
|
|||
abstract class RegexBasedAbstract implements DataGenerator { |
|||
protected $staticRoutes = []; |
|||
protected $methodToRegexToRoutesMap = []; |
|||
|
|||
protected abstract function getApproxChunkSize(); |
|||
protected abstract function processChunk($regexToRoutesMap); |
|||
|
|||
public function addRoute($httpMethod, $routeData, $handler) { |
|||
if ($this->isStaticRoute($routeData)) { |
|||
$this->addStaticRoute($httpMethod, $routeData, $handler); |
|||
} else { |
|||
$this->addVariableRoute($httpMethod, $routeData, $handler); |
|||
} |
|||
} |
|||
|
|||
public function getData() { |
|||
if (empty($this->methodToRegexToRoutesMap)) { |
|||
return [$this->staticRoutes, []]; |
|||
} |
|||
|
|||
return [$this->staticRoutes, $this->generateVariableRouteData()]; |
|||
} |
|||
|
|||
private function generateVariableRouteData() { |
|||
$data = []; |
|||
foreach ($this->methodToRegexToRoutesMap as $method => $regexToRoutesMap) { |
|||
$chunkSize = $this->computeChunkSize(count($regexToRoutesMap)); |
|||
$chunks = array_chunk($regexToRoutesMap, $chunkSize, true); |
|||
$data[$method] = array_map([$this, 'processChunk'], $chunks); |
|||
} |
|||
return $data; |
|||
} |
|||
|
|||
private function computeChunkSize($count) { |
|||
$numParts = max(1, round($count / $this->getApproxChunkSize())); |
|||
return ceil($count / $numParts); |
|||
} |
|||
|
|||
private function isStaticRoute($routeData) { |
|||
return count($routeData) === 1 && is_string($routeData[0]); |
|||
} |
|||
|
|||
private function addStaticRoute($httpMethod, $routeData, $handler) { |
|||
$routeStr = $routeData[0]; |
|||
|
|||
if (isset($this->staticRoutes[$httpMethod][$routeStr])) { |
|||
throw new BadRouteException(sprintf( |
|||
'Cannot register two routes matching "%s" for method "%s"', |
|||
$routeStr, $httpMethod |
|||
)); |
|||
} |
|||
|
|||
if (isset($this->methodToRegexToRoutesMap[$httpMethod])) { |
|||
foreach ($this->methodToRegexToRoutesMap[$httpMethod] as $route) { |
|||
if ($route->matches($routeStr)) { |
|||
throw new BadRouteException(sprintf( |
|||
'Static route "%s" is shadowed by previously defined variable route "%s" for method "%s"', |
|||
$routeStr, $route->regex, $httpMethod |
|||
)); |
|||
} |
|||
} |
|||
} |
|||
|
|||
$this->staticRoutes[$httpMethod][$routeStr] = $handler; |
|||
} |
|||
|
|||
private function addVariableRoute($httpMethod, $routeData, $handler) { |
|||
list($regex, $variables) = $this->buildRegexForRoute($routeData); |
|||
|
|||
if (isset($this->methodToRegexToRoutesMap[$httpMethod][$regex])) { |
|||
throw new BadRouteException(sprintf( |
|||
'Cannot register two routes matching "%s" for method "%s"', |
|||
$regex, $httpMethod |
|||
)); |
|||
} |
|||
|
|||
$this->methodToRegexToRoutesMap[$httpMethod][$regex] = new Route( |
|||
$httpMethod, $handler, $regex, $variables |
|||
); |
|||
} |
|||
|
|||
private function buildRegexForRoute($routeData) { |
|||
$regex = ''; |
|||
$variables = []; |
|||
foreach ($routeData as $part) { |
|||
if (is_string($part)) { |
|||
$regex .= preg_quote($part, '~'); |
|||
continue; |
|||
} |
|||
|
|||
list($varName, $regexPart) = $part; |
|||
|
|||
if (isset($variables[$varName])) { |
|||
throw new BadRouteException(sprintf( |
|||
'Cannot use the same placeholder "%s" twice', $varName |
|||
)); |
|||
} |
|||
|
|||
if ($this->regexHasCapturingGroups($regexPart)) { |
|||
throw new BadRouteException(sprintf( |
|||
'Regex "%s" for parameter "%s" contains a capturing group', |
|||
$regexPart, $varName |
|||
)); |
|||
} |
|||
|
|||
$variables[$varName] = $varName; |
|||
$regex .= '(' . $regexPart . ')'; |
|||
} |
|||
|
|||
return [$regex, $variables]; |
|||
} |
|||
|
|||
private function regexHasCapturingGroups($regex) { |
|||
if (false === strpos($regex, '(')) { |
|||
// Needs to have at least a ( to contain a capturing group
|
|||
return false; |
|||
} |
|||
|
|||
// Semi-accurate detection for capturing groups
|
|||
return preg_match( |
|||
'~ |
|||
(?: |
|||
\(\?\( |
|||
| \[ [^\]\\\\]* (?: \\\\ . [^\]\\\\]* )* \] |
|||
| \\\\ . |
|||
) (*SKIP)(*FAIL) | |
|||
\( |
|||
(?! |
|||
\? (?! <(?![!=]) | P< | \' ) |
|||
| \* |
|||
) |
|||
~x', |
|||
$regex |
|||
); |
|||
} |
|||
} |
@ -0,0 +1,25 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute; |
|||
|
|||
interface Dispatcher { |
|||
const NOT_FOUND = 0; |
|||
const FOUND = 1; |
|||
const METHOD_NOT_ALLOWED = 2; |
|||
|
|||
/** |
|||
* Dispatches against the provided HTTP method verb and URI. |
|||
* |
|||
* Returns array with one of the following formats: |
|||
* |
|||
* [self::NOT_FOUND] |
|||
* [self::METHOD_NOT_ALLOWED, ['GET', 'OTHER_ALLOWED_METHODS']] |
|||
* [self::FOUND, $handler, ['varName' => 'value', ...]] |
|||
* |
|||
* @param string $httpMethod |
|||
* @param string $uri |
|||
* |
|||
* @return array |
|||
*/ |
|||
public function dispatch($httpMethod, $uri); |
|||
} |
@ -0,0 +1,28 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\Dispatcher; |
|||
|
|||
class CharCountBased extends RegexBasedAbstract { |
|||
public function __construct($data) { |
|||
list($this->staticRouteMap, $this->variableRouteData) = $data; |
|||
} |
|||
|
|||
protected function dispatchVariableRoute($routeData, $uri) { |
|||
foreach ($routeData as $data) { |
|||
if (!preg_match($data['regex'], $uri . $data['suffix'], $matches)) { |
|||
continue; |
|||
} |
|||
|
|||
list($handler, $varNames) = $data['routeMap'][end($matches)]; |
|||
|
|||
$vars = []; |
|||
$i = 0; |
|||
foreach ($varNames as $varName) { |
|||
$vars[$varName] = $matches[++$i]; |
|||
} |
|||
return [self::FOUND, $handler, $vars]; |
|||
} |
|||
|
|||
return [self::NOT_FOUND]; |
|||
} |
|||
} |
@ -0,0 +1,28 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\Dispatcher; |
|||
|
|||
class GroupCountBased extends RegexBasedAbstract { |
|||
public function __construct($data) { |
|||
list($this->staticRouteMap, $this->variableRouteData) = $data; |
|||
} |
|||
|
|||
protected function dispatchVariableRoute($routeData, $uri) { |
|||
foreach ($routeData as $data) { |
|||
if (!preg_match($data['regex'], $uri, $matches)) { |
|||
continue; |
|||
} |
|||
|
|||
list($handler, $varNames) = $data['routeMap'][count($matches)]; |
|||
|
|||
$vars = []; |
|||
$i = 0; |
|||
foreach ($varNames as $varName) { |
|||
$vars[$varName] = $matches[++$i]; |
|||
} |
|||
return [self::FOUND, $handler, $vars]; |
|||
} |
|||
|
|||
return [self::NOT_FOUND]; |
|||
} |
|||
} |
@ -0,0 +1,30 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\Dispatcher; |
|||
|
|||
class GroupPosBased extends RegexBasedAbstract { |
|||
public function __construct($data) { |
|||
list($this->staticRouteMap, $this->variableRouteData) = $data; |
|||
} |
|||
|
|||
protected function dispatchVariableRoute($routeData, $uri) { |
|||
foreach ($routeData as $data) { |
|||
if (!preg_match($data['regex'], $uri, $matches)) { |
|||
continue; |
|||
} |
|||
|
|||
// find first non-empty match
|
|||
for ($i = 1; '' === $matches[$i]; ++$i); |
|||
|
|||
list($handler, $varNames) = $data['routeMap'][$i]; |
|||
|
|||
$vars = []; |
|||
foreach ($varNames as $varName) { |
|||
$vars[$varName] = $matches[$i++]; |
|||
} |
|||
return [self::FOUND, $handler, $vars]; |
|||
} |
|||
|
|||
return [self::NOT_FOUND]; |
|||
} |
|||
} |
@ -0,0 +1,28 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\Dispatcher; |
|||
|
|||
class MarkBased extends RegexBasedAbstract { |
|||
public function __construct($data) { |
|||
list($this->staticRouteMap, $this->variableRouteData) = $data; |
|||
} |
|||
|
|||
protected function dispatchVariableRoute($routeData, $uri) { |
|||
foreach ($routeData as $data) { |
|||
if (!preg_match($data['regex'], $uri, $matches)) { |
|||
continue; |
|||
} |
|||
|
|||
list($handler, $varNames) = $data['routeMap'][$matches['MARK']]; |
|||
|
|||
$vars = []; |
|||
$i = 0; |
|||
foreach ($varNames as $varName) { |
|||
$vars[$varName] = $matches[++$i]; |
|||
} |
|||
return [self::FOUND, $handler, $vars]; |
|||
} |
|||
|
|||
return [self::NOT_FOUND]; |
|||
} |
|||
} |
@ -0,0 +1,80 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\Dispatcher; |
|||
|
|||
use FastRoute\Dispatcher; |
|||
|
|||
abstract class RegexBasedAbstract implements Dispatcher { |
|||
protected $staticRouteMap; |
|||
protected $variableRouteData; |
|||
|
|||
protected abstract function dispatchVariableRoute($routeData, $uri); |
|||
|
|||
public function dispatch($httpMethod, $uri) { |
|||
if (isset($this->staticRouteMap[$httpMethod][$uri])) { |
|||
$handler = $this->staticRouteMap[$httpMethod][$uri]; |
|||
return [self::FOUND, $handler, []]; |
|||
} |
|||
|
|||
$varRouteData = $this->variableRouteData; |
|||
if (isset($varRouteData[$httpMethod])) { |
|||
$result = $this->dispatchVariableRoute($varRouteData[$httpMethod], $uri); |
|||
if ($result[0] === self::FOUND) { |
|||
return $result; |
|||
} |
|||
} |
|||
|
|||
// For HEAD requests, attempt fallback to GET
|
|||
if ($httpMethod === 'HEAD') { |
|||
if (isset($this->staticRouteMap['GET'][$uri])) { |
|||
$handler = $this->staticRouteMap['GET'][$uri]; |
|||
return [self::FOUND, $handler, []]; |
|||
} |
|||
if (isset($varRouteData['GET'])) { |
|||
$result = $this->dispatchVariableRoute($varRouteData['GET'], $uri); |
|||
if ($result[0] === self::FOUND) { |
|||
return $result; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// If nothing else matches, try fallback routes
|
|||
if (isset($this->staticRouteMap['*'][$uri])) { |
|||
$handler = $this->staticRouteMap['*'][$uri]; |
|||
return [self::FOUND, $handler, []]; |
|||
} |
|||
if (isset($varRouteData['*'])) { |
|||
$result = $this->dispatchVariableRoute($varRouteData['*'], $uri); |
|||
if ($result[0] === self::FOUND) { |
|||
return $result; |
|||
} |
|||
} |
|||
|
|||
// Find allowed methods for this URI by matching against all other HTTP methods as well
|
|||
$allowedMethods = []; |
|||
|
|||
foreach ($this->staticRouteMap as $method => $uriMap) { |
|||
if ($method !== $httpMethod && isset($uriMap[$uri])) { |
|||
$allowedMethods[] = $method; |
|||
} |
|||
} |
|||
|
|||
foreach ($varRouteData as $method => $routeData) { |
|||
if ($method === $httpMethod) { |
|||
continue; |
|||
} |
|||
|
|||
$result = $this->dispatchVariableRoute($routeData, $uri); |
|||
if ($result[0] === self::FOUND) { |
|||
$allowedMethods[] = $method; |
|||
} |
|||
} |
|||
|
|||
// If there are no allowed methods the route simply does not exist
|
|||
if ($allowedMethods) { |
|||
return [self::METHOD_NOT_ALLOWED, $allowedMethods]; |
|||
} else { |
|||
return [self::NOT_FOUND]; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,38 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute; |
|||
|
|||
class Route { |
|||
public $httpMethod; |
|||
public $regex; |
|||
public $variables; |
|||
public $handler; |
|||
|
|||
/** |
|||
* Constructs a route (value object). |
|||
* |
|||
* @param string $httpMethod |
|||
* @param mixed $handler |
|||
* @param string $regex |
|||
* @param array $variables |
|||
*/ |
|||
public function __construct($httpMethod, $handler, $regex, $variables) { |
|||
$this->httpMethod = $httpMethod; |
|||
$this->handler = $handler; |
|||
$this->regex = $regex; |
|||
$this->variables = $variables; |
|||
} |
|||
|
|||
/** |
|||
* Tests whether this route matches the given string. |
|||
* |
|||
* @param string $str |
|||
* |
|||
* @return bool |
|||
*/ |
|||
public function matches($str) { |
|||
$regex = '~^' . $this->regex . '$~'; |
|||
return (bool) preg_match($regex, $str); |
|||
} |
|||
} |
|||
|
@ -0,0 +1,46 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute; |
|||
|
|||
class RouteCollector { |
|||
private $routeParser; |
|||
private $dataGenerator; |
|||
|
|||
/** |
|||
* Constructs a route collector. |
|||
* |
|||
* @param RouteParser $routeParser |
|||
* @param DataGenerator $dataGenerator |
|||
*/ |
|||
public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator) { |
|||
$this->routeParser = $routeParser; |
|||
$this->dataGenerator = $dataGenerator; |
|||
} |
|||
|
|||
/** |
|||
* Adds a route to the collection. |
|||
* |
|||
* The syntax used in the $route string depends on the used route parser. |
|||
* |
|||
* @param string|string[] $httpMethod |
|||
* @param string $route |
|||
* @param mixed $handler |
|||
*/ |
|||
public function addRoute($httpMethod, $route, $handler) { |
|||
$routeDatas = $this->routeParser->parse($route); |
|||
foreach ((array) $httpMethod as $method) { |
|||
foreach ($routeDatas as $routeData) { |
|||
$this->dataGenerator->addRoute($method, $routeData, $handler); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Returns the collected route data, as provided by the data generator. |
|||
* |
|||
* @return array |
|||
*/ |
|||
public function getData() { |
|||
return $this->dataGenerator->getData(); |
|||
} |
|||
} |
@ -0,0 +1,36 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute; |
|||
|
|||
interface RouteParser { |
|||
/** |
|||
* Parses a route string into multiple route data arrays. |
|||
* |
|||
* The expected output is defined using an example: |
|||
* |
|||
* For the route string "/fixedRoutePart/{varName}[/moreFixed/{varName2:\d+}]", if {varName} is interpreted as |
|||
* a placeholder and [...] is interpreted as an optional route part, the expected result is: |
|||
* |
|||
* [ |
|||
* // first route: without optional part
|
|||
* [ |
|||
* "/fixedRoutePart/", |
|||
* ["varName", "[^/]+"], |
|||
* ], |
|||
* // second route: with optional part
|
|||
* [ |
|||
* "/fixedRoutePart/", |
|||
* ["varName", "[^/]+"], |
|||
* "/moreFixed/", |
|||
* ["varName2", [0-9]+"],
|
|||
* ], |
|||
* ] |
|||
* |
|||
* Here one route string was converted into two route data arrays. |
|||
* |
|||
* @param string $route Route string to parse |
|||
* |
|||
* @return mixed[][] Array of route data arrays |
|||
*/ |
|||
public function parse($route); |
|||
} |
@ -0,0 +1,81 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\RouteParser; |
|||
|
|||
use FastRoute\BadRouteException; |
|||
use FastRoute\RouteParser; |
|||
|
|||
/** |
|||
* Parses route strings of the following form: |
|||
* |
|||
* "/user/{name}[/{id:[0-9]+}]" |
|||
*/ |
|||
class Std implements RouteParser { |
|||
const VARIABLE_REGEX = <<<'REGEX' |
|||
\{ |
|||
\s* ([a-zA-Z_][a-zA-Z0-9_-]*) \s* |
|||
(?: |
|||
: \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*) |
|||
)? |
|||
\} |
|||
REGEX; |
|||
const DEFAULT_DISPATCH_REGEX = '[^/]+'; |
|||
|
|||
public function parse($route) { |
|||
$routeWithoutClosingOptionals = rtrim($route, ']'); |
|||
$numOptionals = strlen($route) - strlen($routeWithoutClosingOptionals); |
|||
|
|||
// Split on [ while skipping placeholders
|
|||
$segments = preg_split('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \[~x', $routeWithoutClosingOptionals); |
|||
if ($numOptionals !== count($segments) - 1) { |
|||
// If there are any ] in the middle of the route, throw a more specific error message
|
|||
if (preg_match('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \]~x', $routeWithoutClosingOptionals)) { |
|||
throw new BadRouteException("Optional segments can only occur at the end of a route"); |
|||
} |
|||
throw new BadRouteException("Number of opening '[' and closing ']' does not match"); |
|||
} |
|||
|
|||
$currentRoute = ''; |
|||
$routeDatas = []; |
|||
foreach ($segments as $n => $segment) { |
|||
if ($segment === '' && $n !== 0) { |
|||
throw new BadRouteException("Empty optional part"); |
|||
} |
|||
|
|||
$currentRoute .= $segment; |
|||
$routeDatas[] = $this->parsePlaceholders($currentRoute); |
|||
} |
|||
return $routeDatas; |
|||
} |
|||
|
|||
/** |
|||
* Parses a route string that does not contain optional segments. |
|||
*/ |
|||
private function parsePlaceholders($route) { |
|||
if (!preg_match_all( |
|||
'~' . self::VARIABLE_REGEX . '~x', $route, $matches, |
|||
PREG_OFFSET_CAPTURE | PREG_SET_ORDER |
|||
)) { |
|||
return [$route]; |
|||
} |
|||
|
|||
$offset = 0; |
|||
$routeData = []; |
|||
foreach ($matches as $set) { |
|||
if ($set[0][1] > $offset) { |
|||
$routeData[] = substr($route, $offset, $set[0][1] - $offset); |
|||
} |
|||
$routeData[] = [ |
|||
$set[1][0], |
|||
isset($set[2]) ? trim($set[2][0]) : self::DEFAULT_DISPATCH_REGEX |
|||
]; |
|||
$offset = $set[0][1] + strlen($set[0][0]); |
|||
} |
|||
|
|||
if ($offset != strlen($route)) { |
|||
$routeData[] = substr($route, $offset); |
|||
} |
|||
|
|||
return $routeData; |
|||
} |
|||
} |
@ -0,0 +1,12 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute; |
|||
|
|||
require __DIR__ . '/functions.php'; |
|||
|
|||
spl_autoload_register(function($class) { |
|||
if (strpos($class, 'FastRoute\\') === 0) { |
|||
$name = substr($class, strlen('FastRoute')); |
|||
require __DIR__ . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php'; |
|||
} |
|||
}); |
@ -0,0 +1,70 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute; |
|||
|
|||
if (!function_exists('FastRoute\simpleDispatcher')) { |
|||
/** |
|||
* @param callable $routeDefinitionCallback |
|||
* @param array $options |
|||
* |
|||
* @return Dispatcher |
|||
*/ |
|||
function simpleDispatcher(callable $routeDefinitionCallback, array $options = []) { |
|||
$options += [ |
|||
'routeParser' => 'FastRoute\\RouteParser\\Std', |
|||
'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', |
|||
'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased', |
|||
'routeCollector' => 'FastRoute\\RouteCollector', |
|||
]; |
|||
|
|||
/** @var RouteCollector $routeCollector */ |
|||
$routeCollector = new $options['routeCollector']( |
|||
new $options['routeParser'], new $options['dataGenerator'] |
|||
); |
|||
$routeDefinitionCallback($routeCollector); |
|||
|
|||
return new $options['dispatcher']($routeCollector->getData()); |
|||
} |
|||
|
|||
/** |
|||
* @param callable $routeDefinitionCallback |
|||
* @param array $options |
|||
* |
|||
* @return Dispatcher |
|||
*/ |
|||
function cachedDispatcher(callable $routeDefinitionCallback, array $options = []) { |
|||
$options += [ |
|||
'routeParser' => 'FastRoute\\RouteParser\\Std', |
|||
'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', |
|||
'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased', |
|||
'routeCollector' => 'FastRoute\\RouteCollector', |
|||
'cacheDisabled' => false, |
|||
]; |
|||
|
|||
if (!isset($options['cacheFile'])) { |
|||
throw new \LogicException('Must specify "cacheFile" option'); |
|||
} |
|||
|
|||
if (!$options['cacheDisabled'] && file_exists($options['cacheFile'])) { |
|||
$dispatchData = require $options['cacheFile']; |
|||
if (!is_array($dispatchData)) { |
|||
throw new \RuntimeException('Invalid cache file "' . $options['cacheFile'] . '"'); |
|||
} |
|||
return new $options['dispatcher']($dispatchData); |
|||
} |
|||
|
|||
$routeCollector = new $options['routeCollector']( |
|||
new $options['routeParser'], new $options['dataGenerator'] |
|||
); |
|||
$routeDefinitionCallback($routeCollector); |
|||
|
|||
/** @var RouteCollector $routeCollector */ |
|||
$dispatchData = $routeCollector->getData(); |
|||
file_put_contents( |
|||
$options['cacheFile'], |
|||
'<?php return ' . var_export($dispatchData, true) . ';' |
|||
); |
|||
|
|||
return new $options['dispatcher']($dispatchData); |
|||
} |
|||
} |
@ -0,0 +1,13 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\Dispatcher; |
|||
|
|||
class CharCountBasedTest extends DispatcherTest { |
|||
protected function getDispatcherClass() { |
|||
return 'FastRoute\\Dispatcher\\CharCountBased'; |
|||
} |
|||
|
|||
protected function getDataGeneratorClass() { |
|||
return 'FastRoute\\DataGenerator\\CharCountBased'; |
|||
} |
|||
} |
@ -0,0 +1,561 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\Dispatcher; |
|||
|
|||
use FastRoute\RouteCollector; |
|||
|
|||
abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { |
|||
|
|||
/** |
|||
* Delegate dispatcher selection to child test classes |
|||
*/ |
|||
abstract protected function getDispatcherClass(); |
|||
|
|||
/** |
|||
* Delegate dataGenerator selection to child test classes |
|||
*/ |
|||
abstract protected function getDataGeneratorClass(); |
|||
|
|||
/** |
|||
* Set appropriate options for the specific Dispatcher class we're testing |
|||
*/ |
|||
private function generateDispatcherOptions() { |
|||
return [ |
|||
'dataGenerator' => $this->getDataGeneratorClass(), |
|||
'dispatcher' => $this->getDispatcherClass() |
|||
]; |
|||
} |
|||
|
|||
/** |
|||
* @dataProvider provideFoundDispatchCases |
|||
*/ |
|||
public function testFoundDispatches($method, $uri, $callback, $handler, $argDict) { |
|||
$dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); |
|||
$info = $dispatcher->dispatch($method, $uri); |
|||
$this->assertSame($dispatcher::FOUND, $info[0]); |
|||
$this->assertSame($handler, $info[1]); |
|||
$this->assertSame($argDict, $info[2]); |
|||
} |
|||
|
|||
/** |
|||
* @dataProvider provideNotFoundDispatchCases |
|||
*/ |
|||
public function testNotFoundDispatches($method, $uri, $callback) { |
|||
$dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); |
|||
$routeInfo = $dispatcher->dispatch($method, $uri); |
|||
$this->assertFalse(isset($routeInfo[1]), |
|||
"NOT_FOUND result must only contain a single element in the returned info array" |
|||
); |
|||
$this->assertSame($dispatcher::NOT_FOUND, $routeInfo[0]); |
|||
} |
|||
|
|||
/** |
|||
* @dataProvider provideMethodNotAllowedDispatchCases |
|||
*/ |
|||
public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods) { |
|||
$dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); |
|||
$routeInfo = $dispatcher->dispatch($method, $uri); |
|||
$this->assertTrue(isset($routeInfo[1]), |
|||
"METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1" |
|||
); |
|||
|
|||
list($routedStatus, $methodArray) = $dispatcher->dispatch($method, $uri); |
|||
$this->assertSame($dispatcher::METHOD_NOT_ALLOWED, $routedStatus); |
|||
$this->assertSame($availableMethods, $methodArray); |
|||
} |
|||
|
|||
/** |
|||
* @expectedException \FastRoute\BadRouteException |
|||
* @expectedExceptionMessage Cannot use the same placeholder "test" twice |
|||
*/ |
|||
public function testDuplicateVariableNameError() { |
|||
\FastRoute\simpleDispatcher(function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/foo/{test}/{test:\d+}', 'handler0'); |
|||
}, $this->generateDispatcherOptions()); |
|||
} |
|||
|
|||
/** |
|||
* @expectedException \FastRoute\BadRouteException |
|||
* @expectedExceptionMessage Cannot register two routes matching "/user/([^/]+)" for method "GET" |
|||
*/ |
|||
public function testDuplicateVariableRoute() { |
|||
\FastRoute\simpleDispatcher(function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/user/{id}', 'handler0'); // oops, forgot \d+ restriction ;)
|
|||
$r->addRoute('GET', '/user/{name}', 'handler1'); |
|||
}, $this->generateDispatcherOptions()); |
|||
} |
|||
|
|||
/** |
|||
* @expectedException \FastRoute\BadRouteException |
|||
* @expectedExceptionMessage Cannot register two routes matching "/user" for method "GET" |
|||
*/ |
|||
public function testDuplicateStaticRoute() { |
|||
\FastRoute\simpleDispatcher(function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/user', 'handler0'); |
|||
$r->addRoute('GET', '/user', 'handler1'); |
|||
}, $this->generateDispatcherOptions()); |
|||
} |
|||
|
|||
/** |
|||
* @expectedException \FastRoute\BadRouteException |
|||
* @expectedExceptionMessage Static route "/user/nikic" is shadowed by previously defined variable route "/user/([^/]+)" for method "GET" |
|||
*/ |
|||
public function testShadowedStaticRoute() { |
|||
\FastRoute\simpleDispatcher(function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/user/{name}', 'handler0'); |
|||
$r->addRoute('GET', '/user/nikic', 'handler1'); |
|||
}, $this->generateDispatcherOptions()); |
|||
} |
|||
|
|||
/** |
|||
* @expectedException \FastRoute\BadRouteException |
|||
* @expectedExceptionMessage Regex "(en|de)" for parameter "lang" contains a capturing group |
|||
*/ |
|||
public function testCapturing() { |
|||
\FastRoute\simpleDispatcher(function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/{lang:(en|de)}', 'handler0'); |
|||
}, $this->generateDispatcherOptions()); |
|||
} |
|||
|
|||
public function provideFoundDispatchCases() { |
|||
$cases = []; |
|||
|
|||
// 0 -------------------------------------------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/resource/123/456', 'handler0'); |
|||
}; |
|||
|
|||
$method = 'GET'; |
|||
$uri = '/resource/123/456'; |
|||
$handler = 'handler0'; |
|||
$argDict = []; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 1 -------------------------------------------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/handler0', 'handler0'); |
|||
$r->addRoute('GET', '/handler1', 'handler1'); |
|||
$r->addRoute('GET', '/handler2', 'handler2'); |
|||
}; |
|||
|
|||
$method = 'GET'; |
|||
$uri = '/handler2'; |
|||
$handler = 'handler2'; |
|||
$argDict = []; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 2 -------------------------------------------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); |
|||
$r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); |
|||
$r->addRoute('GET', '/user/{name}', 'handler2'); |
|||
}; |
|||
|
|||
$method = 'GET'; |
|||
$uri = '/user/rdlowrey'; |
|||
$handler = 'handler2'; |
|||
$argDict = ['name' => 'rdlowrey']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 3 -------------------------------------------------------------------------------------->
|
|||
|
|||
// reuse $callback from #2
|
|||
|
|||
$method = 'GET'; |
|||
$uri = '/user/12345'; |
|||
$handler = 'handler1'; |
|||
$argDict = ['id' => '12345']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 4 -------------------------------------------------------------------------------------->
|
|||
|
|||
// reuse $callback from #3
|
|||
|
|||
$method = 'GET'; |
|||
$uri = '/user/NaN'; |
|||
$handler = 'handler2'; |
|||
$argDict = ['name' => 'NaN']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 5 -------------------------------------------------------------------------------------->
|
|||
|
|||
// reuse $callback from #4
|
|||
|
|||
$method = 'GET'; |
|||
$uri = '/user/rdlowrey/12345'; |
|||
$handler = 'handler0'; |
|||
$argDict = ['name' => 'rdlowrey', 'id' => '12345']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 6 -------------------------------------------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/user/{id:[0-9]+}', 'handler0'); |
|||
$r->addRoute('GET', '/user/12345/extension', 'handler1'); |
|||
$r->addRoute('GET', '/user/{id:[0-9]+}.{extension}', 'handler2'); |
|||
|
|||
}; |
|||
|
|||
$method = 'GET'; |
|||
$uri = '/user/12345.svg'; |
|||
$handler = 'handler2'; |
|||
$argDict = ['id' => '12345', 'extension' => 'svg']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 7 ----- Test GET method fallback on HEAD route miss ------------------------------------>
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/user/{name}', 'handler0'); |
|||
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler1'); |
|||
$r->addRoute('GET', '/static0', 'handler2'); |
|||
$r->addRoute('GET', '/static1', 'handler3'); |
|||
$r->addRoute('HEAD', '/static1', 'handler4'); |
|||
}; |
|||
|
|||
$method = 'HEAD'; |
|||
$uri = '/user/rdlowrey'; |
|||
$handler = 'handler0'; |
|||
$argDict = ['name' => 'rdlowrey']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 8 ----- Test GET method fallback on HEAD route miss ------------------------------------>
|
|||
|
|||
// reuse $callback from #7
|
|||
|
|||
$method = 'HEAD'; |
|||
$uri = '/user/rdlowrey/1234'; |
|||
$handler = 'handler1'; |
|||
$argDict = ['name' => 'rdlowrey', 'id' => '1234']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 9 ----- Test GET method fallback on HEAD route miss ------------------------------------>
|
|||
|
|||
// reuse $callback from #8
|
|||
|
|||
$method = 'HEAD'; |
|||
$uri = '/static0'; |
|||
$handler = 'handler2'; |
|||
$argDict = []; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 10 ---- Test existing HEAD route used if available (no fallback) ----------------------->
|
|||
|
|||
// reuse $callback from #9
|
|||
|
|||
$method = 'HEAD'; |
|||
$uri = '/static1'; |
|||
$handler = 'handler4'; |
|||
$argDict = []; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 11 ---- More specified routes are not shadowed by less specific of another method ------>
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/user/{name}', 'handler0'); |
|||
$r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); |
|||
}; |
|||
|
|||
$method = 'POST'; |
|||
$uri = '/user/rdlowrey'; |
|||
$handler = 'handler1'; |
|||
$argDict = ['name' => 'rdlowrey']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 12 ---- Handler of more specific routes is used, if it occurs first -------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/user/{name}', 'handler0'); |
|||
$r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); |
|||
$r->addRoute('POST', '/user/{name}', 'handler2'); |
|||
}; |
|||
|
|||
$method = 'POST'; |
|||
$uri = '/user/rdlowrey'; |
|||
$handler = 'handler1'; |
|||
$argDict = ['name' => 'rdlowrey']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 13 ---- Route with constant suffix ----------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/user/{name}', 'handler0'); |
|||
$r->addRoute('GET', '/user/{name}/edit', 'handler1'); |
|||
}; |
|||
|
|||
$method = 'GET'; |
|||
$uri = '/user/rdlowrey/edit'; |
|||
$handler = 'handler1'; |
|||
$argDict = ['name' => 'rdlowrey']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $handler, $argDict]; |
|||
|
|||
// 14 ---- Handle multiple methods with the same handler ---------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); |
|||
$r->addRoute(['DELETE'], '/user', 'handlerDelete'); |
|||
$r->addRoute([], '/user', 'handlerNone'); |
|||
}; |
|||
|
|||
$argDict = []; |
|||
$cases[] = ['GET', '/user', $callback, 'handlerGetPost', $argDict]; |
|||
$cases[] = ['POST', '/user', $callback, 'handlerGetPost', $argDict]; |
|||
$cases[] = ['DELETE', '/user', $callback, 'handlerDelete', $argDict]; |
|||
|
|||
// 15 ----
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('POST', '/user.json', 'handler0'); |
|||
$r->addRoute('GET', '/{entity}.json', 'handler1'); |
|||
}; |
|||
|
|||
$cases[] = ['GET', '/user.json', $callback, 'handler1', ['entity' => 'user']]; |
|||
|
|||
// 16 ----
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '', 'handler0'); |
|||
}; |
|||
|
|||
$cases[] = ['GET', '', $callback, 'handler0', []]; |
|||
|
|||
// 17 ----
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('HEAD', '/a/{foo}', 'handler0'); |
|||
$r->addRoute('GET', '/b/{foo}', 'handler1'); |
|||
}; |
|||
|
|||
$cases[] = ['HEAD', '/b/bar', $callback, 'handler1', ['foo' => 'bar']]; |
|||
|
|||
// 18 ----
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('HEAD', '/a', 'handler0'); |
|||
$r->addRoute('GET', '/b', 'handler1'); |
|||
}; |
|||
|
|||
$cases[] = ['HEAD', '/b', $callback, 'handler1', []]; |
|||
|
|||
// 19 ----
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/foo', 'handler0'); |
|||
$r->addRoute('HEAD', '/{bar}', 'handler1'); |
|||
}; |
|||
|
|||
$cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']]; |
|||
|
|||
// 20 ----
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('*', '/user', 'handler0'); |
|||
$r->addRoute('*', '/{user}', 'handler1'); |
|||
$r->addRoute('GET', '/user', 'handler2'); |
|||
}; |
|||
|
|||
$cases[] = ['GET', '/user', $callback, 'handler2', []]; |
|||
|
|||
// 21 ----
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('*', '/user', 'handler0'); |
|||
$r->addRoute('GET', '/user', 'handler1'); |
|||
}; |
|||
|
|||
$cases[] = ['POST', '/user', $callback, 'handler0', []]; |
|||
|
|||
// 22 ----
|
|||
|
|||
$cases[] = ['HEAD', '/user', $callback, 'handler1', []]; |
|||
|
|||
// 23 ----
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/{bar}', 'handler0'); |
|||
$r->addRoute('*', '/foo', 'handler1'); |
|||
}; |
|||
|
|||
$cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']]; |
|||
|
|||
// x -------------------------------------------------------------------------------------->
|
|||
|
|||
return $cases; |
|||
} |
|||
|
|||
public function provideNotFoundDispatchCases() { |
|||
$cases = []; |
|||
|
|||
// 0 -------------------------------------------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/resource/123/456', 'handler0'); |
|||
}; |
|||
|
|||
$method = 'GET'; |
|||
$uri = '/not-found'; |
|||
|
|||
$cases[] = [$method, $uri, $callback]; |
|||
|
|||
// 1 -------------------------------------------------------------------------------------->
|
|||
|
|||
// reuse callback from #0
|
|||
$method = 'POST'; |
|||
$uri = '/not-found'; |
|||
|
|||
$cases[] = [$method, $uri, $callback]; |
|||
|
|||
// 2 -------------------------------------------------------------------------------------->
|
|||
|
|||
// reuse callback from #1
|
|||
$method = 'PUT'; |
|||
$uri = '/not-found'; |
|||
|
|||
$cases[] = [$method, $uri, $callback]; |
|||
|
|||
// 3 -------------------------------------------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/handler0', 'handler0'); |
|||
$r->addRoute('GET', '/handler1', 'handler1'); |
|||
$r->addRoute('GET', '/handler2', 'handler2'); |
|||
}; |
|||
|
|||
$method = 'GET'; |
|||
$uri = '/not-found'; |
|||
|
|||
$cases[] = [$method, $uri, $callback]; |
|||
|
|||
// 4 -------------------------------------------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); |
|||
$r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); |
|||
$r->addRoute('GET', '/user/{name}', 'handler2'); |
|||
}; |
|||
|
|||
$method = 'GET'; |
|||
$uri = '/not-found'; |
|||
|
|||
$cases[] = [$method, $uri, $callback]; |
|||
|
|||
// 5 -------------------------------------------------------------------------------------->
|
|||
|
|||
// reuse callback from #4
|
|||
$method = 'GET'; |
|||
$uri = '/user/rdlowrey/12345/not-found'; |
|||
|
|||
$cases[] = [$method, $uri, $callback]; |
|||
|
|||
// 6 -------------------------------------------------------------------------------------->
|
|||
|
|||
// reuse callback from #5
|
|||
$method = 'HEAD'; |
|||
|
|||
$cases[] = array($method, $uri, $callback); |
|||
|
|||
// x -------------------------------------------------------------------------------------->
|
|||
|
|||
return $cases; |
|||
} |
|||
|
|||
public function provideMethodNotAllowedDispatchCases() { |
|||
$cases = []; |
|||
|
|||
// 0 -------------------------------------------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/resource/123/456', 'handler0'); |
|||
}; |
|||
|
|||
$method = 'POST'; |
|||
$uri = '/resource/123/456'; |
|||
$allowedMethods = ['GET']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $allowedMethods]; |
|||
|
|||
// 1 -------------------------------------------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/resource/123/456', 'handler0'); |
|||
$r->addRoute('POST', '/resource/123/456', 'handler1'); |
|||
$r->addRoute('PUT', '/resource/123/456', 'handler2'); |
|||
$r->addRoute('*', '/', 'handler3'); |
|||
}; |
|||
|
|||
$method = 'DELETE'; |
|||
$uri = '/resource/123/456'; |
|||
$allowedMethods = ['GET', 'POST', 'PUT']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $allowedMethods]; |
|||
|
|||
// 2 -------------------------------------------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); |
|||
$r->addRoute('POST', '/user/{name}/{id:[0-9]+}', 'handler1'); |
|||
$r->addRoute('PUT', '/user/{name}/{id:[0-9]+}', 'handler2'); |
|||
$r->addRoute('PATCH', '/user/{name}/{id:[0-9]+}', 'handler3'); |
|||
}; |
|||
|
|||
$method = 'DELETE'; |
|||
$uri = '/user/rdlowrey/42'; |
|||
$allowedMethods = ['GET', 'POST', 'PUT', 'PATCH']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $allowedMethods]; |
|||
|
|||
// 3 -------------------------------------------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('POST', '/user/{name}', 'handler1'); |
|||
$r->addRoute('PUT', '/user/{name:[a-z]+}', 'handler2'); |
|||
$r->addRoute('PATCH', '/user/{name:[a-z]+}', 'handler3'); |
|||
}; |
|||
|
|||
$method = 'GET'; |
|||
$uri = '/user/rdlowrey'; |
|||
$allowedMethods = ['POST', 'PUT', 'PATCH']; |
|||
|
|||
$cases[] = [$method, $uri, $callback, $allowedMethods]; |
|||
|
|||
// 4 -------------------------------------------------------------------------------------->
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); |
|||
$r->addRoute(['DELETE'], '/user', 'handlerDelete'); |
|||
$r->addRoute([], '/user', 'handlerNone'); |
|||
}; |
|||
|
|||
$cases[] = ['PUT', '/user', $callback, ['GET', 'POST', 'DELETE']]; |
|||
|
|||
// 5
|
|||
|
|||
$callback = function(RouteCollector $r) { |
|||
$r->addRoute('POST', '/user.json', 'handler0'); |
|||
$r->addRoute('GET', '/{entity}.json', 'handler1'); |
|||
}; |
|||
|
|||
$cases[] = ['PUT', '/user.json', $callback, ['POST', 'GET']]; |
|||
|
|||
// x -------------------------------------------------------------------------------------->
|
|||
|
|||
return $cases; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,13 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\Dispatcher; |
|||
|
|||
class GroupCountBasedTest extends DispatcherTest { |
|||
protected function getDispatcherClass() { |
|||
return 'FastRoute\\Dispatcher\\GroupCountBased'; |
|||
} |
|||
|
|||
protected function getDataGeneratorClass() { |
|||
return 'FastRoute\\DataGenerator\\GroupCountBased'; |
|||
} |
|||
} |
@ -0,0 +1,13 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\Dispatcher; |
|||
|
|||
class GroupPosBasedTest extends DispatcherTest { |
|||
protected function getDispatcherClass() { |
|||
return 'FastRoute\\Dispatcher\\GroupPosBased'; |
|||
} |
|||
|
|||
protected function getDataGeneratorClass() { |
|||
return 'FastRoute\\DataGenerator\\GroupPosBased'; |
|||
} |
|||
} |
@ -0,0 +1,20 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\Dispatcher; |
|||
|
|||
class MarkBasedTest extends DispatcherTest { |
|||
public function setUp() { |
|||
preg_match('/(*MARK:A)a/', 'a', $matches); |
|||
if (!isset($matches['MARK'])) { |
|||
$this->markTestSkipped('PHP 5.6 required for MARK support'); |
|||
} |
|||
} |
|||
|
|||
protected function getDispatcherClass() { |
|||
return 'FastRoute\\Dispatcher\\MarkBased'; |
|||
} |
|||
|
|||
protected function getDataGeneratorClass() { |
|||
return 'FastRoute\\DataGenerator\\MarkBased'; |
|||
} |
|||
} |
@ -0,0 +1,39 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute; |
|||
|
|||
class HackTypecheckerTest extends \PhpUnit_Framework_TestCase { |
|||
const SERVER_ALREADY_RUNNING_CODE = 77; |
|||
public function testTypechecks($recurse = true) { |
|||
if (!defined('HHVM_VERSION')) { |
|||
$this->markTestSkipped("HHVM only"); |
|||
} |
|||
if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) { |
|||
$this->markTestSkipped('classname<T> requires HHVM 3.9+'); |
|||
} |
|||
|
|||
// The typechecker recurses the whole tree, so it makes sure
|
|||
// that everything in fixtures/ is valid when this runs.
|
|||
|
|||
$output = array(); |
|||
$exit_code = null; |
|||
exec( |
|||
'hh_server --check '.escapeshellarg(__DIR__.'/../../').' 2>&1', |
|||
$output, |
|||
$exit_code |
|||
); |
|||
if ($exit_code === self::SERVER_ALREADY_RUNNING_CODE) { |
|||
$this->assertTrue( |
|||
$recurse, |
|||
"Typechecker still running after running hh_client stop" |
|||
); |
|||
// Server already running - 3.10 => 3.11 regression:
|
|||
// https://github.com/facebook/hhvm/issues/6646
|
|||
exec('hh_client stop 2>/dev/null'); |
|||
$this->testTypechecks(/* recurse = */ false); |
|||
return; |
|||
|
|||
} |
|||
$this->assertSame(0, $exit_code, implode("\n", $output)); |
|||
} |
|||
} |
@ -0,0 +1,29 @@ |
|||
<?hh |
|||
|
|||
namespace FastRoute\TestFixtures; |
|||
|
|||
function all_options_simple(): \FastRoute\Dispatcher { |
|||
return \FastRoute\simpleDispatcher( |
|||
$collector ==> {}, |
|||
shape( |
|||
'routeParser' => \FastRoute\RouteParser\Std::class, |
|||
'dataGenerator' => \FastRoute\DataGenerator\GroupCountBased::class, |
|||
'dispatcher' => \FastRoute\Dispatcher\GroupCountBased::class, |
|||
'routeCollector' => \FastRoute\RouteCollector::class, |
|||
), |
|||
); |
|||
} |
|||
|
|||
function all_options_cached(): \FastRoute\Dispatcher { |
|||
return \FastRoute\cachedDispatcher( |
|||
$collector ==> {}, |
|||
shape( |
|||
'routeParser' => \FastRoute\RouteParser\Std::class, |
|||
'dataGenerator' => \FastRoute\DataGenerator\GroupCountBased::class, |
|||
'dispatcher' => \FastRoute\Dispatcher\GroupCountBased::class, |
|||
'routeCollector' => \FastRoute\RouteCollector::class, |
|||
'cacheFile' => '/dev/null', |
|||
'cacheDisabled' => false, |
|||
), |
|||
); |
|||
} |
@ -0,0 +1,11 @@ |
|||
<?hh |
|||
|
|||
namespace FastRoute\TestFixtures; |
|||
|
|||
function empty_options_simple(): \FastRoute\Dispatcher { |
|||
return \FastRoute\simpleDispatcher($collector ==> {}, shape()); |
|||
} |
|||
|
|||
function empty_options_cached(): \FastRoute\Dispatcher { |
|||
return \FastRoute\cachedDispatcher($collector ==> {}, shape()); |
|||
} |
@ -0,0 +1,11 @@ |
|||
<?hh |
|||
|
|||
namespace FastRoute\TestFixtures; |
|||
|
|||
function no_options_simple(): \FastRoute\Dispatcher { |
|||
return \FastRoute\simpleDispatcher($collector ==> {}); |
|||
} |
|||
|
|||
function no_options_cached(): \FastRoute\Dispatcher { |
|||
return \FastRoute\cachedDispatcher($collector ==> {}); |
|||
} |
@ -0,0 +1,147 @@ |
|||
<?php |
|||
|
|||
namespace FastRoute\RouteParser; |
|||
|
|||
class StdTest extends \PhpUnit_Framework_TestCase { |
|||
/** @dataProvider provideTestParse */ |
|||
public function testParse($routeString, $expectedRouteDatas) { |
|||
$parser = new Std(); |
|||
$routeDatas = $parser->parse($routeString); |
|||
$this->assertSame($expectedRouteDatas, $routeDatas); |
|||
} |
|||
|
|||
/** @dataProvider provideTestParseError */ |
|||
public function testParseError($routeString, $expectedExceptionMessage) { |
|||
$parser = new Std(); |
|||
$this->setExpectedException('FastRoute\\BadRouteException', $expectedExceptionMessage); |
|||
$parser->parse($routeString); |
|||
} |
|||
|
|||
public function provideTestParse() { |
|||
return [ |
|||
[ |
|||
'/test', |
|||
[ |
|||
['/test'], |
|||
] |
|||
], |
|||
[ |
|||
'/test/{param}', |
|||
[ |
|||
['/test/', ['param', '[^/]+']], |
|||
] |
|||
], |
|||
[ |
|||
'/te{ param }st', |
|||
[ |
|||
['/te', ['param', '[^/]+'], 'st'] |
|||
] |
|||
], |
|||
[ |
|||
'/test/{param1}/test2/{param2}', |
|||
[ |
|||
['/test/', ['param1', '[^/]+'], '/test2/', ['param2', '[^/]+']] |
|||
] |
|||
], |
|||
[ |
|||
'/test/{param:\d+}', |
|||
[ |
|||
['/test/', ['param', '\d+']] |
|||
] |
|||
], |
|||
[ |
|||
'/test/{ param : \d{1,9} }', |
|||
[ |
|||
['/test/', ['param', '\d{1,9}']] |
|||
] |
|||
], |
|||
[ |
|||
'/test[opt]', |
|||
[ |
|||
['/test'], |
|||
['/testopt'], |
|||
] |
|||
], |
|||
[ |
|||
'/test[/{param}]', |
|||
[ |
|||
['/test'], |
|||
['/test/', ['param', '[^/]+']], |
|||
] |
|||
], |
|||
[ |
|||
'/{param}[opt]', |
|||
[ |
|||
['/', ['param', '[^/]+']], |
|||
['/', ['param', '[^/]+'], 'opt'] |
|||
] |
|||
], |
|||
[ |
|||
'/test[/{name}[/{id:[0-9]+}]]', |
|||
[ |
|||
['/test'], |
|||
['/test/', ['name', '[^/]+']], |
|||
['/test/', ['name', '[^/]+'], '/', ['id', '[0-9]+']], |
|||
] |
|||
], |
|||
[ |
|||
'', |
|||
[ |
|||
[''], |
|||
] |
|||
], |
|||
[ |
|||
'[test]', |
|||
[ |
|||
[''], |
|||
['test'], |
|||
] |
|||
], |
|||
[ |
|||
'/{foo-bar}', |
|||
[ |
|||
['/', ['foo-bar', '[^/]+']] |
|||
] |
|||
], |
|||
[ |
|||
'/{_foo:.*}', |
|||
[ |
|||
['/', ['_foo', '.*']] |
|||
] |
|||
], |
|||
]; |
|||
} |
|||
|
|||
public function provideTestParseError() { |
|||
return [ |
|||
[ |
|||
'/test[opt', |
|||
"Number of opening '[' and closing ']' does not match" |
|||
], |
|||
[ |
|||
'/test[opt[opt2]', |
|||
"Number of opening '[' and closing ']' does not match" |
|||
], |
|||
[ |
|||
'/testopt]', |
|||
"Number of opening '[' and closing ']' does not match" |
|||
], |
|||
[ |
|||
'/test[]', |
|||
"Empty optional part" |
|||
], |
|||
[ |
|||
'/test[[opt]]', |
|||
"Empty optional part" |
|||
], |
|||
[ |
|||
'[[test]]', |
|||
"Empty optional part" |
|||
], |
|||
[ |
|||
'/test[/opt]/required', |
|||
"Optional segments can only occur at the end of a route" |
|||
], |
|||
]; |
|||
} |
|||
} |
@ -0,0 +1,11 @@ |
|||
<?php |
|||
|
|||
require_once __DIR__ . '/../src/functions.php'; |
|||
|
|||
spl_autoload_register(function($class) { |
|||
if (strpos($class, 'FastRoute\\') === 0) { |
|||
$dir = strcasecmp(substr($class, -4), 'Test') ? 'src/' : 'test/'; |
|||
$name = substr($class, strlen('FastRoute')); |
|||
require __DIR__ . '/../' . $dir . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php'; |
|||
} |
|||
}); |
@ -0,0 +1,3 @@ |
|||
phpunit.xml |
|||
composer.lock |
|||
/vendor/ |
@ -0,0 +1,32 @@ |
|||
language: php |
|||
|
|||
env: |
|||
matrix: |
|||
- PIMPLE_EXT=no |
|||
- PIMPLE_EXT=yes |
|||
global: |
|||
- REPORT_EXIT_STATUS=1 |
|||
|
|||
php: |
|||
- 5.3 |
|||
- 5.4 |
|||
- 5.5 |
|||
- 5.6 |
|||
- hhvm |
|||
|
|||
before_script: |
|||
- composer self-update |
|||
- COMPOSER_ROOT_VERSION=dev-master composer dump-autoload |
|||
- if [ "$PIMPLE_EXT" == "yes" ]; then sh -c "cd ext/pimple && phpize && ./configure && make && sudo make install"; fi |
|||
- if [ "$PIMPLE_EXT" == "yes" ]; then echo "extension=pimple.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`; fi |
|||
|
|||
script: |
|||
- cd ext/pimple |
|||
- if [ "$PIMPLE_EXT" == "yes" ]; then yes n | make test | tee output ; grep -E 'Tests failed +. +0' output; fi |
|||
- cd ../.. |
|||
- phpunit |
|||
|
|||
matrix: |
|||
exclude: |
|||
- php: hhvm |
|||
env: PIMPLE_EXT=yes |
@ -0,0 +1,35 @@ |
|||
* 3.0.2 (2015-09-11) |
|||
|
|||
* refactored the C extension |
|||
* minor non-significant changes |
|||
|
|||
* 3.0.1 (2015-07-30) |
|||
|
|||
* simplified some code |
|||
* fixed a segfault in the C extension |
|||
|
|||
* 3.0.0 (2014-07-24) |
|||
|
|||
* removed the Pimple class alias (use Pimple\Container instead) |
|||
|
|||
* 2.1.1 (2014-07-24) |
|||
|
|||
* fixed compiler warnings for the C extension |
|||
* fixed code when dealing with circular references |
|||
|
|||
* 2.1.0 (2014-06-24) |
|||
|
|||
* moved the Pimple to Pimple\Container (with a BC layer -- Pimple is now a |
|||
deprecated alias which will be removed in Pimple 3.0) |
|||
* added Pimple\ServiceProviderInterface (and Pimple::register()) |
|||
|
|||
* 2.0.0 (2014-02-10) |
|||
|
|||
* changed extend to automatically re-assign the extended service and keep it as shared or factory |
|||
(to keep BC, extend still returns the extended service) |
|||
* changed services to be shared by default (use factory() for factory |
|||
services) |
|||
|
|||
* 1.0.0 |
|||
|
|||
* initial version |
@ -0,0 +1,19 @@ |
|||
Copyright (c) 2009-2015 Fabien Potencier |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is furnished |
|||
to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
@ -0,0 +1,201 @@ |
|||
Pimple |
|||
====== |
|||
|
|||
.. caution:: |
|||
|
|||
This is the documentation for Pimple 3.x. If you are using Pimple 1.x, read |
|||
the `Pimple 1.x documentation`_. Reading the Pimple 1.x code is also a good |
|||
way to learn more about how to create a simple Dependency Injection |
|||
Container (recent versions of Pimple are more focused on performance). |
|||
|
|||
Pimple is a small Dependency Injection Container for PHP. |
|||
|
|||
Installation |
|||
------------ |
|||
|
|||
Before using Pimple in your project, add it to your ``composer.json`` file: |
|||
|
|||
.. code-block:: bash |
|||
|
|||
$ ./composer.phar require pimple/pimple ~3.0 |
|||
|
|||
Alternatively, Pimple is also available as a PHP C extension: |
|||
|
|||
.. code-block:: bash |
|||
|
|||
$ git clone https://github.com/silexphp/Pimple |
|||
$ cd Pimple/ext/pimple |
|||
$ phpize |
|||
$ ./configure |
|||
$ make |
|||
$ make install |
|||
|
|||
Usage |
|||
----- |
|||
|
|||
Creating a container is a matter of creating a ``Container`` instance: |
|||
|
|||
.. code-block:: php |
|||
|
|||
use Pimple\Container; |
|||
|
|||
$container = new Container(); |
|||
|
|||
As many other dependency injection containers, Pimple manages two different |
|||
kind of data: **services** and **parameters**. |
|||
|
|||
Defining Services |
|||
~~~~~~~~~~~~~~~~~ |
|||
|
|||
A service is an object that does something as part of a larger system. Examples |
|||
of services: a database connection, a templating engine, or a mailer. Almost |
|||
any **global** object can be a service. |
|||
|
|||
Services are defined by **anonymous functions** that return an instance of an |
|||
object: |
|||
|
|||
.. code-block:: php |
|||
|
|||
// define some services |
|||
$container['session_storage'] = function ($c) { |
|||
return new SessionStorage('SESSION_ID'); |
|||
}; |
|||
|
|||
$container['session'] = function ($c) { |
|||
return new Session($c['session_storage']); |
|||
}; |
|||
|
|||
Notice that the anonymous function has access to the current container |
|||
instance, allowing references to other services or parameters. |
|||
|
|||
As objects are only created when you get them, the order of the definitions |
|||
does not matter. |
|||
|
|||
Using the defined services is also very easy: |
|||
|
|||
.. code-block:: php |
|||
|
|||
// get the session object |
|||
$session = $container['session']; |
|||
|
|||
// the above call is roughly equivalent to the following code: |
|||
// $storage = new SessionStorage('SESSION_ID'); |
|||
// $session = new Session($storage); |
|||
|
|||
Defining Factory Services |
|||
~~~~~~~~~~~~~~~~~~~~~~~~~ |
|||
|
|||
By default, each time you get a service, Pimple returns the **same instance** |
|||
of it. If you want a different instance to be returned for all calls, wrap your |
|||
anonymous function with the ``factory()`` method |
|||
|
|||
.. code-block:: php |
|||
|
|||
$container['session'] = $container->factory(function ($c) { |
|||
return new Session($c['session_storage']); |
|||
}); |
|||
|
|||
Now, each call to ``$container['session']`` returns a new instance of the |
|||
session. |
|||
|
|||
Defining Parameters |
|||
~~~~~~~~~~~~~~~~~~~ |
|||
|
|||
Defining a parameter allows to ease the configuration of your container from |
|||
the outside and to store global values: |
|||
|
|||
.. code-block:: php |
|||
|
|||
// define some parameters |
|||
$container['cookie_name'] = 'SESSION_ID'; |
|||
$container['session_storage_class'] = 'SessionStorage'; |
|||
|
|||
If you change the ``session_storage`` service definition like below: |
|||
|
|||
.. code-block:: php |
|||
|
|||
$container['session_storage'] = function ($c) { |
|||
return new $c['session_storage_class']($c['cookie_name']); |
|||
}; |
|||
|
|||
You can now easily change the cookie name by overriding the |
|||
``session_storage_class`` parameter instead of redefining the service |
|||
definition. |
|||
|
|||
Protecting Parameters |
|||
~~~~~~~~~~~~~~~~~~~~~ |
|||
|
|||
Because Pimple sees anonymous functions as service definitions, you need to |
|||
wrap anonymous functions with the ``protect()`` method to store them as |
|||
parameters: |
|||
|
|||
.. code-block:: php |
|||
|
|||
$container['random_func'] = $container->protect(function () { |
|||
return rand(); |
|||
}); |
|||
|
|||
Modifying Services after Definition |
|||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|||
|
|||
In some cases you may want to modify a service definition after it has been |
|||
defined. You can use the ``extend()`` method to define additional code to be |
|||
run on your service just after it is created: |
|||
|
|||
.. code-block:: php |
|||
|
|||
$container['session_storage'] = function ($c) { |
|||
return new $c['session_storage_class']($c['cookie_name']); |
|||
}; |
|||
|
|||
$container->extend('session_storage', function ($storage, $c) { |
|||
$storage->...(); |
|||
|
|||
return $storage; |
|||
}); |
|||
|
|||
The first argument is the name of the service to extend, the second a function |
|||
that gets access to the object instance and the container. |
|||
|
|||
Extending a Container |
|||
~~~~~~~~~~~~~~~~~~~~~ |
|||
|
|||
If you use the same libraries over and over, you might want to reuse some |
|||
services from one project to the next one; package your services into a |
|||
**provider** by implementing ``Pimple\ServiceProviderInterface``: |
|||
|
|||
.. code-block:: php |
|||
|
|||
use Pimple\Container; |
|||
|
|||
class FooProvider implements Pimple\ServiceProviderInterface |
|||
{ |
|||
public function register(Container $pimple) |
|||
{ |
|||
// register some services and parameters |
|||
// on $pimple |
|||
} |
|||
} |
|||
|
|||
Then, register the provider on a Container: |
|||
|
|||
.. code-block:: php |
|||
|
|||
$pimple->register(new FooProvider()); |
|||
|
|||
Fetching the Service Creation Function |
|||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|||
|
|||
When you access an object, Pimple automatically calls the anonymous function |
|||
that you defined, which creates the service object for you. If you want to get |
|||
raw access to this function, you can use the ``raw()`` method: |
|||
|
|||
.. code-block:: php |
|||
|
|||
$container['session'] = function ($c) { |
|||
return new Session($c['session_storage']); |
|||
}; |
|||
|
|||
$sessionFunction = $container->raw('session'); |
|||
|
|||
.. _Pimple 1.x documentation: https://github.com/silexphp/Pimple/tree/1.1 |
@ -0,0 +1,25 @@ |
|||
{ |
|||
"name": "pimple/pimple", |
|||
"type": "library", |
|||
"description": "Pimple, a simple Dependency Injection Container", |
|||
"keywords": ["dependency injection", "container"], |
|||
"homepage": "http://pimple.sensiolabs.org", |
|||
"license": "MIT", |
|||
"authors": [ |
|||
{ |
|||
"name": "Fabien Potencier", |
|||
"email": "fabien@symfony.com" |
|||
} |
|||
], |
|||
"require": { |
|||
"php": ">=5.3.0" |
|||
}, |
|||
"autoload": { |
|||
"psr-0": { "Pimple": "src/" } |
|||
}, |
|||
"extra": { |
|||
"branch-alias": { |
|||
"dev-master": "3.0.x-dev" |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,30 @@ |
|||
*.sw* |
|||
.deps |
|||
Makefile |
|||
Makefile.fragments |
|||
Makefile.global |
|||
Makefile.objects |
|||
acinclude.m4 |
|||
aclocal.m4 |
|||
build/ |
|||
config.cache |
|||
config.guess |
|||
config.h |
|||
config.h.in |
|||
config.log |
|||
config.nice |
|||
config.status |
|||
config.sub |
|||
configure |
|||
configure.in |
|||
install-sh |
|||
libtool |
|||
ltmain.sh |
|||
missing |
|||
mkinstalldirs |
|||
run-tests.php |
|||
*.loT |
|||
.libs/ |
|||
modules/ |
|||
*.la |
|||
*.lo |
@ -0,0 +1,12 @@ |
|||
This is Pimple 2 implemented in C |
|||
|
|||
* PHP >= 5.3 |
|||
* Not tested under Windows, might work |
|||
|
|||
Install |
|||
======= |
|||
|
|||
> phpize |
|||
> ./configure |
|||
> make |
|||
> make install |
@ -0,0 +1,63 @@ |
|||
dnl $Id$ |
|||
dnl config.m4 for extension pimple |
|||
|
|||
dnl Comments in this file start with the string 'dnl'. |
|||
dnl Remove where necessary. This file will not work |
|||
dnl without editing. |
|||
|
|||
dnl If your extension references something external, use with: |
|||
|
|||
dnl PHP_ARG_WITH(pimple, for pimple support, |
|||
dnl Make sure that the comment is aligned: |
|||
dnl [ --with-pimple Include pimple support]) |
|||
|
|||
dnl Otherwise use enable: |
|||
|
|||
PHP_ARG_ENABLE(pimple, whether to enable pimple support, |
|||
dnl Make sure that the comment is aligned: |
|||
[ --enable-pimple Enable pimple support]) |
|||
|
|||
if test "$PHP_PIMPLE" != "no"; then |
|||
dnl Write more examples of tests here... |
|||
|
|||
dnl # --with-pimple -> check with-path |
|||
dnl SEARCH_PATH="/usr/local /usr" # you might want to change this |
|||
dnl SEARCH_FOR="/include/pimple.h" # you most likely want to change this |
|||
dnl if test -r $PHP_PIMPLE/$SEARCH_FOR; then # path given as parameter |
|||
dnl PIMPLE_DIR=$PHP_PIMPLE |
|||
dnl else # search default path list |
|||
dnl AC_MSG_CHECKING([for pimple files in default path]) |
|||
dnl for i in $SEARCH_PATH ; do |
|||
dnl if test -r $i/$SEARCH_FOR; then |
|||
dnl PIMPLE_DIR=$i |
|||
dnl AC_MSG_RESULT(found in $i) |
|||
dnl fi |
|||
dnl done |
|||
dnl fi |
|||
dnl |
|||
dnl if test -z "$PIMPLE_DIR"; then |
|||
dnl AC_MSG_RESULT([not found]) |
|||
dnl AC_MSG_ERROR([Please reinstall the pimple distribution]) |
|||
dnl fi |
|||
|
|||
dnl # --with-pimple -> add include path |
|||
dnl PHP_ADD_INCLUDE($PIMPLE_DIR/include) |
|||
|
|||
dnl # --with-pimple -> check for lib and symbol presence |
|||
dnl LIBNAME=pimple # you may want to change this |
|||
dnl LIBSYMBOL=pimple # you most likely want to change this |
|||
|
|||
dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL, |
|||
dnl [ |
|||
dnl PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $PIMPLE_DIR/lib, PIMPLE_SHARED_LIBADD) |
|||
dnl AC_DEFINE(HAVE_PIMPLELIB,1,[ ]) |
|||
dnl ],[ |
|||
dnl AC_MSG_ERROR([wrong pimple lib version or lib not found]) |
|||
dnl ],[ |
|||
dnl -L$PIMPLE_DIR/lib -lm |
|||
dnl ]) |
|||
dnl |
|||
dnl PHP_SUBST(PIMPLE_SHARED_LIBADD) |
|||
|
|||
PHP_NEW_EXTENSION(pimple, pimple.c, $ext_shared) |
|||
fi |
@ -0,0 +1,13 @@ |
|||
// $Id$ |
|||
// vim:ft=javascript |
|||
|
|||
// If your extension references something external, use ARG_WITH |
|||
// ARG_WITH("pimple", "for pimple support", "no"); |
|||
|
|||
// Otherwise, use ARG_ENABLE |
|||
// ARG_ENABLE("pimple", "enable pimple support", "no"); |
|||
|
|||
if (PHP_PIMPLE != "no") { |
|||
EXTENSION("pimple", "pimple.c"); |
|||
} |
|||
|
@ -0,0 +1,121 @@ |
|||
|
|||
/* |
|||
* This file is part of Pimple. |
|||
* |
|||
* Copyright (c) 2014 Fabien Potencier |
|||
* |
|||
* Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
* of this software and associated documentation files (the "Software"), to deal |
|||
* in the Software without restriction, including without limitation the rights |
|||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
* copies of the Software, and to permit persons to whom the Software is furnished |
|||
* to do so, subject to the following conditions: |
|||
* |
|||
* The above copyright notice and this permission notice shall be included in all |
|||
* copies or substantial portions of the Software. |
|||
* |
|||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
* THE SOFTWARE. |
|||
*/ |
|||
|
|||
#ifndef PHP_PIMPLE_H |
|||
#define PHP_PIMPLE_H |
|||
|
|||
extern zend_module_entry pimple_module_entry; |
|||
#define phpext_pimple_ptr &pimple_module_entry |
|||
|
|||
#ifdef PHP_WIN32 |
|||
# define PHP_PIMPLE_API __declspec(dllexport) |
|||
#elif defined(__GNUC__) && __GNUC__ >= 4 |
|||
# define PHP_PIMPLE_API __attribute__ ((visibility("default"))) |
|||
#else |
|||
# define PHP_PIMPLE_API |
|||
#endif |
|||
|
|||
#ifdef ZTS |
|||
#include "TSRM.h" |
|||
#endif |
|||
|
|||
#define PIMPLE_VERSION "3.0.2" |
|||
#define PIMPLE_NS "Pimple" |
|||
|
|||
#define PIMPLE_DEFAULT_ZVAL_CACHE_NUM 5 |
|||
#define PIMPLE_DEFAULT_ZVAL_VALUES_NUM 10 |
|||
|
|||
zend_module_entry *get_module(void); |
|||
|
|||
PHP_MINIT_FUNCTION(pimple); |
|||
PHP_MINFO_FUNCTION(pimple); |
|||
|
|||
PHP_METHOD(Pimple, __construct); |
|||
PHP_METHOD(Pimple, factory); |
|||
PHP_METHOD(Pimple, protect); |
|||
PHP_METHOD(Pimple, raw); |
|||
PHP_METHOD(Pimple, extend); |
|||
PHP_METHOD(Pimple, keys); |
|||
PHP_METHOD(Pimple, register); |
|||
PHP_METHOD(Pimple, offsetSet); |
|||
PHP_METHOD(Pimple, offsetUnset); |
|||
PHP_METHOD(Pimple, offsetGet); |
|||
PHP_METHOD(Pimple, offsetExists); |
|||
|
|||
PHP_METHOD(PimpleClosure, invoker); |
|||
|
|||
typedef struct _pimple_bucket_value { |
|||
zval *value; /* Must be the first element */ |
|||
zval *raw; |
|||
zend_object_handle handle_num; |
|||
enum { |
|||
PIMPLE_IS_PARAM = 0, |
|||
PIMPLE_IS_SERVICE = 2 |
|||
} type; |
|||
zend_bool initialized; |
|||
zend_fcall_info_cache fcc; |
|||
} pimple_bucket_value; |
|||
|
|||
typedef struct _pimple_object { |
|||
zend_object zobj; |
|||
HashTable values; |
|||
HashTable factories; |
|||
HashTable protected; |
|||
} pimple_object; |
|||
|
|||
typedef struct _pimple_closure_object { |
|||
zend_object zobj; |
|||
zval *callable; |
|||
zval *factory; |
|||
} pimple_closure_object; |
|||
|
|||
static const char sensiolabs_logo[] = "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHYAAAAUCAMAAABvRTlyAAAAz1BMVEUAAAAAAAAAAAAsThWB5j4AAACD6T8AAACC6D+C6D6C6D+C6D4AAAAAAACC6D4AAAAAAACC6D8AAAAAAAAAAAAAAAAAAAAAAACC6D4AAAAAAAAAAACC6D4AAAAAAAAAAAAAAAAAAAAAAACC6D8AAACC6D4AAAAAAAAAAAAAAAAAAACC6D8AAACC6D6C6D+B6D+C6D+C6D+C6D8AAACC6D6C6D4AAACC6D/K/2KC6D+B6D6C6D6C6D+C6D8sTxUyWRhEeiEAAACC6D+C5z6B6D7drnEVAAAAQXRSTlMAE3oCNSUuDHFHzxaF9UFsu+irX+zlKzYimaJXktyOSFD6BolxqT7QGMMdarMIpuO28r9EolXKgR16OphfXYd4V14GtB4AAAMpSURBVEjHvVSJctowEF1jjME2RziMwUCoMfd9heZqG4n//6buLpJjkmYm03byZmxJa2nf6u2uQcG2bfhqRN4LoTKBzyGDm68M7mAwcOEdjo4zhA/Rf9Go/CVtTgiRhXfIC3EDH8F/eUX1/9KexRo+QgOdtHDsEe/sM7QT32/+K61Z1LFXcXJxN4pTbu1aTQUzuy2PIA0rDo0/0Aa5XFaJvKaVTrubywXvaa1Wq4Vu/Snr3Y7Aojh4VccwykW2N2oQ8wmjyut6+Q1t5ywIG5Npj1sh5E0B7YOzFDjfuRfaOh3O+MbbVNfTWS9COZk3Obd2su5d0a6IU9KLREbw8gEehWSr1r2sPWciXLG38r5NdW0xu9eioU87omjC9yNaMi5GNf6WppVSOqXCFkmCvMB3p9SROLoYQn5pDgQOujA1xjYvqH+plUdkwnmII8VxR/PKYkrfLLomhVlE3b/LhNbNr7hp0H2JaOc4v8dFB58HSsFTSafaqtY1sT3GO8wsy5rhokYPlRJdjPMajyYqTt1EHF/2uqSWQWmAjCUSmQ1MS3g8Btf1XOsy7YIC0CB1b5Xw1Vhba0zbxiCAQLH9TNPmHJXQUtJAN0KcDsoqLxsNvJrJExa7mKIdp2lRE2WexiS4pqWk/0jROlw6K6bV9YOBDGAuqMJ0bnuUKGB0L27bxgRhGEbzihbhxxXaQC88Vkwq8ldCi86RApWUb0Q+4VDosBCc+1s81lUdnBavH4Zp2mm3O44USwOfvSo9oBiwpFg71lMS1VKJLKljS3j9p+fOTvXXlsSNuEv6YPaZda9uRope0VJfKdo7fPiYfSmvFjXQbkhY0d9hCbBWIktRgEDieDhf1N3wbbkmNNgRy8hyl620yGQat/grV3HMpc2HDKTVmOPFz6ylPCKt/nXcAyV260jaAowwIW0YuBzrOgb/KrddZS9OmJaLgpWK4JX2DDuklcLZSDGcn8Vmx9YDNvT6UsjyBApRyFQVX7Vxm9TGxE16nmfRd8/zQoDmggQOTRh5Hv8pMt9Q/L2JmSwkMCE7dA4BuDjHJwfu0Om4QAhOjrN5XkIatglfiN/bUPdCQFjTYgAAAABJRU5ErkJggg==\">"; |
|||
|
|||
static int pimple_zval_to_pimpleval(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC); |
|||
static int pimple_zval_is_valid_callback(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC); |
|||
|
|||
static void pimple_bucket_dtor(pimple_bucket_value *bucket); |
|||
static void pimple_free_bucket(pimple_bucket_value *bucket); |
|||
|
|||
static zval *pimple_object_read_dimension(zval *object, zval *offset, int type TSRMLS_DC); |
|||
static void pimple_object_write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC); |
|||
static int pimple_object_has_dimension(zval *object, zval *offset, int check_empty TSRMLS_DC); |
|||
static void pimple_object_unset_dimension(zval *object, zval *offset TSRMLS_DC); |
|||
static zend_object_value pimple_object_create(zend_class_entry *ce TSRMLS_DC); |
|||
static void pimple_free_object_storage(pimple_object *obj TSRMLS_DC); |
|||
|
|||
static void pimple_closure_free_object_storage(pimple_closure_object *obj TSRMLS_DC); |
|||
static zend_object_value pimple_closure_object_create(zend_class_entry *ce TSRMLS_DC); |
|||
static zend_function *pimple_closure_get_constructor(zval * TSRMLS_DC); |
|||
static int pimple_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, union _zend_function **fptr_ptr, zval **zobj_ptr TSRMLS_DC); |
|||
|
|||
#ifdef ZTS |
|||
#define PIMPLE_G(v) TSRMG(pimple_globals_id, zend_pimple_globals *, v) |
|||
#else |
|||
#define PIMPLE_G(v) (pimple_globals.v) |
|||
#endif |
|||
|
|||
#endif /* PHP_PIMPLE_H */ |
|||
|
@ -0,0 +1,922 @@ |
|||
|
|||
/* |
|||
* This file is part of Pimple. |
|||
* |
|||
* Copyright (c) 2014 Fabien Potencier |
|||
* |
|||
* Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
* of this software and associated documentation files (the "Software"), to deal |
|||
* in the Software without restriction, including without limitation the rights |
|||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
* copies of the Software, and to permit persons to whom the Software is furnished |
|||
* to do so, subject to the following conditions: |
|||
* |
|||
* The above copyright notice and this permission notice shall be included in all |
|||
* copies or substantial portions of the Software. |
|||
* |
|||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
* THE SOFTWARE. |
|||
*/ |
|||
|
|||
#ifdef HAVE_CONFIG_H |
|||
#include "config.h" |
|||
#endif |
|||
|
|||
#include "php.h" |
|||
#include "php_ini.h" |
|||
#include "ext/standard/info.h" |
|||
#include "php_pimple.h" |
|||
#include "pimple_compat.h" |
|||
#include "zend_interfaces.h" |
|||
#include "zend.h" |
|||
#include "Zend/zend_closures.h" |
|||
#include "ext/spl/spl_exceptions.h" |
|||
#include "Zend/zend_exceptions.h" |
|||
#include "main/php_output.h" |
|||
#include "SAPI.h" |
|||
|
|||
static zend_class_entry *pimple_ce; |
|||
static zend_object_handlers pimple_object_handlers; |
|||
static zend_class_entry *pimple_closure_ce; |
|||
static zend_class_entry *pimple_serviceprovider_ce; |
|||
static zend_object_handlers pimple_closure_object_handlers; |
|||
static zend_internal_function pimple_closure_invoker_function; |
|||
|
|||
#define FETCH_DIM_HANDLERS_VARS pimple_object *pimple_obj = NULL; \ |
|||
ulong index; \ |
|||
pimple_obj = (pimple_object *)zend_object_store_get_object(object TSRMLS_CC); \ |
|||
|
|||
#define PIMPLE_OBJECT_HANDLE_INHERITANCE_OBJECT_HANDLERS do { \ |
|||
if (ce != pimple_ce) { \ |
|||
zend_hash_find(&ce->function_table, ZEND_STRS("offsetget"), (void **)&function); \ |
|||
if (function->common.scope != ce) { /* if the function is not defined in this actual class */ \ |
|||
pimple_object_handlers.read_dimension = pimple_object_read_dimension; /* then overwrite the handler to use custom one */ \ |
|||
} \ |
|||
zend_hash_find(&ce->function_table, ZEND_STRS("offsetset"), (void **)&function); \ |
|||
if (function->common.scope != ce) { \ |
|||
pimple_object_handlers.write_dimension = pimple_object_write_dimension; \ |
|||
} \ |
|||
zend_hash_find(&ce->function_table, ZEND_STRS("offsetexists"), (void **)&function); \ |
|||
if (function->common.scope != ce) { \ |
|||
pimple_object_handlers.has_dimension = pimple_object_has_dimension; \ |
|||
} \ |
|||
zend_hash_find(&ce->function_table, ZEND_STRS("offsetunset"), (void **)&function); \ |
|||
if (function->common.scope != ce) { \ |
|||
pimple_object_handlers.unset_dimension = pimple_object_unset_dimension; \ |
|||
} \ |
|||
} else { \ |
|||
pimple_object_handlers.read_dimension = pimple_object_read_dimension; \ |
|||
pimple_object_handlers.write_dimension = pimple_object_write_dimension; \ |
|||
pimple_object_handlers.has_dimension = pimple_object_has_dimension; \ |
|||
pimple_object_handlers.unset_dimension = pimple_object_unset_dimension; \ |
|||
}\ |
|||
} while(0); |
|||
|
|||
#define PIMPLE_CALL_CB do { \ |
|||
zend_fcall_info_argn(&fci TSRMLS_CC, 1, &object); \ |
|||
fci.size = sizeof(fci); \ |
|||
fci.object_ptr = retval->fcc.object_ptr; \ |
|||
fci.function_name = retval->value; \ |
|||
fci.no_separation = 1; \ |
|||
fci.retval_ptr_ptr = &retval_ptr_ptr; \ |
|||
\ |
|||
zend_call_function(&fci, &retval->fcc TSRMLS_CC); \ |
|||
efree(fci.params); \ |
|||
if (EG(exception)) { \ |
|||
return EG(uninitialized_zval_ptr); \ |
|||
} \ |
|||
} while(0); |
|||
|
|||
ZEND_BEGIN_ARG_INFO_EX(arginfo___construct, 0, 0, 0) |
|||
ZEND_ARG_ARRAY_INFO(0, value, 0) |
|||
ZEND_END_ARG_INFO() |
|||
|
|||
ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetset, 0, 0, 2) |
|||
ZEND_ARG_INFO(0, offset) |
|||
ZEND_ARG_INFO(0, value) |
|||
ZEND_END_ARG_INFO() |
|||
|
|||
ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetget, 0, 0, 1) |
|||
ZEND_ARG_INFO(0, offset) |
|||
ZEND_END_ARG_INFO() |
|||
|
|||
ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetexists, 0, 0, 1) |
|||
ZEND_ARG_INFO(0, offset) |
|||
ZEND_END_ARG_INFO() |
|||
|
|||
ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetunset, 0, 0, 1) |
|||
ZEND_ARG_INFO(0, offset) |
|||
ZEND_END_ARG_INFO() |
|||
|
|||
ZEND_BEGIN_ARG_INFO_EX(arginfo_factory, 0, 0, 1) |
|||
ZEND_ARG_INFO(0, callable) |
|||
ZEND_END_ARG_INFO() |
|||
|
|||
ZEND_BEGIN_ARG_INFO_EX(arginfo_protect, 0, 0, 1) |
|||
ZEND_ARG_INFO(0, callable) |
|||
ZEND_END_ARG_INFO() |
|||
|
|||
ZEND_BEGIN_ARG_INFO_EX(arginfo_raw, 0, 0, 1) |
|||
ZEND_ARG_INFO(0, id) |
|||
ZEND_END_ARG_INFO() |
|||
|
|||
ZEND_BEGIN_ARG_INFO_EX(arginfo_extend, 0, 0, 2) |
|||
ZEND_ARG_INFO(0, id) |
|||
ZEND_ARG_INFO(0, callable) |
|||
ZEND_END_ARG_INFO() |
|||
|
|||
ZEND_BEGIN_ARG_INFO_EX(arginfo_keys, 0, 0, 0) |
|||
ZEND_END_ARG_INFO() |
|||
|
|||
ZEND_BEGIN_ARG_INFO_EX(arginfo_register, 0, 0, 1) |
|||
ZEND_ARG_OBJ_INFO(0, provider, Pimple\\ServiceProviderInterface, 0) |
|||
ZEND_ARG_ARRAY_INFO(0, values, 1) |
|||
ZEND_END_ARG_INFO() |
|||
|
|||
ZEND_BEGIN_ARG_INFO_EX(arginfo_serviceprovider_register, 0, 0, 1) |
|||
ZEND_ARG_OBJ_INFO(0, pimple, Pimple\\Container, 0) |
|||
ZEND_END_ARG_INFO() |
|||
|
|||
static const zend_function_entry pimple_ce_functions[] = { |
|||
PHP_ME(Pimple, __construct, arginfo___construct, ZEND_ACC_PUBLIC) |
|||
PHP_ME(Pimple, factory, arginfo_factory, ZEND_ACC_PUBLIC) |
|||
PHP_ME(Pimple, protect, arginfo_protect, ZEND_ACC_PUBLIC) |
|||
PHP_ME(Pimple, raw, arginfo_raw, ZEND_ACC_PUBLIC) |
|||
PHP_ME(Pimple, extend, arginfo_extend, ZEND_ACC_PUBLIC) |
|||
PHP_ME(Pimple, keys, arginfo_keys, ZEND_ACC_PUBLIC) |
|||
PHP_ME(Pimple, register, arginfo_register, ZEND_ACC_PUBLIC) |
|||
|
|||
PHP_ME(Pimple, offsetSet, arginfo_offsetset, ZEND_ACC_PUBLIC) |
|||
PHP_ME(Pimple, offsetGet, arginfo_offsetget, ZEND_ACC_PUBLIC) |
|||
PHP_ME(Pimple, offsetExists, arginfo_offsetexists, ZEND_ACC_PUBLIC) |
|||
PHP_ME(Pimple, offsetUnset, arginfo_offsetunset, ZEND_ACC_PUBLIC) |
|||
PHP_FE_END |
|||
}; |
|||
|
|||
static const zend_function_entry pimple_serviceprovider_iface_ce_functions[] = { |
|||
PHP_ABSTRACT_ME(ServiceProviderInterface, register, arginfo_serviceprovider_register) |
|||
PHP_FE_END |
|||
}; |
|||
|
|||
static void pimple_closure_free_object_storage(pimple_closure_object *obj TSRMLS_DC) |
|||
{ |
|||
zend_object_std_dtor(&obj->zobj TSRMLS_CC); |
|||
if (obj->factory) { |
|||
zval_ptr_dtor(&obj->factory); |
|||
} |
|||
if (obj->callable) { |
|||
zval_ptr_dtor(&obj->callable); |
|||
} |
|||
efree(obj); |
|||
} |
|||
|
|||
static void pimple_free_object_storage(pimple_object *obj TSRMLS_DC) |
|||
{ |
|||
zend_hash_destroy(&obj->factories); |
|||
zend_hash_destroy(&obj->protected); |
|||
zend_hash_destroy(&obj->values); |
|||
zend_object_std_dtor(&obj->zobj TSRMLS_CC); |
|||
efree(obj); |
|||
} |
|||
|
|||
static void pimple_free_bucket(pimple_bucket_value *bucket) |
|||
{ |
|||
if (bucket->raw) { |
|||
zval_ptr_dtor(&bucket->raw); |
|||
} |
|||
} |
|||
|
|||
static zend_object_value pimple_closure_object_create(zend_class_entry *ce TSRMLS_DC) |
|||
{ |
|||
zend_object_value retval; |
|||
pimple_closure_object *pimple_closure_obj = NULL; |
|||
|
|||
pimple_closure_obj = ecalloc(1, sizeof(pimple_closure_object)); |
|||
ZEND_OBJ_INIT(&pimple_closure_obj->zobj, ce); |
|||
|
|||
pimple_closure_object_handlers.get_constructor = pimple_closure_get_constructor; |
|||
retval.handlers = &pimple_closure_object_handlers; |
|||
retval.handle = zend_objects_store_put(pimple_closure_obj, (zend_objects_store_dtor_t) zend_objects_destroy_object, (zend_objects_free_object_storage_t) pimple_closure_free_object_storage, NULL TSRMLS_CC); |
|||
|
|||
return retval; |
|||
} |
|||
|
|||
static zend_function *pimple_closure_get_constructor(zval *obj TSRMLS_DC) |
|||
{ |
|||
zend_error(E_ERROR, "Pimple\\ContainerClosure is an internal class and cannot be instantiated"); |
|||
|
|||
return NULL; |
|||
} |
|||
|
|||
static int pimple_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, union _zend_function **fptr_ptr, zval **zobj_ptr TSRMLS_DC) |
|||
{ |
|||
*zobj_ptr = obj; |
|||
*ce_ptr = Z_OBJCE_P(obj); |
|||
*fptr_ptr = (zend_function *)&pimple_closure_invoker_function; |
|||
|
|||
return SUCCESS; |
|||
} |
|||
|
|||
static zend_object_value pimple_object_create(zend_class_entry *ce TSRMLS_DC) |
|||
{ |
|||
zend_object_value retval; |
|||
pimple_object *pimple_obj = NULL; |
|||
zend_function *function = NULL; |
|||
|
|||
pimple_obj = emalloc(sizeof(pimple_object)); |
|||
ZEND_OBJ_INIT(&pimple_obj->zobj, ce); |
|||
|
|||
PIMPLE_OBJECT_HANDLE_INHERITANCE_OBJECT_HANDLERS |
|||
|
|||
retval.handlers = &pimple_object_handlers; |
|||
retval.handle = zend_objects_store_put(pimple_obj, (zend_objects_store_dtor_t) zend_objects_destroy_object, (zend_objects_free_object_storage_t) pimple_free_object_storage, NULL TSRMLS_CC); |
|||
|
|||
zend_hash_init(&pimple_obj->factories, PIMPLE_DEFAULT_ZVAL_CACHE_NUM, NULL, (dtor_func_t)pimple_bucket_dtor, 0); |
|||
zend_hash_init(&pimple_obj->protected, PIMPLE_DEFAULT_ZVAL_CACHE_NUM, NULL, (dtor_func_t)pimple_bucket_dtor, 0); |
|||
zend_hash_init(&pimple_obj->values, PIMPLE_DEFAULT_ZVAL_VALUES_NUM, NULL, (dtor_func_t)pimple_bucket_dtor, 0); |
|||
|
|||
return retval; |
|||
} |
|||
|
|||
static void pimple_object_write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC) |
|||
{ |
|||
FETCH_DIM_HANDLERS_VARS |
|||
|
|||
pimple_bucket_value pimple_value = {0}, *found_value = NULL; |
|||
ulong hash; |
|||
|
|||
pimple_zval_to_pimpleval(value, &pimple_value TSRMLS_CC); |
|||
|
|||
if (!offset) {/* $p[] = 'foo' when not overloaded */ |
|||
zend_hash_next_index_insert(&pimple_obj->values, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL); |
|||
Z_ADDREF_P(value); |
|||
return; |
|||
} |
|||
|
|||
switch (Z_TYPE_P(offset)) { |
|||
case IS_STRING: |
|||
hash = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); |
|||
zend_hash_quick_find(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hash, (void **)&found_value); |
|||
if (found_value && found_value->type == PIMPLE_IS_SERVICE && found_value->initialized == 1) { |
|||
pimple_free_bucket(&pimple_value); |
|||
zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot override frozen service \"%s\".", Z_STRVAL_P(offset)); |
|||
return; |
|||
} |
|||
if (zend_hash_quick_update(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hash, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL) == FAILURE) { |
|||
pimple_free_bucket(&pimple_value); |
|||
return; |
|||
} |
|||
Z_ADDREF_P(value); |
|||
break; |
|||
case IS_DOUBLE: |
|||
case IS_BOOL: |
|||
case IS_LONG: |
|||
if (Z_TYPE_P(offset) == IS_DOUBLE) { |
|||
index = (ulong)Z_DVAL_P(offset); |
|||
} else { |
|||
index = Z_LVAL_P(offset); |
|||
} |
|||
zend_hash_index_find(&pimple_obj->values, index, (void **)&found_value); |
|||
if (found_value && found_value->type == PIMPLE_IS_SERVICE && found_value->initialized == 1) { |
|||
pimple_free_bucket(&pimple_value); |
|||
zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot override frozen service \"%ld\".", index); |
|||
return; |
|||
} |
|||
if (zend_hash_index_update(&pimple_obj->values, index, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL) == FAILURE) { |
|||
pimple_free_bucket(&pimple_value); |
|||
return; |
|||
} |
|||
Z_ADDREF_P(value); |
|||
break; |
|||
case IS_NULL: /* $p[] = 'foo' when overloaded */ |
|||
zend_hash_next_index_insert(&pimple_obj->values, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL); |
|||
Z_ADDREF_P(value); |
|||
break; |
|||
default: |
|||
pimple_free_bucket(&pimple_value); |
|||
zend_error(E_WARNING, "Unsupported offset type"); |
|||
} |
|||
} |
|||
|
|||
static void pimple_object_unset_dimension(zval *object, zval *offset TSRMLS_DC) |
|||
{ |
|||
FETCH_DIM_HANDLERS_VARS |
|||
|
|||
switch (Z_TYPE_P(offset)) { |
|||
case IS_STRING: |
|||
zend_symtable_del(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); |
|||
zend_symtable_del(&pimple_obj->factories, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); |
|||
zend_symtable_del(&pimple_obj->protected, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); |
|||
break; |
|||
case IS_DOUBLE: |
|||
case IS_BOOL: |
|||
case IS_LONG: |
|||
if (Z_TYPE_P(offset) == IS_DOUBLE) { |
|||
index = (ulong)Z_DVAL_P(offset); |
|||
} else { |
|||
index = Z_LVAL_P(offset); |
|||
} |
|||
zend_hash_index_del(&pimple_obj->values, index); |
|||
zend_hash_index_del(&pimple_obj->factories, index); |
|||
zend_hash_index_del(&pimple_obj->protected, index); |
|||
break; |
|||
default: |
|||
zend_error(E_WARNING, "Unsupported offset type"); |
|||
} |
|||
} |
|||
|
|||
static int pimple_object_has_dimension(zval *object, zval *offset, int check_empty TSRMLS_DC) |
|||
{ |
|||
FETCH_DIM_HANDLERS_VARS |
|||
|
|||
pimple_bucket_value *retval = NULL; |
|||
|
|||
switch (Z_TYPE_P(offset)) { |
|||
case IS_STRING: |
|||
if (zend_symtable_find(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void **)&retval) == SUCCESS) { |
|||
switch (check_empty) { |
|||
case 0: /* isset */ |
|||
return 1; /* Differs from PHP behavior (Z_TYPE_P(retval->value) != IS_NULL;) */ |
|||
case 1: /* empty */ |
|||
default: |
|||
return zend_is_true(retval->value); |
|||
} |
|||
} |
|||
return 0; |
|||
break; |
|||
case IS_DOUBLE: |
|||
case IS_BOOL: |
|||
case IS_LONG: |
|||
if (Z_TYPE_P(offset) == IS_DOUBLE) { |
|||
index = (ulong)Z_DVAL_P(offset); |
|||
} else { |
|||
index = Z_LVAL_P(offset); |
|||
} |
|||
if (zend_hash_index_find(&pimple_obj->values, index, (void **)&retval) == SUCCESS) { |
|||
switch (check_empty) { |
|||
case 0: /* isset */ |
|||
return 1; /* Differs from PHP behavior (Z_TYPE_P(retval->value) != IS_NULL;)*/ |
|||
case 1: /* empty */ |
|||
default: |
|||
return zend_is_true(retval->value); |
|||
} |
|||
} |
|||
return 0; |
|||
break; |
|||
default: |
|||
zend_error(E_WARNING, "Unsupported offset type"); |
|||
return 0; |
|||
} |
|||
} |
|||
|
|||
static zval *pimple_object_read_dimension(zval *object, zval *offset, int type TSRMLS_DC) |
|||
{ |
|||
FETCH_DIM_HANDLERS_VARS |
|||
|
|||
pimple_bucket_value *retval = NULL; |
|||
zend_fcall_info fci = {0}; |
|||
zval *retval_ptr_ptr = NULL; |
|||
|
|||
switch (Z_TYPE_P(offset)) { |
|||
case IS_STRING: |
|||
if (zend_symtable_find(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void **)&retval) == FAILURE) { |
|||
zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Identifier \"%s\" is not defined.", Z_STRVAL_P(offset)); |
|||
return EG(uninitialized_zval_ptr); |
|||
} |
|||
break; |
|||
case IS_DOUBLE: |
|||
case IS_BOOL: |
|||
case IS_LONG: |
|||
if (Z_TYPE_P(offset) == IS_DOUBLE) { |
|||
index = (ulong)Z_DVAL_P(offset); |
|||
} else { |
|||
index = Z_LVAL_P(offset); |
|||
} |
|||
if (zend_hash_index_find(&pimple_obj->values, index, (void **)&retval) == FAILURE) { |
|||
return EG(uninitialized_zval_ptr); |
|||
} |
|||
break; |
|||
case IS_NULL: /* $p[][3] = 'foo' first dim access */ |
|||
return EG(uninitialized_zval_ptr); |
|||
break; |
|||
default: |
|||
zend_error(E_WARNING, "Unsupported offset type"); |
|||
return EG(uninitialized_zval_ptr); |
|||
} |
|||
|
|||
if(retval->type == PIMPLE_IS_PARAM) { |
|||
return retval->value; |
|||
} |
|||
|
|||
if (zend_hash_index_exists(&pimple_obj->protected, retval->handle_num)) { |
|||
/* Service is protected, return the value every time */ |
|||
return retval->value; |
|||
} |
|||
|
|||
if (zend_hash_index_exists(&pimple_obj->factories, retval->handle_num)) { |
|||
/* Service is a factory, call it everytime and never cache its result */ |
|||
PIMPLE_CALL_CB |
|||
Z_DELREF_P(retval_ptr_ptr); /* fetch dim addr will increment refcount */ |
|||
return retval_ptr_ptr; |
|||
} |
|||
|
|||
if (retval->initialized == 1) { |
|||
/* Service has already been called, return its cached value */ |
|||
return retval->value; |
|||
} |
|||
|
|||
ALLOC_INIT_ZVAL(retval->raw); |
|||
MAKE_COPY_ZVAL(&retval->value, retval->raw); |
|||
|
|||
PIMPLE_CALL_CB |
|||
|
|||
retval->initialized = 1; |
|||
zval_ptr_dtor(&retval->value); |
|||
retval->value = retval_ptr_ptr; |
|||
|
|||
return retval->value; |
|||
} |
|||
|
|||
static int pimple_zval_is_valid_callback(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC) |
|||
{ |
|||
if (Z_TYPE_P(_zval) != IS_OBJECT) { |
|||
return FAILURE; |
|||
} |
|||
|
|||
if (_pimple_bucket_value->fcc.called_scope) { |
|||
return SUCCESS; |
|||
} |
|||
|
|||
if (Z_OBJ_HANDLER_P(_zval, get_closure) && Z_OBJ_HANDLER_P(_zval, get_closure)(_zval, &_pimple_bucket_value->fcc.calling_scope, &_pimple_bucket_value->fcc.function_handler, &_pimple_bucket_value->fcc.object_ptr TSRMLS_CC) == SUCCESS) { |
|||
_pimple_bucket_value->fcc.called_scope = _pimple_bucket_value->fcc.calling_scope; |
|||
return SUCCESS; |
|||
} else { |
|||
return FAILURE; |
|||
} |
|||
} |
|||
|
|||
static int pimple_zval_to_pimpleval(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC) |
|||
{ |
|||
_pimple_bucket_value->value = _zval; |
|||
|
|||
if (Z_TYPE_P(_zval) != IS_OBJECT) { |
|||
return PIMPLE_IS_PARAM; |
|||
} |
|||
|
|||
if (pimple_zval_is_valid_callback(_zval, _pimple_bucket_value TSRMLS_CC) == SUCCESS) { |
|||
_pimple_bucket_value->type = PIMPLE_IS_SERVICE; |
|||
_pimple_bucket_value->handle_num = Z_OBJ_HANDLE_P(_zval); |
|||
} |
|||
|
|||
return PIMPLE_IS_SERVICE; |
|||
} |
|||
|
|||
static void pimple_bucket_dtor(pimple_bucket_value *bucket) |
|||
{ |
|||
zval_ptr_dtor(&bucket->value); |
|||
pimple_free_bucket(bucket); |
|||
} |
|||
|
|||
PHP_METHOD(Pimple, protect) |
|||
{ |
|||
zval *protected = NULL; |
|||
pimple_object *pobj = NULL; |
|||
pimple_bucket_value bucket = {0}; |
|||
|
|||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &protected) == FAILURE) { |
|||
return; |
|||
} |
|||
|
|||
if (pimple_zval_is_valid_callback(protected, &bucket TSRMLS_CC) == FAILURE) { |
|||
pimple_free_bucket(&bucket); |
|||
zend_throw_exception(spl_ce_InvalidArgumentException, "Callable is not a Closure or invokable object.", 0 TSRMLS_CC); |
|||
return; |
|||
} |
|||
|
|||
pimple_zval_to_pimpleval(protected, &bucket TSRMLS_CC); |
|||
pobj = (pimple_object *)zend_object_store_get_object(getThis() TSRMLS_CC); |
|||
|
|||
if (zend_hash_index_update(&pobj->protected, bucket.handle_num, (void *)&bucket, sizeof(pimple_bucket_value), NULL) == SUCCESS) { |
|||
Z_ADDREF_P(protected); |
|||
RETURN_ZVAL(protected, 1 , 0); |
|||
} else { |
|||
pimple_free_bucket(&bucket); |
|||
} |
|||
RETURN_FALSE; |
|||
} |
|||
|
|||
PHP_METHOD(Pimple, raw) |
|||
{ |
|||
zval *offset = NULL; |
|||
pimple_object *pobj = NULL; |
|||
pimple_bucket_value *value = NULL; |
|||
ulong index; |
|||
|
|||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &offset) == FAILURE) { |
|||
return; |
|||
} |
|||
|
|||
pobj = zend_object_store_get_object(getThis() TSRMLS_CC); |
|||
|
|||
switch (Z_TYPE_P(offset)) { |
|||
case IS_STRING: |
|||
if (zend_symtable_find(&pobj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void *)&value) == FAILURE) { |
|||
zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Identifier \"%s\" is not defined.", Z_STRVAL_P(offset)); |
|||
RETURN_NULL(); |
|||
} |
|||
break; |
|||
case IS_DOUBLE: |
|||
case IS_BOOL: |
|||
case IS_LONG: |
|||
if (Z_TYPE_P(offset) == IS_DOUBLE) { |
|||
index = (ulong)Z_DVAL_P(offset); |
|||
} else { |
|||
index = Z_LVAL_P(offset); |
|||
} |
|||
if (zend_hash_index_find(&pobj->values, index, (void *)&value) == FAILURE) { |
|||
RETURN_NULL(); |
|||
} |
|||
break; |
|||
case IS_NULL: |
|||
default: |
|||
zend_error(E_WARNING, "Unsupported offset type"); |
|||
} |
|||
|
|||
if (value->raw) { |
|||
RETVAL_ZVAL(value->raw, 1, 0); |
|||
} else { |
|||
RETVAL_ZVAL(value->value, 1, 0); |
|||
} |
|||
} |
|||
|
|||
PHP_METHOD(Pimple, extend) |
|||
{ |
|||
zval *offset = NULL, *callable = NULL, *pimple_closure_obj = NULL; |
|||
pimple_bucket_value bucket = {0}, *value = NULL; |
|||
pimple_object *pobj = NULL; |
|||
pimple_closure_object *pcobj = NULL; |
|||
ulong index; |
|||
|
|||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &offset, &callable) == FAILURE) { |
|||
return; |
|||
} |
|||
|
|||
pobj = zend_object_store_get_object(getThis() TSRMLS_CC); |
|||
|
|||
switch (Z_TYPE_P(offset)) { |
|||
case IS_STRING: |
|||
if (zend_symtable_find(&pobj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void *)&value) == FAILURE) { |
|||
zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Identifier \"%s\" is not defined.", Z_STRVAL_P(offset)); |
|||
RETURN_NULL(); |
|||
} |
|||
if (value->type != PIMPLE_IS_SERVICE) { |
|||
zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Identifier \"%s\" does not contain an object definition.", Z_STRVAL_P(offset)); |
|||
RETURN_NULL(); |
|||
} |
|||
break; |
|||
case IS_DOUBLE: |
|||
case IS_BOOL: |
|||
case IS_LONG: |
|||
if (Z_TYPE_P(offset) == IS_DOUBLE) { |
|||
index = (ulong)Z_DVAL_P(offset); |
|||
} else { |
|||
index = Z_LVAL_P(offset); |
|||
} |
|||
if (zend_hash_index_find(&pobj->values, index, (void *)&value) == FAILURE) { |
|||
zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Identifier \"%ld\" is not defined.", index); |
|||
RETURN_NULL(); |
|||
} |
|||
if (value->type != PIMPLE_IS_SERVICE) { |
|||
zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Identifier \"%ld\" does not contain an object definition.", index); |
|||
RETURN_NULL(); |
|||
} |
|||
break; |
|||
case IS_NULL: |
|||
default: |
|||
zend_error(E_WARNING, "Unsupported offset type"); |
|||
} |
|||
|
|||
if (pimple_zval_is_valid_callback(callable, &bucket TSRMLS_CC) == FAILURE) { |
|||
pimple_free_bucket(&bucket); |
|||
zend_throw_exception(spl_ce_InvalidArgumentException, "Extension service definition is not a Closure or invokable object.", 0 TSRMLS_CC); |
|||
RETURN_NULL(); |
|||
} |
|||
pimple_free_bucket(&bucket); |
|||
|
|||
ALLOC_INIT_ZVAL(pimple_closure_obj); |
|||
object_init_ex(pimple_closure_obj, pimple_closure_ce); |
|||
|
|||
pcobj = zend_object_store_get_object(pimple_closure_obj TSRMLS_CC); |
|||
pcobj->callable = callable; |
|||
pcobj->factory = value->value; |
|||
Z_ADDREF_P(callable); |
|||
Z_ADDREF_P(value->value); |
|||
|
|||
if (zend_hash_index_exists(&pobj->factories, value->handle_num)) { |
|||
pimple_zval_to_pimpleval(pimple_closure_obj, &bucket TSRMLS_CC); |
|||
zend_hash_index_del(&pobj->factories, value->handle_num); |
|||
zend_hash_index_update(&pobj->factories, bucket.handle_num, (void *)&bucket, sizeof(pimple_bucket_value), NULL); |
|||
Z_ADDREF_P(pimple_closure_obj); |
|||
} |
|||
|
|||
pimple_object_write_dimension(getThis(), offset, pimple_closure_obj TSRMLS_CC); |
|||
|
|||
RETVAL_ZVAL(pimple_closure_obj, 1, 1); |
|||
} |
|||
|
|||
PHP_METHOD(Pimple, keys) |
|||
{ |
|||
HashPosition pos; |
|||
pimple_object *pobj = NULL; |
|||
zval **value = NULL; |
|||
zval *endval = NULL; |
|||
char *str_index = NULL; |
|||
int str_len; |
|||
ulong num_index; |
|||
|
|||
if (zend_parse_parameters_none() == FAILURE) { |
|||
return; |
|||
} |
|||
|
|||
pobj = zend_object_store_get_object(getThis() TSRMLS_CC); |
|||
array_init_size(return_value, zend_hash_num_elements(&pobj->values)); |
|||
|
|||
zend_hash_internal_pointer_reset_ex(&pobj->values, &pos); |
|||
|
|||
while(zend_hash_get_current_data_ex(&pobj->values, (void **)&value, &pos) == SUCCESS) { |
|||
MAKE_STD_ZVAL(endval); |
|||
switch (zend_hash_get_current_key_ex(&pobj->values, &str_index, (uint *)&str_len, &num_index, 0, &pos)) { |
|||
case HASH_KEY_IS_STRING: |
|||
ZVAL_STRINGL(endval, str_index, str_len - 1, 1); |
|||
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &endval, sizeof(zval *), NULL); |
|||
break; |
|||
case HASH_KEY_IS_LONG: |
|||
ZVAL_LONG(endval, num_index); |
|||
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &endval, sizeof(zval *), NULL); |
|||
break; |
|||
} |
|||
zend_hash_move_forward_ex(&pobj->values, &pos); |
|||
} |
|||
} |
|||
|
|||
PHP_METHOD(Pimple, factory) |
|||
{ |
|||
zval *factory = NULL; |
|||
pimple_object *pobj = NULL; |
|||
pimple_bucket_value bucket = {0}; |
|||
|
|||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &factory) == FAILURE) { |
|||
return; |
|||
} |
|||
|
|||
if (pimple_zval_is_valid_callback(factory, &bucket TSRMLS_CC) == FAILURE) { |
|||
pimple_free_bucket(&bucket); |
|||
zend_throw_exception(spl_ce_InvalidArgumentException, "Service definition is not a Closure or invokable object.", 0 TSRMLS_CC); |
|||
return; |
|||
} |
|||
|
|||
pimple_zval_to_pimpleval(factory, &bucket TSRMLS_CC); |
|||
pobj = (pimple_object *)zend_object_store_get_object(getThis() TSRMLS_CC); |
|||
|
|||
if (zend_hash_index_update(&pobj->factories, bucket.handle_num, (void *)&bucket, sizeof(pimple_bucket_value), NULL) == SUCCESS) { |
|||
Z_ADDREF_P(factory); |
|||
RETURN_ZVAL(factory, 1 , 0); |
|||
} else { |
|||
pimple_free_bucket(&bucket); |
|||
} |
|||
|
|||
RETURN_FALSE; |
|||
} |
|||
|
|||
PHP_METHOD(Pimple, offsetSet) |
|||
{ |
|||
zval *offset = NULL, *value = NULL; |
|||
|
|||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &offset, &value) == FAILURE) { |
|||
return; |
|||
} |
|||
|
|||
pimple_object_write_dimension(getThis(), offset, value TSRMLS_CC); |
|||
} |
|||
|
|||
PHP_METHOD(Pimple, offsetGet) |
|||
{ |
|||
zval *offset = NULL, *retval = NULL; |
|||
|
|||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &offset) == FAILURE) { |
|||
return; |
|||
} |
|||
|
|||
retval = pimple_object_read_dimension(getThis(), offset, 0 TSRMLS_CC); |
|||
|
|||
RETVAL_ZVAL(retval, 1, 0); |
|||
} |
|||
|
|||
PHP_METHOD(Pimple, offsetUnset) |
|||
{ |
|||
zval *offset = NULL; |
|||
|
|||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &offset) == FAILURE) { |
|||
return; |
|||
} |
|||
|
|||
pimple_object_unset_dimension(getThis(), offset TSRMLS_CC); |
|||
} |
|||
|
|||
PHP_METHOD(Pimple, offsetExists) |
|||
{ |
|||
zval *offset = NULL; |
|||
|
|||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &offset) == FAILURE) { |
|||
return; |
|||
} |
|||
|
|||
RETVAL_BOOL(pimple_object_has_dimension(getThis(), offset, 1 TSRMLS_CC)); |
|||
} |
|||
|
|||
PHP_METHOD(Pimple, register) |
|||
{ |
|||
zval *provider; |
|||
zval **data; |
|||
zval *retval = NULL; |
|||
zval key; |
|||
|
|||
HashTable *array = NULL; |
|||
HashPosition pos; |
|||
|
|||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|h", &provider, pimple_serviceprovider_ce, &array) == FAILURE) { |
|||
return; |
|||
} |
|||
|
|||
RETVAL_ZVAL(getThis(), 1, 0); |
|||
|
|||
zend_call_method_with_1_params(&provider, Z_OBJCE_P(provider), NULL, "register", &retval, getThis()); |
|||
|
|||
if (retval) { |
|||
zval_ptr_dtor(&retval); |
|||
} |
|||
|
|||
if (!array) { |
|||
return; |
|||
} |
|||
|
|||
zend_hash_internal_pointer_reset_ex(array, &pos); |
|||
|
|||
while(zend_hash_get_current_data_ex(array, (void **)&data, &pos) == SUCCESS) { |
|||
zend_hash_get_current_key_zval_ex(array, &key, &pos); |
|||
pimple_object_write_dimension(getThis(), &key, *data TSRMLS_CC); |
|||
zend_hash_move_forward_ex(array, &pos); |
|||
} |
|||
} |
|||
|
|||
PHP_METHOD(Pimple, __construct) |
|||
{ |
|||
zval *values = NULL, **pData = NULL, offset; |
|||
HashPosition pos; |
|||
char *str_index = NULL; |
|||
zend_uint str_length; |
|||
ulong num_index; |
|||
|
|||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!", &values) == FAILURE || !values) { |
|||
return; |
|||
} |
|||
|
|||
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos); |
|||
while (zend_hash_has_more_elements_ex(Z_ARRVAL_P(values), &pos) == SUCCESS) { |
|||
zend_hash_get_current_data_ex(Z_ARRVAL_P(values), (void **)&pData, &pos); |
|||
zend_hash_get_current_key_ex(Z_ARRVAL_P(values), &str_index, &str_length, &num_index, 0, &pos); |
|||
INIT_ZVAL(offset); |
|||
if (zend_hash_get_current_key_type_ex(Z_ARRVAL_P(values), &pos) == HASH_KEY_IS_LONG) { |
|||
ZVAL_LONG(&offset, num_index); |
|||
} else { |
|||
ZVAL_STRINGL(&offset, str_index, (str_length - 1), 0); |
|||
} |
|||
pimple_object_write_dimension(getThis(), &offset, *pData TSRMLS_CC); |
|||
zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos); |
|||
} |
|||
} |
|||
|
|||
/* |
|||
* This is PHP code snippet handling extend()s calls : |
|||
|
|||
$extended = function ($c) use ($callable, $factory) { |
|||
return $callable($factory($c), $c); |
|||
}; |
|||
|
|||
*/ |
|||
PHP_METHOD(PimpleClosure, invoker) |
|||
{ |
|||
pimple_closure_object *pcobj = NULL; |
|||
zval *arg = NULL, *retval = NULL, *newretval = NULL; |
|||
zend_fcall_info fci = {0}; |
|||
zval **args[2]; |
|||
|
|||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &arg) == FAILURE) { |
|||
return; |
|||
} |
|||
|
|||
pcobj = zend_object_store_get_object(getThis() TSRMLS_CC); |
|||
|
|||
fci.function_name = pcobj->factory; |
|||
args[0] = &arg; |
|||
zend_fcall_info_argp(&fci TSRMLS_CC, 1, args); |
|||
fci.retval_ptr_ptr = &retval; |
|||
fci.size = sizeof(fci); |
|||
|
|||
if (zend_call_function(&fci, NULL TSRMLS_CC) == FAILURE || EG(exception)) { |
|||
efree(fci.params); |
|||
return; /* Should here return default zval */ |
|||
} |
|||
|
|||
efree(fci.params); |
|||
memset(&fci, 0, sizeof(fci)); |
|||
fci.size = sizeof(fci); |
|||
|
|||
fci.function_name = pcobj->callable; |
|||
args[0] = &retval; |
|||
args[1] = &arg; |
|||
zend_fcall_info_argp(&fci TSRMLS_CC, 2, args); |
|||
fci.retval_ptr_ptr = &newretval; |
|||
|
|||
if (zend_call_function(&fci, NULL TSRMLS_CC) == FAILURE || EG(exception)) { |
|||
efree(fci.params); |
|||
zval_ptr_dtor(&retval); |
|||
return; |
|||
} |
|||
|
|||
efree(fci.params); |
|||
zval_ptr_dtor(&retval); |
|||
|
|||
RETVAL_ZVAL(newretval, 1 ,1); |
|||
} |
|||
|
|||
PHP_MINIT_FUNCTION(pimple) |
|||
{ |
|||
zend_class_entry tmp_pimple_ce, tmp_pimple_closure_ce, tmp_pimple_serviceprovider_iface_ce; |
|||
INIT_NS_CLASS_ENTRY(tmp_pimple_ce, PIMPLE_NS, "Container", pimple_ce_functions); |
|||
INIT_NS_CLASS_ENTRY(tmp_pimple_closure_ce, PIMPLE_NS, "ContainerClosure", NULL); |
|||
INIT_NS_CLASS_ENTRY(tmp_pimple_serviceprovider_iface_ce, PIMPLE_NS, "ServiceProviderInterface", pimple_serviceprovider_iface_ce_functions); |
|||
|
|||
tmp_pimple_ce.create_object = pimple_object_create; |
|||
tmp_pimple_closure_ce.create_object = pimple_closure_object_create; |
|||
|
|||
pimple_ce = zend_register_internal_class(&tmp_pimple_ce TSRMLS_CC); |
|||
zend_class_implements(pimple_ce TSRMLS_CC, 1, zend_ce_arrayaccess); |
|||
|
|||
pimple_closure_ce = zend_register_internal_class(&tmp_pimple_closure_ce TSRMLS_CC); |
|||
pimple_closure_ce->ce_flags |= ZEND_ACC_FINAL_CLASS; |
|||
|
|||
pimple_serviceprovider_ce = zend_register_internal_interface(&tmp_pimple_serviceprovider_iface_ce TSRMLS_CC); |
|||
|
|||
memcpy(&pimple_closure_object_handlers, zend_get_std_object_handlers(), sizeof(*zend_get_std_object_handlers())); |
|||
pimple_object_handlers = std_object_handlers; |
|||
pimple_closure_object_handlers.get_closure = pimple_closure_get_closure; |
|||
|
|||
pimple_closure_invoker_function.function_name = "Pimple closure internal invoker"; |
|||
pimple_closure_invoker_function.fn_flags |= ZEND_ACC_CLOSURE; |
|||
pimple_closure_invoker_function.handler = ZEND_MN(PimpleClosure_invoker); |
|||
pimple_closure_invoker_function.num_args = 1; |
|||
pimple_closure_invoker_function.required_num_args = 1; |
|||
pimple_closure_invoker_function.scope = pimple_closure_ce; |
|||
pimple_closure_invoker_function.type = ZEND_INTERNAL_FUNCTION; |
|||
pimple_closure_invoker_function.module = &pimple_module_entry; |
|||
|
|||
return SUCCESS; |
|||
} |
|||
|
|||
PHP_MINFO_FUNCTION(pimple) |
|||
{ |
|||
php_info_print_table_start(); |
|||
php_info_print_table_header(2, "SensioLabs Pimple C support", "enabled"); |
|||
php_info_print_table_row(2, "Pimple supported version", PIMPLE_VERSION); |
|||
php_info_print_table_end(); |
|||
|
|||
php_info_print_box_start(0); |
|||
php_write((void *)ZEND_STRL("SensioLabs Pimple C support developed by Julien Pauli") TSRMLS_CC); |
|||
if (!sapi_module.phpinfo_as_text) { |
|||
php_write((void *)ZEND_STRL(sensiolabs_logo) TSRMLS_CC); |
|||
} |
|||
php_info_print_box_end(); |
|||
} |
|||
|
|||
zend_module_entry pimple_module_entry = { |
|||
STANDARD_MODULE_HEADER, |
|||
"pimple", |
|||
NULL, |
|||
PHP_MINIT(pimple), |
|||
NULL, |
|||
NULL, |
|||
NULL, |
|||
PHP_MINFO(pimple), |
|||
PIMPLE_VERSION, |
|||
STANDARD_MODULE_PROPERTIES |
|||
}; |
|||
|
|||
#ifdef COMPILE_DL_PIMPLE |
|||
ZEND_GET_MODULE(pimple) |
|||
#endif |
@ -0,0 +1,81 @@ |
|||
|
|||
/* |
|||
* This file is part of Pimple. |
|||
* |
|||
* Copyright (c) 2014 Fabien Potencier |
|||
* |
|||
* Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
* of this software and associated documentation files (the "Software"), to deal |
|||
* in the Software without restriction, including without limitation the rights |
|||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
* copies of the Software, and to permit persons to whom the Software is furnished |
|||
* to do so, subject to the following conditions: |
|||
* |
|||
* The above copyright notice and this permission notice shall be included in all |
|||
* copies or substantial portions of the Software. |
|||
* |
|||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
* THE SOFTWARE. |
|||
*/ |
|||
|
|||
#ifndef PIMPLE_COMPAT_H_ |
|||
#define PIMPLE_COMPAT_H_ |
|||
|
|||
#include "Zend/zend_extensions.h" /* for ZEND_EXTENSION_API_NO */ |
|||
|
|||
#define PHP_5_0_X_API_NO 220040412 |
|||
#define PHP_5_1_X_API_NO 220051025 |
|||
#define PHP_5_2_X_API_NO 220060519 |
|||
#define PHP_5_3_X_API_NO 220090626 |
|||
#define PHP_5_4_X_API_NO 220100525 |
|||
#define PHP_5_5_X_API_NO 220121212 |
|||
#define PHP_5_6_X_API_NO 220131226 |
|||
|
|||
#define IS_PHP_56 ZEND_EXTENSION_API_NO == PHP_5_6_X_API_NO |
|||
#define IS_AT_LEAST_PHP_56 ZEND_EXTENSION_API_NO >= PHP_5_6_X_API_NO |
|||
|
|||
#define IS_PHP_55 ZEND_EXTENSION_API_NO == PHP_5_5_X_API_NO |
|||
#define IS_AT_LEAST_PHP_55 ZEND_EXTENSION_API_NO >= PHP_5_5_X_API_NO |
|||
|
|||
#define IS_PHP_54 ZEND_EXTENSION_API_NO == PHP_5_4_X_API_NO |
|||
#define IS_AT_LEAST_PHP_54 ZEND_EXTENSION_API_NO >= PHP_5_4_X_API_NO |
|||
|
|||
#define IS_PHP_53 ZEND_EXTENSION_API_NO == PHP_5_3_X_API_NO |
|||
#define IS_AT_LEAST_PHP_53 ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO |
|||
|
|||
#if IS_PHP_53 |
|||
#define object_properties_init(obj, ce) do { \ |
|||
zend_hash_copy(obj->properties, &ce->default_properties, zval_copy_property_ctor(ce), NULL, sizeof(zval *)); \ |
|||
} while (0); |
|||
#endif |
|||
|
|||
#define ZEND_OBJ_INIT(obj, ce) do { \ |
|||
zend_object_std_init(obj, ce TSRMLS_CC); \ |
|||
object_properties_init((obj), (ce)); \ |
|||
} while(0); |
|||
|
|||
#if IS_PHP_53 || IS_PHP_54 |
|||
static void zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, HashPosition *pos) { |
|||
Bucket *p; |
|||
|
|||
p = pos ? (*pos) : ht->pInternalPointer; |
|||
|
|||
if (!p) { |
|||
Z_TYPE_P(key) = IS_NULL; |
|||
} else if (p->nKeyLength) { |
|||
Z_TYPE_P(key) = IS_STRING; |
|||
Z_STRVAL_P(key) = estrndup(p->arKey, p->nKeyLength - 1); |
|||
Z_STRLEN_P(key) = p->nKeyLength - 1; |
|||
} else { |
|||
Z_TYPE_P(key) = IS_LONG; |
|||
Z_LVAL_P(key) = p->h; |
|||
} |
|||
} |
|||
#endif |
|||
|
|||
#endif /* PIMPLE_COMPAT_H_ */ |
@ -0,0 +1,45 @@ |
|||
--TEST-- |
|||
Test for read_dim/write_dim handlers |
|||
--SKIPIF-- |
|||
<?php if (!extension_loaded("pimple")) print "skip"; ?> |
|||
--FILE-- |
|||
<?php |
|||
$p = new Pimple\Container(); |
|||
$p[42] = 'foo'; |
|||
$p['foo'] = 42; |
|||
|
|||
echo $p[42]; |
|||
echo "\n"; |
|||
echo $p['foo']; |
|||
echo "\n"; |
|||
try { |
|||
var_dump($p['nonexistant']); |
|||
echo "Exception excpected"; |
|||
} catch (InvalidArgumentException $e) { } |
|||
|
|||
$p[54.2] = 'foo2'; |
|||
echo $p[54]; |
|||
echo "\n"; |
|||
$p[242.99] = 'foo99'; |
|||
echo $p[242]; |
|||
|
|||
echo "\n"; |
|||
|
|||
$p[5] = 'bar'; |
|||
$p[5] = 'baz'; |
|||
echo $p[5]; |
|||
|
|||
echo "\n"; |
|||
|
|||
$p['str'] = 'str'; |
|||
$p['str'] = 'strstr'; |
|||
echo $p['str']; |
|||
?> |
|||
|
|||
--EXPECTF-- |
|||
foo |
|||
42 |
|||
foo2 |
|||
foo99 |
|||
baz |
|||
strstr |
Some files were not shown because too many files changed in this diff
Write
Preview
Loading…
Cancel
Save
Reference in new issue