diff options
Diffstat (limited to 'admportal')
271 files changed, 33111 insertions, 0 deletions
diff --git a/admportal/.gitignore b/admportal/.gitignore new file mode 100644 index 00000000..1b8a6ba9 --- /dev/null +++ b/admportal/.gitignore @@ -0,0 +1,12 @@ +org.eclipse.core.resources.prefs +.classpath
+.project
+.settings
+.idea
+.externalToolBuilders
+maven-eclipse.xml
+*.class
+target/
+MANIFEST.MF
+.DS_STORE
+.metadata
diff --git a/admportal/README b/admportal/README new file mode 100644 index 00000000..5712b36d --- /dev/null +++ b/admportal/README @@ -0,0 +1,52 @@ +5.0.1 Initial Build for 1512 + +10/29/2015 +MR 36,39 + +11/12/2015 +MR: SDNGC-84 Handle BGP block correctly + +11/18/2015 +5.0.3 +MR: SDNGC-145 error with loading uCPE reference data files +MR: SDNGC=153 + +11/19/2015 +5.0.4 +MR: SDNGC-154 change ack namespaces for instar request + +1/5/2016 +6.0.1 +MR: SDNGC-323 changes to reflect CSI namespace changes + +1/7/2016 +6.0.2 +MR: SDNGC-339 + +1/19/2016 +MR: SDNGC-394 add as-override and secondary-asn to AVPN BGP params + +1/20/2016 +MR: SDNGC-404 send response back to CSI before sending request to SDNC + +1/27/2016 +MR: SDNGC-463 UCPE Reference Data Change for ucpenminterfaces_MMDDYYYY file + +2/15/2016 +MR: SDNGC-489 Add multicast parameters + +2/29/2016 +MR: SDNGC-690 AdmPortal protocol changes for 1604 + +3/22/2016 +MR: SDNGC-909 instar.js handling CSI namespace changes + +5/4/2016 +MR: SDNGC-1386 Fix multicast indicator checking + +5/19/2016 +MR: SDNGC-1522 CSI format changes in 16.07 for instar CDN + +5/23/2016 +MR: SDNGC-1531 More CSI format fixes + diff --git a/admportal/certs/README b/admportal/certs/README new file mode 100644 index 00000000..4ac10fc3 --- /dev/null +++ b/admportal/certs/README @@ -0,0 +1 @@ +SSL certs are stored in this directory diff --git a/admportal/config/admportal.json b/admportal/config/admportal.json new file mode 100644 index 00000000..830b7629 --- /dev/null +++ b/admportal/config/admportal.json @@ -0,0 +1,68 @@ +{ + "MainMenu": "gamma", + "dbConnLimit": "100", + "home": "/opt/admportal", + "sslEnabled": "false", + "nonSslPort": "8843", + "ConexusNetworkPort": "8443", + "AppNetworkPort": "8543", + "clusterPort": "8443", + "serviceHomingServiceType": "SDN-ETHERNET-INTERNET", + "passwordKey": "QtfJMKggVk", + "preloadImportDirectory": "C:/data/csv", + "clusterPrefixURL": "/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-", + "clusterMidURL": "-shard-", + "clusterSuffixURL": "-config,type=DistributedConfigDatastore", + "shards": [ + "default", + "inventory", + "topology" + ], + "dbFabric": "false", + "ip-addresses": { + "lo": "127.0.0.1", + "eth0": "127.0.0.1", + "docker0": "172.17.0.1", + "virbr0": "192.168.122.1" + }, + "svclogicPropertiesDb01": "/opt/openecomp/sdnc/data/properties/svclogic.properties.sdnctldb01", + "databases": [ + "dbhost|sdnctldb01" + ], + "dbFabricServer": "localhost", + "dbFabricPort": "32275", + "dbFabricGroupId": "hagroup1", + "dbFabricUser": "admin", + "dbFabricPassword": "admin", + "dbFabricDB": "mysql", + "dbUser": "sdnctl", + "dbPassword": "gamma", + "dbName": "sdnctl", + "odlProtocol": "http", + "odlHost": "sdnhost", + "odlConexusHost": "sdnhost", + "odlPort": "8181", + "odlConexusPort": "8181", + "odlUser": "admin", + "odlPasswd": "admin", + "ConexusNetwork_sslCert": "", + "ConexusNetwork_sslKey": "", + "AppNetwork_sslCert": "", + "AppNetwork_sslKey": "", + "hostnameList": [ + { + "hname": "localhost" + } + ], + "shard_list": [ + { + "shard_name": "default" + }, + { + "shard_name": "inventory" + }, + { + "shard_name": "topology" + } + ] +} diff --git a/admportal/config/admportal.log4js.json b/admportal/config/admportal.log4js.json new file mode 100644 index 00000000..1dcb699e --- /dev/null +++ b/admportal/config/admportal.log4js.json @@ -0,0 +1,154 @@ +{ + "appenders": [ + { + "category": "accesslog", + "type" : "dateFile", + "absolute": true, + "filename": "/opt/admportal/logs/accesslog.rp", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "usertrace", + "type" : "file", + "absolute" : true, + "filename" : "/opt/admportal/logs/usertrace.log" + }, + { + "category": "tracelog", + "type" : "dateFile", + "absolute": true, + "filename": "/opt/admportal/logs/tracelog.log", + "pattern": "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "eipam", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/eipam.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "instar", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/instar.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "app", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/app.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "csp", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/csp.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "db", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/db.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "admin", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/admin.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "resalloc", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/resalloc.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "logs", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/applogs.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "sla", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/sla.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "gamma", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/gamma.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "odl", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/odl.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "mobility", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/mobility.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "ucpe", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/ucpe.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "user", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/user.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + } + ] +} diff --git a/admportal/config/svclogic.properties b/admportal/config/svclogic.properties new file mode 100644 index 00000000..f0cc841b --- /dev/null +++ b/admportal/config/svclogic.properties @@ -0,0 +1,5 @@ +org.openecomp.sdnctl.sli.dbtype = jdbc
+org.openecomp.sdnctl.sli.jdbc.url = jdbc:mysql://sdnctldb01:3306/sdnctl
+org.openecomp.sdnctl.sli.jdbc.database = sdnctl
+org.openecomp.sdnctl.sli.jdbc.user = sdnctl
+org.openecomp.sdnctl.sli.jdbc.password = gamma
diff --git a/admportal/config/svclogic.properties.sdnctldb01 b/admportal/config/svclogic.properties.sdnctldb01 new file mode 100644 index 00000000..f0cc841b --- /dev/null +++ b/admportal/config/svclogic.properties.sdnctldb01 @@ -0,0 +1,5 @@ +org.openecomp.sdnctl.sli.dbtype = jdbc
+org.openecomp.sdnctl.sli.jdbc.url = jdbc:mysql://sdnctldb01:3306/sdnctl
+org.openecomp.sdnctl.sli.jdbc.database = sdnctl
+org.openecomp.sdnctl.sli.jdbc.user = sdnctl
+org.openecomp.sdnctl.sli.jdbc.password = gamma
diff --git a/admportal/config/svclogic.properties.sdnctldb02 b/admportal/config/svclogic.properties.sdnctldb02 new file mode 100644 index 00000000..c2b48ecc --- /dev/null +++ b/admportal/config/svclogic.properties.sdnctldb02 @@ -0,0 +1,5 @@ +org.openecomp.sdnctl.sli.dbtype = jdbc
+org.openecomp.sdnctl.sli.jdbc.url = jdbc:mysql://sdnctldb02:3306/sdnctl
+org.openecomp.sdnctl.sli.jdbc.database = sdnctl
+org.openecomp.sdnctl.sli.jdbc.user = sdnctl
+org.openecomp.sdnctl.sli.jdbc.password = gamma
diff --git a/admportal/lib/CSPCheck.java b/admportal/lib/CSPCheck.java new file mode 100644 index 00000000..dac1d886 --- /dev/null +++ b/admportal/lib/CSPCheck.java @@ -0,0 +1,27 @@ +import esGateKeeper.*; +import java.util.*; +import java.io.*; +import java.net.*; +public class CSPCheck{ + +public static void main(String[] args){ + try{ + String attuid = ""; + if(args != null && args.length == 2){ + String secCookie = args[0]; + //validationEnv can be DEVL or PROD + String validationEnv=args[1]; + String retString = esGateKeeper.esGateKeeper(secCookie, "CSP", validationEnv, -5, "/tmp/"); + if(retString != null){ + String[] dataArr = retString.split("\\|"); + attuid= dataArr[5]; + + } + System.out.print("{" + "\"attuid\" : \"" + attuid + "\"}"); + } + }catch(Exception e){ + System.out.print("{" + "\"attuid\" : \"ERROR\"}"); + } +} +} + diff --git a/admportal/lib/GLCookieDecryption.jar b/admportal/lib/GLCookieDecryption.jar Binary files differnew file mode 100644 index 00000000..aa3d0593 --- /dev/null +++ b/admportal/lib/GLCookieDecryption.jar diff --git a/admportal/lib/Helloworld.java b/admportal/lib/Helloworld.java new file mode 100644 index 00000000..daf47415 --- /dev/null +++ b/admportal/lib/Helloworld.java @@ -0,0 +1,7 @@ +public class Helloworld{ + +public static void main(String[] args){ + System.out.println("hello world"); + } +} + diff --git a/admportal/lib/ST4-4.0.8.jar b/admportal/lib/ST4-4.0.8.jar Binary files differnew file mode 100644 index 00000000..144828ba --- /dev/null +++ b/admportal/lib/ST4-4.0.8.jar diff --git a/admportal/lib/antlr4-4.5.1.jar b/admportal/lib/antlr4-4.5.1.jar Binary files differnew file mode 100755 index 00000000..81039db1 --- /dev/null +++ b/admportal/lib/antlr4-4.5.1.jar diff --git a/admportal/lib/antlr4-runtime-4.5.1.jar b/admportal/lib/antlr4-runtime-4.5.1.jar Binary files differnew file mode 100755 index 00000000..7807292e --- /dev/null +++ b/admportal/lib/antlr4-runtime-4.5.1.jar diff --git a/admportal/lib/java-concurrent-hash-trie-map-0.2.23.jar b/admportal/lib/java-concurrent-hash-trie-map-0.2.23.jar Binary files differnew file mode 100644 index 00000000..2c019d09 --- /dev/null +++ b/admportal/lib/java-concurrent-hash-trie-map-0.2.23.jar diff --git a/admportal/lib/jsr305-2.0.3.jar b/admportal/lib/jsr305-2.0.3.jar Binary files differnew file mode 100644 index 00000000..cc39b738 --- /dev/null +++ b/admportal/lib/jsr305-2.0.3.jar diff --git a/admportal/lib/object-cache-api-0.6.3-Helium-SR1.jar b/admportal/lib/object-cache-api-0.6.3-Helium-SR1.jar Binary files differnew file mode 100644 index 00000000..e75db741 --- /dev/null +++ b/admportal/lib/object-cache-api-0.6.3-Helium-SR1.jar diff --git a/admportal/lib/org.abego.treelayout.core-1.0.1.jar b/admportal/lib/org.abego.treelayout.core-1.0.1.jar Binary files differnew file mode 100644 index 00000000..2350adcd --- /dev/null +++ b/admportal/lib/org.abego.treelayout.core-1.0.1.jar diff --git a/admportal/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar b/admportal/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar Binary files differnew file mode 100644 index 00000000..c152830e --- /dev/null +++ b/admportal/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar diff --git a/admportal/lib/util-0.6.3-Helium-SR1.jar b/admportal/lib/util-0.6.3-Helium-SR1.jar Binary files differnew file mode 100644 index 00000000..0f8ca621 --- /dev/null +++ b/admportal/lib/util-0.6.3-Helium-SR1.jar diff --git a/admportal/lib/yang-binding-0.6.3-Helium-SR1.jar b/admportal/lib/yang-binding-0.6.3-Helium-SR1.jar Binary files differnew file mode 100644 index 00000000..6adef241 --- /dev/null +++ b/admportal/lib/yang-binding-0.6.3-Helium-SR1.jar diff --git a/admportal/lib/yang-common-0.6.3-Helium-SR1.jar b/admportal/lib/yang-common-0.6.3-Helium-SR1.jar Binary files differnew file mode 100644 index 00000000..1fc5f9f7 --- /dev/null +++ b/admportal/lib/yang-common-0.6.3-Helium-SR1.jar diff --git a/admportal/package.json b/admportal/package.json new file mode 100644 index 00000000..e625ef22 --- /dev/null +++ b/admportal/package.json @@ -0,0 +1,35 @@ +{ + "name": "admportal", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www" + }, + "dependencies": { + "body-parser": "~1.8.1", + "bootstrap": "^3.3.6", + "bootstrap-submenu": "^2.0.3", + "bootstrap-table": "^1.9.1", + "cookie-parser": "~1.3.3", + "csv": "^0.4.1", + "csvtojson": "^0.5.3", + "dateformat": "^1.0.11", + "debug": "~2.0.0", + "ejs": "~0.8.5", + "express": "~4.9.0", + "express-session": "^1.10.1", + "fs.extra": "^1.3.2", + "lodash": "^3.8.0", + "moment": "^2.13.0", + "morgan": "~1.3.0", + "multer": "^1.1.0", + "mysql": "^2.5.4", + "node-uuid": "^1.4.7", + "path": "^0.12.7", + "properties-reader": "0.0.9", + "sax": "^0.6.1", + "serve-favicon": "~2.1.3", + "xml2js": "^0.4.5", + "dns-sync": "~0.1.3" + } +} diff --git a/admportal/pom.xml b/admportal/pom.xml new file mode 100644 index 00000000..2ce7ac02 --- /dev/null +++ b/admportal/pom.xml @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + <parent> + <groupId>org.openecomp.sdnc.oam</groupId> + <artifactId>sdnc-oam</artifactId> + <version>1.0.0</version> + </parent> + + <modelVersion>4.0.0</modelVersion> + <packaging>pom</packaging> + <groupId>org.openecomp.sdnc.oam</groupId> + <artifactId>admportal</artifactId> + + <version>1.0.0</version> + + <name>Admin Portal</name> + <description>Admin Portal</description> + + <properties> + <application.name>admportal</application.name> + <skip.SWM>true</skip.SWM> + <adm.base>/opt/app/admportal</adm.base> + <maven.build.timestamp.format>yyMMdd-HHmmss</maven.build.timestamp.format> + <build.number>${maven.build.timestamp}</build.number> + <SWM_VERSION>${project.version}-${build.number}</SWM_VERSION> + </properties> + + <dependencies> + <dependency> + <groupId>org.openecomp.sdnc.core</groupId> + <artifactId>sli-common</artifactId> + <version>${sdnctl.sli.version}</version> + </dependency> + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <version>5.1.31</version> + <type>jar</type> + <scope>compile</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <executions> + <execution> + <id>create-zip</id> + <goals> + <goal>single</goal> + </goals> + <phase>package</phase> + <configuration> + <finalName>${application.name}.${project.version}</finalName> + <attach>true</attach> + <descriptors> + <descriptor>src/assembly/assemble_zip.xml</descriptor> + </descriptors> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <executions> + <execution> + <id>copy-dependencies</id> + <goals> + <goal>copy-dependencies</goal> + </goals> + <phase>prepare-package</phase> + <configuration> + <transitive>false</transitive> + <outputDirectory>${project.build.directory}/lib</outputDirectory> + <overWriteReleases>false</overWriteReleases> + <overWriteSnapshots>true</overWriteSnapshots> + <overWriteIfNewer>true</overWriteIfNewer> + <useRepositoryLayout>false</useRepositoryLayout> + <addParentPoms>false</addParentPoms> + <copyPom>false</copyPom> + <scope>provided</scope> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + + <organization> + <name>AT&T</name> + </organization> +</project> + diff --git a/admportal/process.http.json b/admportal/process.http.json new file mode 100644 index 00000000..717f2bc1 --- /dev/null +++ b/admportal/process.http.json @@ -0,0 +1,17 @@ +{ + "apps" :[ + { + "name" : "http_admportal", + "script" : "/opt/admportal/bin/www", + "out_file" : "/opt/admportal/logs/http_admportal.log", + "error_file" : "/opt/admportal/logs/error_http_admportal.log", + "cwd" : "/opt/admportal", + "env": + { + "NODE_ENV": "production", + "HTTP_PROTOCOL": "http:", + "CLASSPATH" : "/opt/admportal/lib/GLCookieDecryption.jar:/opt/admportal/lib" + } + } + ] +} diff --git a/admportal/process.https.json b/admportal/process.https.json new file mode 100644 index 00000000..a9b5ae7c --- /dev/null +++ b/admportal/process.https.json @@ -0,0 +1,17 @@ +{ + "apps" :[ + { + "name" : "admportal8443", + "script" : "/opt/admportal/bin/wwwssl", + "out_file" : "/opt/admportal/logs/admportal8443.log", + "error_file" : "/opt/admportal/logs/error_admportal8443.log", + "cwd" : "/opt/admportal", + "env": + { + "NODE_ENV": "production", + "HTTP_PROTOCOL": "https:", + "CLASSPATH" : "/opt/admportal/lib/GLCookieDecryption.jar:/opt/admportal/lib" + } + } + ] +} diff --git a/admportal/public/fonts/glyphicons-halflings-regular.eot b/admportal/public/fonts/glyphicons-halflings-regular.eot Binary files differnew file mode 100644 index 00000000..b93a4953 --- /dev/null +++ b/admportal/public/fonts/glyphicons-halflings-regular.eot diff --git a/admportal/public/fonts/glyphicons-halflings-regular.svg b/admportal/public/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 00000000..94fb5490 --- /dev/null +++ b/admportal/public/fonts/glyphicons-halflings-regular.svg @@ -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>
\ No newline at end of file diff --git a/admportal/public/fonts/glyphicons-halflings-regular.ttf b/admportal/public/fonts/glyphicons-halflings-regular.ttf Binary files differnew file mode 100644 index 00000000..1413fc60 --- /dev/null +++ b/admportal/public/fonts/glyphicons-halflings-regular.ttf diff --git a/admportal/public/fonts/glyphicons-halflings-regular.woff b/admportal/public/fonts/glyphicons-halflings-regular.woff Binary files differnew file mode 100644 index 00000000..9e612858 --- /dev/null +++ b/admportal/public/fonts/glyphicons-halflings-regular.woff diff --git a/admportal/public/fonts/glyphicons-halflings-regular.woff2 b/admportal/public/fonts/glyphicons-halflings-regular.woff2 Binary files differnew file mode 100644 index 00000000..64539b54 --- /dev/null +++ b/admportal/public/fonts/glyphicons-halflings-regular.woff2 diff --git a/admportal/public/javascripts/admportal.js b/admportal/public/javascripts/admportal.js new file mode 100644 index 00000000..d73517da --- /dev/null +++ b/admportal/public/javascripts/admportal.js @@ -0,0 +1,79 @@ +function uploadFile(form) +{ + if ( form.filename.value.length == 0) + { + bootbox.alert('Must select a file.'); + return false; + } + else { form.submit(); return; } +} +function isDigit(num) +{ + // false means error + // true means success + //var dlNum = obj.value; + var charAllowed="0123456789"; + var thisChar; + var cnt = 0; + var blankCnt = 0; + if ( num.length > 0 ) + { + for (var i = 0; i < num.length; i++) + { + thisChar = num.substring(i, i+1); + if ( charAllowed.indexOf(thisChar) != -1 ) cnt++; + if ( num.substring(i, i + 1) == " " ) blankCnt++; + } + if ( cnt != num.length ){ + return false; + } + else if (blankCnt == num.length) { + return false; + } + return true; + } + else + return false; +} +function isFloat(num) +{ + // false means error + // true means success + //var dlNum = obj.value; + var charAllowed=".-0123456789"; + var thisChar; + var cnt = 0; + var blankCnt = 0; + if ( num.length > 0 ) + { + for (var i = 0; i < num.length; i++) + { + thisChar = num.substring(i, i+1); + if ( charAllowed.indexOf(thisChar) != -1 ) cnt++; + if ( num.substring(i, i + 1) == " " ) blankCnt++; + } + if ( cnt != num.length ){ + return false; + } + else if (blankCnt == num.length) { + return false; + } + return true; + } + else + return false; +} +function isblank(s) +{ + // true means all blank + // flase means not blank + for(var i=0; i<s.length; i++) { + var c = s.charAt(i); + if ( (c != ' ') && (c != '\n') && (c != '\t') ) return false; + } + return true; +} + +function padLeft(nr, n, str){ + return Array(n-String(nr).length+1).join(str||'0')+nr; +} diff --git a/admportal/public/javascripts/bootbox.min.js b/admportal/public/javascripts/bootbox.min.js new file mode 100644 index 00000000..0dc0cbd5 --- /dev/null +++ b/admportal/public/javascripts/bootbox.min.js @@ -0,0 +1,6 @@ +/** + * bootbox.js v4.4.0 + * + * http://bootboxjs.com/license.txt + */ +!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["jquery"],b):"object"==typeof exports?module.exports=b(require("jquery")):a.bootbox=b(a.jQuery)}(this,function a(b,c){"use strict";function d(a){var b=q[o.locale];return b?b[a]:q.en[a]}function e(a,c,d){a.stopPropagation(),a.preventDefault();var e=b.isFunction(d)&&d.call(c,a)===!1;e||c.modal("hide")}function f(a){var b,c=0;for(b in a)c++;return c}function g(a,c){var d=0;b.each(a,function(a,b){c(a,b,d++)})}function h(a){var c,d;if("object"!=typeof a)throw new Error("Please supply an object of options");if(!a.message)throw new Error("Please specify a message");return a=b.extend({},o,a),a.buttons||(a.buttons={}),c=a.buttons,d=f(c),g(c,function(a,e,f){if(b.isFunction(e)&&(e=c[a]={callback:e}),"object"!==b.type(e))throw new Error("button with key "+a+" must be an object");e.label||(e.label=a),e.className||(e.className=2>=d&&f===d-1?"btn-primary":"btn-default")}),a}function i(a,b){var c=a.length,d={};if(1>c||c>2)throw new Error("Invalid argument length");return 2===c||"string"==typeof a[0]?(d[b[0]]=a[0],d[b[1]]=a[1]):d=a[0],d}function j(a,c,d){return b.extend(!0,{},a,i(c,d))}function k(a,b,c,d){var e={className:"bootbox-"+a,buttons:l.apply(null,b)};return m(j(e,d,c),b)}function l(){for(var a={},b=0,c=arguments.length;c>b;b++){var e=arguments[b],f=e.toLowerCase(),g=e.toUpperCase();a[f]={label:d(g)}}return a}function m(a,b){var d={};return g(b,function(a,b){d[b]=!0}),g(a.buttons,function(a){if(d[a]===c)throw new Error("button key "+a+" is not allowed (options are "+b.join("\n")+")")}),a}var n={dialog:"<div class='bootbox modal' tabindex='-1' role='dialog'><div class='modal-dialog'><div class='modal-content'><div class='modal-body'><div class='bootbox-body'></div></div></div></div></div>",header:"<div class='modal-header'><h4 class='modal-title'></h4></div>",footer:"<div class='modal-footer'></div>",closeButton:"<button type='button' class='bootbox-close-button close' data-dismiss='modal' aria-hidden='true'>×</button>",form:"<form class='bootbox-form'></form>",inputs:{text:"<input class='bootbox-input bootbox-input-text form-control' autocomplete=off type=text />",textarea:"<textarea class='bootbox-input bootbox-input-textarea form-control'></textarea>",email:"<input class='bootbox-input bootbox-input-email form-control' autocomplete='off' type='email' />",select:"<select class='bootbox-input bootbox-input-select form-control'></select>",checkbox:"<div class='checkbox'><label><input class='bootbox-input bootbox-input-checkbox' type='checkbox' /></label></div>",date:"<input class='bootbox-input bootbox-input-date form-control' autocomplete=off type='date' />",time:"<input class='bootbox-input bootbox-input-time form-control' autocomplete=off type='time' />",number:"<input class='bootbox-input bootbox-input-number form-control' autocomplete=off type='number' />",password:"<input class='bootbox-input bootbox-input-password form-control' autocomplete='off' type='password' />"}},o={locale:"en",backdrop:"static",animate:!0,className:null,closeButton:!0,show:!0,container:"body"},p={};p.alert=function(){var a;if(a=k("alert",["ok"],["message","callback"],arguments),a.callback&&!b.isFunction(a.callback))throw new Error("alert requires callback property to be a function when provided");return a.buttons.ok.callback=a.onEscape=function(){return b.isFunction(a.callback)?a.callback.call(this):!0},p.dialog(a)},p.confirm=function(){var a;if(a=k("confirm",["cancel","confirm"],["message","callback"],arguments),a.buttons.cancel.callback=a.onEscape=function(){return a.callback.call(this,!1)},a.buttons.confirm.callback=function(){return a.callback.call(this,!0)},!b.isFunction(a.callback))throw new Error("confirm requires a callback");return p.dialog(a)},p.prompt=function(){var a,d,e,f,h,i,k;if(f=b(n.form),d={className:"bootbox-prompt",buttons:l("cancel","confirm"),value:"",inputType:"text"},a=m(j(d,arguments,["title","callback"]),["cancel","confirm"]),i=a.show===c?!0:a.show,a.message=f,a.buttons.cancel.callback=a.onEscape=function(){return a.callback.call(this,null)},a.buttons.confirm.callback=function(){var c;switch(a.inputType){case"text":case"textarea":case"email":case"select":case"date":case"time":case"number":case"password":c=h.val();break;case"checkbox":var d=h.find("input:checked");c=[],g(d,function(a,d){c.push(b(d).val())})}return a.callback.call(this,c)},a.show=!1,!a.title)throw new Error("prompt requires a title");if(!b.isFunction(a.callback))throw new Error("prompt requires a callback");if(!n.inputs[a.inputType])throw new Error("invalid prompt type");switch(h=b(n.inputs[a.inputType]),a.inputType){case"text":case"textarea":case"email":case"date":case"time":case"number":case"password":h.val(a.value);break;case"select":var o={};if(k=a.inputOptions||[],!b.isArray(k))throw new Error("Please pass an array of input options");if(!k.length)throw new Error("prompt with select requires options");g(k,function(a,d){var e=h;if(d.value===c||d.text===c)throw new Error("given options in wrong format");d.group&&(o[d.group]||(o[d.group]=b("<optgroup/>").attr("label",d.group)),e=o[d.group]),e.append("<option value='"+d.value+"'>"+d.text+"</option>")}),g(o,function(a,b){h.append(b)}),h.val(a.value);break;case"checkbox":var q=b.isArray(a.value)?a.value:[a.value];if(k=a.inputOptions||[],!k.length)throw new Error("prompt with checkbox requires options");if(!k[0].value||!k[0].text)throw new Error("given options in wrong format");h=b("<div/>"),g(k,function(c,d){var e=b(n.inputs[a.inputType]);e.find("input").attr("value",d.value),e.find("label").append(d.text),g(q,function(a,b){b===d.value&&e.find("input").prop("checked",!0)}),h.append(e)})}return a.placeholder&&h.attr("placeholder",a.placeholder),a.pattern&&h.attr("pattern",a.pattern),a.maxlength&&h.attr("maxlength",a.maxlength),f.append(h),f.on("submit",function(a){a.preventDefault(),a.stopPropagation(),e.find(".btn-primary").click()}),e=p.dialog(a),e.off("shown.bs.modal"),e.on("shown.bs.modal",function(){h.focus()}),i===!0&&e.modal("show"),e},p.dialog=function(a){a=h(a);var d=b(n.dialog),f=d.find(".modal-dialog"),i=d.find(".modal-body"),j=a.buttons,k="",l={onEscape:a.onEscape};if(b.fn.modal===c)throw new Error("$.fn.modal is not defined; please double check you have included the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ for more details.");if(g(j,function(a,b){k+="<button data-bb-handler='"+a+"' type='button' class='btn "+b.className+"'>"+b.label+"</button>",l[a]=b.callback}),i.find(".bootbox-body").html(a.message),a.animate===!0&&d.addClass("fade"),a.className&&d.addClass(a.className),"large"===a.size?f.addClass("modal-lg"):"small"===a.size&&f.addClass("modal-sm"),a.title&&i.before(n.header),a.closeButton){var m=b(n.closeButton);a.title?d.find(".modal-header").prepend(m):m.css("margin-top","-10px").prependTo(i)}return a.title&&d.find(".modal-title").html(a.title),k.length&&(i.after(n.footer),d.find(".modal-footer").html(k)),d.on("hidden.bs.modal",function(a){a.target===this&&d.remove()}),d.on("shown.bs.modal",function(){d.find(".btn-primary:first").focus()}),"static"!==a.backdrop&&d.on("click.dismiss.bs.modal",function(a){d.children(".modal-backdrop").length&&(a.currentTarget=d.children(".modal-backdrop").get(0)),a.target===a.currentTarget&&d.trigger("escape.close.bb")}),d.on("escape.close.bb",function(a){l.onEscape&&e(a,d,l.onEscape)}),d.on("click",".modal-footer button",function(a){var c=b(this).data("bb-handler");e(a,d,l[c])}),d.on("click",".bootbox-close-button",function(a){e(a,d,l.onEscape)}),d.on("keyup",function(a){27===a.which&&d.trigger("escape.close.bb")}),b(a.container).append(d),d.modal({backdrop:a.backdrop?"static":!1,keyboard:!1,show:!1}),a.show&&d.modal("show"),d},p.setDefaults=function(){var a={};2===arguments.length?a[arguments[0]]=arguments[1]:a=arguments[0],b.extend(o,a)},p.hideAll=function(){return b(".bootbox").modal("hide"),p};var q={bg_BG:{OK:"Ок",CANCEL:"Отказ",CONFIRM:"Потвърждавам"},br:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Sim"},cs:{OK:"OK",CANCEL:"Zrušit",CONFIRM:"Potvrdit"},da:{OK:"OK",CANCEL:"Annuller",CONFIRM:"Accepter"},de:{OK:"OK",CANCEL:"Abbrechen",CONFIRM:"Akzeptieren"},el:{OK:"Εντάξει",CANCEL:"Ακύρωση",CONFIRM:"Επιβεβαίωση"},en:{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"},es:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Aceptar"},et:{OK:"OK",CANCEL:"Katkesta",CONFIRM:"OK"},fa:{OK:"قبول",CANCEL:"لغو",CONFIRM:"تایید"},fi:{OK:"OK",CANCEL:"Peruuta",CONFIRM:"OK"},fr:{OK:"OK",CANCEL:"Annuler",CONFIRM:"D'accord"},he:{OK:"אישור",CANCEL:"ביטול",CONFIRM:"אישור"},hu:{OK:"OK",CANCEL:"Mégsem",CONFIRM:"Megerősít"},hr:{OK:"OK",CANCEL:"Odustani",CONFIRM:"Potvrdi"},id:{OK:"OK",CANCEL:"Batal",CONFIRM:"OK"},it:{OK:"OK",CANCEL:"Annulla",CONFIRM:"Conferma"},ja:{OK:"OK",CANCEL:"キャンセル",CONFIRM:"確認"},lt:{OK:"Gerai",CANCEL:"Atšaukti",CONFIRM:"Patvirtinti"},lv:{OK:"Labi",CANCEL:"Atcelt",CONFIRM:"Apstiprināt"},nl:{OK:"OK",CANCEL:"Annuleren",CONFIRM:"Accepteren"},no:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},pl:{OK:"OK",CANCEL:"Anuluj",CONFIRM:"Potwierdź"},pt:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Confirmar"},ru:{OK:"OK",CANCEL:"Отмена",CONFIRM:"Применить"},sq:{OK:"OK",CANCEL:"Anulo",CONFIRM:"Prano"},sv:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},th:{OK:"ตกลง",CANCEL:"ยกเลิก",CONFIRM:"ยืนยัน"},tr:{OK:"Tamam",CANCEL:"İptal",CONFIRM:"Onayla"},zh_CN:{OK:"OK",CANCEL:"取消",CONFIRM:"确认"},zh_TW:{OK:"OK",CANCEL:"取消",CONFIRM:"確認"}};return p.addLocale=function(a,c){return b.each(["OK","CANCEL","CONFIRM"],function(a,b){if(!c[b])throw new Error("Please supply a translation for '"+b+"'")}),q[a]={OK:c.OK,CANCEL:c.CANCEL,CONFIRM:c.CONFIRM},p},p.removeLocale=function(a){return delete q[a],p},p.setLocale=function(a){return p.setDefaults("locale",a)},p.init=function(c){return a(c||b)},p});
\ No newline at end of file diff --git a/admportal/public/javascripts/bootstrap-submenu.js b/admportal/public/javascripts/bootstrap-submenu.js new file mode 100644 index 00000000..7c8e411b --- /dev/null +++ b/admportal/public/javascripts/bootstrap-submenu.js @@ -0,0 +1,185 @@ +/*! + * Bootstrap-submenu v2.0.3 (https://vsn4ik.github.io/bootstrap-submenu/) + * Copyright 2015 Vasily A. (https://github.com/vsn4ik) + * Licensed under the MIT license + */ + +/** + * $.inArray: friends with IE8. Use Array.prototype.indexOf in future. + * $.proxy: friends with IE8. Use Function.prototype.bind in future. + */ + +'use strict'; + +(function(factory) { + if (typeof define == 'function' && define.amd) { + // AMD. Register as an anonymous module + define(['jquery'], factory); + } + else if (typeof exports == 'object') { + // Node/CommonJS + module.exports = factory(require('jquery')); + } + else { + // Browser globals + factory(jQuery); + } +})(function($) { + function Item(element) { + this.$element = $(element); + this.$menu = this.$element.closest('.dropdown-menu'); + this.$main = this.$menu.parent(); + this.$items = this.$menu.children('.dropdown-submenu'); + + this.init(); + } + + Item.prototype = { + init: function() { + this.$element.on('keydown', $.proxy(this, 'keydown')); + }, + close: function() { + this.$main.removeClass('open'); + this.$items.trigger('hide.bs.submenu'); + }, + keydown: function(event) { + // 27: Esc + + if (event.keyCode == 27) { + event.stopPropagation(); + + this.close(); + this.$main.children('a, button').trigger('focus'); + } + } + }; + + function SubmenuItem(element) { + this.$element = $(element); + this.$main = this.$element.parent(); + this.$menu = this.$main.children('.dropdown-menu'); + this.$subs = this.$main.siblings('.dropdown-submenu'); + this.$items = this.$menu.children('.dropdown-submenu'); + + this.init(); + } + + $.extend(SubmenuItem.prototype, Item.prototype, { + init: function() { + this.$element.on({ + click: $.proxy(this, 'click'), + keydown: $.proxy(this, 'keydown') + }); + + this.$main.on('hide.bs.submenu', $.proxy(this, 'hide')); + }, + click: function(event) { + // Fix a[href="#"]. For community + event.preventDefault(); + + event.stopPropagation(); + + this.toggle(); + }, + hide: function(event) { + // Stop event bubbling + event.stopPropagation(); + + this.close(); + }, + open: function() { + this.$main.addClass('open'); + this.$subs.trigger('hide.bs.submenu'); + }, + toggle: function() { + if (this.$main.hasClass('open')) { + this.close(); + } + else { + this.open(); + } + }, + keydown: function(event) { + // 13: Return, 32: Spacebar + + if (event.keyCode == 32) { + // Off vertical scrolling + event.preventDefault(); + } + + if ($.inArray(event.keyCode, [13, 32]) != -1) { + this.toggle(); + } + } + }); + + function Submenupicker(element) { + this.$element = $(element); + this.$main = this.$element.parent(); + this.$menu = this.$main.children('.dropdown-menu'); + this.$items = this.$menu.children('.dropdown-submenu'); + + this.init(); + } + + Submenupicker.prototype = { + init: function() { + this.$menu.off('keydown.bs.dropdown.data-api'); + this.$menu.on('keydown', $.proxy(this, 'itemKeydown')); + + this.$menu.find('li > a').each(function() { + new Item(this); + }); + + this.$menu.find('.dropdown-submenu > a').each(function() { + new SubmenuItem(this); + }); + + this.$main.on('hidden.bs.dropdown', $.proxy(this, 'hidden')); + }, + hidden: function() { + this.$items.trigger('hide.bs.submenu'); + }, + itemKeydown: function(event) { + // 38: Arrow up, 40: Arrow down + + if ($.inArray(event.keyCode, [38, 40]) != -1) { + // Off vertical scrolling + event.preventDefault(); + + event.stopPropagation(); + + var $items = this.$menu.find('li:not(.disabled):visible > a'); + var index = $items.index(event.target); + + if (event.keyCode == 38 && index !== 0) { + index--; + } + else if (event.keyCode == 40 && index !== $items.length - 1) { + index++; + } + else { + return; + } + + $items.eq(index).trigger('focus'); + } + } + }; + + // For AMD/Node/CommonJS used elements (optional) + // http://learn.jquery.com/jquery-ui/environments/amd/ + return $.fn.submenupicker = function(elements) { + var $elements = this instanceof $ ? this : $(elements); + + return $elements.each(function() { + var data = $.data(this, 'bs.submenu'); + + if (!data) { + data = new Submenupicker(this); + + $.data(this, 'bs.submenu', data); + } + }); + }; +}); diff --git a/admportal/public/javascripts/bootstrap-submenu.min.js b/admportal/public/javascripts/bootstrap-submenu.min.js new file mode 100644 index 00000000..6293c430 --- /dev/null +++ b/admportal/public/javascripts/bootstrap-submenu.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap-submenu v2.0.3 (https://vsn4ik.github.io/bootstrap-submenu/) + * Copyright 2015 Vasily A. (https://github.com/vsn4ik) + * Licensed under the MIT license + */ + +"use strict";!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){function b(b){this.$element=a(b),this.$menu=this.$element.closest(".dropdown-menu"),this.$main=this.$menu.parent(),this.$items=this.$menu.children(".dropdown-submenu"),this.init()}function c(b){this.$element=a(b),this.$main=this.$element.parent(),this.$menu=this.$main.children(".dropdown-menu"),this.$subs=this.$main.siblings(".dropdown-submenu"),this.$items=this.$menu.children(".dropdown-submenu"),this.init()}function d(b){this.$element=a(b),this.$main=this.$element.parent(),this.$menu=this.$main.children(".dropdown-menu"),this.$items=this.$menu.children(".dropdown-submenu"),this.init()}return b.prototype={init:function(){this.$element.on("keydown",a.proxy(this,"keydown"))},close:function(){this.$main.removeClass("open"),this.$items.trigger("hide.bs.submenu")},keydown:function(a){27==a.keyCode&&(a.stopPropagation(),this.close(),this.$main.children("a, button").trigger("focus"))}},a.extend(c.prototype,b.prototype,{init:function(){this.$element.on({click:a.proxy(this,"click"),keydown:a.proxy(this,"keydown")}),this.$main.on("hide.bs.submenu",a.proxy(this,"hide"))},click:function(a){a.preventDefault(),a.stopPropagation(),this.toggle()},hide:function(a){a.stopPropagation(),this.close()},open:function(){this.$main.addClass("open"),this.$subs.trigger("hide.bs.submenu")},toggle:function(){this.$main.hasClass("open")?this.close():this.open()},keydown:function(b){32==b.keyCode&&b.preventDefault(),-1!=a.inArray(b.keyCode,[13,32])&&this.toggle()}}),d.prototype={init:function(){this.$menu.off("keydown.bs.dropdown.data-api"),this.$menu.on("keydown",a.proxy(this,"itemKeydown")),this.$menu.find("li > a").each(function(){new b(this)}),this.$menu.find(".dropdown-submenu > a").each(function(){new c(this)}),this.$main.on("hidden.bs.dropdown",a.proxy(this,"hidden"))},hidden:function(){this.$items.trigger("hide.bs.submenu")},itemKeydown:function(b){if(-1!=a.inArray(b.keyCode,[38,40])){b.preventDefault(),b.stopPropagation();var c=this.$menu.find("li:not(.disabled):visible > a"),d=c.index(b.target);if(38==b.keyCode&&0!==d)d--;else{if(40!=b.keyCode||d===c.length-1)return;d++}c.eq(d).trigger("focus")}}},a.fn.submenupicker=function(b){var c=this instanceof a?this:a(b);return c.each(function(){var b=a.data(this,"bs.submenu");b||(b=new d(this),a.data(this,"bs.submenu",b))})}});
\ No newline at end of file diff --git a/admportal/public/javascripts/bootstrap-table.js b/admportal/public/javascripts/bootstrap-table.js new file mode 100644 index 00000000..f8715e9c --- /dev/null +++ b/admportal/public/javascripts/bootstrap-table.js @@ -0,0 +1,2690 @@ +/** + * @author zhixin wen <wenzhixin2010@gmail.com> + * version: 1.9.1 + * https://github.com/wenzhixin/bootstrap-table/ + */ + +!function ($) { + 'use strict'; + + // TOOLS DEFINITION + // ====================== + + var cachedWidth = null; + + // it only does '%s', and return '' when arguments are undefined + var sprintf = function (str) { + var args = arguments, + flag = true, + i = 1; + + str = str.replace(/%s/g, function () { + var arg = args[i++]; + + if (typeof arg === 'undefined') { + flag = false; + return ''; + } + return arg; + }); + return flag ? str : ''; + }; + + var getPropertyFromOther = function (list, from, to, value) { + var result = ''; + $.each(list, function (i, item) { + if (item[from] === value) { + result = item[to]; + return false; + } + return true; + }); + return result; + }; + + var getFieldIndex = function (columns, field) { + var index = -1; + + $.each(columns, function (i, column) { + if (column.field === field) { + index = i; + return false; + } + return true; + }); + return index; + }; + + // http://jsfiddle.net/wenyi/47nz7ez9/3/ + var setFieldIndex = function (columns) { + var i, j, k, + totalCol = 0, + flag = []; + + for (i = 0; i < columns[0].length; i++) { + totalCol += columns[0][i].colspan || 1; + } + + for (i = 0; i < columns.length; i++) { + flag[i] = []; + for (j = 0; j < totalCol; j++) { + flag[i][j] = false; + } + } + + for (i = 0; i < columns.length; i++) { + for (j = 0; j < columns[i].length; j++) { + var r = columns[i][j], + rowspan = r.rowspan || 1, + colspan = r.colspan || 1, + index = $.inArray(false, flag[i]); + + if (colspan === 1) { + r.fieldIndex = index; + // when field is undefined, use index instead + if (typeof r.field === 'undefined') { + r.field = index; + } + } + + for (k = 0; k < rowspan; k++) { + flag[i + k][index] = true; + } + for (k = 0; k < colspan; k++) { + flag[i][index + k] = true; + } + } + } + }; + + var getScrollBarWidth = function () { + if (cachedWidth === null) { + var inner = $('<p/>').addClass('fixed-table-scroll-inner'), + outer = $('<div/>').addClass('fixed-table-scroll-outer'), + w1, w2; + + outer.append(inner); + $('body').append(outer); + + w1 = inner[0].offsetWidth; + outer.css('overflow', 'scroll'); + w2 = inner[0].offsetWidth; + + if (w1 === w2) { + w2 = outer[0].clientWidth; + } + + outer.remove(); + cachedWidth = w1 - w2; + } + return cachedWidth; + }; + + var calculateObjectValue = function (self, name, args, defaultValue) { + var func = name; + + if (typeof name === 'string') { + // support obj.func1.func2 + var names = name.split('.'); + + if (names.length > 1) { + func = window; + $.each(names, function (i, f) { + func = func[f]; + }); + } else { + func = window[name]; + } + } + if (typeof func === 'object') { + return func; + } + if (typeof func === 'function') { + return func.apply(self, args); + } + if (!func && typeof name === 'string' && sprintf.apply(this, [name].concat(args))) { + return sprintf.apply(this, [name].concat(args)); + } + return defaultValue; + }; + + var compareObjects = function (objectA, objectB, compareLength) { + // Create arrays of property names + var objectAProperties = Object.getOwnPropertyNames(objectA), + objectBProperties = Object.getOwnPropertyNames(objectB), + propName = ''; + + if (compareLength) { + // If number of properties is different, objects are not equivalent + if (objectAProperties.length !== objectBProperties.length) { + return false; + } + } + + for (var i = 0; i < objectAProperties.length; i++) { + propName = objectAProperties[i]; + + // If the property is not in the object B properties, continue with the next property + if ($.inArray(propName, objectBProperties) > -1) { + // If values of same property are not equal, objects are not equivalent + if (objectA[propName] !== objectB[propName]) { + return false; + } + } + } + + // If we made it this far, objects are considered equivalent + return true; + }; + + var escapeHTML = function (text) { + if (typeof text === 'string') { + return text + .replace(/&/g, "&") + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } + return text; + }; + + var getRealHeight = function ($el) { + var height = 0; + $el.children().each(function () { + if (height < $(this).outerHeight(true)) { + height = $(this).outerHeight(true); + } + }); + return height; + }; + + var getRealDataAttr = function (dataAttr) { + for (var attr in dataAttr) { + var auxAttr = attr.split(/(?=[A-Z])/).join('-').toLowerCase(); + if (auxAttr !== attr) { + dataAttr[auxAttr] = dataAttr[attr]; + delete dataAttr[attr]; + } + } + + return dataAttr; + }; + + var getItemField = function (item, field) { + var value = item; + + if (typeof field !== 'string' || item.hasOwnProperty(field)) { + return item[field]; + } + var props = field.split('.'); + for (var p in props) { + value = value[props[p]]; + } + return value; + }; + + // BOOTSTRAP TABLE CLASS DEFINITION + // ====================== + + var BootstrapTable = function (el, options) { + this.options = options; + this.$el = $(el); + this.$el_ = this.$el.clone(); + this.timeoutId_ = 0; + this.timeoutFooter_ = 0; + + this.init(); + }; + + BootstrapTable.DEFAULTS = { + classes: 'table table-hover', + locale: undefined, + height: undefined, + undefinedText: '-', + sortName: undefined, + sortOrder: 'asc', + striped: false, + columns: [[]], + data: [], + dataField: 'rows', + method: 'get', + url: undefined, + ajax: undefined, + cache: true, + contentType: 'application/json', + dataType: 'json', + ajaxOptions: {}, + queryParams: function (params) { + return params; + }, + queryParamsType: 'limit', // undefined + responseHandler: function (res) { + return res; + }, + pagination: false, + onlyInfoPagination: false, + sidePagination: 'client', // client or server + totalRows: 0, // server side need to set + pageNumber: 1, + pageSize: 10, + pageList: [10, 25, 50, 100], + paginationHAlign: 'right', //right, left + paginationVAlign: 'bottom', //bottom, top, both + paginationDetailHAlign: 'left', //right, left + paginationFirstText: '«', + paginationPreText: '‹', + paginationNextText: '›', + paginationLastText: '»', + search: false, + strictSearch: false, + searchAlign: 'right', + selectItemName: 'btSelectItem', + showHeader: true, + showFooter: false, + showColumns: false, + showPaginationSwitch: false, + showRefresh: false, + showToggle: false, + buttonsAlign: 'right', + smartDisplay: true, + minimumCountColumns: 1, + idField: undefined, + uniqueId: undefined, + cardView: false, + detailView: false, + detailFormatter: function (index, row) { + return ''; + }, + trimOnSearch: true, + clickToSelect: false, + singleSelect: false, + toolbar: undefined, + toolbarAlign: 'left', + checkboxHeader: true, + sortable: true, + silentSort: true, + maintainSelected: false, + searchTimeOut: 500, + searchText: '', + iconSize: undefined, + iconsPrefix: 'glyphicon', // glyphicon of fa (font awesome) + icons: { + paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down', + paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up', + refresh: 'glyphicon-refresh icon-refresh', + toggle: 'glyphicon-list-alt icon-list-alt', + columns: 'glyphicon-th icon-th', + detailOpen: 'glyphicon-plus icon-plus', + detailClose: 'glyphicon-minus icon-minus' + }, + + rowStyle: function (row, index) { + return {}; + }, + + rowAttributes: function (row, index) { + return {}; + }, + + onAll: function (name, args) { + return false; + }, + onClickCell: function (field, value, row, $element) { + return false; + }, + onDblClickCell: function (field, value, row, $element) { + return false; + }, + onClickRow: function (item, $element) { + return false; + }, + onDblClickRow: function (item, $element) { + return false; + }, + onSort: function (name, order) { + return false; + }, + onCheck: function (row) { + return false; + }, + onUncheck: function (row) { + return false; + }, + onCheckAll: function (rows) { + return false; + }, + onUncheckAll: function (rows) { + return false; + }, + onCheckSome: function (rows) { + return false; + }, + onUncheckSome: function (rows) { + return false; + }, + onLoadSuccess: function (data) { + return false; + }, + onLoadError: function (status) { + return false; + }, + onColumnSwitch: function (field, checked) { + return false; + }, + onPageChange: function (number, size) { + return false; + }, + onSearch: function (text) { + return false; + }, + onToggle: function (cardView) { + return false; + }, + onPreBody: function (data) { + return false; + }, + onPostBody: function () { + return false; + }, + onPostHeader: function () { + return false; + }, + onExpandRow: function (index, row, $detail) { + return false; + }, + onCollapseRow: function (index, row) { + return false; + }, + onRefreshOptions: function (options) { + return false; + }, + onResetView: function () { + return false; + } + }; + + BootstrapTable.LOCALES = []; + + BootstrapTable.LOCALES['en-US'] = BootstrapTable.LOCALES['en'] = { + formatLoadingMessage: function () { + return 'Loading, please wait...'; + }, + formatRecordsPerPage: function (pageNumber) { + return sprintf('%s records per page', pageNumber); + }, + formatShowingRows: function (pageFrom, pageTo, totalRows) { + return sprintf('Showing %s to %s of %s rows', pageFrom, pageTo, totalRows); + }, + formatDetailPagination: function (totalRows) { + return sprintf('Showing %s rows', totalRows); + }, + formatSearch: function () { + return 'Search'; + }, + formatNoMatches: function () { + return 'No matching records found'; + }, + formatPaginationSwitch: function () { + return 'Hide/Show pagination'; + }, + formatRefresh: function () { + return 'Refresh'; + }, + formatToggle: function () { + return 'Toggle'; + }, + formatColumns: function () { + return 'Columns'; + }, + formatAllRows: function () { + return 'All'; + } + }; + + $.extend(BootstrapTable.DEFAULTS, BootstrapTable.LOCALES['en-US']); + + BootstrapTable.COLUMN_DEFAULTS = { + radio: false, + checkbox: false, + checkboxEnabled: true, + field: undefined, + title: undefined, + titleTooltip: undefined, + 'class': undefined, + align: undefined, // left, right, center + halign: undefined, // left, right, center + falign: undefined, // left, right, center + valign: undefined, // top, middle, bottom + width: undefined, + sortable: false, + order: 'asc', // asc, desc + visible: true, + switchable: true, + clickToSelect: true, + formatter: undefined, + footerFormatter: undefined, + events: undefined, + sorter: undefined, + sortName: undefined, + cellStyle: undefined, + searchable: true, + searchFormatter: true, + cardVisible: true + }; + + BootstrapTable.EVENTS = { + 'all.bs.table': 'onAll', + 'click-cell.bs.table': 'onClickCell', + 'dbl-click-cell.bs.table': 'onDblClickCell', + 'click-row.bs.table': 'onClickRow', + 'dbl-click-row.bs.table': 'onDblClickRow', + 'sort.bs.table': 'onSort', + 'check.bs.table': 'onCheck', + 'uncheck.bs.table': 'onUncheck', + 'check-all.bs.table': 'onCheckAll', + 'uncheck-all.bs.table': 'onUncheckAll', + 'check-some.bs.table': 'onCheckSome', + 'uncheck-some.bs.table': 'onUncheckSome', + 'load-success.bs.table': 'onLoadSuccess', + 'load-error.bs.table': 'onLoadError', + 'column-switch.bs.table': 'onColumnSwitch', + 'page-change.bs.table': 'onPageChange', + 'search.bs.table': 'onSearch', + 'toggle.bs.table': 'onToggle', + 'pre-body.bs.table': 'onPreBody', + 'post-body.bs.table': 'onPostBody', + 'post-header.bs.table': 'onPostHeader', + 'expand-row.bs.table': 'onExpandRow', + 'collapse-row.bs.table': 'onCollapseRow', + 'refresh-options.bs.table': 'onRefreshOptions', + 'reset-view.bs.table': 'onResetView' + }; + + BootstrapTable.prototype.init = function () { + this.initLocale(); + this.initContainer(); + this.initTable(); + this.initHeader(); + this.initData(); + this.initFooter(); + this.initToolbar(); + this.initPagination(); + this.initBody(); + this.initSearchText(); + this.initServer(); + }; + + BootstrapTable.prototype.initLocale = function () { + if (this.options.locale) { + var parts = this.options.locale.split(/-|_/); + parts[0].toLowerCase(); + parts[1] && parts[1].toUpperCase(); + if ($.fn.bootstrapTable.locales[this.options.locale]) { + // locale as requested + $.extend(this.options, $.fn.bootstrapTable.locales[this.options.locale]); + } else if ($.fn.bootstrapTable.locales[parts.join('-')]) { + // locale with sep set to - (in case original was specified with _) + $.extend(this.options, $.fn.bootstrapTable.locales[parts.join('-')]); + } else if ($.fn.bootstrapTable.locales[parts[0]]) { + // short locale language code (i.e. 'en') + $.extend(this.options, $.fn.bootstrapTable.locales[parts[0]]); + } + } + }; + + BootstrapTable.prototype.initContainer = function () { + this.$container = $([ + '<div class="bootstrap-table">', + '<div class="fixed-table-toolbar"></div>', + this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ? + '<div class="fixed-table-pagination" style="clear: both;"></div>' : + '', + '<div class="fixed-table-container">', + '<div class="fixed-table-header"><table></table></div>', + '<div class="fixed-table-body">', + '<div class="fixed-table-loading">', + this.options.formatLoadingMessage(), + '</div>', + '</div>', + '<div class="fixed-table-footer"><table><tr></tr></table></div>', + this.options.paginationVAlign === 'bottom' || this.options.paginationVAlign === 'both' ? + '<div class="fixed-table-pagination"></div>' : + '', + '</div>', + '</div>' + ].join('')); + + this.$container.insertAfter(this.$el); + this.$tableContainer = this.$container.find('.fixed-table-container'); + this.$tableHeader = this.$container.find('.fixed-table-header'); + this.$tableBody = this.$container.find('.fixed-table-body'); + this.$tableLoading = this.$container.find('.fixed-table-loading'); + this.$tableFooter = this.$container.find('.fixed-table-footer'); + this.$toolbar = this.$container.find('.fixed-table-toolbar'); + this.$pagination = this.$container.find('.fixed-table-pagination'); + + this.$tableBody.append(this.$el); + this.$container.after('<div class="clearfix"></div>'); + + this.$el.addClass(this.options.classes); + if (this.options.striped) { + this.$el.addClass('table-striped'); + } + if ($.inArray('table-no-bordered', this.options.classes.split(' ')) !== -1) { + this.$tableContainer.addClass('table-no-bordered'); + } + }; + + BootstrapTable.prototype.initTable = function () { + var that = this, + columns = [], + data = []; + + this.$header = this.$el.find('>thead'); + if (!this.$header.length) { + this.$header = $('<thead></thead>').appendTo(this.$el); + } + this.$header.find('tr').each(function () { + var column = []; + + $(this).find('th').each(function () { + column.push($.extend({}, { + title: $(this).html(), + 'class': $(this).attr('class'), + titleTooltip: $(this).attr('title'), + rowspan: $(this).attr('rowspan') ? +$(this).attr('rowspan') : undefined, + colspan: $(this).attr('colspan') ? +$(this).attr('colspan') : undefined + }, $(this).data())); + }); + columns.push(column); + }); + if (!$.isArray(this.options.columns[0])) { + this.options.columns = [this.options.columns]; + } + this.options.columns = $.extend(true, [], columns, this.options.columns); + this.columns = []; + + setFieldIndex(this.options.columns); + $.each(this.options.columns, function (i, columns) { + $.each(columns, function (j, column) { + column = $.extend({}, BootstrapTable.COLUMN_DEFAULTS, column); + + if (typeof column.fieldIndex !== 'undefined') { + that.columns[column.fieldIndex] = column; + } + + that.options.columns[i][j] = column; + }); + }); + + // if options.data is setting, do not process tbody data + if (this.options.data.length) { + return; + } + + this.$el.find('>tbody>tr').each(function () { + var row = {}; + + // save tr's id, class and data-* attributes + row._id = $(this).attr('id'); + row._class = $(this).attr('class'); + row._data = getRealDataAttr($(this).data()); + + $(this).find('td').each(function (i) { + var field = that.columns[i].field; + + row[field] = $(this).html(); + // save td's id, class and data-* attributes + row['_' + field + '_id'] = $(this).attr('id'); + row['_' + field + '_class'] = $(this).attr('class'); + row['_' + field + '_rowspan'] = $(this).attr('rowspan'); + row['_' + field + '_title'] = $(this).attr('title'); + row['_' + field + '_data'] = getRealDataAttr($(this).data()); + }); + data.push(row); + }); + this.options.data = data; + }; + + BootstrapTable.prototype.initHeader = function () { + var that = this, + visibleColumns = {}, + html = []; + + this.header = { + fields: [], + styles: [], + classes: [], + formatters: [], + events: [], + sorters: [], + sortNames: [], + cellStyles: [], + searchables: [] + }; + + $.each(this.options.columns, function (i, columns) { + html.push('<tr>'); + + if (i == 0 && !that.options.cardView && that.options.detailView) { + html.push(sprintf('<th class="detail" rowspan="%s"><div class="fht-cell"></div></th>', + that.options.columns.length)); + } + + $.each(columns, function (j, column) { + var text = '', + halign = '', // header align style + align = '', // body align style + style = '', + class_ = sprintf(' class="%s"', column['class']), + order = that.options.sortOrder || column.order, + unitWidth = 'px', + width = column.width; + + if (column.width !== undefined && (!that.options.cardView)) { + if (typeof column.width === 'string') { + if (column.width.indexOf('%') !== -1) { + unitWidth = '%'; + } + } + } + if (column.width && typeof column.width === 'string') { + width = column.width.replace('%', '').replace('px', ''); + } + + halign = sprintf('text-align: %s; ', column.halign ? column.halign : column.align); + align = sprintf('text-align: %s; ', column.align); + style = sprintf('vertical-align: %s; ', column.valign); + style += sprintf('width: %s; ', (column.checkbox || column.radio) && !width ? + '36px' : (width ? width + unitWidth : undefined)); + + if (typeof column.fieldIndex !== 'undefined') { + that.header.fields[column.fieldIndex] = column.field; + that.header.styles[column.fieldIndex] = align + style; + that.header.classes[column.fieldIndex] = class_; + that.header.formatters[column.fieldIndex] = column.formatter; + that.header.events[column.fieldIndex] = column.events; + that.header.sorters[column.fieldIndex] = column.sorter; + that.header.sortNames[column.fieldIndex] = column.sortName; + that.header.cellStyles[column.fieldIndex] = column.cellStyle; + that.header.searchables[column.fieldIndex] = column.searchable; + + if (!column.visible) { + return; + } + + if (that.options.cardView && (!column.cardVisible)) { + return; + } + + visibleColumns[column.field] = column; + } + + html.push('<th' + sprintf(' title="%s"', column.titleTooltip), + column.checkbox || column.radio ? + sprintf(' class="bs-checkbox %s"', column['class'] || '') : + class_, + sprintf(' style="%s"', halign + style), + sprintf(' rowspan="%s"', column.rowspan), + sprintf(' colspan="%s"', column.colspan), + sprintf(' data-field="%s"', column.field), + "tabindex='0'", + '>'); + + html.push(sprintf('<div class="th-inner %s">', that.options.sortable && column.sortable ? + 'sortable both' : '')); + + text = column.title; + + if (column.checkbox) { + if (!that.options.singleSelect && that.options.checkboxHeader) { + text = '<input name="btSelectAll" type="checkbox" />'; + } + that.header.stateField = column.field; + } + if (column.radio) { + text = ''; + that.header.stateField = column.field; + that.options.singleSelect = true; + } + + html.push(text); + html.push('</div>'); + html.push('<div class="fht-cell"></div>'); + html.push('</div>'); + html.push('</th>'); + }); + html.push('</tr>'); + }); + + this.$header.html(html.join('')); + this.$header.find('th[data-field]').each(function (i) { + $(this).data(visibleColumns[$(this).data('field')]); + }); + this.$container.off('click', '.th-inner').on('click', '.th-inner', function (event) { + if (that.options.sortable && $(this).parent().data().sortable) { + that.onSort(event); + } + }); + + this.$header.children().children().off('keypress').on('keypress', function (event) { + if (that.options.sortable && $(this).data().sortable) { + var code = event.keyCode || event.which; + if (code == 13) { //Enter keycode + that.onSort(event); + } + } + }); + + if (!this.options.showHeader || this.options.cardView) { + this.$header.hide(); + this.$tableHeader.hide(); + this.$tableLoading.css('top', 0); + } else { + this.$header.show(); + this.$tableHeader.show(); + this.$tableLoading.css('top', this.$header.outerHeight() + 1); + // Assign the correct sortable arrow + this.getCaret(); + } + + this.$selectAll = this.$header.find('[name="btSelectAll"]'); + this.$container.off('click', '[name="btSelectAll"]') + .on('click', '[name="btSelectAll"]', function () { + var checked = $(this).prop('checked'); + that[checked ? 'checkAll' : 'uncheckAll'](); + that.updateSelected(); + }); + }; + + BootstrapTable.prototype.initFooter = function () { + if (!this.options.showFooter || this.options.cardView) { + this.$tableFooter.hide(); + } else { + this.$tableFooter.show(); + } + }; + + /** + * @param data + * @param type: append / prepend + */ + BootstrapTable.prototype.initData = function (data, type) { + if (type === 'append') { + this.data = this.data.concat(data); + } else if (type === 'prepend') { + this.data = [].concat(data).concat(this.data); + } else { + this.data = data || this.options.data; + } + + // Fix #839 Records deleted when adding new row on filtered table + if (type === 'append') { + this.options.data = this.options.data.concat(data); + } else if (type === 'prepend') { + this.options.data = [].concat(data).concat(this.options.data); + } else { + this.options.data = this.data; + } + + if (this.options.sidePagination === 'server') { + return; + } + this.initSort(); + }; + + BootstrapTable.prototype.initSort = function () { + var that = this, + name = this.options.sortName, + order = this.options.sortOrder === 'desc' ? -1 : 1, + index = $.inArray(this.options.sortName, this.header.fields); + + if (index !== -1) { + this.data.sort(function (a, b) { + if (that.header.sortNames[index]) { + name = that.header.sortNames[index]; + } + var aa = getItemField(a, name), + bb = getItemField(b, name), + value = calculateObjectValue(that.header, that.header.sorters[index], [aa, bb]); + + if (value !== undefined) { + return order * value; + } + + // Fix #161: undefined or null string sort bug. + if (aa === undefined || aa === null) { + aa = ''; + } + if (bb === undefined || bb === null) { + bb = ''; + } + + // IF both values are numeric, do a numeric comparison + if ($.isNumeric(aa) && $.isNumeric(bb)) { + // Convert numerical values form string to float. + aa = parseFloat(aa); + bb = parseFloat(bb); + if (aa < bb) { + return order * -1; + } + return order; + } + + if (aa === bb) { + return 0; + } + + // If value is not a string, convert to string + if (typeof aa !== 'string') { + aa = aa.toString(); + } + + if (aa.localeCompare(bb) === -1) { + return order * -1; + } + + return order; + }); + } + }; + + BootstrapTable.prototype.onSort = function (event) { + var $this = event.type === "keypress" ? $(event.currentTarget) : $(event.currentTarget).parent(), + $this_ = this.$header.find('th').eq($this.index()); + + this.$header.add(this.$header_).find('span.order').remove(); + + if (this.options.sortName === $this.data('field')) { + this.options.sortOrder = this.options.sortOrder === 'asc' ? 'desc' : 'asc'; + } else { + this.options.sortName = $this.data('field'); + this.options.sortOrder = $this.data('order') === 'asc' ? 'desc' : 'asc'; + } + this.trigger('sort', this.options.sortName, this.options.sortOrder); + + $this.add($this_).data('order', this.options.sortOrder); + + // Assign the correct sortable arrow + this.getCaret(); + + if (this.options.sidePagination === 'server') { + this.initServer(this.options.silentSort); + return; + } + + this.initSort(); + this.initBody(); + }; + + BootstrapTable.prototype.initToolbar = function () { + var that = this, + html = [], + timeoutId = 0, + $keepOpen, + $search, + switchableCount = 0; + + this.$toolbar.html(''); + + if (typeof this.options.toolbar === 'string' || typeof this.options.toolbar === 'object') { + $(sprintf('<div class="bars pull-%s"></div>', this.options.toolbarAlign)) + .appendTo(this.$toolbar) + .append($(this.options.toolbar)); + } + + // showColumns, showToggle, showRefresh + html = [sprintf('<div class="columns columns-%s btn-group pull-%s">', + this.options.buttonsAlign, this.options.buttonsAlign)]; + + if (typeof this.options.icons === 'string') { + this.options.icons = calculateObjectValue(null, this.options.icons); + } + + if (this.options.showPaginationSwitch) { + html.push(sprintf('<button class="btn btn-default" type="button" name="paginationSwitch" title="%s">', + this.options.formatPaginationSwitch()), + sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.paginationSwitchDown), + '</button>'); + } + + if (this.options.showRefresh) { + html.push(sprintf('<button class="btn btn-default' + + sprintf(' btn-%s', this.options.iconSize) + + '" type="button" name="refresh" title="%s">', + this.options.formatRefresh()), + sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.refresh), + '</button>'); + } + + if (this.options.showToggle) { + html.push(sprintf('<button class="btn btn-default' + + sprintf(' btn-%s', this.options.iconSize) + + '" type="button" name="toggle" title="%s">', + this.options.formatToggle()), + sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.toggle), + '</button>'); + } + + if (this.options.showColumns) { + html.push(sprintf('<div class="keep-open btn-group" title="%s">', + this.options.formatColumns()), + '<button type="button" class="btn btn-default' + + sprintf(' btn-%s', this.options.iconSize) + + ' dropdown-toggle" data-toggle="dropdown">', + sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.columns), + ' <span class="caret"></span>', + '</button>', + '<ul class="dropdown-menu" role="menu">'); + + $.each(this.columns, function (i, column) { + if (column.radio || column.checkbox) { + return; + } + + if (that.options.cardView && (!column.cardVisible)) { + return; + } + + var checked = column.visible ? ' checked="checked"' : ''; + + if (column.switchable) { + html.push(sprintf('<li>' + + '<label><input type="checkbox" data-field="%s" value="%s"%s> %s</label>' + + '</li>', column.field, i, checked, column.title)); + switchableCount++; + } + }); + html.push('</ul>', + '</div>'); + } + + html.push('</div>'); + + // Fix #188: this.showToolbar is for extentions + if (this.showToolbar || html.length > 2) { + this.$toolbar.append(html.join('')); + } + + if (this.options.showPaginationSwitch) { + this.$toolbar.find('button[name="paginationSwitch"]') + .off('click').on('click', $.proxy(this.togglePagination, this)); + } + + if (this.options.showRefresh) { + this.$toolbar.find('button[name="refresh"]') + .off('click').on('click', $.proxy(this.refresh, this)); + } + + if (this.options.showToggle) { + this.$toolbar.find('button[name="toggle"]') + .off('click').on('click', function () { + that.toggleView(); + }); + } + + if (this.options.showColumns) { + $keepOpen = this.$toolbar.find('.keep-open'); + + if (switchableCount <= this.options.minimumCountColumns) { + $keepOpen.find('input').prop('disabled', true); + } + + $keepOpen.find('li').off('click').on('click', function (event) { + event.stopImmediatePropagation(); + }); + $keepOpen.find('input').off('click').on('click', function () { + var $this = $(this); + + that.toggleColumn(getFieldIndex(that.columns, + $(this).data('field')), $this.prop('checked'), false); + that.trigger('column-switch', $(this).data('field'), $this.prop('checked')); + }); + } + + if (this.options.search) { + html = []; + html.push( + '<div class="pull-' + this.options.searchAlign + ' search">', + sprintf('<input class="form-control' + + sprintf(' input-%s', this.options.iconSize) + + '" type="text" placeholder="%s">', + this.options.formatSearch()), + '</div>'); + + this.$toolbar.append(html.join('')); + $search = this.$toolbar.find('.search input'); + $search.off('keyup drop').on('keyup drop', function (event) { + clearTimeout(timeoutId); // doesn't matter if it's 0 + timeoutId = setTimeout(function () { + that.onSearch(event); + }, that.options.searchTimeOut); + }); + } + }; + + BootstrapTable.prototype.onSearch = function (event) { + var text = $.trim($(event.currentTarget).val()); + + // trim search input + if (this.options.trimOnSearch && $(event.currentTarget).val() !== text) { + $(event.currentTarget).val(text); + } + + if (text === this.searchText) { + return; + } + this.searchText = text; + + this.options.pageNumber = 1; + this.initSearch(); + this.updatePagination(); + this.trigger('search', text); + }; + + BootstrapTable.prototype.initSearch = function () { + var that = this; + + if (this.options.sidePagination !== 'server') { + var s = this.searchText && this.searchText.toLowerCase(); + var f = $.isEmptyObject(this.filterColumns) ? null : this.filterColumns; + + // Check filter + this.data = f ? $.grep(this.options.data, function (item, i) { + for (var key in f) { + if ($.isArray(f[key])) { + if ($.inArray(item[key], f[key]) === -1) { + return false; + } + } else if (item[key] !== f[key]) { + return false; + } + } + return true; + }) : this.options.data; + + this.data = s ? $.grep(this.data, function (item, i) { + for (var key in item) { + key = $.isNumeric(key) ? parseInt(key, 10) : key; + var value = item[key], + column = that.columns[getFieldIndex(that.columns, key)], + j = $.inArray(key, that.header.fields); + + // Fix #142: search use formated data + if (column && column.searchFormatter) { + value = calculateObjectValue(column, + that.header.formatters[j], [value, item, i], value); + } + + var index = $.inArray(key, that.header.fields); + if (index !== -1 && that.header.searchables[index] && (typeof value === 'string' || typeof value === 'number')) { + if (that.options.strictSearch) { + if ((value + '').toLowerCase() === s) { + return true; + } + } else { + if ((value + '').toLowerCase().indexOf(s) !== -1) { + return true; + } + } + } + } + return false; + }) : this.data; + } + }; + + BootstrapTable.prototype.initPagination = function () { + if (!this.options.pagination) { + this.$pagination.hide(); + return; + } else { + this.$pagination.show(); + } + + var that = this, + html = [], + $allSelected = false, + i, from, to, + $pageList, + $first, $pre, + $next, $last, + $number, + data = this.getData(); + + if (this.options.sidePagination !== 'server') { + this.options.totalRows = data.length; + } + + this.totalPages = 0; + if (this.options.totalRows) { + if (this.options.pageSize === this.options.formatAllRows()) { + this.options.pageSize = this.options.totalRows; + $allSelected = true; + } else if (this.options.pageSize === this.options.totalRows) { + // Fix #667 Table with pagination, + // multiple pages and a search that matches to one page throws exception + var pageLst = typeof this.options.pageList === 'string' ? + this.options.pageList.replace('[', '').replace(']', '') + .replace(/ /g, '').toLowerCase().split(',') : this.options.pageList; + if ($.inArray(this.options.formatAllRows().toLowerCase(), pageLst) > -1) { + $allSelected = true; + } + } + + this.totalPages = ~~((this.options.totalRows - 1) / this.options.pageSize) + 1; + + this.options.totalPages = this.totalPages; + } + if (this.totalPages > 0 && this.options.pageNumber > this.totalPages) { + this.options.pageNumber = this.totalPages; + } + + this.pageFrom = (this.options.pageNumber - 1) * this.options.pageSize + 1; + this.pageTo = this.options.pageNumber * this.options.pageSize; + if (this.pageTo > this.options.totalRows) { + this.pageTo = this.options.totalRows; + } + + html.push( + '<div class="pull-' + this.options.paginationDetailHAlign + ' pagination-detail">', + '<span class="pagination-info">', + this.options.onlyInfoPagination ? this.options.formatDetailPagination(this.options.totalRows) : + this.options.formatShowingRows(this.pageFrom, this.pageTo, this.options.totalRows), + '</span>'); + + if (!this.options.onlyInfoPagination) { + html.push('<span class="page-list">'); + + var pageNumber = [ + sprintf('<span class="btn-group %s">', + this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ? + 'dropdown' : 'dropup'), + '<button type="button" class="btn btn-default ' + + sprintf(' btn-%s', this.options.iconSize) + + ' dropdown-toggle" data-toggle="dropdown">', + '<span class="page-size">', + $allSelected ? this.options.formatAllRows() : this.options.pageSize, + '</span>', + ' <span class="caret"></span>', + '</button>', + '<ul class="dropdown-menu" role="menu">' + ], + pageList = this.options.pageList; + + if (typeof this.options.pageList === 'string') { + var list = this.options.pageList.replace('[', '').replace(']', '') + .replace(/ /g, '').split(','); + + pageList = []; + $.each(list, function (i, value) { + pageList.push(value.toUpperCase() === that.options.formatAllRows().toUpperCase() ? + that.options.formatAllRows() : +value); + }); + } + + $.each(pageList, function (i, page) { + if (!that.options.smartDisplay || i === 0 || pageList[i - 1] <= that.options.totalRows) { + var active; + if ($allSelected) { + active = page === that.options.formatAllRows() ? ' class="active"' : ''; + } else { + active = page === that.options.pageSize ? ' class="active"' : ''; + } + pageNumber.push(sprintf('<li%s><a href="javascript:void(0)">%s</a></li>', active, page)); + } + }); + pageNumber.push('</ul></span>'); + + html.push(this.options.formatRecordsPerPage(pageNumber.join(''))); + html.push('</span>'); + + html.push('</div>', + '<div class="pull-' + this.options.paginationHAlign + ' pagination">', + '<ul class="pagination' + sprintf(' pagination-%s', this.options.iconSize) + '">', + '<li class="page-first"><a href="javascript:void(0)">' + this.options.paginationFirstText + '</a></li>', + '<li class="page-pre"><a href="javascript:void(0)">' + this.options.paginationPreText + '</a></li>'); + + if (this.totalPages < 5) { + from = 1; + to = this.totalPages; + } else { + from = this.options.pageNumber - 2; + to = from + 4; + if (from < 1) { + from = 1; + to = 5; + } + if (to > this.totalPages) { + to = this.totalPages; + from = to - 4; + } + } + for (i = from; i <= to; i++) { + html.push('<li class="page-number' + (i === this.options.pageNumber ? ' active' : '') + '">', + '<a href="javascript:void(0)">', i, '</a>', + '</li>'); + } + + html.push( + '<li class="page-next"><a href="javascript:void(0)">' + this.options.paginationNextText + '</a></li>', + '<li class="page-last"><a href="javascript:void(0)">' + this.options.paginationLastText + '</a></li>', + '</ul>', + '</div>'); + + } + this.$pagination.html(html.join('')); + + if (!this.options.onlyInfoPagination) { + $pageList = this.$pagination.find('.page-list a'); + $first = this.$pagination.find('.page-first'); + $pre = this.$pagination.find('.page-pre'); + $next = this.$pagination.find('.page-next'); + $last = this.$pagination.find('.page-last'); + $number = this.$pagination.find('.page-number'); + + if (this.options.pageNumber <= 1) { + $first.addClass('disabled'); + $pre.addClass('disabled'); + } + if (this.options.pageNumber >= this.totalPages) { + $next.addClass('disabled'); + $last.addClass('disabled'); + } + if (this.options.smartDisplay) { + if (this.totalPages <= 1) { + this.$pagination.find('div.pagination').hide(); + } + if (pageList.length < 2 || this.options.totalRows <= pageList[0]) { + this.$pagination.find('span.page-list').hide(); + } + + // when data is empty, hide the pagination + this.$pagination[this.getData().length ? 'show' : 'hide'](); + } + if ($allSelected) { + this.options.pageSize = this.options.formatAllRows(); + } + $pageList.off('click').on('click', $.proxy(this.onPageListChange, this)); + $first.off('click').on('click', $.proxy(this.onPageFirst, this)); + $pre.off('click').on('click', $.proxy(this.onPagePre, this)); + $next.off('click').on('click', $.proxy(this.onPageNext, this)); + $last.off('click').on('click', $.proxy(this.onPageLast, this)); + $number.off('click').on('click', $.proxy(this.onPageNumber, this)); + } + }; + + BootstrapTable.prototype.updatePagination = function (event) { + // Fix #171: IE disabled button can be clicked bug. + if (event && $(event.currentTarget).hasClass('disabled')) { + return; + } + + if (!this.options.maintainSelected) { + this.resetRows(); + } + + this.initPagination(); + if (this.options.sidePagination === 'server') { + this.initServer(); + } else { + this.initBody(); + } + + this.trigger('page-change', this.options.pageNumber, this.options.pageSize); + }; + + BootstrapTable.prototype.onPageListChange = function (event) { + var $this = $(event.currentTarget); + + $this.parent().addClass('active').siblings().removeClass('active'); + this.options.pageSize = $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ? + this.options.formatAllRows() : +$this.text(); + this.$toolbar.find('.page-size').text(this.options.pageSize); + + this.updatePagination(event); + }; + + BootstrapTable.prototype.onPageFirst = function (event) { + this.options.pageNumber = 1; + this.updatePagination(event); + }; + + BootstrapTable.prototype.onPagePre = function (event) { + this.options.pageNumber--; + this.updatePagination(event); + }; + + BootstrapTable.prototype.onPageNext = function (event) { + this.options.pageNumber++; + this.updatePagination(event); + }; + + BootstrapTable.prototype.onPageLast = function (event) { + this.options.pageNumber = this.totalPages; + this.updatePagination(event); + }; + + BootstrapTable.prototype.onPageNumber = function (event) { + if (this.options.pageNumber === +$(event.currentTarget).text()) { + return; + } + this.options.pageNumber = +$(event.currentTarget).text(); + this.updatePagination(event); + }; + + BootstrapTable.prototype.initBody = function (fixedScroll) { + var that = this, + html = [], + data = this.getData(); + + this.trigger('pre-body', data); + + this.$body = this.$el.find('>tbody'); + if (!this.$body.length) { + this.$body = $('<tbody></tbody>').appendTo(this.$el); + } + + //Fix #389 Bootstrap-table-flatJSON is not working + + if (!this.options.pagination || this.options.sidePagination === 'server') { + this.pageFrom = 1; + this.pageTo = data.length; + } + + for (var i = this.pageFrom - 1; i < this.pageTo; i++) { + var key, + item = data[i], + style = {}, + csses = [], + data_ = '', + attributes = {}, + htmlAttributes = []; + + style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style); + + if (style && style.css) { + for (key in style.css) { + csses.push(key + ': ' + style.css[key]); + } + } + + attributes = calculateObjectValue(this.options, + this.options.rowAttributes, [item, i], attributes); + + if (attributes) { + for (key in attributes) { + htmlAttributes.push(sprintf('%s="%s"', key, escapeHTML(attributes[key]))); + } + } + + if (item._data && !$.isEmptyObject(item._data)) { + $.each(item._data, function (k, v) { + // ignore data-index + if (k === 'index') { + return; + } + data_ += sprintf(' data-%s="%s"', k, v); + }); + } + + html.push('<tr', + sprintf(' %s', htmlAttributes.join(' ')), + sprintf(' id="%s"', $.isArray(item) ? undefined : item._id), + sprintf(' class="%s"', style.classes || ($.isArray(item) ? undefined : item._class)), + sprintf(' data-index="%s"', i), + sprintf(' data-uniqueid="%s"', item[this.options.uniqueId]), + sprintf('%s', data_), + '>' + ); + + if (this.options.cardView) { + html.push(sprintf('<td colspan="%s">', this.header.fields.length)); + } + + if (!this.options.cardView && this.options.detailView) { + html.push('<td>', + '<a class="detail-icon" href="javascript:">', + sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.detailOpen), + '</a>', + '</td>'); + } + + $.each(this.header.fields, function (j, field) { + var text = '', + value = getItemField(item, field), + type = '', + cellStyle = {}, + id_ = '', + class_ = that.header.classes[j], + data_ = '', + rowspan_ = '', + title_ = '', + column = that.columns[getFieldIndex(that.columns, field)]; + + if (!column.visible) { + return; + } + + style = sprintf('style="%s"', csses.concat(that.header.styles[j]).join('; ')); + + value = calculateObjectValue(column, + that.header.formatters[j], [value, item, i], value); + + // handle td's id and class + if (item['_' + field + '_id']) { + id_ = sprintf(' id="%s"', item['_' + field + '_id']); + } + if (item['_' + field + '_class']) { + class_ = sprintf(' class="%s"', item['_' + field + '_class']); + } + if (item['_' + field + '_rowspan']) { + rowspan_ = sprintf(' rowspan="%s"', item['_' + field + '_rowspan']); + } + if (item['_' + field + '_title']) { + title_ = sprintf(' title="%s"', item['_' + field + '_title']); + } + cellStyle = calculateObjectValue(that.header, + that.header.cellStyles[j], [value, item, i], cellStyle); + if (cellStyle.classes) { + class_ = sprintf(' class="%s"', cellStyle.classes); + } + if (cellStyle.css) { + var csses_ = []; + for (var key in cellStyle.css) { + csses_.push(key + ': ' + cellStyle.css[key]); + } + style = sprintf('style="%s"', csses_.concat(that.header.styles[j]).join('; ')); + } + + if (item['_' + field + '_data'] && !$.isEmptyObject(item['_' + field + '_data'])) { + $.each(item['_' + field + '_data'], function (k, v) { + // ignore data-index + if (k === 'index') { + return; + } + data_ += sprintf(' data-%s="%s"', k, v); + }); + } + + if (column.checkbox || column.radio) { + type = column.checkbox ? 'checkbox' : type; + type = column.radio ? 'radio' : type; + + text = [that.options.cardView ? + '<div class="card-view">' : '<td class="bs-checkbox">', + '<input' + + sprintf(' data-index="%s"', i) + + sprintf(' name="%s"', that.options.selectItemName) + + sprintf(' type="%s"', type) + + sprintf(' value="%s"', item[that.options.idField]) + + sprintf(' checked="%s"', value === true || + (value && value.checked) ? 'checked' : undefined) + + sprintf(' disabled="%s"', !column.checkboxEnabled || + (value && value.disabled) ? 'disabled' : undefined) + + ' />', + that.header.formatters[j] && typeof value === 'string' ? value : '', + that.options.cardView ? '</div>' : '</td>' + ].join(''); + + item[that.header.stateField] = value === true || (value && value.checked); + } else { + value = typeof value === 'undefined' || value === null ? + that.options.undefinedText : value; + + text = that.options.cardView ? ['<div class="card-view">', + that.options.showHeader ? sprintf('<span class="title" %s>%s</span>', style, + getPropertyFromOther(that.columns, 'field', 'title', field)) : '', + sprintf('<span class="value">%s</span>', value), + '</div>' + ].join('') : [sprintf('<td%s %s %s %s %s %s>', id_, class_, style, data_, rowspan_, title_), + value, + '</td>' + ].join(''); + + // Hide empty data on Card view when smartDisplay is set to true. + if (that.options.cardView && that.options.smartDisplay && value === '') { + // Should set a placeholder for event binding correct fieldIndex + text = '<div class="card-view"></div>'; + } + } + + html.push(text); + }); + + if (this.options.cardView) { + html.push('</td>'); + } + + html.push('</tr>'); + } + + // show no records + if (!html.length) { + html.push('<tr class="no-records-found">', + sprintf('<td colspan="%s">%s</td>', + this.$header.find('th').length, this.options.formatNoMatches()), + '</tr>'); + } + + this.$body.html(html.join('')); + + if (!fixedScroll) { + this.scrollTo(0); + } + + // click to select by column + this.$body.find('> tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) { + var $td = $(this), + $tr = $td.parent(), + item = that.data[$tr.data('index')], + index = $td[0].cellIndex, + field = that.header.fields[that.options.detailView && !that.options.cardView ? index - 1 : index], + column = that.columns[getFieldIndex(that.columns, field)], + value = getItemField(item, field); + + if ($td.find('.detail-icon').length) { + return; + } + + that.trigger(e.type === 'click' ? 'click-cell' : 'dbl-click-cell', field, value, item, $td); + that.trigger(e.type === 'click' ? 'click-row' : 'dbl-click-row', item, $tr); + + // if click to select - then trigger the checkbox/radio click + if (e.type === 'click' && that.options.clickToSelect && column.clickToSelect) { + var $selectItem = $tr.find(sprintf('[name="%s"]', that.options.selectItemName)); + if ($selectItem.length) { + $selectItem[0].click(); // #144: .trigger('click') bug + } + } + }); + + this.$body.find('> tr[data-index] > td > .detail-icon').off('click').on('click', function () { + var $this = $(this), + $tr = $this.parent().parent(), + index = $tr.data('index'), + row = data[index]; // Fix #980 Detail view, when searching, returns wrong row + + // remove and update + if ($tr.next().is('tr.detail-view')) { + $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailOpen)); + $tr.next().remove(); + that.trigger('collapse-row', index, row); + } else { + $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailClose)); + $tr.after(sprintf('<tr class="detail-view"><td colspan="%s">%s</td></tr>', + $tr.find('td').length, calculateObjectValue(that.options, + that.options.detailFormatter, [index, row], ''))); + that.trigger('expand-row', index, row, $tr.next().find('td')); + } + that.resetView(); + }); + + this.$selectItem = this.$body.find(sprintf('[name="%s"]', this.options.selectItemName)); + this.$selectItem.off('click').on('click', function (event) { + event.stopImmediatePropagation(); + + var $this = $(this), + checked = $this.prop('checked'), + row = that.data[$this.data('index')]; + + if (that.options.maintainSelected && $(this).is(':radio')) { + $.each(that.options.data, function (i, row) { + row[that.header.stateField] = false; + }); + } + + row[that.header.stateField] = checked; + + if (that.options.singleSelect) { + that.$selectItem.not(this).each(function () { + that.data[$(this).data('index')][that.header.stateField] = false; + }); + that.$selectItem.filter(':checked').not(this).prop('checked', false); + } + + that.updateSelected(); + that.trigger(checked ? 'check' : 'uncheck', row, $this); + }); + + $.each(this.header.events, function (i, events) { + if (!events) { + return; + } + // fix bug, if events is defined with namespace + if (typeof events === 'string') { + events = calculateObjectValue(null, events); + } + + var field = that.header.fields[i], + fieldIndex = $.inArray(field, that.getVisibleFields()); + + if (that.options.detailView && !that.options.cardView) { + fieldIndex += 1; + } + + for (var key in events) { + that.$body.find('>tr:not(.no-records-found)').each(function () { + var $tr = $(this), + $td = $tr.find(that.options.cardView ? '.card-view' : 'td').eq(fieldIndex), + index = key.indexOf(' '), + name = key.substring(0, index), + el = key.substring(index + 1), + func = events[key]; + + $td.find(el).off(name).on(name, function (e) { + var index = $tr.data('index'), + row = that.data[index], + value = row[field]; + + func.apply(this, [e, value, row, index]); + }); + }); + } + }); + + this.updateSelected(); + this.resetView(); + + this.trigger('post-body'); + }; + + BootstrapTable.prototype.initServer = function (silent, query) { + var that = this, + data = {}, + params = { + pageSize: this.options.pageSize === this.options.formatAllRows() ? + this.options.totalRows : this.options.pageSize, + pageNumber: this.options.pageNumber, + searchText: this.searchText, + sortName: this.options.sortName, + sortOrder: this.options.sortOrder + }, + request; + + if (!this.options.url && !this.options.ajax) { + return; + } + + if (this.options.queryParamsType === 'limit') { + params = { + search: params.searchText, + sort: params.sortName, + order: params.sortOrder + }; + if (this.options.pagination) { + params.limit = this.options.pageSize === this.options.formatAllRows() ? + this.options.totalRows : this.options.pageSize; + params.offset = this.options.pageSize === this.options.formatAllRows() ? + 0 : this.options.pageSize * (this.options.pageNumber - 1); + } + } + + if (!($.isEmptyObject(this.filterColumnsPartial))) { + params['filter'] = JSON.stringify(this.filterColumnsPartial, null); + } + + data = calculateObjectValue(this.options, this.options.queryParams, [params], data); + + $.extend(data, query || {}); + + // false to stop request + if (data === false) { + return; + } + + if (!silent) { + this.$tableLoading.show(); + } + request = $.extend({}, calculateObjectValue(null, this.options.ajaxOptions), { + type: this.options.method, + url: this.options.url, + data: this.options.contentType === 'application/json' && this.options.method === 'post' ? + JSON.stringify(data) : data, + cache: this.options.cache, + contentType: this.options.contentType, + dataType: this.options.dataType, + success: function (res) { + res = calculateObjectValue(that.options, that.options.responseHandler, [res], res); + + that.load(res); + that.trigger('load-success', res); + }, + error: function (res) { + that.trigger('load-error', res.status, res); + }, + complete: function () { + if (!silent) { + that.$tableLoading.hide(); + } + } + }); + + if (this.options.ajax) { + calculateObjectValue(this, this.options.ajax, [request], null); + } else { + $.ajax(request); + } + }; + + BootstrapTable.prototype.initSearchText = function () { + if (this.options.search) { + if (this.options.searchText !== '') { + var $search = this.$toolbar.find('.search input'); + $search.val(this.options.searchText); + this.onSearch({currentTarget: $search}); + } + } + }; + + BootstrapTable.prototype.getCaret = function () { + var that = this; + + $.each(this.$header.find('th'), function (i, th) { + $(th).find('.sortable').removeClass('desc asc').addClass($(th).data('field') === that.options.sortName ? that.options.sortOrder : 'both'); + }); + }; + + BootstrapTable.prototype.updateSelected = function () { + var checkAll = this.$selectItem.filter(':enabled').length && + this.$selectItem.filter(':enabled').length === + this.$selectItem.filter(':enabled').filter(':checked').length; + + this.$selectAll.add(this.$selectAll_).prop('checked', checkAll); + + this.$selectItem.each(function () { + $(this).closest('tr')[$(this).prop('checked') ? 'addClass' : 'removeClass']('selected'); + }); + }; + + BootstrapTable.prototype.updateRows = function () { + var that = this; + + this.$selectItem.each(function () { + that.data[$(this).data('index')][that.header.stateField] = $(this).prop('checked'); + }); + }; + + BootstrapTable.prototype.resetRows = function () { + var that = this; + + $.each(this.data, function (i, row) { + that.$selectAll.prop('checked', false); + that.$selectItem.prop('checked', false); + if (that.header.stateField) { + row[that.header.stateField] = false; + } + }); + }; + + BootstrapTable.prototype.trigger = function (name) { + var args = Array.prototype.slice.call(arguments, 1); + + name += '.bs.table'; + this.options[BootstrapTable.EVENTS[name]].apply(this.options, args); + this.$el.trigger($.Event(name), args); + + this.options.onAll(name, args); + this.$el.trigger($.Event('all.bs.table'), [name, args]); + }; + + BootstrapTable.prototype.resetHeader = function () { + // fix #61: the hidden table reset header bug. + // fix bug: get $el.css('width') error sometime (height = 500) + clearTimeout(this.timeoutId_); + this.timeoutId_ = setTimeout($.proxy(this.fitHeader, this), this.$el.is(':hidden') ? 100 : 0); + }; + + BootstrapTable.prototype.fitHeader = function () { + var that = this, + fixedBody, + scrollWidth, + focused, + focusedTemp; + + if (that.$el.is(':hidden')) { + that.timeoutId_ = setTimeout($.proxy(that.fitHeader, that), 100); + return; + } + fixedBody = this.$tableBody.get(0); + + scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth && + fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ? + getScrollBarWidth() : 0; + + this.$el.css('margin-top', -this.$header.outerHeight()); + + focused = $(':focus'); + if (focused.length > 0) { + var $th = focused.parents('th'); + if ($th.length > 0) { + var dataField = $th.attr('data-field'); + if (dataField !== undefined) { + var $headerTh = this.$header.find("[data-field='" + dataField + "']"); + if ($headerTh.length > 0) { + $headerTh.find(":input").addClass("focus-temp"); + } + } + } + } + + this.$header_ = this.$header.clone(true, true); + this.$selectAll_ = this.$header_.find('[name="btSelectAll"]'); + this.$tableHeader.css({ + 'margin-right': scrollWidth + }).find('table').css('width', this.$el.outerWidth()) + .html('').attr('class', this.$el.attr('class')) + .append(this.$header_); + + + focusedTemp = $('.focus-temp:visible:eq(0)'); + if (focusedTemp.length > 0) { + focusedTemp.focus(); + this.$header.find('.focus-temp').removeClass('focus-temp'); + } + + // fix bug: $.data() is not working as expected after $.append() + this.$header.find('th[data-field]').each(function (i) { + that.$header_.find(sprintf('th[data-field="%s"]', $(this).data('field'))).data($(this).data()); + }); + + var visibleFields = this.getVisibleFields(); + + this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) { + var $this = $(this), + index = i; + + if (that.options.detailView && !that.options.cardView) { + if (i === 0) { + that.$header_.find('th.detail').find('.fht-cell').width($this.innerWidth()); + } + index = i - 1; + } + + that.$header_.find(sprintf('th[data-field="%s"]', visibleFields[index])) + .find('.fht-cell').width($this.innerWidth()); + }); + // horizontal scroll event + // TODO: it's probably better improving the layout than binding to scroll event + this.$tableBody.off('scroll').on('scroll', function () { + that.$tableHeader.scrollLeft($(this).scrollLeft()); + + if (that.options.showFooter && !that.options.cardView) { + that.$tableFooter.scrollLeft($(this).scrollLeft()); + } + }); + that.trigger('post-header'); + }; + + BootstrapTable.prototype.resetFooter = function () { + var that = this, + data = that.getData(), + html = []; + + if (!this.options.showFooter || this.options.cardView) { //do nothing + return; + } + + if (!this.options.cardView && this.options.detailView) { + html.push('<td><div class="th-inner"> </div><div class="fht-cell"></div></td>'); + } + + $.each(this.columns, function (i, column) { + var falign = '', // footer align style + style = '', + class_ = sprintf(' class="%s"', column['class']); + + if (!column.visible) { + return; + } + + if (that.options.cardView && (!column.cardVisible)) { + return; + } + + falign = sprintf('text-align: %s; ', column.falign ? column.falign : column.align); + style = sprintf('vertical-align: %s; ', column.valign); + + html.push('<td', class_, sprintf(' style="%s"', falign + style), '>'); + html.push('<div class="th-inner">'); + + html.push(calculateObjectValue(column, column.footerFormatter, [data], ' ') || ' '); + + html.push('</div>'); + html.push('<div class="fht-cell"></div>'); + html.push('</div>'); + html.push('</td>'); + }); + + this.$tableFooter.find('tr').html(html.join('')); + clearTimeout(this.timeoutFooter_); + this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this), + this.$el.is(':hidden') ? 100 : 0); + }; + + BootstrapTable.prototype.fitFooter = function () { + var that = this, + $footerTd, + elWidth, + scrollWidth; + + clearTimeout(this.timeoutFooter_); + if (this.$el.is(':hidden')) { + this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this), 100); + return; + } + + elWidth = this.$el.css('width'); + scrollWidth = elWidth > this.$tableBody.width() ? getScrollBarWidth() : 0; + + this.$tableFooter.css({ + 'margin-right': scrollWidth + }).find('table').css('width', elWidth) + .attr('class', this.$el.attr('class')); + + $footerTd = this.$tableFooter.find('td'); + + this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) { + var $this = $(this); + + $footerTd.eq(i).find('.fht-cell').width($this.innerWidth()); + }); + }; + + BootstrapTable.prototype.toggleColumn = function (index, checked, needUpdate) { + if (index === -1) { + return; + } + this.columns[index].visible = checked; + this.initHeader(); + this.initSearch(); + this.initPagination(); + this.initBody(); + + if (this.options.showColumns) { + var $items = this.$toolbar.find('.keep-open input').prop('disabled', false); + + if (needUpdate) { + $items.filter(sprintf('[value="%s"]', index)).prop('checked', checked); + } + + if ($items.filter(':checked').length <= this.options.minimumCountColumns) { + $items.filter(':checked').prop('disabled', true); + } + } + }; + + BootstrapTable.prototype.toggleRow = function (index, uniqueId, visible) { + if (index === -1) { + return; + } + + this.$body.find(typeof index !== 'undefined' ? + sprintf('tr[data-index="%s"]', index) : + sprintf('tr[data-uniqueid="%s"]', uniqueId)) + [visible ? 'show' : 'hide'](); + }; + + BootstrapTable.prototype.getVisibleFields = function () { + var that = this, + visibleFields = []; + + $.each(this.header.fields, function (j, field) { + var column = that.columns[getFieldIndex(that.columns, field)]; + + if (!column.visible) { + return; + } + visibleFields.push(field); + }); + return visibleFields; + }; + + // PUBLIC FUNCTION DEFINITION + // ======================= + + BootstrapTable.prototype.resetView = function (params) { + var padding = 0; + + if (params && params.height) { + this.options.height = params.height; + } + + this.$selectAll.prop('checked', this.$selectItem.length > 0 && + this.$selectItem.length === this.$selectItem.filter(':checked').length); + + if (this.options.height) { + var toolbarHeight = getRealHeight(this.$toolbar), + paginationHeight = getRealHeight(this.$pagination), + height = this.options.height - toolbarHeight - paginationHeight; + + this.$tableContainer.css('height', height + 'px'); + } + + if (this.options.cardView) { + // remove the element css + this.$el.css('margin-top', '0'); + this.$tableContainer.css('padding-bottom', '0'); + return; + } + + if (this.options.showHeader && this.options.height) { + this.$tableHeader.show(); + this.resetHeader(); + padding += this.$header.outerHeight(); + } else { + this.$tableHeader.hide(); + this.trigger('post-header'); + } + + if (this.options.showFooter) { + this.resetFooter(); + if (this.options.height) { + padding += this.$tableFooter.outerHeight() + 1; + } + } + + // Assign the correct sortable arrow + this.getCaret(); + this.$tableContainer.css('padding-bottom', padding + 'px'); + this.trigger('reset-view'); + }; + + BootstrapTable.prototype.getData = function (useCurrentPage) { + return (this.searchText || !$.isEmptyObject(this.filterColumns) || !$.isEmptyObject(this.filterColumnsPartial)) ? + (useCurrentPage ? this.data.slice(this.pageFrom - 1, this.pageTo) : this.data) : + (useCurrentPage ? this.options.data.slice(this.pageFrom - 1, this.pageTo) : this.options.data); + }; + + BootstrapTable.prototype.load = function (data) { + var fixedScroll = false; + + // #431: support pagination + if (this.options.sidePagination === 'server') { + this.options.totalRows = data.total; + fixedScroll = data.fixedScroll; + data = data[this.options.dataField]; + } else if (!$.isArray(data)) { // support fixedScroll + fixedScroll = data.fixedScroll; + data = data.data; + } + + this.initData(data); + this.initSearch(); + this.initPagination(); + this.initBody(fixedScroll); + }; + + BootstrapTable.prototype.append = function (data) { + this.initData(data, 'append'); + this.initSearch(); + this.initPagination(); + this.initBody(true); + }; + + BootstrapTable.prototype.prepend = function (data) { + this.initData(data, 'prepend'); + this.initSearch(); + this.initPagination(); + this.initBody(true); + }; + + BootstrapTable.prototype.remove = function (params) { + var len = this.options.data.length, + i, row; + + if (!params.hasOwnProperty('field') || !params.hasOwnProperty('values')) { + return; + } + + for (i = len - 1; i >= 0; i--) { + row = this.options.data[i]; + + if (!row.hasOwnProperty(params.field)) { + continue; + } + if ($.inArray(row[params.field], params.values) !== -1) { + this.options.data.splice(i, 1); + } + } + + if (len === this.options.data.length) { + return; + } + + this.initSearch(); + this.initPagination(); + this.initBody(true); + }; + + BootstrapTable.prototype.removeAll = function () { + if (this.options.data.length > 0) { + this.options.data.splice(0, this.options.data.length); + this.initSearch(); + this.initPagination(); + this.initBody(true); + } + }; + + BootstrapTable.prototype.getRowByUniqueId = function (id) { + var uniqueId = this.options.uniqueId, + len = this.options.data.length, + dataRow = null, + i, row, rowUniqueId; + + for (i = len - 1; i >= 0; i--) { + row = this.options.data[i]; + + if (row.hasOwnProperty(uniqueId)) { // uniqueId is a column + rowUniqueId = row[uniqueId]; + } else if(row._data.hasOwnProperty(uniqueId)) { // uniqueId is a row data property + rowUniqueId = row._data[uniqueId]; + } else { + continue; + } + + if (typeof rowUniqueId === 'string') { + id = id.toString(); + } else if (typeof rowUniqueId === 'number') { + if ((Number(rowUniqueId) === rowUniqueId) && (rowUniqueId % 1 === 0)) { + id = parseInt(id); + } else if ((rowUniqueId === Number(rowUniqueId)) && (rowUniqueId !== 0)) { + id = parseFloat(id); + } + } + + if (rowUniqueId === id) { + dataRow = row; + break; + } + } + + return dataRow; + }; + + BootstrapTable.prototype.removeByUniqueId = function (id) { + var len = this.options.data.length, + row = this.getRowByUniqueId(id); + + if (row) { + this.options.data.splice(this.options.data.indexOf(row), 1); + } + + if (len === this.options.data.length) { + return; + } + + this.initSearch(); + this.initPagination(); + this.initBody(true); + }; + + BootstrapTable.prototype.updateByUniqueId = function (params) { + var rowId; + + if (!params.hasOwnProperty('id') || !params.hasOwnProperty('row')) { + return; + } + + rowId = $.inArray(this.getRowByUniqueId(params.id), this.options.data); + + if (rowId === -1) { + return; + } + + $.extend(this.data[rowId], params.row); + this.initSort(); + this.initBody(true); + }; + + BootstrapTable.prototype.insertRow = function (params) { + if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) { + return; + } + this.data.splice(params.index, 0, params.row); + this.initSearch(); + this.initPagination(); + this.initSort(); + this.initBody(true); + }; + + BootstrapTable.prototype.updateRow = function (params) { + if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) { + return; + } + $.extend(this.data[params.index], params.row); + this.initSort(); + this.initBody(true); + }; + + BootstrapTable.prototype.showRow = function (params) { + if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) { + return; + } + this.toggleRow(params.index, params.uniqueId, true); + }; + + BootstrapTable.prototype.hideRow = function (params) { + if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) { + return; + } + this.toggleRow(params.index, params.uniqueId, false); + }; + + BootstrapTable.prototype.getRowsHidden = function (show) { + var rows = $(this.$body[0]).children().filter(':hidden'), + i = 0; + if (show) { + for (; i < rows.length; i++) { + $(rows[i]).show(); + } + } + return rows; + }; + + BootstrapTable.prototype.mergeCells = function (options) { + var row = options.index, + col = $.inArray(options.field, this.getVisibleFields()), + rowspan = options.rowspan || 1, + colspan = options.colspan || 1, + i, j, + $tr = this.$body.find('>tr'), + $td; + + if (this.options.detailView && !this.options.cardView) { + col += 1; + } + + $td = $tr.eq(row).find('>td').eq(col); + + if (row < 0 || col < 0 || row >= this.data.length) { + return; + } + + for (i = row; i < row + rowspan; i++) { + for (j = col; j < col + colspan; j++) { + $tr.eq(i).find('>td').eq(j).hide(); + } + } + + $td.attr('rowspan', rowspan).attr('colspan', colspan).show(); + }; + + BootstrapTable.prototype.updateCell = function (params) { + if (!params.hasOwnProperty('index') || + !params.hasOwnProperty('field') || + !params.hasOwnProperty('value')) { + return; + } + this.data[params.index][params.field] = params.value; + this.initSort(); + this.initBody(true); + }; + + BootstrapTable.prototype.getOptions = function () { + return this.options; + }; + + BootstrapTable.prototype.getSelections = function () { + var that = this; + + return $.grep(this.data, function (row) { + return row[that.header.stateField]; + }); + }; + + BootstrapTable.prototype.getAllSelections = function () { + var that = this; + + return $.grep(this.options.data, function (row) { + return row[that.header.stateField]; + }); + }; + + BootstrapTable.prototype.checkAll = function () { + this.checkAll_(true); + }; + + BootstrapTable.prototype.uncheckAll = function () { + this.checkAll_(false); + }; + + BootstrapTable.prototype.checkAll_ = function (checked) { + var rows; + if (!checked) { + rows = this.getSelections(); + } + this.$selectAll.add(this.$selectAll_).prop('checked', checked); + this.$selectItem.filter(':enabled').prop('checked', checked); + this.updateRows(); + if (checked) { + rows = this.getSelections(); + } + this.trigger(checked ? 'check-all' : 'uncheck-all', rows); + }; + + BootstrapTable.prototype.check = function (index) { + this.check_(true, index); + }; + + BootstrapTable.prototype.uncheck = function (index) { + this.check_(false, index); + }; + + BootstrapTable.prototype.check_ = function (checked, index) { + var $el = this.$selectItem.filter(sprintf('[data-index="%s"]', index)).prop('checked', checked); + this.data[index][this.header.stateField] = checked; + this.updateSelected(); + this.trigger(checked ? 'check' : 'uncheck', this.data[index], $el); + }; + + BootstrapTable.prototype.checkBy = function (obj) { + this.checkBy_(true, obj); + }; + + BootstrapTable.prototype.uncheckBy = function (obj) { + this.checkBy_(false, obj); + }; + + BootstrapTable.prototype.checkBy_ = function (checked, obj) { + if (!obj.hasOwnProperty('field') || !obj.hasOwnProperty('values')) { + return; + } + + var that = this, + rows = []; + $.each(this.options.data, function (index, row) { + if (!row.hasOwnProperty(obj.field)) { + return false; + } + if ($.inArray(row[obj.field], obj.values) !== -1) { + var $el = that.$selectItem.filter(':enabled') + .filter(sprintf('[data-index="%s"]', index)).prop('checked', checked); + row[that.header.stateField] = checked; + rows.push(row); + that.trigger(checked ? 'check' : 'uncheck', row, $el); + } + }); + this.updateSelected(); + this.trigger(checked ? 'check-some' : 'uncheck-some', rows); + }; + + BootstrapTable.prototype.destroy = function () { + this.$el.insertBefore(this.$container); + $(this.options.toolbar).insertBefore(this.$el); + this.$container.next().remove(); + this.$container.remove(); + this.$el.html(this.$el_.html()) + .css('margin-top', '0') + .attr('class', this.$el_.attr('class') || ''); // reset the class + }; + + BootstrapTable.prototype.showLoading = function () { + this.$tableLoading.show(); + }; + + BootstrapTable.prototype.hideLoading = function () { + this.$tableLoading.hide(); + }; + + BootstrapTable.prototype.togglePagination = function () { + this.options.pagination = !this.options.pagination; + var button = this.$toolbar.find('button[name="paginationSwitch"] i'); + if (this.options.pagination) { + button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchDown); + } else { + button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchUp); + } + this.updatePagination(); + }; + + BootstrapTable.prototype.refresh = function (params) { + if (params && params.url) { + this.options.url = params.url; + this.options.pageNumber = 1; + } + this.initServer(params && params.silent, params && params.query); + }; + + BootstrapTable.prototype.resetWidth = function () { + if (this.options.showHeader && this.options.height) { + this.fitHeader(); + } + if (this.options.showFooter) { + this.fitFooter(); + } + }; + + BootstrapTable.prototype.showColumn = function (field) { + this.toggleColumn(getFieldIndex(this.columns, field), true, true); + }; + + BootstrapTable.prototype.hideColumn = function (field) { + this.toggleColumn(getFieldIndex(this.columns, field), false, true); + }; + + BootstrapTable.prototype.getHiddenColumns = function () { + return $.grep(this.columns, function (column) { + return !column.visible; + }); + }; + + BootstrapTable.prototype.filterBy = function (columns) { + this.filterColumns = $.isEmptyObject(columns) ? {} : columns; + this.options.pageNumber = 1; + this.initSearch(); + this.updatePagination(); + }; + + BootstrapTable.prototype.scrollTo = function (value) { + if (typeof value === 'string') { + value = value === 'bottom' ? this.$tableBody[0].scrollHeight : 0; + } + if (typeof value === 'number') { + this.$tableBody.scrollTop(value); + } + if (typeof value === 'undefined') { + return this.$tableBody.scrollTop(); + } + }; + + BootstrapTable.prototype.getScrollPosition = function () { + return this.scrollTo(); + }; + + BootstrapTable.prototype.selectPage = function (page) { + if (page > 0 && page <= this.options.totalPages) { + this.options.pageNumber = page; + this.updatePagination(); + } + }; + + BootstrapTable.prototype.prevPage = function () { + if (this.options.pageNumber > 1) { + this.options.pageNumber--; + this.updatePagination(); + } + }; + + BootstrapTable.prototype.nextPage = function () { + if (this.options.pageNumber < this.options.totalPages) { + this.options.pageNumber++; + this.updatePagination(); + } + }; + + BootstrapTable.prototype.toggleView = function () { + this.options.cardView = !this.options.cardView; + this.initHeader(); + // Fixed remove toolbar when click cardView button. + //that.initToolbar(); + this.initBody(); + this.trigger('toggle', this.options.cardView); + }; + + BootstrapTable.prototype.refreshOptions = function (options) { + //If the objects are equivalent then avoid the call of destroy / init methods + if (compareObjects(this.options, options, false)) { + return; + } + this.options = $.extend(this.options, options); + this.trigger('refresh-options', this.options); + this.destroy(); + this.init(); + }; + + BootstrapTable.prototype.resetSearch = function (text) { + var $search = this.$toolbar.find('.search input'); + $search.val(text || ''); + this.onSearch({currentTarget: $search}); + }; + + BootstrapTable.prototype.expandRow_ = function (expand, index) { + var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', index)); + if ($tr.next().is('tr.detail-view') === (expand ? false : true)) { + $tr.find('> td > .detail-icon').click(); + } + }; + + BootstrapTable.prototype.expandRow = function (index) { + this.expandRow_(true, index); + }; + + BootstrapTable.prototype.collapseRow = function (index) { + this.expandRow_(false, index); + }; + + BootstrapTable.prototype.expandAllRows = function (isSubTable) { + if (isSubTable) { + var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', 0)), + that = this, + detailIcon = null, + executeInterval = false, + idInterval = -1; + + if (!$tr.next().is('tr.detail-view')) { + $tr.find('> td > .detail-icon').click(); + executeInterval = true; + } else if (!$tr.next().next().is('tr.detail-view')) { + $tr.next().find(".detail-icon").click(); + executeInterval = true; + } + + if (executeInterval) { + try { + idInterval = setInterval(function () { + detailIcon = that.$body.find("tr.detail-view").last().find(".detail-icon"); + if (detailIcon.length > 0) { + detailIcon.click(); + } else { + clearInterval(idInterval); + } + }, 1); + } catch (ex) { + clearInterval(idInterval); + } + } + } else { + var trs = this.$body.children(); + for (var i = 0; i < trs.length; i++) { + this.expandRow_(true, $(trs[i]).data("index")); + } + } + }; + + BootstrapTable.prototype.collapseAllRows = function (isSubTable) { + if (isSubTable) { + this.expandRow_(false, 0); + } else { + var trs = this.$body.children(); + for (var i = 0; i < trs.length; i++) { + this.expandRow_(false, $(trs[i]).data("index")); + } + } + }; + + // BOOTSTRAP TABLE PLUGIN DEFINITION + // ======================= + + var allowedMethods = [ + 'getOptions', + 'getSelections', 'getAllSelections', 'getData', + 'load', 'append', 'prepend', 'remove', 'removeAll', + 'insertRow', 'updateRow', 'updateCell', 'updateByUniqueId', 'removeByUniqueId', + 'getRowByUniqueId', 'showRow', 'hideRow', 'getRowsHidden', + 'mergeCells', + 'checkAll', 'uncheckAll', + 'check', 'uncheck', + 'checkBy', 'uncheckBy', + 'refresh', + 'resetView', + 'resetWidth', + 'destroy', + 'showLoading', 'hideLoading', + 'showColumn', 'hideColumn', 'getHiddenColumns', + 'filterBy', + 'scrollTo', + 'getScrollPosition', + 'selectPage', 'prevPage', 'nextPage', + 'togglePagination', + 'toggleView', + 'refreshOptions', + 'resetSearch', + 'expandRow', 'collapseRow', 'expandAllRows', 'collapseAllRows' + ]; + + $.fn.bootstrapTable = function (option) { + var value, + args = Array.prototype.slice.call(arguments, 1); + + this.each(function () { + var $this = $(this), + data = $this.data('bootstrap.table'), + options = $.extend({}, BootstrapTable.DEFAULTS, $this.data(), + typeof option === 'object' && option); + + if (typeof option === 'string') { + if ($.inArray(option, allowedMethods) < 0) { + throw new Error("Unknown method: " + option); + } + + if (!data) { + return; + } + + value = data[option].apply(data, args); + + if (option === 'destroy') { + $this.removeData('bootstrap.table'); + } + } + + if (!data) { + $this.data('bootstrap.table', (data = new BootstrapTable(this, options))); + } + }); + + return typeof value === 'undefined' ? this : value; + }; + + $.fn.bootstrapTable.Constructor = BootstrapTable; + $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS; + $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS; + $.fn.bootstrapTable.locales = BootstrapTable.LOCALES; + $.fn.bootstrapTable.methods = allowedMethods; + $.fn.bootstrapTable.utils = { + sprintf: sprintf, + getFieldIndex: getFieldIndex, + compareObjects: compareObjects, + calculateObjectValue: calculateObjectValue + }; + + // BOOTSTRAP TABLE INIT + // ======================= + + $(function () { + $('[data-toggle="table"]').bootstrapTable(); + }); + +}(jQuery); diff --git a/admportal/public/javascripts/bootstrap.min.js b/admportal/public/javascripts/bootstrap.min.js new file mode 100644 index 00000000..e79c0651 --- /dev/null +++ b/admportal/public/javascripts/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active"); +d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file diff --git a/admportal/public/javascripts/dataTables.bootstrap.min.js b/admportal/public/javascripts/dataTables.bootstrap.min.js new file mode 100644 index 00000000..7ae847b0 --- /dev/null +++ b/admportal/public/javascripts/dataTables.bootstrap.min.js @@ -0,0 +1,9 @@ +/*! + DataTables Bootstrap 3 integration + ©2011-2015 SpryMedia Ltd - datatables.net/license +*/ +(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,e){a||(a=window);if(!e||!e.fn.dataTable)e=require("datatables.net")(a,e).$;return b(e,a,a.document)}:b(jQuery,window,document)})(function(b,a,e){var d=b.fn.dataTable;b.extend(!0,d.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(d.ext.classes, +{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});d.ext.renderer.pageButton.bootstrap=function(a,h,r,m,j,n){var o=new d.Api(a),s=a.oClasses,k=a.oLanguage.oPaginate,t=a.oLanguage.oAria.paginate||{},f,g,p=0,q=function(d,e){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")}; +l=0;for(h=e.length;l<h;l++)if(c=e[l],b.isArray(c))q(d,c);else{g=f="";switch(c){case "ellipsis":f="…";g="disabled";break;case "first":f=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":f=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":f=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":f=k.sLast;g=c+(j<n-1?"":" disabled");break;default:f=c+1,g=j===c?"active":""}f&&(i=b("<li>",{"class":s.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("<a>",{href:"#", +"aria-controls":a.sTableId,"aria-label":t[c],"data-dt-idx":p,tabindex:a.iTabIndex}).html(f)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(e.activeElement).data("dt-idx")}catch(u){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),m);i&&b(h).find("[data-dt-idx="+i+"]").focus()};d.TableTools&&(b.extend(!0,d.TableTools.classes,{container:"DTTT btn-group",buttons:{normal:"btn btn-default",disabled:"disabled"},collection:{container:"DTTT_dropdown dropdown-menu", +buttons:{normal:"",disabled:"disabled"}},print:{info:"DTTT_print_info"},select:{row:"active"}}),b.extend(!0,d.TableTools.DEFAULTS.oTags,{collection:{container:"ul",button:"li",liner:"a"}}));return d}); diff --git a/admportal/public/javascripts/jquery-2.2.0.min.js b/admportal/public/javascripts/jquery-2.2.0.min.js new file mode 100644 index 00000000..06ac2631 --- /dev/null +++ b/admportal/public/javascripts/jquery-2.2.0.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.2.0 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!k.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=R.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c}catch(e){}O.set(a,b,c); +}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=N.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function W(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&T.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var X=/^(?:checkbox|radio)$/i,Y=/<([\w:-]+)/,Z=/^$|\/(?:java|ecma)script/i,$={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,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return this;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.rnamespace||a.rnamespace.test(g.namespace))&&(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||d,e=c.documentElement,f=c.body,a.pageX=b.clientX+(e&&e.scrollLeft||f&&f.scrollLeft||0)-(e&&e.clientLeft||f&&f.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||f&&f.scrollTop||0)-(e&&e.clientTop||f&&f.clientTop||0)),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ea.test(f)?this.mouseHooks:da.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=d),3===a.target.nodeType&&(a.target=a.target.parentNode),h.filter?h.filter(a,g):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==ia()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===ia()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ga:ha):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:ha,isPropagationStopped:ha,isImmediatePropagationStopped:ha,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ga,a&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ga,a&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ga,a&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),n.fn.extend({on:function(a,b,c,d){return ja(this,a,b,c,d)},one:function(a,b,c,d){return ja(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ha),this.each(function(){n.event.remove(this,a,c,b)})}});var ka=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,la=/<script|<style|<link/i,ma=/checked\s*(?:[^=]|=\s*.checked.)/i,na=/^true\/(.*)/,oa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=wa[0].contentDocument,b.write(),b.close(),c=ya(a,b),wa.detach()),xa[a]=c),c}var Aa=/^margin/,Ba=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ca=function(b){var c=b.ownerDocument.defaultView;return c.opener||(c=a),c.getComputedStyle(b)},Da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Ea=d.documentElement;!function(){var b,c,e,f,g=d.createElement("div"),h=d.createElement("div");if(h.style){h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,g.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",g.appendChild(h);function i(){h.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",h.innerHTML="",Ea.appendChild(g);var d=a.getComputedStyle(h);b="1%"!==d.top,f="2px"===d.marginLeft,c="4px"===d.width,h.style.marginRight="50%",e="4px"===d.marginRight,Ea.removeChild(g)}n.extend(l,{pixelPosition:function(){return i(),b},boxSizingReliable:function(){return null==c&&i(),c},pixelMarginRight:function(){return null==c&&i(),e},reliableMarginLeft:function(){return null==c&&i(),f},reliableMarginRight:function(){var b,c=h.appendChild(d.createElement("div"));return c.style.cssText=h.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",h.style.width="1px",Ea.appendChild(g),b=!parseFloat(a.getComputedStyle(c).marginRight),Ea.removeChild(g),h.removeChild(c),b}})}}();function Fa(a,b,c){var d,e,f,g,h=a.style;return c=c||Ca(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),!l.pixelMarginRight()&&Ba.test(g)&&Aa.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Ga(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Ha=/^(none|table(?!-c[ea]).+)/,Ia={position:"absolute",visibility:"hidden",display:"block"},Ja={letterSpacing:"0",fontWeight:"400"},Ka=["Webkit","O","Moz","ms"],La=d.createElement("div").style;function Ma(a){if(a in La)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ka.length;while(c--)if(a=Ka[c]+b,a in La)return a}function Na(a,b,c){var d=T.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Oa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Pa(b,c,e){var f=!0,g="width"===c?b.offsetWidth:b.offsetHeight,h=Ca(b),i="border-box"===n.css(b,"boxSizing",!1,h);if(d.msFullscreenElement&&a.top!==a&&b.getClientRects().length&&(g=Math.round(100*b.getBoundingClientRect()[c])),0>=g||null==g){if(g=Fa(b,c,h),(0>g||null==g)&&(g=b.style[c]),Ba.test(g))return g;f=i&&(l.boxSizingReliable()||g===b.style[c]),g=parseFloat(g)||0}return g+Oa(b,c,e||(i?"border":"content"),f,h)+"px"}function Qa(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=N.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=N.access(d,"olddisplay",za(d.nodeName)))):(e=V(d),"none"===c&&e||N.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Fa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=T.exec(c))&&e[1]&&(c=W(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Fa(a,b,d)),"normal"===e&&b in Ja&&(e=Ja[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Ha.test(n.css(a,"display"))&&0===a.offsetWidth?Da(a,Ia,function(){return Pa(a,b,d)}):Pa(a,b,d):void 0},set:function(a,c,d){var e,f=d&&Ca(a),g=d&&Oa(a,b,d,"border-box"===n.css(a,"boxSizing",!1,f),f);return g&&(e=T.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=n.css(a,b)),Na(a,c,g)}}}),n.cssHooks.marginLeft=Ga(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Fa(a,"marginLeft"))||a.getBoundingClientRect().left-Da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),n.cssHooks.marginRight=Ga(l.reliableMarginRight,function(a,b){return b?Da(a,{display:"inline-block"},Fa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Aa.test(a)||(n.cssHooks[a+b].set=Na)}),n.fn.extend({css:function(a,b){return K(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ca(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Qa(this,!0)},hide:function(){return Qa(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function Ra(a,b,c,d,e){return new Ra.prototype.init(a,b,c,d,e)}n.Tween=Ra,Ra.prototype={constructor:Ra,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ra.propHooks[this.prop];return a&&a.get?a.get(this):Ra.propHooks._default.get(this)},run:function(a){var b,c=Ra.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ra.propHooks._default.set(this),this}},Ra.prototype.init.prototype=Ra.prototype,Ra.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},Ra.propHooks.scrollTop=Ra.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=Ra.prototype.init,n.fx.step={};var Sa,Ta,Ua=/^(?:toggle|show|hide)$/,Va=/queueHooks$/;function Wa(){return a.setTimeout(function(){Sa=void 0}),Sa=n.now()}function Xa(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=U[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ya(a,b,c){for(var d,e=(_a.tweeners[b]||[]).concat(_a.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Za(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&V(a),q=N.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?N.get(a,"olddisplay")||za(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Ua.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?za(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=N.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;N.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ya(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function $a(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function _a(a,b,c){var d,e,f=0,g=_a.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Sa||Wa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:Sa||Wa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for($a(k,j.opts.specialEasing);g>f;f++)if(d=_a.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,Ya,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(_a,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return W(c.elem,a,T.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],_a.tweeners[c]=_a.tweeners[c]||[],_a.tweeners[c].unshift(b)},prefilters:[Za],prefilter:function(a,b){b?_a.prefilters.unshift(a):_a.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=_a(this,n.extend({},a),f);(e||N.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=N.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Va.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=N.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Xa(b,!0),a,d,e)}}),n.each({slideDown:Xa("show"),slideUp:Xa("hide"),slideToggle:Xa("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Sa=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Sa=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ta||(Ta=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(Ta),Ta=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",l.checkOn=""!==a.value,l.optSelected=c.selected,b.disabled=!0,l.optDisabled=!c.disabled,a=d.createElement("input"),a.value="t",a.type="radio",l.radioValue="t"===a.value}();var ab,bb=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return K(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ab:void 0)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)}}),ab={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=bb[b]||n.find.attr;bb[b]=function(a,b,d){var e,f;return d||(f=bb[b],bb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,bb[b]=f),e}});var cb=/^(?:input|select|textarea|button)$/i,db=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return K(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]; +},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):cb.test(a.nodeName)||db.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var eb=/[\t\r\n\f]/g;function fb(a){return a.getAttribute&&a.getAttribute("class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,fb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,fb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,fb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(void 0===a||"boolean"===c)&&(b=fb(this),b&&N.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":N.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+fb(c)+" ").replace(eb," ").indexOf(b)>-1)return!0;return!1}});var gb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(gb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){return n.trim(a.value)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(n.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var hb=/^(?:focusinfocus|focusoutblur)$/;n.extend(n.event,{trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!hb.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),l=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},f||!o.trigger||o.trigger.apply(e,c)!==!1)){if(!f&&!o.noBubble&&!n.isWindow(e)){for(j=o.delegateType||q,hb.test(j+q)||(h=h.parentNode);h;h=h.parentNode)p.push(h),i=h;i===(e.ownerDocument||d)&&p.push(i.defaultView||i.parentWindow||a)}g=0;while((h=p[g++])&&!b.isPropagationStopped())b.type=g>1?j:o.bindType||q,m=(N.get(h,"events")||{})[b.type]&&N.get(h,"handle"),m&&m.apply(h,c),m=l&&h[l],m&&m.apply&&L(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=q,f||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!L(e)||l&&n.isFunction(e[q])&&!n.isWindow(e)&&(i=e[l],i&&(e[l]=null),n.event.triggered=q,e[q](),n.event.triggered=void 0,i&&(e[l]=i)),b.result}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}}),n.fn.extend({trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),l.focusin="onfocusin"in a,l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=N.access(d,b);e||d.addEventListener(a,c,!0),N.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=N.access(d,b)-1;e?N.access(d,b,e):(d.removeEventListener(a,c,!0),N.remove(d,b))}}});var ib=a.location,jb=n.now(),kb=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return(!c||c.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+b),c};var lb=/#.*$/,mb=/([?&])_=[^&]*/,nb=/^(.*?):[ \t]*([^\r\n]*)$/gm,ob=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,pb=/^(?:GET|HEAD)$/,qb=/^\/\//,rb={},sb={},tb="*/".concat("*"),ub=d.createElement("a");ub.href=ib.href;function vb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function wb(a,b,c,d){var e={},f=a===sb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function xb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function yb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function zb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ib.href,type:"GET",isLocal:ob.test(ib.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":tb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?xb(xb(a,n.ajaxSettings),b):xb(n.ajaxSettings,a)},ajaxPrefilter:vb(rb),ajaxTransport:vb(sb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m=n.ajaxSetup({},c),o=m.context||m,p=m.context&&(o.nodeType||o.jquery)?n(o):n.event,q=n.Deferred(),r=n.Callbacks("once memory"),s=m.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,getResponseHeader:function(a){var b;if(2===v){if(!h){h={};while(b=nb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===v?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return v||(a=u[c]=u[c]||a,t[a]=b),this},overrideMimeType:function(a){return v||(m.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>v)for(b in a)s[b]=[s[b],a[b]];else x.always(a[x.status]);return this},abort:function(a){var b=a||w;return e&&e.abort(b),z(0,b),this}};if(q.promise(x).complete=r.add,x.success=x.done,x.error=x.fail,m.url=((b||m.url||ib.href)+"").replace(lb,"").replace(qb,ib.protocol+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=n.trim(m.dataType||"*").toLowerCase().match(G)||[""],null==m.crossDomain){j=d.createElement("a");try{j.href=m.url,j.href=j.href,m.crossDomain=ub.protocol+"//"+ub.host!=j.protocol+"//"+j.host}catch(y){m.crossDomain=!0}}if(m.data&&m.processData&&"string"!=typeof m.data&&(m.data=n.param(m.data,m.traditional)),wb(rb,m,c,x),2===v)return x;k=n.event&&m.global,k&&0===n.active++&&n.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!pb.test(m.type),f=m.url,m.hasContent||(m.data&&(f=m.url+=(kb.test(f)?"&":"?")+m.data,delete m.data),m.cache===!1&&(m.url=mb.test(f)?f.replace(mb,"$1_="+jb++):f+(kb.test(f)?"&":"?")+"_="+jb++)),m.ifModified&&(n.lastModified[f]&&x.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&x.setRequestHeader("If-None-Match",n.etag[f])),(m.data&&m.hasContent&&m.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",m.contentType),x.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+tb+"; q=0.01":""):m.accepts["*"]);for(l in m.headers)x.setRequestHeader(l,m.headers[l]);if(m.beforeSend&&(m.beforeSend.call(o,x,m)===!1||2===v))return x.abort();w="abort";for(l in{success:1,error:1,complete:1})x[l](m[l]);if(e=wb(sb,m,c,x)){if(x.readyState=1,k&&p.trigger("ajaxSend",[x,m]),2===v)return x;m.async&&m.timeout>0&&(i=a.setTimeout(function(){x.abort("timeout")},m.timeout));try{v=1,e.send(t,z)}catch(y){if(!(2>v))throw y;z(-1,y)}}else z(-1,"No Transport");function z(b,c,d,h){var j,l,t,u,w,y=c;2!==v&&(v=2,i&&a.clearTimeout(i),e=void 0,g=h||"",x.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(u=yb(m,x,d)),u=zb(m,u,x,j),j?(m.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(n.lastModified[f]=w),w=x.getResponseHeader("etag"),w&&(n.etag[f]=w)),204===b||"HEAD"===m.type?y="nocontent":304===b?y="notmodified":(y=u.state,l=u.data,t=u.error,j=!t)):(t=y,(b||!y)&&(y="error",0>b&&(b=0))),x.status=b,x.statusText=(c||y)+"",j?q.resolveWith(o,[l,y,x]):q.rejectWith(o,[x,y,t]),x.statusCode(s),s=void 0,k&&p.trigger(j?"ajaxSuccess":"ajaxError",[x,m,j?l:t]),r.fireWith(o,[x,y]),k&&(p.trigger("ajaxComplete",[x,m]),--n.active||n.event.trigger("ajaxStop")))}return x},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return!n.expr.filters.visible(a)},n.expr.filters.visible=function(a){return a.offsetWidth>0||a.offsetHeight>0||a.getClientRects().length>0};var Ab=/%20/g,Bb=/\[\]$/,Cb=/\r?\n/g,Db=/^(?:submit|button|image|reset|file)$/i,Eb=/^(?:input|select|textarea|keygen)/i;function Fb(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Bb.test(a)?d(a,e):Fb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Fb(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Fb(c,a[c],b,e);return d.join("&").replace(Ab,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Eb.test(this.nodeName)&&!Db.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Cb,"\r\n")}}):{name:b.name,value:c.replace(Cb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Gb={0:200,1223:204},Hb=n.ajaxSettings.xhr();l.cors=!!Hb&&"withCredentials"in Hb,l.ajax=Hb=!!Hb,n.ajaxTransport(function(b){var c,d;return l.cors||Hb&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Gb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=n("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Ib=[],Jb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Ib.pop()||n.expando+"_"+jb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Jb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Jb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Jb,"$1"+e):b.jsonp!==!1&&(b.url+=(kb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Ib.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),l.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||(l.createHTMLDocument?d.implementation.createHTMLDocument(""):d);var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ca([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var Kb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Kb)return Kb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(g,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function Lb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(e=d.getBoundingClientRect(),c=Lb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0)-a.scrollTop(),d.left+=n.css(a[0],"borderLeftWidth",!0)-a.scrollLeft()),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ea})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;n.fn[a]=function(d){return K(this,function(a,d,e){var f=Lb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ga(l.pixelPosition,function(a,c){return c?(c=Fa(a,b),Ba.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return K(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)},size:function(){return this.length}}),n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Mb=a.jQuery,Nb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Nb),b&&a.jQuery===n&&(a.jQuery=Mb),n},b||(a.jQuery=a.$=n),n}); diff --git a/admportal/public/javascripts/jquery.dataTables.min.js b/admportal/public/javascripts/jquery.dataTables.min.js new file mode 100644 index 00000000..d8778045 --- /dev/null +++ b/admportal/public/javascripts/jquery.dataTables.min.js @@ -0,0 +1,164 @@ +/*! + DataTables 1.10.10 + ©2008-2015 SpryMedia Ltd - datatables.net/license +*/ +(function(h){"function"===typeof define&&define.amd?define(["jquery"],function(E){return h(E,window,document)}):"object"===typeof exports?module.exports=function(E,H){E||(E=window);H||(H="undefined"!==typeof window?require("jquery"):require("jquery")(E));return h(H,E,E.document)}:h(jQuery,window,document)})(function(h,E,H,k){function Y(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()), +d[c]=e,"o"===b[1]&&Y(a[e])});a._hungarianMap=d}function J(a,b,c){a._hungarianMap||Y(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==k&&(c||b[d]===k))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),J(a[d],b[d],c)):b[d]=b[e]})}function Fa(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&F(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&F(a,a,"sZeroRecords","sLoadingRecords"); +a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&db(a)}function eb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":"");"boolean"===typeof a.scrollX&&(a.scrollX= +a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&J(m.models.oSearch,a[b])}function fb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;b&&!h.isArray(b)&&(a.aDataSort=[b])}function gb(a){if(!m.__browser){var b={};m.__browser=b;var c=h("<div/>").css({position:"fixed",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",top:1,left:1, +width:100,overflow:"scroll"}).append(h("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,m.__browser);a.oScroll.iBarWidth=m.__browser.barWidth}function hb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==e;)a.hasOwnProperty(d)&& +(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Ga(a,b){var c=m.defaults.column,d=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:H.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},m.models.oSearch,c[d]);la(a,d,h(b).data())}function la(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var f= +(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(fb(c),J(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),F(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),F(b,c,"aDataSort"));var g=b.mData,j=Q(g),i=b.mRender?Q(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&& +(c(g.sort)||c(g.type)||c(g.filter));b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return R(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass= +d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function U(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ha(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&Z(a);v(a,null,"column-sizing",[a])}function $(a,b){var c=aa(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function ba(a,b){var c=aa(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}function ca(a){return aa(a, +"bVisible").length}function aa(a,b){var c=[];h.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Ia(a){var b=a.aoColumns,c=a.aoData,d=m.ext.type.detect,e,f,g,j,i,h,l,q,u;e=0;for(f=b.length;e<f;e++)if(l=b[e],u=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=d.length;g<j;g++){i=0;for(h=c.length;i<h;i++){u[i]===k&&(u[i]=B(a,i,e,"type"));q=d[g](u[i],a);if(!q&&g!==d.length-1)break;if("html"===q)break}if(q){l.sType=q;break}}l.sType||(l.sType="string")}}function ib(a, +b,c,d){var e,f,g,j,i,o,l=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){o=b[e];var q=o.targets!==k?o.targets:o.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f<g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Ga(a);d(q[f],o)}else if("number"===typeof q[f]&&0>q[f])d(l.length+q[f],o);else if("string"===typeof q[f]){j=0;for(i=l.length;j<i;j++)("_all"==q[f]||h(l[j].nTh).hasClass(q[f]))&&d(j,o)}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}function N(a,b,c,d){var e=a.aoData.length,f=h.extend(!0, +{},m.models.oRow,{src:c?"dom":"data",idx:e});f._aData=b;a.aoData.push(f);for(var g=a.aoColumns,j=0,i=g.length;j<i;j++)g[j].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==k&&(a.aIds[b]=f);(c||!a.oFeatures.bDeferRender)&&Ja(a,e,c,d);return e}function ma(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,e){c=Ka(a,e);return N(a,c.data,e,c.cells)})}function B(a,b,c,d){var e=a.iDraw,f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,i=f.fnGetData(g,d,{settings:a,row:b,col:c}); +if(i===k)return a.iDrawError!=e&&null===j&&(K(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),j;if((i===g||null===i)&&null!==j)i=j;else if("function"===typeof i)return i.call(g);return null===i&&"display"==d?"":i}function jb(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d,{settings:a,row:b,col:c})}function La(a){return h.map(a.match(/(\\.|[^\.])+/g)||[""],function(a){return a.replace(/\\./g,".")})}function Q(a){if(h.isPlainObject(a)){var b= +{};h.each(a,function(a,c){c&&(b[a]=Q(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==k?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var g,j;if(""!==f){j=La(f);for(var i=0,o=j.length;i<o;i++){f=j[i].match(da);g=j[i].match(V);if(f){j[i]=j[i].replace(da,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j= +j.join(".");if(h.isArray(a)){i=0;for(o=a.length;i<o;i++)g.push(c(a[i],b,j))}a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(V,"");a=a[j[i]]();continue}if(null===a||a[j[i]]===k)return k;a=a[j[i]]}}return a};return function(b,e){return c(b,e,a)}}return function(b){return b[a]}}function R(a){if(h.isPlainObject(a))return R(a._);if(null===a)return function(){};if("function"===typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"===typeof a&&(-1!==a.indexOf(".")|| +-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,d,e){var e=La(e),f;f=e[e.length-1];for(var g,j,i=0,o=e.length-1;i<o;i++){g=e[i].match(da);j=e[i].match(V);if(g){e[i]=e[i].replace(da,"");a[e[i]]=[];f=e.slice();f.splice(0,i+1);g=f.join(".");if(h.isArray(d)){j=0;for(o=d.length;j<o;j++)f={},b(f,d[j],g),a[e[i]].push(f)}else a[e[i]]=d;return}j&&(e[i]=e[i].replace(V,""),a=a[e[i]](d));if(null===a[e[i]]||a[e[i]]===k)a[e[i]]={};a=a[e[i]]}if(f.match(V))a[f.replace(V,"")](d);else a[f.replace(da,"")]= +d};return function(c,d){return b(c,d,a)}}return function(b,d){b[a]=d}}function Ma(a){return D(a.aoData,"_aData")}function na(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function oa(a,b,c){for(var d=-1,e=0,f=a.length;e<f;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===k&&a.splice(d,1)}function ea(a,b,c,d){var e=a.aoData[b],f,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData= +Ka(a,e,d,d===k?k:e._aData).data;else{var j=e.anCells;if(j)if(d!==k)g(j[d],d);else{c=0;for(f=j.length;c<f;c++)g(j[c],c)}}e._aSortData=null;e._aFilterData=null;g=a.aoColumns;if(d!==k)g[d].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null;Na(a,e)}}function Ka(a,b,c,d){var e=[],f=b.firstChild,g,j,i=0,o,l=a.aoColumns,q=a._rowReadObject,d=d!==k?d:q?{}:[],u=function(a,b){if("string"===typeof a){var c=a.indexOf("@");-1!==c&&(c=a.substring(c+1),R(a)(d,b.getAttribute(c)))}},S=function(a){if(c===k|| +c===i)j=l[i],o=h.trim(a.innerHTML),j&&j._bAttrSrc?(R(j.mData._)(d,o),u(j.mData.sort,a),u(j.mData.type,a),u(j.mData.filter,a)):q?(j._setter||(j._setter=R(j.mData)),j._setter(d,o)):d[i]=o;i++};if(f)for(;f;){g=f.nodeName.toUpperCase();if("TD"==g||"TH"==g)S(f),e.push(f);f=f.nextSibling}else{e=b.anCells;f=0;for(g=e.length;f<g;f++)S(e[f])}if(b=b.firstChild?b:b.nTr)(b=b.getAttribute("id"))&&R(a.rowId)(d,b);return{data:d,cells:e}}function Ja(a,b,c,d){var e=a.aoData[b],f=e._aData,g=[],j,i,h,l,q;if(null=== +e.nTr){j=c||H.createElement("tr");e.nTr=j;e.anCells=g;j._DT_RowIndex=b;Na(a,e);l=0;for(q=a.aoColumns.length;l<q;l++){h=a.aoColumns[l];i=c?d[l]:H.createElement(h.sCellType);i._DT_CellIndex={row:b,column:l};g.push(i);if(!c||h.mRender||h.mData!==l)i.innerHTML=B(a,b,l,"display");h.sClass&&(i.className+=" "+h.sClass);h.bVisible&&!c?j.appendChild(i):!h.bVisible&&c&&i.parentNode.removeChild(i);h.fnCreatedCell&&h.fnCreatedCell.call(a.oInstance,i,B(a,b,l),f,b,l)}v(a,"aoRowCreatedCallback",null,[j,f,b])}e.nTr.setAttribute("role", +"row")}function Na(a,b){var c=b.nTr,d=b._aData;if(c){var e=a.rowIdFn(d);e&&(c.id=e);d.DT_RowClass&&(e=d.DT_RowClass.split(" "),b.__rowc=b.__rowc?pa(b.__rowc.concat(e)):e,h(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&h(c).attr(d.DT_RowAttr);d.DT_RowData&&h(c).data(d.DT_RowData)}}function kb(a){var b,c,d,e,f,g=a.nTHead,j=a.nTFoot,i=0===h("th, td",g).length,o=a.oClasses,l=a.aoColumns;i&&(e=h("<tr/>").appendTo(g));b=0;for(c=l.length;b<c;b++)f=l[b],d=h(f.nTh).addClass(f.sClass), +i&&d.appendTo(e),a.oFeatures.bSort&&(d.addClass(f.sSortingClass),!1!==f.bSortable&&(d.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Oa(a,f.nTh,b))),f.sTitle!=d[0].innerHTML&&d.html(f.sTitle),Pa(a,"header")(a,d,f,o);i&&fa(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(o.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(o.sFooterTH);if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}} +function ga(a,b,c){var d,e,f,g=[],j=[],i=a.aoColumns.length,o;if(b){c===k&&(c=!1);d=0;for(e=b.length;d<e;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[d].splice(f,1);j.push([])}d=0;for(e=g.length;d<e;d++){if(a=g[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[d].length;f<b;f++)if(o=i=1,j[d][f]===k){a.appendChild(g[d][f].cell);for(j[d][f]=1;g[d+i]!==k&&g[d][f].cell==g[d+i][f].cell;)j[d+i][f]=1,i++;for(;g[d][f+o]!==k&&g[d][f].cell==g[d][f+o].cell;){for(c= +0;c<i;c++)j[d+c][f+o]=1;o++}h(g[d][f].cell).attr("rowspan",i).attr("colspan",o)}}}}function O(a){var b=v(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))C(a,!1);else{var b=[],c=0,d=a.asStripeClasses,e=d.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==y(a),i=a.aiDisplay;a.bDrawing=!0;g!==k&&-1!==g&&(a._iDisplayStart=j?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);var g=a._iDisplayStart,o=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&& +!lb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:o;for(j=j?0:g;j<f;j++){var l=i[j],q=a.aoData[l];null===q.nTr&&Ja(a,l);l=q.nTr;if(0!==e){var u=d[c%e];q._sRowStripe!=u&&(h(l).removeClass(q._sRowStripe).addClass(u),q._sRowStripe=u)}v(a,"aoRowCallback",null,[l,q._aData,c,j]);b.push(l);c++}}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==y(a)?c=f.sLoadingRecords:f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":e?d[0]:""}).append(h("<td />",{valign:"top",colSpan:ca(a), +"class":a.oClasses.sRowEmpty}).html(c))[0];v(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ma(a),g,o,i]);v(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ma(a),g,o,i]);d=h(a.nTBody);d.children().detach();d.append(h(b));v(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function T(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&mb(a);d?ha(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;O(a);a._drawHold= +!1}function nb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),d=a.oFeatures,e=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,o,l,q,u=0;u<f.length;u++){g=null;j=f[u];if("<"==j){i=h("<div/>")[0];o=f[u+1];if("'"==o||'"'==o){l="";for(q=2;f[u+q]!=o;)l+=f[u+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(o=l.split("."), +i.id=o[0].substr(1,o[0].length-1),i.className=o[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;u+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=ob(a);else if("f"==j&&d.bFilter)g=pb(a);else if("r"==j&&d.bProcessing)g=qb(a);else if("t"==j)g=rb(a);else if("i"==j&&d.bInfo)g=sb(a);else if("p"==j&&d.bPaginate)g=tb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(o=i.length;q<o;q++)if(j==i[q].cFeature){g=i[q].fnInit(a);break}}g&& +(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),e.append(g))}c.replaceWith(e);a.nHolding=null}function fa(a,b){var c=h(b).children("tr"),d,e,f,g,j,i,o,l,q,u;a.splice(0,a.length);f=0;for(i=c.length;f<i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){d=c[f];for(e=d.firstChild;e;){if("TD"==e.nodeName.toUpperCase()||"TH"==e.nodeName.toUpperCase()){l=1*e.getAttribute("colspan");q=1*e.getAttribute("rowspan");l=!l||0===l||1===l?1:l;q=!q||0===q||1===q?1:q;g=0;for(j=a[f];j[g];)g++;o=g;u=1===l?!0:!1;for(j=0;j<l;j++)for(g= +0;g<q;g++)a[f+g][o+j]={cell:e,unique:u},a[f+g].nTr=d}e=e.nextSibling}}}function qa(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],fa(c,b)));for(var b=0,e=c.length;b<e;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function ra(a,b,c){v(a,"aoServerParams","serverParams",[b]);if(b&&h.isArray(b)){var d={},e=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(e);c?(c=c[0],d[c]||(d[c]=[]),d[c].push(b.value)):d[b.name]=b.value});b=d}var f,g=a.ajax, +j=a.oInstance,i=function(b){v(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var o=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&o?o:h.extend(!0,b,o);delete g.data}o={data:b,success:function(b){var c=b.error||b.sError;c&&K(a,0,c);a.json=b;i(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c){var d=v(a,null,"xhr",[a,null,a.jqXHR]);-1===h.inArray(!0,d)&&("parsererror"==c?K(a,0,"Invalid JSON response",1):4===b.readyState&&K(a,0,"Ajax error",7));C(a,!1)}};a.oAjaxData= +b;v(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),i,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(o,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(o,g)),g.data=f)}function lb(a){return a.bAjaxDataGet?(a.iDraw++,C(a,!0),ra(a,ub(a),function(b){vb(a,b)}),!1):!0}function ub(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,o, +l,q=W(a);g=a._iDisplayStart;i=!1!==d.bPaginate?a._iDisplayLength:-1;var k=function(a,b){j.push({name:a,value:b})};k("sEcho",a.iDraw);k("iColumns",c);k("sColumns",D(b,"sName").join(","));k("iDisplayStart",g);k("iDisplayLength",i);var S={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:e.sSearch,regex:e.bRegex}};for(g=0;g<c;g++)o=b[g],l=f[g],i="function"==typeof o.mData?"function":o.mData,S.columns.push({data:i,name:o.sName,searchable:o.bSearchable,orderable:o.bSortable,search:{value:l.sSearch, +regex:l.bRegex}}),k("mDataProp_"+g,i),d.bFilter&&(k("sSearch_"+g,l.sSearch),k("bRegex_"+g,l.bRegex),k("bSearchable_"+g,o.bSearchable)),d.bSort&&k("bSortable_"+g,o.bSortable);d.bFilter&&(k("sSearch",e.sSearch),k("bRegex",e.bRegex));d.bSort&&(h.each(q,function(a,b){S.order.push({column:b.col,dir:b.dir});k("iSortCol_"+a,b.col);k("sSortDir_"+a,b.dir)}),k("iSortingCols",q.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:S:b?j:S}function vb(a,b){var c=sa(a,b),d=b.sEcho!==k?b.sEcho:b.draw,e= +b.iTotalRecords!==k?b.iTotalRecords:b.recordsTotal,f=b.iTotalDisplayRecords!==k?b.iTotalDisplayRecords:b.recordsFiltered;if(d){if(1*d<a.iDraw)return;a.iDraw=1*d}na(a);a._iRecordsTotal=parseInt(e,10);a._iRecordsDisplay=parseInt(f,10);d=0;for(e=c.length;d<e;d++)N(a,c[d]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;O(a);a._bInitComplete||ta(a,b);a.bAjaxDataGet=!0;C(a,!1)}function sa(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==k?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData|| +b[c]:""!==c?Q(c)(b):b}function pb(a){var b=a.oClasses,c=a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),f=function(){var b=!this.value?"":this.value;b!=e.sSearch&&(ha(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,O(a))},g=null!== +a.searchDelay?a.searchDelay:"ssp"===y(a)?400:0,i=h("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).bind("keyup.DT search.DT input.DT paste.DT cut.DT",g?ua(f,g):f).bind("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==H.activeElement&&i.val(e.sSearch)}catch(d){}});return b[0]}function ha(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex; +d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};Ia(a);if("ssp"!=y(a)){wb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)xb(a,e[b].sSearch,b,e[b].bEscapeRegex!==k?!e[b].bEscapeRegex:e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);yb(a)}else f(b);a.bFiltered=!0;v(a,null,"search",[a])}function yb(a){for(var b=m.ext.search,c=a.aiDisplay,d,e,f=0,g=b.length;f<g;f++){for(var j=[],i=0,o=c.length;i<o;i++)e=c[i],d=a.aoData[e],b[f](a, +d._aFilterData,e,d._aData,i)&&j.push(e);c.length=0;h.merge(c,j)}}function xb(a,b,c,d,e,f){if(""!==b)for(var g=a.aiDisplay,d=Qa(b,d,e,f),e=g.length-1;0<=e;e--)b=a.aoData[g[e]]._aFilterData[c],d.test(b)||g.splice(e,1)}function wb(a,b,c,d,e,f){var d=Qa(b,d,e,f),e=a.oPreviousSearch.sSearch,f=a.aiDisplayMaster,g;0!==m.ext.search.length&&(c=!0);g=zb(a);if(0>=b.length)a.aiDisplay=f.slice();else{if(g||c||e.length>b.length||0!==b.indexOf(e)||a.bSorted)a.aiDisplay=f.slice();b=a.aiDisplay;for(c=b.length-1;0<= +c;c--)d.test(a.aoData[b[c]]._sFilterRow)||b.splice(c,1)}}function Qa(a,b,c,d){a=b?a:va(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,d?"i":"")}function va(a){return a.replace(Yb,"\\$1")}function zb(a){var b=a.aoColumns,c,d,e,f,g,j,i,h,l=m.ext.type.search;c=!1;d=0;for(f=a.aoData.length;d<f;d++)if(h=a.aoData[d],!h._aFilterData){j=[];e=0;for(g=b.length;e< +g;e++)c=b[e],c.bSearchable?(i=B(a,d,e,"filter"),l[c.sType]&&(i=l[c.sType](i)),null===i&&(i=""),"string"!==typeof i&&i.toString&&(i=i.toString())):i="",i.indexOf&&-1!==i.indexOf("&")&&(wa.innerHTML=i,i=Zb?wa.textContent:wa.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join(" ");c=!0}return c}function Ab(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function Bb(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex, +bCaseInsensitive:a.caseInsensitive}}function sb(a){var b=a.sTableId,c=a.aanFeatures.i,d=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Cb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Cb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&& +(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Db(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Db(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/ +e)))}function ia(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;var g=a.bDeferLoading;if(a.bInitialised){nb(a);kb(a);ga(a,a.aoHeader);ga(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ha(a);b=0;for(c=e.length;b<c;b++)f=e[b],f.sWidth&&(f.nTh.style.width=w(f.sWidth));v(a,null,"preInit",[a]);T(a);e=y(a);if("ssp"!=e||g)"ajax"==e?ra(a,[],function(c){var f=sa(a,c);for(b=0;b<f.length;b++)N(a,f[b]);a.iInitDisplayStart=d;T(a);C(a,!1);ta(a,c)},a):(C(a,!1),ta(a))}else setTimeout(function(){ia(a)},200)} +function ta(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&U(a);v(a,null,"plugin-init",[a,b]);v(a,"aoInitComplete","init",[a,b])}function Ra(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Sa(a);v(a,null,"length",[a,c])}function ob(a){for(var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=h.isArray(d[0]),f=e?d[0]:d,d=e?d[1]:d,e=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g<j;g++)e[0][g]=new Option(d[g],f[g]);var i=h("<div><label/></div>").addClass(b.sLength); +a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).bind("change.DT",function(){Ra(a,h(this).val());O(a)});h(a.nTable).bind("length.dt.DT",function(b,c,d){a===c&&h("select",i).val(d)});return i[0]}function tb(a){var b=a.sPaginationType,c=m.ext.pager[b],d="function"===typeof c,e=function(a){O(a)},b=h("<div/>").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+ +"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),k,l=0;for(k=f.p.length;l<k;l++)Pa(a,"pageButton")(a,f.p[l],l,h,b,i)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Ta(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===e?d=0:"number"===typeof b?(d=b*e,d>f&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"== +b?d+e<f&&(d+=e):"last"==b?d=Math.floor((f-1)/e)*e:K(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==d;a._iDisplayStart=d;b&&(v(a,null,"page",[a]),c&&O(a));return b}function qb(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");v(a,null,"processing",[a,b])}function rb(a){var b=h(a.nTable);b.attr("role", +"grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),o=h(b[0].cloneNode(!1)),l=b.children("tfoot");l.length||(l=null);i=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:w(d):"100%"}).append(h("<div/>",{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner|| +"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("<div/>",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:w(d)}).append(b));l&&i.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:w(d):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(o.removeAttr("id").css("margin-left",0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=i.children(), +k=b[0],f=b[1],u=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(u.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=u;a.aoDrawCallback.push({fn:Z,sName:"scrolling"});return i[0]}function Z(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth,f=h(a.nScrollHead),g=f[0].style,j=f.children("div"),i=j[0].style,o=j.children("table"),j=a.nScrollBody,l=h(j),q=j.style,u=h(a.nScrollFoot).children("div"), +m=u.children("table"),n=h(a.nTHead),p=h(a.nTable),t=p[0],v=t.style,r=a.nTFoot?h(a.nTFoot):null,Eb=a.oBrowser,Ua=Eb.bScrollOversize,s,L,P,x,y=[],z=[],A=[],B,C=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};L=j.scrollHeight>j.clientHeight;if(a.scrollBarVis!==L&&a.scrollBarVis!==k)a.scrollBarVis=L,U(a);else{a.scrollBarVis=L;p.children("thead, tfoot").remove();x=n.clone().prependTo(p);n=n.find("tr");L=x.find("tr");x.find("th, td").removeAttr("tabindex"); +r&&(P=r.clone().prependTo(p),s=r.find("tr"),P=P.find("tr"));c||(q.width="100%",f[0].style.width="100%");h.each(qa(a,x),function(b,c){B=$(a,b);c.style.width=a.aoColumns[B].sWidth});r&&I(function(a){a.style.width=""},P);f=p.outerWidth();if(""===c){v.width="100%";if(Ua&&(p.find("tbody").height()>j.offsetHeight||"scroll"==l.css("overflow-y")))v.width=w(p.outerWidth()-b);f=p.outerWidth()}else""!==d&&(v.width=w(d),f=p.outerWidth());I(C,L);I(function(a){A.push(a.innerHTML);y.push(w(h(a).css("width")))}, +L);I(function(a,b){a.style.width=y[b]},n);h(L).height(0);r&&(I(C,P),I(function(a){z.push(w(h(a).css("width")))},P),I(function(a,b){a.style.width=z[b]},s),h(P).height(0));I(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+A[b]+"</div>";a.style.width=y[b]},L);r&&I(function(a,b){a.innerHTML="";a.style.width=z[b]},P);if(p.outerWidth()<f){s=j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(Ua&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))v.width= +w(s-b);(""===c||""!==d)&&K(a,1,"Possible column misalignment",6)}else s="100%";q.width=w(s);g.width=w(s);r&&(a.nScrollFoot.style.width=w(s));!e&&Ua&&(q.height=w(t.offsetHeight+b));c=p.outerWidth();o[0].style.width=w(c);i.width=w(c);d=p.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+(Eb.bScrollbarLeft?"Left":"Right");i[e]=d?b+"px":"0px";r&&(m[0].style.width=w(c),u[0].style.width=w(c),u[0].style[e]=d?b+"px":"0px");l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop= +0}}function I(a,b,c){for(var d=0,e=0,f=b.length,g,j;e<f;){g=b[e].firstChild;for(j=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,d):a(g,d),d++),g=g.nextSibling,j=c?j.nextSibling:null;e++}}function Ha(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,e=d.sY,f=d.sX,g=d.sXInner,j=c.length,i=aa(a,"bVisible"),o=h("th",a.nTHead),l=b.getAttribute("width"),k=b.parentNode,u=!1,m,n,p=a.oBrowser,d=p.bScrollOversize;(m=b.style.width)&&-1!==m.indexOf("%")&&(l=m);for(m=0;m<i.length;m++)n=c[i[m]],null!==n.sWidth&& +(n.sWidth=Fb(n.sWidthOrig,k),u=!0);if(d||!u&&!f&&!e&&j==ca(a)&&j==o.length)for(m=0;m<j;m++)i=$(a,m),null!==i&&(c[i].sWidth=w(o.eq(m).width()));else{j=h(b).clone().css("visibility","hidden").removeAttr("id");j.find("tbody tr").remove();var t=h("<tr/>").appendTo(j.find("tbody"));j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");o=qa(a,j.find("thead")[0]);for(m=0;m<i.length;m++)n=c[i[m]],o[m].style.width=null!==n.sWidthOrig&& +""!==n.sWidthOrig?w(n.sWidthOrig):"",n.sWidthOrig&&f&&h(o[m]).append(h("<div/>").css({width:n.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(m=0;m<i.length;m++)u=i[m],n=c[u],h(Gb(a,u)).clone(!1).append(n.sContentPadding).appendTo(t);n=h("<div/>").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(j).appendTo(k);f&&g?j.width(g):f?(j.css("width","auto"),j.removeAttr("width"),j.width()<k.clientWidth&&l&&j.width(k.clientWidth)):e?j.width(k.clientWidth): +l&&j.width(l);for(m=e=0;m<i.length;m++)k=h(o[m]),g=k.outerWidth()-k.width(),k=p.bBounding?Math.ceil(o[m].getBoundingClientRect().width):k.outerWidth(),e+=k,c[i[m]].sWidth=w(k-g);b.style.width=w(e);n.remove()}l&&(b.style.width=w(l));if((l||f)&&!a._reszEvt)b=function(){h(E).bind("resize.DT-"+a.sInstance,ua(function(){U(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0}function ua(a,b){var c=b!==k?b:200,d,e;return function(){var b=this,g=+new Date,j=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d= +k;a.apply(b,j)},c)):(d=g,a.apply(b,j))}}function Fb(a,b){if(!a)return 0;var c=h("<div/>").css("width",w(a)).appendTo(b||H.body),d=c[0].offsetWidth;c.remove();return d}function Gb(a,b){var c=Hb(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?h("<td/>").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Hb(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;f<g;f++)c=B(a,f,b,"display")+"",c=c.replace($b,""),c=c.replace(/ /g," "),c.length>d&&(d=c.length,e=f);return e}function w(a){return null=== +a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function W(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var o=[];f=function(a){a.length&&!h.isArray(a[0])?o.push(a):h.merge(o,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<o.length;a++){i=o[a][0];f=e[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=e[g].sType||"string",o[a]._idx===k&&(o[a]._idx=h.inArray(o[a][1],e[g].asSorting)),d.push({src:i,col:g,dir:o[a][1], +index:o[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return d}function mb(a){var b,c,d=[],e=m.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h;Ia(a);h=W(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Ib(a,j.col);if("ssp"!=y(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)d[i[b]]=b;g===h.length?i.sort(function(a,b){var c,e,g,j,i=h.length,k=f[a]._aSortData,m=f[b]._aSortData;for(g=0;g<i;g++)if(j=h[g],c=k[j.col],e=m[j.col],c=c<e?-1:c>e?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b]; +return c<e?-1:c>e?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,p=f[b]._aSortData;for(j=0;j<k;j++)if(i=h[j],c=m[i.col],g=p[i.col],i=e[i.type+"-"+i.dir]||e["string-"+i.dir],c=i(c,g),0!==c)return c;c=d[a];g=d[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Jb(a){for(var b,c,d=a.aoColumns,e=W(a),a=a.oLanguage.oAria,f=0,g=d.length;f<g;f++){c=d[f];var j=c.asSorting;b=c.sTitle.replace(/<.*?>/g,"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<e.length&&e[0].col==f?(i.setAttribute("aria-sort", +"asc"==e[0].dir?"ascending":"descending"),c=j[e[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label",b)}}function Va(a,b,c,d){var e=a.aaSorting,f=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===k&&(c=h.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=h.inArray(b,D(e,"0")),-1!==c?(b=g(e[c],!0),null===b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=f[b],e[c]._idx= +b)):(e.push([b,f[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=f[b],e[0]._idx=b):(e.length=0,e.push([b,f[0]]),e[0]._idx=0);T(a);"function"==typeof d&&d(a)}function Oa(a,b,c,d){var e=a.aoColumns[c];Wa(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Va(a,c,b.shiftKey,d);"ssp"!==y(a)&&C(a,!1)},0)):Va(a,c,b.shiftKey,d))})}function xa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=W(a),e=a.oFeatures,f,g;if(e.bSort&&e.bSortClasses){e= +0;for(f=b.length;e<f;e++)g=b[e].src,h(D(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3));e=0;for(f=d.length;e<f;e++)g=d[e].src,h(D(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Ib(a,b){var c=a.aoColumns[b],d=m.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ba(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j<i;j++)if(c=a.aoData[j],c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function ya(a){if(a.oFeatures.bStateSave&& +!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:Ab(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:Ab(a.aoPreSearchCols[d])}})};v(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function Kb(a){var b,c,d=a.aoColumns;if(a.oFeatures.bStateSave){var e=a.fnStateLoadCallback.call(a.oInstance,a);if(e&&e.time&&(b=v(a,"aoStateLoadParams", +"stateLoadParams",[a,e]),-1===h.inArray(!1,b)&&(b=a.iStateDuration,!(0<b&&e.time<+new Date-1E3*b)&&d.length===e.columns.length))){a.oLoadedState=h.extend(!0,{},e);e.start!==k&&(a._iDisplayStart=e.start,a.iInitDisplayStart=e.start);e.length!==k&&(a._iDisplayLength=e.length);e.order!==k&&(a.aaSorting=[],h.each(e.order,function(b,c){a.aaSorting.push(c[0]>=d.length?[0,c[1]]:c)}));e.search!==k&&h.extend(a.oPreviousSearch,Bb(e.search));b=0;for(c=e.columns.length;b<c;b++){var f=e.columns[b];f.visible!== +k&&(d[b].bVisible=f.visible);f.search!==k&&h.extend(a.aoPreSearchCols[b],Bb(f.search))}v(a,"aoStateLoaded","stateLoaded",[a,e])}}}function za(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function K(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)E.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&v(a,null,"error",[a,d,c]),"alert"== +b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function F(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?F(a,b,d[0],d[1]):F(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Lb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Wa(a,b,c){h(a).bind("click.DT",b,function(b){a.blur();c(b)}).bind("keypress.DT", +b,function(a){13===a.which&&(a.preventDefault(),c(a))}).bind("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function v(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Sa(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Pa(a,b){var c= +a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Aa(a,b){var c=[],c=Mb.numbers_length,d=Math.floor(c/2);b<=c?c=X(0,b):a<=d?(c=X(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=X(b-(c-2),b):(c=X(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function db(a){h.each({num:function(b){return Ba(b, +a)},"num-fmt":function(b){return Ba(b,a,Xa)},"html-num":function(b){return Ba(b,a,Ca)},"html-num-fmt":function(b){return Ba(b,a,Ca,Xa)}},function(b,c){s.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(s.type.search[b+a]=s.type.search.html)})}function Nb(a){return function(){var b=[za(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m,s,t,p,r,Ya={},Ob=/[\r\n]/g,Ca=/<.*?>/g,ac=/^[\w\+\-]/,bc=/[\w\+\-]$/,Yb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)", +"g"),Xa=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,M=function(a){return!a||!0===a||"-"===a?!0:!1},Pb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Qb=function(a,b){Ya[b]||(Ya[b]=RegExp(va(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Ya[b],"."):a},Za=function(a,b,c){var d="string"===typeof a;if(M(a))return!0;b&&d&&(a=Qb(a,b));c&&d&&(a=a.replace(Xa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Rb=function(a,b,c){return M(a)?!0:!(M(a)||"string"=== +typeof a)?null:Za(a.replace(Ca,""),b,c)?!0:null},D=function(a,b,c){var d=[],e=0,f=a.length;if(c!==k)for(;e<f;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<f;e++)a[e]&&d.push(a[e][b]);return d},ja=function(a,b,c,d){var e=[],f=0,g=b.length;if(d!==k)for(;f<g;f++)a[b[f]][c]&&e.push(a[b[f]][c][d]);else for(;f<g;f++)e.push(a[b[f]][c]);return e},X=function(a,b){var c=[],d;b===k?(b=0,d=a):(d=b,b=a);for(var e=b;e<d;e++)c.push(e);return c},Sb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]); +return b},pa=function(a){var b=[],c,d,e=a.length,f,g=0;d=0;a:for(;d<e;d++){c=a[d];for(f=0;f<g;f++)if(b[f]===c)continue a;b.push(c);g++}return b},A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},da=/\[.*?\]$/,V=/\(\)$/,wa=h("<div>")[0],Zb=wa.textContent!==k,$b=/<.*?>/g;m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new t(za(this[s.iApiIndex])):new t(this)};this.fnAddData=function(a,b){var c=this.api(!0), +d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===k||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&Z(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0], +h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===k?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()}; +this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a); +(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return za(this[s.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust();(d===k||d)&&h.draw();return 0};this.fnVersionCheck= +s.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=s.internal;for(var e in m.ext.internal)e&&(this[e]=Nb(e));this.each(function(){var e={},e=1<d?Lb(e,a,!0):a,g=0,j,i=this.getAttribute("id"),o=!1,l=m.defaults,q=h(this);if("table"!=this.nodeName.toLowerCase())K(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{eb(l);fb(l.column);J(l,l,!0);J(l.column,l.column,!0);J(l,h.extend(e,q.data()));var u=m.settings,g=0;for(j=u.length;g<j;g++){var p=u[g];if(p.nTable== +this||p.nTHead.parentNode==this||p.nTFoot&&p.nTFoot.parentNode==this){g=e.bRetrieve!==k?e.bRetrieve:l.bRetrieve;if(c||g)return p.oInstance;if(e.bDestroy!==k?e.bDestroy:l.bDestroy){p.oInstance.fnDestroy();break}else{K(p,0,"Cannot reinitialise DataTable",3);return}}if(p.sTableId==this.id){u.splice(g,1);break}}if(null===i||""===i)this.id=i="DataTables_Table_"+m.ext._unique++;var n=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:i,sTableId:i});n.nTable=this;n.oApi=b.internal; +n.oInit=e;u.push(n);n.oInstance=1===b.length?b:q.dataTable();eb(e);e.oLanguage&&Fa(e.oLanguage);e.aLengthMenu&&!e.iDisplayLength&&(e.iDisplayLength=h.isArray(e.aLengthMenu[0])?e.aLengthMenu[0][0]:e.aLengthMenu[0]);e=Lb(h.extend(!0,{},l),e);F(n.oFeatures,e,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));F(n,e,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu", +"sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);F(n.oScroll,e,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);F(n.oLanguage,e,"fnInfoCallback");z(n,"aoDrawCallback", +e.fnDrawCallback,"user");z(n,"aoServerParams",e.fnServerParams,"user");z(n,"aoStateSaveParams",e.fnStateSaveParams,"user");z(n,"aoStateLoadParams",e.fnStateLoadParams,"user");z(n,"aoStateLoaded",e.fnStateLoaded,"user");z(n,"aoRowCallback",e.fnRowCallback,"user");z(n,"aoRowCreatedCallback",e.fnCreatedRow,"user");z(n,"aoHeaderCallback",e.fnHeaderCallback,"user");z(n,"aoFooterCallback",e.fnFooterCallback,"user");z(n,"aoInitComplete",e.fnInitComplete,"user");z(n,"aoPreDrawCallback",e.fnPreDrawCallback, +"user");n.rowIdFn=Q(e.rowId);gb(n);i=n.oClasses;e.bJQueryUI?(h.extend(i,m.ext.oJUIClasses,e.oClasses),e.sDom===l.sDom&&"lfrtip"===l.sDom&&(n.sDom='<"H"lfr>t<"F"ip>'),n.renderer)?h.isPlainObject(n.renderer)&&!n.renderer.header&&(n.renderer.header="jqueryui"):n.renderer="jqueryui":h.extend(i,m.ext.classes,e.oClasses);q.addClass(i.sTable);n.iInitDisplayStart===k&&(n.iInitDisplayStart=e.iDisplayStart,n._iDisplayStart=e.iDisplayStart);null!==e.iDeferLoading&&(n.bDeferLoading=!0,g=h.isArray(e.iDeferLoading), +n._iRecordsDisplay=g?e.iDeferLoading[0]:e.iDeferLoading,n._iRecordsTotal=g?e.iDeferLoading[1]:e.iDeferLoading);var t=n.oLanguage;h.extend(!0,t,e.oLanguage);""!==t.sUrl&&(h.ajax({dataType:"json",url:t.sUrl,success:function(a){Fa(a);J(l.oLanguage,a);h.extend(true,t,a);ia(n)},error:function(){ia(n)}}),o=!0);null===e.asStripeClasses&&(n.asStripeClasses=[i.sStripeOdd,i.sStripeEven]);var g=n.asStripeClasses,r=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(g,function(a){return r.hasClass(a)}))&& +(h("tbody tr",this).removeClass(g.join(" ")),n.asDestroyStripes=g.slice());u=[];g=this.getElementsByTagName("thead");0!==g.length&&(fa(n.aoHeader,g[0]),u=qa(n));if(null===e.aoColumns){p=[];g=0;for(j=u.length;g<j;g++)p.push(null)}else p=e.aoColumns;g=0;for(j=p.length;g<j;g++)Ga(n,u?u[g]:null);ib(n,e.aoColumnDefs,p,function(a,b){la(n,a,b)});if(r.length){var s=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h(r[0]).children("th, td").each(function(a,b){var c=n.aoColumns[a];if(c.mData=== +a){var d=s(b,"sort")||s(b,"order"),e=s(b,"filter")||s(b,"search");if(d!==null||e!==null){c.mData={_:a+".display",sort:d!==null?a+".@data-"+d:k,type:d!==null?a+".@data-"+d:k,filter:e!==null?a+".@data-"+e:k};la(n,a)}}})}var w=n.oFeatures;e.bStateSave&&(w.bStateSave=!0,Kb(n,e),z(n,"aoDrawCallback",ya,"state_save"));if(e.aaSorting===k){u=n.aaSorting;g=0;for(j=u.length;g<j;g++)u[g][1]=n.aoColumns[g].asSorting[0]}xa(n);w.bSort&&z(n,"aoDrawCallback",function(){if(n.bSorted){var a=W(n),b={};h.each(a,function(a, +c){b[c.src]=c.dir});v(n,null,"order",[n,a,b]);Jb(n)}});z(n,"aoDrawCallback",function(){(n.bSorted||y(n)==="ssp"||w.bDeferRender)&&xa(n)},"sc");g=q.children("caption").each(function(){this._captionSide=q.css("caption-side")});j=q.children("thead");0===j.length&&(j=h("<thead/>").appendTo(this));n.nTHead=j[0];j=q.children("tbody");0===j.length&&(j=h("<tbody/>").appendTo(this));n.nTBody=j[0];j=q.children("tfoot");if(0===j.length&&0<g.length&&(""!==n.oScroll.sX||""!==n.oScroll.sY))j=h("<tfoot/>").appendTo(this); +0===j.length||0===j.children().length?q.addClass(i.sNoFooter):0<j.length&&(n.nTFoot=j[0],fa(n.aoFooter,n.nTFoot));if(e.aaData)for(g=0;g<e.aaData.length;g++)N(n,e.aaData[g]);else(n.bDeferLoading||"dom"==y(n))&&ma(n,h(n.nTBody).children("tr"));n.aiDisplay=n.aiDisplayMaster.slice();n.bInitialised=!0;!1===o&&ia(n)}});b=null;return this};var Tb=[],x=Array.prototype,cc=function(a){var b,c,d=m.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b= +h.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};t=function(a,b){if(!(this instanceof t))return new t(a,b);var c=[],d=function(a){(a=cc(a))&&(c=c.concat(a))};if(h.isArray(a))for(var e=0,f=a.length;e<f;e++)d(a[e]);else d(a);this.context=pa(c);b&&h.merge(this,b);this.selector={rows:null,cols:null,opts:null}; +t.extend(this,this,Tb)};m.Api=t;h.extend(t.prototype,{any:function(){return 0!==this.count()},concat:x.concat,context:[],count:function(){return this.flatten().length},each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new t(b[a],this[a]):null},filter:function(a){var b=[];if(x.filter)b=x.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new t(this.context, +b)},flatten:function(){var a=[];return new t(this.context,a.concat.apply(a,this.toArray()))},join:x.join,indexOf:x.indexOf||function(a,b){for(var c=b||0,d=this.length;c<d;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,d){var e=[],f,g,h,i,o,l=this.context,m,p,r=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);g=0;for(h=l.length;g<h;g++){var n=new t(l[g]);if("table"===b)f=c.call(n,l[g],g),f!==k&&e.push(f);else if("columns"===b||"rows"===b)f=c.call(n,l[g],this[g],g),f!==k&&e.push(f); +else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){p=this[g];"column-rows"===b&&(m=Da(l[g],r.opts));i=0;for(o=p.length;i<o;i++)f=p[i],f="cell"===b?c.call(n,l[g],f.row,f.column,g,i):c.call(n,l[g],f,g,i,m),f!==k&&e.push(f)}}return e.length||d?(a=new t(l,a?e.concat.apply([],e):e),b=a.selector,b.rows=r.rows,b.cols=r.cols,b.opts=r.opts,a):this},lastIndexOf:x.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(x.map)b= +x.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new t(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:x.pop,push:x.push,reduce:x.reduce||function(a,b){return hb(this,a,b,0,this.length,1)},reduceRight:x.reduceRight||function(a,b){return hb(this,a,b,this.length-1,-1,-1)},reverse:x.reverse,selector:null,shift:x.shift,sort:x.sort,splice:x.splice,toArray:function(){return x.slice.call(this)},to$:function(){return h(this)}, +toJQuery:function(){return h(this)},unique:function(){return new t(this.context,pa(this))},unshift:x.unshift});t.extend=function(a,b,c){if(c.length&&b&&(b instanceof t||b.__dt_wrapper)){var d,e,f,g=function(a,b,c){return function(){var d=b.apply(a,arguments);t.extend(d,d,c.methodExt);return d}};d=0;for(e=c.length;d<e;d++)f=c[d],b[f.name]="function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,t.extend(a,b[f.name],f.propExt)}};t.register=p=function(a,b){if(h.isArray(a))for(var c= +0,d=a.length;c<d;c++)t.register(a[c],b);else for(var e=a.split("."),f=Tb,g,j,c=0,d=e.length;c<d;c++){g=(j=-1!==e[c].indexOf("()"))?e[c].replace("()",""):e[c];var i;a:{i=0;for(var k=f.length;i<k;i++)if(f[i].name===g){i=f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===d-1?i.val=b:f=j?i.methodExt:i.propExt}};t.registerPlural=r=function(a,b,c){t.register(a,c);t.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof t?a.length?h.isArray(a[0])? +new t(a.context,a[0]):a[0]:k:a})};p("tables()",function(a){var b;if(a){b=t;var c=this.context;if("number"===typeof a)a=[c[a]];else var d=h.map(c,function(a){return a.nTable}),a=h(d).filter(a).map(function(){var a=h.inArray(this,d);return c[a]}).toArray();b=new b(a)}else b=this;return b});p("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new t(b[0]):a});r("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});r("tables().body()", +"table().body()",function(){return this.iterator("table",function(a){return a.nTBody},1)});r("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});r("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});r("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});p("draw()",function(a){return this.iterator("table", +function(b){"page"===a?O(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),T(b,!1===a))})});p("page()",function(a){return a===k?this.page.info().page:this.iterator("table",function(b){Ta(b,a)})});p("page.info()",function(){if(0===this.context.length)return k;var a=this.context[0],b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(), +recordsDisplay:d,serverSide:"ssp"===y(a)}});p("page.len()",function(a){return a===k?0!==this.context.length?this.context[0]._iDisplayLength:k:this.iterator("table",function(b){Ra(b,a)})});var Ub=function(a,b,c){if(c){var d=new t(a);d.one("draw",function(){c(d.ajax.json())})}if("ssp"==y(a))T(a,b);else{C(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();ra(a,[],function(c){na(a);for(var c=sa(a,c),d=0,e=c.length;d<e;d++)N(a,c[d]);T(a,b);C(a,!1)})}};p("ajax.json()",function(){var a=this.context;if(0< +a.length)return a[0].json});p("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});p("ajax.reload()",function(a,b){return this.iterator("table",function(c){Ub(c,!1===b,a)})});p("ajax.url()",function(a){var b=this.context;if(a===k){if(0===b.length)return k;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});p("ajax.url().load()",function(a,b){return this.iterator("table", +function(c){Ub(c,!1===b,a)})});var $a=function(a,b,c,d,e){var f=[],g,j,i,o,l,m;i=typeof b;if(!b||"string"===i||"function"===i||b.length===k)b=[b];i=0;for(o=b.length;i<o;i++){j=b[i]&&b[i].split?b[i].split(","):[b[i]];l=0;for(m=j.length;l<m;l++)(g=c("string"===typeof j[l]?h.trim(j[l]):j[l]))&&g.length&&(f=f.concat(g))}a=s.selector[a];if(a.length){i=0;for(o=a.length;i<o;i++)f=a[i](d,e,f)}return pa(f)},ab=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none", +order:"current",page:"all"},a)},bb=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Da=function(a,b){var c,d,e,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;d=b.order;e=b.page;if("ssp"==y(a))return"removed"===j?[]:X(0,c.length);if("current"==e){c=a._iDisplayStart;for(d=a.fnDisplayEnd();c<d;c++)f.push(g[c])}else if("current"==d||"applied"==d)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c, +function(a){return-1===h.inArray(a,g)?a:null});else if("index"==d||"original"==d){c=0;for(d=a.aoData.length;c<d;c++)"none"==j?f.push(c):(e=h.inArray(c,g),(-1===e&&"removed"==j||0<=e&&"applied"==j)&&f.push(c))}return f};p("rows()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var e=b;return $a("row",a,function(a){var b=Pb(a);if(b!==null&&!e)return[b];var j=Da(c,e);if(b!==null&&h.inArray(b,j)!==-1)return[b];if(!a)return j;if(typeof a==="function")return h.map(j, +function(b){var e=c.aoData[b];return a(b,e._aData,e.nTr)?b:null});b=Sb(ja(c.aoData,j,"nTr"));if(a.nodeName&&h.inArray(a,b)!==-1)return[a._DT_RowIndex];if(typeof a==="string"&&a.charAt(0)==="#"){j=c.aIds[a.replace(/^#/,"")];if(j!==k)return[j.idx]}return h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()},c,e)},1);c.selector.rows=a;c.selector.opts=b;return c});p("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||k},1)});p("rows().data()",function(){return this.iterator(!0, +"rows",function(a,b){return ja(a.aoData,b,"_aData")},1)});r("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var d=b.aoData[c];return"search"===a?d._aFilterData:d._aSortData},1)});r("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){ea(b,c,a)})});r("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});r("rows().ids()","row().id()",function(a){for(var b=[],c=this.context, +d=0,e=c.length;d<e;d++)for(var f=0,g=this[d].length;f<g;f++){var h=c[d].rowIdFn(c[d].aoData[this[d][f]]._aData);b.push((!0===a?"#":"")+h)}return new t(c,b)});r("rows().remove()","row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,f=e[c],g,h,i,o,l;e.splice(c,1);g=0;for(h=e.length;g<h;g++)if(i=e[g],l=i.anCells,null!==i.nTr&&(i.nTr._DT_RowIndex=g),null!==l){i=0;for(o=l.length;i<o;i++)l[i]._DT_CellIndex.row=g}oa(b.aiDisplayMaster,c);oa(b.aiDisplay,c);oa(a[d],c,!1); +Sa(b);c=b.rowIdFn(f._aData);c!==k&&delete b.aIds[c]});this.iterator("table",function(a){for(var c=0,d=a.aoData.length;c<d;c++)a.aoData[c].idx=c});return this});p("rows.add()",function(a){var b=this.iterator("table",function(b){var c,f,g,h=[];f=0;for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(ma(b,c)[0]):h.push(N(b,c));return h},1),c=this.rows(-1);c.pop();h.merge(c,b);return c});p("row()",function(a,b){return bb(this.rows(a,b))});p("row().data()",function(a){var b= +this.context;if(a===k)return b.length&&this.length?b[0].aoData[this[0]]._aData:k;b[0].aoData[this[0]]._aData=a;ea(b[0],this[0],"data");return this});p("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});p("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?ma(b,a)[0]:N(b,a)});return this.row(b[0])});var cb=function(a,b){var c=a.context;if(c.length&& +(c=c[0].aoData[b!==k?b:a[0]])&&c._details)c._details.remove(),c._detailsShow=k,c._details=k},Vb=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];if(d._details){(d._detailsShow=b)?d._details.insertAfter(d.nTr):d._details.detach();var e=c[0],f=new t(e),g=e.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<D(g,"_details").length&&(f.on("draw.dt.DT_details",function(a,b){e===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a]; +a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",function(a,b){if(e===b)for(var c,d=ca(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",d)}),f.on("destroy.dt.DT_details",function(a,b){if(e===b)for(var c=0,d=g.length;c<d;c++)g[c]._details&&cb(f,c)}))}}};p("row().child()",function(a,b){var c=this.context;if(a===k)return c.length&&this.length?c[0].aoData[this[0]]._details:k;if(!0===a)this.child.show();else if(!1=== +a)cb(this);else if(c.length&&this.length){var d=c[0],c=c[0].aoData[this[0]],e=[],f=function(a,b){if(h.isArray(a)||a instanceof h)for(var c=0,k=a.length;c<k;c++)f(a[c],b);else a.nodeName&&"tr"===a.nodeName.toLowerCase()?e.push(a):(c=h("<tr><td/></tr>").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=ca(d),e.push(c[0]))};f(a,b);c._details&&c._details.remove();c._details=h(e);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});p(["row().child.show()","row().child().show()"],function(){Vb(this, +!0);return this});p(["row().child.hide()","row().child().hide()"],function(){Vb(this,!1);return this});p(["row().child.remove()","row().child().remove()"],function(){cb(this);return this});p("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var dc=/^(.+):(name|visIdx|visible)$/,Wb=function(a,b,c,d,e){for(var c=[],d=0,f=e.length;d<f;d++)c.push(B(a,e[d],b));return c};p("columns()",function(a,b){a===k?a="":h.isPlainObject(a)&& +(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var e=a,f=b,g=c.aoColumns,j=D(g,"sName"),i=D(g,"nTh");return $a("column",e,function(a){var b=Pb(a);if(a==="")return X(g.length);if(b!==null)return[b>=0?b:g.length+b];if(typeof a==="function"){var e=Da(c,f);return h.map(g,function(b,f){return a(f,Wb(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(dc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null}); +return[m[m.length+b]]}return[$(c,b)];case "name":return h.map(j,function(a,b){return a===k[1]?b:null})}else return h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray()},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});r("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});r("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});r("columns().data()", +"column().data()",function(){return this.iterator("column-rows",Wb,1)});r("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});r("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return ja(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});r("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ja(a.aoData, +e,"anCells",b)},1)});r("columns().visible()","column().visible()",function(a,b){return this.iterator("column",function(c,d){if(a===k)return c.aoColumns[d].bVisible;var e=c.aoColumns,f=e[d],g=c.aoData,j,i,m;if(a!==k&&f.bVisible!==a){if(a){var l=h.inArray(!0,D(e,"bVisible"),d+1);j=0;for(i=g.length;j<i;j++)m=g[j].nTr,e=g[j].anCells,m&&m.insertBefore(e[d],e[l]||null)}else h(D(c.aoData,"anCells",d)).detach();f.bVisible=a;ga(c,c.aoHeader);ga(c,c.aoFooter);if(b===k||b)U(c),(c.oScroll.sX||c.oScroll.sY)&& +Z(c);v(c,null,"column-visibility",[c,d,a,b]);ya(c)}})});r("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?ba(b,c):c},1)});p("columns.adjust()",function(){return this.iterator("table",function(a){U(a)},1)});p("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return $(c,b);if("fromData"===a||"toVisible"===a)return ba(c,b)}});p("column()",function(a,b){return bb(this.columns(a, +b))});p("cells()",function(a,b,c){h.isPlainObject(a)&&(a.row===k?(c=a,a=null):(c=b,b=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===k)return this.iterator("table",function(b){var d=a,e=ab(c),f=b.aoData,g=Da(b,e),j=Sb(ja(f,g,"anCells")),i=h([].concat.apply([],j)),l,m=b.aoColumns.length,o,p,t,r,s,v;return $a("cell",d,function(a){var c=typeof a==="function";if(a===null||a===k||c){o=[];p=0;for(t=g.length;p<t;p++){l=g[p];for(r=0;r<m;r++){s={row:l,column:r};if(c){v=f[l];a(s,B(b,l,r),v.anCells? +v.anCells[r]:null)&&o.push(s)}else o.push(s)}}return o}return h.isPlainObject(a)?[a]:i.filter(a).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray()},b,e)});var d=this.columns(b,c),e=this.rows(a,c),f,g,j,i,m,l=this.iterator("table",function(a,b){f=[];g=0;for(j=e[b].length;g<j;g++){i=0;for(m=d[b].length;i<m;i++)f.push({row:e[b][g],column:d[b][i]})}return f},1);h.extend(l.selector,{cols:b,rows:a,opts:c});return l});r("cells().nodes()","cell().node()",function(){return this.iterator("cell", +function(a,b,c){return(a=a.aoData[b].anCells)?a[c]:k},1)});p("cells().data()",function(){return this.iterator("cell",function(a,b,c){return B(a,b,c)},1)});r("cells().cache()","cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});r("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return B(b,c,d,a)},1)});r("cells().indexes()","cell().index()",function(){return this.iterator("cell", +function(a,b,c){return{row:b,column:c,columnVisible:ba(a,c)}},1)});r("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,d){ea(b,c,a,d)})});p("cell()",function(a,b,c){return bb(this.cells(a,b,c))});p("cell().data()",function(a){var b=this.context,c=this[0];if(a===k)return b.length&&c.length?B(b[0],c[0].row,c[0].column):k;jb(b[0],c[0].row,c[0].column,a);ea(b[0],c[0].row,"data",c[0].column);return this});p("order()",function(a,b){var c=this.context;if(a=== +k)return 0!==c.length?c[0].aaSorting:k;"number"===typeof a?a=[[a,b]]:h.isArray(a[0])||(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});p("order.listener()",function(a,b,c){return this.iterator("table",function(d){Oa(d,a,b,c)})});p("order.fixed()",function(a){if(!a){var b=this.context,b=b.length?b[0].aaSortingFixed:k;return h.isArray(b)?{pre:b}:b}return this.iterator("table",function(b){b.aaSortingFixed=h.extend(!0,{},a)})});p(["columns().order()", +"column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];h.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});p("search()",function(a,b,c,d){var e=this.context;return a===k?0!==e.length?e[0].oPreviousSearch.sSearch:k:this.iterator("table",function(e){e.oFeatures.bFilter&&ha(e,h.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});r("columns().search()","column().search()",function(a, +b,c,d){return this.iterator("column",function(e,f){var g=e.aoPreSearchCols;if(a===k)return g[f].sSearch;e.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),ha(e,e.oPreviousSearch,1))})});p("state()",function(){return this.context.length?this.context[0].oSavedState:null});p("state.clear()",function(){return this.iterator("table",function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});p("state.loaded()",function(){return this.context.length? +this.context[0].oLoadedState:null});p("state.save()",function(){return this.iterator("table",function(a){ya(a)})});m.versionCheck=m.fnVersionCheck=function(a){for(var b=m.version.split("."),a=a.split("."),c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;h.each(m.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?h("table",e.nScrollFoot)[0]: +null;if(e.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(m.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable});return b?new t(c):c};m.util={throttle:ua,escapeRegex:va};m.camelToHungarian=J;p("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){p(b+"()",function(){var a=Array.prototype.slice.call(arguments); +a[0].match(/\.dt\b/)||(a[0]+=".dt");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});p("clear()",function(){return this.iterator("table",function(a){na(a)})});p("settings()",function(){return new t(this.context,this.context)});p("init()",function(){var a=this.context;return a.length?a[0].oInit:null});p("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});p("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c= +b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),p;b.bDestroying=!0;v(b,"aoDestroyCallback","destroy",[b]);a||(new t(b)).columns().visible(!0);k.unbind(".DT").find(":not(tbody *)").unbind(".DT");h(E).unbind(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));b.aaSorting=[];b.aaSortingFixed=[];xa(b); +h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);b.bJUI&&(h("th span."+d.sSortIcon+", td span."+d.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+d.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));f.children().detach();f.append(l);g=a?"remove":"detach";i[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),i.css("width",b.sDestroyWidth).removeClass(d.sTable),(p= +b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%p])}));c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column","row","cell"],function(a,b){p(b+"s().every()",function(a){var d=this.selector.opts,e=this;return this.iterator(b,function(f,g,h,i,m){a.call(e[b](g,"cell"===b?h:d,"cell"===b?d:k),g,h,i,m)})})});p("i18n()",function(a,b,c){var d=this.context[0],a=Q(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._); +return a.replace("%d",c)});m.version="1.10.10";m.settings=[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null, +sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1, +bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+ +a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"}, +oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({}, +m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};Y(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null}; +Y(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[], +aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button", +iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)? +1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null}; +m.ext=s={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(s,{afnFiltering:s.search,aTypes:s.type.detect,ofnSearch:s.type.search,oSort:s.type.order,afnSortData:s.order,aoFeatures:s.feature,oApi:s.internal,oStdClasses:s.classes, +oPagination:s.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled", +sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"", +sJUIHeader:"",sJUIFooter:""});var Ea="",Ea="",G=Ea+"ui-state-default",ka=Ea+"css_right ui-icon ui-icon-",Xb=Ea+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m.ext.oJUIClasses,m.ext.classes,{sPageButton:"fg-button ui-button "+G,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:G+" sorting_asc",sSortDesc:G+" sorting_desc",sSortable:G+" sorting", +sSortableAsc:G+" sorting_asc_disabled",sSortableDesc:G+" sorting_desc_disabled",sSortableNone:G+" sorting_disabled",sSortJUIAsc:ka+"triangle-1-n",sSortJUIDesc:ka+"triangle-1-s",sSortJUI:ka+"carat-2-n-s",sSortJUIAscAllowed:ka+"carat-1-n",sSortJUIDescAllowed:ka+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+G,sScrollFoot:"dataTables_scrollFoot "+G,sHeaderTH:G,sFooterTH:G,sJUIHeader:Xb+" ui-corner-tl ui-corner-tr",sJUIFooter:Xb+ +" ui-corner-bl ui-corner-br"});var Mb=m.ext.pager;h.extend(Mb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[Aa(a,b)]},simple_numbers:function(a,b){return["previous",Aa(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Aa(a,b),"next","last"]},_numbers:Aa,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i=a.oLanguage.oAria.paginate|| +{},k,l,m=0,p=function(b,d){var n,r,t,s,v=function(b){Ta(a,b.data.action,true)};n=0;for(r=d.length;n<r;n++){s=d[n];if(h.isArray(s)){t=h("<"+(s.DT_el||"div")+"/>").appendTo(b);p(t,s)}else{k=null;l="";switch(s){case "ellipsis":b.append('<span class="ellipsis">…</span>');break;case "first":k=j.sFirst;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":k=j.sPrevious;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":k=j.sNext;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;case "last":k= +j.sLast;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;default:k=s+1;l=e===s?g.sPageButtonActive:""}if(k!==null){t=h("<a>",{"class":g.sPageButton+" "+l,"aria-controls":a.sTableId,"aria-label":i[s],"data-dt-idx":m,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(k).appendTo(b);Wa(t,{action:s},v);m++}}}},r;try{r=h(b).find(H.activeElement).data("dt-idx")}catch(n){}p(h(b).empty(),d);r&&h(b).find("[data-dt-idx="+r+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c= +b.oLanguage.sDecimal;return Za(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&(!ac.test(a)||!bc.test(a)))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||M(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c,!0)?"html-num-fmt"+c:null},function(a){return M(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html": +null}]);h.extend(m.ext.type.search,{html:function(a){return M(a)?a:"string"===typeof a?a.replace(Ob," ").replace(Ca,""):""},string:function(a){return M(a)?a:"string"===typeof a?a.replace(Ob," "):a}});var Ba=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Qb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(s.type.order,{"date-pre":function(a){return Date.parse(a)||0},"html-pre":function(a){return M(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase(): +a+""},"string-pre":function(a){return M(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});db("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass)}})},jqueryui:function(a, +b,c,d){h("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]=="asc"?d.sSortJUIAsc: +h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});m.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return f;f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:function(a){return"string"===typeof a?a.replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""): +a}}}};h.extend(m.ext.internal,{_fnExternApiFunc:Nb,_fnBuildAjax:ra,_fnAjaxUpdate:lb,_fnAjaxParameters:ub,_fnAjaxUpdateDraw:vb,_fnAjaxDataSrc:sa,_fnAddColumn:Ga,_fnColumnOptions:la,_fnAdjustColumnSizing:U,_fnVisibleToColumnIndex:$,_fnColumnIndexToVisible:ba,_fnVisbleColumns:ca,_fnGetColumns:aa,_fnColumnTypes:Ia,_fnApplyColumnDefs:ib,_fnHungarianMap:Y,_fnCamelToHungarian:J,_fnLanguageCompat:Fa,_fnBrowserDetect:gb,_fnAddData:N,_fnAddTr:ma,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex: +null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:B,_fnSetCellData:jb,_fnSplitObjNotation:La,_fnGetObjectDataFn:Q,_fnSetObjectDataFn:R,_fnGetDataMaster:Ma,_fnClearTable:na,_fnDeleteIndex:oa,_fnInvalidate:ea,_fnGetRowElements:Ka,_fnCreateTr:Ja,_fnBuildHead:kb,_fnDrawHead:ga,_fnDraw:O,_fnReDraw:T,_fnAddOptionsHtml:nb,_fnDetectHeader:fa,_fnGetUniqueThs:qa,_fnFeatureHtmlFilter:pb,_fnFilterComplete:ha,_fnFilterCustom:yb,_fnFilterColumn:xb,_fnFilter:wb,_fnFilterCreateSearch:Qa, +_fnEscapeRegex:va,_fnFilterData:zb,_fnFeatureHtmlInfo:sb,_fnUpdateInfo:Cb,_fnInfoMacros:Db,_fnInitialise:ia,_fnInitComplete:ta,_fnLengthChange:Ra,_fnFeatureHtmlLength:ob,_fnFeatureHtmlPaginate:tb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:qb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:rb,_fnScrollDraw:Z,_fnApplyToChildren:I,_fnCalculateColumnWidths:Ha,_fnThrottle:ua,_fnConvertToWidth:Fb,_fnGetWidestNode:Gb,_fnGetMaxLenString:Hb,_fnStringToCss:w,_fnSortFlatten:W,_fnSort:mb,_fnSortAria:Jb,_fnSortListener:Va, +_fnSortAttachListener:Oa,_fnSortingClasses:xa,_fnSortData:Ib,_fnSaveState:ya,_fnLoadState:Kb,_fnSettingsFromNode:za,_fnLog:K,_fnMap:F,_fnBindAction:Wa,_fnCallbackReg:z,_fnCallbackFire:v,_fnLengthOverflow:Sa,_fnRenderer:Pa,_fnDataSource:y,_fnRowAttributes:Na,_fnCalculateEnd:function(){}});h.fn.dataTable=m;m.$=h;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable}); diff --git a/admportal/public/javascripts/jquery.min.js b/admportal/public/javascripts/jquery.min.js new file mode 100644 index 00000000..ab28a247 --- /dev/null +++ b/admportal/public/javascripts/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px") +},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m}); diff --git a/admportal/public/javascripts/jquery.treegrid.bootstrap3.js b/admportal/public/javascripts/jquery.treegrid.bootstrap3.js new file mode 100644 index 00000000..1118697f --- /dev/null +++ b/admportal/public/javascripts/jquery.treegrid.bootstrap3.js @@ -0,0 +1,4 @@ +$.extend($.fn.treegrid.defaults, {
+ expanderExpandedClass: 'glyphicon glyphicon-chevron-down',
+ expanderCollapsedClass: 'glyphicon glyphicon-chevron-right'
+});
diff --git a/admportal/public/javascripts/jquery.treegrid.js b/admportal/public/javascripts/jquery.treegrid.js new file mode 100644 index 00000000..8579d8e7 --- /dev/null +++ b/admportal/public/javascripts/jquery.treegrid.js @@ -0,0 +1,626 @@ +/*
+ * jQuery treegrid Plugin 0.2.0
+ * https://github.com/maxazan/jquery-treegrid
+ *
+ * Copyright 2013, Pomazan Max
+ * Licensed under the MIT licenses.
+ */
+(function($) {
+
+ var methods = {
+ /**
+ * Initialize tree
+ *
+ * @param {Object} options
+ * @returns {Object[]}
+ */
+ initTree: function(options) {
+ var settings = $.extend({}, this.treegrid.defaults, options);
+ return this.each(function() {
+ var $this = $(this);
+ $this.treegrid('setTreeContainer', $(this));
+ $this.treegrid('setSettings', settings);
+ settings.getRootNodes.apply(this, [$(this)]).treegrid('initNode', settings);
+ $this.treegrid('getRootNodes').treegrid('render');
+ });
+ },
+ /**
+ * Initialize node
+ *
+ * @param {Object} settings
+ * @returns {Object[]}
+ */
+ initNode: function(settings) {
+ return this.each(function() {
+ var $this = $(this);
+ $this.treegrid('setTreeContainer', settings.getTreeGridContainer.apply(this));
+ $this.treegrid('getChildNodes').treegrid('initNode', settings);
+ $this.treegrid('initExpander').treegrid('initIndent').treegrid('initEvents').treegrid('initState').treegrid('initChangeEvent').treegrid("initSettingsEvents");
+ });
+ },
+ initChangeEvent: function() {
+ var $this = $(this);
+ //Save state on change
+ $this.on("change", function() {
+ var $this = $(this);
+ $this.treegrid('render');
+ if ($this.treegrid('getSetting', 'saveState')) {
+ $this.treegrid('saveState');
+ }
+ });
+ return $this;
+ },
+ /**
+ * Initialize node events
+ *
+ * @returns {Node}
+ */
+ initEvents: function() {
+ var $this = $(this);
+ //Default behavior on collapse
+ $this.on("collapse", function() {
+ var $this = $(this);
+ $this.removeClass('treegrid-expanded');
+ $this.addClass('treegrid-collapsed');
+ });
+ //Default behavior on expand
+ $this.on("expand", function() {
+ var $this = $(this);
+ $this.removeClass('treegrid-collapsed');
+ $this.addClass('treegrid-expanded');
+ });
+
+ return $this;
+ },
+ /**
+ * Initialize events from settings
+ *
+ * @returns {Node}
+ */
+ initSettingsEvents: function() {
+ var $this = $(this);
+ //Save state on change
+ $this.on("change", function() {
+ var $this = $(this);
+ if (typeof($this.treegrid('getSetting', 'onChange')) === "function") {
+ $this.treegrid('getSetting', 'onChange').apply($this);
+ }
+ });
+ //Default behavior on collapse
+ $this.on("collapse", function() {
+ var $this = $(this);
+ if (typeof($this.treegrid('getSetting', 'onCollapse')) === "function") {
+ $this.treegrid('getSetting', 'onCollapse').apply($this);
+ }
+ });
+ //Default behavior on expand
+ $this.on("expand", function() {
+ var $this = $(this);
+ if (typeof($this.treegrid('getSetting', 'onExpand')) === "function") {
+ $this.treegrid('getSetting', 'onExpand').apply($this);
+ }
+
+ });
+
+ return $this;
+ },
+ /**
+ * Initialize expander for node
+ *
+ * @returns {Node}
+ */
+ initExpander: function() {
+ var $this = $(this);
+ var cell = $this.find('td').get($this.treegrid('getSetting', 'treeColumn'));
+ var tpl = $this.treegrid('getSetting', 'expanderTemplate');
+ var expander = $this.treegrid('getSetting', 'getExpander').apply(this);
+ if (expander) {
+ expander.remove();
+ }
+ $(tpl).prependTo(cell).click(function() {
+ $($(this).closest('tr')).treegrid('toggle');
+ });
+ return $this;
+ },
+ /**
+ * Initialize indent for node
+ *
+ * @returns {Node}
+ */
+ initIndent: function() {
+ var $this = $(this);
+ $this.find('.treegrid-indent').remove();
+ var tpl = $this.treegrid('getSetting', 'indentTemplate');
+ var expander = $this.find('.treegrid-expander');
+ var depth = $this.treegrid('getDepth');
+ for (var i = 0; i < depth; i++) {
+ $(tpl).insertBefore(expander);
+ }
+ return $this;
+ },
+ /**
+ * Initialise state of node
+ *
+ * @returns {Node}
+ */
+ initState: function() {
+ var $this = $(this);
+ if ($this.treegrid('getSetting', 'saveState') && !$this.treegrid('isFirstInit')) {
+ $this.treegrid('restoreState');
+ } else {
+ if ($this.treegrid('getSetting', 'initialState') === "expanded") {
+ $this.treegrid('expand');
+ } else {
+ $this.treegrid('collapse');
+ }
+ }
+ return $this;
+ },
+ /**
+ * Return true if this tree was never been initialised
+ *
+ * @returns {Boolean}
+ */
+ isFirstInit: function() {
+ var tree = $(this).treegrid('getTreeContainer');
+ if (tree.data('first_init') === undefined) {
+ tree.data('first_init', $.cookie(tree.treegrid('getSetting', 'saveStateName')) === undefined);
+ }
+ return tree.data('first_init');
+ },
+ /**
+ * Save state of current node
+ *
+ * @returns {Node}
+ */
+ saveState: function() {
+ var $this = $(this);
+ if ($this.treegrid('getSetting', 'saveStateMethod') === 'cookie') {
+
+ var stateArrayString = $.cookie($this.treegrid('getSetting', 'saveStateName')) || '';
+ var stateArray = (stateArrayString === '' ? [] : stateArrayString.split(','));
+ var nodeId = $this.treegrid('getNodeId');
+
+ if ($this.treegrid('isExpanded')) {
+ if ($.inArray(nodeId, stateArray) === -1) {
+ stateArray.push(nodeId);
+ }
+ } else if ($this.treegrid('isCollapsed')) {
+ if ($.inArray(nodeId, stateArray) !== -1) {
+ stateArray.splice($.inArray(nodeId, stateArray), 1);
+ }
+ }
+ $.cookie($this.treegrid('getSetting', 'saveStateName'), stateArray.join(','));
+ }
+ return $this;
+ },
+ /**
+ * Restore state of current node.
+ *
+ * @returns {Node}
+ */
+ restoreState: function() {
+ var $this = $(this);
+ if ($this.treegrid('getSetting', 'saveStateMethod') === 'cookie') {
+ var stateArray = $.cookie($this.treegrid('getSetting', 'saveStateName')).split(',');
+ if ($.inArray($this.treegrid('getNodeId'), stateArray) !== -1) {
+ $this.treegrid('expand');
+ } else {
+ $this.treegrid('collapse');
+ }
+
+ }
+ return $this;
+ },
+ /**
+ * Method return setting by name
+ *
+ * @param {type} name
+ * @returns {unresolved}
+ */
+ getSetting: function(name) {
+ if (!$(this).treegrid('getTreeContainer')) {
+ return null;
+ }
+ return $(this).treegrid('getTreeContainer').data('settings')[name];
+ },
+ /**
+ * Add new settings
+ *
+ * @param {Object} settings
+ */
+ setSettings: function(settings) {
+ $(this).treegrid('getTreeContainer').data('settings', settings);
+ },
+ /**
+ * Return tree container
+ *
+ * @returns {HtmlElement}
+ */
+ getTreeContainer: function() {
+ return $(this).data('treegrid');
+ },
+ /**
+ * Set tree container
+ *
+ * @param {HtmlE;ement} container
+ */
+ setTreeContainer: function(container) {
+ return $(this).data('treegrid', container);
+ },
+ /**
+ * Method return all root nodes of tree.
+ *
+ * Start init all child nodes from it.
+ *
+ * @returns {Array}
+ */
+ getRootNodes: function() {
+ return $(this).treegrid('getSetting', 'getRootNodes').apply(this, [$(this).treegrid('getTreeContainer')]);
+ },
+ /**
+ * Method return all nodes of tree.
+ *
+ * @returns {Array}
+ */
+ getAllNodes: function() {
+ return $(this).treegrid('getSetting', 'getAllNodes').apply(this, [$(this).treegrid('getTreeContainer')]);
+ },
+ /**
+ * Mthod return true if element is Node
+ *
+ * @returns {String}
+ */
+ isNode: function() {
+ return $(this).treegrid('getNodeId') !== null;
+ },
+ /**
+ * Mthod return id of node
+ *
+ * @returns {String}
+ */
+ getNodeId: function() {
+ if ($(this).treegrid('getSetting', 'getNodeId') === null) {
+ return null;
+ } else {
+ return $(this).treegrid('getSetting', 'getNodeId').apply(this);
+ }
+ },
+ /**
+ * Method return parent id of node or null if root node
+ *
+ * @returns {String}
+ */
+ getParentNodeId: function() {
+ return $(this).treegrid('getSetting', 'getParentNodeId').apply(this);
+ },
+ /**
+ * Method return parent node or null if root node
+ *
+ * @returns {Object[]}
+ */
+ getParentNode: function() {
+ if ($(this).treegrid('getParentNodeId') === null) {
+ return null;
+ } else {
+ return $(this).treegrid('getSetting', 'getNodeById').apply(this, [$(this).treegrid('getParentNodeId'), $(this).treegrid('getTreeContainer')]);
+ }
+ },
+ /**
+ * Method return array of child nodes or null if node is leaf
+ *
+ * @returns {Object[]}
+ */
+ getChildNodes: function() {
+ return $(this).treegrid('getSetting', 'getChildNodes').apply(this, [$(this).treegrid('getNodeId'), $(this).treegrid('getTreeContainer')]);
+ },
+ /**
+ * Method return depth of tree.
+ *
+ * This method is needs for calculate indent
+ *
+ * @returns {Number}
+ */
+ getDepth: function() {
+ if ($(this).treegrid('getParentNode') === null) {
+ return 0;
+ }
+ return $(this).treegrid('getParentNode').treegrid('getDepth') + 1;
+ },
+ /**
+ * Method return true if node is root
+ *
+ * @returns {Boolean}
+ */
+ isRoot: function() {
+ return $(this).treegrid('getDepth') === 0;
+ },
+ /**
+ * Method return true if node has no child nodes
+ *
+ * @returns {Boolean}
+ */
+ isLeaf: function() {
+ return $(this).treegrid('getChildNodes').length === 0;
+ },
+ /**
+ * Method return true if node last in branch
+ *
+ * @returns {Boolean}
+ */
+ isLast: function() {
+ if ($(this).treegrid('isNode')) {
+ var parentNode = $(this).treegrid('getParentNode');
+ if (parentNode === null) {
+ if ($(this).treegrid('getNodeId') === $(this).treegrid('getRootNodes').last().treegrid('getNodeId')) {
+ return true;
+ }
+ } else {
+ if ($(this).treegrid('getNodeId') === parentNode.treegrid('getChildNodes').last().treegrid('getNodeId')) {
+ return true;
+ }
+ }
+ }
+ return false;
+ },
+ /**
+ * Method return true if node first in branch
+ *
+ * @returns {Boolean}
+ */
+ isFirst: function() {
+ if ($(this).treegrid('isNode')) {
+ var parentNode = $(this).treegrid('getParentNode');
+ if (parentNode === null) {
+ if ($(this).treegrid('getNodeId') === $(this).treegrid('getRootNodes').first().treegrid('getNodeId')) {
+ return true;
+ }
+ } else {
+ if ($(this).treegrid('getNodeId') === parentNode.treegrid('getChildNodes').first().treegrid('getNodeId')) {
+ return true;
+ }
+ }
+ }
+ return false;
+ },
+ /**
+ * Return true if node expanded
+ *
+ * @returns {Boolean}
+ */
+ isExpanded: function() {
+ return $(this).hasClass('treegrid-expanded');
+ },
+ /**
+ * Return true if node collapsed
+ *
+ * @returns {Boolean}
+ */
+ isCollapsed: function() {
+ return $(this).hasClass('treegrid-collapsed');
+ },
+ /**
+ * Return true if at least one of parent node is collapsed
+ *
+ * @returns {Boolean}
+ */
+ isOneOfParentsCollapsed: function() {
+ var $this = $(this);
+ if ($this.treegrid('isRoot')) {
+ return false;
+ } else {
+ if ($this.treegrid('getParentNode').treegrid('isCollapsed')) {
+ return true;
+ } else {
+ return $this.treegrid('getParentNode').treegrid('isOneOfParentsCollapsed');
+ }
+ }
+ },
+ /**
+ * Expand node
+ *
+ * @returns {Node}
+ */
+ expand: function() {
+ if (!this.treegrid('isLeaf') && !this.treegrid("isExpanded")) {
+ this.trigger("expand");
+ this.trigger("change");
+ return this;
+ }
+ return this;
+ },
+ /**
+ * Expand all nodes
+ *
+ * @returns {Node}
+ */
+ expandAll: function() {
+ var $this = $(this);
+ $this.treegrid('getRootNodes').treegrid('expandRecursive');
+ return $this;
+ },
+ /**
+ * Expand current node and all child nodes begin from current
+ *
+ * @returns {Node}
+ */
+ expandRecursive: function() {
+ return $(this).each(function() {
+ var $this = $(this);
+ $this.treegrid('expand');
+ if (!$this.treegrid('isLeaf')) {
+ $this.treegrid('getChildNodes').treegrid('expandRecursive');
+ }
+ });
+ },
+ /**
+ * Collapse node
+ *
+ * @returns {Node}
+ */
+ collapse: function() {
+ return $(this).each(function() {
+ var $this = $(this);
+ if (!$this.treegrid('isLeaf') && !$this.treegrid("isCollapsed")) {
+ $this.trigger("collapse");
+ $this.trigger("change");
+ }
+ });
+ },
+ /**
+ * Collapse all nodes
+ *
+ * @returns {Node}
+ */
+ collapseAll: function() {
+ var $this = $(this);
+ $this.treegrid('getRootNodes').treegrid('collapseRecursive');
+ return $this;
+ },
+ /**
+ * Collapse current node and all child nodes begin from current
+ *
+ * @returns {Node}
+ */
+ collapseRecursive: function() {
+ return $(this).each(function() {
+ var $this = $(this);
+ $this.treegrid('collapse');
+ if (!$this.treegrid('isLeaf')) {
+ $this.treegrid('getChildNodes').treegrid('collapseRecursive');
+ }
+ });
+ },
+ /**
+ * Expand if collapsed, Collapse if expanded
+ *
+ * @returns {Node}
+ */
+ toggle: function() {
+ var $this = $(this);
+ if ($this.treegrid('isExpanded')) {
+ $this.treegrid('collapse');
+ } else {
+ $this.treegrid('expand');
+ }
+ return $this;
+ },
+ /**
+ * Rendering node
+ *
+ * @returns {Node}
+ */
+ render: function() {
+ return $(this).each(function() {
+ var $this = $(this);
+ //if parent colapsed we hidden
+ if ($this.treegrid('isOneOfParentsCollapsed')) {
+ $this.hide();
+ } else {
+ $this.show();
+ }
+ if (!$this.treegrid('isLeaf')) {
+ $this.treegrid('renderExpander');
+ $this.treegrid('getChildNodes').treegrid('render');
+ }
+ });
+ },
+ /**
+ * Rendering expander depends on node state
+ *
+ * @returns {Node}
+ */
+ renderExpander: function() {
+ return $(this).each(function() {
+ var $this = $(this);
+ var expander = $this.treegrid('getSetting', 'getExpander').apply(this);
+ if (expander) {
+
+ if (!$this.treegrid('isCollapsed')) {
+ expander.removeClass($this.treegrid('getSetting', 'expanderCollapsedClass'));
+ expander.addClass($this.treegrid('getSetting', 'expanderExpandedClass'));
+ } else {
+ expander.removeClass($this.treegrid('getSetting', 'expanderExpandedClass'));
+ expander.addClass($this.treegrid('getSetting', 'expanderCollapsedClass'));
+ }
+ } else {
+ $this.treegrid('initExpander');
+ $this.treegrid('renderExpander');
+ }
+ });
+ }
+ };
+ $.fn.treegrid = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+ } else if (typeof method === 'object' || !method) {
+ return methods.initTree.apply(this, arguments);
+ } else {
+ $.error('Method with name ' + method + ' does not exists for jQuery.treegrid');
+ }
+ };
+ /**
+ * Plugin's default options
+ */
+ $.fn.treegrid.defaults = {
+ initialState: 'expanded',
+ saveState: false,
+ saveStateMethod: 'cookie',
+ saveStateName: 'tree-grid-state',
+ expanderTemplate: '<span class="treegrid-expander"></span>',
+ indentTemplate: '<span class="treegrid-indent"></span>',
+ expanderExpandedClass: 'treegrid-expander-expanded',
+ expanderCollapsedClass: 'treegrid-expander-collapsed',
+ treeColumn: 0,
+ getExpander: function() {
+ return $(this).find('.treegrid-expander');
+ },
+ getNodeId: function() {
+ var template = /treegrid-([A-Za-z0-9_-]+)/;
+ if (template.test($(this).attr('class'))) {
+ return template.exec($(this).attr('class'))[1];
+ }
+ return null;
+ },
+ getParentNodeId: function() {
+ var template = /treegrid-parent-([A-Za-z0-9_-]+)/;
+ if (template.test($(this).attr('class'))) {
+ return template.exec($(this).attr('class'))[1];
+ }
+ return null;
+ },
+ getNodeById: function(id, treegridContainer) {
+ var templateClass = "treegrid-" + id;
+ return treegridContainer.find('tr.' + templateClass);
+ },
+ getChildNodes: function(id, treegridContainer) {
+ var templateClass = "treegrid-parent-" + id;
+ return treegridContainer.find('tr.' + templateClass);
+ },
+ getTreeGridContainer: function() {
+ return $(this).closest('table');
+ },
+ getRootNodes: function(treegridContainer) {
+ var result = $.grep(treegridContainer.find('tr'), function(element) {
+ var classNames = $(element).attr('class');
+ var templateClass = /treegrid-([A-Za-z0-9_-]+)/;
+ var templateParentClass = /treegrid-parent-([A-Za-z0-9_-]+)/;
+ return templateClass.test(classNames) && !templateParentClass.test(classNames);
+ });
+ return $(result);
+ },
+ getAllNodes: function(treegridContainer) {
+ var result = $.grep(treegridContainer.find('tr'), function(element) {
+ var classNames = $(element).attr('class');
+ var templateClass = /treegrid-([A-Za-z0-9_-]+)/;
+ return templateClass.test(classNames);
+ });
+ return $(result);
+ },
+ //Events
+ onCollapse: null,
+ onExpand: null,
+ onChange: null
+
+ };
+})(jQuery);
diff --git a/admportal/public/javascripts/sla.js b/admportal/public/javascripts/sla.js new file mode 100644 index 00000000..53c49316 --- /dev/null +++ b/admportal/public/javascripts/sla.js @@ -0,0 +1,9 @@ +function uploadDG(form) +{ + if ( form.filename.value.length == 0) + { + alert('Must select a file.'); + return false; + } + else { form.submit(); return; } +} diff --git a/admportal/public/stylesheets/bootstrap-submenu.css b/admportal/public/stylesheets/bootstrap-submenu.css new file mode 100644 index 00000000..91e88db3 --- /dev/null +++ b/admportal/public/stylesheets/bootstrap-submenu.css @@ -0,0 +1,125 @@ +/*! + * Bootstrap-submenu v2.0.3 (https://vsn4ik.github.io/bootstrap-submenu/) + * Copyright 2015 Vasily A. (https://github.com/vsn4ik) + * Licensed under the MIT license + */ + +.dropdown-submenu > a:after { + content: ""; +} +@media (min-width: 768px) { + .dropdown-submenu { + position: relative; + } + .dropdown-submenu .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + border-top-left-radius: 0; + } + .dropup .dropdown-submenu .dropdown-menu, + .navbar-fixed-bottom .dropdown-submenu .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -6px; + border-top-left-radius: 4px; + border-bottom-left-radius: 0; + } + .dropdown-menu-right .dropdown-submenu .dropdown-menu, + .navbar-right .dropdown-submenu .dropdown-menu { + left: auto; + right: 100%; + border-top-left-radius: 4px; + border-top-right-radius: 0; + } + .dropup .dropdown-menu-right .dropdown-submenu .dropdown-menu, + .dropup .navbar-right .dropdown-submenu .dropdown-menu, + .navbar-fixed-bottom .dropdown-menu-right .dropdown-submenu .dropdown-menu, + .navbar-fixed-bottom .navbar-right .dropdown-submenu .dropdown-menu { + border-radius: 4px 4px 0; + } + .dropdown-submenu > a:after { + float: right; + margin-top: 6px; + margin-right: -10px; + border-left: 4px dashed; + border-top: 4px solid transparent; + border-bottom: 4px solid transparent; + } + .dropdown-menu-right .dropdown-submenu > a:after, + .navbar-right .dropdown-submenu > a:after { + float: left; + border-left: none; + margin-left: -10px; + margin-right: 0; + border-right: 4px dashed; + border-top: 4px solid transparent; + border-bottom: 4px solid transparent; + } +} +@media (max-width: 767px) { + .dropdown-submenu .dropdown-menu { + position: static; + margin-top: 0; + border: 0; + box-shadow: none; + } + .dropdown-submenu > a:after { + margin-left: 6px; + display: inline-block; + vertical-align: middle; + border-top: 4px dashed; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + } + .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li.dropdown-header, + .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li.dropdown-header, + .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li.dropdown-header, + .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > a, + .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > a, + .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > a { + padding-left: 30px; + } + .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li.dropdown-header, + .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li.dropdown-header, + .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li.dropdown-header, + .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > a, + .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > a, + .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > a { + padding-left: 40px; + } + .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header, + .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header, + .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header, + .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a, + .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a, + .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a { + padding-left: 50px; + } + .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header, + .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header, + .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header, + .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a, + .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a, + .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a { + padding-left: 60px; + } + .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li.dropdown-header, + .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > a { + padding-left: 35px; + } + .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li.dropdown-header, + .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > a { + padding-left: 45px; + } + .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header, + .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a { + padding-left: 55px; + } + .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header, + .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a { + padding-left: 65px; + } +} +/*# sourceMappingURL=bootstrap-submenu.css.map */
\ No newline at end of file diff --git a/admportal/public/stylesheets/bootstrap-submenu.css.map b/admportal/public/stylesheets/bootstrap-submenu.css.map new file mode 100644 index 00000000..4ab4300a --- /dev/null +++ b/admportal/public/stylesheets/bootstrap-submenu.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/bootstrap-submenu.less","less/mixins.less"],"names":[],"mappings":"AAYA,iBAAkB,IAAG;EACnB,SAAS,EAAT;;AA2DF,QAxD2C;EACzC;IACE,kBAAA;;EADF,iBAGE;IACE,MAAA;IACA,UAAA;IACA,gBAAA;IACA,yBAAA;;EAGA,OAAQ,kBAPV;EAQE,oBAAqB,kBARvB;IASI,SAAA;IACA,SAAA;IACA,aAAA;IACA,mBAAA;IACA,2BAAA;IACA,4BAAA;;EAGF,oBAAqB,kBAjBvB;EAkBE,aAAc,kBAlBhB;IAmBI,UAAA;IACA,WAAA;IAEA,2BAAA;IACA,0BAAA;;EAEA,OAAQ,qBARW,kBAjBvB;EAyBI,OAAQ,cAPI,kBAlBhB;EA0BI,oBAAqB,qBATF,kBAjBvB;EA0BI,oBAAqB,cART,kBAlBhB;IA2BM,wBAAA;;EA9BR,iBAmCE,IAAG;IACD,YAAA;IACA,eAAA;IACA,mBAAA;ICrDJ,uBAAA;IAEA,iCAAA;IACA,oCAAA;;EDsDI,oBAAqB,kBAPvB,IAAG;EAQD,aAAc,kBARhB,IAAG;IASC,WAAA;IACA,iBAAA;IACA,kBAAA;IACA,eAAA;IC9DN,wBAAA;IAEA,iCAAA;IACA,oCAAA;;;ADiGF,QA9B+C;EAC7C,iBACE;IACE,gBAAA;IACA,aAAA;IACA,SAAA;IACA,gBAAA;;EALJ,iBAQE,IAAG;IACD,gBAAA;IACA,qBAAA;IACA,sBAAA;IClFJ,sBAAA;IAEA,kCAAA;IACA,mCAAA;;EAKE,SDiFU,iBADG,oBCjFf,iBAAiB,KACd;EAAD,ODkFQ,iBAFK,oBCjFf,iBAAiB,KACd;EAAD,UDmFW,iBAHE,oBCjFf,iBAAiB,KACd;EDiFD,SAAU,iBADG,oBCjFf,iBAAiB,KAEf;EDiFA,OAAQ,iBAFK,oBCjFf,iBAAiB,KAEf;EDkFA,UAAW,iBAHE,oBCjFf,iBAAiB,KAEf;IACE,kBAAA;;EAFF,SDiFU,iBADG,oBCjFf,iBAAiB,KAAjB,iBAAiB,KACd;EAAD,ODkFQ,iBAFK,oBCjFf,iBAAiB,KAAjB,iBAAiB,KACd;EAAD,UDmFW,iBAHE,oBCjFf,iBAAiB,KAAjB,iBAAiB,KACd;EDiFD,SAAU,iBADG,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAEf;EDiFA,OAAQ,iBAFK,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAEf;EDkFA,UAAW,iBAHE,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAEf;IACE,kBAAA;;EAFF,SDiFU,iBADG,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EAAD,ODkFQ,iBAFK,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EAAD,UDmFW,iBAHE,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EDiFD,SAAU,iBADG,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;EDiFA,OAAQ,iBAFK,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;EDkFA,UAAW,iBAHE,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;IACE,kBAAA;;EAFF,SDiFU,iBADG,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EAAD,ODkFQ,iBAFK,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EAAD,UDmFW,iBAHE,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EDiFD,SAAU,iBADG,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;EDiFA,OAAQ,iBAFK,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;EDkFA,UAAW,iBAHE,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;IACE,kBAAA;;EAFF,WDuFY,YAAY,iBAPX,oBCjFf,iBAAiB,KACd;EDuFD,WAAY,YAAY,iBAPX,oBCjFf,iBAAiB,KAEf;IACE,kBAAA;;EAFF,WDuFY,YAAY,iBAPX,oBCjFf,iBAAiB,KAAjB,iBAAiB,KACd;EDuFD,WAAY,YAAY,iBAPX,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAEf;IACE,kBAAA;;EAFF,WDuFY,YAAY,iBAPX,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EDuFD,WAAY,YAAY,iBAPX,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;IACE,kBAAA;;EAFF,WDuFY,YAAY,iBAPX,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EDuFD,WAAY,YAAY,iBAPX,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;IACE,kBAAA","sourcesContent":["// :after: friends with IE8. Use ::after in future.\n\n@import \"../node_modules/bootstrap/less/variables.less\";\n@import \"mixins.less\";\n\n// Variables\n@caret-margin: -@caret-width-base * 2 - 2;\n\n//\n// Sub-Menus\n// --------------------------------------------------\n\n.dropdown-submenu > a:after {\n content: \"\";\n}\n\n@media (min-width: @grid-float-breakpoint) {\n .dropdown-submenu {\n position: relative;\n\n .dropdown-menu {\n top: 0;\n left: 100%;\n margin-top: -6px;\n border-top-left-radius: 0;\n\n // Strictly before .dropdown-menu-right\n .dropup &,\n .navbar-fixed-bottom & {\n top: auto;\n bottom: 0;\n margin-top: 0;\n margin-bottom: -6px;\n border-top-left-radius: @border-radius-base;\n border-bottom-left-radius: 0;\n }\n\n .dropdown-menu-right &,\n .navbar-right & {\n left: auto;\n right: 100%;\n\n border-top-left-radius: @border-radius-base;\n border-top-right-radius: 0;\n\n .dropup &,\n .navbar-fixed-bottom & {\n border-radius: @border-radius-base @border-radius-base 0;\n }\n }\n }\n\n > a:after {\n float: right;\n margin-top: @line-height-computed / 2 - @caret-width-base;\n margin-right: @caret-margin;\n\n .make-caret(left, top, bottom);\n\n .dropdown-menu-right &,\n .navbar-right & {\n float: left;\n border-left: none;\n margin-left: @caret-margin;\n margin-right: 0;\n\n .make-caret(right, top, bottom);\n }\n }\n }\n}\n\n@media (max-width: @grid-float-breakpoint-max) {\n .dropdown-submenu {\n .dropdown-menu {\n position: static;\n margin-top: 0;\n border: 0;\n box-shadow: none;\n }\n\n > a:after {\n margin-left: 6px;\n display: inline-block;\n vertical-align: middle;\n\n .make-caret(top, left, right);\n }\n }\n\n .dropdown-menu > .dropdown-submenu {\n .dropdown > &,\n .dropup > &,\n .btn-group > & {\n .make-nested-list(30px, 0, 4);\n }\n\n .navbar-nav > .dropdown > & {\n .make-nested-list(35px, 0, 4);\n }\n }\n}\n",".make-caret(@base, @left, @right) {\n // dashed: fix caret size for Mozilla Firefox\n border-@{base}: @caret-width-base dashed;\n\n border-@{left}: @caret-width-base solid transparent;\n border-@{right}: @caret-width-base solid transparent;\n}\n\n.make-nested-list(@offset, @i, @n) when (@i < @n) {\n > .dropdown-menu > li {\n &.dropdown-header,\n > a {\n padding-left: @offset + (10 * @i);\n }\n\n .make-nested-list(@offset, @i + 1, @n);\n }\n}\n"]}
\ No newline at end of file diff --git a/admportal/public/stylesheets/bootstrap-submenu.min.css b/admportal/public/stylesheets/bootstrap-submenu.min.css new file mode 100644 index 00000000..7199e0d8 --- /dev/null +++ b/admportal/public/stylesheets/bootstrap-submenu.min.css @@ -0,0 +1,8 @@ +/*! + * Bootstrap-submenu v2.0.3 (https://vsn4ik.github.io/bootstrap-submenu/) + * Copyright 2015 Vasily A. (https://github.com/vsn4ik) + * Licensed under the MIT license + */ + +.dropdown-submenu>a:after{content:""}@media (min-width:768px){.dropdown-submenu{position:relative}.dropdown-submenu .dropdown-menu{top:0;left:100%;margin-top:-6px;border-top-left-radius:0}.dropup .dropdown-submenu .dropdown-menu,.navbar-fixed-bottom .dropdown-submenu .dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-6px;border-top-left-radius:4px;border-bottom-left-radius:0}.dropdown-menu-right .dropdown-submenu .dropdown-menu,.navbar-right .dropdown-submenu .dropdown-menu{left:auto;right:100%;border-top-left-radius:4px;border-top-right-radius:0}.dropup .dropdown-menu-right .dropdown-submenu .dropdown-menu,.dropup .navbar-right .dropdown-submenu .dropdown-menu,.navbar-fixed-bottom .dropdown-menu-right .dropdown-submenu .dropdown-menu,.navbar-fixed-bottom .navbar-right .dropdown-submenu .dropdown-menu{border-radius:4px 4px 0}.dropdown-submenu>a:after{float:right;margin-top:6px;margin-right:-10px;border-left:4px dashed;border-top:4px solid transparent;border-bottom:4px solid transparent}.dropdown-menu-right .dropdown-submenu>a:after,.navbar-right .dropdown-submenu>a:after{float:left;border-left:none;margin-left:-10px;margin-right:0;border-right:4px dashed;border-top:4px solid transparent;border-bottom:4px solid transparent}}@media (max-width:767px){.dropdown-submenu .dropdown-menu{position:static;margin-top:0;border:0;box-shadow:none}.dropdown-submenu>a:after{margin-left:6px;display:inline-block;vertical-align:middle;border-top:4px dashed;border-left:4px solid transparent;border-right:4px solid transparent}.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li.dropdown-header,.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>a,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li.dropdown-header,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>a,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li.dropdown-header,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>a{padding-left:30px}.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>a,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>a,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:40px}.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:50px}.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:60px}.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li.dropdown-header,.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>a{padding-left:35px}.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:45px}.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:55px}.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:65px}} +/*# sourceMappingURL=bootstrap-submenu.min.css.map */
\ No newline at end of file diff --git a/admportal/public/stylesheets/bootstrap-submenu.min.css.map b/admportal/public/stylesheets/bootstrap-submenu.min.css.map new file mode 100644 index 00000000..6eab8c7c --- /dev/null +++ b/admportal/public/stylesheets/bootstrap-submenu.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/bootstrap-submenu.less","less/mixins.less"],"names":[],"mappings":"AAYqB,0BACnB,QAAA,GAGyC,yBACzC,kBACE,SAAA,SAEA,iCACE,IAAA,EACA,KAAA,KACA,WAAA,KACA,uBAAA,EAJF,yCAAA,sDASI,IAAA,KACA,OAAA,EACA,WAAA,EACA,cAAA,KACA,uBAAA,IACA,0BAAA,EAdJ,sDAAA,+CAmBI,KAAA,KACA,MAAA,KAEA,uBAAA,IACA,wBAAA,EAvBJ,8DAAA,uDAAA,2EAAA,oEA2BM,cAAA,IAAA,IAAA,EAKH,0BACD,MAAA,MACA,WAAA,IACA,aAAA,MCrDJ,YAAA,IAAA,OAEA,WAAA,IAAA,MAAA,YACA,cAAA,IAAA,MAAA,YD+CK,+CAAA,wCASC,MAAA,KACA,YAAA,KACA,YAAA,MACA,aAAA,EC9DN,aAAA,IAAA,OAEA,WAAA,IAAA,MAAA,YACA,cAAA,IAAA,MAAA,aDmE6C,yBAE3C,iCACE,SAAA,OACA,WAAA,EACA,OAAA,EACA,WAAA,KAGC,0BACD,YAAA,IACA,QAAA,aACA,eAAA,OClFJ,WAAA,IAAA,OAEA,YAAA,IAAA,MAAA,YACA,aAAA,IAAA,MAAA,YAKG,8EACD,gEADC,6EACD,+DADC,2EACD,6DACE,aAAA,KAFD,gGACD,kFADC,+FACD,iFADC,6FACD,+EACE,aAAA,KAFD,kHACD,oGADC,iHACD,mGADC,+GACD,iGACE,aAAA,KAFD,oIACD,sHADC,mIACD,qHADC,iIACD,mHACE,aAAA,KAFD,yFACD,2EACE,aAAA,KAFD,2GACD,6FACE,aAAA,KAFD,6HACD,+GACE,aAAA,KAFD,+IACD,iIACE,aAAA"}
\ No newline at end of file diff --git a/admportal/public/stylesheets/bootstrap-table.css b/admportal/public/stylesheets/bootstrap-table.css new file mode 100644 index 00000000..66d56318 --- /dev/null +++ b/admportal/public/stylesheets/bootstrap-table.css @@ -0,0 +1,297 @@ +/** + * @author zhixin wen <wenzhixin2010@gmail.com> + * version: 1.8.1 + * https://github.com/wenzhixin/bootstrap-table/ + */ + +.bootstrap-table .table { + margin-bottom: 0 !important; + border-bottom: 1px solid #dddddd; + border-collapse: collapse !important; + border-radius: 1px; +} + +.bootstrap-table .table:not(.table-condensed), +.bootstrap-table .table:not(.table-condensed) > tbody > tr > th, +.bootstrap-table .table:not(.table-condensed) > tfoot > tr > th, +.bootstrap-table .table:not(.table-condensed) > thead > tr > td, +.bootstrap-table .table:not(.table-condensed) > tbody > tr > td, +.bootstrap-table .table:not(.table-condensed) > tfoot > tr > td { + padding: 8px !important; +} + +.bootstrap-table .table.table-no-bordered > thead > tr > th, +.bootstrap-table .table.table-no-bordered > tbody > tr > td { + border-right: 2px solid transparent; +} + +.fixed-table-container { + position: relative; + clear: both; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; +} + +.fixed-table-container.table-no-bordered { + border: 1px solid transparent; +} + +.fixed-table-footer, +.fixed-table-header { + overflow: hidden; +} + +.fixed-table-footer { + border-top: 1px solid #dddddd; +} + +.fixed-table-body { + overflow-x: auto; + overflow-y: auto; + height: 100%; +} + +.fixed-table-container table { + width: 100%; +} + +.fixed-table-container thead th { + height: 0; + padding: 0; + margin: 0; + border-left: 1px solid #dddddd; +} + +.fixed-table-container thead th:first-child { + border-left: none; + border-top-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.fixed-table-container thead th .th-inner, +.fixed-table-container tbody td .th-inner { + padding: 8px; + line-height: 24px; + vertical-align: top; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.fixed-table-container thead th .sortable { + cursor: pointer; + background-position: right; + background-repeat: no-repeat; + padding-right: 30px; +} + +.fixed-table-container thead th .both { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC'); +} + +.fixed-table-container thead th .asc { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg=='); +} + +.fixed-table-container thead th .desc { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= '); +} + +.fixed-table-container th.detail { + width: 30px; +} + +.fixed-table-container tbody td { + border-left: 1px solid #dddddd; +} + +.fixed-table-container tbody tr:first-child td { + border-top: none; +} + +.fixed-table-container tbody td:first-child { + border-left: none; +} + +/* the same color with .active */ +.fixed-table-container tbody .selected td { + background-color: #f5f5f5; +} + +.fixed-table-container .bs-checkbox { + text-align: center; +} + +.fixed-table-container .bs-checkbox .th-inner { + padding: 8px 0; +} + +.fixed-table-container input[type="radio"], +.fixed-table-container input[type="checkbox"] { + margin: 0 auto !important; +} + +.fixed-table-container .no-records-found { + text-align: center; +} + +.fixed-table-pagination div.pagination, +.fixed-table-pagination .pagination-detail { + margin-top: 10px; + margin-bottom: 10px; +} + +.fixed-table-pagination div.pagination .pagination { + margin: 0; +} + +.fixed-table-pagination .pagination a { + padding: 6px 12px; + line-height: 1.428571429; +} + +.fixed-table-pagination .pagination-info { + line-height: 34px; + margin-right: 5px; +} + +.fixed-table-pagination .btn-group { + position: relative; + display: inline-block; + vertical-align: middle; +} + +.fixed-table-pagination .dropup .dropdown-menu { + margin-bottom: 0; +} + +.fixed-table-pagination .page-list { + display: inline-block; +} + +.fixed-table-toolbar .columns-left { + margin-right: 5px; +} + +.fixed-table-toolbar .columns-right { + margin-left: 5px; +} + +.fixed-table-toolbar .columns label { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; +} + +.fixed-table-toolbar .bars, +.fixed-table-toolbar .search, +.fixed-table-toolbar .columns { + position: relative; + margin-top: 10px; + margin-bottom: 10px; + line-height: 34px; +} + +.fixed-table-pagination li.disabled a { + pointer-events: none; + cursor: default; +} + +.fixed-table-loading { + display: none; + position: absolute; + top: 42px; + right: 0; + bottom: 0; + left: 0; + z-index: 99; + background-color: #fff; + text-align: center; +} + +.fixed-table-body .card-view .title { + font-weight: bold; + display: inline-block; + min-width: 30%; + text-align: left !important; +} + +/* support bootstrap 2 */ +.fixed-table-body thead th .th-inner { + box-sizing: border-box; +} + +.table th, .table td { + vertical-align: middle; + box-sizing: border-box; +} + +.fixed-table-toolbar .dropdown-menu { + text-align: left; + max-height: 300px; + overflow: auto; +} + +.fixed-table-toolbar .btn-group > .btn-group { + display: inline-block; + margin-left: -1px !important; +} + +.fixed-table-toolbar .btn-group > .btn-group > .btn { + border-radius: 0; +} + +.fixed-table-toolbar .btn-group > .btn-group:first-child > .btn { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} + +.fixed-table-toolbar .btn-group > .btn-group:last-child > .btn { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.bootstrap-table .table > thead > tr > th { + vertical-align: bottom; + border-bottom: 1px solid #ddd; +} + +/* support bootstrap 3 */ +.bootstrap-table .table thead > tr > th { + padding: 0; + margin: 0; +} + +.bootstrap-table .fixed-table-footer tbody > tr > td { + padding: 0 !important; +} + +.bootstrap-table .fixed-table-footer .table { + border-bottom: none; + border-radius: 0; +} + +.pull-right .dropdown-menu { + right: 0; + left: auto; +} + +/* calculate scrollbar width */ +p.fixed-table-scroll-inner { + width: 100%; + height: 200px; +} + +div.fixed-table-scroll-outer { + top: 0; + left: 0; + visibility: hidden; + width: 200px; + height: 150px; + overflow: hidden; +} diff --git a/admportal/public/stylesheets/bootstrap-theme.min.css b/admportal/public/stylesheets/bootstrap-theme.min.css new file mode 100644 index 00000000..dc95d8e4 --- /dev/null +++ b/admportal/public/stylesheets/bootstrap-theme.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} +/*# sourceMappingURL=bootstrap-theme.min.css.map */
\ No newline at end of file diff --git a/admportal/public/stylesheets/bootstrap.min.css b/admportal/public/stylesheets/bootstrap.min.css new file mode 100644 index 00000000..4cf729e4 --- /dev/null +++ b/admportal/public/stylesheets/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */
\ No newline at end of file diff --git a/admportal/public/stylesheets/dataTables.bootstrap.min.css b/admportal/public/stylesheets/dataTables.bootstrap.min.css new file mode 100644 index 00000000..745f2996 --- /dev/null +++ b/admportal/public/stylesheets/dataTables.bootstrap.min.css @@ -0,0 +1 @@ +table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable{border-collapse:separate !important}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0} diff --git a/admportal/public/stylesheets/jquery.treegrid.css b/admportal/public/stylesheets/jquery.treegrid.css new file mode 100644 index 00000000..b5bf0de7 --- /dev/null +++ b/admportal/public/stylesheets/jquery.treegrid.css @@ -0,0 +1,6 @@ +.treegrid-indent {width:16px; height: 16px; display: inline-block; position: relative;}
+
+.treegrid-expander {width:16px; height: 16px; display: inline-block; position: relative; cursor: pointer;}
+
+.treegrid-expander-expanded{background-image: url(../img/collapse.png); }
+.treegrid-expander-collapsed{background-image: url(../img/expand.png);}
diff --git a/admportal/public/stylesheets/signin.css b/admportal/public/stylesheets/signin.css new file mode 100644 index 00000000..995df48e --- /dev/null +++ b/admportal/public/stylesheets/signin.css @@ -0,0 +1,40 @@ +body { + padding-top: 40px; + padding-bottom: 40px; + background-color: #eee; +} + +.form-signin { + max-width: 330px; + padding: 15px; + margin: 0 auto; +} +.form-signin .form-signin-heading, +.form-signin .checkbox { + margin-bottom: 10px; +} +.form-signin .checkbox { + font-weight: normal; +} +.form-signin .form-control { + position: relative; + height: auto; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 10px; + font-size: 16px; +} +.form-signin .form-control:focus { + z-index: 2; +} +.form-signin input[type="email"] { + margin-bottom: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.form-signin input[type="password"] { + margin-bottom: 10px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} diff --git a/admportal/public/stylesheets/style.css b/admportal/public/stylesheets/style.css new file mode 100644 index 00000000..30e047da --- /dev/null +++ b/admportal/public/stylesheets/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +}
\ No newline at end of file diff --git a/admportal/routes/index.js b/admportal/routes/index.js new file mode 100644 index 00000000..896c9482 --- /dev/null +++ b/admportal/routes/index.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res) { + res.render('index', { title: 'Express' }); +}); + +module.exports = router; diff --git a/admportal/routes/users.js b/admportal/routes/users.js new file mode 100644 index 00000000..c00d7de1 --- /dev/null +++ b/admportal/routes/users.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET users listing. */ +router.get('/', function(req, res) { + res.send('respond with a resource'); +}); + +module.exports = router; diff --git a/admportal/server/adminPortal.db b/admportal/server/adminPortal.db Binary files differnew file mode 100644 index 00000000..18429e46 --- /dev/null +++ b/admportal/server/adminPortal.db diff --git a/admportal/server/app.js b/admportal/server/app.js new file mode 100644 index 00000000..33cdb64f --- /dev/null +++ b/admportal/server/app.js @@ -0,0 +1,69 @@ +var express = require('express'); +var app = express(); +var path = require('path'); +var session = require('express-session'); +var cookieParser = require('cookie-parser'); +var bodyParser = require('body-parser'); +var PropertiesReader = require('properties-reader'); +var properties = PropertiesReader(process.argv[2]); //property file passed +var morgan = require('morgan'); +var _ = require('lodash'); +//var multer = require('multer'); +//var done=false; + +// Check to make sure SDNC_CONFIG_DIR is set +var sdnc_config_dir = process.env.SDNC_CONFIG_DIR; +if ( typeof sdnc_config_dir == 'undefined' ) +{ + console.log('ERROR the SDNC_CONFIG_DIR environmental variable is not set.'); + return; +} + + +var moptions = { "stream": +{ + write: function(str) + { + if ( str.indexOf("/javascript") == -1 && str.indexOf("/stylesheets") == -1) + { + console.log(str); + } + } +} +}; +var accesslog = morgan( "|:method|HTTP/:http-version|:status|:url - requestIP-:remote-addr", moptions); + +//var favicon = require('serve-favicon'); + +// initialize session objects +app.use(session({ + secret:'SDN7C', + resave: false, + saveUninitialized: false +})); + +app.use(cookieParser()); +app.use(bodyParser.urlencoded({ + extended: true +})); + +app.use(accesslog); // http access log +app.use(express.static(process.cwd() + '/public')); // static files + + +//app.use('trust proxy', true); +app.enable('trust proxy'); + +// view engine setup +app.set('views', path.join(__dirname, '../views')); +app.set('view engine', 'ejs'); + + +var router = require('./router')(app); + +// Error Handling +app.use(function(err,req,res,next) { + res.status(err.status || 500); +}); + +module.exports = app; diff --git a/admportal/server/netdb_updater.js b/admportal/server/netdb_updater.js new file mode 100644 index 00000000..6dde27b9 --- /dev/null +++ b/admportal/server/netdb_updater.js @@ -0,0 +1,749 @@ +var log4js = require('log4js'); +var http = require('http'); +var async = require('async'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/netdb-updater.json'); +var admProperties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); +var csvtojson = require('csvtojson'); +var mysql = require('mysql'); +var moment = require('moment'); +var os = require('os'); +var fs = require('fs.extra'); + +// Check to make sure SDNC_CONFIG_DIR is set +var sdnc_config_dir = process.env.SDNC_CONFIG_DIR; +if ( typeof sdnc_config_dir == 'undefined' ) +{ + console.log('ERROR the SDNC_CONFIG_DIR environmental variable is not set.'); + return; +} + +// SETUP LOGGER +log4js.configure(process.env.SDNC_CONFIG_DIR + '/netdb.log4js.json'); +var logger = log4js.getLogger('netdb'); +logger.setLevel(properties.netdbLogLevel); + +var yargs = require('yargs') + .usage("\nUsage: node netdb_updater -t link_master|router_master") + .demand('t') + .alias('t', 'table') + .example("Example: node netdb_updater -t link_master","Update SDNC LINK_MASTER table from NetDB.") + .argv; + +var dbTable = yargs.table; +var debug = properties.netdbDebug; +var env = properties.netdbEnv; +var retSuccess = false; + +// DB Setup +var currentDB = ''; +var dbConnection = ''; +var db01 = ''; +var db02 = ''; +var count = 0; +var errorMsg = []; + +var dbtasks = []; +dbtasks.push( function(callback) { checkParams(callback); } ); +dbtasks.push( function(callback) { dbConnect(callback); } ); +//dbtasks.push( function(callback) { netdb(callback); } ); + +logger.debug('\n\n********** START PROCESSING - Env=' + env + ' Debug=' + debug + ' **********'); + +async.series(dbtasks, function(err,result){ + if(err) { + logger.error(err + ' COUNT: ' + count); + } + else { + if ( errorMsg.length > 0 ){ + logger.error(errorMsg); + } + } +}); + + +function checkParams(scb){ + if ( dbTable != 'link_master' && dbTable != 'router_master' ){ + scb("Invalid parameter passed in '" + dbTable + " ' exiting.'"); + } + else{ + scb(null); + } +} + + +async.whilst( + function () { return count < properties.netdbRetryInterval }, + function (callback) { + if ( dbTable == 'link_master' ){ + getLinkMaster(callback); + } + else if (dbTable == 'router_master'){ + getRouterMaster(callback); + } + else{ // should never hit this condition + logger.debug("Invalid parameter passed in '" + dbTable + " ' exiting.'"); + } + }, + function (err) { +logger.debug('whilst err function errorMsg = ' + errorMsg); + // report error + if ( errorMsg.length > 0 ){ + logger.debug(errorMsg + ' COUNT: ' + count); + process.exit(1); + } + else{ + logger.debug('success'); + process.exit(0); + } + } +); + + +function returnError(emsg, cb){ + retSuccess=false; + errorMsg.push(emsg); + if ( count == properties.netdbRetryInterval ) { logger.error(errorMsg); } + setTimeout( function(){ + cb(null); + }, properties.netdbWaitTime); +} + +function returnSuccess(cb){ +logger.debug('inside returnSuccess'); + errorMsg = ''; + //var cnt = properties.netdbRetryInterval; + //logger.debug('b4 inc returnSuccess count=' + count); + //count = ++cnt; + //logger.debug('after inc returnSuccess count=' + count); + //cb(null); + retSuccess=true; +process.exit(0); +} + +function getRouterMaster(cb){ + + logger.info('getRouterMaster debug=' + debug + ' count=' + count); + + // setup connection + var netdbEnv = properties.netdbEnv; + var auth_param = ''; + if ( netdbEnv == 'e2e' || netdbEnv == 'prod' ){ + // conexus network + auth_param = '?auth=' + admProperties['ip-addresses']['eth2'] + ';' + }else{ + // app network + auth_param = '?auth=' + admProperties['ip-addresses']['eth1:0'] + ';' + } + var username = properties.netdbUser;; + var password = properties.netdbPassword; + var date = moment().format('YYYYMMDD'); + var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64'); + var host = properties.netdbHost; + var port = properties.netdbPort; + var path = '/' + properties.netdbPath + + '/' + properties.netdbNetwork + + '/' + properties.netdbApiName + + auth_param + + 'client=' + properties.netdbClientName + ';' + + 'date=' + date + ';' + + 'reportName=' + dbTable + ';' + + 'type=' + properties.netdbType; + + var header = { 'Content-Type': 'text/csv' }; + //var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'text/csv' }; + var options = { + method : "GET", + path : path, + host : host, + port : port, + headers : header + }; + + logger.debug('options:\n' + JSON.stringify(options,null,2)); + + var request = http.request(options, function(response) { + + var response_str = ''; + if ( retSuccess == true ){ + var cnt = properties.netdbRetryInterval; + count = ++cnt; + } + else{ + count++; + } + + logger.debug('STATUS: ' + response.statusCode + ' content-type=' + response.headers['content-type']); + + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() { + + logger.debug('HEADERS:' + JSON.stringify(response.headers)); + + if(response.statusCode == 200){ + + if(response_str.length > 0){ + + // save the upload + try{ + fs.writeFileSync('/sdncvar/sdnc/files/netdb-updater/' + moment().unix() + ".netdb." + dbTable + '.csv', response_str); + } + catch(e){ + // this is not in reqs, if it fails keep on going. + logger.error('Error writing NetDB file:' + e); + } + + if (response.headers['content-type'].indexOf('html') > 0){ + returnError('Error:Unexpected content-type:' + response.headers['content-type'] + ' returned.\n', cb); + return; + } + // need to parse csv file + var Converter=csvtojson.Converter; + var csvConverter = new Converter({ + noheader:true + }); + var routerMasterSQL = ''; + + // end_parsed will be emitted once parsing is finished + csvConverter.on("end_parsed", function(respObj){ + + routerMasterSQL = routerMasterSQL.concat("INSERT INTO ROUTER_MASTER (crs_name, loopback_ip)"); + for ( var x=0; x < respObj.length; x++ ){ + + if ( respObj[x].field1.length == 0 ){ + returnError('Required field [crs_name] is null.', cb); + } + + if (x!=0){ + routerMasterSQL = routerMasterSQL.concat(' union '); + } + routerMasterSQL = routerMasterSQL.concat(" SELECT " + + "'" + respObj[x].field1 + "'," + + "'" + respObj[x].field2 + "' FROM DUAL "); + } + //logger.debug('SQL: ' + routerMasterSQL); + + if (debug != 'debug' && env != 'dev'){ + + var tasks = []; + tasks.push( function(callback) { updateRouterMaster(routerMasterSQL,callback); } ); + async.series(tasks, function(err,result){ + if(err) { + returnError(err,cb); + return; + } + else { + logger.info('*** Router Master Table Replaced ***'); + returnSuccess(cb); + return; + } + }); + } + else{ +logger.debug('*** debug ***'); + returnSuccess(cb); + return; + } + + }); + csvConverter.on("error",function(errMsg,errData){ + returnError(errMsg,cb); + return; + }); + csvConverter.fromString(response_str, function(err,result){ + if(err){ + returnError(err,cb); + return; + } + }); + } + else{ + //logger.debug("no data"); + returnError('no data',cb); + return; + } + } + else if(response.statusCode == 404){ + returnError('Router Master Table for ' + date + ' is not Available.',cb); + return; + } + else { + returnError('Status Code:' + response.statudCode + ' returned for Router Master Table query.',cb); + return; + } + }); + }); + request.on('error', function(e) { + if ( retSuccess == true ){ + var cnt = properties.netdbRetryInterval; + count = ++cnt; + } + else{ + count++; + } + returnError(e,cb); + return; + }); + request.end(); +} + +function getLinkMaster(cb){ + + logger.info('getLinkMaster debug=' + debug + ' count=' + count); + + // setup connection + var netdbEnv = properties.netdbEnv; + var auth_param = ''; + if ( netdbEnv == 'e2e' || netdbEnv == 'prod' ){ + // conexus network + auth_param = '?auth=' + admProperties['ip-addresses']['eth2'] + ';' + }else{ + // app network + auth_param = '?auth=' + admProperties['ip-addresses']['eth1:0'] + ';' + } + var username = properties.netdbUser;; + var password = properties.netdbPassword; + var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64'); + var host = properties.netdbHost; + var port = properties.netdbPort; + var date = moment().format('YYYYMMDD'); + var path = '/' + properties.netdbPath + + '/' + properties.netdbNetwork + + '/' + properties.netdbApiName + + auth_param + + 'client=' + properties.netdbClientName + ';' + + 'date=' + date + ';' + + 'reportName=' + dbTable + ';' + + 'type=' + properties.netdbType; + + var header = { 'Content-Type': 'text/csv' }; + //var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'text/csv' }; + var options = { + method : "GET", + path : path, + host : host, + port : port, + headers : header + }; + + logger.debug('options:\n' + JSON.stringify(options,null,2)); + + var request = http.request(options, function(response) { + + logger.debug('STATUS: ' + response.statusCode + ' content-type=' + response.headers['content-type']); + + if ( retSuccess == true ){ + var cnt = properties.netdbRetryInterval; + count = ++cnt; + } + else{ + count++ + } + + var response_str = ''; + + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() { + + logger.debug('HEADERS:' + JSON.stringify(response.headers)); + + if(response.statusCode == 200){ + + if(response_str.length > 0){ + + //logger.debug('response_str=' + response_str); + // save the upload + try{ + fs.writeFileSync('/sdncvar/sdnc/files/netdb-updater/' + moment().unix() + ".netdb." + dbTable + '.csv', response_str); + } + catch(e){ + // this is not in reqs, if it fails keep on going. + logger.error('Error writing NetDB file:' + e); + } + + if (response.headers['content-type'].indexOf('html') > 0){ + returnError('Error:Unexpected content-type:' + response.headers['content-type'] + ' returned.\n', cb); + return; + } + // need to parse csv file + var Converter=csvtojson.Converter; + var csvConverter = new Converter({ + noheader:true + }); + + var linkMasterSQL = ''; + + // end_parsed will be emitted once parsing is finished + csvConverter.on("end_parsed", function(jsonObj){ + + linkMasterSQL = linkMasterSQL.concat("INSERT INTO LINK_MASTER (link_interface_ip, source_crs_name, destination_crs_name, link_speed, default_cost, bundle_name, shutdown)"); + for ( var x=0; x < jsonObj.length; x++ ){ + if ( jsonObj[x].field1.length == 0 ){ + returnError('Required field [link_interface_ip] is null.', cb); + return; + } + if ( jsonObj[x].field2.length == 0 ){ + returnError('Required field [source_crs_name] is null.', cb); + return; + } + if ( jsonObj[x].field3.length == 0 ){ + returnError('Required field [destination_crs_name] is null.', cb); + return; + } + if (x!=0){ + linkMasterSQL = linkMasterSQL.concat(' union '); + } + + linkMasterSQL = linkMasterSQL.concat(" SELECT " + + "'" + jsonObj[x].field1 + "'," + + "'" + jsonObj[x].field2 + "'," + + "'" + jsonObj[x].field3 + "'," + + jsonObj[x].field4 + "," + + jsonObj[x].field5 + "," + + "'" + jsonObj[x].field6 + "'," + + "'" + jsonObj[x].field7 + "' FROM DUAL"); + } + //logger.debug('SQL: ' + linkMasterSQL); + + if (debug != 'debug' && env != 'dev'){ + // update db + var tasks = []; + tasks.push( function(callback) { updateLinkMaster(linkMasterSQL,callback); } ); + async.series(tasks, function(err,result){ + if(err) + { + returnError(err,cb); + return; + } + else + { + logger.info('*** Link Master Table Replaced ***'); + returnSuccess(cb); + return; + } + }); + } + else{ + returnSuccess(cb); + return; + } + }); + csvConverter.on("error",function(errMsg,errData){ + returnError(errMsg,cb); + return; + }); + csvConverter.fromString(response_str, function(err,result){ + if(err){ + returnError(errMsg,cb); + return; + } + }); + } + else{ + returnError('no data',cb); + return; + } + } + else if(response.statusCode == 404){ + returnError('Link Master Table for ' + date + ' is not Available.',cb); + return; + } + else { + returnError('Status Code:' + response.statudCode + ' returned for Link Master Table query.',cb); + return; + } + }); + }); + request.on('error', function(e) { + if ( retSuccess == true ){ + var cnt = properties.netdbRetryInterval; + count = ++cnt; + } + else{ + count++ + } + returnError(e,cb); + return; + }); + request.end(); +} + + +function dbConnect(callback){ + + var l_db01 = admProperties['databases']['0']; + var db01Array = l_db01.split("|"); + db01 = db01Array[0]; + + var l_db02 = admProperties['databases']['1']; + var db02Array = l_db02.split("|"); + db02 = db02Array[0]; + + if ( admProperties.dbFabric == 'true' ) + { + logger.debug('connectFabric()'); + + // testing + var fabric_connection = mysql.createConnection({ + host : admProperties.dbFabricServer, + user : admProperties.dbFabricUser, + password : admProperties.dbFabricPassword, + database : admProperties.dbFabricDB, + port : admProperties.dbFabricPort + }); + + + fabric_connection.connect( function(err) { + + if (err) { + callback(err); + return; + } + fabric_connection.query('CALL dump.servers()', function(err,rows) { + + var masterDB = ''; + + if (err) { + callback(err); + return; + } + fabric_connection.end(); + logger.debug('rows: ' + JSON.stringify(rows,null,2)); + + // fabric servers + for ( var x=0; x<rows.length; x++) + { + // database servers + for ( var y=0; y<rows[x].length; y++) + { + var row = rows[x][y]; + if (row.group_id == admProperties.dbFabricGroupId) + { + if (row.status == '3' && row.mode == '3'){ + masterDB = row.host; + } + } + } + } + logger.debug('currentDB: ' + currentDB); + logger.debug('masterDB: ' + masterDB); + + if (masterDB.length <=0) + { + logger.debug('no writable master db'); + callback('no writable master db'); + return; + } + + if ( currentDB != masterDB ) + { + currentDB = masterDB; + dbConnection = mysql.createConnection({ + connectionLimit : admProperties.dbConnLimit, + host : currentDB, + user : admProperties.dbUser, + password : admProperties.dbPassword, + database : admProperties.dbName, + multipleStatements: true, + debug : false + }); + } + logger.debug('new currentDB: ' + currentDB); + logger.debug('new masterDB: ' + masterDB); + callback(null); + return; + }); + fabric_connection.on('error', function(err){ + logger.debug(err.code); + callback(err); + return; + }); + }); + } + else + { + currentDB = db01; + + var dbConn = mysql.createConnection({ + connectionLimit : admProperties.dbConnLimit, + host : currentDB, + user : admProperties.dbUser, + password : admProperties.dbPassword, + database : admProperties.dbName, + multipleStatements: true, + debug : false + }); + logger.debug('initDB currentDB=' + currentDB); + + dbConn.connect(function(err,connection){ + + if(err){ + logger.debug( String(err) ); // ALARM + callback(err); + return; + } + var sql = 'select @@read_only'; + dbConn.query(sql, function(err,result){ + dbConn.end(); + + // @@read_only=0 means db is writable + logger.debug('@@read_only=' + result[0]['@@read_only']); + if ( result[0]['@@read_only'] != '0' ) + { + if (currentDB == db01) + { + currentDB = db02; + } + else + { + currentDB = db01; + } +logger.debug('initDB reconnect to currentDB '+ currentDB); + var newConnection = mysql.createConnection({ + connectionLimit : admProperties.dbConnLimit, + host : currentDB, + user : admProperties.dbUser, + password : admProperties.dbPassword, + database : admProperties.dbName, + multipleStatements: true, + debug : false + }); // end create + dbConnection = newConnection; + callback(null); + return; + } + dbConnection = dbConn; + callback(null); + return; + }); + }); + } +} + +function updateLinkMaster(linkMasterSQL,callback){ + +logger.debug('updateLinkMaster'); + + dbConnection.connect(function(err,connection) + { + if(err){ + logger.debug( String(err) ); // ALARM + callback(err, 'Unable to get database connection.'); + return; + } + }); // end connection + dbConnection.beginTransaction(function(err) { + if(err){ + //dbConnection.release(); + callback(err,String(err)); + return; + } + var sql = "DELETE FROM LINK_MASTER"; + dbConnection.query(sql,function(err,result) + { + if(err){ + //dbConnection.release(); + dbConnection.rollback( {rollback: 'NO RELEASE'},function(){ + callback(err,String(err)); + return; + }); + } + dbConnection.query(linkMasterSQL,function(err,result) + { + if(err){ + //dbConnection.release(); + dbConnection.rollback( {rollback: 'NO RELEASE'},function(){ + callback(err,String(err)); + return; + }); + } + dbConnection.commit(function(err){ + if(err){ + //dbConnection.release(); + dbConnection.rollback( {rollback: 'NO RELEASE'},function(){ + callback(err,String(err)); + return; + }); + } + //dbConnection.release(); + callback(null); + }); + }) + }); + }); // end transaction +} + +function updateRouterMaster(routerMasterSQL,callback){ + +logger.debug('updateRouterMaster'); + + dbConnection.connect(function(err,connection) + { + if(err){ + logger.debug( String(err) ); // ALARM + callback(err, 'Unable to get database connection.'); + return; + } + }); // end connection + dbConnection.beginTransaction(function(err) { + if(err){ + //dbConnection.release(); + callback(err,String(err)); + return; + } + var sql = "DELETE FROM ROUTER_MASTER"; + dbConnection.query(sql,function(err,result) + { + if(err){ + //dbConnection.release(); + dbConnection.rollback( function(){ + callback(err,String(err)); + return; + }); + } + dbConnection.query(routerMasterSQL,function(err,result) + { + if(err){ + //dbConnection.release(); + dbConnection.rollback( function(){ + callback(err,String(err)); + return; + }); + } + dbConnection.commit(function(err){ + if(err){ + //dbConnection.release(); + dbConnection.rollback( function(){ + callback(err,String(err)); + return; + }); + } + //dbConnection.release(); + callback(null); + }); + }) + }); + }); // end transaction +} + +/* + + logger.debug('getLinkMaster - count=' + count); + if ( true ) { + //fail + setTimeout( function(){ + cb(null);}, properties.netdbWaitTime); + return; + } + // success + count = 10; + cb(null); +} +*/ diff --git a/admportal/server/npm-debug.log b/admportal/server/npm-debug.log new file mode 100644 index 00000000..40e151a2 --- /dev/null +++ b/admportal/server/npm-debug.log @@ -0,0 +1,18 @@ +0 info it worked if it ends with ok +1 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'start' ] +2 info using npm@1.4.28 +3 info using node@v0.10.35 +4 verbose node symlink /usr/bin/node +5 error Error: ENOENT, open '/home/users/ar3165/projects/admin-portal2/server/package.json' +6 error If you need help, you may report this *entire* log, +6 error including the npm and node versions, at: +6 error <http://github.com/npm/npm/issues> +7 error System Linux 3.13.0-40-generic +8 error command "/usr/bin/node" "/usr/bin/npm" "start" +9 error cwd /home/users/ar3165/projects/admin-portal2/server +10 error node -v v0.10.35 +11 error npm -v 1.4.28 +12 error path /home/users/ar3165/projects/admin-portal2/server/package.json +13 error code ENOENT +14 error errno 34 +15 verbose exit [ 34, true ] diff --git a/admportal/server/router/index.js b/admportal/server/router/index.js new file mode 100644 index 00000000..76cd6115 --- /dev/null +++ b/admportal/server/router/index.js @@ -0,0 +1,18 @@ +console.log("index.js"); + +module.exports = function(app) { + +//console.log ( 'index port ' + server.address().port ); + + app.use('/', require('./routes/root')); + //app.use('/login', require('./routes/login')); + app.use('/odl', require('./routes/odl')); + app.use('/sla', require('./routes/sla')); + app.use('/user', require('./routes/user')); + app.use('/gamma', require('./routes/gamma')); + app.use('/mobility', require('./routes/mobility')); + app.use('/admin', require('./routes/admin')); + app.use('/preload', require('./routes/preload')); + //app.use('/svc-topology-operation', require('./routes/odl')); + //app.use('/wklist-delete', require('./routes/odl')); +}; diff --git a/admportal/server/router/routes/Odl.js b/admportal/server/router/routes/Odl.js new file mode 100755 index 00000000..a27d73b3 --- /dev/null +++ b/admportal/server/router/routes/Odl.js @@ -0,0 +1,594 @@ +// Odl.js +var https = require('https'); +var http = require('http'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); + + +var Odl = function() { + // Call ODL page + // get(uri,res) + // post(uri,data, res) + + var _healthcheck = function(options, callback) + { + // Setup request to ODL side + console.log('options:' + JSON.stringify(options,null,2)); + var request = https.request(options, function(response) { + + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() + { + //logger.debug(response_str); + if(response.statusCode == 200) + { + console.log('200 OK'); + callback(null, response_str); + return; + } + else{ + console.log('not ok status=' + response.statusCode); + callback(response_str, 'statusCode=' + response.statusCode + '\n' + response_str); + return; + } + }); + }); + request.end() + + request.on('error', function(err) { + console.error('err:' + err); + callback(err, err); + return; + }); + } + + var _get = function(uri,options,callback,req,res) + { + + options.method = "GET"; + options.path = uri; + + // Setup request to ODL side + console.log('options:' + JSON.stringify(options,null,2)); + var request = https.request(options, function(response) { + // console.dir(response); + console.log('STATUS: ' + response.statusCode); + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() + { + console.log(response_str); + + if(response.statusCode == 200) + { + // make sure response starts with JSON string + if (response_str && response_str.indexOf('{') == 0) { + //console.log("response: ", result); + + req.session.l3sdnPageInfo = undefined; + var x=0; + var pageList = []; + var obj_rows = []; + var rows = []; + var robj = JSON.parse(response_str); + + if ( typeof robj['services']['layer3-service-list'] != 'undefined' ) + { + for( var i=0; i<robj['services']['layer3-service-list'].length; i++) + { + obj_rows.push( robj['services']['layer3-service-list'][i] ); + } + } + else + { + res.render('pages/err', {result:{code:'failure', msg:'no data Error: ' + String(err)}, header:process.env.MAIN_MENU}); + callback(null,response_str,res); + return; + } + + var rows = []; + var l3sdnPageInfo = + { + 'totalRows' : obj_rows.length, + 'pageSize' : 18, + 'pageCount' : parseInt(obj_rows.length/18), + 'currentPage' : 1 + } + + while (obj_rows.length > 0){ + pageList.push(obj_rows.splice(0,l3sdnPageInfo.pageSize)); + } + l3sdnPageInfo.rows = pageList[0]; // first page + l3sdnPageInfo.pages = pageList; // all pages + + + req.session.l3sdnPageInfo = l3sdnPageInfo; + var privObj = req.session.loggedInAdmin; + + res.render('odl/listWklst', + { + pageInfo : l3sdnPageInfo, + result : {code:'', msg:''}, + privilege : privObj, header:process.env.MAIN_MENU + }); + + + } else { + res.render('pages/err', {result:{code:'failure', msg:'no data Error: ' + String(err)}, header:process.env.MAIN_MENU}); + } + callback(null, response_str, res); + } + else + { + callback(response_str,response_str,res); + //res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist. ' + response_str}}); + } + }); + }); + + request.end() + + request.on('error', function(err) { + callback(err,null, res); + }); + } + + var _getid = function(uri,options,res) { + options.method = "GET"; + options.path = uri; + + // Setup request to ODL side + var request = https.request(options, function(response) { + // console.dir(response); + //console.log('STATUS: ' + response.statusCode); + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() { + if(response.statusCode == 200){ + if(response_str){ + //console.log("response: ", response_str); + res.render('odl/view', {response_obj: JSON.parse(response_str), header:process.env.MAIN_MENU}); + } + else{ + //console.log("no data"); + res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist'}, header:process.env.MAIN_MENU}); + } + } + else { + //console.log("bad status code:", response.statusCode); + res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist. Status Code:' + response.statusCode}, header:process.env.MAIN_MENU}); + } + }); + }); + + request.end() + + request.on('error', function(err) { + //console.log(err); + res.render('pages/err', {result:{code:'failure', msg:'Failed to get worklist item. ' + String(err)}, header:process.env.MAIN_MENU}); + }); + } + + var _getvrlan = function(uri,options,callback) { + options.method = "GET"; + options.path = uri; + + + //callback(null,''); + // Setup request to ODL side + var request = https.request(options, function(response) { + // console.dir(response); + //console.log('STATUS: ' + response.statusCode); + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + + response.on('end', function() { + if(response.statusCode == 200){ + if(response_str){ + callback(null,response_str); + return; + } + else{ + callback('err','no data'); + return; + } + } + else { + callback('error',response.statusCode); + return; + } + }); + }); + + request.end() + + request.on('error', function(err) { + callback(err,String(err)); + return; + }); + } + + + var _getvnf = function(uri,options,req,res) { + options.method = "GET"; + options.path = uri; + + // Setup request to ODL side + var request = https.request(options, function(response) { + // console.dir(response); + //console.log('STATUS: ' + response.statusCode); + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() { + if(response.statusCode == 200){ + if(response_str){ + //console.log("response: ", response_str); + res.render('odl/viewvnf', { vnf_obj: JSON.parse(response_str), + request_id: req.query['request'], header:process.env.MAIN_MENU }); + } + else{ + //console.log("no data"); + res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist item.'}, header:process.env.MAIN_MENU}); + } + } + else { + //console.log("bad status code:", response.statusCode); + res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist. Status Code:' + response.statusCode}, header:process.env.MAIN_MENU}); + } + }); + }); + + request.end() + + request.on('error', function(err) { + //console.log(err); + res.render('pages/err', {result:{code:'failure', msg:'Failed getting VNF information. Error: '+ String(err)}, header:process.env.MAIN_MENU}); + }); + } + + var _getPreloadVnfData = function(uri,options,res,callback) { + + options.method = "GET"; + options.path = uri; + + + // Setup request to ODL side + var protocol; + if ( process.env.NODE_ENV != 'production' ){ + protocol = http; + }else{ + protocol = https; + } + +console.log('NODE_ENV:' + process.env.NODE_ENV); +console.log('GET: ' + JSON.stringify(options,null,4)); + + var request = protocol.request(options, function(response) { + + var response_str = ''; + + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() { +console.log('response_str: ' + response_str); +console.log('response.statusCode: ' + response.statusCode); + if(response.statusCode == 200){ + if(response_str){ + callback(null,response_str); + return; + } + else{ + callback('Error - No data returned.'); + return; + } + } + else { + if ( response.statusCode == 404 ) + { + callback('HTTP Status Code:' + response.statusCode + '. Not Found.'); + return; + } + else if ( response_str.length > 0 ) + { + callback('HTTP Status Code:' + response.statusCode + '. ' + response_str); + return; + } + else + { + callback('HTTP Status Code:' + response.statusCode + '. No data returned.'); + return; + } + } + }); + }); + + request.end() + + request.on('error', function(err) { + callback(err); + return; + }); + } + +var _getClusterStatus = function(options,callback) { + //options.method = "GET"; + //options.path = uri; + + console.log('URI='+options.path); + + // Setup request to ODL side + var protocol = properties.odlProtocol; +console.log('protocol=' + protocol); + if ( protocol == 'http' || protocol == 'HTTP' ) + { +console.log('http request'); + var request = http.request(options, function(response) { + var response_str = ''; + + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + + response.on('end', function() { +console.log('HTTP StatusCode='+response.statusCode); + if(response.statusCode == 200){ + if(response_str){ +console.log('response_str='+response_str); + callback(null,JSON.parse(response_str)); + return; + } + else{ + callback(null,'no data'); + return; + } + } + else { + callback(null,response.statusCode); + return; + } + }); + }); + + request.end() + + request.on('error', function(err) { + callback(null,String(err)); + return; + }); + } + else { + var request = https.request(options, function(response) { + var response_str = ''; + + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + + response.on('end', function() { + if(response.statusCode == 200){ + if(response_str){ +console.log('response_str='+response_str); + callback(null,JSON.parse(response_str)); + return; + } + else{ + callback(null,'no data'); + return; + } + } + else { + callback(null,response.statusCode); + return; + } + }); + }); + + request.end() + + request.on('error', function(err) { + callback(null,String(err)); + return; + }); + } +} + + var _delete = function(uri,options,res,callback) { + options.method = 'DELETE'; + options.path = uri; + + + // Setup request to ODL side + //var request = https.request(options, function(response) { + var request = http.request(options, function(response) { + //console.log('STATUS: ' + response.statusCode); + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() { + if(response.statusCode == 200){ + callback(null); + return; + } + else { + callback('Error:' + response_str); + return; + } + }); + }); + request.on('error', function(err) { + callback(err); + return; + }); + request.end() + } + + var _post = function(uri,options,data,res,callback) + { + options.method = 'POST'; + options.path = uri; + + + // Setup request to ODL side + var protocol; + //if ( process.env.NODE_ENV != 'production' ){ + protocol = http; + //}else{ + //protocol = https; + //} + var request = protocol.request(options, function(response) + { + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + //logger.debug('chunk:' + chunk); + }); + + // end of request, check response + response.on('end', function() { + console.log('post status code:'+response.statusCode); + if(response.statusCode == 200 ){ + try { + var respObj = JSON.parse(response_str); + console.log('response_str.length:' + response_str.length); + if(response_str){ + console.log("post response-code:" + respObj['output']['response-code']); + + if ( respObj['output']['response-code'] == 200 ){ + callback(null,response_str); + return; + }else{ + callback('Error - response-code:' + respObj['output']['response-code'] + ' response-message:' + respObj['output']['response-message']); + return; + } + }else{ + // success + callback(null); + return; + } + } + catch (error) { + callback('Error parsing response: ' + error); + return; + } + } + else { + var respObj = null; + if ( response_str.length > 0 ) { + console.log('response_str:' + response_str); + try { + respObj = JSON.parse(response_str); + if ( typeof respObj['errors'] != 'undefined' ) + { + console.log('Error' + JSON.stringify(respObj)); + if ( typeof respObj['errors']['error'][0]['error-message'] != 'undefined' ) + { + callback('HTTP Status Code:' + response.statusCode + '. Message:' + + respObj['errors']['error'][0]['error-message']); + return; + } + else + { + callback('Error - HTTP Status Code:' + response.statusCode + '.'); + return; + } + } + else + { + callback('Error - HTTP Status Code:' + response.statusCode + '.'); + return; + } + } + catch (error) { + callback('Error - HTTP Status Code:' + response.statusCode + '.'); + return; + } + } + else{ + callback('Error - HTTP Status Code:' + response.statusCode + '.'); + return; + } + } + }); + }); + + request.on('error', function(err) { + callback(err); + return; + }); + + request.write(data); + request.end() + } + + var _postSubnetAllocated = function(uri,options,data,callback,res) { + options.method = 'POST'; + options.path = uri; + + // Setup request to ODL side + var request = https.request(options, function(response) { + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + // end of request, check response + response.on('end', function() { + //console.log("post: response: " + response_str); + callback(response_str,null,res); + }); + }); + request.on('error', function(err) { + callback(err,null, res); + }); + request.write(data); + request.end() + } + + return { + GetClusterStatus: _getClusterStatus, + Get: _get, + GetID: _getid, + GetVNF: _getvnf, + GetVRlan: _getvrlan, + GetPreloadVnfData: _getPreloadVnfData, + Post: _post, + PostSubnetAllocated: _postSubnetAllocated, + Delete: _delete, + Healthcheck: _healthcheck + }; +}(); + +module.exports = Odl; + diff --git a/admportal/server/router/routes/admin.js b/admportal/server/router/routes/admin.js new file mode 100755 index 00000000..4b7b8088 --- /dev/null +++ b/admportal/server/router/routes/admin.js @@ -0,0 +1,83 @@ +var express = require('express'); +var router = express.Router(); +var exec = require('child_process').exec; +var util = require('util'); +var fs = require('fs'); +var dbRoutes = require('./dbRoutes'); +var csp = require('./csp'); +var bodyParser = require('body-parser'); +var sax = require('sax'),strict=true,parser = sax.parser(strict); +var async = require('async'); + + +// GET +router.get('/getParameters', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getParameters(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/deleteParameter', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteParameter(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getParameters(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from PARAMETERS table.'); + dbRoutes.getParameters(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +// POST +router.post('/addParameter', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.addParameter(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getParameters(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated PARAMETERS.'); + dbRoutes.getParameters(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateAicSite +router.post('/updateParameter', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateParameter(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getParameters(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated PARAMETERS.'); + dbRoutes.getParameters(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +module.exports = router; diff --git a/admportal/server/router/routes/csp.js b/admportal/server/router/routes/csp.js new file mode 100644 index 00000000..435aaf91 --- /dev/null +++ b/admportal/server/router/routes/csp.js @@ -0,0 +1,84 @@ +var exec = require('child_process').exec; +var dbRoutes = require('./dbRoutes'); +var fs = require('fs.extra'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); + +var retURL = ""; +var noCookieUrl = ""; +var logoutUrl = ""; + +function logout(req,res){ + console.log("logout"); + req.session.loggedInAdmin = undefined; + res.redirect('/login'); +} + +function login (req,res) { + + var loggedInAdmin={}; + var email = req.body.email; + dbRoutes.findAdminUser(email,res,function(adminUser){ + if(adminUser !== null){ + + // make sure correct password is provided + if (req.body.password != adminUser.password) { + res.render("pages/login", + { + result: + { + code:'error', + msg:'Invalid password entered.' + }, + header:process.env.MAIN_MENU + }); + return; + } + + var loggedInAdmin = { + email:adminUser.email, + password:adminUser.password, + privilege:adminUser.privilege + } + req.session.loggedInAdmin = loggedInAdmin; + console.log("Login Success"+JSON.stringify(loggedInAdmin)); + res.redirect('sla/listSLA'); + }else{ + res.render("pages/err", + { + result: + { + code:'error', + msg:'User ' + attuid + ' is not in the database. Please see an adminstrator to have them added.' + }, + header:process.env.MAIN_MENU + }); + } + }); +} + +function checkAuth(req,res,next){ + var host = req.get('host'); + var url = req.url; + var originalUrl = req.originalUrl; + + console.log("checkAuth"); + + var host = req.headers['host']; +console.log('host=' + host); + + console.log("cookie is not null "+JSON.stringify(req.session.loggedInAdmin)); + if(req.session == null || req.session == undefined + || req.session.loggedInAdmin == null || req.session.loggedInAdmin == undefined) + { + // nothing else to do but log them back in, or they may + // be coming from the graph tool + console.log("loggedInAdmin not found.session timed out."); + res.render('pages/login'); + return false; + } + next(); +} + +exports.login = login; +exports.logout = logout; +exports.checkAuth = checkAuth; diff --git a/admportal/server/router/routes/dbRoutes.js b/admportal/server/router/routes/dbRoutes.js new file mode 100644 index 00000000..d2f40b52 --- /dev/null +++ b/admportal/server/router/routes/dbRoutes.js @@ -0,0 +1,1192 @@ +var express = require('express'), + app = express(); +var mysql = require('mysql'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); +var fs = require('fs.extra'); +var util = require('util'); +var os = require('os'); +var async = require('async'); +var l_ = require('lodash'); +var dns = require('dns'); +var dnsSync = require('dns-sync'); + +var pool = ''; +var currentDB = ''; +var currentDbName = ''; +var fabricDB = properties.dbFabricServer; +var dbArray = properties.databases; +var enckey = properties.passwordKey; + +console.log('dbFabric=' + properties.dbFabric); + +if ( properties.dbFabric == 'true' ) +{ + connectFabric(); +} +else +{ + initDB(); +} + + +exports.dbConnect = function(){ + + console.log('fabric=' + fabricDB); + if ( properties.dbFabric == 'true' ) + { + connectFabric(); + } + else + { + initDB(); + } +} + +function setCurrentDbName(){ + + function createFunction(dbentry) + { + return function(callback) { findCurrentDbIP(dbentry,callback); } + } + + var tasks = []; + for (var x=0; x<dbArray.length; x++){ + var dbElement = dbArray[x]; + var dbElementArray = dbElement.split("|"); + + tasks.push( createFunction(dbElement) ); + } + async.series(tasks, function(err,result){ + + if(err){ + currentDbName = err; + console.log('currentDbName: ' + err); + return; + } + else { + console.log('not found'); + return; + } + }); +} + + +function findCurrentDbIP(dbElement, callback){ + + var dbElementArray = dbElement.split("|"); + + dns.lookup( dbElementArray[0], function onLookup(err, addresses, family) { + + if ( currentDB == addresses ){ + callback(dbElementArray[1]); + return; + } + else { + callback(null); + return; + } + }); +} + + +exports.getCurrentDB = function(){ + return currentDbName; +} + + +exports.testdb = function(req,res,callback){ +console.log('testdb'); + + osObj = { + 'hostname' : os.hostname(), + 'type' : os.type(), + 'platform' : os.platform(), + 'arch' : os.arch(), + 'release' : os.release(), + 'uptime' : os.uptime(), + 'totalmem' : os.totalmem(), + 'dbhealth' : '' + }; + + pool.getConnection(function(err,connection) + { + if(err){ + callback(err); + return; + } + + // http://stackoverflow.com/questions/10982281/mysql-connection-validity-test-in-datasource-select-1-or-something-better + connection.query("/* pint */ SELECT 1", function(err,result){ + + connection.release(); + if(err) { + callback(err); + return; + } + callback(null,'Database Connectivity to ' + currentDB + ' is working.'); + return; + }); //end query + }); // end getConnection +} + +/* +exports.checkSvcLogic = function(req,res){ + + if ( DBmasterHost.length > 0 && currentHost != DBmasterHost ) + { + // need to copy file so SLA functionality works + var source = process.env.SDNC_CONFIG_DIR + + "/svclogic.properties." + currentHost; + var target = process.env.SDNC_CONFIG_DIR + + "/svclogic.properties"; + fs.copy(source,target,{replace:true}, function(err){ + if(err){ + res.render("pages/err", + {result:{code:'error', + msg:"Unable to copy svclogic.properties. "+ String(err) }}); + return; + } + }); + } +} +*/ +function initDB( next ) { + + + var tasks = []; + for (var x=0; x<properties.databases.length; x++){ + + var db = properties.databases[x]; + var dbArray = db.split("|"); + var _dbIP = dnsSync.resolve(dbArray[0]); + var _dbName = dbArray[1]; + + tasks.push( createFindMasterFunctionObj(_dbIP, _dbName) ); + } + async.series(tasks, function(err,result) + { + if(err){ + if ( err == 'found' ){ + if ( typeof next != 'undefined'){ + next(); + } + else { + return; + } + } + else { + console.error( String(err) ); // ALARM + return; + } + } + console.log('result=' + result); + }); + return; +} + + +function createFindMasterFunctionObj(dbIP,dbName){ + return function(callback) { findMaster(dbIP, dbName, callback); } +} + +function findMaster (ldbIP, ldbName, callback){ +var dbIP = ldbIP; +var dbName = ldbName; + + console.log('checking dbIP:' + dbIP); + + pool = mysql.createPool({ + connectionLimit : properties.dbConnLimit, + host : dbIP, + user : properties.dbUser, + password : properties.dbPassword, + database : properties.dbName, + multipleStatements: true, + debug : false + }); + + pool.getConnection(function(err,connection){ + + if(err){ + callback( String(err) ); + return; + } + var sql = 'select @@read_only'; + connection.query(sql, function(err,result){ + connection.release(); + + // @@read_only=0 means db is writeable + console.log('@@read_only=' + result[0]['@@read_only']); + if ( result[0]['@@read_only'] == '0' ) + { // writeable + // if this is not the current DB, make it since its writeable + currentDB = dbIP; + currentDbName = dbName; + console.log('currentDB=' + currentDB + "|" + currentDbName); + var newpool = mysql.createPool({ + connectionLimit : properties.dbConnLimit, + host : currentDB, + user : properties.dbUser, + password : properties.dbPassword, + database : properties.dbName, + multipleStatements: true, + debug : false + }); // end create + pool = newpool; + callback('found', currentDB); + return; + } + // otherwise this is the current db and its writeable, just return + callback(null, currentDB); + return; + }); + }); +} + +exports.checkDB = function(req,res,next){ + +console.log('checkDB'); + + + if ( properties.dbFabric == 'true' ) + { + connectFabric(); + next(); + } + else + { + initDB( next ); + } +} + + +exports.saveUser = function(req,res){ + + pool.getConnection(function(err,connection){ + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/signup", {result:{code:'error', msg:"Unable to get database connection. " + String(err)},header:process.env.MAIN_MENU}); + return; + } + //var sql = "SELECT AES_DECRYPT(password, '" + enckey + "') password FROM PORTAL_USERS"; + var sql = "SELECT email FROM PORTAL_USERS WHERE email='" + req.body.nf_email + "'"; + + console.log(sql); + + connection.query(sql, function(err,result){ + if(err){ + res.render("pages/signup", {result:{code:'error', msg:"Unable to get database connection. " + String(err)},header:process.env.MAIN_MENU}); + return; + } + if (result.length == 1 || result.length > 1) + { + res.render("pages/signup", {result:{code:'error', msg:'User Information already exists.'},header:process.env.MAIN_MENU}); + return; + } + + sql = "INSERT INTO PORTAL_USERS (email,password,privilege) VALUES (" + +"'"+ req.body.nf_email + "'," + + "AES_ENCRYPT('" + req.body.nf_password + "','" + enckey + "')," + +"'A')"; + + console.log(sql); + + connection.query(sql, function(err,result){ + connection.release(); + + if(err){ + res.render("pages/signup", {result:{ code:'error', msg:String(err) },header:process.env.MAIN_MENU});; + return; + } + res.render('pages/signup', {result:{code:'success', msg:'User created. Please login.'},header:process.env.MAIN_MENU}); + return; + }); + }); + }); +} + +// delete User +exports.deleteUser = function(req,res){ + + var rows={}; + var resultObj = { code:'', msg:'' }; + var privilegeObj = req.session.loggedInAdmin; + + pool.getConnection(function(err,connection) { + if(err){ + console.error( String(err) ); // ALARM + res.render("user/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. Error:" + String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + + var sqlUpdate = "DELETE FROM PORTAL_USERS WHERE email='" + req.query.email + "'"; + + console.log(sqlUpdate); + + connection.query(sqlUpdate,function(err,result){ + + if(err){ + resultObj = {code:'error', msg:'Delete of user failed Error: '+ String(err) }; + } + + // Need DB lookup logic here + connection.query("SELECT email,password,privilege FROM PORTAL_USERS", function(err, rows) { + connection.release(); + if(!err) { + if ( rows.length > 0 ) + { + resultObj = {code:'success',msg:'Successfully deleted user.'}; + res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } ); + return; + }else{ + res.render("user/list", { rows: null, result:{code:'error', msg:'Unexpected no rows returned from database, please try again.', + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + } else { + res.render("user/list", { rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. Error: ' + String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + }); //end query + }); + }); // end of getConnection +} + +// add User +exports.addUser = function(req,res){ + + var rows={}; + var resultObj = { code:'', msg:'' }; + var privilegeObj = req.session.loggedInAdmin; + + pool.getConnection(function(err,connection) { + if(err){ + console.error( String(err) ); // ALARM + res.render("user/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. "+ String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + + if( req.body.nf_privilege == "admin" ){ + var char_priv = 'A'; + }else if(req.body.nf_privilege == 'readonly'){ + var char_priv = 'R'; + }else{ + var char_priv = 'A'; + } + + + //connection.query(sqlRequest, function(err,result){ + var sqlUpdate = "INSERT INTO PORTAL_USERS (email, password, privilege) VALUES (" + +"'"+ req.body.nf_email + "'," + + "AES_ENCRYPT('" + req.body.nf_password + "','" + enckey + "')," + +"'"+ char_priv + "')"; + + console.log(sqlUpdate); + + connection.query(sqlUpdate,function(err,result){ + + if(err){ + resultObj = {code:'error', msg:'Add of user failed Error: '+err}; + } + + // Need DB lookup logic here + connection.query("SELECT email,AES_DECRYPT(password, '" + enckey + "') password,privilege FROM PORTAL_USERS", function(err, rows) { + + connection.release(); + if(!err) { + if ( rows.length > 0 ) + { + resultObj = {code:'success',msg:'Successfully added user.'}; + res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } ); + return; + }else{ + res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database, please try again.', + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + } else { + res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. Error: '+ err , + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + }); //end query + }); + + }); // end of getConnection +} + +// updateUser +exports.updateUser= function(req,res){ + + var rows={}; + var resultObj = { code:'', msg:'' }; + var privilegeObj = req.session.loggedInAdmin; + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("user/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. " + String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + + if( req.body.uf_privilege == "admin" ){ + var char_priv = 'A'; + }else if(req.body.uf_privilege == 'readonly'){ + var char_priv = 'R'; + }else{ + var char_priv = 'A'; + } + + + //connection.query(sqlRequest, function(err,result){ + var sqlUpdate = "UPDATE PORTAL_USERS SET " + + "email = '" + req.body.uf_email + "'," + + "password = " + "AES_ENCRYPT('" + req.body.uf_password + "','" + enckey + "'), " + + "privilege = '"+ char_priv + "'" + + " WHERE email = '" + req.body.uf_key_email + "'"; + + console.log(sqlUpdate); + + connection.query(sqlUpdate,function(err,result){ + + if(err){ + resultObj = {code:'error', msg:'Update of user failed Error: '+err}; + } + + // Need DB lookup logic here + connection.query("SELECT email, AES_DECRYPT(password,'" + enckey + "') password, privilege FROM PORTAL_USERS", function(err, rows) { + connection.release(); + if(!err) { + if ( rows.length > 0 ) + { + resultObj = {code:'success',msg:'Successfully updated user.'}; + res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU} ); + return; + }else{ + res.render("user/list", {rows: null, result:{ code:'error', msg:'Unexpected no rows returned from database.', + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + } else { + res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. ' + String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + }); //end query + }); + }); // end of getConnection +}; + +exports.listUsers = function(req,res,resultObj){ + + var privilegeObj = req.session.loggedInAdmin; + var rows={}; + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. " + String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + + // Need DB lookup logic here + var selectUsers = "SELECT email, AES_DECRYPT(password,'" + enckey + "') password, privilege from PORTAL_USERS"; + console.log(selectUsers); + connection.query(selectUsers, function(err, rows) { + + connection.release(); + if(err){ + resultObj = {code:'error', msg:'Unable to SELECT users Error: '+err}; + } + + if(!err) { + if ( rows.length > 0 ) + { + console.log(JSON.stringify(rows)); + res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU }); + return; + } + else{ + res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database.', + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + } else { + res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. ' + String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + }); //end query + }); // end getConnection +} + +exports.listSLA = function(req,res,resultObj){ + + var privilegeObj = req.session.loggedInAdmin; + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + + // Need DB lookup logic here + connection.query("SELECT module,rpc,version,mode,active,graph FROM SVC_LOGIC", function(err, rows) { + + connection.release(); + if(err) { + res.render("pages/err", {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU}); + return; + } + else { + res.render("sla/list", {rows:rows, result:resultObj, privilege:privilegeObj, header:process.env.MAIN_MENU} ); + return; + } + }); //end query + }); // end getConnection +} + +exports.executeSQL = function(sql,req,res,callback){ + + console.log(sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + + connection.query(sql, function(err,result){ + connection.release(); + if (err) { + callback(err,'Database operation failed. ' + err ); + } + else + { +console.log('affectedRows='+result.affectedRows); + callback(null, result.affectedRows); + } + }); //end query + }); // end getConnection +} + + +// gamma - deleteParameter +exports.deleteParameter = function(req,res,callback){ + + var sql = "DELETE FROM PARAMETERS WHERE name='" + req.query.name + "'"; + + console.log(sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.log( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + connection.query(sql, function(err,result){ + connection.release(); + if(err){ + console.log('Update failed. ' + err ); + callback(err,'Update failed. ' + err ); + } + else + { + callback(null,''); + } + }); //end query + }); // end getConnection +} + + +exports.getTable = function(req,res,sql,rdestination,resultObj,privilegeObj){ + +console.log('SQL:'+sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + connection.query(sql,function(err, rows) + { + connection.release(); + if(err) { + res.render(rdestination, {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU}); + return; + } + else { + res.render(rdestination, { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } ); + return; + } + }); //end query + }); // end getConnection +} + +exports.getMetaTable = function(req,res,sql,rdestination,resultObj,privilegeObj){ + + console.log('SQL:'+ sql); + + var rdata = []; + var v_tables = []; + var vtables = properties.viewTables; + + for ( var i in vtables ) { + v_tables.push(vtables[i]); + } + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + connection.query(sql,function(err, rows, fields) + { + console.log('rows:' + JSON.stringify(rows,null,2)); + // http://stackoverflow.com/questions/14528385/how-to-convert-json-object-to-javascript-array + //logger.debug(Object.keys(rows[0]).map(function(v) { return rows[0][v]; })); + for ( var i in rows ){ + rdata.push(Object.keys(rows[i]).map(function(v) { return rows[i][v]; })); + //logger.debug(Object.keys(rows[i]).map(function(v) { return rows[i][v]; })); + //logger.debug([i, rows[i]]); + } + for ( var x in rdata ){ + for ( var j in rdata[x] ){ + console.log('rdata[' + x + ']: ' + rdata[x][j]); + } + } + console.log('rdata:' + rdata[0]); + console.log('fields:' + JSON.stringify(fields,null,2)); + connection.release(); + if(err) { + res.render(rdestination, {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU}); + return; + } + else { + res.render(rdestination, { displayTable:true, vtables:v_tables, rows:rdata, fields:fields, result:resultObj, privilege:privilegeObj, header:process.env.MAIN_MENU } ); + return; + } + }); //end query + }); // end getConnection +} + +exports.getVnfProfile = function(req,res,resultObj,privilegeObj){ + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + + connection.query("SELECT vnf_type,availability_zone_count,equipment_role " + + "FROM VNF_PROFILE ORDER BY VNF_TYPE", function(err, rows) + { + connection.release(); + if(err) { + res.render("mobility/vnfProfile", {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU}); + return; + } + else { + res.render('mobility/vnfProfile', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } ); + return; + } + }); //end query +console.log('after query'); + }); // end getConnection +} + + +exports.getVnfPreloadData = function(req,res,dbtable,callback){ + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + + // Need DB lookup logic here + connection.query("SELECT preload_data FROM " + dbtable + " WHERE id=" + + req.query.id, function(err, rows) + { + connection.release(); + if(err) { + callback(err); + return; + } + else { + var buffer = rows[0].preload_data; + var decode_buffer = decodeURI(buffer); + var content = JSON.parse(decode_buffer); + callback(null,content); + return; + } + }); //end query + }); // end getConnection +} + + + +exports.getVnfNetworkData = function(req,res,resultObj,privilegeObj){ + + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + + // Need DB lookup logic here + connection.query("SELECT id,svc_request_id,svc_action,status,filename,ts,preload_data " + + "FROM PRE_LOAD_VNF_NETWORK_DATA ORDER BY id", function(err, rows) + { + var msgArray = new Array(); + + connection.release(); + if(err) { + msgArray = 'Database Error: '+ String(err); + res.render("mobility/vnfPreloadNetworkData", { + result:{code:'error',msg:msgArray}, + preloadImportDirectory: properties.preloadImportDirectory, + header:process.env.MAIN_MENU + }); + return; + } + else { + var retData = []; + for( r=0; r<rows.length; r++) + { + var rowObj = {}; + rowObj.row = rows[r]; + if ( rows[r].filename.length > 0 ) + { + try{ + var buffer = rows[r].preload_data; + var decode_buffer = decodeURI(buffer); + var filecontent = JSON.parse(decode_buffer); + rowObj.filecontent = filecontent; + rowObj.network_name = filecontent.input["network-topology-information"]["network-topology-identifier"]["network-name"]; + rowObj.network_type = filecontent.input["network-topology-information"]["network-topology-identifier"]["network-type"]; + } + catch(error){ + msgArray.push('File ' + rows[r].filename + ' has invalid JSON. Error:' + error); + } + } + else { + rowObj.filecontent = ''; + } + retData.push(rowObj); + } + if(msgArray.length>0){ + resultObj.code = 'failure'; + resultObj.msg = msgArray; + } + res.render('mobility/vnfPreloadNetworkData', { + retData:retData, + result:resultObj, + privilege:privilegeObj, + preloadImportDirectory: properties.preloadImportDirectory, + header:process.env.MAIN_MENU + }); + return; + } + }); //end query + }); // end getConnection +} + +exports.getVnfData = function(req,res,resultObj,privilegeObj){ + + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + + // Need DB lookup logic here + connection.query("SELECT id,svc_request_id,svc_action,status,filename,ts,preload_data " + + "FROM PRE_LOAD_VNF_DATA ORDER BY id", function(err, rows) + { + var msgArray = new Array(); + + connection.release(); + if(err) { + msgArray = 'Database Error: '+ String(err); + res.render("mobility/vnfPreloadData", { + result:{code:'error',msg:msgArray}, + preloadImportDirectory: properties.preloadImportDirectory, + header:process.env.MAIN_MENU + }); + return; + } + else { + var retData = []; + for( r=0; r<rows.length; r++) + { + var rowObj = {}; + rowObj.row = rows[r]; + if ( rows[r].filename.length > 0 ) + { + try{ + var buffer = rows[r].preload_data; + var s_buffer = decodeURI(buffer); + var filecontent = JSON.parse(s_buffer); + rowObj.filecontent = filecontent; + rowObj.vnf_name = filecontent.input["vnf-topology-information"]["vnf-topology-identifier"]["vnf-name"]; + rowObj.vnf_type = filecontent.input["vnf-topology-information"]["vnf-topology-identifier"]["vnf-type"]; + } + catch(error){ + msgArray.push('File ' + rows[r].filename + ' has invalid JSON. Error:' + error); + } + } + else { + rowObj.filecontent = ''; + } + retData.push(rowObj); + } + if(msgArray.length>0){ + resultObj.code = 'failure'; + resultObj.msg = msgArray; + } + res.render('mobility/vnfPreloadData',{ + retData:retData, result:resultObj, + privilege:privilegeObj, + header:process.env.MAIN_MENU, + preloadImportDirectory: properties.preloadImportDirectory + }); + return; + } + }); //end query + }); // end getConnection +} + + +exports.findAdminUser = function(email,res,callback) { + + + var adminUser={}; + pool.getConnection(function(err,connection) { + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/login", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + + // Need DB lookup logic here + connection.query("SELECT email, AES_DECRYPT(password, '" + enckey + "') password, privilege FROM PORTAL_USERS WHERE email='" + email + "'", function(err, rows) { + + connection.release(); + if(!err) { + if ( rows.length > 0 ) + { + rows.forEach(function(row){ + adminUser = { + "email" : row.email, + "password" : row.password, + "privilege" : row.privilege }; + }); + callback(adminUser); + return; + }else{ + console.log("no rows returned"); + res.render("pages/login", {result:{code:'error', msg:'User is not in database.'},header:process.env.MAIN_MENU}); + return; + } + } else { + res.render("pages/err", {result:{code:'error',msg:'Unexpected no rows returned from database. '+ String(err)},header:process.env.MAIN_MENU}); + return; + } + }); //end query + }); // end getConnection +} + + +exports.addRow = function(sql,req,res,callback){ + + console.log(sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + + connection.query(sql, function(err,result){ + connection.release(); + if(err){ + console.debug('Database operation failed. ' + err ); + callback(err,'Database operation failed. ' + err ); + } + else + { + callback(null, result.affectedRows); + } + }); //end query + }); // end getConnection +} + + + +exports.addVnfProfile = function(row,res,callback){ + + var sqlInsert; + + if ( row.length < 3 ) + { + console.log('Row [' + row + '] does not have enough fields.'); + callback(null, 'Row [' + row + '] does not have enough fields.'); + return; + } + + sqlInsert = "INSERT INTO VNF_PROFILE (" + + "vnf_type,availability_zone_count,equipment_role) VALUES (" + + "'" + row[0] + "'," + + row[1] + + ",'" + row[2] + "')"; + + console.log('SQL='+sqlInsert); + + pool.getConnection(function(err,connection) { + + if(err){ + console.log( String(err) ); // ALARM + callback(err, 'Unable to get database connection.'); + return; + } + connection.query(sqlInsert, function(err,result){ + connection.release(); + if(err){ + console.log('Row [' + row + '] failed to insert. ' + err ); + callback(null,'Row [' + row + '] failed to insert. ' + err ); + } + else + { + callback(null,''); + } + }); //end query + }); // end getConnection +} + + +// Add to SVC_LOGIC table +exports.addDG = function(_module, version, rpc, mode, xmlfile, req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var rows={}; + + pool.getConnection(function(err,connection) { + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + + var post = { + module : _module, + rpc : rpc, + version : version, + mode : mode, + active : "N", + graph : xmlfile + }; + + //logger.debug( JSON.stringify(post)); + + //connection.query(sqlRequest, function(err,result){ + connection.query('INSERT INTO SVC_LOGIC SET ?', post, function(err,result){ + // neat! + + // Need DB lookup logic here + connection.query("SELECT module,rpc,version,mode,active,graph FROM SVC_LOGIC", function(err, rows) { + + if(!err) { + if ( rows.length > 0 ) + { + res.render('sla/list', { rows: rows, result:{code:'',msg:''}, privilege:privilegeObj,header:process.env.MAIN_MENU } ); + return; + }else{ + console.log("no rows returned"); + res.render("pages/home"); + return; + } + } + connection.on('error', function(err){ + connection.release(); + console.log(500, "An error has occurred -- " + err); + res.render("pages/home"); + return; + }); + }); //end query + + connection.release(); + }); + //connection.query('INSERT INTO SVC_LOGIC SET ?', post, function(err,result){ + // neat! + //logger.debug('inserted rows'); + //}); + + //if(err){ + //res.render('pages/home'); + //} + return; + + }); // end of getConnection +}; + +exports.activate = function(req,res,_module,rpc,version,mode,callback){ + + var sql = "UPDATE SVC_LOGIC SET active=\'Y\' WHERE module=\'" + + _module + "' AND rpc=\'" + + rpc + "' AND version=\'" + + version + "' AND mode=\'" + + mode + "'"; + + console.log('SQL='+sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + + connection.query(sql, function(err,result){ + + connection.release(); + if(err){ + callback(err, 'Unable to get database connection.' + err); + } + else + { + callback(null,''); + } + }); //end query + }); // end getConnection +} + + +exports.deactivate = function(req,res,_module,rpc,version,mode,callback){ + + var sql = "UPDATE SVC_LOGIC SET active=\'N\' WHERE module=\'" + + _module + "' AND rpc=\'" + + rpc + "' AND version=\'" + + version + "' AND mode=\'" + + mode + "'"; + + console.log('SQL='+sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + + connection.query(sql, function(err,result){ + + connection.release(); + if(err){ + callback(err, 'Unable to get database connection.' + err); + } + else + { + callback(null,''); + } + }); //end query + }); // end getConnection +} + +exports.global_deactivate = function(req,res,_module,rpc,mode,callback){ + + var sql = "UPDATE SVC_LOGIC SET active=\'N\' WHERE module=\'" + + _module + "' AND rpc=\'" + + rpc + "' AND mode=\'" + + mode + "'"; + + + pool.getConnection(function(err,connection) { + + if(err){ + callback(err, 'Unable to get database connection.' + err); + return; + } + + connection.query(sql, function(err,result){ + + connection.release(); + if(err){ + callback(err, err); + } + else + { + callback(null,''); + } + }); //end query + }); // end getConnection +} + + +exports.deleteDG = function(req,res,_module,rpc,version,mode,callback){ + + var sql = "DELETE FROM SVC_LOGIC WHERE module=\'" + + _module + "' AND rpc=\'" + + rpc + "' AND version=\'" + + version + "' AND mode=\'" + + mode + "'"; + + console.log('SQL='+sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + + connection.query(sql, function(err,result){ + + connection.release(); + if(err){ + callback(err, 'Unable to get database connection.' + err); + } + else + { + callback(null,''); + } + }); //end query + }); // end getConnection +} + + + +function padLeft(nr, n, str){ + return Array(n-String(nr).length+1).join(str||'0')+nr; +} + diff --git a/admportal/server/router/routes/gamma.js b/admportal/server/router/routes/gamma.js new file mode 100644 index 00000000..70e6713c --- /dev/null +++ b/admportal/server/router/routes/gamma.js @@ -0,0 +1,1667 @@ +var express = require('express'); +var router = express.Router(); +var exec = require('child_process').exec; +var util = require('util'); +var fs = require('fs'); +var dbRoutes = require('./dbRoutes'); +var csp = require('./csp'); +var multer = require('multer'); +var bodyParser = require('body-parser'); +var sax = require('sax'),strict=true,parser = sax.parser(strict); +var async = require('async'); +var l_ = require('lodash'); + + +// used for file upload button, retain original file name +//router.use(bodyParser()); +router.use(bodyParser.urlencoded({ + extended: true +})); + +//var upload = multer({ dest: process.cwd() + '/uploads/', rename: function(fieldname,filename){ return filename; } }); + +// multer 1.1 +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, process.cwd() + '/uploads/') + }, + filename: function (req, file, cb) { + cb(null, file.originalname ) + } +}); + +var upload = multer({ + storage: storage +}); + + +//router.use(express.json()); +//router.use(express.urlencoded()); +//router.use(multer({ dest: './uploads/' })); + +// 1604 +var selectNetworkProfile = "SELECT network_type,technology FROM NETWORK_PROFILE ORDER BY network_type"; + +var selectNbVlanRange = "SELECT vlan_plan_id,plan_type,purpose,LPAD(range_start,4,0) range_start,LPAD(range_end,4,0) range_end,generated from VLAN_RANGES ORDER BY vlan_plan_id"; + +var selectNbVlanPool = "SELECT aic_site_id,availability_zone,vlan_plan_id,plan_type,purpose,LPAD(vlan_id,4,0) vlan_id,status FROM VLAN_POOL ORDER BY aic_site_id,availability_zone,vlan_plan_id,vlan_id"; + +router.get('/getNetworkProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getTable(req,res,selectNetworkProfile,'gamma/networkProfile',{code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getNbVlanRange', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getTable(req,res,selectNbVlanRange,'gamma/nbVlanRange',{code:'', msg:''}, req.session.loggedInAdmin); +}); + +router.get('/getNbVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + if (typeof req.query.vlan_plan_id == "undefined"){ + dbRoutes.getTable(req,res,selectNbVlanPool,'gamma/nbVlanPool',{code:'', msg:''}, req.session.loggedInAdmin); + }else{ + var sql = "SELECT aic_site_id,availability_zone,vlan_plan_id,plan_type,purpose,vlan_id,status FROM VLAN_POOL WHERE vlan_plan_id='" + req.query.vlan_plan_id + "' AND vlan_id BETWEEN " + + req.query.range_start + " AND " + req.query.range_end; + dbRoutes.getTable(req,res,sql,'gamma/nbVlanPool',{code:'', msg:''}, req.session.loggedInAdmin); + } +}); + +router.post('/addNetworkProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var network_type = removeNL(req.body.nf_network_type); + var technology = removeNL(req.body.nf_technology); + var sql = "INSERT INTO NETWORK_PROFILE (network_type,technology) VALUES (" + + "'"+ network_type + "'," + + "'"+ technology + "')"; + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err) + { + msgArray.push(err); + dbRoutes.getTable(req,res,ucpePhsCredentials, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else + { + if ( result == 1 ) + { + msgArray.push('Successfully added Network Profile.'); + dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'success', msg:msgArray},privilegeObj); + return; + } + else + { + msgArray.push('Was not able to add Network Profile.'); + dbRoutes.getTable(req,res,ucpePhsCredentials, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj); + return; + } + } + }); +}); + +router.post('/saveNbVlanRange', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var plan_type = req.body.nf_plan_type; + var purpose = req.body.nf_purpose; + var range_start = padLeft(removeNL(req.body.nf_range_start),4); + var range_end = padLeft(removeNL(req.body.nf_range_end),4); + var tasks = []; + var privilegeObj = req.session.loggedInAdmin; + + tasks.push( function(callback) { + dbRoutes.saveNbVlanRange(range_start,range_end,plan_type,purpose,req,res,callback); + }); + + // will probably need to be a new call that is a transaction if i use a new + // plan_type-purpose-counter table. + //tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err) + { + msgArray.push(err); + dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else + { + msgArray.push('Successfully added VLAN Range.'); + dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.get('/deleteNetworkProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback){ + dbRoutes.executeSQL("DELETE FROM NETWORK_PROFILE WHERE network_type = '" + req.query.network_type + "'", req,res,callback); + + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push("Error: " + err); + dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else + { + if ( result[0] == 1 ) + { + msgArray.push('Successfully deleted Network Profile.'); + dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'success', msg:msgArray},privilegeObj); + return; + } + else + { + msgArray.push('No rows removed.'); + dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj); + return; + } + } + }); +}); + +router.get('/deleteNbVlanRange', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + + tasks.push(function(callback){ + dbRoutes.deleteNbVlanRange(req.query.vlan_plan_id,req,res,callback); + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else + { + msgArray.push('Successfully deleted Range.'); + dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.post('/updateNetworkProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var sql = "UPDATE NETWORK_PROFILE SET " + + "network_type='"+ removeNL(req.body.uf_network_type) + "', " + + "technology='" + removeNL(req.body.uf_technology) + "' " + + "WHERE network_type='" + removeNL(req.body.uf_key_network_type) + "'"; + + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated Network Profile.'); + dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.post('/updateNbVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var sql = "UPDATE VLAN_POOL SET " + + "status='"+ removeNL(req.body.uf_status) + "' " + + " WHERE aic_site_id='" + removeNL(req.body.uf_key_aic_site_id) + "'" + + " AND availability_zone='" + removeNL(req.body.uf_key_availability_zone) + "'" + + " AND vlan_plan_id='" + removeNL(req.body.uf_key_vlan_plan_id) + "'" + + " AND plan_type='" + removeNL(req.body.uf_key_plan_type) + "'" + + " AND purpose='" + removeNL(req.body.uf_key_purpose) + "'" + + " AND vlan_id=" + removeNL(req.body.uf_key_vlan_id); + + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getTable(req,res,selectNbVlanPool, 'gamma/nbVlanPool', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated Network Profile.'); + dbRoutes.getTable(req,res,selectNbVlanPool, 'gamma/nbVlanPool', {code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.post('/updateNbVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res){ +}); +router.get('/generateNbVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var vlan_plan_id = req.query.vlan_plan_id; + var plan_type = req.query.plan_type; + var purpose = req.query.purpose; + var range_start = req.query.range_start; + var range_end = req.query.range_end; + var tasks = []; + var privilegeObj = req.session.loggedInAdmin; + + tasks.push( function(callback) { + dbRoutes.generateNbVlanPool(range_start,range_end,plan_type,purpose,vlan_plan_id,req,res,callback); + }); + + // will probably need to be a new call that is a transaction if i use a new + // plan_type-purpose-counter table. + //tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err) + { + msgArray.push(err); + dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else + { + msgArray.push('Successfully added VLAN Range.'); + dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +///// end 1604 + + +// GET +router.get('/getServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getServiceHoming(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getServiceHomingRollback', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getServiceHomingRollback(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVlanPool(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getAicSite', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getAicSite(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getAicSwitch', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getAicSwitch(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getAicAvailZone', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getAicAvailZone(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVpePool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVpePool(req,res,{code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVplspePool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVplspePool(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); + +// ROLLBACK SERVICE_HOMING +router.get('/rollbackServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.rollbackServiceHoming(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getServiceHomingRollback(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('SERVICE_HOMING table successfully restored.'); + dbRoutes.getServiceHoming(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// DELETE SERVICE_HOMING +router.get('/deleteServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteServiceHoming(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getServiceHoming(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from SERVICE_HOMING table.'); + dbRoutes.getServiceHoming(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +// DELETE AIC_SITE +router.get('/deleteSite', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteSite(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getAicSite(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from AIC_SITE table.'); + dbRoutes.getAicSite(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// DELETE AIC_SWITCH +router.get('/deleteSwitch', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteSwitch(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getAicSwitch(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from AIC_SWITCH table.'); + dbRoutes.getAicSwitch(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// DELETE AIC_AVAIL_ZONE_POOL +router.get('/deleteZone', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteZone(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getAicAvailZone(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from AIC_AVAIL_ZONE_POOL table.'); + dbRoutes.getAicAvailZone(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// DELETE VLAN_ID_POOL +router.get('/deleteVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteVlanPool(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVlanPool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VLAN_ID_POOL table.'); + dbRoutes.getVlanPool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// DELETE VPE_POOL +router.get('/deleteVpePool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteVpePool(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVpePool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VPE_POOL table.'); + dbRoutes.getVpePool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +// DELETE VPE_POOL +router.get('/deleteVplspePool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteVplspePool(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVplspePool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VPLSPE_POOL table.'); + dbRoutes.getVplspePool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// POST +router.post('/addServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.addWebServiceHoming(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getServiceHoming(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully added SERVICE_HOMING'); + dbRoutes.getServiceHoming(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +// gamma - updateProvStatus +router.post('/updateProvStatus', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateProvStatus(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVpePool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated Provisioning Status'); + dbRoutes.getVpePool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateAicSite +router.post('/updateAicSite', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateAicSite(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getAicSite(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated AIC_SITE table.'); + dbRoutes.getAicSite(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateAicSwitch +router.post('/updateAicSwitch', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateAicSwitch(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getAicSwitch(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated AIC_SWITCH table.'); + dbRoutes.getAicSwitch(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateAicAvailZone +router.post('/updateAicAvailZone', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateAicAvailZone(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getAicAvailZone(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated AIC_AVAIL_ZONE_POOL table.'); + dbRoutes.getAicAvailZone(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateVlanPool +router.post('/updateVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateVlanPool(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVlanPool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated VLAN_ID_POOL table.'); + dbRoutes.getVlanPool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateVpePool +router.post('/updateVpePool', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateVpePool(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVpePool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated VPE_POOL table.'); + dbRoutes.getVpePool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateVplspePool +router.post('/updateVplspePool', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateVplspePool(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVplspePool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated VPLSPE_POOL table.'); + dbRoutes.getVplspePool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +// gamma - updateServiceHoming +router.post('/updateServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateServiceHoming(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getServiceHoming(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated SERVICE_HOMING table.'); + dbRoutes.getServiceHoming(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.post('/uploadVLAN', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res, next){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getVlanPool(req,res,{code:'danger', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + if(exists) { + + var str = req.file.originalname; + + // check for valid filename format + var tagpos = str.search("_ctag_pool"); + var csvpos = str.search(".csv"); + if(tagpos != 13 || csvpos != 23){ + var msgArray = new Array(); + msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_ctag_pool.csv'); + dbRoutes.getVlanPool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVLAN(lrow,res,callback); } + } + + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + //async.parallelLimit(funcArray, 5, function(err,result){ + async.series(funcArray, function(err,result){ + + if ( err ) { + dbRoutes.getVlanPool(req,res, result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getVlanPool(req,res,result,privilegeObj); + return; + } + }); + }); + + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + console.error('error:'+ex); + msgArray = []; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getVlanPool(req,res, {code:'danger', msg:msgArray}, privilegeObj); + return; + } + + } else { + msgArray = []; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVlanPool(req,res, {code:'danger', msg:msgArray}, privilegeObj); + return; + } + }); + } + else { + msgArray = []; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVlanPool(req,res, {code:'danger', msg:msgArray}, privilegeObj); + return; + } + +}); + + +// POST +router.post('/uploadAicSite', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getAicSite(req,res, {code:'danger', msg:'There was an error uploading the file, please try again.'}, privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + if(exists) { + + var str = req.file.originalname; + + // check for valid filename format + var tagpos = str.search("_site"); + var csvpos = str.search(".csv"); + if(tagpos != 13 || csvpos != 18){ + msgArray.length = 0; + msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_site.csv'); + dbRoutes.getAicSite(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addAicSite(lrow,res,callback); } + } + + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.parallelLimit(funcArray, 50, function(err,result){ + + if ( err ) { + dbRoutes.getAicSite(req,res, result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getAicSite(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getAicSite(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getAicSite(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getAicSite(req,res,{code:'danger', msg:msgArray},privilegeObj); + } + +} ); + +// POST +router.post('/uploadAicSwitch', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getAicSwitch(req,res,{code:'danger', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.orignalname; + + // check for valid filename format + var tagpos = str.search("_switch"); + var csvpos = str.search(".csv"); + if(tagpos != 13 || csvpos != 20){ + msgArray.length = 0; + msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_switch.csv'); + dbRoutes.getAicSwitch(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addAicSwitch(lrow,res,callback); } + } + + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.parallelLimit(funcArray, 50, function(err,result){ + + if ( err ) { + dbRoutes.getAicSwitch(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getAicSwitch(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getAicSwitch(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getAicSwitch(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getAicSwitch(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + +// POST +router.post('/uploadAicAvailZone', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getAicAvailZone(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + // check for valid filename format + var tagpos = str.search("_availabilityzone"); + var csvpos = str.search(".csv"); + if(tagpos != 13 || csvpos != 30){ + msgArray.length = 0; + msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_availabilityzone.csv'); + dbRoutes.getAicAvailZone(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addAicAvailZone(lrow,res,callback); } + } + + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.parallelLimit(funcArray, 50, function(err,result){ + + if ( err ) { + dbRoutes.getAicAvailZone(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getAicAvailZone(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getAicAvailZone(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getAicAvailZone(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getAicAvailZone(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + +// POST +router.post('/uploadVpePool', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getVpePool(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + // check for valid filename format + var tagpos = str.search("_vpe"); + var csvpos = str.search(".csv"); + if(tagpos != 13 || csvpos != 17){ + msgArray.length = 0; + msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_vpe.csv'); + var resultObj = {code:'failure', msg:msgArray}; + dbRoutes.getVpePool(req,res,resultObj,privilegeObj); + return; + } + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVpePool(lrow,res,callback); } + } + + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.parallelLimit(funcArray, 50, function(err,result){ + + if ( err ) { + dbRoutes.getVpePool(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getVpePool(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getVpePool(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVpePool(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVpePool(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + +// POST +router.post('/uploadVplspePool', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getVplspePool(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + // check for valid filename format + var tagpos = str.search("_vpls"); + var csvpos = str.search(".csv"); + if(tagpos != 13 || csvpos != 18){ + msgArray.length = 0; + msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_vpls.csv'); + dbRoutes.getVplspePool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVplspePool(lrow,res,callback); } + } + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.parallelLimit(funcArray, 50, function(err,result){ + + if ( err ) { + dbRoutes.getVplspePool(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getVplspePool(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getVplspePool(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVplspePool(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVplspePool(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + +// POST +router.post('/uploadServiceHoming', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res) +{ + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname) + { + if (req.file.originalname.size == 0) { + dbRoutes.getServiceHoming(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) + { + if(exists) + { + var str = req.file.originalname; + + // check for valid filename format + var csvpos = str.search(".csv"); + if( (l_.startsWith(str,'aichoming_') != true) || csvpos != 18) + { + msgArray.length = 0; + msgArray.push('Not a valid filename, format must be aichoming_mmddYYYY.csv'); + //msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_vpls.csv'); + dbRoutes.getServiceHoming(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + try + { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var csvrows = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() + { + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addServiceHoming(lrow,req,res,callback); } + } + funcArray.push(function(callback) { + dbRoutes.saveServiceHoming(req,res,callback); + }); + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in series + async.series(funcArray, function(err,result) + { + if ( err ) + { + result = {code:'failure', msg:result}; + dbRoutes.getServiceHoming(req,res,result,privilegeObj); + return; + } + else + { // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++) + { + if ( result[i].length > 0 ) + { + rowError++; + } + } + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getServiceHoming(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getServiceHoming(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getServiceHoming(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else + { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getServiceHoming(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); +function removeNL(s) { + /* + ** Remove NewLine, CarriageReturn and Tab characters from a String + ** s string to be processed + ** returns new string + */ + r = ""; + for (i=0; i < s.length; i++) + { + if (s.charAt(i) != '\n' && + s.charAt(i) != '\r' && + s.charAt(i) != '\t') + { + r += s.charAt(i); + } + } + return r; +} +function padLeft(nr, n, str){ + return Array(n-String(nr).length+1).join(str||'0')+nr; +} + + +module.exports = router; diff --git a/admportal/server/router/routes/helpers.js b/admportal/server/router/routes/helpers.js new file mode 100644 index 00000000..6ac8215f --- /dev/null +++ b/admportal/server/router/routes/helpers.js @@ -0,0 +1,66 @@ +
+var _ = require('lodash');
+var csvtojson = require('csvtojson');
+var async = require('async');
+var uuid = require('node-uuid'); // generate a uuid with "uuid.v1()"
+var path = require('path');
+var fs = require("fs");
+var moment = require('moment');
+
+var helpers = module.exports;
+
+function puts(obj) { console.log(obj); }
+function putd(obj) { console.log(obj); }
+helpers.puts = puts;
+helpers.putd = putd;
+
+
+helpers.readCsv = function(filedir, filename, callback) {
+
+
+ var Converter=csvtojson.Converter;
+ var csvFileName=path.join(filedir,filename);
+ var fileStream=fs.createReadStream(csvFileName);
+ fileStream.on('error', function(err){
+ callback(err, null);
+ });
+ var param={noheader:true, checkType:false};
+ var csvConverter=new Converter(param);
+ csvConverter.on("end_parsed",function(jsonObj){
+ var returnValue = jsonObj;
+ callback(null, returnValue);
+ });
+ fileStream.on('error', function(err) {
+ putd(err);
+ callback(err,"");
+ });
+ fileStream.pipe(csvConverter);
+}
+
+helpers.getParam = function(csv, matchField, matchValue, returnField) {
+ dataRow=_.find(csv, matchField, matchValue);
+ dataValue=dataRow[returnField];
+ return dataValue;
+}
+
+helpers.writeOutput = function(req, filename, jsonOutput, callback) {
+ try {
+ fs.writeFileSync(filename, jsonOutput);
+ }
+ catch(err){
+ callback(err);
+ }
+}
+
+helpers.getFileName = function(req, defFilename) {
+
+ var fileObj = null;
+ for (var x=0; x < req.files.length; x++)
+ {
+ var fileObj = req.files[x];
+ if ( fileObj.filename.indexOf(defFilename) != -1 ){
+ return fileObj.filename;
+ }
+ }
+ return null;
+}
diff --git a/admportal/server/router/routes/mobility.js b/admportal/server/router/routes/mobility.js new file mode 100644 index 00000000..1c45452e --- /dev/null +++ b/admportal/server/router/routes/mobility.js @@ -0,0 +1,1339 @@ +var express = require('express'); +var router = express.Router(); +var exec = require('child_process').exec; +var util = require('util'); +var fs = require('fs.extra'); +var dbRoutes = require('./dbRoutes'); +var csp = require('./csp'); +var multer = require('multer'); +var bodyParser = require('body-parser'); +var sax = require('sax'),strict=true,parser = sax.parser(strict); +var async = require('async'); +var l_ = require('lodash'); +var dateFormat = require('dateformat'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); + + +// pass host, username and password to ODL +// target host for ODL request +var username = properties.odlUser; +var password = properties.odlPasswd; +var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64'); +var host = properties.odlHost; +var port = properties.odlPort; + +var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/json'}; +var options = { + host : host, + headers : header, + port : port, + rejectUnauthorized:false, + strictSSL: false +}; + +// Connection to OpenDaylight +Odl = require('./Odl'); + +// used for file upload button, retain original file name +//router.use(bodyParser()); +//router.use(bodyParser.urlencoded({ + //extended: true +//})); + +//var upload = multer({ dest: process.cwd() + '/uploads/', rename: function(fieldname,filename){ return filename; } }); + +// multer 1.1 +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, process.cwd() + '/uploads/') + }, + filename: function (req, file, cb) { + cb(null, file.originalname ) + } +}); + +var upload = multer({ + storage: storage +}); + + + + +// GET +router.get('/getVnfData', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVnfData(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVmNetworks', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVmNetworks(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVnfProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVnfProfile(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVnfNetworks', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVnfNetworks(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVmProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVmProfile(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +//////// +router.get('/getVnfNetworkData', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVnfNetworkData(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); + +router.get('/viewVnfNetworkData', csp.checkAuth, function(req,res) +{ + var privilegeObj = req.session.loggedInAdmin; + var resp_msg = ''; + var network_name = req.query.network_name; + var network_type = req.query.network_type; + var tasks = []; + + tasks.push(function(callback){ + Odl.GetPreloadVnfData('/restconf/config/VNF-API:preload-vnfs/vnf-preload-list/' + + encodeURIComponent(network_name) + '/' + encodeURIComponent(network_type) + '/', options,res,callback); + + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + resp_msg = err; + res.render('mobility/displayVnfNetworkData', {result:{code:'failure', msg:resp_msg}, header:process.env.MAIN_MENU}); + return; + } + else{ + resp_msg = JSON.stringify(JSON.parse(result[0],null,4)); + res.render('mobility/displayVnfNetworkData', {result:{code:'success', msg:JSON.parse(result[0])}, header:process.env.MAIN_MENU}); + return; + } + }); + +}); + +router.get('/viewVnfData', csp.checkAuth, function(req,res) +{ + var privilegeObj = req.session.loggedInAdmin; + var resp_msg = ''; + var vnf_name = req.query.vnf_name; + var vnf_type = req.query.vnf_type; + var tasks = []; + + tasks.push(function(callback){ + Odl.GetPreloadVnfData('/restconf/config/VNF-API:preload-vnfs/vnf-preload-list/' + + encodeURIComponent(vnf_name) + '/' + encodeURIComponent(vnf_type) + '/', options,res,callback); + + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + resp_msg = err; + res.render('mobility/displayVnfData', {result:{code:'failure', msg:resp_msg}, header:process.env.MAIN_MENU}); + return; + } + else{ + resp_msg = JSON.stringify(JSON.parse(result[0],null,4)); + res.render('mobility/displayVnfData', {result:{code:'success', msg:JSON.parse(result[0])}, header:process.env.MAIN_MENU}); + return; + } + }); + +}); + +router.get('/loadVnfNetworkData', csp.checkAuth, dbRoutes.checkDB, function(req,res) +{ + + var privilegeObj = req.session.loggedInAdmin; + var msgArray = new Array(); + + if ( req.query.status != 'pending' ) + { + msgArray.push("Upload Status must be in 'pending' state."); + dbRoutes.getVnfNetworkData(req,res, {code:'failure', msg:msgArray}, privilegeObj); + return; + } + + // build request-id + var now = new Date(); + var df = dateFormat(now,"isoDateTime"); + var rnum = Math.floor((Math.random() * 9999) +1); + var svc_req_id = req.query.id + "-" + df + "-" + rnum; + + var tasks = []; + + // first get the contents of the file from the db + tasks.push(function(callback){ + dbRoutes.getVnfPreloadData(req,res,"PRE_LOAD_VNF_NETWORK_DATA",callback); + }); + + // then format the request and send it using the arg1 parameter + // which is the contents of the file returned from the previous function + // call in the tasks array + tasks.push(function(arg1,callback){ + + var s_file = JSON.stringify(arg1); + + // remove the last two braces, going to add the headers there + // will add them back later. + s_file = s_file.substring(0, (s_file.length-2)); + + // add the request-information header + s_file = s_file.concat(',"request-information": {"request-action": "PreloadNetworkRequest"}'); + + // add the sdnc-request-header + s_file = s_file.concat(',"sdnc-request-header": {"svc-request-id":"'); + s_file = s_file.concat(svc_req_id); + s_file = s_file.concat('","svc-action": "reserve"}'); + + // add the two curly braces at the end that we stripped off + s_file = s_file.concat('}}'); + + Odl.Post('/restconf/operations/VNF-API:preload-network-topology-operation', + options,s_file,res,callback); + }); + + // if successful then update the status + tasks.push(function(arg1,callback){ + dbRoutes.executeSQL("UPDATE PRE_LOAD_VNF_NETWORK_DATA SET status='uploaded',svc_request_id='" + + svc_req_id + "',svc_action='reserve' WHERE id="+req.query.id,req,res,callback); + }); + + // use the waterfall method of making calls + async.waterfall(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push("Error posting pre-load data to ODL: "+err); + dbRoutes.getVnfNetworkData(req,res, {code:'failure', msg:msgArray}, privilegeObj); + return; + } + else{ + msgArray.push('Successfully loaded VNF pre-loaded data.'); + dbRoutes.getVnfNetworkData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.get('/loadVnfData', csp.checkAuth, dbRoutes.checkDB, function(req,res) +{ + var privilegeObj = req.session.loggedInAdmin; + var full_path_file_name = process.cwd() + "/uploads/" + req.query.filename + var msgArray = new Array(); + + if ( req.query.status != 'pending' ) + { + msgArray.push("Upload Status must be in 'pending' state."); + dbRoutes.getVnfData(req,res, {code:'failure', msg:msgArray}, privilegeObj); + return; + } + + // build request-id + var now = new Date(); + var df = dateFormat(now,"isoDateTime"); + var rnum = Math.floor((Math.random() * 9999) +1); + var svc_req_id = req.query.id + "-" + df + "-" + rnum; + + var tasks = []; + + // first get the contents of the file from the db + tasks.push(function(callback){ + dbRoutes.getVnfPreloadData(req,res,"PRE_LOAD_VNF_DATA",callback); + }); + + // then format the request and send it using the arg1 parameter + // which is the contents of the file returned from the previous function + // call in the tasks array + tasks.push(function(arg1,callback){ + + var s1_file = JSON.stringify(arg1); + var s_file = decodeURI(s1_file); + + + // remove the last two braces, going to add the headers there + // will add them back later. + s_file = s_file.substring(0, (s_file.length-2)); + + // add the request-information header + s_file = s_file.concat(',"request-information": {"request-action": "PreloadVNFRequest"}'); + + // add the sdnc-request-header + s_file = s_file.concat(',"sdnc-request-header": {"svc-request-id":"'); + s_file = s_file.concat(svc_req_id); + s_file = s_file.concat('","svc-action": "reserve"}'); + + // add the two curly braces at the end that we stripped off + s_file = s_file.concat('}}'); + + Odl.Post('/restconf/operations/VNF-API:preload-vnf-topology-operation', + options,s_file,res,callback); + }); + + // if successful then update the status + tasks.push(function(arg1,callback){ + dbRoutes.executeSQL("UPDATE PRE_LOAD_VNF_DATA SET status='uploaded',svc_request_id='" + + svc_req_id + "',svc_action='reserve' WHERE id="+req.query.id,req,res,callback); + }); + + // use the waterfall method of making calls + async.waterfall(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push("Error posting pre-load data to ODL: "+err); + dbRoutes.getVnfData(req,res, {code:'failure', msg:msgArray}, privilegeObj); + return; + } + else{ + msgArray.push('Successfully loaded VNF pre-loaded data.'); + dbRoutes.getVnfData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.get('/deleteVnfNetworkData', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql = 'DELETE FROM PRE_LOAD_VNF_NETWORK_DATA WHERE id=' + req.query.id; + + // if status is pending, then we do not have to call + // ODL, just remove from db + if (req.query.status == 'pending'){ + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + } else { + // format the request to ODL + var inputString = '{"input":{"network-topology-information":{"network-topology-identifier":{"service-type":"SDN-MOBILITY","network-name": "'; + inputString = inputString.concat(req.query.network_name); + inputString = inputString.concat('","network-type":"'); + inputString = inputString.concat(req.query.network_type); + inputString = inputString.concat('"}},'); + + // add the request-information header + inputString = inputString.concat('"request-information": {"request-action": "DeletePreloadNetworkRequest"},'); + + // add the sdnc-request-header + inputString = inputString.concat('"sdnc-request-header": {"svc-request-id":"'); + inputString = inputString.concat(req.query.svc_request_id); + inputString = inputString.concat('","svc-action": "delete"}}}'); + + tasks.push(function(callback) { + Odl.Post('/restconf/operations/VNF-API:preload-network-topology-operation', + options,inputString,res,callback); + }); + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + } + async.series(tasks, function(err,result){ + + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVnfNetworkData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from PRE_LOAD_VNF_NETWORK_DATA table and ODL.'); + dbRoutes.getVnfNetworkData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.get('/deleteVnfData', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql = 'DELETE FROM PRE_LOAD_VNF_DATA WHERE id=' + req.query.id; + + // if status is pending, then we do not have to call + // ODL, just remove from db + if (req.query.status == 'pending'){ + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + } else { + var inputString = '{"input":{"vnf-topology-information":{"vnf-topology-identifier":{"service-type":"SDN-MOBILITY","vnf-name": "'; + inputString = inputString.concat(req.query.vnf_name); + inputString = inputString.concat('","vnf-type":"'); + inputString = inputString.concat(req.query.vnf_type); + inputString = inputString.concat('"}},'); + + // add the request-information header + inputString = inputString.concat('"request-information": {"request-action": "DeletePreloadVNFRequest"},'); + + // add the request-information header + //inputString = inputString.concat('"request-information": {"request-id": "259c0f93-23cf-46ad-84dc-162ea234fff1",'); + //inputString = inputString.concat('"source": "ADMINPORTAL",'); + //inputString = inputString.concat('"order-version": "1",'); + //inputString = inputString.concat('"notification-url": "notused-this would be infrastructure portal",'); + //inputString = inputString.concat('"order-number": "1",'); + //inputString = inputString.concat('"request-action": "DeletePreloadVNFRequest"},'); + + // add the sdnc-request-header + inputString = inputString.concat('"sdnc-request-header": {"svc-request-id":"'); + inputString = inputString.concat(req.query.svc_request_id); + inputString = inputString.concat('","svc-action": "delete"}}}'); + + //inputString = inputString.concat('"sdnc-request-header":{'); + //inputString = inputString.concat('"svc-request-id": "2015-01-15T14:34:54.st1101a",'); + //inputString = inputString.concat('"svc-notification-url": "not used",'); + //inputString = inputString.concat('"svc-action": "delete"}}}'); + + tasks.push(function(callback) { + Odl.Post('/restconf/operations/VNF-API:preload-vnf-topology-operation', + options,inputString,res,callback); + }); + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + } + async.series(tasks, function(err,result){ + + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from PRE_LOAD_VNF_DATA table and ODL.'); + dbRoutes.getVnfData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.get('/deleteVmProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql = ''; + + sql = "DELETE FROM VM_PROFILE WHERE vnf_type='" + req.query.vnf_type + "'" + + " AND vm_type='" + req.query.vm_type + "'"; + + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVmProfile(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VM_PROFILE table.'); + dbRoutes.getVmProfile(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.get('/deleteVnfNetwork', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql = ''; + + sql = "DELETE FROM VNF_NETWORKS WHERE vnf_type='" + req.query.vnf_type + "'" + + " AND network_role='" + req.query.network_role + "'"; + + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVnfNetwork(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VNF_NETWORKS table.'); + dbRoutes.getVnfNetworks(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.get('/deleteVnfProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql = ''; + + sql = "DELETE FROM VNF_PROFILE WHERE vnf_type='" + req.query.vnf_type + "'"; + + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVnfProfile(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VNF_PROFILE table.'); + dbRoutes.getVnfProfile(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.get('/deleteVmNetwork', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql = ''; + + sql = "DELETE FROM VM_NETWORKS WHERE vnf_type='" + req.query.vnf_type + + "' AND vm_type='" + req.query.vm_type + "' AND network_role='" + + req.query.network_role + "'"; + + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVmNetworks(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VM_NETWORKS table.'); + dbRoutes.getVmNetworks(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +// POST +router.post('/addVmProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql; + + + if ( req.body.nf_vm_count.length > 0 ) + { + sql = "INSERT INTO VM_PROFILE (vnf_type,vm_type,vm_count) VALUES (" + + "'" + req.body.nf_vnf_type + "'," + + "'" + req.body.nf_vm_type + "'," + + req.body.nf_vm_count + ")"; + } + else + { + sql = "INSERT INTO VM_PROFILE (vnf_type,vm_type) VALUES (" + + "'" + req.body.nf_vnf_type + "'," + + "'" + req.body.nf_vm_type + "')"; + } + + + console.log("SQL: " + sql); + + tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVmProfile(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully added VM Profile'); + dbRoutes.getVmProfile(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.post('/addVnfNetwork', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + + var sql = "INSERT INTO VNF_NETWORKS (vnf_type,network_role) VALUES (" + + "'" + req.body.nf_vnf_type + "'," + + "'" + req.body.nf_network_role + "')"; + + console.log("SQL: " + sql); + + tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVnfNetworks(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully added VNF Network'); + dbRoutes.getVnfNetworks(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.post('/addVnfProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql; + + sql = "INSERT INTO VNF_PROFILE (vnf_type,availability_zone_count,equipment_role) VALUES (" + + "'" + req.body.nf_vnf_type + "'," + + req.body.nf_availability_zone_count + + ",'" + req.body.nf_equipment_role + "')"; + +console.log(sql); + + tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVnfProfile(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully added VNF Profile'); + dbRoutes.getVnfProfile(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.post('/addVmNetwork', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var msgArray = new Array(); + + // convert true|false to 1|0 + var assign_ips = (req.body.nf_assign_ips == 'true') ? 1 : 0; + var assign_macs = (req.body.nf_assign_macs == 'true') ? 1 : 0; + var assign_floating_ip = (req.body.nf_assign_floating_ip == 'true') ? 1 : 0; + + + if ((req.body.nf_assign_ips == 'true' && + (typeof req.body.nf_ip_count == 'undefined' || req.body.nf_ip_count.length <=0))) + { + msgArray.push("If assign_ips equals 'true', ip_count must be populated with a number."); + dbRoutes.getVmNetworks(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + + if ( req.body.nf_ip_count.length >0 ) + { + var sql = "INSERT INTO VM_NETWORKS (vnf_type,vm_type,network_role,ip_count,assign_ips,assign_macs,assign_floating_ip) VALUES (" + + "'" + req.body.nf_vnf_type + "'," + + "'" + req.body.nf_vm_type + "'," + + "'" + req.body.nf_network_role + "'," + + req.body.nf_ip_count + "," + + assign_ips + "," + + assign_macs + "," + + assign_floating_ip + ")"; + } + else + { + var sql = "INSERT INTO VM_NETWORKS (vnf_type,vm_type,network_role,assign_ips,assign_macs,assign_floating_ip) VALUES (" + + "'" + req.body.nf_vnf_type + "'," + + "'" + req.body.nf_vm_type + "'," + + "'" + req.body.nf_network_role + "'," + + assign_ips + "," + + assign_macs + "," + + assign_floating_ip + ")"; + } + + tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVmNetworks(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully added VM Network'); + var message = ''; + if (req.body.nf_ip_count.length >0) + { + message = req.body.nf_vnf_type + + ',' + req.body.nf_vm_type + + ',' + req.body.nf_network_role + + ',' + req.body.nf_ip_count + + ',' + req.body.nf_assign_ips + + ',' + req.body.nf_assign_macs + + ',' + req.body.nf_assign_floating_ip; + } + else + { + message = req.body.nf_vnf_type + + ',' + req.body.nf_vm_type + + ',' + req.body.nf_network_role + + ',' + req.body.nf_assign_ips + + ',' + req.body.nf_assign_macs + + ',' + req.body.nf_assign_floating_ip; + } + dbRoutes.getVmNetworks(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// POST +router.post('/uploadVnfData', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res) +{ +console.log('filename:'+ JSON.stringify(req.file.originalname)); + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname) + { + if (req.file.originalname.size == 0) { + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) + { + if(exists) + { + var str = req.file.originalname; + var content; + var enc_content; + + try{ + content = fs.readFileSync(req.file.path); + enc_content = encodeURI(content); + + + var sql = "INSERT INTO PRE_LOAD_VNF_DATA " + + "(filename,preload_data) VALUES (" + + "'"+ str + "'," + "'" + enc_content + "')"; + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } ); + async.series(tasks, function(err,result) + { + if(err){ + msgArray.push(err); + dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully uploaded ' + str); + dbRoutes.getVnfData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); + } + catch(error){ + fs.removeSync(req.file.path); // remove bad file that was uploaded + console.error("There was an error reading the file '"+str+"'. Error: " + error); + msgArray.push("There was an error reading the file '"+str+"'. Error: " + error); + dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfData(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else + { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfData(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + +router.post('/uploadVnfNetworkData', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res) +{ + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname) + { + if (req.file.originalname.size == 0) { + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) + { + if(exists) + { + var str = req.file.originalname; + var content; + var enc_content; + + try{ + content = fs.readFileSync(req.file.path); + enc_content = encodeURI(content); + + var sql = "INSERT INTO PRE_LOAD_VNF_NETWORK_DATA " + + "(filename,preload_data) VALUES (" + + "'"+ str + "'," + "'" + enc_content + "')"; + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } ); + async.series(tasks, function(err,result) + { + if(err){ + msgArray.push(err); + dbRoutes.getVnfNetworkData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully uploaded ' + str); + dbRoutes.getVnfNetworkData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); + } + catch(error){ + fs.removeSync(req.file.path); // remove bad file that was uploaded + msgArray.push("There was an error reading the file '"+str+"'. Error: " + error); + dbRoutes.getVnfNetworkData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfNetworkData(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else + { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfNetworkData(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + + +router.post('/uploadVmNetworks', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getVmNetworks(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVmNetwork(lrow,res,callback); } + } + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.parallelLimit(funcArray, 50, function(err,result){ + + if ( err ) { + dbRoutes.getVmNetworks(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getVmNetworks(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getVmNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVmNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVmNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + +router.post('/uploadVnfProfile', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname) + { + if (req.file.originalname.size == 0) { + dbRoutes.getVnfProfile(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVnfProfile(lrow,res,callback); } + } + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.series(funcArray, function(err,result){ + + if ( err ) { + dbRoutes.getVnfProfile(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } +console.log('rowError='+rowError); + var rowsProcessed = f.length - rowError; +console.log('rowsProcessed='+rowsProcessed); + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } +console.log('result='+JSON.stringify(result)); + dbRoutes.getVnfProfile(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + console.error('There was an error uploading the file. '+ex); + dbRoutes.getVnfProfile(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfProfile(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfProfile(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } +} ); + + +router.post('/uploadVnfNetworks', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname) + { + if (req.file.originalname.size == 0) { + dbRoutes.getVnfProfile(req,res, + {code:'failure', msg:'There was an error uploading the file, please try again.'}, + privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVnfNetwork(lrow,res,callback); } + } + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.series(funcArray, function(err,result){ + + if ( err ) { + dbRoutes.getVnfNetworks(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getVnfNetworks(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getVnfNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } +} ); + +router.post('/uploadVmProfile', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname) + { + if (req.file.originalname.size == 0) { + dbRoutes.getVmProfile(req,res, + {code:'failure', msg:'There was an error uploading the file, please try again.'}, + privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVmProfile(lrow,res,callback); } + } + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.series(funcArray, function(err,result){ + + if ( err ) { + dbRoutes.getVmProfile(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getVmProfile(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getVmProfile(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVmProfile(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVmProfile(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } +} ); + +module.exports = router; diff --git a/admportal/server/router/routes/network.js b/admportal/server/router/routes/network.js new file mode 100644 index 00000000..c64beae2 --- /dev/null +++ b/admportal/server/router/routes/network.js @@ -0,0 +1,400 @@ +
+// Helper functions for processing a NETWORK worksheet
+
+var helpers = require('./helpers.js');
+var _ = require('lodash');
+var csvtojson = require('csvtojson');
+var async = require('async');
+var uuid = require('node-uuid'); // generate a uuid with "uuid.v1()"
+var path = require('path');
+var fs = require("fs");
+var moment = require("moment");
+
+var network = module.exports;
+var getParam = helpers.getParam;
+
+var indir;
+var csvGeneral, csvSubnets, csvVpnBindings, csvPolicies, csvNetRoutes;
+var rawJson={}
+var finalJson={};
+var platform;
+var req,res;
+var preloadVersion; // 1607, 1610, etc...
+
+puts = helpers.puts;
+putd = helpers.putd;
+
+network.go = function(lreq,lres,cb,dir) {
+ puts("Processing NETWORK workbook");
+ req = lreq;
+ res = lres;
+ callback = cb;
+ if (dir!="") {
+ platform="pc";
+ indir=dir;
+ } else {
+ platform="portal";
+ indir=process.cwd() + "/uploads/";
+ }
+ doGeneral();
+}
+
+// READ WORKSHEET: GENERAL
+
+function doGeneral() {
+ puts("Reading General worksheet");
+ var csvFilename="General.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotGeneral);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotGeneral(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('General.csv file is missing from upload.');
+ return;
+ }
+ csvGeneral = jsonObj;
+ puts("\nRead this: ");
+ putd(csvGeneral);
+ puts("\n");
+ doSubnets();
+}
+
+// READ WORKSHEET: SUBNETS
+
+function doSubnets() {
+ puts("Reading Subnets worksheet");
+ var csvFilename="Subnets.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotSubnets);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotSubnets(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Subnets.csv file is missing from upload.');
+ return;
+ }
+ csvSubnets = jsonObj;
+ csvSubnets = _.reject(csvSubnets, 'field2', 'Subnets');
+ csvSubnets = _.reject(csvSubnets, 'field2', 'start-address');
+ csvSubnets = _.reject(csvSubnets, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvSubnets);
+ puts("\n");
+ doVpnBindings();
+}
+
+// READ WORKSHEET: VPN-BINDINGS
+
+function doVpnBindings() {
+ puts("Reading VPN-Bindings worksheet");
+ var csvFilename="VPN-Bindings.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVpnBindings);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVpnBindings(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VPN-Bindings.csv file is missing from upload.');
+ return;
+ }
+ csvVpnBindings = jsonObj;
+ csvVpnBindings = _.reject(csvVpnBindings, 'field2', 'VPN-Bindings');
+ csvVpnBindings = _.reject(csvVpnBindings, 'field2', 'vpn-binding-id');
+ csvVpnBindings = _.reject(csvVpnBindings, function(o) { return (_.trim(o.field2)=="") && (_.trim(o.field3)==""); } );
+ puts("\nRead this: ");
+ putd(csvVpnBindings);
+ puts("\n");
+ doPolicies();
+}
+
+
+// READ WORKSHEET: POLICIES
+
+function doPolicies() {
+ puts("Reading Policies worksheet");
+ var csvFilename="Policies.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotPolicies);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotPolicies(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Policies.csv file is missing from upload.');
+ return;
+ }
+ csvPolicies = jsonObj;
+ csvPolicies = _.reject(csvPolicies, 'field2', 'Policies');
+ csvPolicies = _.reject(csvPolicies, 'field2', 'network-policy-fqdn');
+ csvPolicies = _.reject(csvPolicies, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvPolicies);
+ puts("\n");
+ doNetRoutes();
+}
+
+
+// READ WORKSHEET: NETWORK-ROUTES
+
+function doNetRoutes() {
+ puts("Reading Network-Routes worksheet");
+ var csvFilename="Network-Routes.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ preloadVersion = getParam(csvGeneral, 'field2', 'preload-version', 'field3');
+ if ( preloadVersion == '1607' ) {
+ puts("This is a 1607 spreadsheet. Skipping Network-Routes.csv.");
+ gotNetRoutes(null,{});
+ return;
+ }
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotNetRoutes);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotNetRoutes(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Network-Routes.csv file is missing from upload.');
+ return;
+ }
+ csvNetRoutes = jsonObj;
+ csvNetRoutes = _.reject(csvNetRoutes, 'field2', 'Network-Routes');
+ csvNetRoutes = _.reject(csvNetRoutes, 'field2', 'route-table-reference-fqdn');
+ csvNetRoutes = _.reject(csvNetRoutes, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvNetRoutes);
+ puts("\n");
+ doneReadingFiles();
+}
+
+
+// DONE READING FILES
+
+function doneReadingFiles() {
+ puts("\n");
+ puts("DONE READING FILES!");
+ puts("\n");
+ processJson();
+}
+
+
+// PROCESS THE CSV FILES INTO OBJECTS TO BE ASSEMBLED INTO FINAL OUTPUT
+function processJson() {
+ processGeneral();
+ processSubnets();
+ processVpnBindings();
+ processPolicies();
+ processNetRoutes();
+ assembleJson();
+}
+
+// ASSEMBLE AND OUTPUT RESULTS
+
+function assembleJson() {
+ puts("\n");
+ puts("Using raw JSON and assembling final ouptut JSON.");
+ puts("\n");
+
+ networkTopoID = { "network-name": rawJson['network-name'],
+ "network-role": rawJson['network-role'],
+ "network-type": rawJson['network-type'],
+ "network-technology": rawJson['network-technology'] };
+
+ providerInfo = { "physical-network-name": rawJson['physical-network-name'],
+ "is-provider-network": rawJson['is-provider-network'],
+ "is-shared-network": rawJson['is-shared-network'],
+ "is-external-network": rawJson['is-external-network'] };
+
+ networkSubnets = rawJson['subnets'];
+
+ networkVpnBindings = rawJson['vpn-bindings'];
+
+ networkPolicies = rawJson['network-policy-fqdns'];
+
+ networkRoutes = rawJson['route-table-reference'];
+
+ networkTopo = { "network-topology-identifier": networkTopoID,
+ "provider-network-information": providerInfo,
+ "subnets": networkSubnets,
+ "vpn-bindings": networkVpnBindings,
+ "network-policy": networkPolicies,
+ "route-table-reference": networkRoutes};
+
+ networkInput = {'network-topology-information': networkTopo};
+
+ finalJson = {"input": networkInput};
+
+ outputJson();
+}
+
+function outputJson() {
+ puts("\n");
+ puts("\n");
+ puts(JSON.stringify(finalJson,null,2));
+ puts("\n");
+ puts("\n");
+ var unixTime, fullpath_filename, filename;
+ unixTime = moment().unix();
+ if (platform=='portal') {
+ fullpath_filename = process.cwd() + "/uploads/" + unixTime + ".net_worksheet.json";
+ filename = unixTime + ".net_worksheet.json.";
+ } else {
+ fullpath_filename = "./output.json."+unixTime;
+ filename = "output.json." + unixTime;
+ }
+ helpers.writeOutput(req, fullpath_filename, JSON.stringify(finalJson,null,2), callback);
+ callback(null, finalJson, filename);
+}
+
+
+// Gather functions that actually process data after it is all read
+
+function processGeneral() {
+ preloadVersion = getParam(csvGeneral, 'field2', 'preload-version', 'field3');
+ rawJson['preload-version'] = preloadVersion;
+ puts("Preload version: " + preloadVersion);
+
+ if ( (preloadVersion!='1607') && (preloadVersion!='1610') ) {
+ puts("\nError - incorrect version of preload worksheet.");
+ callback('Error - incorrect version of preload worksheet.');
+ }
+
+ rawJson['network-name'] = getParam(csvGeneral, 'field2', 'network-name', 'field3');
+ rawJson['network-role'] = getParam(csvGeneral, 'field2', 'network-role', 'field3');
+ rawJson['network-type'] = getParam(csvGeneral, 'field2', 'network-type', 'field3');
+ rawJson['network-technology'] = getParam(csvGeneral, 'field2', 'network-technology', 'field3');
+
+ if ( preloadVersion!='1607' ) {
+ rawJson['physical-network-name'] = getParam(csvGeneral, 'field2', 'physical-network-name', 'field3');
+ rawJson['is-provider-network'] = getParam(csvGeneral, 'field2', 'is-provider-network', 'field3');
+ rawJson['is-shared-network'] = getParam(csvGeneral, 'field2', 'is-shared-network', 'field3');
+ rawJson['is-external-network'] = getParam(csvGeneral, 'field2', 'is-external-network', 'field3');
+ }
+
+ rawJson['request-action'] = "PreloadNetworkRequest";
+ rawJson['svc-request-id'] = uuid.v1();
+ rawJson['svc-action'] = "reserve";
+ puts('rawJson:');
+ putd(rawJson);
+ puts("\n");
+}
+
+function processSubnets() {
+ var newSubnets = [];
+ csvSubnets.forEach( function(subnet) {
+ var subnetJson = {};
+ subnetJson["start-address"] = subnet.field2;
+ if (subnet.field3!='') {
+ subnetJson["dhcp-start-address"] = subnet.field3;
+ }
+ if (subnet.field4!='') {
+ subnetJson["dhcp-end-address"] = subnet.field4;
+ }
+ if (subnet.field5!='') {
+ subnetJson["gateway-address"] = subnet.field5;
+ }
+ subnetJson["cidr-mask"] = subnet.field6;
+ subnetJson["ip-version"] = subnet.field7;
+ subnetJson["dhcp-enabled"] = subnet.field8;
+ subnetJson["subnet-name"] = subnet.field9;
+ newSubnets.push(subnetJson);
+ }
+ );
+ puts("subnets:");
+ putd(newSubnets);
+ puts("\n");
+ rawJson["subnets"] = newSubnets;
+}
+
+function processVpnBindings() {
+ var newVpnBindings = [];
+
+ csvVpnBindings.forEach( function(vpn) {
+ var vpnJson = {};
+ bindid = _.trim(vpn.field2);
+ vpnJson["vpn-binding-id"] = bindid;
+ if (bindid!="") {
+ newVpnBindings.push(vpnJson);
+ }
+ });
+
+ puts("VPN-Bindings:");
+ putd(newVpnBindings);
+ puts("\n");
+ rawJson["vpn-bindings"] = newVpnBindings;
+}
+
+function processPolicies() {
+ var newPolicies = [];
+
+ csvPolicies.forEach( function(policy) {
+ var policyJson = {};
+ fqdn = _.trim(policy.field2);
+ if (fqdn != "") {
+ policyJson["network-policy-fqdn"] = fqdn;
+ newPolicies.push(policyJson);
+ }
+
+ }
+ );
+
+ puts("Policies:");
+ putd(newPolicies);
+ puts("\n");
+ rawJson["network-policy-fqdns"] = newPolicies;
+}
+
+function processNetRoutes() {
+ var newNetRoutes = [];
+
+ csvNetRoutes.forEach( function(netroute) {
+ var netrouteJson = {};
+ fqdn = _.trim(netroute.field2);
+ if (fqdn != "") {
+ netrouteJson["route-table-reference-fqdn"] = fqdn;
+ newNetRoutes.push(netrouteJson);
+ }
+
+ }
+ );
+
+ puts("Network-Routes:");
+ putd(newNetRoutes);
+ puts("\n");
+ rawJson["route-table-reference"] = newNetRoutes;
+}
+
+
+
diff --git a/admportal/server/router/routes/odl.js b/admportal/server/router/routes/odl.js new file mode 100644 index 00000000..fba646fa --- /dev/null +++ b/admportal/server/router/routes/odl.js @@ -0,0 +1,258 @@ +var express = require('express'); +var router = express.Router(); +var csp = require('./csp'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); +var async = require('async'); + + +// pass host, username and password to ODL +var username = properties.odlUser; +var password = properties.odlPasswd; +var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64'); + +// target host for ODL request +var host = properties.odlHost; +var port = properties.odlPort; +var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/yang.data+json'}; +var options = { + host: host, + headers : header, + port : port, + rejectUnauthorized: false, + strictSSL : false +}; + +// Connection to OpenDaylight +Odl = require('./Odl'); + +function handleResult(err, response_str, res) { + if (err) { + console.error( String(err) ); + res.render('pages/err', {result:{code:'failure', msg:String(err)}, header:process.env.MAIN_MENU}); + } else { + // make sure response starts with JSON string + if (response_str && response_str.indexOf('{') == 0) { + //console.log("response: ", result); + res.render('odl/listWklst', { response_obj: JSON.parse(response_str), header:process.env.MAIN_MENU }); + } else { + res.render('pages/err', {result:{code:'failure', msg:String(err) }, header:process.env.MAIN_MENU}); + } + } +} + +// / index page +// calls restconf to get information +router.get('/listWklst', csp.checkAuth, function(req, res) { + options.strictSSL = true; // used to test SSL certificate + Odl.Get('/restconf/config/L3SDN-API:services',options, handleResult,req,res); +}); + +router.get('/pageWklst', csp.checkAuth, function(req,res) { + pageWklst(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); + + +function pageWklst(req,res,resultObj,privilegeObj) +{ + if(req.session == null || req.session == undefined + || req.session.l3sdnPageInfo == null || req.session.l3sdnPageInfo == undefined) + { + res.render("pages/err", + { result: {code:'error', msg:"Unable to read session information. "+ String(err) }, header:process.env.MAIN_MENU}); + return; + } + + var l3sdnPageInfo = req.session.l3sdnPageInfo; + var currentPage=1; + if (typeof req.query.page != 'undefined') + { + currentPage = +req.query.page; + } + l3sdnPageInfo.currentPage = currentPage; + l3sdnPageInfo.rows = l3sdnPageInfo.pages[currentPage-1]; + req.session.l3sdnPageInfo = l3sdnPageInfo; + res.render('odl/listWklst', + { + pageInfo : l3sdnPageInfo, + result : resultObj, + privilege : privilegeObj, header:process.env.MAIN_MENU + }); + return; +} + + +router.post('/update_vr_lan_interface', function(req,res){ + var svc_instance_id = encodeURIComponent(req.body.svc_instance_id); + + // format msg + var msgRsp = + { + "vr-lan-interface" : + [ + { + "vr-designation" : req.body.uf_vr_designation, + "v6-vr-lan-prefix" : req.body.uf_vr_lan_prefix, + "v6-vr-lan-prefix-length": req.body.uf_vr_lan_prefix_length, + "v6-vce-wan-address" : req.body.uf_vce_wan_address, + "v4-vr-lan-prefix" : req.body.uf_vr_lan_prefix, + "v4-vr-lan-prefix-length": req.body.uf_vr_lan_prefix_length, + "v4-vce-loopback-address": req.body.uf_vce_loopback_address + } + ] + }; + var tasks = []; + tasks.push(function(callback){ + Odl.put_vr_lan_interface('/restconf/config/L3SDN-API:services/layer3-service-list/' + + svc_instance_id + + '/service-data/vr-lan/', options, callback); + }); + async.series(tasks, function(err,result){ + + if(err){ + } + else{ + var msgArray = new Array(); + //result:{code:'error', msg:"got vr-lan information: "+ String(result)} + msgArray.push('vr-lan-interface successfully updated.'); + res.render("odl/listVRlan", + { + svc_instance_id: req.body.svc_instance_id, + response_obj : JSON.parse(result), header:process.env.MAIN_MENU + }); + return; + } + }); +}); + + +// sendData submits form data to ODL +// Data is read from URL params and converted to JSON +router.get('/svc-topology-operation', function(req, res) { + var formData = '{"input":{' + + '"svc-request-id":"'+ new Date().toISOString() + '"' +',' + + '"svc-notification-url":"'+ req.query['svc-notification-url']+ '"' + ',' + + '"svc-action":"'+ req.query['svc-action']+ '"' + ',' + + '"svc-vnf-type":"'+ req.query['svc-vnf-type']+ '"' + ',' + + '"svc-instance-id":"'+ req.query['svc-instance-id']+ '"' + ',' + + '"svc-aic-site-id":"'+ req.query['svc-aic-site-id']+ '"' + +' } }'; + Odl.Post('/restconf/operations/L3SDN-API:svc-topology-operation', options, formData, handleResult, res); +}); + +// delete request +router.get('/wklist-delete', function(req, res) { + //console.dir(req.query); + Odl.Delete('/restconf/config/L3SDN-API:l3sdn-api-worklist/requests/'+req.query['request'], options, handleResult, res); +}); + +// get request +router.get('/getid',function(req, res) { + //console.dir(req.query); + Odl.GetID('/restconf/config/L3SDN-API:l3sdn-api-worklist/requests/'+req.query['request'], options, res); +}); + +router.get('/getvnf', function(req,res) { + //console.log("/getvnf "+req.query); + Odl.GetVNF('/restconf/config/L3SDN-API:l3sdn-api-worklist/requests/'+req.query['request']+'/vnf/',options,req,res); +}); +router.get('/getvrlan', function(req,res) { + var vrtasks = []; + var reqstr = encodeURIComponent(req.query['request']); + vrtasks.push(function(callback) { + Odl.GetVRlan('/restconf/config/L3SDN-API:services/layer3-service-list/'+reqstr+'/service-data/vr-lan/',options,callback); + }); + async.series(vrtasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + Odl.Get('/restconf/config/L3SDN-API:services',options, handleResult,res); + //res.render("pages/err", + //{result:{code:'error', msg:"Unable to get vr-lan information: "+ String(err) }}); + return; + } + else { + msgArray.push('Row successfully deleted from AIC_SITE table.'); + res.render("odl/listVRlan", + { + svc_instance_id: req.query['request'], + response_obj : JSON.parse(result), header:process.env.MAIN_MENU + }); + return; + } + }); +}); +router.get('/getClusterStatus', function(req,res) { + + + var urltasks = []; + var _header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/yang.data+json'}; + var _options = null; + + var slist = properties.shard_list; + var hlist = properties.hostnameList; + var port = properties.clusterPort; + var prefix_url = properties.clusterPrefixURL; + var mid_url = properties.clusterMidURL; + var suffix_url = properties.clusterSuffixURL; + var urlArray = new Array(); + var url_request=''; + var shard=null, hostname=null; + + // build array of urls from properties + for(var x=0; x<slist.length; x++) + { + shard = slist[x]; + for(var y=0; y<hlist.length; y++) + { + hostname = hlist[y]; + + url_request = properties.odlProtocol + '://' + + hostname.hname + ':' + + port + + prefix_url + + (y+1) + + mid_url + + shard.shard_name + + suffix_url; + + _options = { + method : "GET", + path : url_request, + host : hostname.hname, + headers : _header, + port : port, + rejectUnauthorized: false, + strictSSL : false + }; + urlArray.push(_options); + } + } + + urlArray.forEach(function(request){ + urltasks.push(function(callback) { + Odl.GetClusterStatus(request,callback); + }); + }); + async.series(urltasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + res.render("pages/err", + {result:{code:'error', msg:"Unable to get status: "+ String(err) }, header:process.env.MAIN_MENU}); + return; + } + else { + var msgArray = new Array(); + msgArray.push('Sucess'); + res.render("odl/cluster_status", + { + result : {code:'success', msg:msgArray}, + response_obj : result, header:process.env.MAIN_MENU + }); + return; + } + }); +}); + + +module.exports = router; diff --git a/admportal/server/router/routes/preload.js b/admportal/server/router/routes/preload.js new file mode 100644 index 00000000..1a63ec0e --- /dev/null +++ b/admportal/server/router/routes/preload.js @@ -0,0 +1,154 @@ +var express = require('express'); +var router = express.Router(); +var exec = require('child_process').exec; +var util = require('util'); +var fs = require('fs.extra'); +var dbRoutes = require('./dbRoutes'); +var csp = require('./csp'); +var multer = require('multer'); +var bodyParser = require('body-parser'); +var sax = require('sax'),strict=true,parser = sax.parser(strict); +var async = require('async'); +var l_ = require('lodash'); +var dateFormat = require('dateformat'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); +var vnf = require('./vnf'); +var network = require('./network'); +var moment = require('moment'); + + + +// pass host, username and password to ODL +// target host for ODL request +var username = properties.odlUser; +var password = properties.odlPasswd; +var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64'); +var host = properties.odlHost; +var port = properties.odlPort; + +var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/json'}; +var options = { + host : host, + headers : header, + port : port, + rejectUnauthorized:false, + strictSSL: false +}; + +// Connection to OpenDaylight +Odl = require('./Odl'); + +// multer 1.1 +var unixTime = moment().unix(); +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, process.cwd() + '/uploads/') + }, + filename: function (req, file, cb) { + cb(null, unixTime + "." + file.originalname ) + } +}); + +var upload = multer({ + storage: storage, + fileFilter: function(req,file,cb) { + var type = file.mimetype; + if ( type.indexOf('ms-excel') == -1 ) { + return cb(null,false); + } + cb(null,true); + } +}); + +router.post('/uploadVnfCsv', csp.checkAuth, dbRoutes.checkDB, upload.array('filename'), function(req, res) +{ + console.log('files:'+ JSON.stringify(req.files,null,4)); + + var tasks = [] + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + + tasks.push ( function(callback) { vnf.go(req,res,callback,''); } ); + tasks.push ( function(arg1,arg2,callback) { formatVnfInsertStatement(arg1,arg2,req,res,callback); } ); + tasks.push( function(arg1, callback) { dbRoutes.addRow(arg1,req,res,callback); } ); + async.waterfall(tasks, function(err,result) + { + if(err){ + msgArray.push(err); + dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + //logger.debug('Successfully uploaded ' + req.session.worksheetFilename); + msgArray.push('Successfully uploaded file.' ); + dbRoutes.getVnfData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); + +}); + +router.post('/uploadNetworkCsv', csp.checkAuth, dbRoutes.checkDB, upload.array('filename'), function(req, res) +{ + console.log('files:'+ JSON.stringify(req.files,null,4)); + + var tasks = [] + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + + tasks.push ( function(callback) { network.go(req,res,callback,''); } ); + tasks.push ( function(arg1,arg2,callback) { formatNetworkInsertStatement(arg1,arg2,req,res,callback); } ); + tasks.push( function(arg1, callback) { dbRoutes.addRow(arg1,req,res,callback); } ); + async.waterfall(tasks, function(err,result) + { + if(err){ + msgArray.push(err); + dbRoutes.getVnfNetworkData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + //logger.debug('Successfully uploaded ' + req.session.worksheetFilename); + msgArray.push('Successfully uploaded file.' ); + dbRoutes.getVnfNetworkData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); + +}); + + +function formatVnfInsertStatement(content,filename,req,res,callback) +{ + //var newstr = JSON.stringify(content).replace(/\\\"/g,'\\\\\\"'); + //var ins_str = newstr.replace("\r\n ", "\\r\\n"); + var newstr = JSON.stringify(content); + var enc_str = encodeURI(newstr); + var sql = "INSERT INTO PRE_LOAD_VNF_DATA " + + "(filename,preload_data) VALUES (" + + "'"+ filename + "'," + + "'" + enc_str + "')"; + + callback(null,sql); +} + +function formatNetworkInsertStatement(content,filename,req,res,callback) +{ + var newstr = JSON.stringify(content); + var enc_str = encodeURI(newstr); + var sql = "INSERT INTO PRE_LOAD_VNF_NETWORK_DATA " + + "(filename,preload_data) VALUES (" + + "'"+ filename + "'," + + "'" + enc_str + "')"; + + callback(null,sql); +} + + + +module.exports = router; diff --git a/admportal/server/router/routes/root.js b/admportal/server/router/routes/root.js new file mode 100644 index 00000000..f586892b --- /dev/null +++ b/admportal/server/router/routes/root.js @@ -0,0 +1,111 @@ +var express = require('express'); +var router = express.Router(); +var csp = require('./csp.js'); +var dbRoutes = require('./dbRoutes.js'); +var sla = require('./sla'); +var os = require('os'); +var async = require('async'); +var Odl = require('./Odl'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); + + + +router.use('/healthcheck', function(req,res){ + res.render('pages/healthcheck'); +}); +router.get('/test', function(req,res){ + +//console.log('port='+ req.socket.localPort); +//console.log('port='+ req.protocol); + + // pass host, username and password to ODL + var username = properties.odlUser; + var password = properties.odlPasswd; + var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64'); + + // target host for ODL request + var host = properties.odlHost; + var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/yang.data+json'}; + var c_header = {'Host': properties.odlConexusHost, 'Authorization': auth, 'Content-Type': 'application/yang.data+json'}; + +// path = '/restconf/config/SLI-API:healthcheck', + var _options = { + method : 'POST', + host : host, + headers : header, + port : '8443', + path : '/restconf/operations/SLI-API:healthcheck', + rejectUnauthorized: false, + strictSSL : false + }; + var c_options = { + method : 'POST', + host : properties.odlConexusHost, + headers : c_header, + port : '8543', + path : '/restconf/operations/SLI-API:healthcheck', + rejectUnauthorized: false, + strictSSL : false + }; + + + var tasks = []; + //tasks.push( function(callback) { dbRoutes.testdb(req,res,callback); } ); + + tasks.push ( createFunctionObj(_options) ); + + tasks.push ( createFunctionObj(c_options) ); + + async.series(tasks, function(err,result){ + if(err) { + res.status(400).send(err); + return; + } + res.status(200).send(result); + return; + }); +}); + +function createFunctionObj( loptions ) { + return function(callback) { Odl.Healthcheck(loptions,callback); }; +} + +router.get('/mytree', function(req,res) { + res.render('pages/tree'); +}); +router.get('/setuplogin', function(req,res) { + res.render('pages/setuplogin'); +}); +router.post('/formSetupLogin', dbRoutes.checkDB, function(req,res) { + dbRoutes.saveSetupLogin(req,res); +}); +router.post('/formSignUp', dbRoutes.checkDB, function(req,res) { + dbRoutes.saveUser(req,res); +}); +router.post('/formlogin', csp.login, dbRoutes.checkDB, function(req,res) { +}); +router.get('/login', function(req,res) { + res.render('pages/login'); + // handle get +}); +router.get('/signup', function(req,res) { + res.render('pages/signup'); + // handle get +}); +router.get('/info', function(req,res) { + // handle get + res.send("login info"); +}); +router.get('/logout', csp.logout, function(req,res) { + // handle get +}); +router.get('/csplogout', function(req,res) { + // handle get + res.render("pages/csplogout", {result:{code:'success', msg:'You have been successfylly logged out.'},header:process.env.MAIN_MENU}); +}); +router.get('/getuser', function(req,res) { + // handle get + res.render("pages/home"); +}); + +module.exports = router; diff --git a/admportal/server/router/routes/sla.js b/admportal/server/router/routes/sla.js new file mode 100644 index 00000000..92fa846b --- /dev/null +++ b/admportal/server/router/routes/sla.js @@ -0,0 +1,369 @@ +var express = require('express'); +var router = express.Router(); +var exec = require('child_process').exec; +//var util = require('util'); +var fs = require('fs'); +var dbRoutes = require('./dbRoutes'); +var csp = require('./csp'); +var multer = require('multer'); +var bodyParser = require('body-parser'); +//var sax = require('sax'),strict=true,parser = sax.parser(strict); +var async = require('async'); + + +// SVC_LOGIC table columns +var _module=''; // cannot use module its a reserved word +var version=''; +var rpc=''; +var mode=''; +var xmlfile=''; + + +// used for file upload button, retain original file name +//router.use(bodyParser()); +router.use(bodyParser.urlencoded({ + extended: true +})); +//var upload = multer({ dest: process.cwd() + '/uploads/', rename: function(fieldname,filename){ return filename; } }); + +// multer 1.1 +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, process.cwd() + '/uploads/') + }, + filename: function (req, file, cb) { + cb(null, file.originalname ) + } +}); + +var upload = multer({ + storage: storage +}); + + +/* +router.use(multer({ + dest: process.cwd() + '/uploads/', + rename: function(fieldname,filename){ + return filename; + } +})); +*/ + + +//router.use(express.json()); +//router.use(express.urlencoded()); +//router.use(multer({ dest: './uploads/' })); + + +// GET +router.get('/listSLA', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.listSLA(req,res,{code:'', msg:''} ); +}); + +router.get('/activate', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var _module = req.query.module; + var rpc = req.query.rpc; + var version = req.query.version; + var mode = req.query.mode; + + var tasks = []; + tasks.push( function(callback) { dbRoutes.global_deactivate(req,res,_module,rpc,mode,callback); } ); + tasks.push( function(callback) { dbRoutes.activate(req,res,_module,rpc,version,mode,callback); } ); + async.series(tasks, function(err,result){ + + if ( err ) { + dbRoutes.listSLA(req,res,{code:'failure', msg:'Failed to activate, '+ String(err) }); + } + else { + dbRoutes.listSLA(req,res,{ code:'success', msg:'Successfully activated directed graph.'}); + } + }); +}); + +router.get('/deactivate', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var _module = req.query.module; + var rpc = req.query.rpc; + var version = req.query.version; + var mode = req.query.mode; + + var tasks = []; + tasks.push( function(callback) { dbRoutes.deactivate(req,res,_module,rpc,version,mode,callback); } ); + async.series(tasks, function(err,result){ + + if ( err ) { + dbRoutes.listSLA(req,res,{code:'failure', msg:'There was an error uploading the file. '+ err }); + } + else { + dbRoutes.listSLA(req,res,{ code:'success', msg:'Successfully deactivated directed graph.'}); + } + }); +}); + +router.get('/deleteDG', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var _module = req.query.module; + var rpc = req.query.rpc; + var version = req.query.version; + var mode = req.query.mode; + + var tasks = []; + tasks.push( function(callback) { dbRoutes.deleteDG(req,res,_module,rpc,version,mode,callback); } ); + async.series(tasks, function(err,result){ + + if ( err ) { + dbRoutes.listSLA(req,res,{ code:'failure', msg:'There was an error uploading the file. '+ err }); + } + else { + dbRoutes.listSLA(req,res,{ code:'success', msg:'Successfully deleted directed graph.'}); + } + }); +}); + +router.post('/dgUpload', dbRoutes.checkDB, upload.single('filename'), function(req, res, next){ + + if(req.file.originalname){ + if (req.file.originalname == 0) { + + dbRoutes.listSLA(req,res,{ code:'danger', msg:'There was an error uploading the file, please try again.'}); + } + fs.exists(req.file.path, function(exists) { + if(exists) { + + // parse xml + try { + //dbRoutes.checkSvcLogic(req,res); + + var file_buf = fs.readFileSync(req.file.path, "utf8"); + + // call Dan's svclogic shell script from here + var currentDB = dbRoutes.getCurrentDB(); + var commandToExec = process.cwd() + + "/shell/svclogic.sh load " + + req.file.path + " " + + process.env.SDNC_CONFIG_DIR + "/svclogic.properties." + currentDB; + + console.log("commandToExec:" + commandToExec); + child = exec(commandToExec ,function (error,stdout,stderr){ + if(error){ + console.error("error:" + error); + //res.type('text/html').status(400).send( error); + //return; + } + if(stderr){ + res.status(400).send(stderr); + return; + } + if(stdout){ + res.status(200).send( new Buffer('Success')); + return; + } + + // remove the grave accents, the sax parser does not like them + //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close(); + //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res); + //dbRoutes.listSLA(req,res, resultObj); + }); + } catch(ex) { + // keep 'em silent + console.error('sax error:'+ex); + res.status(400).send(ex); + return; + } + + } else { + res.status(400).send(new Buffer('Cannot find file.')); + return; + + } + }); + } + else { + res.status(400).send(new Buffer('file does not exist\n')); + } + return; +}); + + +// POST +router.post('/upload', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res, next){ + +console.log('file:'+ JSON.stringify(req.file)); + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.listSLA(req,res,{ code:'danger', msg:'There was an error uploading the file, please try again.'}); + } + fs.exists(req.file.path, function(exists) { + if(exists) { + + // parse xml + try { + //dbRoutes.checkSvcLogic(req,res); + + var currentDB = dbRoutes.getCurrentDB(); + var file_buf = fs.readFileSync(req.file.path, "utf8"); + + // call Dan's svclogic shell script from here + var commandToExec = process.cwd() + + "/shell/svclogic.sh load " + + req.file.path + " " + + process.env.SDNC_CONFIG_DIR + "/svclogic.properties." + currentDB; + + console.log("commandToExec:" + commandToExec); + child = exec(commandToExec ,function (error,stdout,stderr){ + if(error){ + console.error("error:" + error); + dbRoutes.listSLA(req,res,{code:'failure',msg:error} ); + return; + } + if(stderr){ + console.error("stderr:" + JSON.stringify(stderr,null,2)); + var s_stderr = JSON.stringify(stderr); + if ( s_stderr.indexOf("Saving") > -1 ) + { + dbRoutes.listSLA(req,res,{code:'success', msg:'File sucessfully uploaded.'}); + }else { + dbRoutes.listSLA(req,res,{code:'failure', msg:stderr}); + } + return; + } + if(stdout){ + console.log("stderr:" + stdout); + dbRoutes.listSLA(req,res,{code:'success', msg:'File sucessfully uploaded.'}); + return; + } + + // remove the grave accents, the sax parser does not like them + //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close(); + //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res); + //dbRoutes.listSLA(req,res, resultObj); + }); + } catch(ex) { + // keep 'em silent + console.error("error:" + ex); + dbRoutes.listSLA(req,res,{code:'failure',msg:ex} ); + } + + } else { + dbRoutes.listSLA(req,res,{ code:'danger', msg:'There was an error uploading the file, please try again.'}); + } + }); + } + else { + dbRoutes.listSLA(req,res,{ code:'danger', msg:'There was an error uploading the file, please try again.'}); + } +}); + +router.get('/printAsXml', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + try { + //dbRoutes.checkSvcLogic(req,res); + + var _module = req.query.module; + var rpc = req.query.rpc; + var version = req.query.version; + var mode = req.query.mode; + var currentDB = dbRoutes.getCurrentDB(); + + // call Dan's svclogic shell script from here + var commandToExec = process.cwd() + + "/shell/svclogic.sh get-source " + + _module + " " + + rpc + " " + + mode + " " + + version + " " + + process.env.SDNC_CONFIG_DIR + "/svclogic.properties." + currentDB; + + console.log("commandToExec:" + commandToExec); + + child = exec(commandToExec , {maxBuffer: 1024*5000}, function (error,stdout,stderr){ + if(error){ + console.error("error:" + error); + dbRoutes.listSLA(req,res,{code:'failure',msg:error} ); + return; + } + //if(stderr){ + //logger.info("stderr:" + stderr); + //} + if(stdout){ + console.log("OUTPUT:" + stdout); + res.render('sla/printasxml', {result:{code:'success', + msg:'Module : ' + _module + '\n' + + 'RPC : ' + rpc + '\n' + + 'Mode : ' + mode + '\n' + + 'Version: ' + version + '\n\n' + stdout}, header:process.env.MAIN_MENU}); + } + + // remove the grave accents, the sax parser does not like them + //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close(); + //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res); + //dbRoutes.listSLA(req,res, resultObj); + }); + } catch(ex) { + console.error("error:" + ex); + dbRoutes.listSLA(req,res,{code:'failure',msg:ex} ); + } +}); + + +router.get('/printAsGv', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + try { + //dbRoutes.checkSvcLogic(req,res); + + var _module = req.query.module; + var rpc = req.query.rpc; + var version = req.query.version; + var mode = req.query.mode; + var currentDB = dbRoutes.getCurrentDB(); +console.log('currentDB='+currentDB); + + // call Dan's svclogic shell script from here + var commandToExec = process.cwd() + + "/shell/svclogic.sh print " + + _module + " " + + rpc + " " + + mode + " " + + version + " " + + process.env.SDNC_CONFIG_DIR + "/svclogic.properties." + currentDB + + " | dot -Tpng"; + + console.log("commandToExec:" + commandToExec); + + child = exec(commandToExec , + {encoding:'base64',maxBuffer:5000*1024}, function (error,stdout,stderr){ + if(error){ + console.error("error:" + error); + dbRoutes.listSLA(req,res,{code:'failure',msg:error} ); + return; + } + if(stderr){ + console.error("stderr:" + stderr); + } + if(stdout){ + //logger.info("OUTPUT:" + stdout); + //res.render('sla/printasgv', result = {code:'success', + //msg:new Buffer(stdout,'base64')} ); + res.render('sla/printasgv', {result:{code:'success', + module: _module, + rpc: rpc, + version: version, + mode:mode, + msg:stdout}, header:process.env.MAIN_MENU}); + } + + // remove the grave accents, the sax parser does not like them + //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close(); + //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res); + //dbRoutes.listSLA(req,res, resultObj); + }); + } catch(ex) { + console.error("error:" + ex); + dbRoutes.listSLA(req,res,{code:'failure',msg:ex} ); + } + +}); +module.exports = router; diff --git a/admportal/server/router/routes/user.js b/admportal/server/router/routes/user.js new file mode 100644 index 00000000..116bf932 --- /dev/null +++ b/admportal/server/router/routes/user.js @@ -0,0 +1,169 @@ +var express = require('express'); +var router = express.Router(); +var exec = require('child_process').exec; +var util = require('util'); +var fs = require('fs'); +var dbRoutes = require('./dbRoutes'); +var csp = require('./csp'); +var bodyParser = require('body-parser'); +var sax = require('sax'),strict=true,parser = sax.parser(strict); + +// SVC_LOGIC table columns +var _module=''; // cannot use module its a reserved word +var version=''; +var rpc=''; +var mode=''; +var xmlfile=''; + + +//router.use(bodyParser()); +router.use(bodyParser.urlencoded({ + extended: true +})); + + +// GET +router.get('/listUsers', csp.checkAuth, function(req,res) { + dbRoutes.listUsers(req,res, {user:req.session.loggedInAdmin,code:'', msg:''} ); +}); +router.get('/deleteUser', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.deleteUser(req,res, {code:'', msg:''} ); +}); + +//router.get('/activate', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + //var _module = req.query.module; + //var rpc = req.query.rpc; + //var version = req.query.version; + //var mode = req.query.mode; + + //dbRoutes.activate(req,res,_module,rpc,version,mode); +//}); + +//router.get('/deactivate', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + //var _module = req.query.module; + //var rpc = req.query.rpc; + //var version = req.query.version; + //var mode = req.query.mode; +// + //dbRoutes.deactivate(req,res,_module,rpc,version,mode); +//}); + +//router.get('/deleteDG', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + //var _module = req.query.module; + //var rpc = req.query.rpc; + //var version = req.query.version; + //var mode = req.query.mode; + + //dbRoutes.deleteDG(req,res,_module,rpc,version,mode); +//}); +/* +// SAX +parser.onerror = function (e) { + logger.debug('onerror'); + // an error happened. +}; +parser.ontext = function (t) { + // got some text. t is the string of text. + logger.debug('ontext:'+t); +}; +parser.onopentag = function (node) { + // opened a tag. node has "name" and "attributes" + if ( node.name == 'service-logic' ) + { + _module = node.attributes.module; + version = node.attributes.version; + } + if ( node.name == 'method' ) + { + rpc = node.attributes.rpc; + mode = node.attributes.mode; + } +}; +parser.onattribute = function (attr) { + // an attribute. attr has "name" and "value" + logger.debug('onattribute:'+attr); +}; +parser.onend = function () { + // parser stream is done, and ready to have more stuff written to it. + logger.debug('onend:'); +}; +*/ + + +// POST +router.post('/updateUser', csp.checkAuth, dbRoutes.checkDB, function(req,res,next){ + dbRoutes.updateUser(req,res,{code:'',msg:''}); +}); +router.post('/addUser', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.addUser(req,res, {code:'', msg:''} ); +}); + +//router.post('/upload', csp.checkAuth, dbRoutes.checkDB, function(req, res, next){ + +/* +logger.debug("upload"); + if(req.files.filename){ + if (req.files.filename.size == 0) { + resultObj = + {code:'danger', msg:'There was an error uploading the file, please try again.'}; + dbRoutes.listSLA(req,res, resultObj); + } + fs.exists(req.files.filename.path, function(exists) { + if(exists) { + resultObj = {code:'success', msg:'File sucessfully uploaded.'}; + + // parse xml + try { + var file_buf = fs.readFileSync(req.files.filename.path, "utf8"); +logger.debug('file '+req.files.filename); + + + // call Dan's svclogic shell script from here + var commandToExec = process.cwd() + + "/shell/svclogic.sh load " + + req.files.filename.path + " " + + process.cwd() + + "/config/svclogic.properties"; + + logger.debug("commandToExec:" + commandToExec); + child = exec(commandToExec ,function (error,stdout,stderr){ + if(error){ + logger.info("error:" + error); + } + if(stderr){ + logger.info("stderr:" + stderr); + } + if(stdout){ + logger.info("OUTPUT:" + stdout); + dbRoutes.listSLA(req,res, resultObj); + } + + // remove the grave accents, the sax parser does not like them + //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close(); + //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res); + //dbRoutes.listSLA(req,res, resultObj); + }); + } catch(ex) { + // keep 'em silent + logger.debug('sax error:'+ex); + } + + } else { + resultObj = + {code:'danger', msg:'There was an error uploading the file, please try again.'}; + dbRoutes.listSLA(req,res, resultObj); + } + }); + } + else { + resultObj = + {code:'danger', msg:'There was an error uploading the file, please try again.'}; + dbRoutes.listSLA(req,res, resultObj); + } +}); +*/ + +module.exports = router; diff --git a/admportal/server/router/routes/vnf.js b/admportal/server/router/routes/vnf.js new file mode 100644 index 00000000..be004fe2 --- /dev/null +++ b/admportal/server/router/routes/vnf.js @@ -0,0 +1,603 @@ +
+// Helper functions for processing a VNF worksheet
+
+var helpers = require('./helpers.js');
+var _ = require('lodash');
+var csvtojson = require('csvtojson');
+var async = require('async');
+var uuid = require('node-uuid'); // generate a uuid with "uuid.v1()"
+var path = require('path');
+var fs = require("fs");
+var moment = require("moment");
+
+var vnf = module.exports;
+var getParam = helpers.getParam;
+
+var callback;
+var indir;
+var csvGeneral, csvZones, csvNetworks, csvVMs, csvVMnetworks, csvVMnetworkIPs, csvVMnetworkMACs, csvTagValues;
+var rawJson={}
+var finalJson={};
+var platform;
+var req, res;
+var preloadVersion; // 1607, 1610, etc...
+
+puts = helpers.puts;
+putd = helpers.putd;
+
+vnf.go = function(lreq,lres,cb,dir){
+ puts("Processing VNF workbook");
+ req = lreq;
+ res = lres;
+ callback = cb;
+ if (dir!="") {
+ platform="pc";
+ indir=dir;
+ } else {
+ platform="portal";
+ indir=process.cwd() + "/uploads/";
+ }
+ doGeneral();
+}
+
+
+// READ WORKSHEET: GENERAL
+
+function doGeneral() {
+ puts("Reading General worksheet");
+ var csvFilename="General.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotGeneral);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotGeneral(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('General.csv file is missing from upload.');
+ return;
+ }
+ csvGeneral = jsonObj;
+ puts("\nRead this: ");
+ putd(csvGeneral);
+ puts("\n");
+ doAvailZones();
+}
+
+// READ WORKSHEET: AVAILABILITY ZONES
+
+function doAvailZones() {
+ puts("Reading Availability-zones worksheet");
+ var csvFilename="Availability-zones.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotAvailZones);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotAvailZones(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Availability-zones.csv file is missing from upload.');
+ return;
+ }
+ csvZones = jsonObj;
+ csvZones = _.reject(csvZones, 'field2', 'Availability Zones');
+ csvZones = _.reject(csvZones, 'field2', 'List the availability zones for this VNF');
+ csvZones = _.reject(csvZones, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvZones);
+ puts("\n");
+ doNetworks();
+}
+
+// READ WORKSHEET: NETWORKS
+
+function doNetworks() {
+ puts("Reading Networks worksheet");
+ var csvFilename="Networks.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotNetworks);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotNetworks(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Networks.csv file is missing from upload.');
+ return;
+ }
+ csvNetworks = jsonObj;
+ csvNetworks = _.reject(csvNetworks, 'field2', 'Networks');
+ csvNetworks = _.reject(csvNetworks, 'field2', 'List the VNF networks. (VM-networks are on a different worksheet.)');
+ csvNetworks = _.reject(csvNetworks, 'field2', 'network-role');
+ csvNetworks = _.reject(csvNetworks, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvNetworks);
+ puts("\n");
+ doVMs();
+}
+
+// READ WORKSHEET: VMs
+
+function doVMs() {
+ puts("Reading VMs worksheet");
+ var csvFilename="VMs.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVMs);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVMs(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VMs.csv file is missing from upload.');
+ return;
+ }
+ csvVMs = jsonObj;
+ csvVMs = _.reject(csvVMs, 'field2', 'VMs');
+ csvVMs = _.reject(csvVMs, 'field2', 'List the VM types for this VNF');
+ csvVMs = _.reject(csvVMs, 'field2', 'vm-type');
+ csvVMs = _.reject(csvVMs, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvVMs);
+ puts("\n");
+ doVMnetworks();
+}
+
+// READ WORKSHEET: VM-NETWORKS
+
+function doVMnetworks() {
+ puts("Reading VM-networks worksheet");
+ var csvFilename="VM-networks.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVMnetworks);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVMnetworks(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VM-networks.csv file is missing from upload.');
+ return;
+ }
+ csvVMnetworks = jsonObj;
+ csvVMnetworks = _.reject(csvVMnetworks, 'field2', 'VM-networks');
+ csvVMnetworks = _.reject(csvVMnetworks, 'field2', 'List the VM-networks for each VM type');
+ csvVMnetworks = _.reject(csvVMnetworks, 'field2', 'vm-type');
+ csvVMnetworks = _.reject(csvVMnetworks, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvVMnetworks);
+ puts("\n");
+ doVMnetworkIPs();
+}
+
+// READ WORKSHEET: VM-NETWORK-IPS
+
+function doVMnetworkIPs() {
+ puts("Reading VM-network-IPs worksheet");
+ var csvFilename="VM-network-IPs.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVMnetworkIPs);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVMnetworkIPs(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VM-network-IPs.csv file is missing from upload.');
+ return;
+ }
+ csvVMnetworkIPs = jsonObj;
+ csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', 'VM-network-IPs');
+ csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', 'List the IPs assigned to each VM-network');
+ csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', 'vm-type');
+ csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvVMnetworkIPs);
+ puts("\n");
+ doVMnetworkMACs();
+}
+
+// READ WORKSHEET: VM-NETWORK-MACS
+
+function doVMnetworkMACs() {
+ puts("Reading VM-network-MACs worksheet");
+ var csvFilename="VM-network-MACs.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVMnetworkMACs);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVMnetworkMACs(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VM-network-MACs.csv file is missing from upload.');
+ return;
+ }
+ csvVMnetworkMACs = jsonObj;
+ csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', 'VM-network-MACs');
+ csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', 'List the MACs assigned to each VM-network');
+ csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', 'vm-type');
+ csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvVMnetworkMACs);
+ puts("\n");
+ doTagValues();
+}
+
+// READ WORKSHEET: TAG-VALUES
+
+function doTagValues() {
+ puts("Reading Tag-values worksheet");
+ var csvFilename="Tag-values.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotTagValues);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotTagValues(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Tag-values.csv file is missing from upload.');
+ return;
+ }
+ csvTagValues = jsonObj;
+ csvTagValues = _.reject(csvTagValues, 'field2', 'Tag-values');
+ csvTagValues = _.reject(csvTagValues, 'field2', 'Extra data to be passed into the HEAT template for this VNF');
+ csvTagValues = _.reject(csvTagValues, 'field2', 'vnf-parameter-name');
+ csvTagValues = _.reject(csvTagValues, 'field2', 'vnf-parameter-value');
+ csvTagValues = _.reject(csvTagValues, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvTagValues);
+ puts("\n");
+ doneReadingFiles();
+}
+
+
+
+
+function doneReadingFiles() {
+ puts("\n");
+ puts("DONE READING FILES!");
+ puts("\n");
+ processJson();
+}
+
+
+// PROCESS THE CSV FILES INTO OBJECTS TO BE ASSEMBLED INTO FINAL OUTPUT
+function processJson() {
+ processGeneral();
+ processAvailZones();
+ processNetworks();
+ processVMnetworks();
+ processVMnetips();
+ processVMnetmacs();
+ processVMs();
+ processTagValues();
+ assembleJson();
+}
+
+// ASSEMBLE AND OUTPUT RESULTS
+
+function assembleJson() {
+ puts("\n");
+ puts("Using raw JSON and assembling final ouptut JSON.");
+ puts("\n");
+
+ vnfTopoID = { "service-type": "SDN-MOBILITY",
+ "vnf-name": rawJson['vf-module-name'],
+ "vnf-type": rawJson['vf-module-model-name'],
+ "generic-vnf-name": rawJson['generic-vnf-name'],
+ "generic-vnf-type": rawJson['generic-vnf-type'] };
+
+ vnfZones = rawJson['availability-zones'];
+
+ vnfNetworks = rawJson['networks'];
+
+ vnfVMs = rawJson['vms'];
+
+ vnfParams = rawJson['tag-values'];
+
+ vnfAssignments = { "availability-zones": vnfZones,
+ "vnf-networks": vnfNetworks,
+ "vnf-vms": vnfVMs};
+
+ vnfTopo = { "vnf-topology-identifier": vnfTopoID,
+ "vnf-assignments": vnfAssignments,
+ "vnf-parameters": vnfParams };
+
+ vnfInput = {'vnf-topology-information': vnfTopo};
+
+ finalJson = {"input": vnfInput};
+
+ outputJson();
+}
+
+function outputJson() {
+ puts("\n");
+ puts("\n");
+ puts(JSON.stringify(finalJson,null,2));
+ puts("\n");
+ puts("\n");
+ var unixTime, fullpath_filename, filename;
+ unixTime = moment().unix();
+ if (platform=='portal') {
+ fullpath_filename = process.cwd() + "/uploads/" + unixTime + ".vnf_worksheet.json";
+ filename = unixTime + ".vnf_worksheet.json.";
+ } else {
+ fullpath_filename = "./output.json."+unixTime;
+ filename = "output.json." + unixTime;
+ }
+ helpers.writeOutput(req, fullpath_filename, JSON.stringify(finalJson,null,2), callback);
+ callback(null, finalJson, filename);
+}
+
+
+// Gather functions that actually process data after it is all read
+
+function processGeneral() {
+
+ preloadVersion = getParam(csvGeneral, 'field2', 'preload-version', 'field3');
+ rawJson['preload-version'] = preloadVersion;
+ puts("Preload version: " + preloadVersion);
+
+ if ( (preloadVersion!='1607') && (preloadVersion!='1610') ) {
+ puts("\nError - incorrect version of preload worksheet.");
+ callback('Error - incorrect version of preload worksheet.');
+ }
+
+ rawJson['vf-module-name'] = getParam(csvGeneral, 'field2', 'vf-module-name', 'field3');
+ // rawJson['vf-module-type'] = getParam(csvGeneral, 'field2', 'vf-module-type', 'field3');
+ try {
+ rawJson['vf-module-model-name'] = getParam(csvGeneral, 'field2', 'vf-module-model-name', 'field3');
+ } catch (e) {
+ puts("\n\n");
+ puts("ERROR ERROR ERROR ERROR ERROR\n");
+ puts("Failed to find data field 'vf-module-model-name'. Maybe this preload worksheet is older?")
+ puts("If on the 'general' tab there is a field called 'vf-module-type' please rename it to 'vf-module-model-name'");
+ puts("\n\n");
+ process.exit();
+ }
+ rawJson['generic-vnf-name'] = getParam(csvGeneral, 'field2', 'vnf-name', 'field3');
+ rawJson['generic-vnf-type'] = getParam(csvGeneral, 'field2', 'vnf-type', 'field3');
+ rawJson['request-id'] = uuid.v1();
+ rawJson['source'] = "ADMINPORTAL";
+ rawJson['request-action'] = "PreloadVNFRequest";
+ rawJson['svc-request-id'] = uuid.v1();
+ rawJson['svc-action'] = "reserve";
+ puts('rawJson:');
+ putd(rawJson);
+ puts("\n");
+}
+
+function processAvailZones() {
+ var newZones = _.map(csvZones, function(x) { return {'availability-zone': x['field2']}; } );
+ rawJson['availability-zones'] = newZones;
+ puts("Availability zones read:");
+ putd(rawJson['availability-zones']);
+ puts("\n");
+}
+
+function processNetworks() {
+ var newNetworks = [];
+ csvNetworks.forEach( function(network) {
+ var netJson = {};
+ netJson["network-role"] = network.field2;
+ netJson["network-name"] = network.field3;
+ netJson["network-id"] = network.field4;
+ netJson["contrail-network-fqdn"] = network.field5;
+ netJson["subnet-name"] = network.field6;
+ netJson["subnet-id"] = network.field7;
+ netJson["ipv6-subnet-name"] = network.field8;
+ netJson["ipv6-subnet-id"] = network.field9;
+ newNetworks.push(netJson);
+ }
+ );
+ puts("networks:");
+ putd(newNetworks);
+ rawJson["networks"] = newNetworks;
+}
+
+function processVMs() {
+ var newVMs = [];
+ csvVMs.forEach( function(vm) {
+ var vmJson = {};
+ vmJson["vm-type"] = vm.field2;
+ vmJson["vm-name"] = vm.field3;
+ newVMs.push(vmJson);
+ }
+ );
+
+ puts("VMs:");
+ putd(newVMs);
+
+ // OK, now for each type, get count and then build vm-names array of the names
+ var vnfvms=[]
+ vmTypes = _.uniq(_.pluck(newVMs,'vm-type'));
+ vmTypes.forEach( function(vmType) {
+ puts(vmType);
+ var vmJson={};
+ var vmThisType;
+ var vmCount;
+ var vmNames=[];
+ var tmpNames;
+ vmThisType=_.select(newVMs, 'vm-type', vmType);
+ vmCount=vmThisType.length;
+ vmJson["vm-type"] = vmType;
+ vmJson["vm-count"] = vmCount;
+ tmpNames = _.pluck(vmThisType,'vm-name');
+ vmJson["vm-names"] = _.map(tmpNames, function(nam) { return {"vm-name": nam}; } );
+ netroles = _.select( rawJson["vm-networks"], "vm-type", vmType );
+ newnetroles=[]
+ netroles.forEach( function(netrole) {
+ tmpNetDetails = {};
+ tmpNetDetails["network-role"] = netrole["network-role"];
+ tmpNetDetails["use-dhcp"] = netrole["use-dhcp"];
+
+ var tmpipsThisVmType=[];
+ tmpipsThisVmType = _.select( rawJson["vm-net-ips"], "vm-type", vmType);
+ var tmpips=[];
+ tmpips = _.select( tmpipsThisVmType, "network-role", netrole["network-role"]);
+ tmpipsJson = _.map(tmpips, function(ip) { return {"ip-address": ip["ip-address"]} } );
+ tmpipsJson = _.reject(tmpipsJson, function(o) { return (o["ip-address"]==undefined); } );
+ tmpNetDetails["network-ips"] = tmpipsJson;
+
+ var tmpipsv6ThisVmType=[];
+ tmpipsv6ThisVmType = _.select( rawJson["vm-net-ips"], "vm-type", vmType);
+ var tmpipsv6=[];
+ tmpipsv6 = _.select( tmpipsv6ThisVmType, "network-role", netrole["network-role"]);
+ tmpipsv6Json = _.map(tmpipsv6, function(ip) { return {"ip-address-ipv6": ip["ipv6-address"]} } );
+ tmpipsv6Json = _.reject(tmpipsv6Json, function(o) { return (o["ip-address-ipv6"]==undefined); } );
+ tmpNetDetails["network-ips-v6"] = tmpipsv6Json;
+
+ var tmpirpThisVmType=[];
+ tmpirpThisVmType = _.select( rawJson["vm-net-ips"], "vm-type", vmType);
+ var tmpirp=[];
+ tmpirp = _.select( tmpirpThisVmType, "network-role", netrole["network-role"]);
+ tmpirpJson = _.map(tmpirp, function(irp) { return {"interface-route-prefix-cidr": irp["interface-route-prefix"]} } );
+ tmpirpJson = _.reject(tmpirpJson, function(o) { return (o["interface-route-prefix-cidr"]==undefined); } );
+ tmpNetDetails["interface-route-prefixes"] = tmpirpJson;
+
+ var tmpmacsThisVmType=[];
+ tmpmacsThisVmType = _.select( rawJson["vm-net-macs"], "vm-type", vmType);
+ var tmpmacs=[];
+ tmpmacs = _.select( tmpmacsThisVmType, "network-role", netrole["network-role"]);
+ tmpmacsJson = _.map(tmpmacs, function(mac) { return {"mac-address": mac["mac-address"]} } );
+ tmpNetDetails["network-macs"] = tmpmacsJson;
+
+ var fip='';
+ fip = netrole["floating-ip"];
+ fip = _.trim(fip);
+ if (fip != '') {
+ tmpNetDetails["floating-ip"] = netrole["floating-ip"];
+ }
+
+ var fipv6='';
+ fipv6 = netrole["floating-ip-v6"];
+ fipv6 = _.trim(fipv6);
+ if (fipv6 != '') {
+ tmpNetDetails["floating-ip-v6"] = netrole["floating-ip-v6"];
+ }
+
+ newnetroles.push(tmpNetDetails);
+ }
+ );
+ vmJson["vm-networks"] = newnetroles;
+ putd(vmJson);
+ vnfvms.push(vmJson);
+ }
+ );
+ rawJson["vms"] = vnfvms;
+}
+
+function processVMnetworks() {
+ // For each VM type, for each Network role, get details like use-dhcp
+ var newVMnetworks = [];
+ csvVMnetworks.forEach( function(vm) {
+ var newvmJson = {};
+ newvmJson["vm-type"] = vm.field2;
+ newvmJson["network-role"] = vm.field3;
+ newvmJson["use-dhcp"] = vm.field4;
+ newvmJson["floating-ip"] = vm.field5;
+ newvmJson["floating-ip-v6"] = vm.field6;
+ newVMnetworks.push(newvmJson);
+ }
+ );
+ rawJson["vm-networks"] = newVMnetworks;
+ puts("rawJson for vm-networks...");
+ putd( rawJson["vm-networks"] );
+}
+
+
+function processVMnetips() {
+ // For each VM type, for each network role, get the set of network IPs
+ puts("Processing VM-net-ips");
+ var newVMnetips = [];
+ csvVMnetworkIPs.forEach( function(vm) {
+ var newvmnetipsJson = {};
+ newvmnetipsJson["vm-type"] = vm.field2;
+ newvmnetipsJson["network-role"] = vm.field3;
+ if (_.trim(vm.field4)!="") {
+ newvmnetipsJson["ip-address"] = vm.field4;
+ }
+ if (_.trim(vm.field5)!="") {
+ newvmnetipsJson["ipv6-address"] = vm.field5;
+ }
+ if (_.trim(vm.field6)!="") {
+ newvmnetipsJson["interface-route-prefix"] = vm.field6;
+ }
+ newVMnetips.push(newvmnetipsJson);
+ }
+ );
+ rawJson["vm-net-ips"] = newVMnetips;
+ puts("rawJson for vm-net-ips");
+ putd(rawJson["vm-net-ips"]);
+}
+
+function processVMnetmacs() {
+ // For each VM type, for each network role, get the set of MACs
+ puts("Processing VM-net-macs");
+ var newVMnetmacs = [];
+ csvVMnetworkMACs.forEach( function(vm) {
+ var newvmnetmacsJson = {};
+ newvmnetmacsJson["vm-type"] = vm.field2;
+ newvmnetmacsJson["network-role"] = vm.field3;
+ newvmnetmacsJson["mac-address"] = vm.field4;
+ newVMnetmacs.push(newvmnetmacsJson);
+ }
+ );
+ rawJson["vm-net-macs"] = newVMnetmacs;
+ puts("rawJson for vm-net-macs");
+ putd(rawJson["vm-net-macs"]);
+}
+
+function processTagValues() {
+ var newTagValues = _.map(csvTagValues, function(x) { return {'vnf-parameter-name': x['field2'],
+ 'vnf-parameter-value': x['field3']}; } );
+ rawJson['tag-values'] = newTagValues;
+ puts("Tag-values read:");
+ putd(rawJson['tag-values']);
+ puts("\n");
+}
+
+
diff --git a/admportal/shell/getAdmPortalProp.py b/admportal/shell/getAdmPortalProp.py new file mode 100755 index 00000000..2e0ea797 --- /dev/null +++ b/admportal/shell/getAdmPortalProp.py @@ -0,0 +1,13 @@ +#!/usr/bin/python + +import json +import sys +import os + +propfile = os.getenv('SDNC_CONFIG_DIR') + '/admportal.json' + +from pprint import pprint + +with open(propfile) as data_file: + data = json.load(data_file) +pprint( str(data[sys.argv[1]])) diff --git a/admportal/shell/start.sh b/admportal/shell/start.sh new file mode 100755 index 00000000..d8cb0fcd --- /dev/null +++ b/admportal/shell/start.sh @@ -0,0 +1,11 @@ +#. ./set-http-env.sh +#cd ../bin +#cp ../config/config.json.http ../config/config.json +. /etc/attappl.env +. ${PROJECT_HOME}/etc/default.env + +MAIN_MENU=`python printMainMenu.py | sed -e 's|['\'']||g'` +export MAIN_MENU + +cd .. +pm2 startOrRestart process.http.json diff --git a/admportal/shell/start_netdb.sh b/admportal/shell/start_netdb.sh new file mode 100755 index 00000000..4a3d75ac --- /dev/null +++ b/admportal/shell/start_netdb.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +. /etc/attappl.env +. ${PROJECT_HOME}/etc/default.env +. ${PROJECT_HOME}/siteconfig/siteconf.info + +# only run on primary adm vm +# ${Rank} comes from siteconf.info +if [ ${Rank} == '1' ]; then + cd /opt/admportal/server + node ./netdb_updater.js -t ${1} -d ${2} >/dev/null 2>&1 +fi diff --git a/admportal/shell/start_portal.sh b/admportal/shell/start_portal.sh new file mode 100755 index 00000000..976502cd --- /dev/null +++ b/admportal/shell/start_portal.sh @@ -0,0 +1,32 @@ +#. ./set-https-env.sh +#cd ../bin +#cp ../config/config.json.https ../config/config.json +export PROJECT_HOME=/opt/openecomp/sdnc +export PROJECT_RUNTIME_BASE=/opt/openecomp/sdnc +#export JAVA_HOME=/usr/lib/jvm/java-7-oracle +export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 +export SSL_ENABLED=false +export SDNC_CONFIG_DIR=${PROJECT_HOME}/data/properties +export NODE_ENV=production +export CLASSPATH=$PROJECT_HOME/admportal/lib:$CLASSPATH + +PATH=${PATH}:${JAVA_HOME}/bin + +#. ${PROJECT_HOME}/etc/default.env + +MAIN_MENU=`python $PROJECT_HOME/admportal/shell/getAdmPortalProp.py MainMenu | sed -e 's|['\'']||g'` +export MAIN_MENU +SSL_ENABLED=`python $PROJECT_HOME/admportal/shell/getAdmPortalProp.py sslEnabled | sed -e 's|['\'']||g'` +export SSL_ENABLED + +if [ ! -d /opt/openecomp/sdnc/admportal/node_modules ]; then + cd /opt/openecomp/sdnc/admportal && npm install +fi + +cd /opt/openecomp/sdnc/admportal +node shell/www +#if [ "true" == "${SSL_ENABLED}" ]; then + #pm2 startOrRestart process.https.json +#else + #pm2 startOrRestart process.http.json +#fi diff --git a/admportal/shell/startssl.sh b/admportal/shell/startssl.sh new file mode 100755 index 00000000..a56570e3 --- /dev/null +++ b/admportal/shell/startssl.sh @@ -0,0 +1,28 @@ +#. ./set-https-env.sh +#cd ../bin +#cp ../config/config.json.https ../config/config.json +export PROJECT_HOME=/opt/openecomp/sdnc +export PROJECT_RUNTIME_BASE=/opt/openecomp/sdnc +#export JAVA_HOME=/usr/lib/jvm/java-7-oracle +export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 +export SSL_ENABLED=false +export SDNC_CONFIG_DIR=${PROJECT_HOME}/data/properties +export NODE_ENV=production +export CLASSPATH=$PROJECT_HOME/admportal/lib:$CLASSPATH + +PATH=${PATH}:${JAVA_HOME}/bin + +#. ${PROJECT_HOME}/etc/default.env + +MAIN_MENU=`python $PROJECT_HOME/admportal/shell/getAdmPortalProp.py MainMenu | sed -e 's|['\'']||g'` +export MAIN_MENU +SSL_ENABLED=`python $PROJECT_HOME/admportal/shell/getAdmPortalProp.py sslEnabled | sed -e 's|['\'']||g'` +export SSL_ENABLED + +cd .. +node bin/www +#if [ "true" == "${SSL_ENABLED}" ]; then + #pm2 startOrRestart process.https.json +#else + #pm2 startOrRestart process.http.json +#fi diff --git a/admportal/shell/stop.sh b/admportal/shell/stop.sh new file mode 100644 index 00000000..404c2fbd --- /dev/null +++ b/admportal/shell/stop.sh @@ -0,0 +1,2 @@ +pm2 stop http_admportal +pm2 kill diff --git a/admportal/shell/stopssl.sh b/admportal/shell/stopssl.sh new file mode 100755 index 00000000..a71de61e --- /dev/null +++ b/admportal/shell/stopssl.sh @@ -0,0 +1,13 @@ +. /etc/attappl.env +. ${PROJECT_HOME}/etc/default.env + +SSL_ENABLED=`python /opt/admportal/shell/getAdmPortalProp.py sslEnabled | sed -e 's|['\'']||g'` +export SSL_ENABLED + +cd .. +if [ "true" == "${SSL_ENABLED}" ]; then + pm2 stop admportal8443 +else + pm2 stop http_admportal +fi +pm2 kill diff --git a/admportal/shell/svclogic.sh b/admportal/shell/svclogic.sh new file mode 100644 index 00000000..aca6bf1f --- /dev/null +++ b/admportal/shell/svclogic.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property. All rights +# reserved. +# ================================================================================ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============LICENSE_END========================================================= +### + +BASEDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )" +JARDIR=${BASEDIR}/lib + +for jar in $JARDIR/*.jar +do + CLASSPATH=$CLASSPATH:${jar} +done + +java -cp ${CLASSPATH}:${MYSQL_JDBC_DRIVER} org.openecomp.sdnc.sli.SvcLogicParser $* diff --git a/admportal/shell/www b/admportal/shell/www new file mode 100755 index 00000000..29710dbb --- /dev/null +++ b/admportal/shell/www @@ -0,0 +1,14 @@ +#!/usr/bin/env node +var debug = require('debug')('admportal'); +var app = require('../server/app'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); +var out_file = "/opt/openecomp/sdnc/admportal/logs/http_admportal.log"; +var error_file = "/opt/openecomp/sdnc/admportal/logs/error_http_admportal.log"; +var cwd = "/opt/openecomp/sdnc/admportal"; + +app.set('port', properties.nonSslPort || 8181 ); + +var server = app.listen(app.get('port'), function() { + console.log('Express server listening on port ' + server.address().port); + debug('Express server listening on port ' + server.address().port); +}); diff --git a/admportal/src/assembly/assemble_zip.xml b/admportal/src/assembly/assemble_zip.xml new file mode 100644 index 00000000..46763c81 --- /dev/null +++ b/admportal/src/assembly/assemble_zip.xml @@ -0,0 +1,101 @@ +<!-- + ============LICENSE_START======================================================= + openECOMP : SDN-C + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property. All rights + reserved. + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ============LICENSE_END========================================================= + --> + +<!-- Defines how we build the .zip file which is our distribution. --> + +<assembly + xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> + <formats> + <format>zip</format> + </formats> + + <includeBaseDirectory>false</includeBaseDirectory> + + <fileSets> + <fileSet> + <directory>bin</directory> + <outputDirectory>admportal/bin</outputDirectory> + </fileSet> + <fileSet> + <directory>certs</directory> + <outputDirectory>admportal/certs</outputDirectory> + </fileSet> + <fileSet> + <directory>config</directory> + <outputDirectory>admportal/config</outputDirectory> + </fileSet> + <fileSet> + <directory>lib</directory> + <outputDirectory>admportal/lib</outputDirectory> + </fileSet> + <fileSet> + <directory>node_modules</directory> + <outputDirectory>admportal/node_modules</outputDirectory> + </fileSet> + <fileSet> + <directory>public</directory> + <outputDirectory>admportal/public</outputDirectory> + </fileSet> + <fileSet> + <directory>routes</directory> + <outputDirectory>admportal/routes</outputDirectory> + </fileSet> + <fileSet> + <directory>server</directory> + <outputDirectory>admportal/server</outputDirectory> + </fileSet> + <fileSet> + <directory>shell</directory> + <outputDirectory>admportal/shell</outputDirectory> + </fileSet> + <fileSet> + <directory>uploads</directory> + <outputDirectory>admportal/uploads</outputDirectory> + </fileSet> + <fileSet> + <directory>test</directory> + <outputDirectory>admportal/test</outputDirectory> + </fileSet> + <fileSet> + <directory>views</directory> + <outputDirectory>admportal/views</outputDirectory> + </fileSet> + <fileSet> + <directory>.</directory> + <outputDirectory>admportal/</outputDirectory> + <includes> + <include>*.json</include> + <include>README</include> + </includes> + </fileSet> + <fileSet> + <directory>target/lib</directory> + <outputDirectory>admportal/lib</outputDirectory> + <includes> + <include>*.jar</include> + </includes> + </fileSet> + </fileSets> + + +</assembly> diff --git a/admportal/src/main/swm/deinstall/postproc/post_proc b/admportal/src/main/swm/deinstall/postproc/post_proc new file mode 100644 index 00000000..09e4ca85 --- /dev/null +++ b/admportal/src/main/swm/deinstall/postproc/post_proc @@ -0,0 +1,4 @@ +#!/bin/sh + +exit 0; + diff --git a/admportal/src/main/swm/deinstall/preproc/pre_proc b/admportal/src/main/swm/deinstall/preproc/pre_proc new file mode 100644 index 00000000..09e4ca85 --- /dev/null +++ b/admportal/src/main/swm/deinstall/preproc/pre_proc @@ -0,0 +1,4 @@ +#!/bin/sh + +exit 0; + diff --git a/admportal/src/main/swm/fallback/postproc/post_proc b/admportal/src/main/swm/fallback/postproc/post_proc new file mode 100644 index 00000000..09e4ca85 --- /dev/null +++ b/admportal/src/main/swm/fallback/postproc/post_proc @@ -0,0 +1,4 @@ +#!/bin/sh + +exit 0; + diff --git a/admportal/src/main/swm/fallback/preproc/pre_proc b/admportal/src/main/swm/fallback/preproc/pre_proc new file mode 100644 index 00000000..09e4ca85 --- /dev/null +++ b/admportal/src/main/swm/fallback/preproc/pre_proc @@ -0,0 +1,4 @@ +#!/bin/sh + +exit 0; + diff --git a/admportal/src/main/swm/initinst/postproc/post_proc b/admportal/src/main/swm/initinst/postproc/post_proc new file mode 100644 index 00000000..09e4ca85 --- /dev/null +++ b/admportal/src/main/swm/initinst/postproc/post_proc @@ -0,0 +1,4 @@ +#!/bin/sh + +exit 0; + diff --git a/admportal/src/main/swm/initinst/preproc/pre_proc b/admportal/src/main/swm/initinst/preproc/pre_proc new file mode 100644 index 00000000..09e4ca85 --- /dev/null +++ b/admportal/src/main/swm/initinst/preproc/pre_proc @@ -0,0 +1,4 @@ +#!/bin/sh + +exit 0; + diff --git a/admportal/src/main/swm/install/postproc/post_proc b/admportal/src/main/swm/install/postproc/post_proc new file mode 100644 index 00000000..09e4ca85 --- /dev/null +++ b/admportal/src/main/swm/install/postproc/post_proc @@ -0,0 +1,4 @@ +#!/bin/sh + +exit 0; + diff --git a/admportal/src/main/swm/install/preproc/pre_proc b/admportal/src/main/swm/install/preproc/pre_proc new file mode 100644 index 00000000..a8f5979a --- /dev/null +++ b/admportal/src/main/swm/install/preproc/pre_proc @@ -0,0 +1,3 @@ +#!/bin/sh + +exit 0; diff --git a/admportal/src/main/swm/notes.txt b/admportal/src/main/swm/notes.txt new file mode 100644 index 00000000..7fd88fbd --- /dev/null +++ b/admportal/src/main/swm/notes.txt @@ -0,0 +1,3 @@ +${groupId} ${artifactId} ${project.version}-${build.number} +${SWM_VERSION} + diff --git a/admportal/test/YYYYMMDDHH_ctag_pool.csv b/admportal/test/YYYYMMDDHH_ctag_pool.csv new file mode 100644 index 00000000..80102f78 --- /dev/null +++ b/admportal/test/YYYYMMDDHH_ctag_pool.csv @@ -0,0 +1,1501 @@ +#vlan_id,aic_site_id,azone,vplspe,purpose +2001,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2002,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2003,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2004,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2005,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2006,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2007,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2008,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2009,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2010,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2011,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2012,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2013,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2014,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2015,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2016,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2017,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2018,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2019,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2020,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2021,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2022,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2023,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2024,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2025,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2026,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2027,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2028,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2029,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2030,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2031,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2032,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2033,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2034,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2035,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2036,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2037,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2038,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2039,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2040,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2041,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2042,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2043,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2044,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2045,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2046,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2047,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2048,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2049,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2050,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2051,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2052,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2053,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2054,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2055,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2056,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2057,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2058,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2059,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2060,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2061,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2062,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2063,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2064,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2065,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2066,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2067,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2068,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2069,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2070,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2071,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2072,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2073,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2074,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2075,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2076,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2077,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2078,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2079,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2080,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2081,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2082,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2083,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2084,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2085,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2086,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2087,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2088,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2089,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2090,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2091,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2092,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2093,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2094,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2095,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2096,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2097,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2098,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2099,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2100,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2101,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2102,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2103,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2104,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2105,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2106,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2107,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2108,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2109,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2110,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2111,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2112,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2113,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2114,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2115,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2116,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2117,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2118,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2119,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2120,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2121,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2122,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2123,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2124,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2125,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2126,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2127,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2128,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2129,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2130,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2131,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2132,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2133,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2134,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2135,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2136,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2137,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2138,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2139,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2140,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2141,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2142,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2143,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2144,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2145,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2146,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2147,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2148,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2149,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2150,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2151,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2152,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2153,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2154,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2155,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2156,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2157,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2158,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2159,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2160,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2161,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2162,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2163,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2164,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2165,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2166,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2167,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2168,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2169,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2170,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2171,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2172,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2173,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2174,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2175,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2176,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2177,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2178,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2179,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2180,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2181,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2182,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2183,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2184,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2185,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2186,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2187,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2188,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2189,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2190,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2191,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2192,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2193,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2194,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2195,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2196,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2197,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2198,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2199,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2200,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2201,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2202,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2203,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2204,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2205,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2206,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2207,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2208,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2209,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2210,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2211,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2212,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2213,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2214,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2215,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2216,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2217,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2218,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2219,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2220,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2221,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2222,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2223,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2224,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2225,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2226,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2227,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2228,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2229,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2230,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2231,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2232,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2233,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2234,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2235,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2236,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2237,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2238,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2239,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2240,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2241,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2242,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2243,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2244,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2245,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2246,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2247,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2248,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2249,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2250,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2251,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2252,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2253,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2254,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2255,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2256,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2257,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2258,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2259,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2260,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2261,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2262,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2263,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2264,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2265,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2266,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2267,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2268,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2269,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2270,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2271,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2272,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2273,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2274,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2275,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2276,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2277,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2278,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2279,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2280,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2281,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2282,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2283,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2284,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2285,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2286,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2287,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2288,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2289,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2290,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2291,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2292,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2293,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2294,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2295,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2296,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2297,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2298,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2299,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2300,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2301,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2302,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2303,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2304,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2305,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2306,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2307,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2308,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2309,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2310,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2311,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2312,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2313,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2314,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2315,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2316,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2317,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2318,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2319,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2320,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2321,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2322,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2323,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2324,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2325,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2326,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2327,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2328,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2329,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2330,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2331,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2332,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2333,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2334,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2335,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2336,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2337,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2338,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2339,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2340,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2341,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2342,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2343,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2344,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2345,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2346,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2347,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2348,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2349,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2350,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2351,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2352,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2353,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2354,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2355,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2356,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2357,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2358,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2359,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2360,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2361,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2362,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2363,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2364,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2365,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2366,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2367,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2368,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2369,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2370,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2371,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2372,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2373,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2374,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2375,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2376,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2377,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2378,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2379,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2380,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2381,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2382,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2383,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2384,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2385,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2386,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2387,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2388,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2389,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2390,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2391,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2392,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2393,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2394,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2395,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2396,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2397,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2398,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2399,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2400,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2401,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2402,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2403,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2404,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2405,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2406,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2407,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2408,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2409,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2410,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2411,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2412,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2413,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2414,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2415,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2416,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2417,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2418,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2419,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2420,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2421,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2422,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2423,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2424,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2425,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2426,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2427,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2428,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2429,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2430,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2431,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2432,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2433,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2434,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2435,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2436,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2437,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2438,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2439,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2440,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2441,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2442,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2443,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2444,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2445,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2446,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2447,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2448,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2449,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2450,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2451,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2452,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2453,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2454,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2455,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2456,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2457,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2458,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2459,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2460,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2461,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2462,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2463,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2464,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2465,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2466,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2467,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2468,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2469,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2470,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2471,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2472,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2473,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2474,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2475,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2476,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2477,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2478,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2479,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2480,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2481,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2482,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2483,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2484,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2485,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2486,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2487,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2488,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2489,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2490,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2491,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2492,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2493,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2494,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2495,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2496,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2497,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2498,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2499,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2500,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2501,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2502,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2503,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2504,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2505,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2506,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2507,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2508,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2509,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2510,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2511,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2512,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2513,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2514,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2515,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2516,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2517,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2518,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2519,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2520,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2521,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2522,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2523,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2524,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2525,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2526,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2527,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2528,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2529,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2530,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2531,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2532,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2533,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2534,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2535,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2536,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2537,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2538,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2539,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2540,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2541,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2542,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2543,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2544,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2545,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2546,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2547,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2548,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2549,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2550,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2551,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2552,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2553,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2554,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2555,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2556,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2557,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2558,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2559,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2560,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2561,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2562,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2563,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2564,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2565,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2566,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2567,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2568,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2569,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2570,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2571,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2572,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2573,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2574,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2575,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2576,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2577,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2578,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2579,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2580,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2581,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2582,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2583,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2584,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2585,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2586,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2587,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2588,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2589,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2590,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2591,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2592,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2593,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2594,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2595,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2596,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2597,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2598,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2599,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2600,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2601,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2602,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2603,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2604,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2605,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2606,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2607,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2608,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2609,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2610,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2611,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2612,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2613,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2614,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2615,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2616,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2617,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2618,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2619,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2620,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2621,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2622,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2623,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2624,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2625,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2626,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2627,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2628,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2629,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2630,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2631,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2632,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2633,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2634,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2635,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2636,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2637,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2638,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2639,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2640,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2641,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2642,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2643,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2644,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2645,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2646,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2647,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2648,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2649,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2650,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2651,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2652,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2653,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2654,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2655,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2656,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2657,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2658,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2659,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2660,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2661,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2662,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2663,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2664,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2665,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2666,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2667,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2668,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2669,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2670,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2671,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2672,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2673,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2674,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2675,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2676,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2677,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2678,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2679,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2680,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2681,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2682,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2683,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2684,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2685,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2686,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2687,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2688,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2689,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2690,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2691,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2692,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2693,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2694,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2695,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2696,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2697,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2698,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2699,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2700,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2701,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2702,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2703,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2704,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2705,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2706,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2707,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2708,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2709,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2710,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2711,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2712,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2713,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2714,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2715,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2716,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2717,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2718,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2719,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2720,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2721,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2722,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2723,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2724,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2725,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2726,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2727,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2728,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2729,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2730,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2731,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2732,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2733,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2734,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2735,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2736,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2737,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2738,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2739,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2740,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2741,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2742,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2743,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2744,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2745,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2746,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2747,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2748,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2749,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2750,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2751,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2752,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2753,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2754,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2755,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2756,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2757,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2758,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2759,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2760,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2761,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2762,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2763,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2764,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2765,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2766,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2767,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2768,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2769,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2770,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2771,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2772,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2773,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2774,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2775,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2776,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2777,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2778,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2779,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2780,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2781,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2782,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2783,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2784,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2785,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2786,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2787,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2788,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2789,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2790,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2791,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2792,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2793,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2794,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2795,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2796,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2797,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2798,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2799,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2800,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2801,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2802,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2803,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2804,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2805,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2806,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2807,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2808,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2809,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2810,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2811,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2812,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2813,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2814,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2815,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2816,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2817,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2818,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2819,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2820,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2821,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2822,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2823,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2824,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2825,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2826,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2827,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2828,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2829,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2830,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2831,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2832,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2833,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2834,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2835,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2836,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2837,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2838,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2839,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2840,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2841,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2842,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2843,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2844,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2845,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2846,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2847,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2848,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2849,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2850,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2851,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2852,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2853,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2854,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2855,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2856,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2857,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2858,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2859,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2860,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2861,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2862,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2863,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2864,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2865,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2866,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2867,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2868,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2869,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2870,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2871,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2872,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2873,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2874,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2875,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2876,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2877,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2878,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2879,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2880,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2881,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2882,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2883,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2884,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2885,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2886,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2887,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2888,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2889,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2890,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2891,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2892,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2893,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2894,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2895,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2896,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2897,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2898,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2899,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2900,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2901,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2902,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2903,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2904,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2905,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2906,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2907,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2908,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2909,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2910,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2911,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2912,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2913,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2914,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2915,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2916,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2917,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2918,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2919,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2920,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2921,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2922,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2923,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2924,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2925,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2926,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2927,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2928,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2929,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2930,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2931,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2932,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2933,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2934,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2935,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2936,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2937,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2938,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2939,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2940,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2941,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2942,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2943,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2944,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2945,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2946,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2947,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2948,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2949,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2950,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2951,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2952,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2953,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2954,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2955,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2956,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2957,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2958,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2959,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2960,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2961,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2962,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2963,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2964,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2965,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2966,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2967,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2968,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2969,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2970,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2971,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2972,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2973,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2974,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2975,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2976,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2977,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2978,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2979,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2980,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2981,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2982,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2983,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2984,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2985,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2986,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2987,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2988,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2989,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2990,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2991,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2992,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2993,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2994,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2995,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2996,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2997,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2998,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +2999,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3000,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3001,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3002,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3003,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3004,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3005,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3006,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3007,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3008,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3009,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3010,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3011,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3012,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3013,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3014,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3015,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3016,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3017,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3018,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3019,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3020,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3021,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3022,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3023,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3024,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3025,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3026,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3027,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3028,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3029,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3030,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3031,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3032,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3033,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3034,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3035,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3036,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3037,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3038,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3039,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3040,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3041,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3042,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3043,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3044,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3045,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3046,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3047,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3048,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3049,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3050,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3051,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3052,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3053,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3054,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3055,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3056,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3057,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3058,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3059,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3060,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3061,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3062,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3063,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3064,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3065,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3066,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3067,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3068,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3069,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3070,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3071,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3072,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3073,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3074,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3075,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3076,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3077,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3078,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3079,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3080,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3081,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3082,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3083,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3084,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3085,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3086,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3087,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3088,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3089,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3090,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3091,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3092,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3093,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3094,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3095,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3096,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3097,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3098,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3099,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3100,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3101,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3102,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3103,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3104,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3105,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3106,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3107,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3108,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3109,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3110,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3111,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3112,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3113,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3114,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3115,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3116,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3117,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3118,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3119,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3120,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3121,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3122,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3123,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3124,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3125,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3126,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3127,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3128,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3129,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3130,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3131,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3132,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3133,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3134,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3135,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3136,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3137,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3138,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3139,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3140,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3141,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3142,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3143,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3144,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3145,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3146,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3147,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3148,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3149,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3150,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3151,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3152,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3153,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3154,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3155,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3156,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3157,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3158,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3159,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3160,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3161,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3162,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3163,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3164,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3165,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3166,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3167,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3168,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3169,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3170,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3171,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3172,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3173,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3174,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3175,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3176,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3177,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3178,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3179,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3180,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3181,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3182,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3183,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3184,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3185,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3186,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3187,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3188,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3189,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3190,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3191,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3192,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3193,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3194,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3195,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3196,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3197,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3198,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3199,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3200,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3201,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3202,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3203,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3204,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3205,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3206,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3207,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3208,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3209,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3210,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3211,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3212,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3213,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3214,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3215,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3216,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3217,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3218,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3219,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3220,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3221,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3222,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3223,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3224,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3225,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3226,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3227,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3228,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3229,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3230,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3231,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3232,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3233,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3234,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3235,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3236,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3237,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3238,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3239,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3240,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3241,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3242,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3243,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3244,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3245,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3246,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3247,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3248,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3249,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3250,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3251,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3252,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3253,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3254,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3255,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3256,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3257,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3258,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3259,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3260,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3261,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3262,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3263,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3264,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3265,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3266,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3267,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3268,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3269,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3270,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3271,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3272,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3273,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3274,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3275,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3276,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3277,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3278,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3279,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3280,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3281,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3282,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3283,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3284,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3285,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3286,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3287,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3288,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3289,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3290,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3291,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3292,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3293,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3294,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3295,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3296,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3297,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3298,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3299,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3300,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3301,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3302,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3303,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3304,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3305,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3306,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3307,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3308,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3309,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3310,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3311,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3312,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3313,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3314,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3315,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3316,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3317,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3318,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3319,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3320,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3321,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3322,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3323,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3324,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3325,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3326,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3327,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3328,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3329,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3330,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3331,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3332,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3333,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3334,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3335,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3336,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3337,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3338,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3339,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3340,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3341,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3342,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3343,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3344,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3345,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3346,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3347,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3348,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3349,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3350,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3351,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3352,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3353,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3354,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3355,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3356,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3357,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3358,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3359,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3360,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3361,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3362,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3363,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3364,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3365,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3366,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3367,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3368,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3369,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3370,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3371,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3372,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3373,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3374,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3375,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3376,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3377,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3378,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3379,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3380,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3381,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3382,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3383,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3384,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3385,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3386,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3387,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3388,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3389,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3390,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3391,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3392,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3393,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3394,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3395,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3396,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3397,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3398,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3399,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3400,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3401,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3402,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3403,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3404,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3405,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3406,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3407,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3408,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3409,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3410,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3411,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3412,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3413,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3414,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3415,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3416,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3417,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3418,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3419,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3420,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3421,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3422,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3423,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3424,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3425,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3426,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3427,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3428,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3429,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3430,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3431,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3432,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3433,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3434,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3435,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3436,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3437,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3438,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3439,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3440,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3441,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3442,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3443,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3444,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3445,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3446,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3447,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3448,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3449,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3450,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3451,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3452,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3453,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3454,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3455,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3456,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3457,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3458,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3459,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3460,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3461,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3462,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3463,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3464,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3465,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3466,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3467,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3468,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3469,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3470,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3471,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3472,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3473,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3474,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3475,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3476,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3477,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3478,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3479,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3480,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3481,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3482,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3483,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3484,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3485,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3486,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3487,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3488,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3489,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3490,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3491,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3492,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3493,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3494,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3495,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3496,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3497,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3498,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3499,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +3500,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG diff --git a/admportal/test/eipam/sample.xml b/admportal/test/eipam/sample.xml new file mode 100644 index 00000000..c058ecf1 --- /dev/null +++ b/admportal/test/eipam/sample.xml @@ -0,0 +1,36 @@ +<aw:PurchaseOrder + aw:PurchaseOrderNumber="99503" + aw:OrderDate="1999-10-20" + xmlns:aw="http://www.adventure-works.com"> + <aw:Address aw:Type="Shipping"> + <aw:Name>Ellen Adams</aw:Name> + <aw:Street>123 Maple Street</aw:Street> + <aw:City>Mill Valley</aw:City> + <aw:State>CA</aw:State> + <aw:Zip>10999</aw:Zip> + <aw:Country>USA</aw:Country> + </aw:Address> + <aw:Address aw:Type="Billing"> + <aw:Name>Tai Yee</aw:Name> + <aw:Street>8 Oak Avenue</aw:Street> + <aw:City>Old Town</aw:City> + <aw:State>PA</aw:State> + <aw:Zip>95819</aw:Zip> + <aw:Country>USA</aw:Country> + </aw:Address> + <aw:DeliveryNotes>Please leave packages in shed by driveway.</aw:DeliveryNotes> + <aw:Items> + <aw:Item aw:PartNumber="872-AA"> + <aw:ProductName>Lawnmower</aw:ProductName> + <aw:Quantity>1</aw:Quantity> + <aw:USPrice>148.95</aw:USPrice> + <aw:Comment>Confirm this is electric</aw:Comment> + </aw:Item> + <aw:Item aw:PartNumber="926-AA"> + <aw:ProductName>Baby Monitor</aw:ProductName> + <aw:Quantity>2</aw:Quantity> + <aw:USPrice>39.98</aw:USPrice> + <aw:ShipDate>1999-05-21</aw:ShipDate> + </aw:Item> + </aw:Items> +</aw:PurchaseOrder> diff --git a/admportal/test/gen.sh b/admportal/test/gen.sh new file mode 100755 index 00000000..8c7928df --- /dev/null +++ b/admportal/test/gen.sh @@ -0,0 +1,4 @@ +#!/bin/bash +for i in `seq 2001 3500`;do + echo $i,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG +done diff --git a/admportal/uploads/temp b/admportal/uploads/temp new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/admportal/uploads/temp diff --git a/admportal/views/admin/list_usertrace.ejs b/admportal/views/admin/list_usertrace.ejs new file mode 100644 index 00000000..799288a7 --- /dev/null +++ b/admportal/views/admin/list_usertrace.ejs @@ -0,0 +1,68 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <title>SDN-C AdminPortal</title> +</head> + +<body> + +<div class="actions" style="padding:0px 25px;"> +<h2>User Trace</h2> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'><%=result.msg %></div> + <% } else { %> + <div class='alert alert-danger' role='danger'><%=result.msg %></div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + <div class="actions" style="padding:15px 0px;"> + + </div> + <div class="content"> + <table class="table table-hover"> + <thead> + <tr> + <th>Date</th> + <th>ATTUID</th> + <th>Action</th> + <th>Description</th> + </tr> + </thead> + <tbody> + <% if (rows) { + rows.forEach(function(row) { %> + <tr> + <td><%= row.date %></td> + <td><%= row.attuid %></td> + <td><%= row.action %></td> + <td><%= row.description %></td> + </tr> + <% }); }; %> + </tbody> + </table> + </div> + + <footer> + <% include ../partials/footer %> + </footer> + +</body> +</html> + diff --git a/admportal/views/admin/parameters.ejs b/admportal/views/admin/parameters.ejs new file mode 100644 index 00000000..247abc58 --- /dev/null +++ b/admportal/views/admin/parameters.ejs @@ -0,0 +1,181 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#params').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>Parameters</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#new_parameter"> + Add Parameter + </button> +</div> + + <table id="params" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*Name</th> + <th>*Value</th> + <th>Category</th> + <th>Memo</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.name %></td> + <td><%= row.value %></td> + <td><%= row.category %></td> + <td><%= row.memo %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateParameter('<%=row.name %>','<%= row.value %>','<%= row.category %>','<%= row.memo %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteParameter('<%= row.name %>','<%=row.value %>','<%= row.category %>','<%= row.memo %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> +</div> + +<% include ../partials/new_parameter %> +<% include ../partials/update_parameter %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitParam(form) +{ + var errorMsg=''; + var name = ''; + var value = ''; + var category = ''; + var memo = ''; + + if ( form.name == 'addForm' ) + { + name = form.nf_name; + value = form.nf_value; + category = form.nf_category; + memo = form.nf_memo; + } + else + { + name = form.uf_name; + value = form.uf_value; + category = form.uf_category; + memo = form.uf_memo; + } + + if ( (name.value == null) || (name.value == "") || isblank(name.value) ) + { + errorMsg += 'Name is required.<br>'; + } + if ( (value.value == null) || (value.value == "") || isblank(value.value) ) + { + errorMsg += 'Value is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + form.submit(); +} + + +function updateParameter(name,value,category,memo) { + + document.getElementById('uf_name').value=name; + document.getElementById('uf_value').value=value + document.getElementById('uf_category').value=category; + document.getElementById('uf_memo').value=memo; + + document.getElementById('uf_key_name').value=name; + + $('#update_parameter').modal('show'); +} + +function deleteParameter(name,value,category,memo) { + + var url_string = encodeURI("/admin/deleteParameter?name=" + name + + "&value=" + value + + "&category=" + category + + "&memo=" + memo); + + bootbox.confirm({ + message: "Are you sure you want to delete PARAMETER [" + name + "][" + value + "] ?", + callback: function(result) { + if ( result ) + { + location.assign(url_string); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} +</script> + +</body> +</html> + diff --git a/admportal/views/css_delete/bootstrap-theme.min.css b/admportal/views/css_delete/bootstrap-theme.min.css new file mode 100644 index 00000000..4c3e7bad --- /dev/null +++ b/admportal/views/css_delete/bootstrap-theme.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.1 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:hover,.btn-primary:focus{background-color:#265a88;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#265a88;border-color:#245580}.btn-primary:disabled,.btn-primary[disabled]{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
\ No newline at end of file diff --git a/admportal/views/css_delete/bootstrap.min.css b/admportal/views/css_delete/bootstrap.min.css new file mode 100644 index 00000000..b6fe4e0f --- /dev/null +++ b/admportal/views/css_delete/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.1 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:before,:after{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=radio],[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important;visibility:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
\ No newline at end of file diff --git a/admportal/views/error.ejs b/admportal/views/error.ejs new file mode 100644 index 00000000..7cf94edf --- /dev/null +++ b/admportal/views/error.ejs @@ -0,0 +1,3 @@ +<h1><%= message %></h1> +<h2><%= error.status %></h2> +<pre><%= error.stack %></pre> diff --git a/admportal/views/gamma/list.ejs b/admportal/views/gamma/list.ejs new file mode 100644 index 00000000..cf89a093 --- /dev/null +++ b/admportal/views/gamma/list.ejs @@ -0,0 +1,162 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vlan_id_pool').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>NoD VLAN ID POOL</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + +<div class="container-fluid"> + <table id="vlan_id_pool" class="table table-hover table-condensed"> + <thead> + <tr> + <th>AIC Site ID</th> + <th>Purpose</th> + <th>VLAN ID</th> + <th>VLPSPE Name</th> + <th>Availability Zone</th> + <th>Status</th> + <th>Svc Instance ID</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.aic_site_id %></td> + <td><%= row.purpose %></td> + <td><%= row.vlan_id %></td> + <td><%= row.vplspe_name %></td> + <td><%= row.availability_zone %></td> + <td><%= row.status %></td> + <td><%= row.svc_instance_id %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateVlanPool('<%=row.aic_site_id %>','<%= row.availability_zone %>', + '<%= row.purpose %>','<%= row.vlan_id %>','<%= row.status %>', + '<%= row.svc_instance_id %>','<%= row.vplspe_name %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteVlanPool('<%=row.aic_site_id %>', '<%= row.purpose %>', + '<%= row.vlan_id %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> + +<!-- + <% if(priv == 'A'){ %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/gamma/uploadVLAN" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <% if(priv == 'A') { %> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + <% } else { %> + <button type="button" class="btn btn-default disabled" + onclick="uploadFile(this.form);">Upload File</button> + <% } %> + </form> + </div> + <% } %> +--> +</div> + +<% include ../partials/update_vlan_id_pool %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function updateVlanPool(aic_site_id,availability_zone,purpose,vlan_id,status,svc_instance_id,vplspe_name) { + + document.getElementById('uf_aic_site_id').value=aic_site_id; + document.getElementById('uf_availability_zone').value=availability_zone + document.getElementById('uf_purpose').value=purpose; + document.getElementById('uf_vlan_id').value=vlan_id; + document.getElementById('uf_status').value=status; + document.getElementById('uf_svc_instance_id').value=svc_instance_id; + document.getElementById('uf_vplspe_name').value=vplspe_name; + + document.getElementById('uf_key_aic_site_id').value=aic_site_id; + document.getElementById('uf_key_purpose').value=purpose; + document.getElementById('uf_key_vlan_id').value=vlan_id; + $('#update_vlan_id_pool_modal').modal('show'); +} + +function deleteVlanPool(aic_site_id,purpose,vlan_id) { + + bootbox.confirm({ + message: "Are you sure you want to delete VLAN Id [" + aic_site_id + "][" + purpose + "][" + vlan_id + "] ?", + callback: function(result) { + if ( result ) + { + location.assign("/gamma/deleteVlanPool?aic_site_id=" + aic_site_id + "&purpose=" + purpose + "&vlan_id=" + vlan_id); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} +</script> + +</body> +</html> + diff --git a/admportal/views/gamma/listAicAvailZone.ejs b/admportal/views/gamma/listAicAvailZone.ejs new file mode 100644 index 00000000..7d0b7bde --- /dev/null +++ b/admportal/views/gamma/listAicAvailZone.ejs @@ -0,0 +1,166 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> + +<script class="init"> + $(document).ready(function() { + $('#availability_zone').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>AIC Availabilty Zone Pool</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + <table id="availability_zone" class="table table-hover table-condensed"> + <thead> + <tr> + <th>AIC Site ID</th> + <th>Availability Zone</th> + <th>Token</th> + <th>Service Type</th> + <th>Status</th> + <th>VNF ID</th> + <th>VNF Type</th> + <th>Hypervisor</th> + <% if(priv == 'A') { %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.aic_site_id %></td> + <td><%= row.availability_zone %></td> + <td><%= row.token %></td> + <td><%= row.service_type %></td> + <td><%= row.status %></td> + <td><%= row.vnf_id %></td> + <td><%= row.vnf_type %></td> + <td><%= row.hypervisor %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateAicAvailZone('<%=row.aic_site_id %>','<%= row.availability_zone %>','<%= row.token %>','<%= row.service_type %>','<%= row.status %>','<%= row.vnf_id %>','<%= row.vnf_type %>','<%= row.hypervisor %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteZone('<%=row.aic_site_id %>','<%= row.availability_zone %>', '<%= row.token %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> + + +<!-- + <% if(priv == 'A'){ %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/gamma/uploadAicAvailZone" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <% if(priv == 'A') { %> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + <% } else { %> + <button type="button" class="btn btn-default disabled" + onclick="uploadFile(this.form);">Upload File</button> + <% } %> + </form> + </div> + <% } %> +--> +</div> + +<% include ../partials/update_aic_avail_zone %> + +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function updateAicAvailZone(aic_site_id,availability_zone,token,service_type,status,vnf_id,vnf_type,hypervisor) { + + document.getElementById('uf_aic_site_id').value=aic_site_id; + document.getElementById('uf_availability_zone').value=availability_zone + document.getElementById('uf_token').value=token; + document.getElementById('uf_service_type').value=service_type; + document.getElementById('uf_status').value=status; + document.getElementById('uf_vnf_id').value=vnf_id; + document.getElementById('uf_vnf_type').value=vnf_type; + document.getElementById('uf_hypervisor').value=hypervisor; + document.getElementById('uf_key_aic_site_id').value=aic_site_id; + document.getElementById('uf_key_availability_zone').value=availability_zone + document.getElementById('uf_key_token').value=token; + $('#update_aic_avail_zone_modal').modal('show'); +} + +function deleteZone(siteid,azone,token) { + + bootbox.confirm({ + message: "Are you sure you want to delete zone [" + siteid + "][" + azone + "][" + token + "] ?", + callback: function(result) { + if ( result ) + { + location.assign("/gamma/deleteZone?siteid=" + siteid + "&azone=" + azone + "&token=" + token); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} +</script> + + +</body> +</html> + diff --git a/admportal/views/gamma/listAicSwitch.ejs b/admportal/views/gamma/listAicSwitch.ejs new file mode 100644 index 00000000..659652c3 --- /dev/null +++ b/admportal/views/gamma/listAicSwitch.ejs @@ -0,0 +1,156 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> + + <script class="init"> + $(document).ready(function() { + $('#switch').DataTable( { + "order": [[ 0, "asc" ]] + } ); + } ); + </script> + +</head> +<body> + +<div class="well well-sm"> +<h3>AIC Switch</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + <table id="switch" class="table table-hover table-condensed"> + <thead> + <tr> + <th>Physical Network Name</th> + <th>Switch Name</th> + <th>AIC Site ID</th> + <th>UUID</th> + <th>Availability Zone</th> + <% if(priv == 'A') { %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.physical_network_name %></td> + <td><%= row.switch_name %></td> + <td><%= row.aic_site_id %></td> + <td><%= row.uuid %></td> + <td><%= row.availability_zone %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateAicSwitch('<%= row.physical_network_name %>','<%= row.switch_name %>','<%=row.aic_site_id %>','<%= row.uuid %>','<%=row.availability_zone %>');">Update</button> + + <button type="button" class="btn btn-default btn-xs" + onclick="deleteSwitch('<%=row.physical_network_name %>');">Delete</button> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> + + +<!-- + <% if(priv == 'A') { %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/gamma/uploadAicSwitch" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + + <% if(priv == 'A') { %> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + <% } else { %> + <button type="button" class="btn btn-default disabled" + onclick="uploadFile(this.form);">Upload File</button> + <% } %> + </form> + </div> + <% } %> +--> +</div> + +<% include ../partials/update_aic_switch %> + +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function updateAicSwitch(physical_network_name,switch_name,aic_site_id,uuid,availability_zone) { + + document.getElementById('uf_physical_network_name').value=physical_network_name; + document.getElementById('uf_switch_name').value=switch_name; + document.getElementById('uf_aic_site_id').value=aic_site_id; + document.getElementById('uf_uuid').value=uuid; + document.getElementById('uf_availability_zone').value=availability_zone; + document.getElementById('uf_key_physical_network_name').value=physical_network_name; + $('#update_aic_switch_modal').modal('show'); +} +function deleteSwitch(pnetwork_name) { + + bootbox.confirm({ + message: "Are you sure you want to delete this switch [" + pnetwork_name + "] ?", + callback: function(result) { + if ( result ) + { + location.assign("/gamma/deleteSwitch?phy_network_name=" + pnetwork_name); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} +</script> + +</body> +</html> + diff --git a/admportal/views/gamma/listServiceHoming.ejs b/admportal/views/gamma/listServiceHoming.ejs new file mode 100644 index 00000000..e25777a9 --- /dev/null +++ b/admportal/views/gamma/listServiceHoming.ejs @@ -0,0 +1,241 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +</head> +<body> + +<div class="well well-sm"> +<h3>Service Homing</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_service_homing"> + Add Service Homing + </button> + </div> + <% } %> + + <table class="table table-hover table-condensed"> + <thead> + <tr> + <th>*Service Type</th> + <th>*LATA</th> + <th>*Hubbing City Type</th> + <th>Latitude</th> + <th>Longitude</th> + <th>*Primary Site Name</th> + <th>Secondary Site Name</th> + <th>Tertiary Site Name</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% var i=0; rows.forEach( function(row) { %> + <tr> + <td><%= row.service_type %></td> + <td><%= row.lata %></td> + <td><%= row.hubbing_city_type%></td> + <td><%= row.latitude %></td> + <td><%= row.longitude %></td> + <td><%= row.primary_aic_site_name %></td> + <td><%= row.secondary_aic_site_name %></td> + <td><%= row.tertiary_aic_site_name %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateServiceHoming('<%=row.service_type %>','<%= row.lata %>','<%= row.hubbing_city_type %>','<%= row.latitude %>','<%= row.longitude %>','<%= row.primary_aic_site_name %>','<%= row.secondary_aic_site_name %>','<%= row.tertiary_aic_site_name %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteServiceHoming('<%= row.service_type %>','<%=row.lata %>','<%= row.hubbing_city_type %>');">Delete</button> + </td> + <% } %> + + </tr> + <% i++; }); %> + </tbody> + </table> + + <div class container> + <p><%= i %> rows in table.</p> + </div> + + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/gamma/uploadServiceHoming" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <% if(priv == 'A') { %> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + <% } else { %> + <button type="button" class="btn btn-default disabled" + onclick="uploadFile(this.form);">Upload File</button> + <% } %> + + </form> + </div> + <% } %> +</div> + +<% include ../partials/add_service_homing %> +<% include ../partials/update_service_homing %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> + +function submitServiceHoming(form) +{ + var errorMsg=''; + var lata=''; + var hubbing_city_type=''; + var primary_aic_site_name=''; + var latitude=''; + var longitude=''; + + if ( form.name == 'addForm' ) + { + lata = form.nf_lata; + hubbing_city_type = form.nf_hubbing_city_type; + primary_aic_site_name = form.nf_primary_aic_site_name; + latitude = form.nf_latitude; + longitude = form.nf_longitude; + } + else + { + lata = form.uf_lata; + hubbing_city_type = form.uf_hubbing_city_type; + primary_aic_site_name = form.uf_primary_aic_site_name; + latitude = form.uf_latitude; + longitude = form.uf_longitude; + } + + + if ( (lata.value == null) || (lata.value == "") || isblank(lata.value) ) + { + errorMsg += 'LATA is required.<br>'; + } + if ( (hubbing_city_type.value == null) || (hubbing_city_type.value == "") || isblank(hubbing_city_type.value) ) + { + errorMsg += 'Hubbing City Type is required.<br>'; + } + if ( (primary_aic_site_name.value == null) || (primary_aic_site_name.value == "") || isblank(primary_aic_site_name.value) ){ + errorMsg += 'Primary Site Name is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + + if ( !isDigit(lata.value) ) + { + bootbox.alert('LATA must be a number.'); + return; + } + if ( latitude.length > 0 ) + { + if ( !isFloat(latitude.value) ) + { + bootbox.alert('Latitude must be a float.'); + return; + } + } + if ( longitude.length > 0 ) + { + if ( !isFloat(longitude.value) ) + { + bootbox.alert('Longitude must be a float.'); + return; + } + } + form.submit(); +} + +function updateServiceHoming(service_type,lata,hubbing_city_type,latitude,longitude,primary_aic_site_name,secondary_aic_site_name,tertiary_aic_site_name) { + + document.getElementById('uf_service_type').value=service_type; + document.getElementById('uf_lata').value=lata + document.getElementById('uf_hubbing_city_type').value=hubbing_city_type; + document.getElementById('uf_latitude').value=latitude; + document.getElementById('uf_longitude').value=longitude; + document.getElementById('uf_primary_aic_site_name').value=primary_aic_site_name; + document.getElementById('uf_secondary_aic_site_name').value=secondary_aic_site_name; + document.getElementById('uf_tertiary_aic_site_name').value=tertiary_aic_site_name; + + document.getElementById('uf_key_service_type').value=service_type; + document.getElementById('uf_key_lata').value=lata + document.getElementById('uf_key_hubbing_city_type').value=hubbing_city_type; + + $('#update_service_homing').modal('show'); +} + +function deleteServiceHoming(service_type,lata,hubbing_city_type) { + + bootbox.confirm({ + message: "Are you sure you want to delete SERVICE_HOMING [" + service_type + "]" + "[" + lata + "][" + hubbing_city_type + "]", + callback: function(result) { + if ( result ) + { + location.assign("/gamma/deleteServiceHoming?service_type=" + service_type + "&lata=" + lata + "&hubbing_city_type=" + hubbing_city_type); + + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/gamma/listServiceHomingRollback.ejs b/admportal/views/gamma/listServiceHomingRollback.ejs new file mode 100644 index 00000000..a7b5ef5a --- /dev/null +++ b/admportal/views/gamma/listServiceHomingRollback.ejs @@ -0,0 +1,117 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +</head> +<body> + +<div class="well well-sm"> +<h3>Service Homing Rollback</h3> +<p>(This table data was saved during the last import of SERVICE_HOMING data.)</p> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + <table class="table table-hover table-condensed"> + <thead> + <tr> + <th>Service Type</th> + <th>LATA</th> + <th>Hubbing City Type</th> + <th>Latitude</th> + <th>Longitude</th> + <th>Primary Site Name</th> + <th>Secondary Site Name</th> + <th>Tertiary Site Name</th> + </tr> + </thead> + <tbody> + <% var i=0; rows.forEach( function(row) { %> + <tr> + <td><%= row.service_type %></td> + <td><%= row.lata %></td> + <td><%= row.hubbing_city_type%></td> + <td><%= row.latitude %></td> + <td><%= row.longitude %></td> + <td><%= row.primary_aic_site_name %></td> + <td><%= row.secondary_aic_site_name %></td> + <td><%= row.tertiary_aic_site_name %></td> + </tr> + <% i++; }); %> + </tbody> + </table> + + <div class container> + <p><%= i %> rows in table.</p> + </div> + + <% if (priv == 'A') { %> + <button type="button" class="btn btn-default" + onclick="rollback();">Rollback</button> + <% } %> +</div> + +<footer> + <% include ../partials/footer %> +</footer> +<script type="text/javascript"> + +function rollback() +{ + bootbox.confirm({ + message: "This Rollback will overlay the current SERVICE_HOMING table. Are you sure you want to Rollback the SERVICE_HOMING table?", + callback: function(result){ + if(result) + { + location.assign("/gamma/rollbackServiceHoming"); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm:{ + label: "Yes" + } + } + }); +} + +</script> + + +</body> +</html> + diff --git a/admportal/views/gamma/listSite.ejs b/admportal/views/gamma/listSite.ejs new file mode 100644 index 00000000..9287ad5c --- /dev/null +++ b/admportal/views/gamma/listSite.ejs @@ -0,0 +1,171 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#site').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> + <h3>AIC Site</h3> +</div> +<!-- +<div class="actions" style="padding:0px 25px;"> +<h2>AIC SITE</h2> +</div> +--> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + +<div class="container-fluid"> + <table id="site" class="table table-hover table-condensed"> + <thead> + <tr> + <th>Name</th> + <th>AIC Site ID</th> + <th>VCenter URL</th> + <th>OAM Gateway Address</th> + <th>VCenter User</th> + <th>VCenter Passwd</th> + <th>City</th> + <th>State</th> + <th>Status</th> + <% if(priv == 'A') { %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.name %></td> + <td><%= row.aic_site_id %></td> + <td><%= row.vcenter_url %></td> + <td><%= row.oam_gateway_addr %></td> + <td><%= row.vcenter_username %></td> + <td>*****</td> + <td><%= row.city %></td> + <td><%= row.state %></td> + <td><%= row.operational_status %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateAicSite('<%= row.name %>','<%=row.aic_site_id %>', + '<%= row.vcenter_url %>','<%= JSON.stringify(row.vcenter_username).replace(/\"/g,'') %>', + '<%= row.vcenter_passwd %>', '<%= row.city %>','<%= row.state %>', + '<%= row.operational_status %>', '<%= row.oam_gateway_addr %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteSite('<%=row.aic_site_id %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> + +<!-- + <% if(priv == 'A') { %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/gamma/uploadAicSite" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <% if(priv == 'A') { %> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + <% } else { %> + <button type="button" class="btn btn-default disabled" + onclick="uploadFile(this.form);">Upload File</button> + <% } %> + </form> + </div> + <% } %> +--> +</div> + +<% include ../partials/update_aic_site %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function updateAicSite(name,aic_site_id,vcenter_url,vcenter_username,vcenter_passwd,city,state,operational_status,oam_gateway_addr) +{ + document.getElementById('uf_name').value=name + document.getElementById('uf_aic_site_id').value=aic_site_id; + document.getElementById('uf_vcenter_url').value=vcenter_url; + document.getElementById('uf_vcenter_username').value=vcenter_username; + document.getElementById('uf_vcenter_passwd').value=vcenter_passwd; + document.getElementById('uf_city').value=city; + document.getElementById('uf_state').value=state; + document.getElementById('uf_operational_status').value=operational_status; + document.getElementById('uf_oam_gateway_addr').value=oam_gateway_addr; + + document.getElementById('uf_key_aic_site_id').value=aic_site_id; + $('#update_aic_site_modal').modal('show'); +} + +function deleteSite(siteId) { + + bootbox.confirm({ + message: "Their may be SERVICE_HOMING entry pointing to this site. Are you sure you want to delete site [" + siteId + "] ?", + callback: function(result) { + if ( result ) + { + location.assign("/gamma/deleteSite?siteid=" + siteId); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} +</script> + +</body> +</html> + diff --git a/admportal/views/gamma/listVpePool.ejs b/admportal/views/gamma/listVpePool.ejs new file mode 100644 index 00000000..51c2dfec --- /dev/null +++ b/admportal/views/gamma/listVpePool.ejs @@ -0,0 +1,194 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> + +<script class="init"> + $(document).ready(function() { + $('#vpe_pool').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>VPE Pool</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + <table id="vpe_pool" class="table table-hover table-condensed"> + <thead> + <tr> + <th>AIC Site ID</th> + <th>VPE Name</th> + <th>Availability Zone</th> + <th>IPV4 OAM Address</th> + <th>Loopback IPV4 Address</th> + <th>Prov Status</th> + <th>VLAN ID Outer</th> + <th>Vendor</th> + <th>Interface Name</th> + <th>Interface Speed</th> + <th>Interface Units</th> + <th>VPE UUID</th> + <th>VPE ID</th> + <th>AS_NUMBER</th> + <th>Image Filename</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.aic_site_id %></td> + <td><%= row.vpe_name %></td> + <td><%= row.availability_zone %></td> + <td><%= row.ipv4_oam_address %></td> + <td><%= row.loopback0_ipv4_address %></td> + <td><%= row.provisioning_status %></td> + <td><%= row.vlan_id_outer %></td> + <td><%= row.vendor %></td> + <td><%= row.physical_intf_name %></td> + <td><%= row.physical_intf_speed %></td> + <td><%= row.physical_intf_units %></td> + <td><%= row.vpe_uuid %></td> + <td><%= row.vpe_id %></td> + <td><%= row.as_number %></td> + <td><%= row.image_filename %></td> + <td> +<!-- + <form name="rowform"> + <input type="hidden" name="rf_aic_site_id" id="rf_aic_site_id" value="<%= row.aic_site_id %>"</input> + <input type="hidden" name="rf_vpe_name" id="rf_vpe_name" value="<%= row.vpe_name %>"</input> + <input type="hidden" name="rf_availability_zone" id="rf_availability_zone" value="<%= row.availability_zone %>"</input> + </form> +--> + <!-- <% var _attuid = row.attuid %> --> + <% if(priv == 'A') { %> + <button type="button" class="btn btn-default btn-xs" + onclick="updateVpePool('<%=row.aic_site_id %>','<%=row.vpe_name %>', '<%=row.availability_zone %>','<%=row.provisioning_status %>','<%= row.ipv4_oam_address %>','<%= row.loopback0_ipv4_address %>','<%= row.vlan_id_outer %>','<%= row.vendor %>','<%= row.physical_intf_name %>','<%= row.physical_intf_speed %>','<%= row.physical_intf_units %>','<%= row.vpe_uuid %>','<%= row.vpe_id %>', '<%= row.image_filename %>', '<%= row.as_number %>' );">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteVpePool('<%= row.vpe_name %>','<%=row.aic_site_id %>','<%= row.availability_zone %>');">Delete</button> + <% } %> + </td> + </tr> + <% }); %> + </tbody> + </table> + +<!-- + <% if(priv == 'A'){ %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/gamma/uploadVpePool" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <% if(priv == 'A') { %> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + <% } else { %> + <button type="button" class="btn btn-default disabled" + onclick="uploadFile(this.form);">Upload File</button> + <% } %> + </form> + </div> + <% } %> +--> +</div> + +<% include ../partials/update_vpe_pool %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function updateVpePool(aic_site_id,vpe_name,availability_zone,provisioning_status,ipv4_oam_address,loopback0_ipv4_address,vlan_id_outer,vendor,physical_intf_name,physical_intf_speed,physical_intf_units,vpe_uuid,vpe_id,image_filename, as_number) { + + document.getElementById('uf_aic_site_id').value=aic_site_id; + document.getElementById('uf_vpe_name').value=vpe_name; + document.getElementById('uf_availability_zone').value=availability_zone; + document.getElementById('uf_provisioning_status').value=provisioning_status; + document.getElementById('uf_ipv4_oam_address').value=ipv4_oam_address; + document.getElementById('uf_loopback0_ipv4_address').value=loopback0_ipv4_address; + document.getElementById('uf_vlan_id_outer').value=vlan_id_outer; + document.getElementById('uf_vendor').value=vendor; + document.getElementById('uf_physical_intf_name').value=physical_intf_name; + document.getElementById('uf_physical_intf_speed').value=physical_intf_speed; + document.getElementById('uf_physical_intf_units').value=physical_intf_units; + document.getElementById('uf_vpe_uuid').value=vpe_uuid; + document.getElementById('uf_vpe_id').value=vpe_id; + document.getElementById('uf_as_number').value=as_number; + document.getElementById('uf_image_filename').value=image_filename; + + document.getElementById('uf_key_availability_zone').value=availability_zone; + document.getElementById('uf_key_aic_site_id').value=aic_site_id; + document.getElementById('uf_key_vpe_name').value=vpe_name; + $('#update_vpe_pool_modal').modal('show'); + +} +function deleteVpePool(vpe_name,aic_site_id,availability_zone) { + + bootbox.confirm({ + message: "Are you sure you want to delete VPE [" + aic_site_id + "][" + vpe_name + "][" + availability_zone + "] ?", + callback: function(result) { + if ( result ) + { + location.assign("/gamma/deleteVpePool?aic_site_id=" + aic_site_id + "&vpe_name=" + vpe_name + "&availability_zone=" + availability_zone); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/gamma/listVplspePool.ejs b/admportal/views/gamma/listVplspePool.ejs new file mode 100644 index 00000000..b49c2a37 --- /dev/null +++ b/admportal/views/gamma/listVplspePool.ejs @@ -0,0 +1,178 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> + +<script class="init"> + $(document).ready(function() { + $('#vplspe_pool').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>VPLSPE Pool</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + +<div class="container-fluid"> + <table id="vplspe_pool" class="table table-hover table-condensed"> + <thead> + <tr> + <th>VPLSPE Name</th> + <th>AIC Site ID</th> + <th>Availability Zone</th> + <th>Interface Name</th> + <th>Interface Speed</th> + <th>Interface Units</th> + <th>Loopback IPV4 Address</th> + <th>VLAN ID Outer</th> + <th>VPLSPE UUID</th> + <th>Image Filename</th> + <th>Prov Status</th> + <th>Vendor</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.vplspe_name %></td> + <td><%= row.aic_site_id %></td> + <td><%= row.availability_zone %></td> + <td><%= row.physical_intf_name %></td> + <td><%= row.physical_intf_speed %></td> + <td><%= row.physical_intf_units %></td> + <td><%= row.loopback0_ipv4_address %></td> + <td><%= row.vlan_id_outer %></td> + <td><%= row.vplspe_uuid %></td> + <td><%= row.image_filename %></td> + <td><%= row.provisioning_status %></td> + <td><%= row.vendor %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateVplspePool('<%=row.aic_site_id %>','<%= row.availability_zone %>','<%= row.vplspe_name %>','<%= row.physical_intf_name %>','<%= row.physical_intf_speed %>','<%= row.physical_intf_units %>','<%= row.loopback0_ipv4_address %>','<%= row.vlan_id_outer %>','<%= row.vplspe_uuid %>','<%= row.image_filename %>','<%= row.provisioning_status %>','<%= row.vendor %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteVplspePool('<%= row.vplspe_name %>','<%=row.aic_site_id %>','<%= row.availability_zone %>','<%= row.physical_intf_name %>');">Delete</button> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> + +<!-- + <% if(priv == 'A'){ %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/gamma/uploadVplspePool" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <% if(priv == 'A') { %> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + <% } else { %> + <button type="button" class="btn btn-default disabled" + onclick="uploadFile(this.form);">Upload File</button> + <% } %> + + </form> + </div> + <% } %> +--> +</div> + +<% include ../partials/update_vplspe_pool %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function updateVplspePool(aic_site_id,availability_zone,vplspe_name,physical_intf_name,physical_intf_speed,physical_intf_units,loopback0_ipv4_address,vlan_id_outer,vplspe_uuid,image_filename,provisioning_status,vendor) { + + document.getElementById('uf_aic_site_id').value=aic_site_id; + document.getElementById('uf_availability_zone').value=availability_zone + document.getElementById('uf_vplspe_name').value=vplspe_name; + document.getElementById('uf_physical_intf_name').value=physical_intf_name; + document.getElementById('uf_physical_intf_speed').value=physical_intf_speed; + document.getElementById('uf_physical_intf_units').value=physical_intf_units; + document.getElementById('uf_loopback0_ipv4_address').value=loopback0_ipv4_address; + document.getElementById('uf_vlan_id_outer').value=vlan_id_outer; + document.getElementById('uf_vplspe_uuid').value=vplspe_uuid; + document.getElementById('uf_image_filename').value=image_filename; + document.getElementById('uf_provisioning_status').value=provisioning_status; + document.getElementById('uf_vendor').value=vendor; + + document.getElementById('uf_key_aic_site_id').value=aic_site_id; + document.getElementById('uf_key_vplspe_name').value=vplspe_name; + document.getElementById('uf_key_availability_zone').value=availability_zone + document.getElementById('uf_key_physical_intf_name').value=physical_intf_name; + $('#update_vplspe_pool_modal').modal('show'); +} + +function deleteVplspePool(vplspe_name,aic_site_id,availability_zone,physical_intf_name) { + + bootbox.confirm({ + message: "Are you sure you want to delete VPLSPE [" + vplspe_name + "][" + aic_site_id + "][" + availability_zone + "][" + physical_intf_name + "] ?", + callback: function(result) { + if ( result ) + { + location.assign("/gamma/deleteVplspePool?aic_site_id=" + aic_site_id + "&vplspe_name=" + vplspe_name + "&availability_zone=" + availability_zone + "&physical_intf_name=" + physical_intf_name); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} +</script> + +</body> +</html> + diff --git a/admportal/views/gamma/nbVlanPool.ejs b/admportal/views/gamma/nbVlanPool.ejs new file mode 100644 index 00000000..9d3a8d1b --- /dev/null +++ b/admportal/views/gamma/nbVlanPool.ejs @@ -0,0 +1,124 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> + +<script class="init"> + $(document).ready(function() { + $('#nb_vlan_pool').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>NetBond VLAN Pools</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + +<div class="container-fluid"> + + <table id="nb_vlan_pool" class="table table-hover table-condensed"> + <thead> + <tr> + <th>AIC Site Id</th> + <th>Availability Zone</th> + <th>VLAN Plan Id</th> + <th>Plan Type</th> + <th>Purpose</th> + <th>VLAN Id</th> + <th>Status</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.aic_site_id %></td> + <td><%= row.availability_zone %></td> + <td><%= row.vlan_plan_id %></td> + <td><%= row.plan_type %></td> + <td><%= row.purpose %></td> + <td><%= row.vlan_id %></td> + <td><%= row.status %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateNbVlanPool('<%= row.aic_site_id %>', '<%= row.availability_zone %>', + '<%= row.vlan_plan_id %>', '<%= row.plan_type %>', '<%= row.purpose %>', + '<%= row.vlan_id %>', '<%= row.status %>');">Update</button> + </td> + <% } else { %> + <td> </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> +</div> + +<% include ../partials/nb_vlan_pool %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> + +function updateNbVlanPool(aic_site_id,availability_zone,vlan_plan_id,plan_type,purpose,vlan_id,pstatus) { + + document.getElementById('uf_key_aic_site_id').value=aic_site_id; + document.getElementById('uf_key_availability_zone').value=availability_zone; + document.getElementById('uf_key_vlan_plan_id').value=vlan_plan_id; + document.getElementById('uf_key_plan_type').value=plan_type; + document.getElementById('uf_key_purpose').value=purpose; + document.getElementById('uf_key_vlan_id').value=vlan_id; + document.getElementById('uf_status').value=pstatus; + + $('#update_nb_vlan_pool').modal('show'); +} + +function saveNbVlanPool(form) +{ + form.submit(); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/gamma/nbVlanRange.ejs b/admportal/views/gamma/nbVlanRange.ejs new file mode 100644 index 00000000..748dbbe3 --- /dev/null +++ b/admportal/views/gamma/nbVlanRange.ejs @@ -0,0 +1,205 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> + +<script class="init"> + $(document).ready(function() { + $('#nb_vlan_ranges').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>NetBond VLAN Ranges</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vlan_range"> + Add Range + </button> + </div> + <% } %> + + <table id="nb_vlan_ranges" class="table table-hover table-condensed"> + <thead> + <tr> + <th>Vlan Plan Id</th> + <th>Purpose</th> + <th>Range Start</th> + <th>Range End</th> + <th>Plan Type</th> + <th>Pool Generated</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.vlan_plan_id %></td> + <td><%= row.purpose %></td> + <td><%= row.range_start %></td> + <td><%= row.range_end %></td> + <td><%= row.plan_type %></td> + <td><%= row.generated %></td> + <td> + <% if (row.generated == 'N' && priv == 'A'){ %> + <button type="button" class="btn btn-default btn-xs" onclick="generateVlanPool();">Generate Pool</button> + <% } else { %> + <button type="button" class="btn btn-default btn-xs disabled" + onclick="generateVlanPool('<%= row.purpose %>', '<%= row.vlan_plan_id %>', + '<%= row.range_start %>', '<%= row.range_end %>', + '<%= row.plan_type %>');">Generate Pool</button> + <% } %> + <% if (row.generated == 'N'){ %> + <button type="button" class="btn btn-default btn-xs disabled" onclick="viewNbVlanPool('<%= row.vlan_plan_id %>','<%= row.range_start %>', '<%= row.range_end %>');">View Pool</button> + <% } else { %> + <button type="button" class="btn btn-default btn-xs" onclick="viewNbVlanPool('<%= row.vlan_plan_id %>','<%= row.range_start %>', '<%= row.range_end %>');">View Pool</button> + <% } %> + <% if(priv == 'A') { %> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteNbVlanRange('<%= row.vlan_plan_id %>', + '<%= row.plan_type %>', '<%= row.purpose %>', '<%= row.range_start %>', + '<%= row.range_end %>');">Delete</button> + <% } %> + </td> + </tr> + <% }); %> + </tbody> + </table> +</div> + +<% include ../partials/nb_vlan_range %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> + +function generateVlanPool(purpose,vlan_plan_id,range_start,range_end,plan_type) +{ + var url_string = encodeURI("/gamma/generateNbVlanPool?vlan_plan_id=" + vlan_plan_id + + "&range_start=" + range_start + "&range_end=" + range_end + + "&plan_type=" + plan_type + "&purpose=" + purpose); + location.assign(url_string); + return; +} +function viewNbVlanPool(vlan_plan_id, range_start, range_end) +{ + var url_string = encodeURI("/gamma/getNbVlanPool?vlan_plan_id=" + vlan_plan_id + + "&range_start=" + range_start + "&range_end=" + range_end); + location.assign(url_string); + return; +} +function deleteNbVlanRange(vlan_plan_id,plan_type,purpose,range_start,range_end) { + + bootbox.confirm({ + message: "Are you sure you want to delete this VLAN Range[" + vlan_plan_id + "]", + callback: function(result) { + if ( result ) + { + var url_string = encodeURI( + "/gamma/deleteNbVlanRange?vlan_plan_id=" + vlan_plan_id + + "&plan_type=" + plan_type + "&purpose=" + purpose + + "&range_start=" + range_start + "&range_end=" + range_end); + location.assign(url_string); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +function saveNbVlanRange(form) +{ + var errorMsg=''; + var plan_type = form.nf_plan_type.value; + var purpose = form.nf_purpose.value; + var range_start = form.nf_range_start.value; + var range_end = form.nf_range_end.value; + + if ( (range_start == null) || (range_start == "") || isblank(range_start) ) + { + errorMsg += 'Range Start is required.<br>'; + } + if ( (range_end == null) || (range_end == "") || isblank(range_start) ) + { + errorMsg += 'Range End is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + + if ( !$.isNumeric(range_start) ) { + bootbox.alert('Range Start is not a number.'); + return; + } + if ( !$.isNumeric(range_end) ) { + bootbox.alert('Range End is not a number.'); + return; + } + var r_start = Number(range_start); + var r_end = Number(range_end); + + if ( r_end < r_start ) + { + bootbox.alert('Range End must be greater than Range Start.'); + return; + } + + form.submit(); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/gamma/networkProfile.ejs b/admportal/views/gamma/networkProfile.ejs new file mode 100644 index 00000000..1b54d671 --- /dev/null +++ b/admportal/views/gamma/networkProfile.ejs @@ -0,0 +1,164 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> + +<script class="init"> + $(document).ready(function() { + $('#network_profile').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>Network Profile</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_network_profile"> + Add Profile + </button> + </div> + <% } %> + + <table id="network_profile" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*Network Type</th> + <th>Technology</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.network_type %></td> + <td><%= row.technology %></td> + <% if(priv == 'A') { %> + <td> + <% if (priv == 'A') { %> + <button type="button" class="btn btn-default btn-xs" onclick="updateNetworkProfile('<%= row.network_type %>', '<%= row.technology %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" onclick="deleteNetworkProfile('<%= row.network_type %>');">Delete</button> + <% } %> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> +</div> + +<% include ../partials/network_profile %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function saveNetworkProfile(form) +{ + var errorMsg=''; + var network_type = ''; + var technology = ''; + + if ( form.name == 'addForm' ) + { + network_type = form.nf_network_type; + technology = form.nf_technology; + } + else + { + network_type = form.uf_network_type; + technology = form.uf_technology; + } + + + if ( (network_type.value == null) || (network_type.value == "") || isblank(network_type.value) ) + { + errorMsg += 'Network Type is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + form.submit(); +} + +function updateNetworkProfile(network_type,technology) { + + document.getElementById('uf_network_type').value=network_type; + document.getElementById('uf_technology').value=technology; + + document.getElementById('uf_key_network_type').value=network_type; + + $('#update_network_profile').modal('show'); +} + +function deleteNetworkProfile(network_type) { + + bootbox.confirm({ + message: "Are you sure you want to delete this Network Profile [" + network_type + "]", + callback: function(result) { + if ( result ) + { + location.assign("/gamma/deleteNetworkProfile?network_type=" + network_type); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/javascript_delete/jquery.min.js b/admportal/views/javascript_delete/jquery.min.js new file mode 100644 index 00000000..ab28a247 --- /dev/null +++ b/admportal/views/javascript_delete/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px") +},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m}); diff --git a/admportal/views/javascript_delete/sla.js b/admportal/views/javascript_delete/sla.js new file mode 100644 index 00000000..e3819a80 --- /dev/null +++ b/admportal/views/javascript_delete/sla.js @@ -0,0 +1,11 @@ +<script> +function uploadDG(form) +{ + if ( form.filename.value.length == 0) + { + alert('Must select a file.'); + return false; + } + else { form.submit(); return; } +} +</script> diff --git a/admportal/views/logs/accesslog.ejs b/admportal/views/logs/accesslog.ejs new file mode 100644 index 00000000..0b4ea56f --- /dev/null +++ b/admportal/views/logs/accesslog.ejs @@ -0,0 +1,83 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#access').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>HTTP Server Access Log</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + <table id="access" class="table table-hover table-condensed"> + <thead> + <tr> + <th>Date (UTC)</th> + <th>Method</th> + <th>Version</th> + <th>Status</th> + <th>URL</th> + </tr> + </thead> + <tbody> + <% for(var x=0; x < rows.length; x++) { %> + <tr> + <td><%= rows[x].date %></td> + <td><%= rows[x].method %></td> + <td><%= rows[x].version %></td> + <td><%= rows[x].status %></td> + <td><%= rows[x].url %></td> + </tr> + <% } %> + </tbody> + </table> +</div> + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/logs/accesslog.ejs.0223 b/admportal/views/logs/accesslog.ejs.0223 new file mode 100644 index 00000000..77ece8f9 --- /dev/null +++ b/admportal/views/logs/accesslog.ejs.0223 @@ -0,0 +1,121 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#access').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>HTTP Server Access Log</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + <table id="access" class="table table-hover table-condensed"> + <thead> + <tr> + <th>Date (UTC)</th> + <th>Method</th> + <th>Version</th> + <th>Status</th> + <th>URL</th> + </tr> + </thead> + <tbody> + <% for(var x=0; x<pageInfo.rows.length; x++) { %> + <tr> + <td><%= pageInfo.rows[x].date %></td> + <td><%= pageInfo.rows[x].method %></td> + <td><%= pageInfo.rows[x].version %></td> + <td><%= pageInfo.rows[x].status %></td> + <td><%= pageInfo.rows[x].url %></td> + </tr> + <% } %> + </tbody> + </table> +</div> + + <div class="container-fluid"> + <div class="row"> + <div class="col-md-1 text-left"> + <p> Page <%= pageInfo.currentPage %> of <%= pageInfo.pageCount %></p> + </div> + <div class="col-md-11 text-left"> + <% if (pageInfo.pageCount > 1) { %> + <ul class="pagination"> + <% if (pageInfo.currentPage > 1) { %> + <li><a href="/logs/pageAccessLog?page=1">«</a></li> + <% } %> + <% var i = 1; + if (pageInfo.currentPage > 10) { + i = +pageInfo.currentPage - 9; + } %> + <% if (i !== 1) { %> + <!--<li class="disabled"><a href="#">...</a></li>--> + <% } %> + <% for (i; i<=pageInfo.pageCount; i++) { %> + <% if (pageInfo.currentPage == i) { %> + <li class="active"><span><%= i %> <span class="sr-only">(current)</span></span></li> + <% } else { %> + <li><a href="/logs/pageAccessLog?page=<%= i %>"><%= i %></a></li> + <% } %> + <% if (i == (+pageInfo.currentPage + 9)) { %> + <!--<li class="disabled"><a href="#">...</a></li>--> + <% break; } %> + <% } %> + <% if (pageInfo.currentPage != pageInfo.pageCount) { %> + <li><a href="/logs/pageAccessLog?page=<%= pageInfo.pageCount %>">»</a></li> + <% } %> + </ul> + <% } %> + </div><!-- col-md-10 --> + </div><!-- row --> + </div><!-- container-fluid --> + + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/logs/usertrace.ejs b/admportal/views/logs/usertrace.ejs new file mode 100644 index 00000000..cca003b0 --- /dev/null +++ b/admportal/views/logs/usertrace.ejs @@ -0,0 +1,83 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#usertrace').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>User Trace</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + <div class="table-responsive"> + <table id="usertrace" class="table table-hover table-condensed"> + <thead> + <tr> + <th>Date (UTC)</th> + <th>ATTUID</th> + <th>Action</th> + <th>Description</th> + </tr> + </thead> + <tbody id="myTable"> + <% for (var x=0; x < rows.length; x++) { %> + <tr> + <td><%= rows[x].date %></td> + <td><%= rows[x].attuid %></td> + <td><%= rows[x].action %></td> + <td><%= rows[x].desc %></td> + </tr> + <% } %> + </tbody> + </table> + </div> +</div> + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/logs/usertrace.ejs.0223 b/admportal/views/logs/usertrace.ejs.0223 new file mode 100644 index 00000000..8a099edd --- /dev/null +++ b/admportal/views/logs/usertrace.ejs.0223 @@ -0,0 +1,122 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#usertrace').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>User Trace</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + <div class="table-responsive"> + <table id="usertrace" class="table table-hover table-condensed"> + <thead> + <tr> + <th>Date (UTC)</th> + <th>ATTUID</th> + <th>Action</th> + <th>Description</th> + </tr> + </thead> + <tbody id="myTable"> + <% for (var x=0; x<pageInfo.rows.length; x++) { %> + <tr> + <td><%= pageInfo.rows[x].date %></td> + <td><%= pageInfo.rows[x].attuid %></td> + <td><%= pageInfo.rows[x].action %></td> + <td><%= pageInfo.rows[x].desc %></td> + </tr> + <% } %> + </tbody> + </table> + </div> +</div> + + + + <div class="container-fluid"> + <div class="row"> + <div class="col-md-1 text-left"> + <p> Page <%= pageInfo.currentPage %> of <%= pageInfo.pageCount %></p> + </div> + <div class="col-md-11 text-left"> + <% if (pageInfo.pageCount > 1) { %> + <ul class="pagination"> + <% if (pageInfo.currentPage > 1) { %> + <li><a href="/logs/pageUserTrace?page=1">«</a></li> + <% } %> + <% var i = 1; + if (pageInfo.currentPage > 10) { + i = +pageInfo.currentPage - 9; + } %> + <% if (i !== 1) { %> + <!--<li class="disabled"><a href="#">...</a></li>--> + <% } %> + <% for (i; i<=pageInfo.pageCount; i++) { %> + <% if (pageInfo.currentPage == i) { %> + <li class="active"><span><%= i %> <span class="sr-only">(current)</span></span></li> + <% } else { %> + <li><a href="/logs/pageUserTrace?page=<%= i %>"><%= i %></a></li> + <% } %> + <% if (i == (+pageInfo.currentPage + 9)) { %> + <!--<li class="disabled"><a href="#">...</a></li>--> + <% break; } %> + <% } %> + <% if (pageInfo.currentPage != pageInfo.pageCount) { %> + <li><a href="/logs/pageUserTrace?page=<%= pageInfo.pageCount %>">»</a></li> + <% } %> + </ul> + <% } %> + </div><!-- col-md-10 --> + </div><!-- row --> + </div><!-- container-fluid --> + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/mobility/displayVnfData.ejs b/admportal/views/mobility/displayVnfData.ejs new file mode 100644 index 00000000..596feb66 --- /dev/null +++ b/admportal/views/mobility/displayVnfData.ejs @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <title>SDN-C AdminPortal</title> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> +</head> +<body> + + +<div class="actions" style="padding:0px 25px;"> +<h2>VNF Data</h2> +</div> + +<div class="container-fluid"> +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <pre class='alert alert-success' role='alert'><%=JSON.stringify(result.msg,null,4) %></pre> + <% } else { %> + <pre class='alert alert-danger' role='danger'><%=result.msg %></pre> + <% } %> + <% } %> +<% } %> +</div> + + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/mobility/displayVnfNetworkData.ejs b/admportal/views/mobility/displayVnfNetworkData.ejs new file mode 100644 index 00000000..e2bcd637 --- /dev/null +++ b/admportal/views/mobility/displayVnfNetworkData.ejs @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <title>SDN-C AdminPortal</title> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> +</head> +<body> + + +<div class="actions" style="padding:0px 25px;"> +<h2>VNF Network Data</h2> +</div> + +<div class="container-fluid"> +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <pre class='alert alert-success' role='alert'><%=JSON.stringify(result.msg,null,4) %></pre> + <% } else { %> + <pre class='alert alert-danger' role='danger'><%=result.msg %></pre> + <% } %> + <% } %> +<% } %> +</div> + + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/mobility/vmNetworks.ejs b/admportal/views/mobility/vmNetworks.ejs new file mode 100644 index 00000000..6394c44d --- /dev/null +++ b/admportal/views/mobility/vmNetworks.ejs @@ -0,0 +1,198 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vm_networks').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>VM Networks </h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_vm_network"> + Add VM Network + </button> + </div> + <% } %> + + <table id="vm_networks" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*VNF_TYPE</th> + <th>*VM_TYPE</th> + <th>*NETWORK_ROLE</th> + <th>IP_COUNT</th> + <th>ASSIGN_IPS</th> + <th>ASSIGN_MACS</th> + <th>ASSIGN_FLOATING_IP</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.vnf_type %></td> + <td><%= row.vm_type %></td> + <td><%= row.network_role %></td> + <td><%= row.ip_count %></td> + <td><%= (row.assign_ips == '1') ? 'true' : 'false' %></td> + <td><%= (row.assign_macs == '1') ? 'true' : 'false' %></td> + <td><%= (row.assign_floating_ip == '1') ? 'true' : 'false' %></td> + <% if(priv == 'A' ) { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteVmNetwork('<%= row.vnf_type %>', '<%= row.vm_type %>', '<%= row.network_role %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/mobility/uploadVmNetworks" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + </form> + </div> + <% } %> +</div> + +<% include ../partials/vm_networks %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> + +function addVmNetwork(form) +{ + var errorMsg=''; + var vnf_type=''; + var vm_type=''; + var network_role=''; + var ip_count = ''; + var assign_ips=''; + var assign_macs=''; + var assign_floating_ip=''; + + if ( form.name == 'addForm' ) + { + vnf_type = form.nf_vnf_type; + vm_type = form.nf_vm_type; + network_role = form.nf_network_role; + ip_count = form.nf_ip_count; + assign_ips = form.nf_assign_ips; + assign_macs = form.nf_assign_macs; + assign_floating_ip = form.nf_assign_floating_ip; + } + + if ( (vnf_type.value == null) || (vnf_type.value == "") || isblank(vnf_type.value) ) + { + errorMsg += 'VNF Type is required.<br>'; + } + if ( (vm_type.value == null) || (vm_type.value == "") || isblank(vm_type.value) ) + { + errorMsg += 'VM Type is required.<br>'; + } + if ( (network_role.value == null) || (network_role.value == "") || isblank(network_role.value) ){ + errorMsg += 'Network Role is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + if (ip_count.value.length >0 && !isDigit(ip_count.value) ) + { + bootbox.alert('VM Count must be a number.'); + return; + } + if (assign_ips.value == 'true' && ip_count.value.length == 0) + { + bootbox.alert("If ASSIGN IPS equals 'true', IP COUNT must be populated with a number."); + return; + } + + form.submit(); +} + +function deleteVmNetwork(vnf_type,vm_type,network_role) { + + bootbox.confirm({ + message: "Are you sure you want to delete VM_NETWORK [" + vnf_type + "]" + "[" + vm_type + "][" + network_role + "]", + callback: function(result) { + if ( result ) + { + location.assign("/mobility/deleteVmNetwork?vnf_type=" + vnf_type + "&vm_type=" + vm_type + "&network_role=" + network_role); + + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/mobility/vmProfile.ejs b/admportal/views/mobility/vmProfile.ejs new file mode 100644 index 00000000..f702e51a --- /dev/null +++ b/admportal/views/mobility/vmProfile.ejs @@ -0,0 +1,173 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vm_profile').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>VM Profile </h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_vm_profile"> + Add VM Profile + </button> + </div> + <% } %> + + <table id="vm_profile" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*VNF_TYPE</th> + <th>*VM_TYPE</th> + <th>VM_COUNT</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.vnf_type %></td> + <td><%= row.vm_type %></td> + <td><%= row.vm_count %></td> + <% if(priv == 'A' ) { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteVmProfile('<%= row.vnf_type %>', '<%= row.vm_type %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/mobility/uploadVmProfile" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + </form> + </div> + <% } %> +</div> + +<% include ../partials/vm_profile %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> + +function addVmProfile(form) +{ + var errorMsg=''; + var vnf_type=''; + var vm_type=''; + var vm_count=''; + + if ( form.name == 'addForm' ) + { + vnf_type = form.nf_vnf_type; + vm_type = form.nf_vm_type; + vm_count = form.nf_vm_count; + } + + if ( (vnf_type.value == null) || (vnf_type.value == "") || isblank(vnf_type.value) ) + { + errorMsg += 'VNF Type is required.<br>'; + } + if ( (vm_type.value == null) || (vm_type.value == "") || isblank(vm_type.value) ) + { + errorMsg += 'VM Type is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + + if ( vm_count.value.length > 0 && !isDigit(vm_count.value) ) + { + bootbox.alert('VM Count must be a number.'); + return; + } + form.submit(); +} + +function deleteVmProfile(vnf_type, vm_type) { + + bootbox.confirm({ + message: "Are you sure you want to delete VM_PROFILE [" + vnf_type + "][" + vm_type + "]", + callback: function(result) { + if ( result ) + { + location.assign("/mobility/deleteVmProfile?vnf_type=" + vnf_type + "&vm_type=" + vm_type); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/mobility/vnfNetworks.ejs b/admportal/views/mobility/vnfNetworks.ejs new file mode 100644 index 00000000..a4a9f170 --- /dev/null +++ b/admportal/views/mobility/vnfNetworks.ejs @@ -0,0 +1,163 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vnf_networks').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>VNF Networks </h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_vnf_network"> + Add VNF Network + </button> + </div> + <% } %> + + <table id="vnf_networks" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*VNF_TYPE</th> + <th>*NETWORK_ROLE</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.vnf_type %></td> + <td><%= row.network_role %></td> + <% if(priv == 'A' ) { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteVnfNetwork('<%= row.vnf_type %>', '<%= row.network_role %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/mobility/uploadVnfNetworks" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + </form> + </div> + <% } %> +</div> + +<% include ../partials/vnf_network %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> + +function addVnfNetwork(form) +{ + var errorMsg=''; + var vnf_type=''; + var network_role=''; + + if ( form.name == 'addForm' ) + { + vnf_type = form.nf_vnf_type; + network_role = form.nf_network_role; + } + + if ( (vnf_type.value == null) || (vnf_type.value == "") || isblank(vnf_type.value) ) + { + errorMsg += 'VNF Type is required.<br>'; + } + if ( (network_role.value == null) || (network_role.value == "") || isblank(network_role.value) ) + { + errorMsg += 'Network Role is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + form.submit(); +} + +function deleteVnfNetwork(vnf_type, network_role) { + + bootbox.confirm({ + message: "Are you sure you want to delete VNF_NETWORK [" + vnf_type + "][" + network_role + "]", + callback: function(result) { + if ( result ) + { + location.assign("/mobility/deleteVnfNetwork?vnf_type=" + vnf_type + "&network_role=" + network_role); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/mobility/vnfPreloadData.ejs b/admportal/views/mobility/vnfPreloadData.ejs new file mode 100644 index 00000000..69f02e59 --- /dev/null +++ b/admportal/views/mobility/vnfPreloadData.ejs @@ -0,0 +1,244 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vnf_data').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + + +</head> +<body> + +<div class="well well-sm"> +<h3>Pre-load VNF Data</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <table id="vnf_data" class="table table-hover table-condensed"> + <thead> + <tr> + <th>ID</th> + <th>SVC_REQUEST_ID</th> + <th>VNF_NAME</th> + <th>VNF_TYPE</th> + <th>SVC_ACTION</th> + <th>UPLOAD STATUS</th> + <th>FILENAME</th> + <th>IMPORT/UPLOAD TIMESTAMP</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% var i=0; retData.forEach( function(rowObj) { %> + <tr> + <td><%= rowObj.row.id %></td> + <td><a href="javascript:getVnfData('<%= rowObj.vnf_name %>','<%= rowObj.vnf_type %>');"><%= rowObj.row.svc_request_id %></a></td> + <td><%= rowObj.vnf_name %></td> + <td><%= rowObj.vnf_type %></td> + <td><%= rowObj.row.svc_action %></td> + <td><%= rowObj.row.status %></td> + <td> + <a data-toggle="collapse" + href="#collapseExample<%= i %>" aria-expanded="false" + aria-controls="collapseExample"><%= rowObj.row.filename %> + </a> + <div class="collapse" id="collapseExample<%= i %>"> + <div class="well"> + <pre><%= JSON.stringify(rowObj.filecontent,null,4) %></pre> + </div> + </div> + </td> + + <td><%= rowObj.row.ts %></td> + <% if(priv == 'A' ) { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteVnfData('<%= rowObj.row.id %>','<%= rowObj.row.svc_request_id %>','<%= rowObj.row.filename %>','<%= rowObj.row.status %>','<%= rowObj.vnf_name %>','<%= rowObj.vnf_type %>');">Delete</button> + <% if (typeof rowObj.vnf_name != 'undefined' || typeof rowObj.vnf_type != 'undefined'){ %> + <button type="button" class="btn btn-default btn-xs" + onclick="loadVnfData('<%= rowObj.row.id %>','<%= rowObj.row.svc_request_id %>','<%= rowObj.row.svc_action %>','<%= rowObj.row.status %>','<%= rowObj.row.filename %>','<%= rowObj.row.ts %>');">Load Data</button> + <% } %> + </td> + <% } %> + </tr> + <% i++; }); %> + </tbody> + </table> + + <% if(priv == 'A'){ %> + <div class="row"> + <div class="col-md-8 col-md-push-4"> + <form method="POST" action="/mobility/uploadVnfData" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">Upload pre processed JSON file.</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a JSON file to upload.</p> + <button type="button" class="btn btn-default" + data-toggle="tooltip" data-placement="bottom" + title="Upload a JSON file that has already been pre processed." + onclick="uploadFile(this.form);">Upload JSON File</button> + </div> + </form> + </div> + <div class="col-md-4 col-md-pull-8"> + <form method="POST" action="/preload/uploadVnfCsv" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">Upload Worksheet CSV files from the <%= preloadImportDirectory %> directory.</label> + <input name="filename" type="file" id="dest" multiple> + <p class="help-block">Choose Worksheet CSV files to upload.</p> + <button type="button" class="btn btn-default" + data-toggle="tooltip" data-placement="bottom" + title="Must upload all the VNF CSV files from <%= preloadImportDirectory %>" + onclick="importWorksheet(this.form);">Upload VNF Worksheet CSV files + </button> + </div> + </form> + </div> + </div> + <% } %> +</div> + +<% include ../partials/add_service_homing %> +<% include ../partials/update_service_homing %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> + +function importWorksheet(form) +{ + if ( form.filename.value.length == 0) + { + bootbox.alert('Must select a file.'); + return false; + } + else { + + bootbox.confirm({ + message: "Are you sure you want to import VNF WORKSHEET .csv files from <%= preloadImportDirectory %>", + callback: function(result) { + if ( result ) + { + form.submit(); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); + } +} + + +function getVnfData(vnf_name,vnf_type,svc_request_id) +{ + location.assign("/mobility/viewVnfData?vnf_name=" + vnf_name + "&vnf_type=" + vnf_type ); + return; +} +function loadVnfData(id,svc_request_id,svc_action,status,filename,ts) +{ + if ( status != 'pending' ) + { + bootbox.alert("Upload Status must be in 'pending' state."); + return; + } + bootbox.confirm({ + message: "Are you sure you want to load file [" + filename + "]? ", + callback: function(result) { + if ( result ) + { + location.assign("/mobility/loadVnfData?id=" + id + "&svc_request_id=" + svc_request_id + "&filename=" + filename + "&status=" + status); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +function deleteVnfData(id,svc_request_id,filename,status,vnf_name,vnf_type) { + + bootbox.confirm({ + message: "Are you sure you want to delete uploaded file [" + filename + "]? ", + callback: function(result) { + if ( result ) + { + location.assign("/mobility/deleteVnfData?id=" + + id + + "&svc_request_id=" + svc_request_id + + "&filename=" + filename + + "&status=" + status + + "&vnf_name=" + vnf_name + + "&vnf_type=" + vnf_type); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/mobility/vnfPreloadNetworkData.ejs b/admportal/views/mobility/vnfPreloadNetworkData.ejs new file mode 100644 index 00000000..099dcba5 --- /dev/null +++ b/admportal/views/mobility/vnfPreloadNetworkData.ejs @@ -0,0 +1,242 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#preload_vnf_data').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + + +</head> +<body> + +<div class="well well-sm"> +<h3>Pre-load VNF Network Data</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <table id="preload_vnf_data" class="table table-hover table-condensed"> + <thead> + <tr> + <th>ID</th> + <th>SVC_REQUEST_ID</th> + <th>NETWORK_NAME</th> + <th>NETWORK_TYPE</th> + <th>SVC_ACTION</th> + <th>UPLOAD STATUS</th> + <th>FILENAME</th> + <th>IMPORT/UPLOAD TIMESTAMP</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% var i=0; retData.forEach( function(rowObj) { %> + <tr> + <td><%= rowObj.row.id %></td> + <td><a href="javascript:getVnfNetworkData('<%= rowObj.network_name %>','<%= rowObj.network_type %>');"><%= rowObj.row.svc_request_id %></a></td> + <td><%= rowObj.network_name %></td> + <td><%= rowObj.network_type %></td> + <td><%= rowObj.row.svc_action %></td> + <td><%= rowObj.row.status %></td> + <td> + <a data-toggle="collapse" + href="#collapseExample<%= i %>" aria-expanded="false" + aria-controls="collapseExample"><%= rowObj.row.filename %> + </a> + <div class="collapse" id="collapseExample<%= i %>"> + <div class="well"> + <pre><%= JSON.stringify(rowObj.filecontent,null,4) %></pre> + </div> + </div> + </td> + + <td><%= rowObj.row.ts %></td> + <% if(priv == 'A' ) { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteVnfNetworkData('<%= rowObj.row.id %>','<%= rowObj.row.svc_request_id %>','<%= rowObj.row.filename %>','<%= rowObj.row.status %>','<%= rowObj.network_name %>','<%= rowObj.network_type %>');">Delete</button> + <% if (typeof rowObj.network_name != 'undefined' || typeof rowObj.network_type != 'undefined'){ %> + <button type="button" class="btn btn-default btn-xs" + onclick="loadVnfNetworkData('<%= rowObj.row.id %>','<%= rowObj.row.svc_request_id %>','<%= rowObj.row.svc_action %>','<%= rowObj.row.status %>','<%= rowObj.row.filename %>','<%= rowObj.row.ts %>');">Load Data</button> + <% } %> + </td> + <% } %> + </tr> + <% i++; }); %> + </tbody> + </table> + + <% if(priv == 'A'){ %> +<div class="row"> + <div class="col-md-8 col-md-push-4"> + <form method="POST" action="/mobility/uploadVnfNetworkData" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">Upload pre processed JSON file.</label> + <input name="filename" type="file" id="dest"></input> + <p class="help-block">Choose a JSON file to upload.</p> + <button type="button" class="btn btn-default" + data-toggle="tooltip" data-placement="bottom" + title="Upload a JSON file that has already been pre processed." + onclick="uploadFile(this.form);">Upload JSON File + </button> + </div> + </form> + </div> + <div class="col-md-4 col-md-pull-8"> + <form method="POST" action="/preload/uploadNetworkCsv" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">Upload Worksheet CSV files from the <%= preloadImportDirectory %> directory.</label> + <input name="filename" type="file" id="dest" multiple></input> + <p class="help-block">Choose Worksheet CSV files to upload.</p> + <button type="button" class="btn btn-default" + data-toggle="tooltip" data-placement="bottom" + title="Must upload all the VNF CSV files from <%= preloadImportDirectory %>" + onclick="importWorksheet(this.form);">Upload Network Worksheet CSV files + </button> + </div> + </form> + </div> +</div> + <% } %> +</div> + +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> + +function importWorksheet(form) +{ + if ( form.filename.value.length == 0) + { + bootbox.alert('Must select a file.'); + return false; + } + else { + + bootbox.confirm({ + message: "Are you sure you want to import Network WORKSHEET .csv files from <%= preloadImportDirectory %>", + callback: function(result) { + if ( result ) + { + form.submit(); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); + } +} + +function getVnfNetworkData(network_name,network_type) +{ + location.assign("/mobility/viewVnfNetworkData?network_name=" + network_name + "&network_type=" + network_type ); + return; +} +function loadVnfNetworkData(id,svc_request_id,svc_action,status,filename,ts) +{ + if ( status != 'pending' ) + { + bootbox.alert("Upload Status must be in 'pending' state."); + return; + } + bootbox.confirm({ + message: "Are you sure you want to load file [" + filename + "]? ", + callback: function(result) { + if ( result ) + { + location.assign("/mobility/loadVnfNetworkData?id=" + id + "&svc_request_id=" + svc_request_id + "&filename=" + filename + "&status=" + status); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +function deleteVnfNetworkData(id,svc_request_id,filename,status,network_name,network_type) { + + bootbox.confirm({ + message: "Are you sure you want to delete uploaded file [" + filename + "]? ", + callback: function(result) { + if ( result ) + { + location.assign("/mobility/deleteVnfNetworkData?id=" + + id + + "&svc_request_id=" + svc_request_id + + "&filename=" + filename + + "&status=" + status + + "&network_name=" + network_name + + "&network_type=" + network_type); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/mobility/vnfProfile.ejs b/admportal/views/mobility/vnfProfile.ejs new file mode 100644 index 00000000..1a494985 --- /dev/null +++ b/admportal/views/mobility/vnfProfile.ejs @@ -0,0 +1,177 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vnf_profile').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>VNF Profile </h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> + + <table id="vnf_profile" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*VNF_TYPE</th> + <th>AVAILABILITY_ZONE_COUNT</th> + <th>EQUIPMENT_ROLE</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.vnf_type %></td> + <td><%= row.availability_zone_count %></td> + <td><%= row.equipment_role %></td> + <% if(priv == 'A' ) { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteVnfProfile('<%= row.vnf_type %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/mobility/uploadVnfProfile" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + </form> + </div> + <% } %> +</div> + +<% include ../partials/vnf_profile %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> + +function addVnfProfile(form) +{ + var errorMsg=''; + var vnf_type=''; + var availability_zone_count=''; + var equipment_role=''; + + if ( form.name == 'addForm' ) + { + vnf_type = form.nf_vnf_type; + availability_zone_count = form.nf_availability_zone_count; + equipment_role = form.nf_equipment_role; + } + + if ( (vnf_type.value == null) || (vnf_type.value == "") || isblank(vnf_type.value) ) + { + errorMsg += 'VNF Type is required.<br>'; + } + if ( (availability_zone_count.value == null) || (availability_zone_count.value == "") || isblank(availability_zone_count.value) ) + { + errorMsg += 'Availability Zone Count is a required field.<br>'; + } + if ( (equipment_role.value == null) || (equipment_role.value == "") || isblank(equipment_role.value) ) + { + errorMsg += 'Equipment Role is a required field.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + if ( availability_zone_count.value.length > 0 && !isDigit(availability_zone_count.value) ) + { + bootbox.alert('Availability Zone Count must be a number.'); + return; + } + form.submit(); +} + +function deleteVnfProfile(vnf_type) { + + bootbox.confirm({ + message: "Are you sure you want to delete VNF_PROFILE [" + vnf_type + "]", + callback: function(result) { + if ( result ) + { + location.assign("/mobility/deleteVnfProfile?vnf_type=" + vnf_type); + + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/odl/cluster_status.ejs b/admportal/views/odl/cluster_status.ejs new file mode 100644 index 00000000..e7590dfe --- /dev/null +++ b/admportal/views/odl/cluster_status.ejs @@ -0,0 +1,84 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +</head> +<body> + +<div class="well well-sm"> +<h3>SDN-C Cluster Status</h3> +</div> + + +<div class="container-fluid"> + <table class="table table-hover table-condensed"> + <thead> + <tr> + <th>ShardName</th> + <th>Status</th> + <th>Leader</th> + <th>RaftState</th> + <th>View Response</th> + </tr> + </thead> + <tbody> + <% var i=0; if (response_obj != 'undefined' ) { + response_obj.forEach(function(request) { %> + + <% if ( request.status == '200' ){ %> + + <tr> + <td><%= request['value']['ShardName'] %></td> + <td><%= request.status %></td> + <td><%= request['value']['Leader'] %></td> + <td><%= request['value']['RaftState'] %></td> + <td> + <a class="btn btn-link" data-toggle="collapse" + href="#collapseExample<%= i %>" aria-expanded="false" + aria-controls="collapseExample"><%= request['value']['ShardName'] %> + </a> + <div class="collapse" id="collapseExample<%= i %>"> + <div class="well"> + <pre><%= JSON.stringify(request,null,4) %></pre> + </div> + </div> + </td> + </tr> + <% } else { %> + <tr> + <td> </td> + <td><%= request.status %></td> + <td> </td> + <td> </td> + <td> + <a class="btn btn-link" data-toggle="collapse" + href="#collapseExample<%= i %>" aria-expanded="false" + aria-controls="collapseExample">View + </a> + <div class="collapse" id="collapseExample<%= i %>"> + <div class="well"> + <pre><%= JSON.stringify(request,null,4) %></pre> + </div> + </div> + </td> + </tr> + + <% } %> + <% i++; }); }; %> + + </tbody> + </table> +</div> + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/odl/listVRlan.ejs b/admportal/views/odl/listVRlan.ejs new file mode 100644 index 00000000..93eedace --- /dev/null +++ b/admportal/views/odl/listVRlan.ejs @@ -0,0 +1,1069 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <title>SDN-C AdminPortal</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> +</head> +<body> + +<h2>VR-LAN</h2> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + +<div class="container-fluid"> +<div class="content"> + +<% if ( typeof response_obj['vr-lan']['routing-protocol'] != 'undefined' ){ %> + <div class="content"> + service-instance-id: <%= svc_instance_id %><br> + routing-protocol : <%= response_obj['vr-lan']['routing-protocol'] %> + </div> +<% } %> + +<table class="tree"> + +<% var i=1; root_node=1; +if ( typeof response_obj['vr-lan'] != 'undefined' ) +{ + if( typeof response_obj['vr-lan']['vr-lan-interface'] != 'undefined' ) + { + response_obj['vr-lan']['vr-lan-interface'].forEach(function(request) { + var root_node = i %> + + <tr class="treegrid-<%= i %>"> + <td>vr-lan-interface</td> + </tr> + <% i++; %> + + <% if ( request['vr-designation'] != 'undefined') + { + var vr_designation = request['vr-designation']; + } %> + + <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>"> + <td> + <a href="javascript:vrlan_interface( + '<%= svc_instance_id %>', + '<%= request['vr-designation'] %>', + '<%= request['v6-vr-lan-prefix'] %>', + '<%= request['v6-vr-lan-prefix-length'] %>', + '<%= request['v6-vce-wan-address'] %>', + '<%= request['v4-vr-lan-prefix-length'] %>', + '<%= request['v4-vr-lan-prefix'] %>', + '<%= request['t-defaulted-v6-vrlan'] %>', + '<%= request['v4-vce-loopback-address'] %>');">vr-lan-interface</a> + </td> + </tr> + <% i++; %> + + <% if ( (typeof request['v6-public-lan-prefixes'] != 'undefined') && (typeof request['v6-public-lan-prefixes']['t-provided-v6-lan-public-prefixes'] != 'undefined') ) + { %> + <% request['v6-public-lan-prefixes']['t-provided-v6-lan-public-prefixes'].forEach(function(trequest){ var t_v6_root = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>"> + <td>v6-public-lan-prefixes</td> + </tr> + <% i++; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= t_v6_root %>"> + <td> + <a href="javascript:t_provided_v6_prefixes( + '<%= svc_instance_id %>', + '<%= trequest['request-index'] %>', + '<%= trequest['v6-next-hop-address'] %>', + '<%= trequest['v6-lan-public-prefix-length'] %>', + '<%= trequest['v6-lan-public-prefix'] %>');">t-provided-v6-lan-public-prefixes</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + + <% if ( typeof request['dhcp'] != 'undefined' ) + { %> + <% var dhcp_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>"> + <td>dhcp</td> + </tr> + <% i++; %> + + <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>"> + <td> + <a href="javascript:dhcp( + '<%= svc_instance_id %>', + '<%= request['dhcp']['use-v4-default-pool'] %>', + '<%= request['dhcp']['use-v6-default-pool'] %>', + '<%= request['dhcp']['v4-dhcp-server-enabled'] %>', + '<%= request['dhcp']['v6-dhcp-server-enabled'] %>', + '<%= request['dhcp']['v6-dhcp-default-pool-prefix'] %>', + '<%= request['dhcp']['v6-dhcp-default-pool-prefix-length'] %>', + '<%= request['dhcp']['v4-dhcp-default-pool-prefix'] %>', + '<%= request['dhcp']['v4-dhcp-default-pool-prefix-length'] %>');">dhcp</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof request['dhcp']['v4-dhcp-pools'] != 'undefined' ) + { %> + <% var v4_dhcp_pools_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>"> + <td>v4-dhcp-pool</td> + </tr> + <% i++; %> + + <% request['dhcp']['v4-dhcp-pools'].forEach(function(v4request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>"> + <td> + <a href="javascript:v4_dhcp_pools( + '<%= svc_instance_id %>', + '<%= v4request['v4-dhcp-relay-next-hop-address'] %>', + '<%= v4request['v4-dhcp-pool-prefix'] %>', + '<%= v4request['v4-dhcp-pool-prefix-length'] %>', + '<%= v4request['v4-dhcp-relay-gateway-address'] %>');">v4-dhcp-pools</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof v4request['excluded-v4-address'] != 'undefined' ) + { %> + <% var excluded_v4_address_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_dhcp_node %>"> + <td>exluded-v4-address</td> + </tr> + <% i++; %> + + <% v4request['excluded-v4-addresses'].forEach(function(ex_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= excluded_v4_address_node %>"> + <td> + <a href="javascript:excluded_v4_address( + '<%= svc_instance_id %>', + '<%= ex_request['excluded-v4-address'] %>');">excluded-v4-address</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% }); %> + <% } %> + + <% if ( typeof request['dhcp']['excluded-v4-dhcp-addresses-from-default-pool'] != 'undefined' ) + { %> + <% var exc_v4_address_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>"> + <td>excluded-v4-dhcp-addresses-from-default-pool</td> + </tr> + <% i++; %> + + <% request['dhcp']['excluded-v4-dhcp-addresses-from-default-pool'].forEach(function(ex_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= exc_v4_address_node %>"> + <td> + <a href="javascript:excluded_v4_addresses_from_default_pool( + '<%= svc_instance_id %>', + '<%= ex_request['excluded-v4-address'] %>');">excluded-v4-dhcp-addresses-from-default-pool</a> + </td> + </tr> + </tr> + <% i++; %> + <% }); %> + <% } %> + + <% if ( typeof request['dhcp']['v6-dhcp-pools'] != 'undefined' ) + { %> + <% var v6_dhcp_pools_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>"> + <td>v6-dhcp-pool</td> + </tr> + <% i++; %> + + <% request['dhcp']['v6-dhcp-pools'].forEach(function(v6request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>"> + <td> + <a href="javascript:v6_dhcp_pools( + '<%= svc_instance_id %>', + '<%= v6request['v6-dhcp-relay-next-hop-address'] %>', + '<%= v6request['v6-dhcp-pool-prefix'] %>', + '<%= v6request['v6-dhcp-pool-prefix-length'] %>', + '<%= v6request['v6-dhcp-relay-gateway-address'] %>');">v6-dhcp-pools</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof v4request['excluded-v6-addresses'] != 'undefined' ) + { %> + <% var excluded_v6_address_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_dhcp_node %>"> + <td>exluded-v6-address</td> + </tr> + <% i++; %> + + <% v6request['excluded-v6-addresses'].forEach(function(ex_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= excluded_v6_address_node %>"> + <td> + <a href="javascript:excluded_v6_address( + '<%= svc_instance_id %>', + '<%= ex_request['excluded-v6-address'] %>');">excluded-v6-address</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% }); %> + <% } %> + + <% if ( typeof request['dhcp']['excluded-v6-dhcp-addresses-from-default-pool'] != 'undefined' ) + { %> + <% var exc_v6_address_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>"> + <td>excluded-v6-dhcp-addresses-from-default-pool</td> + </tr> + <% i++; %> + + <% request['dhcp']['excluded-v6-dhcp-addresses-from-default-pool'].forEach(function(ex_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= exc_v6_address_node %>"> + <td> + <a href="javascript:excluded_v6_addresses_from_default_pool( + '<%= svc_instance_id %>', + '<%= ex_request['excluded-v6-address'] %>');">excluded-v6-dhcp-addresses-from-default-pool</a> + </td> + </tr> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% } %> + + <% if ( typeof request['firewall-lite'] != 'undefined' ) + { %> + <% var firewall_lite_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>"> + <td>firewall-lite</td> + </tr> + <% i++; %> + + <tr class="treegrid-<%= i %> treegrid-parent-<%= firewall_lite_node %>"> + <td> + <a href="javascript:firewall_lite( + '<%= svc_instance_id %>', + '<%= vr_designation %>', + '<%= request['firewall-lite']['stateful-firewall-lite-v6-enabled'] %>', + '<%= request['firewall-lite']['stateful-firewall-lite-v4-enabled'] %>');">firewall-lite</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof request['firewall-lite']['v6-firewall-packet-filters'] != 'undefined' ) + { + var v6_firewall_packet_filters_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= firewall_lite_node %>"> + <td>v6-firewall-packet-filters</td> + </tr> + <% i++; %> + + <% request['firewall-lite']['v6-firewall-packet-filters'].forEach(function(v6request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_firewall_packet_filters_node %>"> + <td> + <a href="javascript:v6_firewall_packet_filters( + '<%= svc_instance_id %>', + '<%= v6request['v6-firewall-prefix'] %>', + '<%= v6request['v6-firewall-prefix-length'] %>', + '<%= v6request['allow-icmp-ping'] %>');">v6-firewall-packet-filters</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof v6request['udp-port-list'] != 'undefined' ) + { %> + <% v6request['udp-port-list'].forEach(function(udp_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_firewall_packet_filters_node %>"> + <td> + <a href="javascript:udp_port_list( + '<%= svc_instance_id %>', + '<%= udp_request['port-number'] %>');">udp-port-list</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% if ( typeof v6p_request['tcp-port-list'] != 'undefined' ) + { %> + <% v6request['tcp-port-list'].forEach(function(tcp_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_firewall_packet_filters_node %>"> + <td> + <a href="javascript:tcp_port_list( + '<%= svc_instance_id %>', + '<%= tcp_request['port-number'] %>');">tcp-port-list</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% }); %> + <% } %> + <% if ( typeof request['firewall-lite']['v4-firewall-packet-filters'] != 'undefined' ) + { + var v4_firewall_packet_filters_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= firewall_lite_node %>"> + <td>v4-firewall-packet-filters</td> + </tr> + <% i++; %> + + <% request['firewall-lite']['v4-firewall-packet-filters'].forEach(function(v4request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_firewall_packet_filters_node %>"> + <td> + <a href="javascript:v4_firewall_packet_filters( + '<%= svc_instance_id %>', + '<%= v4request['v4-firewall-prefix'] %>', + '<%= v4request['v4-firewall-prefix-length'] %>', + '<%= v4request['allow-icmp-ping'] %>');">v4-firewall-packet-filters</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof v4request['udp-port-list'] != 'undefined' ) + { %> + <% v4request['udp-port-list'].forEach(function(udp_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_firewall_packet_filters_node %>"> + <td> + <a href="javascript:udp_port_list( + '<%= svc_instance_id %>', + '<%= udp_request['port-number'] %>');">udp-port-list</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% if ( typeof v4p_request['tcp-port-list'] != 'undefined' ) + { %> + <% v4request['tcp-port-list'].forEach(function(tcp_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_firewall_packet_filters_node %>"> + <td> + <a href="javascript:tcp_port_list( + '<%= svc_instance_id %>', + '<%= tcp_request['port-number'] %>');">tcp-port-list</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% }); %> + <% } %> + + <% } %> + + <% if ( typeof request['static-routes'] != 'undefined' ) + { + var static_route_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>"> + <td>static-routes</td> + </tr> + <% i++; %> + <% if ( typeof request['static-routes']['v6-static-routes'] != 'undefined' ) + { %> + <% v6_static_route = i %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= static_route_node %>"> + <td>v6-static-routes</td> + </tr> + <% i++; %> + + <% request['static-routes']['v6-static-routes'].forEach(function(strequest){ %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_static_route %>"> + <td> + <a href="javascript:v6_static_routes( + '<%= svc_instance_id %>', + '<%= strequest['v6-static-route-prefix'] %>', + '<%= strequest['v6-next-hop-address'] %>', + '<%= strequest['v6-static-route-prefix-length'] %>');">v6-static-routes</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% if ( typeof request['static-routes']['v4-static-routes'] != 'undefined' ) + { %> + <% v4_static_route = i %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= static_route_node %>"> + <td>v4-static-routes</td> + </tr> + <% i++; %> + <% request['static-routes']['v4-static-routes'].forEach(function(v4request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_static_route %>"> + <td> + <a href="javascript:v4_static_routes( + '<%= svc_instance_id %>', + '<%= v4request['v4-static-route-prefix'] %>', + '<%= v4request['v4-next-hop-address'] %>', + '<%= v4request['v4-static-route-prefix-length'] %>');">v4-static-routes</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% } %> + <% if ( typeof request['pat'] != 'undefined' ) + { %> + <% var pat_node = i %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>"> + <td>pat</td> + </tr> + <% i++; %> + + <tr class="treegrid-<%= i %> treegrid-parent-<%= pat_node %>"> + <td> + <a href="javascript:pat( + '<%= svc_instance_id %>', + '<%= request['pat']['v4-pat-default-pool-prefix-length'] %>', + '<%= request['pat']['use-v4-default-pool'] %>', + '<%= request['pat']['v4-pat-enabled'] %>', + '<%= request['pat']['v4-pat-default-pool-prefix'] %>');">pat</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof request['pat']['v4-pat-pools'] != 'undefined' ) + { + var pat_pools_node = i %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= pat_node %>"> + <td>v4-pat-pools</td> + </tr> + <% i++; %> + + <% request['pat']['v4-pat-pools'].forEach(function(trequest) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= pat_pools_node %>"> + <td> + <a href="javascript:pat_pools( + '<%= svc_instance_id %>', + '<%= trequest['v4-pat-pool-next-hop-address'] %>', + '<%= trequest['v4-pat-pool-prefix-length'] %>', + '<%= trequest['v4-pat-pool-prefix'] %>');">v4-pat-pools</a> + </td> + </tr> + <% }); %> + <% i++; %> + + <% } %> + <% } %> + <% if ( typeof request['nat'] != 'undefined' ) + { %> + <% var nat_node = i %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>"> + <td>nat</td> + </tr> + <% i++; %> + + <tr class="treegrid-<%= i %> treegrid-parent-<%= nat_node %>"> + <td> + <a href="javascript:nat( + '<%= svc_instance_id %>', + '<%= request['pat']['v4-nat-enabled'] %>');">nat</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof request['nat']['v4-nat-mapping-entries'] != 'undefined' ) + { + var nat_mapping_node = i %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= nat_node %>"> + <td>v4-nat-mapping-entries</td> + </tr> + <% i++; %> + + <% request['nat']['v4-nat-mapping-entries'].forEach(function(trequest) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= nat_mapping_node %>"> + <td> + <a href="javascript:v4_nat_mapping_entries( + '<%= svc_instance_id %>', + '<%= trequest['v4-nat-external'] %>', + '<%= trequest['v4-nat-next-hop-address'] %>', + '<%= trequest['v4-nat-internal'] %>');">v4-nat-mapping-entries</a> + </td> + </tr> + <% }); %> + <% i++; %> + + <% } %> + <% } %> + + <% if ( (typeof request['v4-public-lan-prefixes'] != 'undefined') && (typeof request['v4-public-lan-prefixes']['t-provided-v4-lan-public-prefixes'] != 'undefined') ) + { %> + <% request['v4-public-lan-prefixes']['t-provided-v4-lan-public-prefixes'].forEach(function(trequest){ + var v4_public_root = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>"> + <td>v4-public-lan-prefixes</td> + </tr> + <% i++; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_public_root %>"> + <td> + <a href="javascript:t_provided_v4_prefixes( + '<%= svc_instance_id %>', + '<%= trequest['request-index'] %>', + '<%= trequest['v4-lan-public-prefix-length'] %>', + '<%= trequest['v4-lan-public-prefix'] %>');">t-provided-v4-lan-public-prefixes</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% }); + } +} else { %> + <div><pre>no data</pre></div> +<% } %> +</table> +</div> +</div> + + <% include ../partials/vr_lan_interface %> + <% include ../partials/dhcp %> + <% include ../partials/v4_dhcp_pools %> + <% include ../partials/v6_dhcp_pools %> + <% include ../partials/excluded_v4_address %> + <% include ../partials/excluded_v4_address_from_default_pool %> + <% include ../partials/excluded_v6_address_from_default_pool %> + <% include ../partials/t_provided_v6_lan_public_prefixes %> + <% include ../partials/firewall_lite %> + <% include ../partials/v6_static_routes %> + <% include ../partials/v4_static_routes %> + <% include ../partials/pat %> + <% include ../partials/pat_pools %> + <% include ../partials/nat %> + <% include ../partials/v4_nat_mapping_entries %> + <% include ../partials/t_provided_v4_lan_public_prefixes %> + <% include ../partials/v6_firewall_packet_filters %> + <% include ../partials/v4_firewall_packet_filters %> + <% include ../partials/udp_port_list %> + <% include ../partials/tcp_port_list %> + <footer> + <% include ../partials/footer %> + </footer> + +<script type="text/javascript"> + +$(document).ready(function() { + $('.tree').treegrid( { initialState: 'collapsed' } ); +}); + +function excluded_v4_addresses_from_default_pool(svc_instance_id, excluded_v4_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('excluded_v4_address_from_default_pool'); + if( excluded_v4_address != 'undefined' ){ + lvalue.value=excluded_v4_address; + } else { + lvalue.value=''; + } + $('#excluded-v4-address-from-default-pool-modal').modal('show'); +} +function excluded_v6_addresses_from_default_pool(svc_instance_id, excluded_v6_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('excluded_v6_address'); + if( excluded_v6_address != 'undefined' ){ + lvalue.value=excluded_v6_address; + } else { + lvalue.value=''; + } + $('#excluded-v6-address-modal').modal('show'); +} +function excluded_v4_addresses_from_default_pool(svc_instance_id, excluded_v4_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('excluded_v4_address'); + if( excluded_v4_address != 'undefined' ){ + lvalue.value=excluded_v4_address; + } else { + lvalue.value=''; + } + $('#excluded-v4-address-modal').modal('show'); +} +function exluded_v4_address(svc_instance_id, excluded_v4_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('excluded_v4_address'); + if( excluded_v4_address != 'undefined' ){ + lvalue.value=excluded_v4_address; + } else { + lvalue.value=''; + } + $('#excluded-v4-address-modal').modal('show'); +} + +function v6_dhcp_pools(svc_instance_id,v6_dhcp_relay_next_hop_address,v6_dhcp_pool_prefix,v6_dhcp_pool_prefix_length,v6_dhcp_relay_gateway_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v6_dhcp_relay_next_hop_address'); + if( v6_dhcp_relay_next_hop_address != 'undefined' ){ + lvalue.value=v6_dhcp_relay_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_dhcp_pool_prefix'); + if( v6_dhcp_pool_prefix != 'undefined' ){ + lvalue.value=v6_dhcp_pool_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_dhcp_pool_prefix_length'); + if( v6_dhcp_pool_prefix_length != 'undefined' ){ + lvalue.value=v6_dhcp_pool_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_dhcp_relay_gateway_address'); + if( v6_dhcp_relay_gateway_address != 'undefined' ){ + lvalue.value=v6_dhcp_relay_gateway_address; + } else { + lvalue.value=''; + } + $('#v6-dhcp-pools-modal').modal('show'); +} + +function v4_dhcp_pools(svc_instance_id,v4_dhcp_relay_next_hop_address,v4_dhcp_pool_prefix,v4_dhcp_pool_prefix_length,v4_dhcp_relay_gateway_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_dhcp_relay_next_hop_address'); + if( v4_dhcp_relay_next_hop_address != 'undefined' ){ + lvalue.value=v4_dhcp_relay_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_dhcp_pool_prefix'); + if( v4_dhcp_pool_prefix != 'undefined' ){ + lvalue.value=v4_dhcp_pool_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_dhcp_pool_prefix_length'); + if( v4_dhcp_pool_prefix_length != 'undefined' ){ + lvalue.value=v4_dhcp_pool_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_dhcp_relay_gateway_address'); + if( v4_dhcp_relay_gateway_address != 'undefined' ){ + lvalue.value=v4_dhcp_relay_gateway_address; + } else { + lvalue.value=''; + } + $('#v4-dhcp-pools-modal').modal('show'); +} + +function dhcp(svc_instance_id,use_v4_default_pool,use_v6_default_pool,v4_dhcp_server_enabled,v6_dhcp_server_enabled,v6_dhcp_default_pool_prefix,v6_dhcp_default_pool_prefix_length,v4_dhcp_default_pool_prefix,v4_dhcp_default_pool_prefix_length) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('use_v4_default_pool'); + if( use_v4_default_pool != 'undefined' ){ + lvalue.value=use_v4_default_pool; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('use_v6_default_pool'); + if( use_v6_default_pool != 'undefined' ){ + lvalue.value=use_v6_default_pool; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_dhcp_server_enabled'); + if( v4_dhcp_server_enabled != 'undefined' ){ + lvalue.value=v4_dhcp_server_enabled; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_dhcp_server_enabled'); + if( v6_dhcp_server_enabled != 'undefined' ){ + lvalue.value=v6_dhcp_server_enabled; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_dhcp_default_pool_prefix'); + if( v6_dhcp_default_pool_prefix != 'undefined' ){ + lvalue.value=v6_dhcp_default_pool_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_dhcp_default_pool_prefix_length'); + if( v6_dhcp_default_pool_prefix_length != 'undefined' ){ + lvalue.value=v6_dhcp_default_pool_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_dhcp_default_pool_prefix'); + if( v4_dhcp_default_pool_prefix != 'undefined' ){ + lvalue.value=v4_dhcp_default_pool_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_dhcp_default_pool_prefix_length'); + if( v4_dhcp_default_pool_prefix_length != 'undefined' ){ + lvalue.value=v4_dhcp_default_pool_prefix_length; + } else { + lvalue.value=''; + } + $('#dhcp-modal').modal('show'); +} + +function tcp_port_list(svc_instance_id,tcp_port_number) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('tcp_port_number'); + if( tcp_port_number != 'undefined' ){ + lvalue.value=tcp_port_number; + } else { + lvalue.value=''; + } + $('#tcp-port-list-modal').modal('show'); +} +function udp_port_list(svc_instance_id,udp_port_number) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('udp_port_number'); + if( udp_port_number != 'undefined' ){ + lvalue.value=udp_port_number; + } else { + lvalue.value=''; + } + $('#udp-port-list-modal').modal('show'); +} +function v4_firewall_packet_filters(svc_instance_id,v4_firewall_prefix,v4_firewall_prefix_length,v4_allow_icmp_ping) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_firewall_prefix'); + if( v4_firewall_prefix != 'undefined' ){ + lvalue.value=v4_firewall_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_firewall_prefix_length'); + if( v4_firewall_prefix_length != 'undefined' ){ + lvalue.value=v4_firewall_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_allow_icmp_ping'); + if( v4_allow_icmp_ping != 'undefined' ){ + lvalue.value=v4_allow_icmp_ping; + } else { + lvalue.value=''; + } + $('#v4-firewall-packet-filters-modal').modal('show'); +} + +function v6_firewall_packet_filters(svc_instance_id,v6_firewall_prefix,v6_firewall_prefix_length,v6_allow_icmp_ping) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v6_firewall_prefix'); + if( v6_firewall_prefix != 'undefined' ){ + lvalue.value=v6_firewall_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_firewall_prefix_length'); + if( v6_firewall_prefix_length != 'undefined' ){ + lvalue.value=v6_firewall_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_allow_icmp_ping'); + if( v6_allow_icmp_ping != 'undefined' ){ + lvalue.value=v6_allow_icmp_ping; + } else { + lvalue.value=''; + } + $('#v6-firewall-packet-filters-modal').modal('show'); +} function nat(svc_instance_id,v4_nat_enabled) { + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_nat_enabled'); + if( v4_nat_enabled != 'undefined' ){ + lvalue.value=v4_nat_enabled; + } else { + lvalue.value=''; + } + $('#nat-modal').modal('show'); +} +function v4_nat_mapping_entries(svc_instance_id,v4_nat_external,v4_nat_next_hop_address,v4_nat_internal) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_nat_external'); + if( v4_nat_external != 'undefined' ){ + lvalue.value=v4_nat_external; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_nat_next_hop_address'); + if( v4_nat_next_hop_address != 'undefined' ){ + lvalue.value=v4_nat_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_nat_internal'); + if( v4_nat_internal != 'undefined' ){ + lvalue.value=v4_nat_internal; + } else { + lvalue.value=''; + } + $('#v4-nat-mapping-entries-modal').modal('show'); +} +function pat_pools(svc_instance_id,v4_pat_pool_next_hop_address,v4_pat_pool_prefix_length,v4_pat_pool_prefix) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_pat_pool_next_hop_address'); + if( v4_pat_pool_next_hop_address != 'undefined' ){ + lvalue.value=v4_pat_pool_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_pat_pool_prefix_length'); + if( v4_pat_pool_prefix_length != 'undefined' ){ + lvalue.value=v4_pat_pool_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_pat_pool_prefix'); + if( v4_pat_pool_prefix != 'undefined' ){ + lvalue.value=v4_pat_pool_prefix; + } else { + lvalue.value=''; + } + $('#pat-pools-modal').modal('show'); +} +function pat(svc_instance_id,v4_pat_default_pool_prefix_length,use_v4_default_pool,v4_pat_enabled,v4_pat_default_pool_prefix) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_pat_default_pool_prefix_length'); + if( v4_pat_default_pool_prefix_length != 'undefined' ){ + lvalue.value=v4_pat_default_pool_prefix_length; + } else { + lvalue.value=''; + } + + lvalue = document.getElementById('use_v4_default_pool'); + if( use_v4_default_pool != 'undefined' ){ + lvalue.value = use_v4_default_pool; + } else { + lvalue.value = ''; + } + + lvalue = document.getElementById('v4_pat_enabled'); + if( v4_pat_enabled != 'undefined' ){ + lvalue.value = v4_pat_enabled; + } else { + lvalue.value = ''; + } + + lvalue = document.getElementById('v4_pat_default_pool_prefix'); + if( v4_pat_default_pool_prefix != 'undefined' ){ + lvalue.value = v4_pat_default_pool_prefix; + } else { + lvalue.value = ''; + } + $('#pat-modal').modal('show'); +} +function v4_static_routes(svc_instance_id,v4_static_route_prefix,static_v4_next_hop_address,v4_static_route_prefix_length) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_static_route_prefix'); + if( v4_static_route_prefix != 'undefined' ){ + lvalue.value=v4_static_route_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('static_v4_next_hop_address'); + if( static_v4_next_hop_address != 'undefined' ){ + lvalue.value=static_v4_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_static_route_prefix_length'); + if( v4_static_route_prefix_length != 'undefined' ){ + lvalue.value=v4_static_route_prefix_length; + } else { + lvalue.value=''; + } + $('#v4-static-routes-modal').modal('show'); +} + +function v6_static_routes(svc_instance_id,v6_static_route_prefix,static_v6_next_hop_address,v6_static_route_prefix_length) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v6_static_route_prefix'); + if( v6_static_route_prefix != 'undefined' ){ + lvalue.value=v6_static_route_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('static_v6_next_hop_address'); + if( static_v6_next_hop_address != 'undefined' ){ + lvalue.value=static_v6_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_static_route_prefix_length'); + if( v6_static_route_prefix_length != 'undefined' ){ + lvalue.value=v6_static_route_prefix_length; + } else { + lvalue.value=''; + } + $('#v6-static-routes-modal').modal('show'); +} +function firewall_lite(svc_instance_id,firewall_lite_vr_designation,stateful_firewall_lite_v4_enabled,stateful_firewall_lite_v6_enabled) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + document.getElementById('firewall_lite_vr_designation').value = firewall_lite_vr_designation; + var lvalue = document.getElementById('stateful_firewall_lite_v4_enabled'); + if( stateful_firewall_lite_v4_enabled != 'undefined' ){ + lvalue.value=stateful_firewall_lite_v4_enabled; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('stateful_firewall_lite_v6_enabled'); + if( stateful_firewall_lite_v6_enabled != 'undefined' ){ + lvalue.value=stateful_firewall_lite_v6_enabled; + } else { + lvalue.value=''; + } + $('#firewall-lite-modal').modal('show'); +} +function t_provided_v6_prefixes(svc_instance_id,v6_request_index,v6_lan_public_prefix_length,v6_lan_public_prefix) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v6_request_index'); + if( v6_request_index != 'undefined' ){ + lvalue.value=v6_request_index; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_lan_public_prefix_length'); + if( v6_lan_public_prefix_length != 'undefined' ){ + lvalue.value=v6_lan_public_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_lan_public_prefix'); + if( v6_lan_public_prefix != 'undefined' ){ + lvalue.value=v6_lan_public_prefix; + } else { + lvalue.value=''; + } + $('#t-provided-v6-lan-public-prefixes-modal').modal('show'); +} +function t_provided_v4_prefixes(svc_instance_id,v4_request_index,v4_lan_public_prefix_length,v4_lan_public_prefix) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_request_index'); + if( v4_request_index != 'undefined' ){ + lvalue.value=v4_request_index; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_lan_public_prefix_length'); + if( v4_lan_public_prefix_length != 'undefined' ){ + lvalue.value=v4_lan_public_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_lan_public_prefix'); + if( v4_lan_public_prefix != 'undefined' ){ + lvalue.value=v4_lan_public_prefix; + } else { + lvalue.value=''; + } + $('#t-provided-v4-lan-public-prefixes-modal').modal('show'); +} + +function vrlan_interface(svc_instance_id,vr_designation,v6_vr_lan_prefix, v6_vr_lan_prefix_length, v6_vce_wan_address, v4_vr_lan_prefix_length, v4_vr_lan_prefix, t_defaulted_v6_vrlan,v4_vce_loopback_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('vr_designation'); + if( vr_designation != 'undefined' ){ + lvalue.value=vr_designation; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_vr_lan_prefix'); + if( v6_vr_lan_prefix != 'undefined' ){ + lvalue.value=v6_vr_lan_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_vr_lan_prefix_length'); + if( v6_vr_lan_prefix_length != 'undefined' ){ + lvalue.value=v6_vr_lan_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_vce_wan_address'); + if( v6_vce_wan_address != 'undefined' ){ + lvalue.value=v6_vce_wan_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_vr_lan_prefix_length'); + if( v4_vr_lan_prefix_length != 'undefined' ){ + lvalue.value=v4_vr_lan_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_vr_lan_prefix'); + if( v4_vr_lan_prefix != 'undefined' ){ + lvalue.value=v4_vr_lan_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_vce_loopback_address'); + if( v4_vce_loopback_address != 'undefined' ){ + lvalue.value=v4_vce_loopback_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('t_defaulted_v6_vrlan'); + if( t_defaulted_v6_vrlan != 'undefined' ){ + lvalue.value=t_defaulted_v6_vrlan; + } else { + lvalue.value=''; + } + $('#vr-lan-interface-modal').modal('show'); +} +</script> + +</body> +</html> + diff --git a/admportal/views/odl/listWklst.ejs b/admportal/views/odl/listWklst.ejs new file mode 100644 index 00000000..432c2071 --- /dev/null +++ b/admportal/views/odl/listWklst.ejs @@ -0,0 +1,2224 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <title>SDN-C AdminPortal</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + +<script type="text/javascript"> +$(document).ready(function() { + $('.tree').treegrid( { initialState: 'collapsed' } ); +}); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>L3SDN-API Services</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'><%=result.msg %></div> + <% } else { %> + <div class='alert alert-danger' role='danger'><%=result.msg %></div> + <% } %> + <% } %> +<% } %> + +<div class="container-fluid"> +<div class="content"> + +<table class="table tree table-hover table-condensed"> +<% var i=1; root_node=1; +pageInfo.rows.forEach(function(request) +{ + root_node = i; %> + + <tr class="treegrid-<%= i %>"> + <td><%= request['service-instance-id'] %></td> + </tr> + <% i++; %> + + <% if ( typeof request['service-status'] != 'undefined' ) + { %> + <tr class="treegrid-<%= i %>> treegrid-parent-<%= root_node %>"> + <td> + <a class="" + href="javascript:serviceStatus( + '<%= request['service-status']['rpc-name'] %>', + '<%= request['service-status']['final-indicator'] %>', + '<%= request['service-status']['request-status'] %>', + '<%= request['service-status']['rpc-action'] %>', + '<%= request['service-status']['l3sdn-action'] %>', + '<%= request['service-status']['l3sdn-subaction'] %>', + '<%= request['service-status']['response-message'] %>', + '<%= request['service-status']['response-code'] %>', + '<%= request['service-status']['response-timestamp'] %>' );">service-status</a> + </td> + </tr> + <% i++; %> + <% } %> + <% if ( typeof request['service-data'] != 'undefined' ) + { %> + <% var service_data_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>"> + <td> service-data</td> + </tr> + <% i++; %> + + <% if ( typeof request['service-data']['internet-evc-access-information'] != 'undefined' ) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>"> + <td> + <a class="" + href="javascript:internetInfo( + '<%= request['service-data']['internet-evc-access-information']['ip-version'] %>', + '<%= request['service-data']['internet-evc-access-information']['internet-evc-speed-value'] %>', + '<%= request['service-data']['internet-evc-access-information']['internet-evc-speed-units'] %>');">internet-evc-access-information</a> + </td> + </tr> + <% i++; %> + <% } %> + <% if ( typeof request['service-data']['oper-status'] != 'undefined' ) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>"> + <td> + <a class="" + href="javascript:operStatus( + '<%= request['service-data']['oper-status']['order-status'] %>', + '<%= request['service-data']['oper-status']['modify-timestamp'] %>', + '<%= request['service-data']['oper-status']['last-svc-request-id'] %>', + '<%= request['service-data']['oper-status']['last-sub-action'] %>', + '<%= request['service-data']['oper-status']['t-defaulted-v6-vrlan'] %>', + '<%= request['service-data']['oper-status']['last-action'] %>', + '<%= request['service-data']['oper-status']['create-timestamp'] %>', + '<%= request['service-data']['oper-status']['maintenance-indicator'] %>', + '<%= request['service-data']['oper-status']['last-order-status'] %>');">oper-status</a> + </td> + </tr> + <% i = i+1; %> + <% } %> + <% if ( typeof request['service-data']['svc-topology-additional-data'] != 'undefined' ) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>"> + <td> + <a class="" + href="javascript:svcTopo( + '<%= request['service-data']['svc-topology-additional-data']['svc-vnf-type'] %>');">svc-topology-additional-data</a> + </td> + </tr> + <% i = i+1; %> + <% } %> + <% if ( typeof request['service-data']['request-information'] != 'undefined' ) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>"> + <td> + <a class="" + href="javascript:reqInfo( + '<%= request['service-data']['request-information']['notification-url'] %>', + '<%= request['service-data']['request-information']['source'] %>', + '<%= request['service-data']['request-information']['order-number'] %>', + '<%= request['service-data']['request-information']['request-id'] %>', + '<%= request['service-data']['request-information']['order-version'] %>', + '<%= request['service-data']['request-information']['request-action'] %>', + '<%= request['service-data']['request-information']['request-sub-action'] %>');">request-information</a> + </td> + </tr> + <% i = i+1; %> + <% } %> + <% if ( typeof request['service-data']['sdnc-request-header'] != 'undefined' ) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>"> + <td> + <a class="" + href="javascript:reqHeader( + '<%= request['service-data']['sdnc-request-header']['svc-notification-url'] %>', + '<%= request['service-data']['sdnc-request-header']['svc-request-id'] %>', + '<%= request['service-data']['sdnc-request-header']['svc-action'] %>');">sdnc-request-header</a> + </td> + </tr> + <% i = i+1; %> + <% } %> + <% if ( typeof request['service-data']['l2-homing-information'] != 'undefined' ) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>"> + <td> + <a class="" + href="javascript:l2Homing( + '<%= request['service-data']['l2-homing-information']['evc-name'] %>', + '<%= request['service-data']['l2-homing-information']['preferred-aic-clli'] %>', + '<%= request['service-data']['l2-homing-information']['topology'] %>');">l2-homing-information</a> + </td> + </tr> + <% i = i+1; %> + <% } %> + <% if ( typeof request['service-data']['service-information'] != 'undefined' ) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>"> + <td> + <a class="" + href="javascript:svcInfo( + '<%= request['service-data']['service-information']['service-instance-id'] %>', + '<%= request['service-data']['service-information']['subscriber-name'] %>', + '<%= request['service-data']['service-information']['service-type'] %>');">service-information</a> + </td> + </tr> + <% i++; %> + <% } %> + <% if ( typeof request['service-data']['feature-list'] != 'undefined' ) + { %> + <% var feature_list_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>"> + <td> feature-list</td> + </tr> + <% i++; %> + + <% request['service-data']['feature-list'].forEach(function(request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= feature_list_node %>"> + <td> + <a class="" + href="javascript:feature_list( + '<%= request['feature-instance-id'] %>', + '<%= request['feature-instance-xpath'] %>', + '<%= request['feature-sub-type'] %>', + '<%= request['feature-type'] %>');">feature-list</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% if ( typeof request['service-data']['svc-config-additional-data'] != 'undefined' ) + { %> + <% var svc_config_additional_data_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>"> + <td> svc-config-additional-data</td> + </tr> + <% i++; %> + + <tr class="treegrid-<%= i %> treegrid-parent-<%= svc_config_additional_data_node %>"> + <td> + <a class="" + href="javascript:svc_config_additional_data( + '<%= request['service-data']['svc-config-additional-data']['management-ip'] %>');">management-ip</a> + </td> + </tr> + <% i++; %> + <% } %> + <% if ( typeof request['service-data']['equipment'] != 'undefined' ) + { %> + <% var equipment_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>"> + <td> equipment</td> + </tr> + <% i++; %> + + <% request['service-data']['equipment'].forEach(function(equip) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= equipment_node %>"> + <td> + <a class="" + href="javascript:equipment( + '<%= equip['equipment-role'] %>', + '<%= equip['ipv4-oam-address'] %>', + '<%= equip['ipv4-oam-gateway-address-prefix-length'] %>', + '<%= equip['ptnii-name'] %>', + '<%= equip['v4-loopback0-ip-address'] %>', + '<%= equip['ipv4-oam-gateway-address'] %>');">equipment</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof equip['ipv4-infrastructure-static-route'] != 'undefined' ) + { %> + <% ipv4_infrastructure_static_route_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= equipment_node %>"> + <td> ipv4-infrastructure-static-route</td> + </tr> + <% i++; %> + + <% equip['ipv4-infrastructure-static-route'].forEach(function(eroute) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= ipv4_infrastructure_static_route_node %>"> + <td> + <a class="" + href="javascript:ipv4_infrastructure_static_route( + '<%= eroute['ipv4-outgoing-interface'] %>', + '<%= eroute['ipv4-next-hop-address'] %>', + '<%= eroute['ipv4-dest-prefix'] %>', + '<%= eroute['ipv4-dest-prefix-length'] %>');">ipv4_infrastructure_static_route</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% if ( typeof equip['ipv6-infrastructure-static-route'] != 'undefined' ) + { %> + <% ipv6_infrastructure_static_route_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= equipment_node %>"> + <td> ipv6-infrastructure-static-route</td> + </tr> + <% i++; %> + + <% equip['ipv6-infrastructure-static-route'].forEach(function(eroute) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= ipv6_infrastructure_static_route_node %>"> + <td> + <a class="" + href="javascript:ipv6_infrastructure_static_route( + '<%= eroute['ipv6-outgoing-interface'] %>', + '<%= eroute['ipv6-next-hop-address'] %>', + '<%= eroute['ipv6-dest-prefix'] %>', + '<%= eroute['ipv6-dest-prefix-length'] %>');">ipv6_infrastructure_static_route</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% if ( typeof equip['interface'] != 'undefined' ) + { %> + <% interface_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= equipment_node %>"> + <td> interface</td> + </tr> + <% i++; %> + + <% equip['interface'].forEach(function(interface) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= interface_node %>"> + <td> + <a class="" + href="javascript:interface( + '<%= interface['interface-name'] %>', + '<%= interface['interface-role'] %>');">interface</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof interface['vlan'] != 'undefined' ) + { %> + <% vlan_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= interface_node %>"> + <td> vlan</td> + </tr> + <% i++; %> + + <% interface['vlan'].forEach(function(vlan) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= vlan_node %>"> + <td> + <a class="" + href="javascript:vlan( + '<%= vlan['vlan-interface'] %>', + '<%= vlan['vlan-id-outer'] %>', + '<%= vlan['vlan-id-inner'] %>');">vlan</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof vlan['l3-interface-ipv4-address-list'] != 'undefined' ) + { %> + <% ipv4_address_list_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= interface_node %>"> + <td> l3-interface-ipv4-address-list</td> + </tr> + <% i++; %> + + <% vlan['l3-interface-ipv4-address-list'].forEach(function(v4) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= ipv4_address_list_node %>"> + <td> + <a class="" + href="javascript:l3_interface_ipv4_address_list( + '<%= v4['l3-interface-ipv4-address'] %>', + '<%= v4['l3-interface-ipv4-prefix-length'] %>');">l3-interface-ipv4-address-list</a> + </td> + </tr> + <% i++; %> + + <% }); %> + <% }; %> + + <% if ( typeof vlan['l3-interface-ipv6-address-list'] != 'undefined' ) + { %> + <% ipv6_address_list_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= interface_node %>"> + <td> l3-interface-ipv6-address-list</td> + </tr> + <% i++; %> + + <% vlan['l3-interface-ipv6-address-list'].forEach(function(v6) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= ipv6_address_list_node %>"> + <td> + <a class="" + href="javascript:l3_interface_ipv6_address_list( + '<%= v6['l3-interface-ipv6-address'] %>', + '<%= v6['l3-interface-ipv6-prefix-length'] %>');">l3-interface-ipv6-address-list</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% }; %> + <% }); %> + <% }; %> + <% }); %> + <% } %> + + + + <% }); %> + <% } %> + + <% if ( typeof request['service-data']['l3sdn-vnf-fields'] != 'undefined' ) + { %> + <% l3sdn_vnf_fields_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>"> + <td> l3sdn-vnf-fields</td> + </tr> + <% i++; %> + + <tr class="treegrid-<%= i %> treegrid-parent-<%= l3sdn_vnf_fields_node %>"> + <td> + <a class="" + href="javascript:l3sdn_vnf_fields( + '<%= request['service-data']['l3sdn-vnf-fields']['availability-zone'] %>', + '<%= request['service-data']['l3sdn-vnf-fields']['vnf-stack-id'] %>', + '<%= request['service-data']['l3sdn-vnf-fields']['vnf-name'] %>', + '<%= request['service-data']['l3sdn-vnf-fields']['vnf-name2'] %>', + '<%= request['service-data']['l3sdn-vnf-fields']['vnf-type'] %>', + '<%= request['service-data']['l3sdn-vnf-fields']['vnf-status'] %>', + '<%= request['service-data']['l3sdn-vnf-fields']['vnf-id'] %>', + '<%= request['service-data']['l3sdn-vnf-fields']['oam-network-name'] %>', + '<%= request['service-data']['l3sdn-vnf-fields']['aic_site_id'] %>');">l3sdn-vnf-fields</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof request['service-data']['l3sdn-vnf-fields']['network-connections'] != 'undefined' ) + { %> + <% network_connections_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= l3sdn_vnf_fields_node %>"> + <td> network-connections</td> + </tr> + <% i++; %> + + <% request['service-data']['l3sdn-vnf-fields']['network-connections'].forEach(function(nconn) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= network_connections_node %>"> + <td> + <a class="" + href="javascript:network_connections( + '<%= nconn['stack-id'] %>', + '<%= nconn['net-status'] %>', + '<%= nconn['connection-type'] %>', + '<%= nconn['provider-network'] %>', + '<%= nconn['interface-id'] %>', + '<%= nconn['vlan'] %>', + '<%= nconn['port-group-name'] %>', + '<%= nconn['neutron-network-id'] %>');">network-connections</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + + <% if ( typeof request['service-data']['l3sdn-vnf-fields']['vnf-vm-information'] != 'undefined' ) + { %> + <% vnf_vm_information_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= l3sdn_vnf_fields_node %>"> + <td> vnf-vm-information</td> + </tr> + <% i++; %> + + <% request['service-data']['l3sdn-vnf-fields']['vnf-vm-information'].forEach(function(info) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= vnf_vm_information_node %>"> + <td> + <a class="" + href="javascript:vnf_vm_information( + '<%= info['vserver-type'] %>', + '<%= info['vserver-name'] %>');">vnf-vm-information</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + + + <% } %> + + <% if ( typeof request['service-data']['vr-lan'] != 'undefined' ) + { %> + <% if ( typeof request['service-instance-id'] != 'undefined' ) + { + var svc_instance_id = request['service-instance-id']; + } %> + + <% vr_lan_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>"> + <td> vr-lan</td> + </tr> + <% i++; %> + + + <% if ( request['service-data']['vr-lan']['routing-protocol'] != 'undefined' ) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_node %>"> + <td> + <a href="javascript:routing_protocol('<%= svc_instance_id %>', + '<%= request['service-data']['vr-lan']['routing-protocol'] %>');">routing-protocol</a> + </td> + </tr> + <% i++; %> + <% } %> + <% vr_lan_interface_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_node %>"> + <td> vr-lan-interface</td> + </tr> + <% i++; %> + + <% if( typeof request['service-data']['vr-lan']['vr-lan-interface'] != 'undefined' ) + { %> + + <% request['service-data']['vr-lan']['vr-lan-interface'].forEach(function(request) + { %> + + <% if ( request['vr-designation'] != 'undefined') + { + var vr_designation = request['vr-designation']; + } %> + + <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>"> + <td> + <a href="javascript:vrlan_interface( + '<%= svc_instance_id %>', + '<%= request['vr-designation'] %>', + '<%= request['v6-vr-lan-prefix'] %>', + '<%= request['v6-vr-lan-prefix-length'] %>', + '<%= request['v6-vce-wan-address'] %>', + '<%= request['v4-vr-lan-prefix-length'] %>', + '<%= request['v4-vr-lan-prefix'] %>', + '<%= request['t-defaulted-v6-vrlan'] %>', + '<%= request['v4-vce-loopback-address'] %>');">vr-lan-interface</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof request['dhcp'] != 'undefined' ) + { %> + <% var dhcp_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>"> + <td> dhcp</td> + </tr> + <% i++; %> + + <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>"> + <td> + <a href="javascript:dhcp( + '<%= svc_instance_id %>', + '<%= request['dhcp']['use-v4-default-pool'] %>', + '<%= request['dhcp']['use-v6-default-pool'] %>', + '<%= request['dhcp']['v4-dhcp-server-enabled'] %>', + '<%= request['dhcp']['v6-dhcp-server-enabled'] %>', + '<%= request['dhcp']['v6-dhcp-default-pool-prefix'] %>', + '<%= request['dhcp']['v6-dhcp-default-pool-prefix-length'] %>', + '<%= request['dhcp']['v4-dhcp-default-pool-prefix'] %>', + '<%= request['dhcp']['v4-dhcp-default-pool-prefix-length'] %>');">dhcp</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof request['dhcp']['v4-dhcp-pools'] != 'undefined' ) + { %> + <% var v4_dhcp_pools_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>"> + <td>v4-dhcp-pool</td> + </tr> + <% i++; %> + + <% request['dhcp']['v4-dhcp-pools'].forEach(function(v4request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_dhcp_pools_node %>"> + <td> + <a href="javascript:v4_dhcp_pools( + '<%= svc_instance_id %>', + '<%= v4request['v4-dhcp-relay-next-hop-address'] %>', + '<%= v4request['v4-dhcp-pool-prefix'] %>', + '<%= v4request['v4-dhcp-pool-prefix-length'] %>', + '<%= v4request['v4-dhcp-relay-gateway-address'] %>');">v4-dhcp-pools</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof v4request['excluded-v4-address'] != 'undefined' ) + { %> + <% var excluded_v4_address_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_dhcp_pools_node %>"> + <td>exluded-v4-address</td> + </tr> + <% i++; %> + + <% v4request['excluded-v4-addresses'].forEach(function(ex_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= excluded_v4_address_node %>"> + <td> + <a href="javascript:excluded_v4_address( + '<%= svc_instance_id %>', + '<%= ex_request['excluded-v4-address'] %>');">excluded-v4-address</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% }); %> + <% } %> + + <% if ( typeof request['dhcp']['excluded-v4-dhcp-addresses-from-default-pool'] != 'undefined' ) + { %> + <% var exc_v4_address_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>"> + <td>excluded-v4-dhcp-addresses-from-default-pool</td> + </tr> + <% i++; %> + + <% request['dhcp']['excluded-v4-dhcp-addresses-from-default-pool'].forEach(function(ex_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= exc_v4_address_node %>"> + <td> + <a href="javascript:excluded_v4_addresses_from_default_pool( + '<%= svc_instance_id %>', + '<%= ex_request['excluded-v4-address'] %>');">excluded-v4-dhcp-addresses-from-default-pool</a> + </td> + </tr> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% if ( typeof request['dhcp']['v6-dhcp-pools'] != 'undefined' ) + { %> + <% var v6_dhcp_pools_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>"> + <td>v6-dhcp-pool</td> + </tr> + <% i++; %> + + <% request['dhcp']['v6-dhcp-pools'].forEach(function(v6request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_dhcp_pools_node %>"> + <td> + <a href="javascript:v6_dhcp_pools( + '<%= svc_instance_id %>', + '<%= v6request['v6-dhcp-relay-next-hop-address'] %>', + '<%= v6request['v6-dhcp-pool-prefix'] %>', + '<%= v6request['v6-dhcp-pool-prefix-length'] %>', + '<%= v6request['v6-dhcp-relay-gateway-address'] %>');">v6-dhcp-pools</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof v6request['excluded-v6-addresses'] != 'undefined' ) + { %> + <% var excluded_v6_address_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_dhcp_pools_node %>"> + <td>exluded-v6-address</td> + </tr> + <% i++; %> + + <% v6request['excluded-v6-addresses'].forEach(function(ex_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= excluded_v6_address_node %>"> + <td> + <a href="javascript:excluded_v6_addresses( + '<%= svc_instance_id %>', + '<%= ex_request['excluded-v6-address'] %>');">excluded-v6-address</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% }); %> + <% } %> + + <% if ( typeof request['dhcp']['excluded-v6-dhcp-addresses-from-default-pool'] != 'undefined' ) + { %> + <% var exc_v6_address_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>"> + <td>excluded-v6-dhcp-addresses-from-default-pool</td> + </tr> + <% i++; %> + + <% request['dhcp']['excluded-v6-dhcp-addresses-from-default-pool'].forEach(function(ex_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= exc_v6_address_node %>"> + <td> + <a href="javascript:excluded_v6_addresses_from_default_pool( + '<%= svc_instance_id %>', + '<%= ex_request['excluded-v6-address'] %>');">excluded-v6-dhcp-addresses-from-default-pool</a> + </td> + </tr> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% } %> + <% if ( typeof request['firewall-lite'] != 'undefined' ) + { %> + <% var firewall_lite_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>"> + <td> firewall-lite</td> + </tr> + <% i++; %> + + <tr class="treegrid-<%= i %> treegrid-parent-<%= firewall_lite_node %>"> + <td> + <a href="javascript:firewall_lite( + '<%= svc_instance_id %>', + '<%= vr_designation %>', + '<%= request['firewall-lite']['stateful-firewall-lite-v6-enabled'] %>', + '<%= request['firewall-lite']['stateful-firewall-lite-v4-enabled'] %>');">firewall-lite</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof request['firewall-lite']['v6-firewall-packet-filters'] != 'undefined' ) + { %> + <% var v6_firewall_packet_filters_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= firewall_lite_node %>"> + <td>v6_firewall_packet_filters</td> + </tr> + <% i++; %> + + <% request['firewall-lite']['v6-firewall-packet-filters'].forEach(function(v6request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_firewall_packet_filters_node %>"> + <td> + <a href="javascript:v6_firewall_packet_filters( + '<%= svc_instance_id %>', + '<%= v6request['v6-firewall-prefix'] %>', + '<%= v6request['v6-firewall-prefix-length'] %>', + '<%= v6request['allow-icmp-ping'] %>');">v6-firewall-packet-filters</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof v6request['udp-port-list'] != 'undefined' ) + { %> + <% var udp_port_list_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_firewall_packet_filters_node %>"> + <td>udp_port_list</td> + </tr> + <% i++; %> + + <% v6request['udp-port-list'].forEach(function(udp_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= udp_port_list_node %>"> + <td> + <a href="javascript:udp_port_list( + '<%= svc_instance_id %>', + '<%= udp_request['port-number'] %>');">udp-port-list</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% if ( typeof v6request['tcp-port-list'] != 'undefined' ) + { %> + <% var tcp_port_list_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_firewall_packet_filters_node %>"> + <td>tcp_port_list</td> + </tr> + <% i++; %> + <% v6request['tcp-port-list'].forEach(function(tcp_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= tcp_port_list_node %>"> + <td> + <a href="javascript:tcp_port_list( + '<%= svc_instance_id %>', + '<%= tcp_request['port-number'] %>');">tcp-port-list</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% }); %> + + <% } %> + <% if ( typeof request['firewall-lite']['v4-firewall-packet-filters'] != 'undefined' ) + { %> + <% var v4_firewall_packet_filters_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= firewall_lite_node %>"> + <td>v4_firewall_packet_filters</td> + </tr> + <% i++; %> + + <% request['firewall-lite']['v4-firewall-packet-filters'].forEach(function(v4request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_firewall_packet_filters_node %>"> + <td> + <a href="javascript:v4_firewall_packet_filters( + '<%= svc_instance_id %>', + '<%= v4request['v4-firewall-prefix'] %>', + '<%= v4request['v4-firewall-prefix-length'] %>', + '<%= v4request['allow-icmp-ping'] %>');">v4-firewall-packet-filters</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof v4request['udp-port-list'] != 'undefined' ) + { %> + <% var udp_port_list_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_firewall_packet_filters_node %>"> + <td>udp_port_list</td> + </tr> + <% i++; %> + + <% v4request['udp-port-list'].forEach(function(udp_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= udp_port_list_node %>"> + <td> + <a href="javascript:udp_port_list( + '<%= svc_instance_id %>', + '<%= udp_request['port-number'] %>');">udp-port-list</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% if ( typeof v4request['tcp-port-list'] != 'undefined' ) + { %> + <% var tcp_port_list_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_firewall_packet_filters_node %>"> + <td>tcp_port_list</td> + </tr> + <% i++; %> + <% v4request['tcp-port-list'].forEach(function(tcp_request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= tcp_port_list_node %>"> + <td> + <a href="javascript:tcp_port_list( + '<%= svc_instance_id %>', + '<%= tcp_request['port-number'] %>');">tcp-port-list</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% }); %> + + <% } %> + + <% } %> + + + <% if ( typeof request['v4-public-lan-prefixes'] != 'undefined') + { %> + <% var v4_public_lan_prefixes_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>"> + <td> v4-public-lan-prefixes</td> + </tr> + <% i++; %> + + <% if (typeof request['v4-public-lan-prefixes']['t-provided-v4-lan-public-prefixes'] != 'undefined') + { %> + + <% request['v4-public-lan-prefixes']['t-provided-v4-lan-public-prefixes'].forEach(function(trequest) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_public_lan_prefixes_node %>"> + <td> + <a href="javascript:t_provided_v4_prefixes( + '<%= svc_instance_id %>', + '<%= trequest['request-index'] %>', + '<%= trequest['v4-lan-public-prefix-length'] %>', + '<%= trequest['v4-lan-public-prefix'] %>');">t-provided-v4-lan-public-prefixes</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% } %> + <% if ( typeof request['v6-public-lan-prefixes'] != 'undefined') + { %> + <% var v6_public_lan_prefixes_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>"> + <td> v6-public-lan-prefixes</td> + </tr> + <% i++; %> + + <% if (typeof request['v6-public-lan-prefixes']['t-provided-v6-lan-public-prefixes'] != 'undefined') + { %> + + <% request['v6-public-lan-prefixes']['t-provided-v6-lan-public-prefixes'].forEach(function(trequest) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_public_lan_prefixes_node %>"> + <td> + <a href="javascript:t_provided_v6_prefixes( + '<%= svc_instance_id %>', + '<%= trequest['request-index'] %>', + '<%= trequest['v6-lan-public-prefix-length'] %>', + '<%= trequest['v6-lan-public-prefix'] %>');">t-provided-v6-lan-public-prefixes</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% } %> + + <% if ( typeof request['nat'] != 'undefined' ) + { %> + <% var nat_node = i %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>"> + <td> nat</td> + </tr> + <% i++; %> + + <tr class="treegrid-<%= i %> treegrid-parent-<%= nat_node %>"> + <td> + <a href="javascript:nat( + '<%= svc_instance_id %>', + '<%= request['nat']['v4-nat-enabled'] %>');">nat</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof request['nat']['v4-nat-mapping-entries'] != 'undefined' ) + { + var nat_mapping_node = i %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= nat_node %>"> + <td>v4-nat-mapping-entries</td> + </tr> + <% i++; %> + + <% request['nat']['v4-nat-mapping-entries'].forEach(function(trequest) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= nat_mapping_node %>"> + <td> + <a href="javascript:v4_nat_mapping_entries( + '<%= svc_instance_id %>', + '<%= trequest['v4-nat-external'] %>', + '<%= trequest['v4-nat-next-hop-address'] %>', + '<%= trequest['v4-nat-internal'] %>');">v4-nat-mapping-entries</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% } %> + + <% if ( typeof request['static-routes'] != 'undefined' ) + { %> + <% var static_route_node = i; %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>"> + <td> static-routes</td> + </tr> + <% i++; %> + <% if ( typeof request['static-routes']['v6-static-routes'] != 'undefined' ) + { %> + <% v6_static_route = i %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= static_route_node %>"> + <td>v6-static-routes</td> + </tr> + <% i++; %> + + <% request['static-routes']['v6-static-routes'].forEach(function(strequest){ %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_static_route %>"> + <td> + <a href="javascript:v6_static_routes( + '<%= svc_instance_id %>', + '<%= strequest['v6-static-route-prefix'] %>', + '<%= strequest['v6-next-hop-address'] %>', + '<%= strequest['v6-static-route-prefix-length'] %>');">v6-static-routes</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% if ( typeof request['static-routes']['v4-static-routes'] != 'undefined' ) + { %> + <% v4_static_route = i %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= static_route_node %>"> + <td> v4-static-routes</td> + </tr> + <% i++; %> + <% request['static-routes']['v4-static-routes'].forEach(function(v4request) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_static_route %>"> + <td> + <a href="javascript:v4_static_routes( + '<%= svc_instance_id %>', + '<%= v4request['v4-static-route-prefix'] %>', + '<%= v4request['v4-next-hop-address'] %>', + '<%= v4request['v4-static-route-prefix-length'] %>');">v4-static-routes</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% } %> + + <% if ( typeof request['pat'] != 'undefined' ) + { %> + <% var pat_node = i %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>"> + <td> pat</td> + </tr> + <% i++; %> + + <tr class="treegrid-<%= i %> treegrid-parent-<%= pat_node %>"> + <td> + <a href="javascript:pat( + '<%= svc_instance_id %>', + '<%= request['pat']['v4-pat-default-pool-prefix-length'] %>', + '<%= request['pat']['use-v4-default-pool'] %>', + '<%= request['pat']['v4-pat-enabled'] %>', + '<%= request['pat']['v4-pat-default-pool-prefix'] %>');">pat</a> + </td> + </tr> + <% i++; %> + + <% if ( typeof request['pat']['v4-pat-pools'] != 'undefined' ) + { %> + <% var pat_pools_node = i %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= pat_node %>"> + <td> v4-pat-pools</td> + </tr> + <% i++; %> + + <% request['pat']['v4-pat-pools'].forEach(function(trequest) + { %> + <tr class="treegrid-<%= i %> treegrid-parent-<%= pat_pools_node %>"> + <td> + <a href="javascript:pat_pools( + '<%= svc_instance_id %>', + '<%= trequest['v4-pat-pool-next-hop-address'] %>', + '<%= trequest['v4-pat-pool-prefix-length'] %>', + '<%= trequest['v4-pat-pool-prefix'] %>');">v4-pat-pools</a> + </td> + </tr> + <% i++; %> + <% }); %> + <% } %> + <% } %> + + + + + + + <% }); %> + <% } %> + <% } %> + + <% } %> + <% }); %> +</table> +</div> +</div> + +<div class="container-fluid"> + <div class="row"> + <div class="col-md-1 text-left"> + <p> Page <%= pageInfo.currentPage %> of <%= pageInfo.pageCount %></p> + </div> + <div class="col-md-11 text-left"> + <% if (pageInfo.pageCount > 1) { %> + <ul class="pagination"> + <% if (pageInfo.currentPage > 1) { %> + <li><a href="/odl/pageWklst?page=1">«</a></li> + <% } %> + <% var i = 1; + if (pageInfo.currentPage > 10) { + i = +pageInfo.currentPage - 9; + } %> + <% if (i !== 1) { %> + <!--<li class="disabled"><a href="#">...</a></li>--> + <% } %> + <% for (i; i<=pageInfo.pageCount; i++) { %> + <% if (pageInfo.currentPage == i) { %> + <li class="active"><span><%= i %> <span class="sr-only">(current)</span></span></li> + <% } else { %> + <li><a href="/odl/pageWklst?page=<%= i %>"><%= i %></a></li> + <% } %> + <% if (i == (+pageInfo.currentPage + 9)) { %> + <!--<li class="disabled"><a href="#">...</a></li>--> + <% break; } %> + <% } %> + <% if (pageInfo.currentPage != pageInfo.pageCount) { %> + <li><a href="/odl/pageWklst?page=<%= pageInfo.pageCount %>">»</a></li> + <% } %> + </ul> + <% } %> + </div><!-- col-md-10 --> + </div><!-- row --> + </div><!-- container-fluid --> + + + +<% include ../partials/vnf_vm_information %> +<% include ../partials/network_connections %> +<% include ../partials/l3sdn_vnf_fields %> +<% include ../partials/l3_interface_ipv4_address_list %> +<% include ../partials/l3_interface_ipv6_address_list %> +<% include ../partials/vlan %> +<% include ../partials/interface %> +<% include ../partials/ipv6_infrastructure_static_route %> +<% include ../partials/ipv4_infrastructure_static_route %> +<% include ../partials/equipment %> +<% include ../partials/svc_config_additional_data %> +<% include ../partials/feature_list %> +<% include ../partials/pat %> +<% include ../partials/pat_pools %> +<% include ../partials/v6_static_routes %> +<% include ../partials/v4_static_routes %> +<% include ../partials/nat %> +<% include ../partials/v4_nat_mapping_entries %> +<% include ../partials/t_provided_v4_lan_public_prefixes %> +<% include ../partials/v4_firewall_packet_filters %> +<% include ../partials/udp_port_list %> +<% include ../partials/tcp_port_list %> +<% include ../partials/v6_firewall_packet_filters %> +<% include ../partials/firewall_lite %> +<% include ../partials/excluded_v6_addresses %> +<% include ../partials/excluded_v6_address_from_default_pool %> +<% include ../partials/v6_dhcp_pools %> +<% include ../partials/excluded_v4_address_from_default_pool %> +<% include ../partials/excluded_v4_address %> +<% include ../partials/v4_dhcp_pools %> +<% include ../partials/dhcp %> +<% include ../partials/routing_protocol %> +<% include ../partials/t_provided_v6_lan_public_prefixes %> +<% include ../partials/vr_lan_interface %> +<% include ../partials/service_information_modal %> +<% include ../partials/l2_homing_information_modal %> +<% include ../partials/sdnc_request_header_modal %> +<% include ../partials/request_information_modal %> +<% include ../partials/svc_topology_additional_data_modal %> +<% include ../partials/service_status_modal %> +<% include ../partials/oper_status_modal %> +<% include ../partials/internet_evc_modal %> + +<footer> +<% include ../partials/footer %> +</footer> + +<script type="text/javascript"> + + + +function vnf_vm_information(vserver_type,vserver_name) +{ + var lvalue = document.getElementById('vserver_type'); + if( vserver_type != 'undefined' ){ + lvalue.value=vserver_type; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('vserver_name'); + if( vserver_name != 'undefined' ){ + lvalue.value=vserver_name; + } else { + lvalue.value=''; + } + $('#vnf-vm-information-modal').modal('show'); +} +function network_connections (stack_id,net_status,connection_type,provider_network,interface_id,vlan,port_group_name,neutron_network_id) +{ + var lvalue = document.getElementById('stack_id'); + if( stack_id != 'undefined' ){ + lvalue.value=stack_id; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('net_status'); + if( net_status != 'undefined' ){ + lvalue.value=net_status; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('connection_type'); + if( connection_type != 'undefined' ){ + lvalue.value=connection_type; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('provider_network'); + if( provider_network != 'undefined' ){ + lvalue.value=provider_network; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('interface_id'); + if( interface_id != 'undefined' ){ + lvalue.value=interface_id; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('vlan'); + if( vlan != 'undefined' ){ + lvalue.value=vlan; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('port_group_name'); + if( port_group_name != 'undefined' ){ + lvalue.value=port_group_name; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('neutron_network_id'); + if( neutron_network_id != 'undefined' ){ + lvalue.value=neutron_network_id; + } else { + lvalue.value=''; + } + $('#network-connections-modal').modal('show'); +} + +function l3sdn_vnf_fields(availability_zone,vnf_stack_id,vnf_name,vnf_name2,vnf_type,vnf_status,vnf_id,oam_network_name,aic_site_id) +{ + var lvalue = document.getElementById('availability_zone'); + if( availability_zone != 'undefined' ){ + lvalue.value=availability_zone; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('vnf_stack_id'); + if( vnf_stack_id != 'undefined' ){ + lvalue.value=vnf_stack_id; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('vnf_name'); + if( vnf_name != 'undefined' ){ + lvalue.value=vnf_name; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('vnf_name2'); + if( vnf_name2 != 'undefined' ){ + lvalue.value=vnf_name2; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('vnf_type'); + if( vnf_type != 'undefined' ){ + lvalue.value=vnf_type; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('vnf_status'); + if( vnf_status != 'undefined' ){ + lvalue.value=vnf_status; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('vnf_id'); + if( vnf_id != 'undefined' ){ + lvalue.value=vnf_id; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('oam_network_name'); + if( oam_network_name != 'undefined' ){ + lvalue.value=oam_network_name; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('aic_site_id'); + if( aic_site_id != 'undefined' ){ + lvalue.value=aic_site_id; + } else { + lvalue.value=''; + } + $('#l3sdn-vnf-fields-modal').modal('show'); +} +function l3_interface_ipv4_address_list(l3_interface_ipv4_address,l3_interface_ipv4_prefix_length) +{ + var lvalue = document.getElementById('l3_interface_ipv4_address'); + if( l3_interface_ipv4_address != 'undefined' ){ + lvalue.value=l3_interface_ipv4_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('l3_interface_ipv4_prefix_length'); + if( l3_interface_ipv4_prefix_length != 'undefined' ){ + lvalue.value=l3_interface_ipv4_prefix_length; + } else { + lvalue.value=''; + } + $('#l3-interface-ipv4-address-list-modal').modal('show'); +} + +function l3_interface_ipv6_address_list(l3_interface_ipv6_address,l3_interface_ipv6_prefix_length) +{ + var lvalue = document.getElementById('l3_interface_ipv6_address'); + if( l3_interface_ipv6_address != 'undefined' ){ + lvalue.value=l3_interface_ipv6_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('l3_interface_ipv6_prefix_length'); + if( l3_interface_ipv6_prefix_length != 'undefined' ){ + lvalue.value=l3_interface_ipv6_prefix_length; + } else { + lvalue.value=''; + } + $('#l3-interface-ipv6-address-list-modal').modal('show'); +} + + +function vlan(vlan_interface,vlan_id_inner,vlan_id_outer) +{ + var lvalue = document.getElementById('vlan_interface'); + if( vlan_interface != 'undefined' ){ + lvalue.value=vlan_interface; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('vlan_id_inner'); + if( vlan_id_inner != 'undefined' ){ + lvalue.value=vlan_id_inner; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('vlan_id_outer'); + if( vlan_id_outer != 'undefined' ){ + lvalue.value=vlan_id_outer; + } else { + lvalue.value=''; + } + $('#vlan-modal').modal('show'); +} + +function interface(interface_name,interface_role) +{ + var lvalue = document.getElementById('interface_name'); + if( interface_name != 'undefined' ){ + lvalue.value=interface_name; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('interface_role'); + if( interface_role != 'undefined' ){ + lvalue.value=interface_role; + } else { + lvalue.value=''; + } + $('#interface-modal').modal('show'); +} + +function ipv4_infrastructure_static_route(ipv4_outgoing_interface,ipv4_next_hop_address,ipv4_dest_prefix,ipv4_dest_prefix_length) +{ + var lvalue = document.getElementById('ipv4_outgoing_interface'); + if( ipv4_outgoing_interface != 'undefined' ){ + lvalue.value=ipv4_outgoing_interface; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('ipv4_next_hop_address'); + if( ipv4_next_hop_address != 'undefined' ){ + lvalue.value=ipv4_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('ipv4_dest_prefix'); + if( ipv4_dest_prefix != 'undefined' ){ + lvalue.value=ipv4_dest_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('ipv4_dest_prefix_length'); + if( ipv4_dest_prefix_length != 'undefined' ){ + lvalue.value=ipv4_dest_prefix_length; + } else { + lvalue.value=''; + } + $('#ipv4-infrastructure-static-route-modal').modal('show'); +} + +function ipv6_infrastructure_static_route(ipv6_outgoing_interface,ipv6_next_hop_address,ipv6_dest_prefix,ipv6_dest_prefix_length) +{ + var lvalue = document.getElementById('ipv6_outgoing_interface'); + if( ipv6_outgoing_interface != 'undefined' ){ + lvalue.value=ipv6_outgoing_interface; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('ipv6_next_hop_address'); + if( ipv6_next_hop_address != 'undefined' ){ + lvalue.value=ipv6_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('ipv6_dest_prefix'); + if( ipv6_dest_prefix != 'undefined' ){ + lvalue.value=ipv6_dest_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('ipv6_dest_prefix_length'); + if( ipv6_dest_prefix_length != 'undefined' ){ + lvalue.value=ipv6_dest_prefix_length; + } else { + lvalue.value=''; + } + $('#ipv6-infrastructure-static-route-modal').modal('show'); +} + +function equipment(equipment_role,ipv4_oam_address,ipv4_oam_gateway_address_prefix_length,ptnii_name,v4_loopback0_ip_address,ipv4_oam_gateway_address) +{ + var lvalue = document.getElementById('equipment_role'); + if( equipment_role != 'undefined' ){ + lvalue.value=equipment_role; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('ipv4_oam_address'); + if( ipv4_oam_address != 'undefined' ){ + lvalue.value=ipv4_oam_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('ipv4_oam_gateway_address_prefix_length'); + if( ipv4_oam_gateway_address_prefix_length != 'undefined' ){ + lvalue.value=ipv4_oam_gateway_address_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('ptnii_name'); + if( ptnii_name != 'undefined' ){ + lvalue.value=ptnii_name; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_loopback0_ip_address'); + if( v4_loopback0_ip_address != 'undefined' ){ + lvalue.value=v4_loopback0_ip_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('ipv4_oam_gateway_address'); + if( ipv4_oam_gateway_address != 'undefined' ){ + lvalue.value=ipv4_oam_gateway_address; + } else { + lvalue.value=''; + } + $('#equipment-modal').modal('show'); +} +function svc_config_additional_data(management_ip) +{ + var lvalue = document.getElementById('management_ip'); + if( management_ip != 'undefined' ){ + lvalue.value=management_ip; + } else { + lvalue.value=''; + } + $('#svc-config-additional-data-modal').modal('show'); +} +function feature_list(feature_instance_id,feature_instance_xpath,feature_sub_type,feature_type) +{ + var lvalue = document.getElementById('feature_instance_id'); + if( feature_instance_id != 'undefined' ){ + lvalue.value=feature_instance_id; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('feature_instance_xpath'); + if( feature_instance_xpath != 'undefined' ){ + lvalue.value=feature_instance_xpath; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('feature_sub_type'); + if( feature_sub_type != 'undefined' ){ + lvalue.value=feature_sub_type; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('feature_type'); + if( feature_type != 'undefined' ){ + lvalue.value=feature_type; + } else { + lvalue.value=''; + } + $('#feature-list-modal').modal('show'); +} +function pat_pools(svc_instance_id,v4_pat_pool_next_hop_address,v4_pat_pool_prefix_length,v4_pat_pool_prefix) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_pat_pool_next_hop_address'); + if( v4_pat_pool_next_hop_address != 'undefined' ){ + lvalue.value=v4_pat_pool_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_pat_pool_prefix_length'); + if( v4_pat_pool_prefix_length != 'undefined' ){ + lvalue.value=v4_pat_pool_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_pat_pool_prefix'); + if( v4_pat_pool_prefix != 'undefined' ){ + lvalue.value=v4_pat_pool_prefix; + } else { + lvalue.value=''; + } + $('#pat-pools-modal').modal('show'); +} +function pat(svc_instance_id,v4_pat_default_pool_prefix_length,use_v4_default_pool,v4_pat_enabled,v4_pat_default_pool_prefix) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_pat_default_pool_prefix_length'); + if( v4_pat_default_pool_prefix_length != 'undefined' ){ + lvalue.value=v4_pat_default_pool_prefix_length; + } else { + lvalue.value=''; + } + + lvalue = document.getElementById('use_v4_default_pool'); + if( use_v4_default_pool != 'undefined' ){ + lvalue.value = use_v4_default_pool; + } else { + lvalue.value = ''; + } + + lvalue = document.getElementById('v4_pat_enabled'); + if( v4_pat_enabled != 'undefined' ){ + lvalue.value = v4_pat_enabled; + } else { + lvalue.value = ''; + } + + lvalue = document.getElementById('v4_pat_default_pool_prefix'); + if( v4_pat_default_pool_prefix != 'undefined' ){ + lvalue.value = v4_pat_default_pool_prefix; + } else { + lvalue.value = ''; + } + $('#pat-modal').modal('show'); +} + +function v4_static_routes(svc_instance_id,v4_static_route_prefix,static_v4_next_hop_address,v4_static_route_prefix_length) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_static_route_prefix'); + if( v4_static_route_prefix != 'undefined' ){ + lvalue.value=v4_static_route_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('static_v4_next_hop_address'); + if( static_v4_next_hop_address != 'undefined' ){ + lvalue.value=static_v4_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_static_route_prefix_length'); + if( v4_static_route_prefix_length != 'undefined' ){ + lvalue.value=v4_static_route_prefix_length; + } else { + lvalue.value=''; + } + $('#v4-static-routes-modal').modal('show'); +} + +function v6_static_routes(svc_instance_id,v6_static_route_prefix,static_v6_next_hop_address,v6_static_route_prefix_length) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v6_static_route_prefix'); + if( v6_static_route_prefix != 'undefined' ){ + lvalue.value=v6_static_route_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('static_v6_next_hop_address'); + if( static_v6_next_hop_address != 'undefined' ){ + lvalue.value=static_v6_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_static_route_prefix_length'); + if( v6_static_route_prefix_length != 'undefined' ){ + lvalue.value=v6_static_route_prefix_length; + } else { + lvalue.value=''; + } + $('#v6-static-routes-modal').modal('show'); +} + +function nat(svc_instance_id,v4_nat_enabled) { + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_nat_enabled'); + if( v4_nat_enabled != 'undefined' ){ + lvalue.value=v4_nat_enabled; + } else { + lvalue.value=''; + } + $('#nat-modal').modal('show'); +} +function v4_nat_mapping_entries(svc_instance_id,v4_nat_external,v4_nat_next_hop_address,v4_nat_internal) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_nat_external'); + if( v4_nat_external != 'undefined' ){ + lvalue.value=v4_nat_external; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_nat_next_hop_address'); + if( v4_nat_next_hop_address != 'undefined' ){ + lvalue.value=v4_nat_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_nat_internal'); + if( v4_nat_internal != 'undefined' ){ + lvalue.value=v4_nat_internal; + } else { + lvalue.value=''; + } + $('#v4-nat-mapping-entries-modal').modal('show'); +} + +function v4_firewall_packet_filters(svc_instance_id,v4_firewall_prefix,v4_firewall_prefix_length,v4_allow_icmp_ping) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_firewall_prefix'); + if( v4_firewall_prefix != 'undefined' ){ + lvalue.value=v4_firewall_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_firewall_prefix_length'); + if( v4_firewall_prefix_length != 'undefined' ){ + lvalue.value=v4_firewall_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_allow_icmp_ping'); + if( v4_allow_icmp_ping != 'undefined' ){ + lvalue.value=v4_allow_icmp_ping; + } else { + lvalue.value=''; + } + $('#v4-firewall-packet-filters-modal').modal('show'); +} + +function v6_firewall_packet_filters(svc_instance_id,v6_firewall_prefix,v6_firewall_prefix_length,v6_allow_icmp_ping) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v6_firewall_prefix'); + if( v6_firewall_prefix != 'undefined' ){ + lvalue.value=v6_firewall_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_firewall_prefix_length'); + if( v6_firewall_prefix_length != 'undefined' ){ + lvalue.value=v6_firewall_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_allow_icmp_ping'); + if( v6_allow_icmp_ping != 'undefined' ){ + lvalue.value=v6_allow_icmp_ping; + } else { + lvalue.value=''; + } + $('#v6-firewall-packet-filters-modal').modal('show'); +} + +function tcp_port_list(svc_instance_id,tcp_port_number) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('tcp_port_number'); + if( tcp_port_number != 'undefined' ){ + lvalue.value=tcp_port_number; + } else { + lvalue.value=''; + } + $('#tcp-port-list-modal').modal('show'); +} +function udp_port_list(svc_instance_id,udp_port_number) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('udp_port_number'); + if( udp_port_number != 'undefined' ){ + lvalue.value=udp_port_number; + } else { + lvalue.value=''; + } + $('#udp-port-list-modal').modal('show'); +} + +function firewall_lite(svc_instance_id,firewall_lite_vr_designation,stateful_firewall_lite_v4_enabled,stateful_firewall_lite_v6_enabled) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + document.getElementById('firewall_lite_vr_designation').value = firewall_lite_vr_designation; + var lvalue = document.getElementById('stateful_firewall_lite_v4_enabled'); + if( stateful_firewall_lite_v4_enabled != 'undefined' ){ + lvalue.value=stateful_firewall_lite_v4_enabled; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('stateful_firewall_lite_v6_enabled'); + if( stateful_firewall_lite_v6_enabled != 'undefined' ){ + lvalue.value=stateful_firewall_lite_v6_enabled; + } else { + lvalue.value=''; + } + $('#firewall-lite-modal').modal('show'); +} + +function excluded_v6_addresses(svc_instance_id, excluded_v6_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('excluded_v6_address'); + if( excluded_v6_address != 'undefined' ){ + lvalue.value=excluded_v6_address; + } else { + lvalue.value=''; + } + $('#excluded-v6-addresses-modal').modal('show'); +} + + +function excluded_v6_addresses_from_default_pool(svc_instance_id, excluded_v6_address_from_default_pool) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('excluded_v6_address_from_default_pool'); + if( excluded_v6_address_from_default_pool != 'undefined' ){ + lvalue.value=excluded_v6_address_from_default_pool; + } else { + lvalue.value=''; + } + $('#excluded-v6-address-from-default-pool-modal').modal('show'); +} + + +function v6_dhcp_pools(svc_instance_id,v6_dhcp_relay_next_hop_address,v6_dhcp_pool_prefix,v6_dhcp_pool_prefix_length,v6_dhcp_relay_gateway_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v6_dhcp_relay_next_hop_address'); + if( v6_dhcp_relay_next_hop_address != 'undefined' ){ + lvalue.value=v6_dhcp_relay_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_dhcp_pool_prefix'); + if( v6_dhcp_pool_prefix != 'undefined' ){ + lvalue.value=v6_dhcp_pool_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_dhcp_pool_prefix_length'); + if( v6_dhcp_pool_prefix_length != 'undefined' ){ + lvalue.value=v6_dhcp_pool_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_dhcp_relay_gateway_address'); + if( v6_dhcp_relay_gateway_address != 'undefined' ){ + lvalue.value=v6_dhcp_relay_gateway_address; + } else { + lvalue.value=''; + } + $('#v6-dhcp-pools-modal').modal('show'); +} + +function excluded_v4_addresses_from_default_pool(svc_instance_id, excluded_v4_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('excluded_v4_address_from_default_pool'); + if( excluded_v4_address != 'undefined' ){ + lvalue.value=excluded_v4_address; + } else { + lvalue.value=''; + } + $('#excluded-v4-address-from-default-pool-modal').modal('show'); +} + + +function exluded_v4_address(svc_instance_id, excluded_v4_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('excluded_v4_address'); + if( excluded_v4_address != 'undefined' ){ + lvalue.value=excluded_v4_address; + } else { + lvalue.value=''; + } + $('#excluded-v4-address-modal').modal('show'); +} + +function v4_dhcp_pools(svc_instance_id,v4_dhcp_relay_next_hop_address,v4_dhcp_pool_prefix,v4_dhcp_pool_prefix_length,v4_dhcp_relay_gateway_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_dhcp_relay_next_hop_address'); + if( v4_dhcp_relay_next_hop_address != 'undefined' ){ + lvalue.value=v4_dhcp_relay_next_hop_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_dhcp_pool_prefix'); + if( v4_dhcp_pool_prefix != 'undefined' ){ + lvalue.value=v4_dhcp_pool_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_dhcp_pool_prefix_length'); + if( v4_dhcp_pool_prefix_length != 'undefined' ){ + lvalue.value=v4_dhcp_pool_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_dhcp_relay_gateway_address'); + if( v4_dhcp_relay_gateway_address != 'undefined' ){ + lvalue.value=v4_dhcp_relay_gateway_address; + } else { + lvalue.value=''; + } + $('#v4-dhcp-pools-modal').modal('show'); +} + +function dhcp(svc_instance_id,use_v4_default_pool,use_v6_default_pool,v4_dhcp_server_enabled,v6_dhcp_server_enabled,v6_dhcp_default_pool_prefix,v6_dhcp_default_pool_prefix_length,v4_dhcp_default_pool_prefix,v4_dhcp_default_pool_prefix_length) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('use_v4_default_pool'); + if( use_v4_default_pool != 'undefined' ){ + lvalue.value=use_v4_default_pool; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('use_v6_default_pool'); + if( use_v6_default_pool != 'undefined' ){ + lvalue.value=use_v6_default_pool; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_dhcp_server_enabled'); + if( v4_dhcp_server_enabled != 'undefined' ){ + lvalue.value=v4_dhcp_server_enabled; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_dhcp_server_enabled'); + if( v6_dhcp_server_enabled != 'undefined' ){ + lvalue.value=v6_dhcp_server_enabled; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_dhcp_default_pool_prefix'); + if( v6_dhcp_default_pool_prefix != 'undefined' ){ + lvalue.value=v6_dhcp_default_pool_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_dhcp_default_pool_prefix_length'); + if( v6_dhcp_default_pool_prefix_length != 'undefined' ){ + lvalue.value=v6_dhcp_default_pool_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_dhcp_default_pool_prefix'); + if( v4_dhcp_default_pool_prefix != 'undefined' ){ + lvalue.value=v4_dhcp_default_pool_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_dhcp_default_pool_prefix_length'); + if( v4_dhcp_default_pool_prefix_length != 'undefined' ){ + lvalue.value=v4_dhcp_default_pool_prefix_length; + } else { + lvalue.value=''; + } + $('#dhcp-modal').modal('show'); +} + +function routing_protocol(svc_instance_id, routing_protocol) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('routing_protocol'); + if( routing_protocol != 'undefined' ){ + lvalue.value=routing_protocol; + } else { + lvalue.value=''; + } + $('#routing-protocol-modal').modal('show'); +} +function t_provided_v4_prefixes(svc_instance_id,v4_request_index,v4_lan_public_prefix_length,v4_lan_public_prefix) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v4_request_index'); + if( v4_request_index != 'undefined' ){ + lvalue.value=v4_request_index; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_lan_public_prefix_length'); + if( v4_lan_public_prefix_length != 'undefined' ){ + lvalue.value=v4_lan_public_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_lan_public_prefix'); + if( v4_lan_public_prefix != 'undefined' ){ + lvalue.value=v4_lan_public_prefix; + } else { + lvalue.value=''; + } + $('#t-provided-v4-lan-public-prefixes-modal').modal('show'); +} + +function t_provided_v6_prefixes(svc_instance_id,v6_request_index,v6_lan_public_prefix_length,v6_lan_public_prefix) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('v6_request_index'); + if( v6_request_index != 'undefined' ){ + lvalue.value=v6_request_index; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_lan_public_prefix_length'); + if( v6_lan_public_prefix_length != 'undefined' ){ + lvalue.value=v6_lan_public_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_lan_public_prefix'); + if( v6_lan_public_prefix != 'undefined' ){ + lvalue.value=v6_lan_public_prefix; + } else { + lvalue.value=''; + } + $('#t-provided-v6-lan-public-prefixes-modal').modal('show'); +} + +function vrlan_interface(svc_instance_id,vr_designation,v6_vr_lan_prefix, v6_vr_lan_prefix_length, v6_vce_wan_address, v4_vr_lan_prefix_length, v4_vr_lan_prefix, t_defaulted_v6_vrlan,v4_vce_loopback_address) +{ + document.getElementById('svc_instance_id').value = svc_instance_id; + var lvalue = document.getElementById('vr_designation'); + if( vr_designation != 'undefined' ){ + lvalue.value=vr_designation; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_vr_lan_prefix'); + if( v6_vr_lan_prefix != 'undefined' ){ + lvalue.value=v6_vr_lan_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_vr_lan_prefix_length'); + if( v6_vr_lan_prefix_length != 'undefined' ){ + lvalue.value=v6_vr_lan_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v6_vce_wan_address'); + if( v6_vce_wan_address != 'undefined' ){ + lvalue.value=v6_vce_wan_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_vr_lan_prefix_length'); + if( v4_vr_lan_prefix_length != 'undefined' ){ + lvalue.value=v4_vr_lan_prefix_length; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_vr_lan_prefix'); + if( v4_vr_lan_prefix != 'undefined' ){ + lvalue.value=v4_vr_lan_prefix; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('v4_vce_loopback_address'); + if( v4_vce_loopback_address != 'undefined' ){ + lvalue.value=v4_vce_loopback_address; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('t_defaulted_v6_vrlan'); + if( t_defaulted_v6_vrlan != 'undefined' ){ + lvalue.value=t_defaulted_v6_vrlan; + } else { + lvalue.value=''; + } + $('#vr-lan-interface-modal').modal('show'); +} + +function getvrlan(svc_instance_id) +{ +location.assign("/odl/getvrlan?request=" + svc_instance_id); +return; +} + +function svcInfo(service_instance_id,subscriber_name,service_type){ + var lvalue = document.getElementById('service_instance_id'); + if( service_instance_id != 'undefined' ){ + lvalue.value=service_instance_id; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('subscriber_name'); + if( subscriber_name != 'undefined' ){ + lvalue.value=subscriber_name; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('service_type'); + if( service_type != 'undefined' ){ + lvalue.value=service_type; + } else { + lvalue.value=''; + } + $('#service-information-modal').modal('show'); +} +function l2Homing(evc_name,preferred_aic_clli,topology){ + var lvalue = document.getElementById('evc_name'); + if( evc_name != 'undefined' ){ + lvalue.value=evc_name; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('preferred_aic_clli'); + if( preferred_aic_clli != 'undefined' ){ + lvalue.value=preferred_aic_clli; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('topology'); + if( topology != 'undefined' ){ + lvalue.value=topology; + } else { + lvalue.value=''; + } + $('#l2-homing-information-modal').modal('show'); +} +function reqHeader(svc_notification_url, svc_request_id, svc_action){ + var lvalue = document.getElementById('svc_notification_url'); + if( svc_notification_url != 'undefined' ){ + lvalue.value=svc_notification_url; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('svc_request_id'); + if( svc_request_id != 'undefined' ){ + lvalue.value=svc_request_id; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('svc_action'); + if( svc_action != 'undefined' ){ + lvalue.value=svc_action; + } else { + lvalue.value=''; + } + $('#sdnc-request-header-modal').modal('show'); +} +function reqInfo(notification_url, source, order_number, request_id, order_version, + request_action, request_sub_action){ + + var lvalue = document.getElementById('notification_url'); + if( notification_url != 'undefined' ){ + lvalue.value=notification_url; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('source'); + if( source != 'undefined' ){ + lvalue.value=source; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('order_number'); + if( order_number != 'undefined' ){ + lvalue.value=order_number; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('request_id'); + if( request_id != 'undefined' ){ + lvalue.value=request_id; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('order_version'); + if( order_version != 'undefined' ){ + lvalue.value=order_version; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('request_action'); + if( request_action != 'undefined' ){ + lvalue.value=request_action; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('request_sub_action'); + if( request_sub_action != 'undefined' ){ + lvalue.value=request_sub_action; + } else { + lvalue.value=''; + } + $('#request-information-modal').modal('show'); +} +function svcTopo(svc_vnf_type){ + var lvalue = document.getElementById('svc_vnf_type'); + if( svc_vnf_type != 'undefined' ){ + lvalue.value=svc_vnf_type; + } else { + lvalue.value=''; + } + $('#svc-topology-additional-data-modal').modal('show'); +} +function operStatus(order_status, modify_timestamp,last_svc_request_id,last_sub_action, + t_defaulted_v6_vrlan, last_action, create_timestamp, maintenance_indicator, last_order_status){ + var lvalue = document.getElementById('order_status'); + if( order_status != 'undefined' ){ + lvalue.value=order_status; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('modify_timestamp'); + if( modify_timestamp != 'undefined' ){ + lvalue.value=modify_timestamp; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('last_svc_request_id'); + if( last_svc_request_id != 'undefined' ){ + lvalue.value=last_svc_request_id; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('last_sub_action'); + if( last_sub_action != 'undefined' ){ + lvalue.value=last_sub_action; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('t_defaulted_v6_vrlan'); + if( t_defaulted_v6_vrlan != 'undefined' ){ + lvalue.value=t_defaulted_v6_vrlan; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('last_action'); + if( last_action != 'undefined' ){ + lvalue.value=last_action; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('create_timestamp'); + if( create_timestamp != 'undefined' ){ + lvalue.value=create_timestamp; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('maintenance_indicator'); + if( maintenance_indicator != 'undefined' ){ + lvalue.value=maintenance_indicator; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('last_order_status'); + if( last_order_status != 'undefined' ){ + lvalue.value=last_order_status; + } else { + lvalue.value=''; + } + $('#oper-status-modal').modal('show'); +} +function internetInfo(ip_version,internet_evc_speed_value,internet_evc_speed_units){ + + var lvalue = document.getElementById('ip_version'); + if( ip_version != 'undefined' ){ + lvalue.value=ip_version; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('internet_evc_speed_value'); + if( internet_evc_speed_value != 'undefined' ){ + lvalue.value=internet_evc_speed_value; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('internet_evc_speed_units'); + if( internet_evc_speed_units != 'undefined' ){ + lvalue.value=internet_evc_speed_units; + } else { + lvalue.value=''; + } + $('#internet-evc-modal').modal('show'); +} +function serviceStatus( rpc_name, final_indicator, request_status, rpc_action, l3sdn_action, l3sdn_subaction, response_message, response_code, response_timestamp){ + + var lvalue = document.getElementById('rpc_name'); + if( rpc_name != 'undefined' ){ + lvalue.value=rpc_name; + } else { + lvalue.value=''; + } + lvalue = document.getElementById('final_indicator'); + if( final_indicator != 'undefined' ){ + lvalue.value=final_indicator; + }else{ + lvalue.value=''; + } + lvalue = document.getElementById('request_status'); + if( request_status != 'undefined' ){ + lvalue.value=request_status; + }else{ + lvalue.value=''; + } + lvalue = document.getElementById('rpc_action'); + if( rpc_action != 'undefined' ){ + lvalue.value=rpc_action; + }else{ + lvalue.value=''; + } + lvalue = document.getElementById('l3sdn_action'); + if( l3sdn_action != 'undefined' ){ + lvalue.value=l3sdn_action; + }else{ + lvalue.value=''; + } + lvalue = document.getElementById('l3sdn_subaction'); + if( l3sdn_subaction != 'undefined' ){ + lvalue.value=l3sdn_subaction; + }else{ + lvalue.value=''; + } + lvalue = document.getElementById('response_message'); + if( response_message != 'undefined' ){ + lvalue.value=response_message; + }else{ + lvalue.value=''; + } + lvalue = document.getElementById('response_code'); + if( lvalue != 'undefined' ){ + response_code.value=response_code; + }else{ + lvalue.value=''; + } + lvalue = document.getElementById('response_timestamp'); + if( response_timestamp != 'undefined' ){ + lvalue.value=response_timestamp; + }else{ + lvalue.value=''; + } + $('#service-status-modal').modal('show'); +} +</script> + +</body> +</html> + diff --git a/admportal/views/odl/view.ejs b/admportal/views/odl/view.ejs new file mode 100644 index 00000000..34d7d935 --- /dev/null +++ b/admportal/views/odl/view.ejs @@ -0,0 +1,91 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <title>SDN-C AdminPortal</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> +</head> +<body class="container"> + +<div class="actions" style="padding:0px 25px;"> +<h2>Worklist Orders - Request ID: <%= response_obj.requests[0]['svc-request-id'] %></h2> +</div> + +<div class="actions" style="padding:15px 0px;"> + <button type="button" class="btn btn-primary aria-expanded="false" + onclick="viewVNF('/odl/getvnf?request=<%= response_obj.requests[0]['svc-request-id'] %>')">VNF</button> +</div> + + +<div class="table-responsive"> + <table class="table table-bordered"> + <colgroup> + <col class="col-xs-1"> + <col class="col-xs-7"> + </colgroup> + <tbody> + <tr> + <th scope="row">Instance ID</th> + <td><%= response_obj.requests[0]['svc-instance-id'] %></td> + </tr> + <tr> + <th scope="row">Action</th> + <td><%= response_obj.requests[0]['svc-action'] %></td> + </tr> + <tr> + <th scope="row">VNF Type</th> + <td><%= response_obj.requests[0]['svc-vnf-type'] %></td> + </tr> + <tr> + <th scope="row">Notification URL</th> + <td><%= response_obj.requests[0]['svc-notification-url'] %></td> + </tr> + <tr> + <th scope="row">VNF Name</th> + <td><%= response_obj.requests[0].vnf['vnf-name'] %></td> + </tr> + <tr> + <th scope="row">VNF IPv4 Addr</th> + <td><%= response_obj.requests[0].vnf['vnf-oam-ipv4-addr'] %></td> + </tr> + <tr> + <th scope="row">VNF Type</th> + <td><%= response_obj.requests[0].vnf['vnf-type'] %></td> + </tr> + <tr> + <th scope="row">VNF Status</th> + <td><%= response_obj.requests[0].vnf['vnf-status'] %></td> + </tr> + <tr> + <th scope="row">AIC Site ID</th> + <td><%= response_obj.requests[0].vnf['aic-site-id'] %></td> + </tr> + <tr> + <th scope="row">Availability Zone</th> + <td><%= response_obj.requests[0].vnf['availability-zone'] %></td> + </tr> + <tr> + <th scope="row">Network Connection(s)</th> + <td><pre><%= JSON.stringify(response_obj.requests[0].vnf['network-connections'],null,4) %></pre></td> + </tr> + </tbody> + </table> + </div> + + <% include ../partials/form %> + + <footer> + <% include ../partials/footer %> + </footer> +<script type="text/javascript"> +function viewVNF( requestid ) { +alert(requestid); + location.assign(requestid); +} +</script> + +</body> +</html> + diff --git a/admportal/views/odl/viewvnf.ejs b/admportal/views/odl/viewvnf.ejs new file mode 100644 index 00000000..dd2e05c9 --- /dev/null +++ b/admportal/views/odl/viewvnf.ejs @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <title>SDN-C AdminPortal</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> +</head> + +<body class="container"> + +<div class="actions" style="padding:0px 25px;"> +<h2>Worklist Orders - VNF - Request ID <%= request_id %></h2> +</div> + +<div class="table-responsive"> + <table class="table table-bordered"> + <colgroup> + <col class="col-xs-1"> + <col class="col-xs-7"> + </colgroup> + <tbody> + <tr> + <th scope="row">VNF OAM IPv4 Addr</th> + <td><%= vnf_obj.vnf['vnf-oam-ipv4-addr'] %></td> + </tr> + <tr> + <th scope="row">AIC Site ID</th> + <td><%= vnf_obj.vnf['aic-site-id'] %></td> + </tr> + <tr> + <th scope="row">VNF Name</th> + <td><%= vnf_obj.vnf['vnf-name'] %></td> + </tr> + <tr> + <th scope="row">VNF Type</th> + <td><%= vnf_obj.vnf['vnf-type'] %></td> + </tr> + <tr> + <th scope="row">VNF Status</th> + <td><%= vnf_obj.vnf['vnf-status'] %></td> + </tr> + <tr> + <th scope="row">Availability Zone</th> + <td><%= vnf_obj.vnf['availability-zone'] %></td> + </tr> + <tr> + <th scope="row">Network Connection(s)</th> + <td><pre><%= JSON.stringify(vnf_obj.vnf['network-connections'],null,4) %></pre></td> + </tr> + + </tbody> + </table> + </div> + + <footer> + <% include ../partials/footer %> + </footer> +</body> +</html> + diff --git a/admportal/views/pages/csplogout.ejs b/admportal/views/pages/csplogout.ejs new file mode 100644 index 00000000..971feda6 --- /dev/null +++ b/admportal/views/pages/csplogout.ejs @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + +<% if (header == 'gamma') { %> + <title>SDN-C AdminPortal</title> +<% } else if(header == 'sdn-mlc'){ %> + <title>SDNC-MLC AdminPortal</title> +<% } else { %> + <title>SDN-C AdminPortal</title> +<% } %> + + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> +</head> +<body class="container"> + +<div class="actions" style="padding:0px 25px;"> +<% if (header == 'gamma') { %> + <h2>SDN-C Admin Portal</h2> +<% } else if(header == 'sdn-mlc'){ %> + <h2>SDNC-MLC Admin Portal</h2> +<% } else { %> + <h2>SDN-C Admin Portal</h2> +<% } %> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'><%=result.msg %></div> + <% } else { %> + <div class='alert alert-danger' role='danger'><%=result.msg %></div> + <% } %> + <% } %> +<% } %> + +<p><a href="/login">Click here to login</a></p> + + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> diff --git a/admportal/views/pages/err.ejs b/admportal/views/pages/err.ejs new file mode 100644 index 00000000..8ed51c6c --- /dev/null +++ b/admportal/views/pages/err.ejs @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <title>SDN-C AdminPortal</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> +</head> +<body class="container"> + +<div class="actions" style="padding:0px 25px;"> +<h2>System Error</h2> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'><%=result.msg %></div> + <% } else { %> + <div class='alert alert-danger' role='danger'><%=result.msg %></div> + <% } %> + <% } %> +<% } %> + + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/pages/home.ejs b/admportal/views/pages/home.ejs new file mode 100644 index 00000000..3eb4a0a9 --- /dev/null +++ b/admportal/views/pages/home.ejs @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <title>SDN-C AdminPortal</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> +</head> +<body class="container"> + +<div class="actions" style="padding:0px 25px;"> +<h2>SDN-C Admin Portal</h2> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <pre class='alert alert-success' role='alert'><%=result.msg %></pre> + <% } else { %> + <pre class='alert alert-danger' role='danger'><%=result.msg %></pre> + <% } %> + <% } %> +<% } %> + + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/pages/home.ejs.orig b/admportal/views/pages/home.ejs.orig new file mode 100644 index 00000000..353bc457 --- /dev/null +++ b/admportal/views/pages/home.ejs.orig @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> + <head> + <title>SDN-C Admin Portal</title> + </head> + <body> + <h1>SDN-C Admin Portal</h1> + <p>Welcome to SDN-C Admin Portal</p> +<% if ( typeof loggedInAdmin != 'undefined') { %> + <p><%= loggedInAdmin.firstName %></p> +<% } %> +<% if ( typeof result != 'undefined') { %> + <p><%= result %></p> +<% } %> +<% if ( typeof errmsg != 'undefined') { %> + <p><%= errmsg %></p> +<% } %> + + </body> +</html> diff --git a/admportal/views/pages/login.ejs b/admportal/views/pages/login.ejs new file mode 100644 index 00000000..3a3e5e4e --- /dev/null +++ b/admportal/views/pages/login.ejs @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> + <title>AdminPortal</title> + + + <!-- Bootstrap core CSS --> + <% include ../partials/head %> + + <!-- Custom styles for this template --> + <link rel="stylesheet" href="/stylesheets/signin.css"> + + </head> + + <body> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'><%=result.msg %></div> + <% } else { %> + <div class='alert alert-danger' role='danger'><%=result.msg %></div> + <% } %> + <% } %> +<% } %> + + <div class="container"> + + <form class="form-signin" method="POST" action="/formlogin"> + <h3 class="form-signin-heading">AdminPortal Login</h3> + + <input type="text" name="email" id="email" class="form-control" placeholder="Email" required> + <input type="password" name="password" id="password" class="form-control" placeholder="Password" required> + + <button class="btn btn-lg btn-primary btn-block" type="submit">Submit</button> + </form> + + </div> <!-- /container --> + + </body> +</html> diff --git a/admportal/views/pages/setuplogin.ejs b/admportal/views/pages/setuplogin.ejs new file mode 100644 index 00000000..ef75e84a --- /dev/null +++ b/admportal/views/pages/setuplogin.ejs @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> + <title>SDN-C AdminPortal</title> + + + <!-- Bootstrap core CSS --> + <% include ../partials/head %> + + <!-- Custom styles for this template --> + <link rel="stylesheet" href="/stylesheets/signin.css"> + + </head> + + <body> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'><%=result.msg %></div> + <% } else { %> + <div class='alert alert-danger' role='danger'><%=result.msg %></div> + <% } %> + <% } %> +<% } %> + + <div class="container"> + + <form class="form-signin" method="POST" action="/formSetupLogin"> + <h3 class="form-signin-heading">Enter Initial User Information</h3> + + <label for="firstName" class="sr-only">First Name</label> + <input type="text" name="firstName" id="firstName" class="form-control" placeholder="First Name" required autofocus> + + <label for="lastName" class="sr-only">Last Name</label> + <input type="text" name="lastName" id="lastName" class="form-control" placeholder="Last Name" required> + + <label for="attuid" class="sr-only">ATTUID</label> + <input type="text" name="attuid" id="attuid" class="form-control" placeholder="ATTUID" required> + + <button class="btn btn-lg btn-primary btn-block" type="submit">Setup Login</button> + </form> + + </div> <!-- /container --> + + </body> +</html> diff --git a/admportal/views/pages/signup.ejs b/admportal/views/pages/signup.ejs new file mode 100644 index 00000000..03ac7bc5 --- /dev/null +++ b/admportal/views/pages/signup.ejs @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> + <title>AdminPortal</title> + + + <!-- Bootstrap core CSS --> + <% include ../partials/head %> + + <!-- Custom styles for this template --> + <link rel="stylesheet" href="/stylesheets/signin.css"> + + </head> + + <body> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'><%=result.msg %></div> + <% } else { %> + <div class='alert alert-danger' role='danger'><%=result.msg %></div> + <% } %> + <% } %> +<% } %> + + <div class="container"> + + <form class="form-signin" method="POST" action="/formSignUp"> + <h3 class="form-signin-heading">AdminPortal Signup</h3> + + <input type="email" name="nf_email" id="nf_email" class="form-control" placeholder="Email Address" required> + <input type="password" name="nf_password" id="nf_password" class="form-control" placeholder="Password" required> + + <button class="btn btn-lg btn-primary btn-block" type="submit">Submit</button> + </form> + + </div> <!-- /container --> + + </body> +</html> diff --git a/admportal/views/pages/testdb.ejs b/admportal/views/pages/testdb.ejs new file mode 100644 index 00000000..837b479b --- /dev/null +++ b/admportal/views/pages/testdb.ejs @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <title>SDN-C AdminPortal</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/ro_header %> +</head> +<body class="container"> + +<div class="actions" style="padding:0px 25px;"> +<h2>SDN-C AdminPortal Healthcheck</h2> +</div> + +<% if (typeof osObj != 'undefined') +{ %> + <pre> + Hostname : <%= osObj.hostname %> + Type : <%= osObj.type %> + Platform : <%= osObj.platform %> + Architecture : <%= osObj.arch %> + Release : <%= osObj.release %> + Uptime : <%= osObj.uptime %> + Total Memory : <%= osObj.totalmem %> + + <%= osObj.dbhealth %> + </pre> +<% } %> + + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/partials/add_service_homing.ejs b/admportal/views/partials/add_service_homing.ejs new file mode 100644 index 00000000..4a75125a --- /dev/null +++ b/admportal/views/partials/add_service_homing.ejs @@ -0,0 +1,52 @@ + <div class="modal fade" id="add_service_homing" tabindex="-1" role="dialog" + aria-labelledby="add_service_homing_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Service Homing</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/gamma/addServiceHoming" method="POST"> + <div class="form-group"> + <label for="nf_service_type">*Service Type</label> + <input readonly type="text" class="form-control" name="nf_service_type" id="nf_service_type" value="SDN-ETHERNET-INTERNET"> + </div> + <div class="form-group"> + <label for="nf_lata">*LATA</label> + <input type="text" class="form-control" name="nf_lata" id="nf_lata" maxlength="12" placeholder="int(3)"> + </div> + <div class="form-group"> + <label for="nf_hubbing_city_type">*Hubbing City Type</label> + <input maxlength="40" type="text" class="form-control" name="nf_hubbing_city_type" id="nf_hubbing_city_type" placeholder="varchar(40)"> + </div> + <div class="form-group"> + <label for="nf_latitude">Latitude</label> + <input type="text" class="form-control" name="nf_latitude" id="nf_latitude" maxlength="24" placeholder="float"> + </div> + <div class="form-group"> + <label for="nf_longitude">Longitude</label> + <input type="text" class="form-control" name="nf_longitude" id="nf_longitude" maxlength="24" placeholder="float"> + </div> + <div class="form-group"> + <label for="nf_primary_aic_site_name">*Primary Site Name</label> + <input maxlength="100" type="text" class="form-control" name="nf_primary_aic_site_name" id="nf_primary_aic_site_name" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="nf_secondary_aic_site_name">Secondary Site Name</label> + <input maxlength="100" type="text" class="form-control" name="nf_secondary_aic_site_name" id="nf_secondary_aic_site_name" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="nf_tertiary_aic_site_name">Tertiary Site Name</label> + <input maxlength="100" type="text" class="form-control" name="nf_tertiary_aic_site_name" id="nf_tertiary_aic_site_name" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitServiceHoming(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/alts_credentials.ejs b/admportal/views/partials/alts_credentials.ejs new file mode 100644 index 00000000..6d5f113c --- /dev/null +++ b/admportal/views/partials/alts_credentials.ejs @@ -0,0 +1,65 @@ +<div class="modal fade" id="add_alts_credentials" tabindex="-1" role="dialog" + aria-labelledby="add_alts_credentials_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add ALTS Credentials</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/ucpe/addAltsCredentials" method="POST"> + <div class="form-group"> + <label for="nf_alts_username">*ALTS Username</label> + <input type="text" class="form-control" maxlength="255" name="nf_alts_username" id="nf_alts_username" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="nf_alts_password">*ALTS Password</label> + <input type="password" class="form-control" maxlength="255" name="nf_alts_password" id="nf_alts_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <label for="nf_alts_password">*Confirm ALTS Password</label> + <input type="password" class="form-control" maxlength="255" name="nf_confirm_alts_password" id="nf_confirm_alts_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitAltsCredentials(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + <div class="modal fade" id="update_alts_credentials" tabindex="-1" role="dialog" + aria-labelledby="update_alts_credentials_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update ALTS Credentials</h4> + </div> + <div class="modal-body"> + <form role="form" action="/ucpe/updateAltsCredentials" method="POST"> + <div class="form-group"> + <label for="uf_alts_username">*ALTS Username</label> + <input type="text" class="form-control" maxlength="255" name="uf_alts_username" id="uf_alts_username"> + </div> + <div class="form-group"> + <label for="uf_alts_password">*ALTS Password</label> + <input type="password" class="form-control" maxlength="255" name="uf_alts_password" id="uf_alts_password"> + </div> + <div class="form-group"> + <label for="uf_alts_password">*Confirm ALTS Password</label> + <input type="password" class="form-control" maxlength="255" name="uf_confirm_alts_password" id="uf_confirm_alts_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submitAltsCredentials(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/dhcp.ejs b/admportal/views/partials/dhcp.ejs new file mode 100644 index 00000000..a290c324 --- /dev/null +++ b/admportal/views/partials/dhcp.ejs @@ -0,0 +1,66 @@ + <div class="modal fade" id="dhcp-modal" tabindex="-1" role="dialog" + aria-labelledby="dhcp-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">dhcp</h4> + </div> + <div class="modal-body"> + <form id="dhcp_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="use_v4_default_pool">use-v4-default-pool</label> + <input type="text" class="form-control" name="use_v4_default_pool" id="use_v4_default_pool"> + </div> + <div class="form-group"> + <label for="use_v6_default_pool">use-v6-default-pool</label> + <input type="text" class="form-control" name="use_v6_default_pool" id="use_v6_default_pool"> + </div> + <div class="form-group"> + <label for="v4_dhcp_server_enabled">v4-dhcp-server-enabled</label> + <input type="text" class="form-control" name="v4_dhcp_server_enabled" id="v4_dhcp_server_enabled"> + </div> + <div class="form-group"> + <label for="v6_dhcp_server_enabled">v6-dhcp-server-enabled</label> + <input type="text" class="form-control" name="v6_dhcp_server_enabled" id="v6_dhcp_server_enabled"> + </div> + <div class="form-group"> + <label for="v6_dhcp_default_pool_prefix">v6-dhcp-default-pool-prefix</label> + <input type="text" class="form-control" name="v6_dhcp_default_pool_prefix" id="v6_dhcp_default_pool_prefix"> + </div> + <div class="form-group"> + <label for="v6_dhcp_default_pool_prefix_length">v6-dhcp-default-pool-prefix-length</label> + <input type="text" class="form-control" name="v6_dhcp_default_pool_prefix_length" id="v6_dhcp_default_pool_prefix_length"> + </div> + <div class="form-group"> + <label for="v4_dhcp_default_pool_prefix">v4-dhcp-default-pool-prefix</label> + <input type="text" class="form-control" name="v4_dhcp_default_pool_prefix" id="v4_dhcp_default_pool_prefix"> + </div> + <div class="form-group"> + <label for="v4_dhcp_default_pool_prefix_length">v4-dhcp-default-pool-prefix-length</label> + <input type="text" class="form-control" name="v4_dhcp_default_pool_prefix_length" id="v4_dhcp_default_pool_prefix_length"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#dhcp-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/env.ejs b/admportal/views/partials/env.ejs new file mode 100644 index 00000000..249a707a --- /dev/null +++ b/admportal/views/partials/env.ejs @@ -0,0 +1 @@ +-dev diff --git a/admportal/views/partials/equipment.ejs b/admportal/views/partials/equipment.ejs new file mode 100644 index 00000000..5f4d798d --- /dev/null +++ b/admportal/views/partials/equipment.ejs @@ -0,0 +1,58 @@ + <div class="modal fade" + id="equipment-modal" tabindex="-1" role="dialog" + aria-labelledby="equipment-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">equipment</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="equipment_role">equipment-role</label> + <input type="text" class="form-control" name="equipment_role" id="equipment_role"> + </div> + <div class="form-group"> + <label for="ptnii_name">ptnii-name</label> + <input type="text" class="form-control" name="ptnii_name" id="ptnii_name"> + </div> + <div class="form-group"> + <label for="ipv4_oam_address">ipv4-oam-address</label> + <input type="text" class="form-control" name="ipv4_oam_address" id="ipv4_oam_address"> + </div> + <div class="form-group"> + <label for="ipv4_oam_gateway_address">ipv4-oam-gateway-address</label> + <input type="text" class="form-control" name="ipv4_oam_gateway_address" id="ipv4_oam_gateway_address"> + </div> + <div class="form-group"> + <label for="v4_loopback0_ip_address">v4-loopback0-ip-address</label> + <input type="text" class="form-control" name="v4_loopback0_ip_address" id="v4_loopback0_ip_address"> + </div> + <div class="form-group"> + <label for="ipv4_oam_gateway_address_prefix_length">ipv4-oam-gateway-address-prefix-length</label> + <input type="text" class="form-control" name="ipv4_oam_gateway_address_prefix_length" id="ipv4_oam_gateway_address_prefix_length"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#equipment-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/excluded_v4_address.ejs b/admportal/views/partials/excluded_v4_address.ejs new file mode 100644 index 00000000..e74d3245 --- /dev/null +++ b/admportal/views/partials/excluded_v4_address.ejs @@ -0,0 +1,38 @@ + <div class="modal fade" id="excluded-v4-address-modal" tabindex="-1" role="dialog" + aria-labelledby="excluded-v4-address-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">dhcp</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="exclded_v4_address">exclded-v4-address</label> + <input type="text" class="form-control" name="exclded_v4_address" id="exclded_v4_address"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#excluded-v4-address-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/excluded_v4_address_from_default_pool.ejs b/admportal/views/partials/excluded_v4_address_from_default_pool.ejs new file mode 100644 index 00000000..442fd344 --- /dev/null +++ b/admportal/views/partials/excluded_v4_address_from_default_pool.ejs @@ -0,0 +1,38 @@ + <div class="modal fade" id="excluded-v4-address-from-default-pool-modal" tabindex="-1" role="dialog" + aria-labelledby="excluded-v4-address-from-default-pool-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">excluded-v4-addresses-from-default-pool</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="excluded_v4_address_from_default_pool">excluded-v4-address</label> + <input type="text" class="form-control" name="excluded_v4_address_from_default_pool" id="excluded_v4_address_from_default_pool"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#excluded-v4-address-from-default-pool-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/excluded_v6_address_from_default_pool.ejs b/admportal/views/partials/excluded_v6_address_from_default_pool.ejs new file mode 100644 index 00000000..a91d0a75 --- /dev/null +++ b/admportal/views/partials/excluded_v6_address_from_default_pool.ejs @@ -0,0 +1,38 @@ + <div class="modal fade" id="excluded-v6-address-from-default-pool-modal" tabindex="-1" role="dialog" + aria-labelledby="excluded-v6-address-from-default-pool-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">excluded-v6-addresses-from-default-pool</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="excluded_v6_address_from_default_pool">excluded-v6-address</label> + <input type="text" class="form-control" name="excluded_v6_address_from_default_pool" id="excluded_v6_address_from_default_pool"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#excluded-v6-address-from-default-pool-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/excluded_v6_addresses.ejs b/admportal/views/partials/excluded_v6_addresses.ejs new file mode 100644 index 00000000..d155383e --- /dev/null +++ b/admportal/views/partials/excluded_v6_addresses.ejs @@ -0,0 +1,38 @@ + <div class="modal fade" id="excluded-v6-addresses-modal" tabindex="-1" role="dialog" + aria-labelledby="excluded-v6-addresses-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">excluded-v6-addresses</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="excluded_v6_address">excluded-v6-address</label> + <input type="text" class="form-control" name="excluded_v6_address" id="excluded_v6_address"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#excluded-v6-addresses-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/feature_list.ejs b/admportal/views/partials/feature_list.ejs new file mode 100644 index 00000000..95ebf872 --- /dev/null +++ b/admportal/views/partials/feature_list.ejs @@ -0,0 +1,50 @@ + <div class="modal fade" + id="feature-list-modal" tabindex="-1" role="dialog" + aria-labelledby="feature-list-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">feature-list</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="feature_instance_id">feature-instance-id</label> + <input type="text" class="form-control" name="feature_instance_id" id="feature_instance_id"> + </div> + <div class="form-group"> + <label for="feature_instance_xpath">feature-instance-xpath</label> + <input type="text" class="form-control" name="feature_instance_xpath" id="feature_instance_xpath"> + </div> + <div class="form-group"> + <label for="feature_sub_type">feature-sub-type</label> + <input type="text" class="form-control" name="feature_sub_type" id="feature_sub_type"> + </div> + <div class="form-group"> + <label for="feature_type">feature-type</label> + <input type="text" class="form-control" name="feature_type" id="feature_type"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#feature-list-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/firewall_lite.ejs b/admportal/views/partials/firewall_lite.ejs new file mode 100644 index 00000000..b26d078d --- /dev/null +++ b/admportal/views/partials/firewall_lite.ejs @@ -0,0 +1,43 @@ + <div class="modal fade" id="firewall-lite-modal" tabindex="-1" role="dialog" + aria-labelledby="firewall-lite-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">firewall-lite</h4> + </div> + <div class="modal-body"> + <form id="firewall_lite_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="stateful_firewall_lite_v4_enabled">stateful-firewall-lite-v4-enabled</label> + <input type="text" class="form-control" name="stateful_firewall_lite_v4_enabled" id="stateful_firewall_lite_v4_enabled"> + </div> + <div class="form-group"> + <label for="stateful_firewall_lite_v6_enabled">stateful-firewall-lite-v6-enabled</label> + <input type="text" class="form-control" name="stateful_firewall_lite_v6_enabled" id="stateful_firewall_lite_v6_enabled"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="firewall_lite_vr_designation" id="firewall_lite_vr_designation"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#firewall-lite-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/footer.ejs b/admportal/views/partials/footer.ejs new file mode 100644 index 00000000..c04e26d4 --- /dev/null +++ b/admportal/views/partials/footer.ejs @@ -0,0 +1,5 @@ + +<!-- views/partials/footer.ejs --> + +<p class="text-center text-muted">© Copyright 2017 AT&T Intellectual Property</p> + diff --git a/admportal/views/partials/form.ejs b/admportal/views/partials/form.ejs new file mode 100644 index 00000000..00d3c0ce --- /dev/null +++ b/admportal/views/partials/form.ejs @@ -0,0 +1,55 @@ + <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title" id="myModalLabel">New Request</h4> + </div> + <div class="modal-body"> + <form id="addEntry" role="form" action="svc-topology-operation"> + <!-- + <div class="form-group"> + <label for="svc-request-id">svc-request-id</label> + <input type="text" class="form-control" name="svc-request-id" id="svc-request-id" value="req-0001"> + </div> + --> + <div class="form-group"> + <label for="svc-instance-id">svc-instance-id</label> + <input type="text" class="form-control" name="svc-instance-id" id="svc-instance-id" value="siid-0001"> + </div> + <div class="form-group"> + <label for="svc-vnf-type">svc-vnf-type</label> + <select class="form-control" name="svc-vnf-type" id="svc-vnf-type"> + <option value=vce>"vce"</option> + <option value=Unknown>"Unknown"</option> + </select> + </div> + <div class="form-group"> + <label for="svc-action">svc-action</label> + <select class="form-control" name="svc-action" id="svc-action"> + <option value=reserve>"reserve"</option> + <option value=create>"create"</option> + <option value=activate>"activate"</option> + <option value=query>"query"</option> + <option value=update>"update"</option> + <option value=delete>"delete"</option> + </select> + </div> + <div class="form-group"> + <label for="svc-notification-url">svc-notification-url</label> + <input type="text" class="form-control" name="svc-notification-url" id="svc-notification-url" value=""> + </div> + <div class="form-group"> + <label for="desc">svc-aic-site-id</label> + <input type="text" class="form-control" name="svc-aic-site-id" id="svc-aic-site-id" value="att-0001"> + </div> + <div class="form-group"> + <button type="submit" class="btn btn-primary">Save</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + diff --git a/admportal/views/partials/gammaHeader.ejs b/admportal/views/partials/gammaHeader.ejs new file mode 100644 index 00000000..8af83963 --- /dev/null +++ b/admportal/views/partials/gammaHeader.ejs @@ -0,0 +1,63 @@ + +<!-- views/partials/header.ejs --> +<nav class="navbar navbar-default" role="navigation"> + <div class="container-fluid"> + + + <div class="navbar-header"> + <a class="navbar-brand" href="#"> AdminPortal</a> + </div> + + <div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups"> + + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn " + onclick="location.assign('/sla/listSLA');">SLA</button> + + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn dropdown-toggle" + data-toggle="dropdown" + aria-expanded="false">Profiles <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="/mobility/getVnfProfile">VNF Profile</a></li> + </ul> + </div> + + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn dropdown-toggle" + data-toggle="dropdown" + aria-expanded="false">Preload Tools <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="/mobility/getVnfData">Pre-load VNF Data</a></li> + <li><a href="/mobility/getVnfNetworkData">Pre-load VNF Network Data</a></li> + </ul> + </div> + + <!-- LOGS + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn dropdown-toggle" + data-toggle="dropdown" + aria-expanded="false">Logs <span class="caret"></span></button> + <ul class="dropdown-menu" role="menu"> + <li><a href="/logs/getUserTrace">User Trace</a></li> + <li><a href="/logs/getAccessLog">Access Log</a></li> + </ul> + </div> + --> + + <button type="button" class="btn btn-default navbar-btn" + onclick="location.assign('/user/listUsers');">User Admin</button> + <button type="button" class="btn btn-default navbar-btn" + onclick="location.assign('/logout');">Logout</button> + </div> + </div> + </div> + +</nav> + +<script type="text/javascript"> +$('[data-submenu]').submenupicker(); +$('[vlanidpool-submenu]').submenupicker(); +</script> diff --git a/admportal/views/partials/head.ejs b/admportal/views/partials/head.ejs new file mode 100644 index 00000000..066bf3c6 --- /dev/null +++ b/admportal/views/partials/head.ejs @@ -0,0 +1,20 @@ +<!-- Latest compiled and minified CSS --> +<link rel="stylesheet" href="/stylesheets/bootstrap.min.css"> +<link rel="stylesheet" href="/stylesheets/bootstrap-theme.min.css"> +<link rel="stylesheet" href="/stylesheets/dataTables.bootstrap.min.css"> +<!-- <link rel="stylesheet" href="/stylesheets/bootstrap-table.css"> --> +<link rel="stylesheet" href="/stylesheets/bootstrap-submenu.min.css"> +<link rel="stylesheet" href="/stylesheets/jquery.treegrid.css"> + +<!-- jquery downloaded from jquery.com/download --> +<!-- <script src="/javascripts/jquery.min.js"></script> --> +<script src="/javascripts/jquery-2.2.0.min.js"></script> +<script src="/javascripts/jquery.dataTables.min.js"></script> +<script src="/javascripts/jquery.treegrid.js"></script> +<script src="/javascripts/jquery.treegrid.bootstrap3.js"></script> +<script src="/javascripts/bootstrap.min.js"></script> +<!-- <script src="/javascripts/bootstrap-table.js"></script> --> +<script src="/javascripts/bootstrap-submenu.min.js"></script> +<script src="/javascripts/bootbox.min.js"></script> +<script src="/javascripts/dataTables.bootstrap.min.js"></script> + diff --git a/admportal/views/partials/head.ejs.orig b/admportal/views/partials/head.ejs.orig new file mode 100644 index 00000000..2f6f537e --- /dev/null +++ b/admportal/views/partials/head.ejs.orig @@ -0,0 +1,13 @@ +<!DOCTYPE HTML> +<meta charset="UTF-8"> +<title>SDN-C AdminPortal</title> + +<!-- Latest compiled and minified CSS --> +<link rel="stylesheet" href="/stylesheets/bootstrap.min.css"> + +<!-- Optional theme --> +<link rel="stylesheet" href="/stylesheets/bootstrap-theme.min.css"> +<!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> +<script src="/javascripts/jquery.min.js"></script> +<!-- Latest compiled and minified JavaScript --> +<script src="/javascripts/bootstrap.min.js"></script> diff --git a/admportal/views/partials/header.ejs b/admportal/views/partials/header.ejs new file mode 100644 index 00000000..6342154d --- /dev/null +++ b/admportal/views/partials/header.ejs @@ -0,0 +1,11 @@ +<% if (header == 'gamma') { %> + <% include ../partials/gammaHeader %> +<% } else if(header == 'sdn-mlc'){ %> + <% include ../partials/sdnmlcHeader %> +<% } else if(header == 'sdn-fc'){ %> + <% include ../partials/sdnfcHeader %> +<% } else { %> + <% include ../partials/gammaHeader %> +<% } %> + + diff --git a/admportal/views/partials/header.ejs.orig b/admportal/views/partials/header.ejs.orig new file mode 100644 index 00000000..830bd275 --- /dev/null +++ b/admportal/views/partials/header.ejs.orig @@ -0,0 +1,55 @@ +<!-- views/partials/header.ejs --> +<nav class="navbar navbar-default" role="navigation"> + <div class="container-fluid"> + + <div class="navbar-header"> + <a class="navbar-brand" href="#"> SDN-C AdminPortal</a> + </div> + + <div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups"> + + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn" + onclick="location.assign('/sla/listSLA');">SLA</button> + +<div class="btn-group"> + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">Default <span class="caret"></span></button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div> + + <button type="button" class="btn btn-default navbar-btn">Interfaces</button> + <button type="button" class="btn btn-default navbar-btn">VMs</button> + <button type="button" class="btn btn-default navbar-btn" + onclick="location.assign('/odl/listWklst');">Worklist Orders</button> + <button type="button" class="btn btn-default navbar-btn">Connections</button> + <button type="button" class="btn btn-default navbar-btn">VNFs</button> + <button type="button" class="btn btn-default navbar-btn">VLANs</button> + <button type="button" class="btn btn-default navbar-btn" + onclick="location.assign('/user/listUsers');">User Admin</button> + <button type="button" class="btn btn-default navbar-btn navbar-btn" + onclick="location.assign('/logout');">Logout</button> + <!-- <p class="btn-toolbar" role="group">ar3165 | Al Rotundo</p> --> + </div> + </div> + </div> +</nav> + +<!-- Single button --> +<div class="btn-group"> + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Action <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> +</div> diff --git a/admportal/views/partials/interface.ejs b/admportal/views/partials/interface.ejs new file mode 100644 index 00000000..c8afce9c --- /dev/null +++ b/admportal/views/partials/interface.ejs @@ -0,0 +1,42 @@ + <div class="modal fade" + id="interface-modal" tabindex="-1" role="dialog" + aria-labelledby="interface-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">interface</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="interface_name">interface-name</label> + <input type="text" class="form-control" name="interface_name" id="interface_name"> + </div> + <div class="form-group"> + <label for="interface_role">interface_role</label> + <input type="text" class="form-control" name="interface_role" id="interface_role"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#interface-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/internet_evc_modal.ejs b/admportal/views/partials/internet_evc_modal.ejs new file mode 100644 index 00000000..70848bad --- /dev/null +++ b/admportal/views/partials/internet_evc_modal.ejs @@ -0,0 +1,44 @@ + <div class="modal fade" id="internet-evc-modal" tabindex="-1" role="dialog" aria-labelledby="internet-evc-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title" id="internet-evc-modal-label">Internet EVC Access Information</h4> + </div> + <div class="modal-body"> + <form id="internet_evc_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="ip_version">ip-version</label> + <input type="text" class="form-control" name="ip_version" id="ip_version"> + </div> + <div class="form-group"> + <label for="internet_evc_speed_value">internet-evc-speed-value</label> + <input type="text" class="form-control" name="internet_evc_speed_value" id="internet_evc_speed_value"> + </div> + <div class="form-group"> + <label for="internet_evc_speed_units">internet-evc-speed-units</label> + <input type="text" class="form-control" name="internet_evc_speed_units" id="internet_evc_speed_units"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#service-status-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/ipv4_infrastructure_static_route.ejs b/admportal/views/partials/ipv4_infrastructure_static_route.ejs new file mode 100644 index 00000000..b9b92089 --- /dev/null +++ b/admportal/views/partials/ipv4_infrastructure_static_route.ejs @@ -0,0 +1,50 @@ + <div class="modal fade" + id="ipv4-infrastructure-static-route-modal" tabindex="-1" role="dialog" + aria-labelledby="ipv4-infrastructure-static-route-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">ipv4-infrastructure-static-route</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="ipv4_outgoing_interface">ipv4-outgoing-interface</label> + <input type="text" class="form-control" name="ipv4_outgoing_interface" id="ipv4_outgoing_interface"> + </div> + <div class="form-group"> + <label for="ipv4_next_hop_address">ipv4-next-hop-address</label> + <input type="text" class="form-control" name="ipv4_next_hop_address" id="ipv4_next_hop_address"> + </div> + <div class="form-group"> + <label for="ipv4_dest_prefix">ipv4-dest-prefix</label> + <input type="text" class="form-control" name="ipv4_dest_prefix" id="ipv4_dest_prefix"> + </div> + <div class="form-group"> + <label for="ipv4_dest_prefix_length">ipv4-dest-prefix-length</label> + <input type="text" class="form-control" name="ipv4_dest_prefix_length" id="ipv4_dest_prefix_length"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#ipv4-infrastructure-static-route-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/ipv6_infrastructure_static_route.ejs b/admportal/views/partials/ipv6_infrastructure_static_route.ejs new file mode 100644 index 00000000..4921e2ea --- /dev/null +++ b/admportal/views/partials/ipv6_infrastructure_static_route.ejs @@ -0,0 +1,50 @@ + <div class="modal fade" + id="ipv6-infrastructure-static-route-modal" tabindex="-1" role="dialog" + aria-labelledby="ipv6-infrastructure-static-route-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">ipv6-infrastructure-static-route</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="ipv6_outgoing_interface">ipv6-outgoing-interface</label> + <input type="text" class="form-control" name="ipv6_outgoing_interface" id="ipv6_outgoing_interface"> + </div> + <div class="form-group"> + <label for="ipv6_next_hop_address">ipv6-next-hop-address</label> + <input type="text" class="form-control" name="ipv6_next_hop_address" id="ipv6_next_hop_address"> + </div> + <div class="form-group"> + <label for="ipv6_dest_prefix">ipv6-dest-prefix</label> + <input type="text" class="form-control" name="ipv6_dest_prefix" id="ipv6_dest_prefix"> + </div> + <div class="form-group"> + <label for="ipv6_dest_prefix_length">ipv6-dest-prefix-length</label> + <input type="text" class="form-control" name="ipv6_dest_prefix_length" id="ipv6_dest_prefix_length"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#ipv6-infrastructure-static-route-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/l2_homing_information_modal.ejs b/admportal/views/partials/l2_homing_information_modal.ejs new file mode 100644 index 00000000..03af0546 --- /dev/null +++ b/admportal/views/partials/l2_homing_information_modal.ejs @@ -0,0 +1,46 @@ + <div class="modal fade" + id="l2-homing-information-modal" tabindex="-1" role="dialog" + aria-labelledby="l2-homing-information-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title" id="l2-homing-information-modal-label">l2-homing-information</h4> + </div> + <div class="modal-body"> + <form id="l2_homing_information_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="evc_name">evc-name</label> + <input type="text" class="form-control" name="evc_name" id="evc_name"> + </div> + <div class="form-group"> + <label for="preferred_aic_clli">preferred-aic-clli</label> + <input type="text" class="form-control" name="preferred_aic_clli" id="preferred_aic_clli"> + </div> + <div class="form-group"> + <label for="topology">topology</label> + <input type="text" class="form-control" name="topology" id="topology"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#service-status-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/l3_interface_ipv4_address_list.ejs b/admportal/views/partials/l3_interface_ipv4_address_list.ejs new file mode 100644 index 00000000..50c66cd9 --- /dev/null +++ b/admportal/views/partials/l3_interface_ipv4_address_list.ejs @@ -0,0 +1,42 @@ + <div class="modal fade" + id="l3-interface-ipv4-address-list-modal" tabindex="-1" role="dialog" + aria-labelledby="l3-interface-ipv4-address-list-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">l3-interface-ipv4-address-list</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="l3_interface_ipv4_address">l3-interface-ipv4-address</label> + <input type="text" class="form-control" name="l3_interface_ipv4_address" id="l3_interface_ipv4_address"> + </div> + <div class="form-group"> + <label for="l3_interface_ipv4_prefix_length">l3-interface-ipv4-prefix-length</label> + <input type="text" class="form-control" name="l3_interface_ipv4_prefix_length" id="l3_interface_ipv4_prefix_length"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#l3-interface-ipv4-address-list-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/l3_interface_ipv6_address_list.ejs b/admportal/views/partials/l3_interface_ipv6_address_list.ejs new file mode 100644 index 00000000..9faec4c0 --- /dev/null +++ b/admportal/views/partials/l3_interface_ipv6_address_list.ejs @@ -0,0 +1,42 @@ + <div class="modal fade" + id="l3-interface-ipv6-address-list-modal" tabindex="-1" role="dialog" + aria-labelledby="l3-interface-ipv6-address-list-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">l3-interface-ipv6-address-list</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="l3_interface_ipv6_address">l3-interface-ipv6-address</label> + <input type="text" class="form-control" name="l3_interface_ipv6_address" id="l3_interface_ipv6_address"> + </div> + <div class="form-group"> + <label for="l3_interface_ipv6_prefix_length">l3-interface-ipv6-prefix-length</label> + <input type="text" class="form-control" name="l3_interface_ipv6_prefix_length" id="l3_interface_ipv6_prefix_length"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#l3-interface-ipv6-address-list-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/l3sdn_vnf_fields.ejs b/admportal/views/partials/l3sdn_vnf_fields.ejs new file mode 100644 index 00000000..e3d842ef --- /dev/null +++ b/admportal/views/partials/l3sdn_vnf_fields.ejs @@ -0,0 +1,70 @@ + <div class="modal fade" + id="l3sdn-vnf-fields-modal" tabindex="-1" role="dialog" + aria-labelledby="l3sdn-vnf-fields-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">l3sdn-vnf-fields</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="availability_zone">availability_zone</label> + <input type="text" class="form-control" name="availability_zone" id="availability_zone"> + </div> + <div class="form-group"> + <label for="vnf_stack_id">vnf-stack-id</label> + <input type="text" class="form-control" name="vnf_stack_id" id="vnf_stack_id"> + </div> + <div class="form-group"> + <label for="vnf_name">vnf-name</label> + <input type="text" class="form-control" name="vnf_name" id="vnf_name"> + </div> + <div class="form-group"> + <label for="vnf_name2">vnf-name2</label> + <input type="text" class="form-control" name="vnf_name2" id="vnf_name2"> + </div> + <div class="form-group"> + <label for="vnf_type">vnf-type</label> + <input type="text" class="form-control" name="vnf_type" id="vnf_type"> + </div> + <div class="form-group"> + <label for="vnf_status">vnf-status</label> + <input type="text" class="form-control" name="vnf_status" id="vnf_status"> + </div> + <div class="form-group"> + <label for="vnf_id">vnf-id</label> + <input type="text" class="form-control" name="vnf_id" id="vnf_id"> + </div> + <div class="form-group"> + <label for="oam_network_name">oam-network-name</label> + <input type="text" class="form-control" name="oam_network_name" id="oam_network_name"> + </div> + <div class="form-group"> + <label for="aic_site_id">aic_site_id</label> + <input type="text" class="form-control" name="aic_site_id" id="aic_site_id"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#l3sdn-vnf-fields-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/link_latency_master.ejs b/admportal/views/partials/link_latency_master.ejs new file mode 100644 index 00000000..83e87f03 --- /dev/null +++ b/admportal/views/partials/link_latency_master.ejs @@ -0,0 +1,100 @@ +<div class="modal fade" id="add_link_latency_master" tabindex="-1" role="dialog" + aria-labelledby="add_link_latency_master_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Link Latency Master</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/tunnel/addLinkLatencyMaster" method="POST"> + <div class="form-group"> + <label for="nf_source_crs_name">*Source CRS Name</label> + <input type="text" class="form-control" maxlength="20" name="nf_source_crs_name" id="nf_source_crs_name" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_destination_crs_name">*Destination CRS Name</label> + <input type="text" class="form-control" maxlength="20" name="nf_destination_crs_name" id="nf_destination_crs_name" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_bundle_name">*Bundle Name</label> + <input type="text" class="form-control" maxlength="50" name="nf_bundle_name" id="nf_bundle_name" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="nf_latency">*Latency</label> + <input type="text" class="form-control" maxlength="10" name="nf_latency" id="nf_latency" placeholder="varchar(10)"> + </div> + <div class="form-group"> + <label for="nf_intra_inter_snrc">*Intra Inter SNRC</label> + <input type="text" class="form-control" maxlength="10" name="nf_intra_inter_snrc" id="nf_intra_inter_snrc" placeholder="varchar(10)"> + </div> + <div class="form-group"> + <label for="nf_final_latency">*Final Latency</label> + <input type="text" class="form-control" maxlength="10" name="nf_final_latency" id="nf_final_latency" placeholder="varchar(10)"> + </div> + <div class="form-group"> + <label for="nf_augmentable">*Augmentable</label> + <input type="text" class="form-control" maxlength="1" name="nf_augmentable" id="nf_augmentable" placeholder="varchar(1)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitLinkLatencyMaster(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + <div class="modal fade" id="update_link_latency_master" tabindex="-1" role="dialog" + aria-labelledby="update_link_latency_master_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Link Latency Master</h4> + </div> + <div class="modal-body"> + <form role="form" action="/tunnel/updateLinkLatencyMaster" method="POST"> + <div class="form-group"> + <label for="uf_source_crs_name">*Source CRS Name</label> + <input type="text" class="form-control" maxlength="20" name="uf_source_crs_name" id="uf_source_crs_name" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_destination_crs_name">*Destination CRS Name</label> + <input type="text" class="form-control" maxlength="20" name="uf_destination_crs_name" id="uf_destination_crs_name" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_bundle_name">*Bundle Name</label> + <input type="text" class="form-control" maxlength="50" name="uf_bundle_name" id="uf_bundle_name" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="uf_latency">*Latency</label> + <input type="text" class="form-control" maxlength="10" name="uf_latency" id="uf_latency" placeholder="varchar(10)"> + </div> + <div class="form-group"> + <label for="uf_intra_inter_snrc">*Intra Inter SNRC</label> + <input type="text" class="form-control" maxlength="10" name="uf_intra_inter_snrc" id="uf_intra_inter_snrc" placeholder="varchar(10)"> + </div> + <div class="form-group"> + <label for="uf_final_latency">*Final Latency</label> + <input type="text" class="form-control" maxlength="10" name="uf_final_latency" id="uf_final_latency" placeholder="varchar(10)"> + </div> + <div class="form-group"> + <label for="uf_augmentable">*Augmentable</label> + <input type="text" class="form-control" maxlength="1" name="uf_augmentable" id="uf_augmentable" placeholder="varchar(1)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_source_crs_name" id="uf_key_source_crs_name"> + <input type="hidden" name="uf_key_destination_crs_name" id="uf_key_destination_crs_name"> + <input type="hidden" name="uf_key_bundle_name" id="uf_key_bundle_name"> + <button type="button" class="btn btn-primary" onclick="submitLinkLatencyMaster(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/link_master.ejs b/admportal/views/partials/link_master.ejs new file mode 100644 index 00000000..5ece82dd --- /dev/null +++ b/admportal/views/partials/link_master.ejs @@ -0,0 +1,109 @@ +<div class="modal fade" id="add_link_master" tabindex="-1" role="dialog" + aria-labelledby="add_link_master_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Link Master</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/tunnel/addLinkMaster" method="POST"> + <div class="form-group"> + <label for="nf_link_interface_ip">*Link Interface IP</label> + <input type="text" class="form-control" name="nf_link_interface_ip" id="nf_link_interface_ip" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_source_crs_name">*Source CRS Name</label> + <input type="text" class="form-control" name="nf_source_crs_name" id="nf_source_crs_name" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_destination_crs_name">*Destination CRS Name</label> + <input type="text" class="form-control" name="nf_destination_crs_name" id="nf_destination_crs_name" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_link_speed">Link Speed</label> + <input type="text" class="form-control" name="nf_link_speed" id="nf_link_speed" maxlength="11" placeholder="int(11)"> + </div> + <div class="form-group"> + <label for="nf_default_cost">Default Cost</label> + <input type="text" class="form-control" name="nf_default_cost" id="nf_default_cost" maxlength="11" placeholder="int(11)"> + </div> + <div class="form-group"> + <label for="nf_bundle_name">Bundle Name</label> + <input type="text" class="form-control" name="nf_bundle_name" id="nf_bundle_name" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_shutdown">Shutdown</label> + <select class="form-control" name="nf_shutdown" id="nf_shutdown"> + <option value='N'>False</option> + <option value='Y'>True</option> + </select> + </div> + + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="saveLinkMaster(this.form);">Save</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> +</div> + +<div class="modal fade" id="update_link_master" tabindex="-1" role="dialog" + aria-labelledby="update_link_master_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Link Master</h4> + </div> + <div class="modal-body"> + <form role="form" action="/tunnel/updateLinkMaster" method="POST"> + <div class="form-group"> + <label for="uf_link_interface_ip">*Link Interface IP</label> + <input type="text" class="form-control" name="uf_link_interface_ip" id="uf_link_interface_ip" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_source_crs_name">*Source CRS Name</label> + <input type="text" class="form-control" name="uf_source_crs_name" id="uf_source_crs_name" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_destination_crs_name">*Destination CRS Name</label> + <input type="text" class="form-control" name="uf_destination_crs_name" id="uf_destination_crs_name" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_link_speed">Link Speed</label> + <input type="text" class="form-control" name="uf_link_speed" id="uf_link_speed" maxlength="11" placeholder="int(11)"> + </div> + <div class="form-group"> + <label for="uf_default_cost">Default Cost</label> + <input type="text" class="form-control" name="uf_default_cost" id="uf_default_cost" maxlength="11" placeholder="int(11)"> + </div> + <div class="form-group"> + <label for="uf_bundle_name">Bundle Name</label> + <input type="text" class="form-control" name="uf_bundle_name" id="uf_bundle_name" maxlength="20" placeholder="varchar(20)"> + </div> + + <div class="form-group"> + <label for="uf_shutdown">Shutdown</label> + <select class="form-control" name="uf_shutdown" id="uf_shutdown"> + <option value='N'>False</option> + <option value='Y'>True</option> + </select> + </div> + + + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_link_interface_ip" id="uf_key_link_interface_ip"> + <button type="button" class="btn btn-primary" onclick="saveLinkMaster(this.form);">Save</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> +</div> + diff --git a/admportal/views/partials/max_port_speed.ejs b/admportal/views/partials/max_port_speed.ejs new file mode 100644 index 00000000..a578308e --- /dev/null +++ b/admportal/views/partials/max_port_speed.ejs @@ -0,0 +1,86 @@ + <div class="modal fade" id="add_max_port_speed" tabindex="-1" role="dialog" + aria-labelledby="add_max_port_speed_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Max Port Speed</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/resalloc/addMaxPortSpeed" method="POST"> + <div class="form-group"> + <label for="nf_image_file_name">*Image File Name</label> + <input type="text" class="form-control" maxlength="50" name="nf_image_file_name" id="nf_image_file_name" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="nf_end_point_position">*End Point Position</label> + <input type="text" class="form-control" maxlength="50" name="nf_end_point_position" id="nf_end_point_position" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="nf_interface_name">*Interface Name</label> + <input type="text" class="form-control" maxlength="100" name="nf_interface_name" id="nf_interface_name" placeholder="varchar(100)" > + </div> + <div class="form-group"> + <label for="nf_max_speed">*Max Speed</label> + <input type="text" class="form-control" maxlength="50" name="nf_max_speed" id="nf_max_speed" placeholder="bigint(20)"> + </div> + <div class="form-group"> + <label for="nf_unit">*Unit</label> + <input type="text" class="form-control" maxlength="10" name="nf_unit" id="nf_unit" placeholder="varchar(10)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitMaxPortSpeed(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + <div class="modal fade" id="update_max_port_speed" tabindex="-1" role="dialog" + aria-labelledby="update_max_port_speed_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Max Port Speed</h4> + </div> + <div class="modal-body"> + <form name="updateForm" role="form" action="/resalloc/updateMaxPortSpeed" method="POST"> + <div class="form-group"> + <label for="uf_max_port_speed_id">*ID</label> + <input readonly type="text" class="form-control" name="uf_max_port_speed_id" id="uf_max_port_speed_id"> + </div> + <div class="form-group"> + <label for="uf_image_file_name">*Image File Name</label> + <input type="text" class="form-control" maxlength="50" name="uf_image_file_name" id="uf_image_file_name" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="uf_end_point_position">*End Point Position</label> + <input type="text" class="form-control" maxlength="50" name="uf_end_point_position" id="uf_end_point_position" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="uf_interface_name">*Interface Name</label> + <input type="text" class="form-control" maxlength="100" name="uf_interface_name" id="uf_interface_name" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="uf_max_speed">*Max Speed</label> + <input type="text" class="form-control" maxlength="50" name="uf_max_speed" id="uf_max_speed" placeholder="bigint(20)"> + </div> + <div class="form-group"> + <label for="uf_unit">*Unit</label> + <input type="text" class="form-control" maxlength="10" name="uf_unit" id="uf_unit" placeholder="varchar(10)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_max_port_speed_id" id="uf_key_max_port_speed_id"> + <button type="button" class="btn btn-primary" onclick="submitMaxPortSpeed(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/max_server_speed.ejs b/admportal/views/partials/max_server_speed.ejs new file mode 100644 index 00000000..6212414c --- /dev/null +++ b/admportal/views/partials/max_server_speed.ejs @@ -0,0 +1,88 @@ +<div class="modal fade" id="add_max_server_speed" tabindex="-1" role="dialog" + aria-labelledby="add_max_server_speed_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Max Server Speed</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/resalloc/addMaxServerSpeed" method="POST"> + <div class="form-group"> + <label for="nf_server_model">*Server ModelName</label> + <input type="text" class="form-control" maxlength="50" name="nf_server_model" id="nf_server_model" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="nf_evc_count">*EVC Count</label> + <input type="text" class="form-control" maxlength="50" name="nf_evc_count" id="nf_evc_count" placeholder="smallint(6)"> + </div> + <div class="form-group"> + <label for="nf_max_speed">*Max Speed</label> + <input type="text" class="form-control" maxlength="100" name="nf_max_speed" id="nf_max_speed" placeholder="bigint(20)"> + </div> + <div class="form-group"> + <label for="nf_unit">*Unit</label> + <input type="text" class="form-control" maxlength="10" name="nf_unit" id="nf_unit" placeholder="varchar(10)"> + </div> + <div class="form-group"> + <label for="nf_description">Description</label> + <input type="text" class="form-control" maxlength="500" name="nf_description" id="nf_description" placeholder="varchar(500)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <input type="hidden" name="nf_key_max_server_speed_id" id="nf_key_max_server_speed_id"> + <button type="button" class="btn btn-primary" onclick="submitMaxServerSpeed(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + + <div class="modal fade" id="update_max_server_speed" tabindex="-1" role="dialog" + aria-labelledby="max_server_speed_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Max Server Speed</h4> + </div> + <div class="modal-body"> + <form name="updateForm" role="form" action="/resalloc/updateMaxServerSpeed" method="POST"> + <div class="form-group"> + <label for="uf_max_server_speed_id">*ID</label> + <input readonly type="text" class="form-control" name="uf_max_server_speed_id" id="uf_max_server_speed_id"> + </div> + <div class="form-group"> + <label for="uf_server_model">*Server Model</label> + <input type="text" class="form-control" maxlength="50" name="uf_server_model" id="uf_server_model" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="uf_evc_count">*EVC Count</label> + <input type="text" class="form-control" maxlength="50" name="uf_evc_count" id="uf_evc_count" placeholder="smallint(6)"> + </div> + <div class="form-group"> + <label for="uf_max_speed">*Max Speed</label> + <input type="text" class="form-control" maxlength="50" name="uf_max_speed" id="uf_max_speed" placeholder="bigint(20)"> + </div> + <div class="form-group"> + <label for="uf_unit">*Unit</label> + <input type="text" class="form-control" maxlength="10" name="uf_unit" id="uf_unit" placeholder="varchar(10)"> + </div> + <div class="form-group"> + <label for="uf_description">Description</label> + <input type="text" class="form-control" maxlength="500" name="uf_description" id="uf_description" placeholder="varchar(500)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_max_server_speed_id" id="uf_key_max_server_speed_id"> + <button type="button" class="btn btn-primary" onclick="submitMaxServerSpeed(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/metroroadm_service_request.ejs b/admportal/views/partials/metroroadm_service_request.ejs new file mode 100644 index 00000000..e198f7fd --- /dev/null +++ b/admportal/views/partials/metroroadm_service_request.ejs @@ -0,0 +1,170 @@ +<div class="modal fade" id="add_metroroadm_service_request" tabindex="-1" role="dialog" + aria-labelledby="add_metroroadm_service_request_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Metro ROADM Service Request</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/tunnel/addMetroRoadmServiceRequest" method="POST"> + <div class="form-group"> + <label for="nf_request_id">*Request ID</label> + <input type="text" class="form-control" maxlength="75" name="nf_request_id" id="nf_request_id" placeholder="varchar(75)"> + </div> + <div class="form-group"> + <label for="nf_request_source">Request Source</label> + <input type="text" class="form-control" maxlength="20" name="nf_request_source" id="nf_request_source" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_notification_url">Notification URL</label> + <input type="text" class="form-control" maxlength="255" name="nf_notification_url" id="nf_notification_url" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="nf_l_action">*Action</label> + <input type="text" class="form-control" maxlength="10" name="nf_l_action" id="nf_l_action" placeholder="varchar(10)"> + </div> + <div class="form-group"> + <label for="nf_request_timestamp">*Request Timestamp</label> + <input type="text" class="form-control" maxlength="80" name="nf_request_timestamp" id="nf_request_timestamp" placeholder="YYYY-MM-DD HH:MM:SS"> + </div> + <div class="form-group"> + <label for="nf_update_timestamp">Update Timestamp</label> + <input type="text" class="form-control" maxlength="80" name="nf_update_timestamp" id="nf_update_timestamp" placeholder="varchar(80)"> + </div> + <div class="form-group"> + <label for="nf_request_status">*Request Status</label> + <input type="text" class="form-control" maxlength="20" name="nf_request_status" id="nf_request_status" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_processing_status">*Processing Status</label> + <input type="text" class="form-control" maxlength="40" name="nf_processing_status" id="nf_processing_status" placeholder="varchar(40)"> + </div> + <div class="form-group"> + <label for="nf_reason_code">Reason Code</label> + <input type="text" class="form-control" maxlength="255" name="nf_reason_code" id="nf_reason_code" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="nf_reason_message">Reason Message</label> + <input type="text" class="form-control" maxlength="255" name="nf_reason_message" id="nf_reason_message" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="nf_service_id">*Service Id</label> + <input type="text" class="form-control" maxlength="50" name="nf_service_id" id="nf_service_id" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="nf_common_id">Common Id</label> + <input type="text" class="form-control" maxlength="12" name="nf_common_id" id="nf_common_id" placeholder="varchar(12)"> + </div> + <div class="form-group"> + <label for="nf_clli_a">CLLI A</label> + <input type="text" class="form-control" maxlength="20" name="nf_clli_a" id="nf_clli_a" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_clli_z">CLLI Z</label> + <input type="text" class="form-control" maxlength="20" name="nf_clli_z" id="nf_clli_z" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_customer">Customer</label> + <input type="text" class="form-control" maxlength="255" name="nf_customer" id="nf_customer" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="nf_controller_id">*Controller Id</label> + <input type="text" class="form-control" maxlength="255" name="nf_controller_id" id="nf_controller_id" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitMetroRoadmServiceRequest(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + <div class="modal fade" id="update_metroroadm_service_request" tabindex="-1" role="dialog" + aria-labelledby="update_metroroadm_service_request_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Metro ROADM Service Request</h4> + </div> + <div class="modal-body"> + <form role="form" action="/tunnel/updateMetroRoadmServiceRequest" method="POST"> + <div class="form-group"> + <label for="uf_request_id">*Request ID</label> + <input type="text" class="form-control" maxlength="75" name="uf_request_id" id="uf_request_id" placeholder="varchar(75)"> + </div> + <div class="form-group"> + <label for="uf_request_source">Request Source</label> + <input type="text" class="form-control" maxlength="20" name="uf_request_source" id="uf_request_source" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_notification_url">Notification URL</label> + <input type="text" class="form-control" maxlength="255" name="uf_notification_url" id="uf_notification_url" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="uf_l_action">*Action</label> + <input type="text" class="form-control" maxlength="10" name="uf_l_action" id="uf_l_action" placeholder="varchar(10)"> + </div> + <div class="form-group"> + <label for="uf_request_timestamp">*Request Timestamp</label> + <input type="text" class="form-control" maxlength="80" name="uf_request_timestamp" id="uf_request_timestamp" placeholder="varchar(80)"> + </div> + <div class="form-group"> + <label for="uf_update_timestamp">Update Timestamp</label> + <input type="text" class="form-control" maxlength="80" name="uf_update_timestamp" id="uf_update_timestamp" placeholder="varchar(80)"> + </div> + <div class="form-group"> + <label for="uf_request_status">*Request Status</label> + <input type="text" class="form-control" maxlength="20" name="uf_request_status" id="uf_request_status" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_processing_status">*Processing Status</label> + <input type="text" class="form-control" maxlength="40" name="uf_processing_status" id="uf_processing_status" placeholder="varchar(40)"> + </div> + <div class="form-group"> + <label for="uf_reason_code">Reason Code</label> + <input type="text" class="form-control" maxlength="255" name="uf_reason_code" id="uf_reason_code" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="uf_reason_message">Reason Message</label> + <input type="text" class="form-control" maxlength="255" name="uf_reason_message" id="uf_reason_message" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="uf_service_id">*Service Id</label> + <input type="text" class="form-control" maxlength="50" name="uf_service_id" id="uf_service_id" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="uf_common_id">Common Id</label> + <input type="text" class="form-control" maxlength="12" name="uf_common_id" id="uf_common_id" placeholder="varchar(12)"> + </div> + <div class="form-group"> + <label for="uf_clli_a">CLLI A</label> + <input type="text" class="form-control" maxlength="20" name="uf_clli_a" id="uf_clli_a" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_clli_z">CLLI Z</label> + <input type="text" class="form-control" maxlength="20" name="uf_clli_z" id="uf_clli_z" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_customer">Customer</label> + <input type="text" class="form-control" maxlength="255" name="uf_customer" id="uf_customer" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="uf_controller_id">*Controller Id</label> + <input type="text" class="form-control" maxlength="255" name="uf_controller_id" id="uf_controller_id" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_request_id" id="uf_key_request_id"> + <button type="button" class="btn btn-primary" onclick="submitMetroRoadmServiceRequest(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/nat.ejs b/admportal/views/partials/nat.ejs new file mode 100644 index 00000000..973c2549 --- /dev/null +++ b/admportal/views/partials/nat.ejs @@ -0,0 +1,38 @@ + <div class="modal fade" id="nat-modal" tabindex="-1" role="dialog" + aria-labelledby="nat-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">nat</h4> + </div> + <div class="modal-body"> + <form id="nat_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="v4_nat_enabled">v4-nat-enabled</label> + <input type="text" class="form-control" name="v4_nat_enabled" id="v4_nat_enabled"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#nat-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/nb_vlan_pool.ejs b/admportal/views/partials/nb_vlan_pool.ejs new file mode 100644 index 00000000..d5e8973b --- /dev/null +++ b/admportal/views/partials/nb_vlan_pool.ejs @@ -0,0 +1,38 @@ + <div class="modal fade" id="update_nb_vlan_pool" tabindex="-1" role="dialog" + aria-labelledby="update_nb_vlan_pool_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update NetBond VLAN Pool</h4> + </div> + <div class="modal-body"> + <form name="updateForm" role="form" action="/gamma/updateNbVlanPool" method="POST"> + + <div class="form-group"> + <label for="nf_plan_type">Status</label> + <select class="form-control" name="uf_status" id="uf_status"> + <option value="AVAILABLE">AVAILABLE</option> + <option value="RESERVED">RESERVED</option> + <option value="IN-USE">IN-USE</option> + </select> + </div> + + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_aic_site_id" id="uf_key_aic_site_id"> + <input type="hidden" name="uf_key_availability_zone" id="uf_key_availability_zone"> + <input type="hidden" name="uf_key_vlan_plan_id" id="uf_key_vlan_plan_id"> + <input type="hidden" name="uf_key_plan_type" id="uf_key_plan_type"> + <input type="hidden" name="uf_key_purpose" id="uf_key_purpose"> + <input type="hidden" name="uf_key_vlan_id" id="uf_key_vlan_id"> + + <button type="button" class="btn btn-primary" + onclick="saveNbVlanPool(this.form);">Save</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/nb_vlan_range.ejs b/admportal/views/partials/nb_vlan_range.ejs new file mode 100644 index 00000000..4cc24a2d --- /dev/null +++ b/admportal/views/partials/nb_vlan_range.ejs @@ -0,0 +1,45 @@ + <div class="modal fade" id="add_vlan_range" tabindex="-1" role="dialog" + aria-labelledby="add_vlan_range_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add NetBond VLAN Range</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/gamma/saveNbVlanRange" method="POST"> + + <div class="form-group"> + <label for="nf_plan_type">*Plan Type</label> + <select class="form-control" name="nf_plan_type" id="nf_plan_type"> + <option value="NB VNAT">NB VNAT</option> + </select> + </div> + + <div class="form-group"> + <label for="nf_purpose">*Purpose</label> + <select class="form-control" name="nf_purpose" id="nf_purpose"> + <option value=CUSTOMER>CUSTOMER</option> + <option value=PARTNER>PARTNER</option> + </select> + </div> + + <div class="form-group"> + <label for="nf_range_start">*Range Start</label> + <input type="text" class="form-control" name="nf_range_start" id="nf_range_start" maxlength="4" placeholder="int(4)"> + </div> + + <div class="form-group"> + <label for="nf_range_end">*Range End</label> + <input type="text" class="form-control" name="nf_range_end" id="nf_range_end" maxlength="4" placeholder="int(4)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="saveNbVlanRange(this.form);">Save</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/ncs_credentials.ejs b/admportal/views/partials/ncs_credentials.ejs new file mode 100644 index 00000000..a35b7e48 --- /dev/null +++ b/admportal/views/partials/ncs_credentials.ejs @@ -0,0 +1,74 @@ +<div class="modal fade" id="add_ncs_credentials" tabindex="-1" role="dialog" + aria-labelledby="add_ncs_credentials_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add NCS Credentials</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/ucpe/addNcsCredentials" method="POST"> + <div class="form-group"> + <label for="nf_customer_name">*Customer Name</label> + <input type="text" class="form-control" maxlength="255" aria-describedby="helpCName" name="nf_customer_name" id="nf_customer_name" placeholder="varchar(255)"> + <span id="helpCName" class="help-block">The Customer Name must match exactly whats in the NCS Servers table.</span> + </div> + <div class="form-group"> + <label for="nf_ncs_username">*NCS Username</label> + <input type="text" class="form-control" maxlength="255" name="nf_ncs_username" id="nf_ncs_username" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="nf_ncs_password">*NCS Password</label> + <input type="password" class="form-control" maxlength="255" name="nf_ncs_password" id="nf_ncs_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <label for="nf_phs_password">*Confirm NCS Password</label> + <input type="password" class="form-control" maxlength="255" name="nf_confirm_ncs_password" id="nf_confirm_ncs_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitNcsCredentials(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + <div class="modal fade" id="update_ncs_credentials" tabindex="-1" role="dialog" + aria-labelledby="update_ncs_credentials_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update NCS Credentials</h4> + </div> + <div class="modal-body"> + <form role="form" action="/ucpe/updateNcsCredentials" method="POST"> + <div class="form-group"> + <label for="uf_customer_name">*Customer Name</label> + <input readonly type="text" class="form-control" name="uf_customer_name" id="uf_customer_name"> + </div> + <div class="form-group"> + <label for="uf_ncs_username">*NCS Username</label> + <input type="text" class="form-control" maxlength="255" name="uf_ncs_username" id="uf_ncs_username"> + </div> + <div class="form-group"> + <label for="uf_ncs_password">*NCS Password</label> + <input type="password" class="form-control" maxlength="255" name="uf_ncs_password" id="uf_ncs_password"> + </div> + <div class="form-group"> + <label for="nf_phs_password">*Confirm NCS Password</label> + <input type="password" class="form-control" maxlength="255" name="uf_confirm_ncs_password" id="uf_confirm_ncs_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submitNcsCredentials(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/network_connections.ejs b/admportal/views/partials/network_connections.ejs new file mode 100644 index 00000000..72093233 --- /dev/null +++ b/admportal/views/partials/network_connections.ejs @@ -0,0 +1,66 @@ + <div class="modal fade" + id="network-connections-modal" tabindex="-1" role="dialog" + aria-labelledby="network-connections-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">network-connections</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="stack_id">stack-id</label> + <input type="text" class="form-control" name="stack_id" id="stack_id"> + </div> + <div class="form-group"> + <label for="net_status">net-status</label> + <input type="text" class="form-control" name="net_status" id="net_status"> + </div> + <div class="form-group"> + <label for="connection_type">connection-type</label> + <input type="text" class="form-control" name="connection_type" id="connection_type"> + </div> + <div class="form-group"> + <label for="provider_network">provider-network</label> + <input type="text" class="form-control" name="provider_network" id="provider_network"> + </div> + <div class="form-group"> + <label for="interface_id">interface-id</label> + <input type="text" class="form-control" name="interface_id" id="interface_id"> + </div> + <div class="form-group"> + <label for="vlan">vlan</label> + <input type="text" class="form-control" name="vlan" id="vlan"> + </div> + <div class="form-group"> + <label for="port_group_name">port-group-name</label> + <input type="text" class="form-control" name="port_group_name" id="port_group_name"> + </div> + <div class="form-group"> + <label for="neutron_network_id">neutron-network-id</label> + <input type="text" class="form-control" name="neutron_network_id" id="neutron_network_id"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#network-connections-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/network_profile.ejs b/admportal/views/partials/network_profile.ejs new file mode 100644 index 00000000..81d7f32a --- /dev/null +++ b/admportal/views/partials/network_profile.ejs @@ -0,0 +1,59 @@ + <div class="modal fade" id="add_network_profile" tabindex="-1" role="dialog" + aria-labelledby="add_network_profile" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Network Profile</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/gamma/addNetworkProfile" method="POST"> + <div class="form-group"> + <label for="nf_network_type">*Network Type</label> + <input type="text" class="form-control" name="nf_network_type" id="nf_network_type" maxlength="100" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="nf_technology">Technology</label> + <input type="text" class="form-control" name="nf_technology" id="nf_technology" maxlength="100" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="saveNetworkProfile(this.form);">Save</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + +<div class="modal fade" id="update_network_profile" tabindex="-1" role="dialog" + aria-labelledby="update_network_profile_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Network Profile</h4> + </div> + <div class="modal-body"> + <form role="form" action="/gamma/updateNetworkProfile" method="POST"> + <div class="form-group"> + <label for="uf_network_type">*Network Type</label> + <input type="text" class="form-control" maxlength="100" name="uf_network_type" id="uf_network_type" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="uf_technology">Technology</label> + <input type="text" class="form-control" maxlength="100" name="uf_technology" id="uf_technology" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_network_type" id="uf_key_network_type"> + <button type="button" class="btn btn-primary" onclick="saveNetworkProfile(this.form);">Save</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + diff --git a/admportal/views/partials/new_parameter.ejs b/admportal/views/partials/new_parameter.ejs new file mode 100644 index 00000000..b6d1f5be --- /dev/null +++ b/admportal/views/partials/new_parameter.ejs @@ -0,0 +1,36 @@ + <div class="modal fade" id="new_parameter" tabindex="-1" role="dialog" + aria-labelledby="new_parameter_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Parameter</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/admin/addParameter" method="POST"> + <div class="form-group"> + <label for="nf_name">*Name</label> + <input maxlength="100" type="text" class="form-control" name="nf_name" id="nf_name" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="nf_value">*Value</label> + <input maxlength="100" type="text" class="form-control" name="nf_value" id="nf_value" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="nf_category">Category</label> + <input maxlength="24" type="text" class="form-control" name="nf_category" id="nf_category" placeholder="varchar(24)"> + </div> + <div class="form-group"> + <label for="nf_memo">Memo</label> + <input maxlength="128" type="text" class="form-control" name="nf_memo" id="nf_memo" placeholder="varchar(128)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitParam(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/newuserform.ejs b/admportal/views/partials/newuserform.ejs new file mode 100644 index 00000000..60459947 --- /dev/null +++ b/admportal/views/partials/newuserform.ejs @@ -0,0 +1,37 @@ +<div class="modal fade" id="newUserModal" tabindex="-1" role="dialog" aria-labelledby="newUserModalLabel" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title" id="newUserModalLabel">New User</h4> + </div> + <div class="modal-body"> + <form id="addForm" name="addForm" role="form" action="/user/addUser" method="POST"> + <div class="form-group"> + <label for="email">Email</label> + <input type="email" class="form-control" name="nf_email" id="nf_email"> + </div> + <div class="form-group"> + <label for="nf_password">Password</label> + <input type="password" class="form-control" name="nf_password" id="nf_password"> + </div> + <div class="form-group"> + <label for="nf_confirm_password">Confirm Password</label> + <input type="password" class="form-control" name="nf_confirm_password" id="nf_confirm_password"> + </div> + <div class="form-group"> + <label for="privilege">Privilege</label> + <select class="form-control" name="nf_privilege" id="nf_privilege"> + <option value=admin>Administrator</option> + <option value=readonly>Readonly</option> + </select> + </div> + <div class="form-group"> + <button type="button" class="btn btn-primary" onclick="submitUserAdmin(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> +</div> diff --git a/admportal/views/partials/oper_status_modal.ejs b/admportal/views/partials/oper_status_modal.ejs new file mode 100644 index 00000000..ae6cbe06 --- /dev/null +++ b/admportal/views/partials/oper_status_modal.ejs @@ -0,0 +1,68 @@ + <div class="modal fade" id="oper-status-modal" tabindex="-1" role="dialog" aria-labelledby="oper-status-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title" id="oper-status-modal-label">oper-status</h4> + </div> + <div class="modal-body"> + <form id="oper_status_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="order_status">order-status</label> + <input type="text" class="form-control" name="order_status" id="order_status"> + </div> + <div class="form-group"> + <label for="modify_timestamp">modify-timestamp</label> + <input type="text" class="form-control" name="modify_timestamp" id="modify_timestamp"> + </div> + <div class="form-group"> + <label for="last_svc_request_id">last-svc-request-id</label> + <input type="text" class="form-control" name="last_svc_request_id" id="last_svc_request_id"> + </div> + <div class="form-group"> + <label for="last_sub_action">last-sub-action</label> + <input type="text" class="form-control" name="last_sub_action" id="last_sub_action"> + </div> + <div class="form-group"> + <label for="t_defaulted_v6_vrlan">t-defaulted-v6-vrlan</label> + <input type="text" class="form-control" name="t_defaulted_v6_vrlan" id="t_defaulted_v6_vrlan"> + </div> + <div class="form-group"> + <label for="last_action">last-action</label> + <input type="text" class="form-control" name="last_action" id="last_action"> + </div> + <div class="form-group"> + <label for="create_timestamp">create-timestamp</label> + <input type="text" class="form-control" name="create_timestamp" id="create_timestamp"> + </div> + <div class="form-group"> + <label for="maintenance_indicator">maintenance-indicator</label> + <input type="text" class="form-control" name="maintenance_indicator" id="maintenance_indicator"> + </div> + <div class="form-group"> + <label for="last_order_status">last-order-status</label> + <input type="text" class="form-control" name="last_order_status" id="last_order_status"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#service-status-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/owbc_properties.ejs b/admportal/views/partials/owbc_properties.ejs new file mode 100644 index 00000000..0d640325 --- /dev/null +++ b/admportal/views/partials/owbc_properties.ejs @@ -0,0 +1,98 @@ +<div class="modal fade" id="add_owbc_properties" tabindex="-1" role="dialog" + aria-labelledby="add_owbc_properties_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add OWBC Properties</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/tunnel/addOwbcProperties" method="POST"> + <div class="form-group"> + <label for="nf_controller_id">*Controller ID</label> + <input type="text" class="form-control" maxlength="255" name="nf_controller_id" id="nf_controller_id" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="nf_base_uri">*Base URL</label> + <input type="text" class="form-control" maxlength="255" name="nf_base_uri" id="nf_base_uri" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="nf_service_create_extension">*Service Create Extension</label> + <input type="text" class="form-control" maxlength="255" name="nf_service_create_extension" id="nf_service_create_extension" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="nf_service_delete_extension">*Service Delete Extension</label> + <input type="text" class="form-control" maxlength="255" name="nf_service_delete_extension" id="nf_service_delete_extension" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="nf_auth_username">*Auth Username</label> + <input type="text" class="form-control" maxlength="80" name="nf_auth_username" id="nf_auth_username" placeholder="varchar(80)"> + </div> + <div class="form-group"> + <label for="nf_auth_password">*Auth Password</label> + <input type="password" class="form-control" maxlength="80" name="nf_auth_password" id="nf_auth_password" placeholder="varbinary(80)"> + </div> + <div class="form-group"> + <label for="nf_confirm_auth_password">*Confirm Auth Password</label> + <input type="password" class="form-control" maxlength="80" name="nf_confirm_auth_password" id="nf_confirm_auth_password" placeholder="varbinary(80)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitOwbcProperties(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + <div class="modal fade" id="update_owbc_properties" tabindex="-1" role="dialog" + aria-labelledby="update_owbc_properties_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update OWBC Properties</h4> + </div> + <div class="modal-body"> + <form role="form" action="/tunnel/updateOwbcProperties" method="POST"> + <div class="form-group"> + <label for="uf_controller_id">*Controller ID</label> + <input type="text" class="form-control" maxlength="255" name="uf_controller_id" id="uf_controller_id" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="uf_base_uri">*Base URL</label> + <input type="text" class="form-control" maxlength="255" name="uf_base_uri" id="uf_base_uri" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="uf_service_create_extension">*Service Create Extension</label> + <input type="text" class="form-control" maxlength="255" name="uf_service_create_extension" id="uf_service_create_extension" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="uf_service_delete_extension">*Service Delete Extension</label> + <input type="text" class="form-control" maxlength="255" name="uf_service_delete_extension" id="uf_service_delete_extension" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="uf_auth_username">*Auth Username</label> + <input type="text" class="form-control" maxlength="80" name="uf_auth_username" id="uf_auth_username" placeholder="varchar(80)"> + </div> + <div class="form-group"> + <label for="uf_auth_password">*Auth Password</label> + <input type="password" class="form-control" maxlength="80" name="uf_auth_password" id="uf_auth_password" placeholder="varbinary(80)"> + </div> + <div class="form-group"> + <label for="uf_confirm_auth_password">*Confirm Auth Password</label> + <input type="password" class="form-control" maxlength="80" name="uf_confirm_auth_password" id="uf_confirm_auth_password" placeholder="varbinary(80)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_controller_id" id="uf_key_controller_id"> + <button type="button" class="btn btn-primary" onclick="submitOwbcProperties(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/partner_properties.ejs b/admportal/views/partials/partner_properties.ejs new file mode 100644 index 00000000..1f1d601a --- /dev/null +++ b/admportal/views/partials/partner_properties.ejs @@ -0,0 +1,74 @@ +<div class="modal fade" id="add_partner_properties" tabindex="-1" role="dialog" + aria-labelledby="add_partner_properties_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Partner Properties</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/tunnel/addPartnerProperties" method="POST"> + <div class="form-group"> + <label for="nf_partner">*Partner</label> + <input type="text" class="form-control" maxlength="100" name="nf_partner" id="nf_partner" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="nf_auth_username">*Auth Username</label> + <input type="text" class="form-control" maxlength="80" name="nf_auth_username" id="nf_auth_username" placeholder="varchar(80)"> + </div> + <div class="form-group"> + <label for="nf_auth_password">*Auth Password</label> + <input type="password" class="form-control" maxlength="255" name="nf_auth_password" id="nf_auth_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <label for="nf_confirm_auth_password">*Confirm Auth Password</label> + <input type="password" class="form-control" maxlength="255" name="nf_confirm_auth_password" id="nf_confirm_auth_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitPartnerProperties(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + <div class="modal fade" id="update_partner_properties" tabindex="-1" role="dialog" + aria-labelledby="update_partner_properties_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Partner Properties</h4> + </div> + <div class="modal-body"> + <form role="form" action="/tunnel/updatePartnerProperties" method="POST"> + <div class="form-group"> + <label for="uf_partner">*Partner</label> + <input type="text" class="form-control" maxlength="100" name="uf_partner" id="uf_partner" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="uf_auth_username">*Auth Username</label> + <input type="text" class="form-control" maxlength="80" name="uf_auth_username" id="uf_auth_username" placeholder="varchar(80)"> + </div> + <div class="form-group"> + <label for="uf_auth_password">*Auth Password</label> + <input type="password" class="form-control" maxlength="255" name="uf_auth_password" id="uf_auth_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <label for="uf_confirm_auth_password">*Confirm Auth Password</label> + <input type="password" class="form-control" maxlength="255" name="uf_confirm_auth_password" id="uf_confirm_auth_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_partner" id="uf_key_partner"> + <button type="button" class="btn btn-primary" onclick="submitPartnerProperties(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/pat.ejs b/admportal/views/partials/pat.ejs new file mode 100644 index 00000000..8cc91555 --- /dev/null +++ b/admportal/views/partials/pat.ejs @@ -0,0 +1,50 @@ + <div class="modal fade" id="pat-modal" tabindex="-1" role="dialog" + aria-labelledby="pat-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">pat</h4> + </div> + <div class="modal-body"> + <form id="pat_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="v4_pat_default_pool_prefix_length">v4-pat-default-pool-prefix-length</label> + <input type="text" class="form-control" name="v4_pat_default_pool_prefix_length" id="v4_pat_default_pool_prefix_length"> + </div> + <div class="form-group"> + <label for="use_v4_default_pool">use-v4-default-pool</label> + <input type="text" class="form-control" name="use_v4_default_pool" id="use_v4_default_pool"> + </div> + <div class="form-group"> + <label for="v4_pat_enabled">v4-pat-enabled</label> + <input type="text" class="form-control" name="v4_pat_enabled" id="v4_pat_enabled"> + </div> + <div class="form-group"> + <label for="v4_pat_default_pool_prefix">v4-pat-default-pool-prefix</label> + <input type="text" class="form-control" name="v4_pat_default_pool_prefix" id="v4_pat_default_pool_prefix"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#pat-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/pat_pools.ejs b/admportal/views/partials/pat_pools.ejs new file mode 100644 index 00000000..5b0b3f09 --- /dev/null +++ b/admportal/views/partials/pat_pools.ejs @@ -0,0 +1,46 @@ + <div class="modal fade" id="pat-pools-modal" tabindex="-1" role="dialog" + aria-labelledby="pat-pools-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">v4-pat-pools</h4> + </div> + <div class="modal-body"> + <form id="pat_pools-form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="v4_pat__pool_next_hop_address">v4-pat-pool-next-hop-address</label> + <input type="text" class="form-control" name="v4_pat_pool_next_hop_address" id="v4_pat_pool_next_hop_address"> + </div> + <div class="form-group"> + <label for="v4_pat_pool_prefix_length">v4-pat-pool-prefix-length</label> + <input type="text" class="form-control" name="v4_pat_pool_prefix_length" id="v4_pat_pool_prefix_length"> + </div> + <div class="form-group"> + <label for="v4_pat_pool_prefix">v4-pat-pool-prefix</label> + <input type="text" class="form-control" name="v4_pat_pool_prefix" id="v4_pat_pool_prefix"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#pat-pools-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/phs_credentials.ejs b/admportal/views/partials/phs_credentials.ejs new file mode 100644 index 00000000..4413dcad --- /dev/null +++ b/admportal/views/partials/phs_credentials.ejs @@ -0,0 +1,92 @@ +<div class="modal fade" id="add_phs_credentials" tabindex="-1" role="dialog" + aria-labelledby="add_phs_credentials_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add PHS Credentials</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/ucpe/addPhsCredentials" method="POST"> + <div class="form-group"> + <label for="nf_device_vendor_name">*Device Vendor Name</label> + <input type="text" class="form-control" maxlength="255" aria-describedby="helpVName" name="nf_device_vendor_name" id="nf_device_vendor_name" placeholder="varchar(255)"> + <span id="helpVName" class="help-block">The Device Vendor Name must match exactly whats in the PHS Servers table.</span> + </div> + <div class="form-group"> + <label for="nf_customer_name">*Customer Name</label> + <input type="text" class="form-control" maxlength="255" aria-describedby="helpCName" name="nf_customer_name" id="nf_customer_name" placeholder="varchar(255)"> + <span id="helpCName" class="help-block">The Customer Name must match exactly whats in the PHS Servers table.</span> + </div> + <div class="form-group"> + <label for="nf_ip_addresses">*IP Addresses</label> + <input type="text" class="form-control" maxlength="40" aria-describedby="helpIP" name="nf_ip_addresses" id="nf_ip_addresses" placeholder="varchar(40)"> + <span id="helpIP" class="help-block">The IP Addresses must match exactly whats in the PHS Servers table.</span> + </div> + <div class="form-group"> + <label for="nf_phs_username">*PHS Username</label> + <input type="text" class="form-control" maxlength="255" name="nf_phs_username" id="nf_phs_username" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="nf_phs_password">*PHS Password</label> + <input type="password" class="form-control" maxlength="255" name="nf_phs_password" id="nf_phs_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <label for="nf_phs_password">*Confirm PHS Password</label> + <input type="password" class="form-control" maxlength="255" name="nf_confirm_phs_password" id="nf_confirm_phs_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitPhsCredentials(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + <div class="modal fade" id="update_phs_credentials" tabindex="-1" role="dialog" + aria-labelledby="update_phs_credentials_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update PHS Credentials</h4> + </div> + <div class="modal-body"> + <form role="form" action="/ucpe/updatePhsCredentials" method="POST"> + <div class="form-group"> + <label for="uf_device_vendor_name">*Device Vendor Name</label> + <input readonly type="text" class="form-control" name="uf_device_vendor_name" id="uf_device_vendor_name"> + </div> + <div class="form-group"> + <label for="uf_customer_name">*Customer Name</label> + <input readonly type="text" class="form-control" name="uf_customer_name" id="uf_customer_name"> + </div> + <div class="form-group"> + <label for="uf_ip_addresses">*IP Addresses</label> + <input readonly type="text" class="form-control" name="uf_ip_addresses" id="uf_ip_addresses"> + </div> + <div class="form-group"> + <label for="uf_phs_username">*PHS Username</label> + <input type="text" class="form-control" maxlength="255" name="uf_phs_username" id="uf_phs_username"> + </div> + <div class="form-group"> + <label for="uf_phs_password">*PHS Password</label> + <input type="password" class="form-control" maxlength="255" name="uf_phs_password" id="uf_phs_password"> + </div> + <div class="form-group"> + <label for="uf_phs_password">*Confirm PHS Password</label> + <input type="password" class="form-control" maxlength="255" name="uf_confirm_phs_password" id="uf_confirm_phs_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submitPhsCredentials(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/request_information_modal.ejs b/admportal/views/partials/request_information_modal.ejs new file mode 100644 index 00000000..b5ee4a31 --- /dev/null +++ b/admportal/views/partials/request_information_modal.ejs @@ -0,0 +1,60 @@ + <div class="modal fade" id="request-information-modal" tabindex="-1" role="dialog" aria-labelledby="request-information-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title" id="request-information-modal-label">request-information</h4> + </div> + <div class="modal-body"> + <form id="request_information_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="notification_url">notification-url</label> + <input type="text" class="form-control" name="notification_url" id="notification_url"> + </div> + <div class="form-group"> + <label for="source">source</label> + <input type="text" class="form-control" name="source" id="source"> + </div> + <div class="form-group"> + <label for="order_number">order-number</label> + <input type="text" class="form-control" name="order_number" id="order_number"> + </div> + <div class="form-group"> + <label for="request_id">request-id</label> + <input type="text" class="form-control" name="request_id" id="request_id"> + </div> + <div class="form-group"> + <label for="order_version">order-version</label> + <input type="text" class="form-control" name="order_version" id="order_version"> + </div> + <div class="form-group"> + <label for="request_action">request-action</label> + <input type="text" class="form-control" name="request_action" id="request_action"> + </div> + <div class="form-group"> + <label for="request_sub_action">request-sub-action</label> + <input type="text" class="form-control" name="request_sub_action" id="request_sub_action"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#service-status-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/resource_rule.ejs b/admportal/views/partials/resource_rule.ejs new file mode 100644 index 00000000..05d0bf4e --- /dev/null +++ b/admportal/views/partials/resource_rule.ejs @@ -0,0 +1,118 @@ +<div class="modal fade" id="add_resource_rule" tabindex="-1" role="dialog" + aria-labelledby="add_resource_rule_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Resource Rule</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/resalloc/addResourceRule" method="POST"> + <div class="form-group"> + <label for="nf_resource_name">*Name</label> + <input type="text" class="form-control" maxlength="50" name="nf_resource_name" id="nf_resource_name" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="nf_end_point_position">*End Point Position</label> + <input type="text" class="form-control" maxlength="50" name="nf_end_point_position" id="nf_end_point_position" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="nf_service_expression">*Service Expression</label> + <input type="text" class="form-control" maxlength="2000" name="nf_service_expression" id="nf_service_expression" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <label for="nf_equipment_level">*Equipment Level</label> + <input type="text" class="form-control" maxlength="50" name="nf_equipment_level" id="nf_equipment_level" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="nf_equipment_expression">*Equipment Expression</label> + <input type="text" class="form-control" maxlength="2000" name="nf_equipment_expression" id="nf_equipment_expression" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <label for="nf_allocation_expression">*Allocation Expression</label> + <input type="text" class="form-control" maxlength="2000" name="nf_allocation_expression" id="nf_allocation_expression" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <label for="nf_soft_limit_expression">*Soft Limit Expression</label> + <input type="text" class="form-control" maxlength="2000" name="nf_soft_limit_expression" id="nf_soft_limit_expression" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <label for="nf_hard_limit_expression">*Hard Limit Expression</label> + <input type="text" class="form-control" maxlength="2000" name="nf_hard_limit_expression" id="nf_hard_limit_expression" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <label for="nf_service_model">*Service Model</label> + <input type="text" class="form-control" maxlength="50" name="nf_service_model" id="nf_service_model" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitResourceRule(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + <div class="modal fade" id="update_resource_rule" tabindex="-1" role="dialog" + aria-labelledby="update_resource_rule_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Resource Rule</h4> + </div> + <div class="modal-body"> + <form role="form" action="/resalloc/updateResourceRule" method="POST"> + <div class="form-group"> + <label for="uf_resource_rule_id">*Rule ID</label> + <input readonly type="text" class="form-control" name="uf_resource_rule_id" id="uf_resource_rule_id"> + </div> + <div class="form-group"> + <label for="uf_resource_name">*Name</label> + <input type="text" class="form-control" maxlength="50" name="uf_resource_name" id="uf_resource_name" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="uf_end_point_position">*End Point Position</label> + <input type="text" class="form-control" maxlength="50" name="uf_end_point_position" id="uf_end_point_position" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="uf_service_expression">*Service Expression</label> + <input type="text" class="form-control" maxlength="2000" name="uf_service_expression" id="uf_service_expression" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <label for="uf_equipment_level">*Equipment Level</label> + <input type="text" class="form-control" maxlength="50" name="uf_equipment_level" id="uf_equipment_level" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="uf_equipment_expression">*Equipment Expression</label> + <input type="text" class="form-control" maxlength="2000" name="uf_equipment_expression" id="uf_equipment_expression" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <label for="uf_allocation_expression">*Allocation Expression</label> + <input type="text" class="form-control" maxlength="2000" name="uf_allocation_expression" id="uf_allocation_expression" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <label for="uf_soft_limit_expression">*Soft Limit Expression</label> + <input type="text" class="form-control" maxlength="2000" name="uf_soft_limit_expression" id="uf_soft_limit_expression" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <label for="uf_hard_limit_expression">*Hard Limit Expression</label> + <input type="text" class="form-control" maxlength="2000" name="uf_hard_limit_expression" id="uf_hard_limit_expression" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <label for="uf_service_model">*Service Model</label> + <input type="text" class="form-control" maxlength="50" name="uf_service_model" id="uf_service_model" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_resource_rule_id" id="uf_key_resource_rule_id"> + <button type="button" class="btn btn-primary" onclick="submitResourceRule(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/ro_header.ejs b/admportal/views/partials/ro_header.ejs new file mode 100644 index 00000000..2e5624a1 --- /dev/null +++ b/admportal/views/partials/ro_header.ejs @@ -0,0 +1,43 @@ +<!-- views/partials/header.ejs --> +<nav class="navbar navbar-default" role="navigation"> + <div class="container-fluid"> + + + <div class="navbar-header"> + <a class="navbar-brand" href="#"> SDN-C AdminPortal</a> + </div> + + <div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups"> + + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn" disabled>SLA</button> + + <div class="btn-group" role="group"> + <button disabled type="button" class="btn btn-default navbar-btn dropdown-toggle" + data-toggle="dropdown" aria-expanded="false">Table Initialization <span class="caret"></span></button> + <ul class="dropdown-menu" role="menu"> + <li><a href="/gamma/getAicSite">AIC Site</a></li> + <li><a href="/gamma/getAicSwitch">AIC Switch</a></li> + <li><a href="/gamma/getAicAvailZone">AIC Availability Zone</a></li> + <li><a href="/gamma/getVlanPool">VLAN_ID Pool</a></li> + <li><a href="/gamma/getVpePool">VPE Pool</a></li> + <li><a href="/gamma/getVplspePool">VPLSPE Pool</a></li> + <!-- <li class="divider"></li> --> + </ul> + </div> + + <button type="button" class="btn btn-default navbar-btn" disabled>Interfaces</button> + <button type="button" class="btn btn-default navbar-btn" disabled>VMs</button> + <button disabled type="button" class="btn btn-default navbar-btn" + onclick="location.assign('/odl/listWklst');">Worklist Orders</button> + <button type="button" class="btn btn-default navbar-btn" disabled>Connections</button> + <button type="button" class="btn btn-default navbar-btn" disabled>VNFs</button> + <button type="button" class="btn btn-default navbar-btn" disabled>VLANs</button> + <button disabled type="button" class="btn btn-default navbar-btn" + onclick="location.assign('/user/listUsers');">User Admin</button> + <button disabled type="button" class="btn btn-default navbar-btn" + onclick="location.assign('/logout');">Logout</button> + </div> + </div> + </div> +</nav> diff --git a/admportal/views/partials/roadm_mapping.ejs b/admportal/views/partials/roadm_mapping.ejs new file mode 100644 index 00000000..0e3a6fbd --- /dev/null +++ b/admportal/views/partials/roadm_mapping.ejs @@ -0,0 +1,101 @@ +<div class="modal fade" id="add_roadm_mapping" tabindex="-1" role="dialog" + aria-labelledby="add_roadm_mapping_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add ROADM Mapping</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/tunnel/addRoadmMapping" method="POST"> + <div class="form-group"> + <label for="nf_router_name">*Router Name</label> + <input type="text" class="form-control" name="nf_router_name" id="nf_router_name" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_roadm_name">*ROADM Name</label> + <input type="text" class="form-control" name="nf_roadm_name" id="nf_roadm_name" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_clli">*CLLI</label> + <input type="text" class="form-control" name="nf_clli" id="nf_clli" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_city_name">*City Name</label> + <input type="text" class="form-control" name="nf_city_name" id="nf_city_name" maxlength="80" placeholder="varchar(80)"> + </div> + <div class="form-group"> + <label for="nf_lat">*Latitude</label> + <input type="text" class="form-control" name="nf_lat" id="nf_lat" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_lon">*Longitude</label> + <input type="text" class="form-control" name="nf_lon" id="nf_lon" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_snrc">*SNRC</label> + <input type="text" class="form-control" name="nf_snrc" id="nf_snrc" maxlength="20" placeholder="varchar(20)"> + </div> + + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="saveRoadmMapping(this.form);">Save</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> +</div> + +<div class="modal fade" id="update_roadm_mapping" tabindex="-1" role="dialog" + aria-labelledby="update_roadm_mapping_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update ROADM Mapping</h4> + </div> + <div class="modal-body"> + <form role="form" action="/tunnel/updateRoadmMapping" method="POST"> + <div class="form-group"> + <label for="uf_router_name">*Router Name</label> + <input type="text" class="form-control" name="uf_router_name" id="uf_router_name" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_roadm_name">*ROADM Name</label> + <input type="text" class="form-control" name="uf_roadm_name" id="uf_roadm_name" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_clli">*CLLI</label> + <input type="text" class="form-control" name="uf_clli" id="uf_clli" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_city_name">*City Name</label> + <input type="text" class="form-control" name="uf_city_name" id="uf_city_name" maxlength="80" placeholder="varchar(80)"> + </div> + <div class="form-group"> + <label for="uf_lat">*Latitude</label> + <input type="text" class="form-control" name="uf_lat" id="uf_lat" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_lon">*Longitude</label> + <input type="text" class="form-control" name="uf_lon" id="uf_lon" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_snrc">*SNRC</label> + <input type="text" class="form-control" name="uf_snrc" id="uf_snrc" maxlength="20" placeholder="varchar(20)"> + </div> + + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_router_name" id="uf_key_router_name"> + <button type="button" class="btn btn-primary" onclick="saveRoadmMapping(this.form);">Save</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> +</div> + diff --git a/admportal/views/partials/router_master.ejs b/admportal/views/partials/router_master.ejs new file mode 100644 index 00000000..9b731b4d --- /dev/null +++ b/admportal/views/partials/router_master.ejs @@ -0,0 +1,59 @@ + <div class="modal fade" id="add_router_master" tabindex="-1" role="dialog" + aria-labelledby="add_router_master_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Router Master</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/tunnel/addRouterMaster" method="POST"> + <div class="form-group"> + <label for="nf_crs_name">*CRS Name</label> + <input type="text" class="form-control" name="nf_crs_name" id="nf_crs_name" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="nf_loopback_ip">Loopback IP</label> + <input type="text" class="form-control" name="nf_loopback_ip" id="nf_loopback_ip" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="saveRouterMaster(this.form);">Save</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + +<div class="modal fade" id="update_router_master" tabindex="-1" role="dialog" + aria-labelledby="update_router_master_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Router Master</h4> + </div> + <div class="modal-body"> + <form role="form" action="/tunnel/updateRouterMaster" method="POST"> + <div class="form-group"> + <label for="uf_crs_name">*CRS Name</label> + <input type="text" class="form-control" name="uf_crs_name" id="uf_crs_name" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <label for="uf_loopback_ip">Loopback IP</label> + <input type="text" class="form-control" name="uf_loopback_ip" id="uf_loopback_ip" maxlength="20" placeholder="varchar(20)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_crs_name" id="uf_key_crs_name"> + <button type="button" class="btn btn-primary" onclick="saveRouterMaster(this.form);">Save</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + diff --git a/admportal/views/partials/routing_protocol.ejs b/admportal/views/partials/routing_protocol.ejs new file mode 100644 index 00000000..1bd647fe --- /dev/null +++ b/admportal/views/partials/routing_protocol.ejs @@ -0,0 +1,38 @@ + <div class="modal fade" id="routing-protocol-modal" tabindex="-1" role="dialog" + aria-labelledby="routing-protocol-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">routing-protocol</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="routing_protocol">routing-protocol</label> + <input type="text" class="form-control" name="routing_protocol" id="routing_protocol"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#routing-protocol-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/sdnc_request_header_modal.ejs b/admportal/views/partials/sdnc_request_header_modal.ejs new file mode 100644 index 00000000..08ae1868 --- /dev/null +++ b/admportal/views/partials/sdnc_request_header_modal.ejs @@ -0,0 +1,46 @@ + <div class="modal fade" + id="sdnc-request-header-modal" tabindex="-1" role="dialog" + aria-labelledby="sdnc-request-header-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title" id="sdnc-request-header-modal-label">sdnc-request-header</h4> + </div> + <div class="modal-body"> + <form id="sdnc_request_header_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="svc_notification_url">svc-notification-url</label> + <input type="text" class="form-control" name="svc_notification_url" id="svc_notification_url"> + </div> + <div class="form-group"> + <label for="svc_request_id">svc-request-id</label> + <input type="text" class="form-control" name="svc_request_id" id="svc_request_id"> + </div> + <div class="form-group"> + <label for="svc_action">svc-action</label> + <input type="text" class="form-control" name="svc_action" id="svc_action"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#service-status-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/sdnfcHeader.ejs b/admportal/views/partials/sdnfcHeader.ejs new file mode 100644 index 00000000..ba963abb --- /dev/null +++ b/admportal/views/partials/sdnfcHeader.ejs @@ -0,0 +1,61 @@ +<title>SDN-FC AdminPortal</title> + +<!-- views/partials/header.ejs --> +<nav class="navbar navbar-default" role="navigation"> + <div class="container-fluid"> + + + <div class="navbar-header"> + <a class="navbar-brand" href="#"> SDN-FC AdminPortal</a> + </div> + + <div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups"> + + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn " + onclick="location.assign('/sla/listSLA');">SLA</button> + + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn dropdown-toggle" + data-toggle="dropdown" aria-expanded="false" vlanidpool-submenu>Table Management <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="/sdnfc/getTables">View Tables</a></li> + <li class="divider"></li> + <li><a href="/sdnfc/getVrrCredentials">VRR Credentials</a></li> + <li><a href="/sdnfc/getBgpUpdates">BGP Updates</a></li> + <li><a href="/sdnfc/getCliUpdates">CLI Updates</a></li> + <li class="divider"></li> + <li><a href="/admin/getParameters">Parameters</a></li> + </ul> + </div> + + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn dropdown-toggle" + data-toggle="dropdown" + aria-expanded="false">ODL <span class="caret"></span></button> + <ul class="dropdown-menu" role="menu"> + <li><a href="/odl/getClusterStatus">Get Cluster Status</a></li> + </ul> + </div> + + <!-- LOGS --> + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn dropdown-toggle" + data-toggle="dropdown" + aria-expanded="false">Logs <span class="caret"></span></button> + <ul class="dropdown-menu" role="menu"> + <li><a href="/logs/getUserTrace">User Trace</a></li> + <li><a href="/logs/getAccessLog">Access Log</a></li> + </ul> + </div> + + <button type="button" class="btn btn-default navbar-btn" + onclick="location.assign('/user/listUsers');">User Admin</button> + <button type="button" class="btn btn-default navbar-btn" + onclick="location.assign('/logout');">Logout</button> + </div> + </div> + </div> + +</nav> diff --git a/admportal/views/partials/sdnmlcHeader.ejs b/admportal/views/partials/sdnmlcHeader.ejs new file mode 100644 index 00000000..3dc768ff --- /dev/null +++ b/admportal/views/partials/sdnmlcHeader.ejs @@ -0,0 +1,63 @@ +<title>SDNC-MLC AdminPortal</title> + +<!-- views/partials/header.ejs --> +<nav class="navbar navbar-default" role="navigation"> + <div class="container-fluid"> + + + <div class="navbar-header"> + <a class="navbar-brand" href="#"> SDNC-MLC AdminPortal</a> + </div> + + <div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups"> + + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn " + onclick="location.assign('/sla/listSLA');">SLA</button> + + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn dropdown-toggle" + data-toggle="dropdown" aria-expanded="false" vlanidpool-submenu>Table Management <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="/tunnel/getRouterMaster">Router Master</a></li> + <li><a href="/tunnel/getLinkMaster">Link Master</a></li> + <li><a href="/tunnel/getRoadmMapping">ROADM Mapping</a></li> + <li><a href="/tunnel/getOwbcProperties">OWBC Properties</a></li> + <li><a href="/tunnel/getMetroRoadmServiceRequest">Metro ROADM Service Request</a></li> + <li><a href="/tunnel/getLinkLatencyMaster">Link Latency Master</a></li> + <li><a href="/tunnel/getPartnerProperties">Partner Properties</a></li> + <li class="divider"></li> + <li><a href="/admin/getParameters">Parameters</a></li> + </ul> + </div> + + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn dropdown-toggle" + data-toggle="dropdown" + aria-expanded="false">ODL <span class="caret"></span></button> + <ul class="dropdown-menu" role="menu"> + <li><a href="/odl/getClusterStatus">Get Cluster Status</a></li> + </ul> + </div> + + <!-- LOGS --> + <div class="btn-group" role="group"> + <button type="button" class="btn btn-default navbar-btn dropdown-toggle" + data-toggle="dropdown" + aria-expanded="false">Logs <span class="caret"></span></button> + <ul class="dropdown-menu" role="menu"> + <li><a href="/logs/getUserTrace">User Trace</a></li> + <li><a href="/logs/getAccessLog">Access Log</a></li> + </ul> + </div> + + <button type="button" class="btn btn-default navbar-btn" + onclick="location.assign('/user/listUsers');">User Admin</button> + <button type="button" class="btn btn-default navbar-btn" + onclick="location.assign('/logout');">Logout</button> + </div> + </div> + </div> + +</nav> diff --git a/admportal/views/partials/service_information_modal.ejs b/admportal/views/partials/service_information_modal.ejs new file mode 100644 index 00000000..7adf4aaf --- /dev/null +++ b/admportal/views/partials/service_information_modal.ejs @@ -0,0 +1,46 @@ + <div class="modal fade" + id="service-information-modal" tabindex="-1" role="dialog" + aria-labelledby="service-information-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title" id="service-information-modal-label">Service Information</h4> + </div> + <div class="modal-body"> + <form id="service_information_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="service_instance_id">service-instance-id</label> + <input type="text" class="form-control" name="service_instance_id" id="service_instance_id"> + </div> + <div class="form-group"> + <label for="subscriber_name">subscriber-name</label> + <input type="text" class="form-control" name="subscriber_name" id="subscriber_name"> + </div> + <div class="form-group"> + <label for="service_type">service-type</label> + <input type="text" class="form-control" name="service_type" id="service_type"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#service-status-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/service_manager_credentials.ejs b/admportal/views/partials/service_manager_credentials.ejs new file mode 100644 index 00000000..655d1767 --- /dev/null +++ b/admportal/views/partials/service_manager_credentials.ejs @@ -0,0 +1,65 @@ +<div class="modal fade" id="add_service_manager_credentials" tabindex="-1" role="dialog" + aria-labelledby="add_service_manager_credentials_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Service Manager Credentials</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/ucpe/addServiceManagerCredentials" method="POST"> + <div class="form-group"> + <label for="nf_service_manager_username">*Service Manager Username</label> + <input type="text" class="form-control" maxlength="255" name="nf_service_manager_username" id="nf_service_manager_username" placeholder="varchar(255)"> + </div> + <div class="form-group"> + <label for="nf_service_manager_password">*Service Manager Password</label> + <input type="password" class="form-control" maxlength="255" name="nf_service_manager_password" id="nf_service_manager_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <label for="nf_confirm_service_manager_password">*Confirm Service Manager Password</label> + <input type="password" class="form-control" maxlength="255" name="nf_confirm_service_manager_password" id="nf_confirm_service_manager_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitServiceManagerCredentials(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + <div class="modal fade" id="update_service_manager_credentials" tabindex="-1" role="dialog" + aria-labelledby="update_service_manager_credentials_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Service Manager Credentials</h4> + </div> + <div class="modal-body"> + <form role="form" action="/ucpe/updateServiceManagerCredentials" method="POST"> + <div class="form-group"> + <label for="uf_service_manager_username">*Service Manager Username</label> + <input type="text" class="form-control" maxlength="255" name="uf_service_manager_username" id="uf_service_manager_username"> + </div> + <div class="form-group"> + <label for="uf_service_manager_password">*Service Manager Password</label> + <input type="password" class="form-control" maxlength="255" name="uf_service_manager_password" id="uf_service_manager_password"> + </div> + <div class="form-group"> + <label for="uf_confirm_service_manager_password">*Confirm Service Manager Password</label> + <input type="password" class="form-control" maxlength="255" name="uf_confirm_service_manager_password" id="uf_confirm_service_manager_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submitServiceManagerCredentials(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/service_status_modal.ejs b/admportal/views/partials/service_status_modal.ejs new file mode 100644 index 00000000..8da4fcb7 --- /dev/null +++ b/admportal/views/partials/service_status_modal.ejs @@ -0,0 +1,68 @@ + <div class="modal fade" id="service-status-modal" tabindex="-1" role="dialog" aria-labelledby="service-status-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title" id="service-status-modal-label">SERVICE-STATUS</h4> + </div> + <div class="modal-body"> + <form id="service_status_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="rpc_name">rpc-name</label> + <input type="text" class="form-control" name="rpc_name" id="rpc_name"> + </div> + <div class="form-group"> + <label for="final_indicator">final-indicator</label> + <input type="text" class="form-control" name="final_indicator" id="final_indicator"> + </div> + <div class="form-group"> + <label for="request_status">request-status</label> + <input type="text" class="form-control" name="request_status" id="request_status"> + </div> + <div class="form-group"> + <label for="rpc_action">rpc-action</label> + <input type="text" class="form-control" name="rpc_action" id="rpc_action"> + </div> + <div class="form-group"> + <label for="l3sdn_action">l3sdn-action</label> + <input type="text" class="form-control" name="l3sdn_action" id="l3sdn_action"> + </div> + <div class="form-group"> + <label for="l3sdn_subaction">l3sdn-subaction</label> + <input type="text" class="form-control" name="l3sdn_subaction" id="l3sdn_subaction"> + </div> + <div class="form-group"> + <label for="response_message">response-message</label> + <input type="text" class="form-control" name="response_message" id="response_message"> + </div> + <div class="form-group"> + <label for="response_code">response-code</label> + <input type="text" class="form-control" name="response_code" id="response_code"> + </div> + <div class="form-group"> + <label for="response_timestamp">response-timestamp</label> + <input type="text" class="form-control" name="response_timestamp" id="response_timestamp"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#service-status-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/startssl.sh b/admportal/views/partials/startssl.sh new file mode 100755 index 00000000..a56570e3 --- /dev/null +++ b/admportal/views/partials/startssl.sh @@ -0,0 +1,28 @@ +#. ./set-https-env.sh +#cd ../bin +#cp ../config/config.json.https ../config/config.json +export PROJECT_HOME=/opt/openecomp/sdnc +export PROJECT_RUNTIME_BASE=/opt/openecomp/sdnc +#export JAVA_HOME=/usr/lib/jvm/java-7-oracle +export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 +export SSL_ENABLED=false +export SDNC_CONFIG_DIR=${PROJECT_HOME}/data/properties +export NODE_ENV=production +export CLASSPATH=$PROJECT_HOME/admportal/lib:$CLASSPATH + +PATH=${PATH}:${JAVA_HOME}/bin + +#. ${PROJECT_HOME}/etc/default.env + +MAIN_MENU=`python $PROJECT_HOME/admportal/shell/getAdmPortalProp.py MainMenu | sed -e 's|['\'']||g'` +export MAIN_MENU +SSL_ENABLED=`python $PROJECT_HOME/admportal/shell/getAdmPortalProp.py sslEnabled | sed -e 's|['\'']||g'` +export SSL_ENABLED + +cd .. +node bin/www +#if [ "true" == "${SSL_ENABLED}" ]; then + #pm2 startOrRestart process.https.json +#else + #pm2 startOrRestart process.http.json +#fi diff --git a/admportal/views/partials/svc_config_additional_data.ejs b/admportal/views/partials/svc_config_additional_data.ejs new file mode 100644 index 00000000..14cfd037 --- /dev/null +++ b/admportal/views/partials/svc_config_additional_data.ejs @@ -0,0 +1,38 @@ + <div class="modal fade" + id="svc-config-additional-data-modal" tabindex="-1" role="dialog" + aria-labelledby="svc-config-additional-data-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">svc-config-additional-data</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="management_ip">management-ip</label> + <input type="text" class="form-control" name="management_ip" id="management_ip"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#svc-config-additional-data-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/svc_topology_additional_data_modal.ejs b/admportal/views/partials/svc_topology_additional_data_modal.ejs new file mode 100644 index 00000000..9117dd93 --- /dev/null +++ b/admportal/views/partials/svc_topology_additional_data_modal.ejs @@ -0,0 +1,36 @@ + <div class="modal fade" id="svc-topology-additional-data-modal" tabindex="-1" role="dialog" aria-labelledby="svc_topology-additional-data-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title" id="svc-topology-additional-data-modal-label">Service Topology Additional Data</h4> + </div> + <div class="modal-body"> + <form id="svc_topology_additional_data_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="svc_vnf_type">svc-vnf-type</label> + <input type="text" class="form-control" name="svc_vnf_type" id="svc_vnf_type"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#service-status-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/t_provided_v4_lan_public_prefixes.ejs b/admportal/views/partials/t_provided_v4_lan_public_prefixes.ejs new file mode 100644 index 00000000..d7ced071 --- /dev/null +++ b/admportal/views/partials/t_provided_v4_lan_public_prefixes.ejs @@ -0,0 +1,46 @@ + <div class="modal fade" id="t-provided-v4-lan-public-prefixes-modal" tabindex="-1" role="dialog" + aria-labelledby="t-provided-v4-lan-public-prefixes-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">t-provided-v4-lan-public-prefixes</h4> + </div> + <div class="modal-body"> + <form id="t_provided_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="request_index">request-index</label> + <input type="text" class="form-control" name="v4_request_index" id="v4_request_index"> + </div> + <div class="form-group"> + <label for="v4_lan_public_prefix_length">v4-lan-public-prefix-length</label> + <input type="text" class="form-control" name="v4_lan_public_prefix_length" id="v4_lan_public_prefix_length"> + </div> + <div class="form-group"> + <label for="v4_lan_public_prefix">v4-lan-public-prefix</label> + <input type="text" class="form-control" name="v4_lan_public_prefix" id="v4_lan_public_prefix"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#t-provided-v4-lan-public-prefixes-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/t_provided_v6_lan_public_prefixes.ejs b/admportal/views/partials/t_provided_v6_lan_public_prefixes.ejs new file mode 100644 index 00000000..f0443037 --- /dev/null +++ b/admportal/views/partials/t_provided_v6_lan_public_prefixes.ejs @@ -0,0 +1,46 @@ + <div class="modal fade" id="t-provided-v6-lan-public-prefixes-modal" tabindex="-1" role="dialog" + aria-labelledby="t-provided-v6-lan-public-prefixes-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">t-provided-v6-lan-public-prefixes</h4> + </div> + <div class="modal-body"> + <form id="t_provided_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="request_index">request-index</label> + <input type="text" class="form-control" name="v6_request_index" id="v6_request_index"> + </div> + <div class="form-group"> + <label for="v6_lan_public_prefix_length">v6-lan-public-prefix-length</label> + <input type="text" class="form-control" name="v6_lan_public_prefix_length" id="v6_lan_public_prefix_length"> + </div> + <div class="form-group"> + <label for="v6_lan_public_prefix">v6-lan-public-prefix</label> + <input type="text" class="form-control" name="v6_lan_public_prefix" id="v6_lan_public_prefix"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#t-provided-v6-lan-public-prefixes-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/tcp_port_list.ejs b/admportal/views/partials/tcp_port_list.ejs new file mode 100644 index 00000000..efb4a430 --- /dev/null +++ b/admportal/views/partials/tcp_port_list.ejs @@ -0,0 +1,38 @@ + <div class="modal fade" id="tcp-port-list-modal" tabindex="-1" role="dialog" + aria-labelledby="tcp-port-list-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">tcp-port-list</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="tcp_port_number">port-number</label> + <input type="text" class="form-control" name="tcp_port_number" id="tcp_port_number"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#tcp-port-list-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/threshold_alarm.ejs b/admportal/views/partials/threshold_alarm.ejs new file mode 100644 index 00000000..f1df2ea9 --- /dev/null +++ b/admportal/views/partials/threshold_alarm.ejs @@ -0,0 +1,71 @@ +<div class="modal fade" id="add_threshold_alarm" tabindex="-1" role="dialog" + aria-labelledby="add_threshold_alarm_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add Threshold Alarm</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/resalloc/addThresholdAlarm" method="POST"> + <div class="form-group"> + <label for="nf_resource_rule_id">*Resource Rule ID</label> + <input type="text" class="form-control" maxlength="20" name="nf_resource_rule_id" id="nf_resource_rule_id" placeholder="bigint(20)"> + </div> + <div class="form-group"> + <label for="nf_threshold_expression">*Threshold Expression</label> + <input type="text" class="form-control" maxlength="2000" name="nf_threshold_expression" id="nf_threshold_expression" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <label for="nf_threshold_message">*Threshold Message</label> + <input type="text" class="form-control" maxlength="500" name="nf_threshold_message" id="nf_threshold_message" placeholder="varchar(500)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitThresholdAlarm(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + + <div class="modal fade" id="update_threshold_alarm" tabindex="-1" role="dialog" + aria-labelledby="threshold_alarm_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Threshold Alarm</h4> + </div> + <div class="modal-body"> + <form name="updateForm" role="form" action="/resalloc/updateThresholdAlarm" method="POST"> + <div class="form-group"> + <label for="uf_resource_threshold_id">*Resource Threshold ID</label> + <input readonly type="text" class="form-control" name="uf_resource_threshold_id" id="uf_resource_threshold_id"> + </div> + <div class="form-group"> + <label for="uf_resource_rule_id">*Resource Rule ID</label> + <input type="text" class="form-control" maxlength="20" name="uf_resource_rule_id" id="uf_resource_rule_id" placeholder="bigint(20)"> + </div> + <div class="form-group"> + <label for="uf_threshold_expression">*Threshold Expression</label> + <input type="text" class="form-control" maxlength="2000" name="uf_threshold_expression" id="uf_threshold_expression" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <label for="uf_threshold_message">*Threshold Message</label> + <input type="text" class="form-control" maxlength="2000" name="uf_threshold_message" id="uf_threshold_message" placeholder="varchar(2000)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_resource_threshold_id" id="uf_key_resource_threshold_id"> + <button type="button" class="btn btn-primary" onclick="submitThresholdAlarm(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/udp_port_list.ejs b/admportal/views/partials/udp_port_list.ejs new file mode 100644 index 00000000..b4310b2d --- /dev/null +++ b/admportal/views/partials/udp_port_list.ejs @@ -0,0 +1,38 @@ + <div class="modal fade" id="udp-port-list-modal" tabindex="-1" role="dialog" + aria-labelledby="udp-port-list-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">udp-port-list</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="udp_port_number">port-number</label> + <input type="text" class="form-control" name="udp_port_number" id="udp_port_number"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#udp-port-list-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/update_aic_avail_zone.ejs b/admportal/views/partials/update_aic_avail_zone.ejs new file mode 100644 index 00000000..29528a07 --- /dev/null +++ b/admportal/views/partials/update_aic_avail_zone.ejs @@ -0,0 +1,54 @@ + <div class="modal fade" id="update_aic_avail_zone_modal" tabindex="-1" role="dialog" + aria-labelledby="update_aic_avail_zone_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update AIC Availability Zone Pool</h4> + </div> + <div class="modal-body"> + <form role="form" action="/gamma/updateAicAvailZone" method="POST"> + <div class="form-group"> + <label for="uf_aic_site_id">AIC Site ID</label> + <input type="text" class="form-control" name="uf_aic_site_id" id="uf_aic_site_id"> + </div> + <div class="form-group"> + <label for="uf_availability_zone">Availability Zone</label> + <input type="text" class="form-control" name="uf_availability_zone" id="uf_availability_zone"> + </div> + <div class="form-group"> + <label for="uf_token">Token</label> + <input type="text" class="form-control" name="uf_token" id="uf_token"> + </div> + <div class="form-group"> + <label for="uf_service_type">Service Type</label> + <input type="text" class="form-control" name="uf_service_type" id="uf_service_type"> + </div> + <div class="form-group"> + <label for="uf_status">Status</label> + <input type="text" class="form-control" name="uf_status" id="uf_status"> + </div> + <div class="form-group"> + <label for="uf_vnf_id">VNF ID</label> + <input type="text" class="form-control" name="uf_vnf_id" id="uf_vnf_id"> + </div> + <div class="form-group"> + <label for="uf_vnf_type">VNF Type</label> + <input type="text" class="form-control" name="uf_vnf_type" id="uf_vnf_type"> + </div> + <div class="form-group"> + <label for="uf_hypervisor">Hypervisor</label> + <input type="text" class="form-control" name="uf_hypervisor" id="uf_hypervisor"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_key_aic_site_id" id="uf_key_aic_site_id"> + <input type="hidden" name="uf_key_availability_zone" id="uf_key_availability_zone"> + <input type="hidden" name="uf_key_token" id="uf_key_token"> + <button type="submit" class="btn btn-primary">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/update_aic_site.ejs b/admportal/views/partials/update_aic_site.ejs new file mode 100644 index 00000000..ffff9dcb --- /dev/null +++ b/admportal/views/partials/update_aic_site.ejs @@ -0,0 +1,57 @@ + <div class="modal fade" id="update_aic_site_modal" tabindex="-1" role="dialog" + aria-labelledby="update_aic_site_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update AIC Site</h4> + </div> + <div class="modal-body"> + <form role="form" action="/gamma/updateAicSite" method="POST"> + <div class="form-group"> + <label for="uf_name">Name</label> + <input type="text" class="form-control" name="uf_name" id="uf_name"> + </div> + <div class="form-group"> + <label for="uf_aic_site_id">AIC Site ID</label> + <input type="text" class="form-control" name="uf_aic_site_id" id="uf_aic_site_id"> + </div> + <div class="form-group"> + <label for="uf_vcenter_url">VCenter URL</label> + <input type="text" class="form-control" name="uf_vcenter_url" id="uf_vcenter_url"> + </div> + <div class="form-group"> + <label for="uf_vcenter_username">VCenter User</label> + <input type="text" class="form-control" name="uf_vcenter_username" id="uf_vcenter_username"> + </div> + <div class="form-group"> + <label for="uf_vcenter_passwd">VCenter Password</label> + <input type="password" class="form-control" name="uf_vcenter_passwd" id="uf_vcenter_passwd"> + </div> + <div class="form-group"> + <label for="uf_oam_gateway_addr">OAM Gateway Address</label> + <input type="text" class="form-control" name="uf_oam_gateway_addr" id="uf_oam_gateway_addr"> + </div> + <div class="form-group"> + <label for="uf_city">City</label> + <input type="text" class="form-control" name="uf_city" id="uf_city"> + </div> + <div class="form-group"> + <label for="uf_state">State</label> + <input type="text" class="form-control" name="uf_state" id="uf_state"> + </div> + <div class="form-group"> + <label for="uf_operational_status">Operational Status</label> + <input type="text" class="form-control" name="uf_operational_status" id="uf_operational_status"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_aic_site_id" id="uf_key_aic_site_id"> + <button type="submit" class="btn btn-primary">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/update_aic_switch.ejs b/admportal/views/partials/update_aic_switch.ejs new file mode 100644 index 00000000..31f03d52 --- /dev/null +++ b/admportal/views/partials/update_aic_switch.ejs @@ -0,0 +1,41 @@ + <div class="modal fade" id="update_aic_switch_modal" tabindex="-1" role="dialog" + aria-labelledby="update_aic_switch_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update AIC Switch</h4> + </div> + <div class="modal-body"> + <form role="form" action="/gamma/updateAicSwitch" method="POST"> + <div class="form-group"> + <label for="uf_physical_network_name">Physical Network Name</label> + <input type="text" class="form-control" name="uf_physical_network_name" id="uf_physical_network_name"> + </div> + <div class="form-group"> + <label for="uf_switch_name">Switch Name</label> + <input type="text" class="form-control" name="uf_switch_name" id="uf_switch_name"> + </div> + <div class="form-group"> + <label for="uf_aic_site_id">AIC Site ID</label> + <input type="text" class="form-control" name="uf_aic_site_id" id="uf_aic_site_id"> + </div> + <div class="form-group"> + <label for="uf_uuid">UUID</label> + <input type="text" class="form-control" name="uf_uuid" id="uf_uuid"> + </div> + <div class="form-group"> + <label for="uf_availability_zone">Availability Zone</label> + <input type="text" class="form-control" name="uf_availability_zone" id="uf_availability_zone"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_physical_network_name" id="uf_key_physical_network_name"> + <button type="submit" class="btn btn-primary">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/update_max_port_speed.ejs b/admportal/views/partials/update_max_port_speed.ejs new file mode 100644 index 00000000..71c4a422 --- /dev/null +++ b/admportal/views/partials/update_max_port_speed.ejs @@ -0,0 +1,45 @@ + <div class="modal fade" id="update_max_port_speed" tabindex="-1" role="dialog" + aria-labelledby="update_max_port_speed_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Max Port Speed</h4> + </div> + <div class="modal-body"> + <form role="form" action="/resalloc/updateMaxPortSpeed" method="POST"> + <div class="form-group"> + <label for="uf_max_port_speed_id">ID</label> + <input readonly type="text" class="form-control" name="uf_max_port_speed_id" id="uf_max_port_speed_id"> + </div> + <div class="form-group"> + <label for="uf_image_file_name">Image File Name</label> + <input type="text" class="form-control" maxlength="50" name="uf_image_file_name" id="uf_image_file_name"> + </div> + <div class="form-group"> + <label for="uf_end_point_position">End Point Position</label> + <input type="text" class="form-control" maxlength="50" name="uf_end_point_position" id="uf_end_point_position"> + </div> + <div class="form-group"> + <label for="uf_interface_name">Interface Name</label> + <input type="text" class="form-control" maxlength="100" name="uf_interface_name" id="uf_interface_name"> + </div> + <div class="form-group"> + <label for="uf_max_speed">Max Speed</label> + <input type="text" class="form-control" maxlength="50" name="uf_max_speed" id="uf_max_speed"> + </div> + <div class="form-group"> + <label for="uf_unit">Unit</label> + <input type="text" class="form-control" maxlength="10" name="uf_unit" id="uf_unit"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_max_port_speed_id" id="uf_key_max_port_speed_id"> + <button type="submit" class="btn btn-primary">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/update_parameter.ejs b/admportal/views/partials/update_parameter.ejs new file mode 100644 index 00000000..c0ef57d2 --- /dev/null +++ b/admportal/views/partials/update_parameter.ejs @@ -0,0 +1,37 @@ + <div class="modal fade" id="update_parameter" tabindex="-1" role="dialog" + aria-labelledby="parameter_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Parameter</h4> + </div> + <div class="modal-body"> + <form name="updateForm" role="form" action="/admin/updateParameter" method="POST"> + <div class="form-group"> + <label for="uf_name">*Name</label> + <input maxlength="100" type="text" class="form-control" name="uf_name" id="uf_name" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="uf_value">*Value</label> + <input maxlength="100" type="text" class="form-control" name="uf_value" id="uf_value" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="uf_category">Category</label> + <input maxlength="24" type="text" class="form-control" name="uf_category" id="uf_category" placeholder="varchar(24)"> + </div> + <div class="form-group"> + <label for="uf_memo">Memo</label> + <input maxlength="128" type="text" class="form-control" name="uf_memo" id="uf_memo" placeholder="varchar(128)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <input type="hidden" name="uf_key_name" id="uf_key_name"> + <button type="button" class="btn btn-primary" onclick="submitParam(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/update_resource_rule.ejs b/admportal/views/partials/update_resource_rule.ejs new file mode 100644 index 00000000..69243b23 --- /dev/null +++ b/admportal/views/partials/update_resource_rule.ejs @@ -0,0 +1,57 @@ + <div class="modal fade" id="update_resource_rule" tabindex="-1" role="dialog" + aria-labelledby="update_resource_rule_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Resource Rule</h4> + </div> + <div class="modal-body"> + <form role="form" action="/resalloc/updateResourceRule" method="POST"> + <div class="form-group"> + <label for="uf_resource_rule_id">Rule ID</label> + <input readonly type="text" class="form-control" name="uf_resource_rule_id" id="uf_resource_rule_id"> + </div> + <div class="form-group"> + <label for="uf_resource_name">Name</label> + <input type="text" class="form-control" maxlength="50" name="uf_resource_name" id="uf_resource_name"> + </div> + <div class="form-group"> + <label for="uf_end_point_position">End Point Position</label> + <input type="text" class="form-control" maxlength="50" name="uf_end_point_position" id="uf_end_point_position"> + </div> + <div class="form-group"> + <label for="uf_service_expression">Service Expression</label> + <input type="text" class="form-control" maxlength="2000" name="uf_service_expression" id="uf_service_expression"> + </div> + <div class="form-group"> + <label for="uf_equipment_level">Equipment Level</label> + <input type="text" class="form-control" maxlength="50" name="uf_equipment_level" id="uf_equipment_level"> + </div> + <div class="form-group"> + <label for="uf_equipment_expression">Equipment Expression</label> + <input type="text" class="form-control" maxlength="2000" name="uf_equipment_expression" id="uf_equipment_expression"> + </div> + <div class="form-group"> + <label for="uf_allocation_expression">Allocation Expression</label> + <input type="text" class="form-control" maxlength="2000" name="uf_allocation_expression" id="uf_allocation_expression"> + </div> + <div class="form-group"> + <label for="uf_soft_limit_expression">Soft Limit Expression</label> + <input type="text" class="form-control" maxlength="2000" name="uf_soft_limit_expression" id="uf_soft_limit_expression"> + </div> + <div class="form-group"> + <label for="uf_hard_limit_expression">Hard Limit Expression</label> + <input type="text" class="form-control" maxlength="2000" name="uf_hard_limit_expression" id="uf_hard_limit_expression"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_resource_rule_id" id="uf_key_resource_rule_id"> + <button type="submit" class="btn btn-primary">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/update_service_homing.ejs b/admportal/views/partials/update_service_homing.ejs new file mode 100644 index 00000000..5697168b --- /dev/null +++ b/admportal/views/partials/update_service_homing.ejs @@ -0,0 +1,55 @@ + <div class="modal fade" id="update_service_homing" tabindex="-1" role="dialog" + aria-labelledby="update_service_homing_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update Service Homing</h4> + </div> + <div class="modal-body"> + <form name="updateForm" role="form" action="/gamma/updateServiceHoming" method="POST"> + <div class="form-group"> + <label for="uf_service_type">*Service Type</label> + <input readonly type="text" class="form-control" name="uf_service_type" id="uf_service_type"> + </div> + <div class="form-group"> + <label for="uf_lata">*LATA</label> + <input type="text" class="form-control" name="uf_lata" id="uf_lata" maxlength="12" placeholder="int(3)"> + </div> + <div class="form-group"> + <label for="uf_hubbing_city_type">*Hubbing City Type</label> + <input type="text" class="form-control" name="uf_hubbing_city_type" id="uf_hubbing_city_type" maxlength="40" placeholder="varchar(40)"> + </div> + <div class="form-group"> + <label for="uf_latitude">Latitude</label> + <input type="text" class="form-control" name="uf_latitude" id="uf_latitude" maxlength="24" placeholder="float"> + </div> + <div class="form-group"> + <label for="uf_longitude">Longitude</label> + <input type="text" class="form-control" name="uf_longitude" id="uf_longitude" maxlength="24" placeholder="float"> + </div> + <div class="form-group"> + <label for="uf_primary_aic_site_name">*Primary Site Name</label> + <input type="text" class="form-control" name="uf_primary_aic_site_name" id="uf_primary_aic_site_name" maxlength="100" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="uf_secondary_aic_site_name">Secondary Site Name</label> + <input type="text" class="form-control" name="uf_secondary_aic_site_name" id="uf_secondary_aic_site_name" maxlength="100" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <label for="uf_tertiary_aic_site_name">Tertiary Site Name</label> + <input type="text" class="form-control" name="uf_tertiary_aic_site_name" id="uf_tertiary_aic_site_name" maxlength="100" placeholder="varchar(100)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_service_type" id="uf_key_service_type"> + <input type="hidden" name="uf_key_lata" id="uf_key_lata"> + <input type="hidden" name="uf_key_hubbing_city_type" id="uf_key_hubbing_city_type"> + <button type="button" class="btn btn-primary" onclick="submitServiceHoming(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/update_vlan_id_pool.ejs b/admportal/views/partials/update_vlan_id_pool.ejs new file mode 100644 index 00000000..d010672c --- /dev/null +++ b/admportal/views/partials/update_vlan_id_pool.ejs @@ -0,0 +1,51 @@ + <div class="modal fade" id="update_vlan_id_pool_modal" tabindex="-1" role="dialog" + aria-labelledby="update_vlan_id_pool_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update VLAN ID Pool</h4> + </div> + <div class="modal-body"> + <form role="form" action="/gamma/updateVlanPool" method="POST"> + <div class="form-group"> + <label for="uf_aic_site_id">AIC Site ID</label> + <input type="text" class="form-control" name="uf_aic_site_id" id="uf_aic_site_id"> + </div> + <div class="form-group"> + <label for="uf_purpose">Purpose</label> + <input type="text" class="form-control" name="uf_purpose" id="uf_purpose"> + </div> + <div class="form-group"> + <label for="uf_vlan_id">VLAN ID</label> + <input type="text" class="form-control" name="uf_vlan_id" id="uf_vlan_id"> + </div> + <div class="form-group"> + <label for="uf_vplspe_name">VPLSPE Name</label> + <input type="text" class="form-control" name="uf_vplspe_name" id="uf_vplspe_name"> + </div> + <div class="form-group"> + <label for="uf_availability_zone">Availability Zone</label> + <input type="text" class="form-control" name="uf_availability_zone" id="uf_availability_zone"> + </div> + <div class="form-group"> + <label for="uf_status">Status</label> + <input type="text" class="form-control" name="uf_status" id="uf_status"> + </div> + <div class="form-group"> + <label for="uf_svc_instance_id">Svc Instance ID</label> + <input type="text" class="form-control" name="uf_svc_instance_id" id="uf_svc_instance_id"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_aic_site_id" id="uf_key_aic_site_id"> + <input type="hidden" name="uf_key_purpose" id="uf_key_purpose"> + <input type="hidden" name="uf_key_vlan_id" id="uf_key_vlan_id"> + <button type="submit" class="btn btn-primary">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/update_vpe_pool.ejs b/admportal/views/partials/update_vpe_pool.ejs new file mode 100644 index 00000000..c583590f --- /dev/null +++ b/admportal/views/partials/update_vpe_pool.ejs @@ -0,0 +1,88 @@ + <div class="modal fade" id="update_vpe_pool_modal" tabindex="-1" role="dialog" + aria-labelledby="update_vpe_pool_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update VPE Pool</h4> + </div> + <div class="modal-body"> + <form role="form" action="/gamma/updateVpePool" method="POST"> + <div class="form-group"> + <label for="uf_aic_site_id">AIC Site ID</label> + <input type="text" class="form-control" name="uf_aic_site_id" id="uf_aic_site_id"> + </div> + <div class="form-group"> + <label for="uf_vpe_name">VPE Name</label> + <input type="text" class="form-control" name="uf_vpe_name" id="uf_vpe_name"> + </div> + <div class="form-group"> + <label for="uf_availability_zone">Availability Zone</label> + <input type="text" class="form-control" name="uf_availability_zone" id="uf_availability_zone"> + </div> + <div class="form-group"> + <label for="uf_ipv4_oam_address">IPV4 OAM Address</label> + <input type="text" class="form-control" name="uf_ipv4_oam_address" id="uf_ipv4_oam_address"> + </div> + <div class="form-group"> + <label for="uf_loopback0_ipv4_address">Loopback IPV4 Address</label> + <input type="text" class="form-control" name="uf_loopback0_ipv4_address" id="uf_loopback0_ipv4_address"> + </div> + <div class="form-group"> + <label for="uf_provisioning_status">Provisioning Status</label> + <select class="form-control" name="uf_provisioning_status" id="uf_provisioning_status"> + <option value=PREPROV>PREPROV</option> + <option value=NVTPROV>NVTPROV</option> + <option value=PROV>PROV</option> + <option value=CAPPED>CAPPED</option> + </select> + </div> + <div class="form-group"> + <label for="uf_vlan_id_outer">VLAN ID Outer</label> + <input type="text" class="form-control" name="uf_vlan_id_outer" id="uf_vlan_id_outer"> + </div> + <div class="form-group"> + <label for="uf_vendor">Vendor</label> + <input type="text" class="form-control" name="uf_vendor" id="uf_vendor"> + </div> + <div class="form-group"> + <label for="uf_physical_intf_name">Interface Name</label> + <input type="text" class="form-control" name="uf_physical_intf_name" id="uf_physical_intf_name"> + </div> + <div class="form-group"> + <label for="uf_physical_intf_speed">Interface Speed</label> + <input type="text" class="form-control" name="uf_physical_intf_speed" id="uf_physical_intf_speed"> + </div> + <div class="form-group"> + <label for="uf_physical_intf_units">Interface Units</label> + <input type="text" class="form-control" name="uf_physical_intf_units" id="uf_physical_intf_units"> + </div> + <div class="form-group"> + <label for="uf_vpe_uuid">VPE UUID</label> + <input type="text" class="form-control" name="uf_vpe_uuid" id="uf_vpe_uuid"> + </div> + <div class="form-group"> + <label for="uf_as_number">AS_NUMBER</label> + <input type="text" class="form-control" name="uf_as_number" id="uf_as_number"> + </div> + <div class="form-group"> + <label for="uf_vpe_id">VPE ID</label> + <input type="text" class="form-control" name="uf_vpe_id" id="uf_vpe_id"> + </div> + <div class="form-group"> + <label for="uf_image_filename">Image Filename</label> + <input type="text" class="form-control" name="uf_image_filename" id="uf_image_filename"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_key_vpe_name" id="uf_key_vpe_name"> + <input type="hidden" name="uf_key_availability_zone" id="uf_key_availability_zone"> + <input type="hidden" name="uf_key_aic_site_id" id="uf_key_aic_site_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="submit" class="btn btn-primary">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/update_vplspe_pool.ejs b/admportal/views/partials/update_vplspe_pool.ejs new file mode 100644 index 00000000..eb930522 --- /dev/null +++ b/admportal/views/partials/update_vplspe_pool.ejs @@ -0,0 +1,72 @@ + <div class="modal fade" id="update_vplspe_pool_modal" tabindex="-1" role="dialog" + aria-labelledby="update_vplspe_pool_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update VPLSPE Pool</h4> + </div> + <div class="modal-body"> + <form role="form" action="/gamma/updateVplspePool" method="POST"> + <div class="form-group"> + <label for="uf_vplspe_name">VPLSPE Name</label> + <input type="text" class="form-control" name="uf_vplspe_name" id="uf_vplspe_name"> + </div> + <div class="form-group"> + <label for="uf_aic_site_id">AIC Site ID</label> + <input type="text" class="form-control" name="uf_aic_site_id" id="uf_aic_site_id"> + </div> + <div class="form-group"> + <label for="uf_availability_zone">Availability Zone</label> + <input type="text" class="form-control" name="uf_availability_zone" id="uf_availability_zone"> + </div> + <div class="form-group"> + <label for="uf_physical_intf_name">Interface Name</label> + <input type="text" class="form-control" name="uf_physical_intf_name" id="uf_physical_intf_name"> + </div> + <div class="form-group"> + <label for="uf_physical_intf_speed">Interface Speed</label> + <input type="text" class="form-control" name="uf_physical_intf_speed" id="uf_physical_intf_speed"> + </div> + <div class="form-group"> + <label for="uf_physical_intf_units">Interface Units</label> + <input type="text" class="form-control" name="uf_physical_intf_units" id="uf_physical_intf_units"> + </div> + <div class="form-group"> + <label for="uf_loopback0_ipv4_address">Loopback IPV4 Address</label> + <input type="text" class="form-control" name="uf_loopback0_ipv4_address" id="uf_loopback0_ipv4_address"> + </div> + <div class="form-group"> + <label for="uf_vlan_id_outer">VLAN ID Outer</label> + <input type="text" class="form-control" name="uf_vlan_id_outer" id="uf_vlan_id_outer"> + </div> + <div class="form-group"> + <label for="uf_vplspe_uuid">VPLSPE UUID</label> + <input type="text" class="form-control" name="uf_vplspe_uuid" id="uf_vplspe_uuid"> + </div> + <div class="form-group"> + <label for="uf_image_filename">Image Filename</label> + <input type="text" class="form-control" name="uf_image_filename" id="uf_image_filename"> + </div> + <div class="form-group"> + <label for="uf_provisioning_status">Provisioning Status</label> + <input type="text" class="form-control" name="uf_provisioning_status" id="uf_provisioning_status"> + </div> + <div class="form-group"> + <label for="uf_vendor">Vendor</label> + <input type="text" class="form-control" name="uf_vendor" id="uf_vendor"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_key_availability_zone" id="uf_key_availability_zone"> + <input type="hidden" name="uf_key_physical_intf_name" id="uf_key_physical_intf_name"> + <input type="hidden" name="uf_key_vplspe_name" id="uf_key_vplspe_name"> + <input type="hidden" name="uf_key_aic_site_id" id="uf_key_aic_site_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="submit" class="btn btn-primary">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/userform.ejs b/admportal/views/partials/userform.ejs new file mode 100644 index 00000000..fae52ad2 --- /dev/null +++ b/admportal/views/partials/userform.ejs @@ -0,0 +1,41 @@ + <div class="modal fade" id="myUserModal" tabindex="-1" role="dialog" aria-labelledby="myUserModalLabel" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title" id="myUserModalLabel">Update User</h4> + </div> + <div class="modal-body"> + <form id="updateForm" name="updateForm" role="form" action="/user/updateUser" method="POST"> + <div class="form-group"> + <label for="uf_email">attuid</label> + <input type="email" class="form-control" name="uf_email" id="uf_email"> + </div> + <div class="form-group"> + <label for="uf_password">Password</label> + <input type="password" class="form-control" name="uf_password" id="uf_password"> + </div> + <div class="form-group"> + <label for="uf_confirm_password">Confirm Password</label> + <input type="password" class="form-control" name="uf_confirm_password" id="uf_confirm_password"> + </div> + <div class="form-group"> + <label for="privilege">Privilege</label> + <select class="form-control" name="uf_privilege" id="uf_privilege"> + <option value=admin>Administrator</option> + <option value=readonly>Readonly</option> + </select> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_email" id="uf_key_email"> + <button type="button" class="btn btn-primary" onclick="submitUserAdmin(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + diff --git a/admportal/views/partials/v4_dhcp_pools.ejs b/admportal/views/partials/v4_dhcp_pools.ejs new file mode 100644 index 00000000..5a67aeb1 --- /dev/null +++ b/admportal/views/partials/v4_dhcp_pools.ejs @@ -0,0 +1,50 @@ + <div class="modal fade" id="v4-dhcp-pools-modal" tabindex="-1" role="dialog" + aria-labelledby="v4-dhcp-pools-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">dhcp</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="v4_dhcp_relay_next_hop_address">v4-dhcp-relay-next-hop-address</label> + <input type="text" class="form-control" name="v4_dhcp_relay_next_hop_address" id="v4_dhcp_relay_next_hop_address"> + </div> + <div class="form-group"> + <label for="v4_dhcp_pool_prefix">v4-dhcp-pool-prefix</label> + <input type="text" class="form-control" name="v4_dhcp_pool_prefix" id="v4_dhcp_pool_prefix"> + </div> + <div class="form-group"> + <label for="v4_dhcp_pool_prefix_length">v4-dhcp-pool-prefix-length</label> + <input type="text" class="form-control" name="v4_dhcp_pool_prefix_length" id="v4_dhcp_pool_prefix_length"> + </div> + <div class="form-group"> + <label for="v4_dhcp_relay_gateway_address">v4-dhcp-relay-gateway-address</label> + <input type="text" class="form-control" name="v4_dhcp_relay_gateway_address" id="v4_dhcp_relay_gateway_address"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#v4-dhcp-pools-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/v4_firewall_packet_filters.ejs b/admportal/views/partials/v4_firewall_packet_filters.ejs new file mode 100644 index 00000000..0b091d15 --- /dev/null +++ b/admportal/views/partials/v4_firewall_packet_filters.ejs @@ -0,0 +1,46 @@ + <div class="modal fade" id="v4-firewall-packet-filters-modal" tabindex="-1" role="dialog" + aria-labelledby="v4-firewall-packet-filters-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">v4-firewall-packet-filters</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="v4_firewall_prefix">v4-firewall-prefix</label> + <input type="text" class="form-control" name="v4_firewall_prefix" id="v4_firewall_prefix"> + </div> + <div class="form-group"> + <label for="v4_firewall_prefix_length">v4-firewall-prefix-length</label> + <input type="text" class="form-control" name="v4_firewall_prefix_length" id="v4_firewall_prefix_length"> + </div> + <div class="form-group"> + <label for="v4_allow_icmp_ping">allow-icmp-ping</label> + <input type="text" class="form-control" name="v4_allow_icmp_ping" id="v4_allow_icmp_ping"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#v4-firewall-packet-filters-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/v4_nat_mapping_entries.ejs b/admportal/views/partials/v4_nat_mapping_entries.ejs new file mode 100644 index 00000000..ef80022f --- /dev/null +++ b/admportal/views/partials/v4_nat_mapping_entries.ejs @@ -0,0 +1,46 @@ + <div class="modal fade" id="v4-nat-mapping-entries-modal" tabindex="-1" role="dialog" + aria-labelledby="v4-nat-mapping-entries-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">v4-nat-mapping-entries</h4> + </div> + <div class="modal-body"> + <form id="v4_nat_mapping_entries_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="v4_nat_external">v4-nat-external</label> + <input type="text" class="form-control" name="v4_nat_external" id="v4_nat_external"> + </div> + <div class="form-group"> + <label for="v4_nat_next_hop_address">v4-nat-next-hop-address</label> + <input type="text" class="form-control" name="v4_nat_next_hop_address" id="v4_nat_next_hop_address"> + </div> + <div class="form-group"> + <label for="v4_nat_internal">v4-nat-internal</label> + <input type="text" class="form-control" name="v4_nat_internal" id="v4_nat_internal"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#v4-nat-mapping-entries-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/v4_static_routes.ejs b/admportal/views/partials/v4_static_routes.ejs new file mode 100644 index 00000000..0474dd33 --- /dev/null +++ b/admportal/views/partials/v4_static_routes.ejs @@ -0,0 +1,46 @@ + <div class="modal fade" id="v4-static-routes-modal" tabindex="-1" role="dialog" + aria-labelledby="v4-static-routes-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">v4-static-routes</h4> + </div> + <div class="modal-body"> + <form id="v4_static_route_prefix_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="v4_static_route_prefix">v4-static-route-prefix</label> + <input type="text" class="form-control" name="v4_static_route_prefix" id="v4_static_route_prefix"> + </div> + <div class="form-group"> + <label for="v4_static_route_prefix_length">v4-static-route-prefix-length</label> + <input type="text" class="form-control" name="v4_static_route_prefix_length" id="v4_static_route_prefix_length"> + </div> + <div class="form-group"> + <label for="static_v4_next_hop_address">v4-next-hop-address</label> + <input type="text" class="form-control" name="static_v4_next_hop_address" id="static_v4_next_hop_address"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#v4-static-routes-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/v6_dhcp_pools.ejs b/admportal/views/partials/v6_dhcp_pools.ejs new file mode 100644 index 00000000..7dc54abe --- /dev/null +++ b/admportal/views/partials/v6_dhcp_pools.ejs @@ -0,0 +1,50 @@ + <div class="modal fade" id="v6-dhcp-pools-modal" tabindex="-1" role="dialog" + aria-labelledby="v6-dhcp-pools-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">v6-dhcp-pools</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="v6_dhcp_relay_next_hop_address">v6-dhcp-relay-next-hop-address</label> + <input type="text" class="form-control" name="v6_dhcp_relay_next_hop_address" id="v6_dhcp_relay_next_hop_address"> + </div> + <div class="form-group"> + <label for="v6_dhcp_pool_prefix">v6-dhcp-pool-prefix</label> + <input type="text" class="form-control" name="v6_dhcp_pool_prefix" id="v6_dhcp_pool_prefix"> + </div> + <div class="form-group"> + <label for="v6_dhcp_pool_prefix_length">v6-dhcp-pool-prefix-length</label> + <input type="text" class="form-control" name="v6_dhcp_pool_prefix_length" id="v6_dhcp_pool_prefix_length"> + </div> + <div class="form-group"> + <label for="v6_dhcp_relay_gateway_address">v6-dhcp-relay-gateway-address</label> + <input type="text" class="form-control" name="v6_dhcp_relay_gateway_address" id="v6_dhcp_relay_gateway_address"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#v6-dhcp-pools-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/v6_firewall_packet_filters.ejs b/admportal/views/partials/v6_firewall_packet_filters.ejs new file mode 100644 index 00000000..09e2e3d5 --- /dev/null +++ b/admportal/views/partials/v6_firewall_packet_filters.ejs @@ -0,0 +1,46 @@ + <div class="modal fade" id="v6-firewall-packet-filters-modal" tabindex="-1" role="dialog" + aria-labelledby="v6-firewall-packet-filters-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">v6-firewall-packet-filters</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="v6_firewall_prefix">v6-firewall-prefix</label> + <input type="text" class="form-control" name="v6_firewall_prefix" id="v6_firewall_prefix"> + </div> + <div class="form-group"> + <label for="v6_firewall_prefix_length">v6-firewall-prefix-length</label> + <input type="text" class="form-control" name="v6_firewall_prefix_length" id="v6_firewall_prefix_length"> + </div> + <div class="form-group"> + <label for="v6_allow_icmp_ping">allow-icmp-ping</label> + <input type="text" class="form-control" name="v6_allow_icmp_ping" id="v6_allow_icmp_ping"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#v6-firewall-packet-filters-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/v6_static_routes.ejs b/admportal/views/partials/v6_static_routes.ejs new file mode 100644 index 00000000..bea721df --- /dev/null +++ b/admportal/views/partials/v6_static_routes.ejs @@ -0,0 +1,46 @@ + <div class="modal fade" id="v6-static-routes-modal" tabindex="-1" role="dialog" + aria-labelledby="v6-static-routes-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">v6-static-routes</h4> + </div> + <div class="modal-body"> + <form id="v6_static_route_prefix_form" role="form" action="" method="POST"> + <div class="form-group"> + <label for="v6_static_route_prefix">v6-static-route-prefix</label> + <input type="text" class="form-control" name="v6_static_route_prefix" id="v6_static_route_prefix"> + </div> + <div class="form-group"> + <label for="v6_static_route_prefix_length">v6-static-route-prefix-length</label> + <input type="text" class="form-control" name="v6_static_route_prefix_length" id="v6_static_route_prefix_length"> + </div> + <div class="form-group"> + <label for="static_v6_next_hop_address">v6-next-hop-address</label> + <input type="text" class="form-control" name="static_v6_next_hop_address" id="static_v6_next_hop_address"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#v6-static-routes-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/vlan.ejs b/admportal/views/partials/vlan.ejs new file mode 100644 index 00000000..99cb8022 --- /dev/null +++ b/admportal/views/partials/vlan.ejs @@ -0,0 +1,46 @@ + <div class="modal fade" + id="vlan-modal" tabindex="-1" role="dialog" + aria-labelledby="vlan-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">vlan</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="vlan_interface">vlan-interface</label> + <input type="text" class="form-control" name="vlan_interface" id="vlan_interface"> + </div> + <div class="form-group"> + <label for="vlan_id_inner">vlan-id-inner</label> + <input type="text" class="form-control" name="vlan_id_inner" id="vlan_id_inner"> + </div> + <div class="form-group"> + <label for="vlan_id_outer">vlan-id-outer</label> + <input type="text" class="form-control" name="vlan_id_outer" id="vlan_id_outer"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#vlan-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/vm_networks.ejs b/admportal/views/partials/vm_networks.ejs new file mode 100644 index 00000000..f0f73378 --- /dev/null +++ b/admportal/views/partials/vm_networks.ejs @@ -0,0 +1,57 @@ + <div class="modal fade" id="add_vm_network" tabindex="-1" role="dialog" + aria-labelledby="add_vm_network" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add VM Network</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/mobility/addVmNetwork" method="POST"> + <div class="form-group"> + <label for="nf_vnf_type">*VNF Type</label> + <input type="text" class="form-control" name="nf_vnf_type" id="nf_vnf_type" maxlength="200" placeholder="varchar(200)"> + </div> + <div class="form-group"> + <label for="nf_vm_type">*VM Type</label> + <input type="text" class="form-control" name="nf_vm_type" id="nf_vm_type" maxlength="45" placeholder="varchar(45)"> + </div> + <div class="form-group"> + <label for="nf_network_role">*NETWORK ROLE</label> + <input maxlength="45" type="text" class="form-control" name="nf_network_role" id="nf_network_role" placeholder="varchar(45)"> + </div> + <div class="form-group"> + <label for="nf_ip_count">IP COUNT</label> + <input maxlength="3" type="text" class="form-control" name="nf_ip_count" id="nf_ip_count" placeholder="int(11)"> + </div> + <div class="form-group"> + <label for="nf_assign_ips">ASSIGN IPS</label> + <select class="form-control" name="nf_assign_ips" id="nf_assign_ips"> + <option>true</option> + <option>false</option> + </select> + </div> + <div class="form-group"> + <label for="nf_assign_macs">ASSIGN MACS</label> + <select class="form-control" name="nf_assign_macs" id="nf_assign_macs"> + <option>true</option> + <option>false</option> + </select> + </div> + <div class="form-group"> + <label for="nf_assign_floating_ip">ASSIGN FLOATING IP</label> + <select class="form-control" name="nf_assign_floating_ip" id="nf_assign_floating_ip"> + <option>true</option> + <option>false</option> + </select> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="addVmNetwork(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/vm_profile.ejs b/admportal/views/partials/vm_profile.ejs new file mode 100644 index 00000000..5c437e9e --- /dev/null +++ b/admportal/views/partials/vm_profile.ejs @@ -0,0 +1,32 @@ + <div class="modal fade" id="add_vm_profile" tabindex="-1" role="dialog" + aria-labelledby="add_vm_profile" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add VM Profile</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/mobility/addVmProfile" method="POST"> + <div class="form-group"> + <label for="nf_vnf_type">*VNF Type</label> + <input type="text" class="form-control" name="nf_vnf_type" id="nf_vnf_type" maxlength="200" placeholder="varchar(200)"> + </div> + <div class="form-group"> + <label for="nf_vm_type">*VM Type</label> + <input type="text" class="form-control" name="nf_vm_type" id="nf_vm_type" maxlength="45" placeholder="varchar(45)"> + </div> + <div class="form-group"> + <label for="nf_vm_count">VM Count</label> + <input type="text" class="form-control" name="nf_vm_count" id="nf_vm_count" maxlength="11" placeholder="int(11)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="addVmProfile(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/vnf_network.ejs b/admportal/views/partials/vnf_network.ejs new file mode 100644 index 00000000..47580dc0 --- /dev/null +++ b/admportal/views/partials/vnf_network.ejs @@ -0,0 +1,28 @@ + <div class="modal fade" id="add_vnf_network" tabindex="-1" role="dialog" + aria-labelledby="add_vnf_network" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add VNF Network</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/mobility/addVnfNetwork" method="POST"> + <div class="form-group"> + <label for="nf_vnf_type">*VNF Type</label> + <input type="text" class="form-control" name="nf_vnf_type" id="nf_vnf_type" maxlength="200" placeholder="varchar(200)"> + </div> + <div class="form-group"> + <label for="nf_network_role">*Network Role</label> + <input type="text" class="form-control" name="nf_network_role" id="nf_network_role" maxlength="45" placeholder="varchar(45)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="addVnfNetwork(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/vnf_profile.ejs b/admportal/views/partials/vnf_profile.ejs new file mode 100644 index 00000000..d67cf1a6 --- /dev/null +++ b/admportal/views/partials/vnf_profile.ejs @@ -0,0 +1,32 @@ + <div class="modal fade" id="add_vnf_profile" tabindex="-1" role="dialog" + aria-labelledby="add_vnf_profile" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add VNF Profile</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/mobility/addVnfProfile" method="POST"> + <div class="form-group"> + <label for="nf_vnf_type">*VNF Type</label> + <input type="text" class="form-control" name="nf_vnf_type" id="nf_vnf_type" maxlength="200" placeholder="varchar(200)"> + </div> + <div class="form-group"> + <label for="nf_availability_zone_count">Availability Zone Count</label> + <input type="text" class="form-control" name="nf_availability_zone_count" id="nf_availability_zone_count" maxlength="11" placeholder="int(11)"> + </div> + <div class="form-group"> + <label for="nf_equipment_role">Equipment Role</label> + <input type="text" class="form-control" name="nf_equipment_role" id="nf_equipment_role" maxlength="11" placeholder="varchar(80)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="addVnfProfile(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/partials/vnf_vm_information.ejs b/admportal/views/partials/vnf_vm_information.ejs new file mode 100644 index 00000000..fb9af735 --- /dev/null +++ b/admportal/views/partials/vnf_vm_information.ejs @@ -0,0 +1,42 @@ + <div class="modal fade" + id="vnf-vm-information-modal" tabindex="-1" role="dialog" + aria-labelledby="vnf-vm-information-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">vnf-vm-information</h4> + </div> + <div class="modal-body"> + <form role="form" action="" method="POST"> + <div class="form-group"> + <label for="vserver_type">vserver-type</label> + <input type="text" class="form-control" name="vserver_type" id="vserver_type"> + </div> + <div class="form-group"> + <label for="vserver_name">vserver-name</label> + <input type="text" class="form-control" name="vserver_name" id="vserver_name"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#vnf-vm-information-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/vr_lan_interface.ejs b/admportal/views/partials/vr_lan_interface.ejs new file mode 100644 index 00000000..45f7ec13 --- /dev/null +++ b/admportal/views/partials/vr_lan_interface.ejs @@ -0,0 +1,66 @@ + <div class="modal fade" id="vr-lan-interface-modal" tabindex="-1" role="dialog" + aria-labelledby="vr-lan-interface-modal-label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">VR-LAN-INTERFACE</h4> + </div> + <div class="modal-body"> + <form id="vr_lan_interface_form" role="form" action="/odl/update_vr_lan_interface" method="POST"> + <div class="form-group"> + <label for="vr_designation">vr-designation</label> + <input type="text" class="form-control" name="vr_designation" id="vr_designation"> + </div> + <div class="form-group"> + <label for="v6_vr_lan_prefix">v6-vr-lan-prefix</label> + <input type="text" class="form-control" name="v6_vr_lan_prefix" id="v6_vr_lan_prefix"> + </div> + <div class="form-group"> + <label for="v6_vr_lan_prefix_length">v6-vr-lan-prefix-length</label> + <input type="text" class="form-control" name="v6_vr_lan_prefix_length" id="v6_vr_lan_prefix_length"> + </div> + <div class="form-group"> + <label for="v6_vce_wan_address">v6-vce-wan-address</label> + <input type="text" class="form-control" name="v6_vce_wan_address" id="v6_vce_wan_address"> + </div> + <div class="form-group"> + <label for="v4_vr_lan_prefix">v4-vr-lan-prefix</label> + <input type="text" class="form-control" name="v4_vr_lan_prefix" id="v4_vr_lan_prefix"> + </div> + <div class="form-group"> + <label for="v4_vr_lan_prefix_length">v4-vr-lan-prefix-length</label> + <input type="text" class="form-control" name="v4_vr_lan_prefix_length" id="v4_vr_lan_prefix_length"> + </div> + <div class="form-group"> + <label for="t_defaulted_v6_vrlan">t-defaulted-v6-vrlan</label> + <input type="text" class="form-control" name="t_defaulted_v6_vrlan" id="t_defaulted_v6_vrlan"> + </div> + <div class="form-group"> + <label for="v4_vce_loopback_address">v4-vce-loopback-address</label> + <input type="text" class="form-control" name="v4_vce_loopback_address" id="v4_vce_loopback_address"> + </div> + +<!-- + <div class="form-group"> + <input type="hidden" name="svc_instance_id" id="svc_instance_id"> + <input type="hidden" name="uf_action" id="uf_action"> + <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> +--> + </form> + </div> + </div> + </div> + </div> + +<script type="text/javascript"> +function submit(form){ + $('#vr-lan-interface-modal').modal('hide'); + form.action = form.uf_action.value; + form.submit(); + return; +} +</script> + diff --git a/admportal/views/partials/vrr_credentials.ejs b/admportal/views/partials/vrr_credentials.ejs new file mode 100644 index 00000000..620176da --- /dev/null +++ b/admportal/views/partials/vrr_credentials.ejs @@ -0,0 +1,82 @@ +<div class="modal fade" id="add_vrr_credentials" tabindex="-1" role="dialog" + aria-labelledby="add_vrr_credentials_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Add VRR Credentials</h4> + </div> + <div class="modal-body"> + <form name="addForm" role="form" action="/sdnfc/addVrrCredentials" method="POST"> + <div class="form-group"> + <label for="nf_server_name">*Server Name</label> + <input type="text" class="form-control" maxlength="50" name="nf_server_name" id="nf_server_name" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="nf_ip_address">*IP Address</label> + <input type="text" class="form-control" maxlength="15" name="nf_ip_address" id="nf_ip_address" placeholder="varchar(15)"> + </div> + <div class="form-group"> + <label for="nf_username">*Username</label> + <input type="text" class="form-control" maxlength="50" name="nf_username" id="nf_username" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="nf_password">*Password</label> + <input type="password" class="form-control" maxlength="255" name="nf_password" id="nf_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <label for="nf_confirm_password">*Confirm Password</label> + <input type="password" class="form-control" maxlength="255" name="nf_confirm_password" id="nf_confirm_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="nf_action" id="nf_action"> + <button type="button" class="btn btn-primary" onclick="submitVrrCredentials(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> + + <div class="modal fade" id="update_vrr_credentials" tabindex="-1" role="dialog" + aria-labelledby="update_vrr_credentials_label" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title">Update VRR Credentials</h4> + </div> + <div class="modal-body"> + <form role="form" action="/sdnfc/updateVrrCredentials" method="POST"> + <div class="form-group"> + <label for="uf_server_name">*Server Name</label> + <input type="text" class="form-control" maxlength="50" name="uf_server_name" id="uf_server_name" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="uf_ip_address">*IP Address</label> + <input type="text" class="form-control" maxlength="15" name="uf_ip_address" id="uf_ip_address" placeholder="varchar(15)"> + </div> + <div class="form-group"> + <label for="uf_username">*Username</label> + <input type="text" class="form-control" maxlength="50" name="uf_username" id="uf_username" placeholder="varchar(50)"> + </div> + <div class="form-group"> + <label for="uf_password">*Password</label> + <input type="password" class="form-control" maxlength="255" name="uf_password" id="uf_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <label for="uf_confirm_password">*Confirm Password</label> + <input type="password" class="form-control" maxlength="255" name="uf_confirm_password" id="uf_confirm_password" placeholder="varbinary(255)"> + </div> + <div class="form-group"> + <input type="hidden" name="uf_action" id="uf_action"> + <input type="hidden" name="uf_key_server_name" id="uf_key_server_name"> + <button type="button" class="btn btn-primary" onclick="submitVrrCredentials(this.form);">Submit</button> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + </div> + </form> + </div> + </div> + </div> + </div> diff --git a/admportal/views/resalloc/max_port_speed.ejs b/admportal/views/resalloc/max_port_speed.ejs new file mode 100644 index 00000000..b46b14d9 --- /dev/null +++ b/admportal/views/resalloc/max_port_speed.ejs @@ -0,0 +1,205 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#max_port_speed').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>Max Port Speed</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_max_port_speed"> + Add Max Port Speed + </button> + </div> + <% } %> + + <table id="max_port_speed" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*ID</th> + <th>*Image File Name</th> + <th>*End Point Position</th> + <th>*Interface Name</th> + <th>*Max Speed</th> + <th>*Unit</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.max_port_speed_id %></td> + <td><%= row.image_file_name %></td> + <td><%= row.end_point_position %></td> + <td><%= row.interface_name %></td> + <td><%= row.max_speed %></td> + <td><%= row.unit %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateMaxPortSpeed('<%=row.max_port_speed_id %>','<%= row.image_file_name %>','<%= row.end_point_position %>','<%= row.interface_name %>','<%= row.max_speed %>','<%= row.unit %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteMaxPortSpeed('<%= row.max_port_speed_id %>');">Delete</button> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<% include ../partials/max_port_speed %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitMaxPortSpeed(form) +{ + var errorMsg=''; + var image_file_name = ''; + var end_point_position = ''; + var interface_name = ''; + var max_speed = ''; + var unit = ''; + + if ( form.name == 'addForm' ) + { + image_file_name = form.nf_image_file_name; + end_point_position = form.nf_end_point_position; + interface_name = form.nf_interface_name; + max_speed = form.nf_max_speed; + unit = form.nf_unit; + } + else + { + image_file_name = form.uf_image_file_name; + end_point_position = form.uf_end_point_position; + interface_name = form.uf_interface_name; + max_speed = form.uf_max_speed; + unit = form.uf_unit; + } + + + if ( (image_file_name.value == null) || (image_file_name.value == "") || isblank(image_file_name.value) ) + { + errorMsg += 'Image File Name is required.<br>'; + } + if ( (end_point_position.value == null) || (end_point_position.value == "") || isblank(end_point_position.value) ) + { + errorMsg += 'End Point Position is required.<br>'; + } + if ( (interface_name.value == null) || (interface_name.value == "") || isblank(interface_name.value) ){ + errorMsg += 'Interface Name is required.<br>'; + } + if ( (max_speed.value == null) || (max_speed.value == "") || isblank(max_speed.value) ){ + errorMsg += 'Max Speed is required.<br>'; + } + if ( (unit.value == null) || (unit.value == "") || isblank(unit.value) ){ + errorMsg += 'Unit is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + + if ( !isDigit(max_speed.value) ) + { + bootbox.alert('Max Speed must be a number.'); + return; + } + + form.submit(); +} + +function updateMaxPortSpeed(max_port_speed_id,image_file_name,end_point_position,interface_name,max_speed,unit) { + + document.getElementById('uf_max_port_speed_id').value=max_port_speed_id; + document.getElementById('uf_image_file_name').value=image_file_name; + document.getElementById('uf_end_point_position').value=end_point_position; + document.getElementById('uf_interface_name').value=interface_name; + document.getElementById('uf_max_speed').value=max_speed; + document.getElementById('uf_unit').value=unit; + + document.getElementById('uf_key_max_port_speed_id').value=max_port_speed_id; + + $('#update_max_port_speed').modal('show'); +} + +function deleteMaxPortSpeed(max_port_speed_id) { + + bootbox.confirm({ + message: "Are you sure you want to delete MAX_PORT_SPEED [" + max_port_speed_id + "]", + callback: function(result) { + if ( result ) + { + location.assign("/resalloc/deleteMaxPortSpeed?max_port_speed_id=" + max_port_speed_id); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/resalloc/max_server_speed.ejs b/admportal/views/resalloc/max_server_speed.ejs new file mode 100644 index 00000000..c0848df8 --- /dev/null +++ b/admportal/views/resalloc/max_server_speed.ejs @@ -0,0 +1,207 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#max_server_speed').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>Max Server Speed</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_max_server_speed"> + Add Max Server Speed + </button> + </div> + <% } %> + + <table id="max_server_speed" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*ID</th> + <th>*Server Model</th> + <th>*EVC Count</th> + <th>*Max Speed</th> + <th>*Unit</th> + <th>Description</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.max_server_speed_id %></td> + <td><%= row.server_model %></td> + <td><%= row.evc_count %></td> + <td><%= row.max_speed %></td> + <td><%= row.unit %></td> + <td><%= row.description %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateMaxServerSpeed('<%=row.max_server_speed_id %>','<%= row.server_model %>','<%= row.evc_count %>','<%= row.max_speed %>','<%= row.unit %>', '<%= row.description %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteMaxServerSpeed('<%= row.max_server_speed_id %>');">Delete</button> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<% include ../partials/max_server_speed %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitMaxServerSpeed(form) +{ + var errorMsg=''; + var server_model = ''; + var evc_count = ''; + var max_speed = ''; + var unit = ''; + var description = ''; + + if ( form.name == 'addForm' ) + { + server_model = form.nf_server_model; + evc_count = form.nf_evc_count; + max_speed = form.nf_max_speed; + unit = form.nf_unit; + description = form.nf_description; + } + else + { + server_model = form.uf_server_model; + evc_count = form.uf_evc_count; + max_speed = form.uf_max_speed; + unit = form.uf_unit; + description = form.uf_description; + } + + + if ( (server_model.value == null) || (server_model.value == "") || isblank(server_model.value) ) + { + errorMsg += 'Server Model is required.<br>'; + } + if ( (evc_count.value == null) || (evc_count.value == "") || isblank(evc_count.value) ) + { + errorMsg += 'EVC Count is required.<br>'; + } + if ( (max_speed.value == null) || (max_speed.value == "") || isblank(max_speed.value) ){ + errorMsg += 'Max Speed is required.<br>'; + } + if ( (unit.value == null) || (unit.value == "") || isblank(unit.value) ){ + errorMsg += 'Unit is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + + if ( !isDigit(evc_count.value) ) + { + bootbox.alert('EVC Count must be a number.'); + return; + } + if ( !isDigit(max_speed.value) ) + { + bootbox.alert('Max Speed must be a number.'); + return; + } + + form.submit(); +} + +function updateMaxServerSpeed(max_server_speed_id,server_model,evc_count,max_speed,unit,description) { + + document.getElementById('uf_max_server_speed_id').value=max_server_speed_id; + document.getElementById('uf_server_model').value=server_model; + document.getElementById('uf_evc_count').value=evc_count; + document.getElementById('uf_max_speed').value=max_speed; + document.getElementById('uf_unit').value=unit; + document.getElementById('uf_description').value=description; + + document.getElementById('uf_key_max_server_speed_id').value=max_server_speed_id; + + $('#update_max_server_speed').modal('show'); +} + +function deleteMaxServerSpeed(max_server_speed_id) { + + bootbox.confirm({ + message: "Are you sure you want to delete MAX_SERVER_SPEED [" + max_server_speed_id + "]", + callback: function(result) { + if ( result ) + { + location.assign("/resalloc/deleteMaxServerSpeed?max_server_speed_id=" + max_server_speed_id); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/resalloc/resource_rule.ejs b/admportal/views/resalloc/resource_rule.ejs new file mode 100644 index 00000000..4171fc67 --- /dev/null +++ b/admportal/views/resalloc/resource_rule.ejs @@ -0,0 +1,228 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#resource_rule').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well wel-sm"> +<h3>Resource Rule</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_resource_rule"> + Add Resource Rule + </button> + </div> + <% } %> + + <table id="resource_rule" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*ID</th> + <th>*Name</th> + <th>*End Point Position</th> + <th>*Service Expression</th> + <th>*Equipment Level</th> + <th>*Equipment Expression</th> + <th>*Allocation Expression</th> + <th>*Soft Limit Expression</th> + <th>*Hard Limit Expression</th> + <th>*Service Model</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.resource_rule_id %></td> + <td><%= row.resource_name %></td> + <td><%= row.end_point_position %></td> + <td><%= row.service_expression %></td> + <td><%= row.equipment_level %></td> + <td><%= row.equipment_expression %></td> + <td><%= row.allocation_expression %></td> + <td><%= row.soft_limit_expression %></td> + <td><%= row.hard_limit_expression %></td> + <td><%= row.service_model %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateResourceRule('<%=row.resource_rule_id %>','<%= row.resource_name %>','<%= row.end_point_position %>','<%= row.service_expression %>','<%= row.equipment_level %>','<%= row.equipment_expression %>','<%= row.allocation_expression %>','<%= row.soft_limit_expression %>', '<%= row.hard_limit_expression %>','<%= row.service_model %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteResourceRule('<%= row.resource_rule_id %>');">Delete</button> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<% include ../partials/resource_rule %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitResourceRule(form) +{ + var errorMsg=''; + var resource_name = ''; + var end_point_position = ''; + var service_expression = ''; + var equipment_level = ''; + var equipment_expression = ''; + var allocation_expression = ''; + var soft_limit_expression = ''; + var hard_limit_expression = ''; + var service_model = ''; + + if ( form.name == 'addForm' ) + { + resource_name = form.nf_resource_name; + end_point_position = form.nf_end_point_position; + service_expression = form.nf_service_expression; + equipment_level = form.nf_equipment_level; + allocation_expression = form.nf_allocation_expression; + soft_limit_expression = form.nf_soft_limit_expression; + hard_limit_expression = form.nf_hard_limit_expression; + service_model = form.nf_service_model; + } + else + { + resource_name = form.uf_resource_name; + end_point_position = form.uf_end_point_position; + service_expression = form.uf_service_expression; + equipment_level = form.uf_equipment_level; + allocation_expression = form.uf_allocation_expression; + soft_limit_expression = form.uf_soft_limit_expression; + hard_limit_expression = form.uf_hard_limit_expression; + service_model = form.uf_service_model; + } + + + if ( (resource_name.value == null) || (resource_name.value == "") || isblank(resource_name.value) ) + { + errorMsg += 'Resource Name is required.<br>'; + } + if ( (end_point_position.value == null) || (end_point_position.value == "") || isblank(end_point_position.value) ) + { + errorMsg += 'End Point Position is required.<br>'; + } + if ( (service_expression.value == null) || (service_expression.value == "") || isblank(service_expression.value) ){ + errorMsg += 'Service Expression is required.<br>'; + } + if ( (equipment_level.value == null) || (equipment_level.value == "") || isblank(equipment_level.value) ){ + errorMsg += 'Equipment Level is required.<br>'; + } + if ( (allocation_expression.value == null) || (allocation_expression.value == "") || isblank(allocation_expression.value) ){ + errorMsg += 'Allocation Expression is required.<br>'; + } + if ( (soft_limit_expression.value == null) || (soft_limit_expression.value == "") || isblank(soft_limit_expression.value) ){ + errorMsg += 'Soft Limit Expression is required.<br>'; + } + if ( (hard_limit_expression.value == null) || (hard_limit_expression.value == "") || isblank(hard_limit_expression.value) ){ + errorMsg += 'Hard Limit Expression is required.<br>'; + } + if ( (service_model.value == null) || (service_model.value == "") || isblank(service_model.value) ){ + errorMsg += 'Service Model is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + form.submit(); +} + +function updateResourceRule(resource_rule_id,resource_name,end_point_position,service_expression,equipment_level,equipment_expression,allocation_expression,soft_limit_expression,hard_limit_expression,service_model) { + + document.getElementById('uf_resource_rule_id').value=resource_rule_id; + document.getElementById('uf_resource_name').value=resource_name; + document.getElementById('uf_end_point_position').value=end_point_position; + document.getElementById('uf_service_expression').value=service_expression; + document.getElementById('uf_equipment_level').value=equipment_level; + document.getElementById('uf_equipment_expression').value=equipment_expression; + document.getElementById('uf_allocation_expression').value=allocation_expression; + document.getElementById('uf_soft_limit_expression').value=soft_limit_expression; + document.getElementById('uf_hard_limit_expression').value=hard_limit_expression; + document.getElementById('uf_service_model').value=service_model; + document.getElementById('uf_key_resource_rule_id').value=resource_rule_id; + + $('#update_resource_rule').modal('show'); +} + +function deleteResourceRule(resource_rule_id) { + + bootbox.confirm({ + message: "Are you sure you want to delete RESOURCE_RULE [" + resource_rule_id + "]", + callback: function(result) { + if ( result ) + { + location.assign("/resalloc/deleteResourceRule?resource_rule_id=" + resource_rule_id); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/resalloc/threshold_alarms.ejs b/admportal/views/resalloc/threshold_alarms.ejs new file mode 100644 index 00000000..f561bc46 --- /dev/null +++ b/admportal/views/resalloc/threshold_alarms.ejs @@ -0,0 +1,186 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#threshold_alarms').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>Threshold Alarms</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_threshold_alarm"> + Add Threshold Alarm + </button> + </div> + <% } %> + + <table id="threshold_alarms" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*Resource Threshold ID</th> + <th>*Resource Rule ID</th> + <th>Threshold Expression</th> + <th>Threshold Message</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.resource_threshold_id %></td> + <td><%= row.resource_rule_id %></td> + <td><%= row.threshold_expression %></td> + <td><%= row.threshold_message %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateThresholdAlarm('<%= row.resource_threshold_id %>','<%=row.resource_rule_id %>','<%= row.threshold_expression %>','<%= row.threshold_message %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteThresholdAlarm('<%= row.resource_threshold_id %>');">Delete</button> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<% include ../partials/threshold_alarm %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitThresholdAlarm(form) +{ + var resource_rule_id = ''; + var threshold_expression = ''; + var threshold_message = ''; + var errorMsg = ''; + + if ( form.name == 'addForm' ) + { + resource_rule_id = form.nf_resource_rule_id; + threshold_expression = form.nf_threshold_expression; + threshold_message = form.nf_threshold_message; + } + else + { + resource_rule_id = form.uf_resource_rule_id; + threshold_expression = form.uf_threshold_expression; + threshold_message = form.uf_threshold_message; + } + if ( (resource_rule_id.value == null) || (resource_rule_id.value == "") || isblank(resource_rule_id.value) ) + { + errorMsg += 'Resource Rule ID is required.\n'; + } + if ( (threshold_expression.value == null) || (threshold_expression.value == "") || isblank(threshold_expression.value) ) + { + errorMsg += 'Threshold Expression is required.\n'; + } + if ( (threshold_message.value == null) || (threshold_message.value == "") || isblank(threshold_message.value) ) + { + errorMsg += 'Threshold Message is required.\n'; + } + if( errorMsg.length > 0 ) { + alert(errorMsg); + return; + } + + if ( !isDigit(resource_rule_id.value) ) + { + alert('Resource Rule ID must be a number.'); + return; + } + + form.submit(); +} + +function updateThresholdAlarm(resource_threshold_id,resource_rule_id,threshold_expression,threshold_message) { + + document.getElementById('uf_resource_threshold_id').value=resource_threshold_id; + document.getElementById('uf_resource_rule_id').value=resource_rule_id; + document.getElementById('uf_threshold_expression').value=threshold_expression; + document.getElementById('uf_threshold_message').value=threshold_message; + + document.getElementById('uf_key_resource_threshold_id').value=resource_threshold_id; + + $('#update_threshold_alarm').modal('show'); +} + +function deleteThresholdAlarm(resource_threshold_id) { + + bootbox.confirm({ + message: "Are you sure you want to delete Threshold Alarm [" + resource_threshold_id + "]", + callback: function(result) { + if ( result ) + { + location.assign("/resalloc/deleteThresholdAlarm?resource_threshold_id=" + resource_threshold_id); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/sdnfc/viewTables.ejs b/admportal/views/sdnfc/viewTables.ejs new file mode 100644 index 00000000..b950d8f9 --- /dev/null +++ b/admportal/views/sdnfc/viewTables.ejs @@ -0,0 +1,102 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + +<meta charset="UTF-8" /> +<meta http-equiv="X-UA-Compatible" content="IE=edge"> +<% include ../partials/head %> +<% include ../partials/header %> +<script type="text/javascript" src="/javascripts/admportal.js" async></script> +<title>SDN-FC AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#viewTables').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> +</head> + +<body> + +<div class="well well-sm"> +<h3>View Database Tables +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + +<!-- Single button --> +<nav class="navbar navbar-default"> +<div class="container-fluid"> +<div class="navbar-header"> + +<div class="btn-group"> + <button type="button" class="btn btn-primary dropdown-toggle navbar-btn" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Table <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + <% for ( var i in vtables ){ %> + <li><a href="/sdnfc/getTables?tableName=<%= vtables[i] %>"><%= vtables[i] %></a></li> + <% } %> + </ul> +</div> +</div> +</div> +</nav> + +<% if (displayTable) { %> +<div class="container-fluid"> + <table id="viewTables" class="table table-hover table-condensed"> + <caption class="text-primary"><%= fields[0].table %></caption> + <thead> + <tr> + <% fields.forEach( function(field) { %> + <th><%= field.name %></th> + <% }); %> + </tr> + </thead> + + <tbody> + <% for ( var x in rows ){ %> + <tr> + <% for ( var j in rows[x] ){ %> + <td><%= rows[x][j] %></td> + <% } %> + </tr> + <% } %> + </tbody> + </table> +</div> +<% } %> + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/sdnfc/vrrCredentials.ejs b/admportal/views/sdnfc/vrrCredentials.ejs new file mode 100644 index 00000000..85c9e956 --- /dev/null +++ b/admportal/views/sdnfc/vrrCredentials.ejs @@ -0,0 +1,223 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-FC AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vrr_credentials').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>VRR Credentials</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vrr_credentials"> + Add VRR Credentials + </button> + </div> + <% } %> + + <table id="vrr_CREDENTIALS" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*Server Name</th> + <th>*IP Address</th> + <th>*Username</th> + <th>*Password</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.server_name %></td> + <td><%= row.ip_address %></td> + <td><%= row.username %></td> + <td>*****</td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateVrrCredentials('<%= row.server_name %>', '<%= row.ip_address %>', '<%= row.username %>','<%= row.password %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteVrrCredentials('<%= row.server_name %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<% include ../partials/vrr_credentials %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitVrrCredentials(form) +{ + var errorMsg=''; + var server_name = ''; + var ip_address = ''; + var username = ''; + var password = ''; + var confirm_password = ''; + + if ( form.name == 'addForm' ) + { + server_name = form.nf_server_name; + ip_address = form.nf_ip_address; + username = form.nf_username; + password = form.nf_password; + confirm_password = form.nf_confirm_password; + + if ( (server_name.value == null) || (server_name.value == "") || isblank(server_name.value) ) + { + errorMsg += 'Server Name is required.<br>'; + } + if ( (ip_address.value == null) || (ip_address.value == "") || isblank(ip_address.value) ) + { + errorMsg += 'IP Address is required.<br>'; + } + if ( (password.value == null) || (password.value == "") || isblank(password.value) ) + { + errorMsg += 'Password is required.<br>'; + } + if ( (confirm_password.value == null) || (confirm_password.value == "") || isblank(confirm_password.value) ) + { + errorMsg += 'Confirm Password is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + if ( password.value != confirm_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + else + { + server_name = form.uf_server_name; + ip_address = form.uf_ip_address; + username = form.uf_username; + password = form.uf_password; + confirm_password = form.uf_confirm_password; + + if ( (server_name.value == null) || (server_name.value == "") || isblank(server_name.value) ) + { + errorMsg += 'Server Name is required.<br>'; + } + if ( (ip_address.value == null) || (ip_address.value == "") || isblank(ip_address.value) ) + { + errorMsg += 'IP Address is required.<br>'; + } + if ( (password.value == null) || (password.value == "") || isblank(password.value) ) + { + errorMsg += 'Password is required.<br>'; + } + if ( (confirm_password.value == null) || (confirm_password.value == "") || isblank(confirm_password.value) ) + { + errorMsg += 'Confirm Password is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + + if ( password.value != confirm_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + form.submit(); +} + +function updateVrrCredentials(server_name,ip_address,username,password) { + + document.getElementById('uf_server_name').value=server_name; + document.getElementById('uf_key_server_name').value=server_name; + document.getElementById('uf_ip_address').value=ip_address; + document.getElementById('uf_username').value=username; + document.getElementById('uf_password').value=password; + document.getElementById('uf_confirm_password').value=password; + + $('#update_vrr_credentials').modal('show'); +} + +function deleteVrrCredentials(server_name) { + + var url_string = encodeURI("/sdnfc/deleteVrrCredentials?server_name=" + server_name); + + bootbox.confirm({ + message: "Are you sure you want to delete VRR Credential [ " + server_name + " ]", + callback: function(result) { + if ( result ) + { + location.assign(url_string); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/sla/list.ejs b/admportal/views/sla/list.ejs new file mode 100644 index 00000000..10bd4f4c --- /dev/null +++ b/admportal/views/sla/list.ejs @@ -0,0 +1,189 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#sla').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>Service Logic Administration</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'><%=result.msg %></div> + <% } else { %> + <div class='alert alert-danger' role='danger'><%=result.msg %></div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + +<div class="container-fluid"> + <table id="sla" class="table table-hover table-condensed"> + <thead> + <tr> + <th>Module</th> + <th>RPC</th> + <th>Version</th> + <th>Mode</th> + <th>Active</th> + <% if(priv == 'A') { %> + <th>Activate/Deactive</th> + <% } %> + <th>Display</th> + <th>XML code</th> + <% if(priv=='A') { %> + <th>Delete</th> + <% } %> + </tr> + </thead> + <tbody> + <% var i=0; rows.forEach( function(row) { %> + <tr> + <td><%= row.module %></td> + <td><%= row.rpc %></td> + <td><%= row.version %></td> + <td><%= row.mode %></td> + <td><%= row.active %></td> + <% if ( priv == 'A' ) { + if (row.active == "Y") { %> + <td><button type="button" class="btn btn-default btn-xs" onclick="toggleState('deactivate','<%= row.module %>','<%= row.rpc %>','<%= row.version %>','<%= row.mode %>');" >Deactivate</button> </td> + <% } else { %> + <td><button type="button" class="btn btn-default btn-xs" onclick="toggleState('activate','<%= row.module %>','<%= row.rpc %>','<%= row.version %>','<%= row.mode %>');" >Activate</button></td> + <% } %> + <% } %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick='location.assign("/sla/printAsGv?module=<%= row.module %>&rpc=<%= row.rpc %>&version=<%= row.version %>&mode=<%= row.mode %>");'>Display</button> + </td> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick='location.assign("/sla/printAsXml?module=<%= row.module %>&rpc=<%= row.rpc %>&version=<%= row.version %>&mode=<%= row.mode %>");'>XML code</button> + </td> + <% if ( priv == 'A' ) { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteGraph('<%=row.module %>', + '<%=row.rpc %>', '<%=row.version %>','<%=row.mode %>');">Delete</button> + </td> + <% } %> + </tr> + <% i++; }); %> + </tbody> + </table> + + <% if(priv == 'A') { %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/sla/upload" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <% + if ( priv == 'A' ) + { + %> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + <% } else { %> + <button type="button" class="btn btn-default disabled" + onclick="uploadFile(this.form);">Upload File</button> + <% } %> + </form> + </div> + <% } %> +</div> + + + +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function deleteGraph(_module,rpc,version,mode) { + + bootbox.confirm({ + message: "Are you sure you want to delete Directed Graph [" + _module + "][" + rpc + "][" + version + "] ?", + callback: function(result) { + if ( result ) + { + location.assign("/sla/deleteDG?module=" + _module + + "&rpc=" + rpc + "&version=" + version + "&mode=" + mode ); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} +function toggleState(laction,_module,rpc,version,mode) +{ + var myprompt = ''; + var myaction = ''; + if(laction == 'activate'){ + myprompt = "Are you sure you want to Activate Directed Graph [" + _module + "] ?"; + myaction = "/sla/activate" + + "?module=" + _module + + "&rpc=" + rpc + + "&version=" + version + + "&mode=" + mode; + } else { + myprompt = "Are you sure you want to Deactivate Directed Graph [" + _module + "] ?"; + myaction = "/sla/deactivate" + + "?module=" + _module + + "&rpc=" + rpc + + "&version=" + version + + "&mode=" + mode; + } + + bootbox.confirm({ + message: myprompt, + callback: function(result) { + if ( result ) + { + location.assign(myaction); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} +</script> +</body> +</html> + diff --git a/admportal/views/sla/printasgv.ejs b/admportal/views/sla/printasgv.ejs new file mode 100644 index 00000000..66dca131 --- /dev/null +++ b/admportal/views/sla/printasgv.ejs @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <title>SDN-C AdminPortal</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge" /> + <% include ../partials/head %> + <% include ../partials/header %> +</head> +<body> + + + +<div class="well well-sm"> +<h3>Service Logic Graph</h3> +</div> + +<div class="container-fluid"> +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> +<pre> +Module : <%= result.module %> +RPC : <%= result.rpc %> +Mode : <%= result.mode %> +Version : <%= result.version %> +<br> +<img src='data:image/png;base64,<%= result.msg %>' > +</pre> + <% } else { %> + <pre class='alert alert-danger' role='danger'><%=result.msg %></pre> + <% } %> + <% } %> +<% } %> + + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/sla/printasxml.ejs b/admportal/views/sla/printasxml.ejs new file mode 100644 index 00000000..48b55049 --- /dev/null +++ b/admportal/views/sla/printasxml.ejs @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <title>SDN-C AdminPortal</title> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> +</head> +<body> + +<div class="well well-sm"> +<h3>Service Logic Code</h3> +</div> + +<div class="container-fluid"> +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <pre class='alert alert-success' role='alert'><%=result.msg %></pre> + <% } else { %> + <pre class='alert alert-danger' role='danger'><%=result.msg %></pre> + <% } %> + <% } %> +<% } %> +</div> + + +<footer> + <% include ../partials/footer %> +</footer> + +</body> +</html> + diff --git a/admportal/views/tunnel/linkLatencyMaster.ejs b/admportal/views/tunnel/linkLatencyMaster.ejs new file mode 100644 index 00000000..c09adc4e --- /dev/null +++ b/admportal/views/tunnel/linkLatencyMaster.ejs @@ -0,0 +1,240 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + +<meta charset="UTF-8" /> +<meta http-equiv="X-UA-Compatible" content="IE=edge"> +<% include ../partials/head %> +<% include ../partials/header %> +<script type="text/javascript" src="/javascripts/admportal.js" async></script> +<title>SDNC-MLC AdminPortal</title> + + +<script class="init"> + $(document).ready(function() { + $('#linkLatencyMaster').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> +</head> + +<body> + +<div class="well well-sm"> +<h3>Link Latency Master</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_link_latency_master">Add Link Latency</button> + </div> + <% } %> + + <table id="linkLatencyMaster" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*Src CRS Name</th> + <th>*Dest CRS Name</th> + <th>*Bundle Name</th> + <th>*Latency</th> + <th>*Intra Inter SNRC</th> + <th>*Final Latency</th> + <th>*Augmentable</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.source_crs_name %></td> + <td><%= row.destination_crs_name %></td> + <td><%= row.bundle_name %></td> + <td><%= row.latency %></td> + <td><%= row.intra_inter_snrc %></td> + <td><%= row.final_latency %></td> + <td><%= row.augmentable %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" onclick="updateLinkLatencyMaster('<%= row.source_crs_name %>', '<%= row.destination_crs_name %>', '<%= row.bundle_name %>', '<%= row.latency %>', '<%= row.intra_inter_snrc %>', '<%= row.final_latency %>', '<%= row.augmentable %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" onclick="deleteLinkLatencyMaster('<%= row.source_crs_name %>','<%= row.destination_crs_name %>','<%= row.bundle_name %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/tunnel/uploadLinkLatencyMaster" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <button type="button" class="btn btn-default" onclick="uploadFile(this.form);">Upload File</button> + </form> + </div> + <% } %> + +</div> + +<% include ../partials/link_latency_master %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitLinkLatencyMaster(form) +{ + var errorMsg=''; + var source_crs_name = ''; + var destination_crs_name = ''; + var bundle_name = ''; + var latency = ''; + var intra_inter_snrc = ''; + var final_latency = ''; + var augmentable = ''; + + if ( form.name == 'addForm' ) + { + source_crs_name = form.nf_source_crs_name; + destination_crs_name = form.nf_destination_crs_name; + bundle_name = form.nf_bundle_name; + latency = form.nf_latency; + intra_inter_snrc = form.nf_intra_inter_snrc; + final_latency = form.nf_final_latency; + augmentable = form.nf_augmentable; + } + else + { + source_crs_name = form.uf_source_crs_name; + destination_crs_name = form.uf_destination_crs_name; + bundle_name = form.uf_bundle_name; + latency = form.uf_latency; + intra_inter_snrc = form.uf_intra_inter_snrc; + final_latency = form.uf_final_latency; + augmentable = form.uf_augmentable; + } + + if ( (source_crs_name.value == null) || (source_crs_name.value == "") || isblank(source_crs_name.value) ) + { + errorMsg += 'Source CRS Name is required.<br>'; + } + if ( (destination_crs_name.value == null) || (destination_crs_name.value == "") || isblank(destination_crs_name.value) ) + { + errorMsg += 'Destination CRS Name is required.<br>'; + } + if ( (bundle_name.value == null) || (bundle_name.value == "") || isblank(bundle_name.value) ) + { + errorMsg += 'Bundle Name is required.<br>'; + } + if ( (latency.value == null) || (latency.value == "") || isblank(latency.value) ) + { + errorMsg += 'Latency is required.<br>'; + } + if ( (intra_inter_snrc.value == null) || (intra_inter_snrc.value == "") || isblank(intra_inter_snrc.value) ) + { + errorMsg += 'Intra Inter SNRC is required.<br>'; + } + if ( (final_latency.value == null) || (final_latency.value == "") || isblank(final_latency.value) ) + { + errorMsg += 'Final Latency is required.<br>'; + } + if ( (augmentable.value == null) || (augmentable.value == "") || isblank(augmentable.value) ) + { + errorMsg += 'Augmentable is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + + if (augmentable.value != 'Y' && augmentable.value != 'N'){ + bootbox.alert('Augmentable must be Y or N'); + return; + } + + form.submit(); +} + +function updateLinkLatencyMaster(source_crs_name,destination_crs_name,bundle_name,latency,intra_inter_snrc,final_latency,augmentable) { + + document.getElementById('uf_source_crs_name').value=source_crs_name; + document.getElementById('uf_destination_crs_name').value=destination_crs_name; + document.getElementById('uf_bundle_name').value=bundle_name; + document.getElementById('uf_latency').value=latency; + document.getElementById('uf_intra_inter_snrc').value=intra_inter_snrc; + document.getElementById('uf_final_latency').value=final_latency; + document.getElementById('uf_augmentable').value=augmentable; + + document.getElementById('uf_key_source_crs_name').value=source_crs_name; + document.getElementById('uf_key_destination_crs_name').value=destination_crs_name; + document.getElementById('uf_key_bundle_name').value=bundle_name; + + $('#update_link_latency_master').modal('show'); +} + +function deleteLinkLatencyMaster(source_crs_name,destination_crs_name,bundle_name) { + + var url_string = encodeURI("/tunnel/deleteLinkLatencyMaster?source_crs_name=" + source_crs_name + + "&destination_crs_name=" + destination_crs_name + + "&bundle_name=" + bundle_name); + + bootbox.confirm({ + message: "Are you sure you want to delete this Link Latency entry? [" + source_crs_name + ":" + destination_crs_name + ":" + bundle_name + "]", + callback: function(result) { + if ( result ) + { + location.assign(url_string); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/tunnel/linkMaster.ejs b/admportal/views/tunnel/linkMaster.ejs new file mode 100644 index 00000000..160bb7e6 --- /dev/null +++ b/admportal/views/tunnel/linkMaster.ejs @@ -0,0 +1,213 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + +<meta charset="UTF-8" /> +<meta http-equiv="X-UA-Compatible" content="IE=edge"> +<% include ../partials/head %> +<% include ../partials/header %> +<script type="text/javascript" src="/javascripts/admportal.js" async></script> +<title>SDNC-MLC AdminPortal</title> + + +<script class="init"> + $(document).ready(function() { + $('#linkMaster').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> +</head> + +<body> + +<div class="well well-sm"> +<h3>Link Master</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_link_master">Add Link</button> + </div> + <% } %> + + <table id="linkMaster" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*Link Interface IP</th> + <th>Source CRS Name</th> + <th>Destination CRS Name</th> + <th>Max Reserved BW</th> + <th>Default Cost</th> + <th>Bundle Name</th> + <th>Shutdown</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.link_interface_ip %></td> + <td><%= row.source_crs_name %></td> + <td><%= row.destination_crs_name %></td> + <td><%= row.link_speed %></td> + <td><%= row.default_cost %></td> + <td><%= row.bundle_name %></td> + <td><%= row.shutdown %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" onclick="updateLinkMaster('<%= row.link_interface_ip %>', + '<%= row.source_crs_name %>', '<%= row.destination_crs_name %>', '<%= row.link_speed %>', '<%= row.default_cost %>', + '<%= row.bundle_name %>', '<%= row.shutdown %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" onclick="deleteLinkMaster('<%= row.link_interface_ip %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> +</div> + +<% include ../partials/link_master %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function saveLinkMaster(form) +{ + var errorMsg=''; + var link_interface_ip = ''; + var source_crs_name = ''; + var destination_crs_name = ''; + var link_speed = ''; + var default_cost = ''; + var bundle_name = ''; + var shutdown = ''; + + if ( form.name == 'addForm' ) + { + link_interface_ip = form.nf_link_interface_ip; + source_crs_name = form.nf_source_crs_name; + destination_crs_name = form.nf_destination_crs_name; + link_speed = form.nf_link_speed; + default_cost = form.nf_default_cost; + bundle_name = form.nf_bundle_name; + shutdown = form.nf_shutdown; + } + else + { + link_interface_ip = form.uf_link_interface_ip; + source_crs_name = form.uf_source_crs_name; + destination_crs_name = form.uf_destination_crs_name; + link_speed = form.uf_link_speed; + default_cost = form.uf_default_cost; + bundle_name = form.uf_bundle_name; + shutdown = form.uf_shutdown; + } + + + if ( (link_interface_ip.value == null) || (link_interface_ip.value == "") || isblank(link_interface_ip.value) ) + { + errorMsg += 'Link Interface IP is required.<br>'; + } + if ( (source_crs_name.value == null) || (source_crs_name.value == "") || isblank(source_crs_name.value) ) + { + errorMsg += 'Source CRS Name is required.<br>'; + } + if ( (destination_crs_name.value == null) || (destination_crs_name.value == "") || isblank(destination_crs_name.value) ) + { + errorMsg += 'Destination CRS Name is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + + if ( link_speed.value.length >0 && !isDigit(link_speed.value) ) + { + bootbox.alert('Max Reserved BW must be a number.'); + return; + } + if ( default_cost.value.length >0 && !isDigit(default_cost.value) ) + { + bootbox.alert('Default Cost must be a number.'); + return; + } + form.submit(); +} + +function updateLinkMaster(link_interface_ip,source_crs_name,destination_crs_name,link_speed,default_cost,bundle_name,shutdown) { + + document.getElementById('uf_link_interface_ip').value=link_interface_ip; + document.getElementById('uf_source_crs_name').value=source_crs_name; + document.getElementById('uf_destination_crs_name').value=destination_crs_name; + document.getElementById('uf_link_speed').value=link_speed; + document.getElementById('uf_default_cost').value=default_cost; + document.getElementById('uf_bundle_name').value=bundle_name; + document.getElementById('uf_shutdown').value=shutdown; + document.getElementById('uf_key_link_interface_ip').value=link_interface_ip; + + $('#update_link_master').modal('show'); +} + +function deleteLinkMaster(link_interface_ip) { + + var url_string = encodeURI("/tunnel/deleteLinkMaster?link_interface_ip=" + link_interface_ip); + + bootbox.confirm({ + message: "Are you sure you want to delete this Link [" + link_interface_ip + "]", + callback: function(result) { + if ( result ) + { + location.assign(url_string); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/tunnel/metroRoadmServiceRequest.ejs b/admportal/views/tunnel/metroRoadmServiceRequest.ejs new file mode 100644 index 00000000..efc81afe --- /dev/null +++ b/admportal/views/tunnel/metroRoadmServiceRequest.ejs @@ -0,0 +1,300 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#metroRoadmServiceRequest').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>Metro ROADM Service Request</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <!-- + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_metroroadm_service_request"> + Add Metro ROADM Serice Request + </button> + </div> + <% } %> + --> + + <table id="metroRoadmServiceRequest" class="table table-hover table-condensed"> + <thead> + <tr> + <th>ReqId</th> + <th>ReqSource</th> + <th>NotificationURL</th> + <th>Action</th> + <th>ReqTimestamp</th> + <th>UpdateTimestamp</th> + <th>ReqStatus</th> + <th>ProcStatus</th> + <th>ReasonCode</th> + <th>ReasonMsg</th> + <th>ServiceId</th> + <th>CommonId</th> + <th>Clli_A</th> + <th>Clli_Z</th> + <th>Customer</th> + <th>ControllerId</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.request_id %></td> + <td><%= row.request_source %></td> + <td><%= row.notification_url %></td> + <td><%= row.action %></td> + <td><%= row.request_timestamp %></td> + <td><%= row.update_timestamp %></td> + <td><%= row.request_status %></td> + <td><%= row.processing_status %></td> + <td><%= row.reason_code %></td> + <td><%= row.reason_message %></td> + <td><%= row.service_id %></td> + <td><%= row.common_id %></td> + <td><%= row.clli_a %></td> + <td><%= row.clli_z %></td> + <td><%= row.customer %></td> + <td><%= row.controller_id %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateMetroRoadmServiceRequest('<%=row.request_id %>','<%= row.request_source %>', + '<%=row.notification_url %>','<%= row.action %>','<%= row.request_timestamp %>', + '<%= row.update_timestamp %>','<%= row.request_status %>', '<%= row.processing_status %>', + '<%= row.reason_code %>', '<%= row.reason_message %>','<%= row.service_id %>', + '<%= row.common_id %>','<%= row.clli_a %>', '<%= row.clli_z %>','<%= row.customer %>', + '<%= row.controller_id %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteMetroRoadmServiceRequest('<%= row.request_id %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> +</div> + +<% include ../partials/metroroadm_service_request %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitMetroRoadmServiceRequest(form) +{ + var errorMsg=''; + var request_id=''; + var request_source = ''; + var notification_url = ''; + var action = ''; + var request_timestamp = ''; + var update_timestamp = ''; + var request_status = ''; + var processing_status = ''; + var reason_code = ''; + var reason_message = ''; + var service_id = ''; + var common_id = ''; + var clli_a = ''; + var clli_z = ''; + var customer = ''; + var controller_id = ''; + + if ( form.name == 'addForm' ) + { + request_id = form.nf_request_id; + request_source = form.nf_request_source; + notification_url = form.nf_notification_url; + action = form.nf_l_action; + request_timestamp = form.nf_request_timestamp; + update_timestamp = form.nf_update_timestamp; + request_status = form.nf_request_status; + processing_status = form.nf_processing_status; + reason_code = form.nf_reason_code; + reason_message = form.nf_reason_message; + service_id = form.nf_service_id; + common_id = form.nf_common_id; + clli_a = form.nf_clli_a; + clli_z = form.nf_clli_z; + customer = form.nf_customer; + controller_id = form.nf_controller_id; + } + else + { + request_id = form.uf_request_id; + request_source = form.uf_request_source; + notification_url = form.uf_notification_url; + action = form.uf_l_action; + request_timestamp = form.uf_request_timestamp; + update_timestamp = form.uf_update_timestamp; + request_status = form.uf_request_status; + processing_status = form.uf_processing_status; + reason_code = form.uf_reason_code; + reason_message = form.uf_reason_message; + service_id = form.uf_service_id; + common_id = form.uf_common_id; + clli_a = form.uf_clli_a; + clli_z = form.uf_clli_z; + customer = form.uf_customer; + controller_id = form.uf_controller_id; + } + if ( (request_id.value == null) || (request_id.value == "") || isblank(request_id.value) ) + { + errorMsg += 'Request Id is required.\n'; + } + if ( (action.value == null) || (action.value == "") || isblank(action.value) ) + { + errorMsg += 'Action is required.\n'; + } + if ( (request_timestamp.value == null) || (request_timestamp.value == "") || isblank(request_timestamp.value) ) + { + errorMsg += 'Request Timestamp is required.\n'; + } + if ( (request_status.value == null) || (request_status.value == "") || isblank(request_status.value) ) + { + errorMsg += 'Request Status is required.\n'; + } + if ( (processing_status.value == null) || (processing_status.value == "") || isblank(processing_status.value) ) + { + errorMsg += 'Processing Status is required.\n'; + } + if ( (service_id.value == null) || (service_id.value == "") || isblank(service_id.value) ) + { + errorMsg += 'Service Id is required.\n'; + } + if ( (controller_id.value == null) || (controller_id.value == "") || isblank(controller_id.value) ) + { + errorMsg += 'Controller Id is required.\n'; + } + if( errorMsg.length > 0 ) { + alert(errorMsg); + return; + } + + // edit request_timestamp, update_timestamp + if (!isValid(request_timestamp.value)){ + alert('Request Timestamp must be in format YYYY-MM-DD HH:MM:SS'); + return; + } + if ( update_timestamp.length > 0 ) + { + if (!isValid(update_timestamp.value)){ + alert('Update Timestamp must be in format YYYY-MM-DD HH:MM:SS'); + return; + } + } + form.submit(); +} + +function isValid(dateString) { + if (dateString == '0000-00-00 00:00:00'){ + return(true); + } + var minDate = new Date('1970-01-01 00:00:01'); + var maxDate = new Date('2038-01-19 03:14:07'); + var date = new Date(dateString); + return date > minDate && date < maxDate; +} + +function updateMetroRoadmServiceRequest(request_id,request_source,notification_url,action,request_timestamp,update_timestamp, + request_status,processing_status,reason_code,reason_message,service_id,common_id,clli_a,clli_z,customer,controller_id) { + + document.getElementById('uf_request_id').value=request_id; + document.getElementById('uf_key_request_id').value=request_id; + document.getElementById('uf_request_source').value=request_source; + document.getElementById('uf_notification_url').value=notification_url; + document.getElementById('uf_l_action').value=action; + document.getElementById('uf_request_timestamp').value=request_timestamp; + document.getElementById('uf_update_timestamp').value=update_timestamp; + document.getElementById('uf_request_status').value=request_status; + document.getElementById('uf_processing_status').value=processing_status; + document.getElementById('uf_reason_code').value=reason_code; + document.getElementById('uf_reason_message').value=reason_message; + document.getElementById('uf_service_id').value=service_id; + document.getElementById('uf_common_id').value=common_id; + document.getElementById('uf_clli_a').value=clli_a; + document.getElementById('uf_clli_z').value=clli_z; + document.getElementById('uf_customer').value=customer; + document.getElementById('uf_controller_id').value=controller_id; + + $('#update_metroroadm_service_request').modal('show'); +} + +function deleteMetroRoadmServiceRequest(request_id) { + + var url_string = encodeURI("/tunnel/deleteMetroRoadmServiceRequest?request_id=" + request_id ); + + bootbox.confirm({ + message: "Are you sure you want to delete Metro ROADM Service Request? " + request_id, + callback: function(result) { + if ( result ) + { + location.assign(url_string); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/tunnel/owbcProperties.ejs b/admportal/views/tunnel/owbcProperties.ejs new file mode 100644 index 00000000..37b02fea --- /dev/null +++ b/admportal/views/tunnel/owbcProperties.ejs @@ -0,0 +1,223 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#owbc_properties').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>OWBC Properties</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_owbc_properties"> + Add OWBC Properties + </button> + </div> + <% } %> + + <table id="owbc_properties" class="table table-hover table-condensed"> + <thead> + <tr> + <th>Controller ID</th> + <th>Base URL</th> + <th>Service Create Extension</th> + <th>Service Delete Extension</th> + <th>Auth Username</th> + <th>Auth Password</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.controller_id %></td> + <td><%= row.base_uri %></td> + <td><%= row.service_create_extension %></td> + <td><%= row.service_delete_extension %></td> + <td><%= row.auth_username %></td> + <td>*****</td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateOwbcProperties('<%=row.controller_id %>','<%= row.base_uri %>','<%= row.service_create_extension %>','<%= row.service_delete_extension %>','<%= row.auth_username %>','<%= row.auth_password %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteOwbcProperties('<%= row.controller_id %>');">Delete</button> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<% include ../partials/owbc_properties %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitOwbcProperties(form) +{ + var errorMsg=''; + var controller_id = ''; + var base_uri = ''; + var service_create_extension = ''; + var service_delete_extension = ''; + var auth_username = ''; + var auth_password = ''; + var confirm_auth_password = ''; + + if ( form.name == 'addForm' ) + { + controller_id = form.nf_controller_id; + base_uri = form.nf_base_uri; + service_create_extension = form.nf_service_create_extension; + service_delete_extension = form.nf_service_delete_extension; + auth_username = form.nf_auth_username; + auth_password = form.nf_auth_password; + confirm_auth_password = form.nf_confirm_auth_password; + + if ( auth_password.value != confirm_auth_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + else + { + controller_id = form.uf_controller_id; + base_uri = form.uf_base_uri; + service_create_extension = form.uf_service_create_extension; + service_delete_extension = form.uf_service_delete_extension; + auth_username = form.uf_auth_username; + auth_password = form.uf_auth_password; + confirm_auth_password = form.uf_confirm_auth_password; + + if ( auth_password.value != confirm_auth_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + if ( (controller_id.value == null) || (controller_id.value == "") || isblank(controller_id.value) ) + { + errorMsg += 'Controller Id is required.<br>'; + } + if ( (base_uri.value == null) || (base_uri.value == "") || isblank(base_uri.value) ) + { + errorMsg += 'Base URL is required.<br>'; + } + if ( (service_create_extension.value == null) || (service_create_extension.value == "") || isblank(service_create_extension.value) ) + { + errorMsg += 'Service Create Extension is required.<br>'; + } + if ( (service_delete_extension.value == null) || (service_delete_extension.value == "") || isblank(service_delete_extension.value) ) + { + errorMsg += 'Service Delete Extension is required.<br>'; + } + if ( (auth_username.value == null) || (auth_username.value == "") || isblank(auth_username.value) ) + { + errorMsg += 'Auth Username is required.<br>'; + } + if ( (auth_password.value == null) || (auth_password.value == "") || isblank(auth_password.value) ) + { + errorMsg += 'Auth Password is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + form.submit(); +} + +function updateOwbcProperties(controller_id,base_uri,service_create_extension,service_delete_extension,auth_username,auth_password) { + + document.getElementById('uf_controller_id').value=controller_id; + document.getElementById('uf_key_controller_id').value=controller_id; + document.getElementById('uf_base_uri').value=base_uri; + document.getElementById('uf_service_create_extension').value=service_create_extension; + document.getElementById('uf_service_delete_extension').value=service_delete_extension; + document.getElementById('uf_auth_username').value=auth_username; + document.getElementById('uf_auth_password').value=auth_password; + document.getElementById('uf_confirm_auth_password').value=auth_password; + + $('#update_owbc_properties').modal('show'); +} + +function deleteOwbcProperties(controller_id) { + + var url_string = encodeURI("/tunnel/deleteOwbcProperties?controller_id=" + controller_id ); + + bootbox.confirm({ + message: "Are you sure you want to delete OWBC Properties? " + controller_id, + callback: function(result) { + if ( result ) + { + location.assign(url_string); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/tunnel/partnerProperties.ejs b/admportal/views/tunnel/partnerProperties.ejs new file mode 100644 index 00000000..af51c864 --- /dev/null +++ b/admportal/views/tunnel/partnerProperties.ejs @@ -0,0 +1,184 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDNC-MLC AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#partner_properties').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>Partner Properties</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_partner_properties"> + Add Partner Properties + </button> + </div> + <% } %> + + <table id="partner_properties" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*Partner</th> + <th>*Username</th> + <th>*Password</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.partner %></td> + <td><%= row.auth_username %></td> + <td>*****</td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updatePartnerProperties('<%= row.partner %>','<%= row.auth_username %>','<%= row.auth_password %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deletePartnerProperties('<%= row.partner %>');">Delete</button> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<% include ../partials/partner_properties %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitPartnerProperties(form) +{ + var errorMsg=''; + var partner = ''; + var auth_username = ''; + var auth_password = ''; + var confirm_auth_password = ''; + + if ( form.name == 'addForm' ) + { + partner = form.nf_partner; + auth_username = form.nf_auth_username; + auth_password = form.nf_auth_password; + confirm_auth_password = form.nf_confirm_auth_password; + + if ( (partner.value == null) || (partner.value == "") || isblank(partner.value) ) + { + errorMsg += 'Partner is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + if ( auth_password.value != confirm_auth_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + else + { + partner = form.uf_partner; + auth_username = form.uf_auth_username; + auth_password = form.uf_auth_password; + confirm_auth_password = form.uf_confirm_auth_password; + if ( auth_password.value != confirm_auth_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + form.submit(); +} + +function updatePartnerProperties(partner,auth_username,auth_password) { + + document.getElementById('uf_partner').value=partner; + document.getElementById('uf_key_partner').value=partner; + document.getElementById('uf_auth_username').value=auth_username; + document.getElementById('uf_auth_password').value=auth_password; + document.getElementById('uf_confirm_auth_password').value=auth_password; + + $('#update_partner_properties').modal('show'); +} + +function deletePartnerProperties(partner) { + + var url_string = encodeURI("/tunnel/deletePartnerProperties?partner=" + partner); + + bootbox.confirm({ + message: "Are you sure you want to delete Partner Property [ " + partner + " ]", + callback: function(result) { + if ( result ) + { + location.assign(url_string); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/tunnel/roadmMapping.ejs b/admportal/views/tunnel/roadmMapping.ejs new file mode 100644 index 00000000..347cf03e --- /dev/null +++ b/admportal/views/tunnel/roadmMapping.ejs @@ -0,0 +1,230 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + +<meta charset="UTF-8" /> +<meta http-equiv="X-UA-Compatible" content="IE=edge"> +<% include ../partials/head %> +<% include ../partials/header %> +<script type="text/javascript" src="/javascripts/admportal.js" async></script> +<title>SDNC-MLC AdminPortal</title> + + +<script class="init"> + $(document).ready(function() { + $('#roadmMapping').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> +</head> + +<body> + +<div class="well well-sm"> +<h3>ROADM Mapping</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_roadm_mapping">Add Mapping</button> + </div> + <% } %> + + <table id="roadmMapping" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*Router Name</th> + <th>*ROADM Name</th> + <th>*CLLI</th> + <th>*City Name</th> + <th>*LAT</th> + <th>*LON</th> + <th>*SNRC</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.router_name %></td> + <td><%= row.roadm_name %></td> + <td><%= row.clli %></td> + <td><%= row.city_name %></td> + <td><%= row.lat %></td> + <td><%= row.lon %></td> + <td><%= row.snrc %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" onclick="updateRoadmMapping('<%= row.router_name %>', + '<%= row.roadm_name %>', '<%= row.clli %>', '<%= row.city_name %>', '<%= row.lat %>', '<%= row.lon %>', '<%= row.snrc %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" onclick="deleteRoadmMapping('<%= row.router_name %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/tunnel/uploadRoadmMapping" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <button type="button" class="btn btn-default" onclick="uploadFile(this.form);">Upload File</button> + </form> + </div> + <% } %> + +</div> + +<% include ../partials/roadm_mapping %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function saveRoadmMapping(form) +{ + var errorMsg=''; + var router_name = ''; + var roadm_name = ''; + var clli = ''; + var city_name = ''; + var lat = ''; + var lon = ''; + var snrc = ''; + + if ( form.name == 'addForm' ) + { + router_name = form.nf_router_name; + roadm_name = form.nf_roadm_name; + clli = form.nf_clli; + city_name = form.nf_city_name; + lat = form.nf_lat; + lon = form.nf_lon; + snrc = form.nf_snrc; + } + else + { + router_name = form.uf_router_name; + roadm_name = form.uf_roadm_name; + clli = form.uf_clli; + city_name = form.uf_city_name; + lat = form.uf_lat; + lon = form.uf_lon; + snrc = form.uf_snrc; + } + + if ( (router_name.value == null) || (router_name.value == "") || isblank(router_name.value) ) + { + errorMsg += 'Router Name is required.<br>'; + } + if ( (roadm_name.value == null) || (roadm_name.value == "") || isblank(roadm_name.value) ) + { + errorMsg += 'ROADM Name is required.<br>'; + } + if ( (clli.value == null) || (clli.value == "") || isblank(clli.value) ) + { + errorMsg += 'CLLI is required.<br>'; + } + if ( (city_name.value == null) || (city_name.value == "") || isblank(city_name.value) ) + { + errorMsg += 'City Name is required.<br>'; + } + if ( (lat.value == null) || (lat.value == "") || isblank(lat.value) ) + { + errorMsg += 'LAT (latitude) is required.<br>'; + } + if ( (lon.value == null) || (lon.value == "") || isblank(lon.value) ) + { + errorMsg += 'LON (longitude) is required.<br>'; + } + if ( (snrc.value == null) || (snrc.value == "") || isblank(snrc.value) ) + { + errorMsg += 'SNRC is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + form.submit(); +} + +function updateRoadmMapping(router_name,roadm_name,clli,city_name,lat,lon,snrc) { + + document.getElementById('uf_router_name').value=router_name; + document.getElementById('uf_roadm_name').value=roadm_name; + document.getElementById('uf_clli').value=clli; + document.getElementById('uf_city_name').value=city_name; + document.getElementById('uf_lat').value=lat; + document.getElementById('uf_lon').value=lon; + document.getElementById('uf_snrc').value=snrc; + document.getElementById('uf_key_router_name').value=router_name; + + $('#update_roadm_mapping').modal('show'); +} + +function deleteRoadmMapping(router_name) { + + var url_string = encodeURI("/tunnel/deleteRoadmMapping?router_name=" + router_name); + + bootbox.confirm({ + message: "Are you sure you want to delete this mapping? [" + router_name + "]", + callback: function(result) { + if ( result ) + { + location.assign(url_string); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/tunnel/routerMaster.ejs b/admportal/views/tunnel/routerMaster.ejs new file mode 100644 index 00000000..eada3f39 --- /dev/null +++ b/admportal/views/tunnel/routerMaster.ejs @@ -0,0 +1,167 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + +<meta charset="UTF-8" /> +<meta http-equiv="X-UA-Compatible" content="IE=edge"> +<% include ../partials/head %> +<% include ../partials/header %> +<script type="text/javascript" src="/javascripts/admportal.js" async></script> +<title>SDN-C AdminPortal</title> + + +<script class="init"> + $(document).ready(function() { + $('#routerMaster').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> +</head> + +<body> + +<div class="well well-sm"> +<h3>Router Master</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_router_master">Add Router</button> + </div> + <% } %> + + <table id="routerMaster" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*CRS Name</th> + <th>Loopback IP</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.crs_name %></td> + <td><%= row.loopback_ip %></td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" onclick="updateRouterMaster('<%= row.crs_name %>', + '<%= row.loopback_ip %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" onclick="deleteRouterMaster('<%= row.crs_name %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); %> + </tbody> + </table> +</div> + +<% include ../partials/router_master %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function saveRouterMaster(form) +{ + var errorMsg=''; + var crs_name = ''; + var loopback_ip = ''; + + if ( form.name == 'addForm' ) + { + crs_name = form.nf_crs_name; + loopback_ip = form.nf_loopback_ip; + } + else + { + crs_name = form.uf_crs_name; + loopback_ip = form.uf_loopback_ip; + } + + + if ( (crs_name.value == null) || (crs_name.value == "") || isblank(crs_name.value) ) + { + errorMsg += 'CRS Name is required.<br>'; + } + if ( (loopback_ip.value == null) || (loopback_ip.value == "") || isblank(loopback_ip.value) ) + { + errorMsg += 'Loopback IP is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + form.submit(); +} + +function updateRouterMaster(crs_name,loopback_ip) { + + document.getElementById('uf_crs_name').value=crs_name; + document.getElementById('uf_loopback_ip').value=loopback_ip; + document.getElementById('uf_key_crs_name').value=crs_name; + + $('#update_router_master').modal('show'); +} + +function deleteRouterMaster(crs_name) { + + var url_string = encodeURI("/tunnel/deleteRouterMaster?crs_name=" + crs_name); + + bootbox.confirm({ + message: "Are you sure you want to delete this Router [" + crs_name + "]", + callback: function(result) { + if ( result ) + { + location.assign(url_string); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/ucpe/altsCredentials.ejs b/admportal/views/ucpe/altsCredentials.ejs new file mode 100644 index 00000000..54ca0208 --- /dev/null +++ b/admportal/views/ucpe/altsCredentials.ejs @@ -0,0 +1,171 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#alts_credentials').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>ALTS Credentials</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_alts_credentials"> + Add ALTS Credentials + </button> + </div> + <% } %> + + <table id="alts_credentials" class="table table-hover table-condensed"> + <thead> + <tr> + <th>ALTS Username</th> + <th>ALTS Password</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.alts_username %></td> + <td>*****</td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateAltsCredentials('<%=row.alts_username %>','<%= row.alts_password %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteAltsCredentials('<%= row.alts_username %>', '<%= row.alts_password %>');">Delete</button> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<% include ../partials/alts_credentials %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitAltsCredentials(form) +{ + var errorMsg=''; + var alts_username = ''; + var alts_password = ''; + var confirm_alts_password = ''; + + if ( form.name == 'addForm' ) + { + alts_username = form.nf_alts_username; + alts_password = form.nf_alts_password; + confirm_alts_password = form.nf_confirm_alts_password; + + if ( alts_password.value != confirm_alts_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + else + { + alts_username = form.uf_alts_username; + alts_password = form.uf_alts_password; + confirm_alts_password = form.uf_confirm_alts_password; + + if ( alts_password.value != confirm_alts_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + form.submit(); +} + +function updateAltsCredentials(alts_username,alts_password) { + + document.getElementById('uf_alts_username').value=alts_username; + document.getElementById('uf_alts_password').value=alts_password; + + $('#update_alts_credentials').modal('show'); +} + +function deleteAltsCredentials(alts_username, alts_password) { + + var url_string = encodeURI("/ucpe/deleteAltsCredentials?alts_username=" + alts_username + + "&alts_password=" + alts_password); + + + bootbox.confirm({ + message: "Are you sure you want to delete ALTS Credentials? " + alts_username, + callback: function(result) { + if ( result ) + { + location.assign(url_string); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/ucpe/apiLogins.ejs b/admportal/views/ucpe/apiLogins.ejs new file mode 100644 index 00000000..ddb50c8b --- /dev/null +++ b/admportal/views/ucpe/apiLogins.ejs @@ -0,0 +1,93 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#api_logins').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> + +<body> + +<div class="well well-sm"> +<h3>uCPE API Logins</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="api_logins" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*CUSTOMER_NAME</th> + <th>PHS_NCS_USERNAME</th> + <th>NCS_PUBLIC_SSH_KEY</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.customer_name %></td> + <td><%= row.phs_ncs_username %></td> + <td><%= row.ncs_public_ssh_key %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/chainingTopologies.ejs b/admportal/views/ucpe/chainingTopologies.ejs new file mode 100644 index 00000000..2717062a --- /dev/null +++ b/admportal/views/ucpe/chainingTopologies.ejs @@ -0,0 +1,98 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#chaining_topologies').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE Chaining Topologies</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="chaining_topologies" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*TOPOLOGY_NAME</th> + <th>*START_VNF_TYPE</th> + <th>*SEQUENCE_NUMBER</th> + <th>START_SERVIVE_PORT_NAME</th> + <th>VNF_TYPE</th> + <th>SERVICE_PORT_NAME</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.topology_name %></td> + <td><%= row.start_vnf_type %></td> + <td><%= row.sequence_number %></td> + <td><%= row.start_service_port_name %></td> + <td><%= row.vnf_type %></td> + <td><%= row.service_port_name %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/customerNcsServers.ejs b/admportal/views/ucpe/customerNcsServers.ejs new file mode 100644 index 00000000..082384a8 --- /dev/null +++ b/admportal/views/ucpe/customerNcsServers.ejs @@ -0,0 +1,102 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#ncs_servers').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE Customer NCS Servers</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="ncs_servers" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*CUSTOMER_NAME</th> + <th>URL</th> + <th>NCS_SM_IP_ADDRESS</th> + <th>NCS_DM_V6_IP_ADDRESS</th> + <th>NCS_DM_V6_IP_NETWORK</th> + <th>DR_NCS_DM_V6_IP_NETWORK</th> + <th>NCS_DM_V4_IP_NETWORK</th> + <th>DR_NCS_DM_V4_IP_NETWORK</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.customer_name %></td> + <td><%= row.url %></td> + <td><%= row.ncs_sm_ip_address %></td> + <td><%= row.ncs_dm_v6_ip_address %></td> + <td><%= row.ncs_dm_v6_ip_network %></td> + <td><%= row.dr_ncs_dm_v6_ip_network %></td> + <td><%= row.ncs_dm_v4_ip_network %></td> + <td><%= row.dr_ncs_dm_v4_ip_network %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/mappedServicePort.ejs b/admportal/views/ucpe/mappedServicePort.ejs new file mode 100644 index 00000000..1c55eb5c --- /dev/null +++ b/admportal/views/ucpe/mappedServicePort.ejs @@ -0,0 +1,98 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#mapped_service_port').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE Mapped Service Port</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="mapped_service_port" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*DEVICE_VENDOR_NAME</th> + <th>*DEVICE_MODEL</th> + <th>*SERVICE_PORT_NAME</th> + <th>*VNF_VENDOR_NAME</th> + <th>*VNF_MODEL</th> + <th>*PORT_NAME</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.device_vendor_name %></td> + <td><%= row.device_model %></td> + <td><%= row.service_port_name %></td> + <td><%= row.vnf_vendor_name %></td> + <td><%= row.vnf_model %></td> + <td><%= row.port_name %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/mcapServers.ejs b/admportal/views/ucpe/mcapServers.ejs new file mode 100644 index 00000000..a51abd09 --- /dev/null +++ b/admportal/views/ucpe/mcapServers.ejs @@ -0,0 +1,92 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#mcap_servers').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE MCAP Servers</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="mcap_servers" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*CUSTOMER_NAME</th> + <th>*MCAP_IP_ADDRESS</th> + <th>*MCAP_POLLER_IP_ADDRESS</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.customer_name %></td> + <td><%= row.mcap_ip_address %></td> + <td><%= row.mcap_poller_ip_address %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/ncsCredentials.ejs b/admportal/views/ucpe/ncsCredentials.ejs new file mode 100644 index 00000000..f860b075 --- /dev/null +++ b/admportal/views/ucpe/ncsCredentials.ejs @@ -0,0 +1,180 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#ncs_server_credentials').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>NCS Server Credentials</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_ncs_credentials"> + Add NCS Credentials + </button> + </div> + <% } %> + + <table id="ncs_server_credentials" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*Customer Name</th> + <th>NCS Username</th> + <th>NCS Password</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.customer_name %></td> + <td><%= row.ncs_username %></td> + <td>*****</td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateNcsCredentials('<%= row.customer_name %>','<%= row.ncs_username %>','<%= row.ncs_password %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteNcsCredentials('<%= row.customer_name %>');">Delete</button> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<% include ../partials/ncs_credentials %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitNcsCredentials(form) +{ + var errorMsg=''; + var customer_name = ''; + var ncs_username = ''; + var ncs_password = ''; + var confirm_ncs_password = ''; + + if ( form.name == 'addForm' ) + { + customer_name = form.nf_customer_name; + ncs_username = form.nf_ncs_username; + ncs_password = form.nf_ncs_password; + confirm_ncs_password = form.nf_confirm_ncs_password; + + if ( (customer_name.value == null) || (customer_name.value == "") || isblank(customer_name.value) ) + { + errorMsg += 'Customer Name is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + if ( ncs_password.value != confirm_ncs_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + else + { + customer_name = form.uf_customer_name; + ncs_username = form.uf_ncs_username; + ncs_password = form.uf_ncs_password; + confirm_ncs_password = form.uf_confirm_ncs_password; + if ( ncs_password.value != confirm_ncs_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + form.submit(); +} + +function updateNcsCredentials(customer_name,ncs_username,ncs_password) { + + document.getElementById('uf_customer_name').value=customer_name; + document.getElementById('uf_ncs_username').value=ncs_username; + document.getElementById('uf_ncs_password').value=ncs_password; + + $('#update_ncs_credentials').modal('show'); +} + +function deleteNcsCredentials(customer_name) { + + bootbox.confirm({ + message: "Are you sure you want to delete NCS Credentials [ " + customer_name + " ]", + callback: function(result) { + if ( result ) + { + location.assign("/ucpe/deleteNcsCredentials?customer_name=" + customer_name); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/ucpe/nmInterfaces.ejs b/admportal/views/ucpe/nmInterfaces.ejs new file mode 100644 index 00000000..50b15c4b --- /dev/null +++ b/admportal/views/ucpe/nmInterfaces.ejs @@ -0,0 +1,96 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#nm_interfaces').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE NM Interfaces</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="nm_interfaces" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*DEVICE_VENDOR_NAME</th> + <th>*DEVICE_MODEL</th> + <th>NM_VLAN_NUMBER</th> + <th>DEVICE_MANAGER_NM_LAN_INTERFACE</th> + <th>SWITCH_MANAGER_NM_LAN_INTERFACE</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.device_vendor_name %></td> + <td><%= row.device_model %></td> + <td><%= row.nm_lan_vlan_number %></td> + <td><%= row.device_manager_nm_lan_interface %></td> + <td><%= row.switch_manager_nm_lan_interface %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/phsCredentials.ejs b/admportal/views/ucpe/phsCredentials.ejs new file mode 100644 index 00000000..508b5a25 --- /dev/null +++ b/admportal/views/ucpe/phsCredentials.ejs @@ -0,0 +1,202 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#phs_server_credentials').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>PHS Server Credentials</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_phs_credentials"> + Add PHS Credentials + </button> + </div> + <% } %> + + <table id="phs_server_credentials" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*Device Vendor Name</th> + <th>*Customer Name</th> + <th>*IP Addresses</th> + <th>PHS Username</th> + <th>PHS Password</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.device_vendor_name %></td> + <td><%= row.customer_name %></td> + <td><%= row.ip_addresses %></td> + <td><%= row.phs_username %></td> + <td>*****</td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updatePhsCredentials('<%=row.device_vendor_name %>','<%= row.customer_name %>','<%= row.ip_addresses %>','<%= row.phs_username %>','<%= row.phs_password %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deletePhsCredentials('<%= row.device_vendor_name %>', '<%= row.customer_name %>', '<%= row.ip_addresses %>' );">Delete</button> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<% include ../partials/phs_credentials %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitPhsCredentials(form) +{ + var errorMsg=''; + var device_vendor_name = ''; + var customer_name = ''; + var ip_addresses = ''; + var phs_username = ''; + var phs_password = ''; + var confirm_phs_password = ''; + + if ( form.name == 'addForm' ) + { + device_vendor_name = form.nf_device_vendor_name; + customer_name = form.nf_customer_name; + ip_addresses = form.nf_ip_addresses; + phs_username = form.nf_phs_username; + phs_password = form.nf_phs_password; + confirm_phs_password = form.nf_confirm_phs_password; + + if ( (device_vendor_name.value == null) || (device_vendor_name.value == "") || isblank(device_vendor_name.value) ) + { + errorMsg += 'Device Vendor Name is required.<br>'; + } + if ( (customer_name.value == null) || (customer_name.value == "") || isblank(customer_name.value) ) + { + errorMsg += 'Customer Name is required.<br>'; + } + if ( (ip_addresses.value == null) || (ip_addresses.value == "") || isblank(ip_addresses.value) ){ + errorMsg += 'IP Addresses is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + + if ( phs_password.value != confirm_phs_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + else + { + device_vendor_name = form.uf_device_vendor_name; + customer_name = form.uf_customer_name; + ip_addresses = form.uf_ip_addresses; + phs_username = form.uf_phs_username; + phs_password = form.uf_phs_password; + confirm_phs_password = form.uf_confirm_phs_password; + + if ( phs_password.value != confirm_phs_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + form.submit(); +} + +function updatePhsCredentials(device_vendor_name,customer_name,ip_addresses,phs_username,phs_password) { + + document.getElementById('uf_device_vendor_name').value=device_vendor_name; + document.getElementById('uf_customer_name').value=customer_name; + document.getElementById('uf_ip_addresses').value=ip_addresses; + document.getElementById('uf_phs_username').value=phs_username; + document.getElementById('uf_phs_password').value=phs_password; + + $('#update_phs_credentials').modal('show'); +} + +function deletePhsCredentials(device_vendor_name, customer_name, ip_addresses) { + + bootbox.confirm({ + message: "Are you sure you want to delete PHS Credentials " + device_vendor_name + "|" + customer_name + "|" + ip_addresses, + callback: function(result) { + if ( result ) + { + location.assign("/ucpe/deletePhsCredentials?device_vendor_name=" + device_vendor_name + + "&customer_name=" + customer_name + "&ip_addresses=" + ip_addresses); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/ucpe/phsServers.ejs b/admportal/views/ucpe/phsServers.ejs new file mode 100644 index 00000000..1f28dbb2 --- /dev/null +++ b/admportal/views/ucpe/phsServers.ejs @@ -0,0 +1,92 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#phs_servers').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE PHS Servers</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="phs_servers" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*DEVICE_VENDOR_NAME</th> + <th>*CUSTOMER_NAME</th> + <th>IP_ADDRESSES</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.device_vendor_name %></td> + <td><%= row.customer_name %></td> + <td><%= row.ip_addresses %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/physicalDeviceLogins.ejs b/admportal/views/ucpe/physicalDeviceLogins.ejs new file mode 100644 index 00000000..0dd78d41 --- /dev/null +++ b/admportal/views/ucpe/physicalDeviceLogins.ejs @@ -0,0 +1,98 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#device_logins').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE Physical Device Logins</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="device_logins" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*CUSTOMER_NAME</th> + <th>*DEVICE_VENDOR_NAME</th> + <th>*DEVICE_MODEL</th> + <th>*DEVICE_MANAGER_HASHED_PASSWORD</th> + <th>*SWITCH_MANAGER_HASHED_PASSWORD</th> + <th>*OS_HASHED_PASSWORD</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.customer_name %></td> + <td><%= row.device_vendor_name %></td> + <td><%= row.device_model %></td> + <td><%= row.device_manager_hashed_password %></td> + <td><%= row.switch_manager_hashed_password %></td> + <td><%= row.os_hashed_password %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/referenceData.ejs b/admportal/views/ucpe/referenceData.ejs new file mode 100644 index 00000000..6196c46e --- /dev/null +++ b/admportal/views/ucpe/referenceData.ejs @@ -0,0 +1,224 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#reference_data').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE Reference Data</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <table id="reference_data" class="table table-hover table-condensed"> + <thead> + <tr> + <th>REFERENCE_ID</th> + <th>STATUS</th> + <th>FILENAME</th> + <th>ATTUID</th> + <th>DATE</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% var i=0; retData.forEach( function(rowObj) { %> + <tr> + <td><%= rowObj.row.reference_id %></td> + <td><%= rowObj.row.status %></td> + <td> + <a data-toggle="collapse" + href="#collapseExample<%= i %>" aria-expanded="false" + aria-controls="collapseExample"><%= rowObj.row.filename %> + </a> + <div class="collapse" id="collapseExample<%= i %>"> + <div class="well"> + <pre><%= rowObj.filecontent %></pre> + </div> + </div> + </td> + <td><%= rowObj.row.attuid %></td> + <td><%= rowObj.row.ts %></td> + <% if(priv == 'A' ) { %> + <td> + <% if ( rowObj.row.status == 'pending' ) { %> + <button type="button" class="btn btn-default btn-xs" + onclick="importReferenceData('<%= rowObj.row.reference_id %>','<%= rowObj.row.status %>','<%= rowObj.row.filename %>','<%= rowObj.row.ts %>');">Import</button> + <% } %> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteReferenceData('<%= rowObj.row.reference_id %>','<%= rowObj.row.filename %>');">Delete</button> + </td> + <% } %> + </tr> + <% i++; }); %> + </tbody> + </table> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:0px 25px;"> + <form method="POST" action="/ucpe/uploadReferenceData" enctype="multipart/form-data"> + <div class="form-group"> + <label for="dest">File input</label> + <input name="filename" type="file" id="dest"> + <p class="help-block">Choose a file to upload.</p> + </div> + <button type="button" class="btn btn-default" + onclick="uploadFile(this.form);">Upload File</button> + </form> + </div> + <% } %> +</div> + +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> + +function getVnfData(vnf_name,vnf_type,svc_request_id) +{ + location.assign("/mobility/viewVnfData?vnf_name=" + vnf_name + "&vnf_type=" + vnf_type ); + return; +} +function importReferenceData(reference_id,status,filename,ts) +{ + var alertMessage = ''; + if ( status != 'pending' ) + { + bootbox.alert("Upload Status must be in 'pending' state."); + return; + } + if ( filename.substring(0,11) == 'ucpedevice_' ){ + alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_MAPPED_SERVICE_PORT and UCPE_SERVICE_PORT tables?"; + }else if ( filename.substring(0,14) == 'ucpeapilogins_' ){ + alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_VNF_LOGINS, UCPE_PHYSICAL_DEVICE_LOGINS and UCPE_API_LOGINS tables?"; + }else if ( filename.substring(0,17) == 'ucpenminterfaces_' ){ + alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_VNF_NM_INTERFACES and UCPE_NM_INTERFACES tables?"; + }else if ( filename.substring(0,15) == 'ucpephsservers_' ){ + alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_PHS_SERVERS table?"; + }else if ( filename.substring(0,15) == 'ucpencsservers_' ){ + alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_CUSTOMER_NCS_SERVERS table?"; + }else if ( filename.substring(0,15) == 'ucpevnfcatalog_' ){ + alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_VNF_MODELS, UCPE_VNF_MODEL_SOFTWARE and UCPE_VNF_MODEL_FEATURES tables?"; + }else if ( filename.substring(0,16) == 'ucpemcapservers_' ){ + alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_MCAP_SERVERS table?"; + }else if ( filename.substring(0,23) == 'ucpechainingtopologies_' ){ + alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_CHAINING_TOPOLOGIES table?"; + }else if ( filename.substring(0,16) == 'ucpevnfportinfo_' ){ + alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_VNF_PORT and UCPE_MAP_TO_DEVICE tables?"; + } else { + bootbox.alert('Invalid Filename in database: ' + filename); + return; + } + bootbox.confirm({ + message: alertMessage, + callback: function(result) { + if ( result ) + { + if ( filename.substring(0,11) == 'ucpedevice_' ){ + location.assign("/ucpe/importUcpeDevices?id=" + reference_id + "&filename=" + filename + "&status=" + status); + }else if ( filename.substring(0,14) == 'ucpeapilogins_' ){ + location.assign("/ucpe/importApiLogins?id=" + reference_id + "&filename=" + filename + "&status=" + status); + }else if ( filename.substring(0,17) == 'ucpenminterfaces_' ){ + location.assign("/ucpe/importNmInterfaces?id=" + reference_id + "&filename=" + filename + "&status=" + status); + }else if ( filename.substring(0,15) == 'ucpephsservers_' ){ + location.assign("/ucpe/importPhsServers?id=" + reference_id + "&filename=" + filename + "&status=" + status); + }else if ( filename.substring(0,15) == 'ucpencsservers_' ){ + location.assign("/ucpe/importNcsServers?id=" + reference_id + "&filename=" + filename + "&status=" + status); + }else if ( filename.substring(0,15) == 'ucpevnfcatalog_' ){ + location.assign("/ucpe/importVnfCatalog?id=" + reference_id + "&filename=" + filename + "&status=" + status); + }else if ( filename.substring(0,16) == 'ucpemcapservers_' ){ + location.assign("/ucpe/importMcapServers?id=" + reference_id + "&filename=" + filename + "&status=" + status); + }else if ( filename.substring(0,23) == 'ucpechainingtopologies_' ){ + location.assign("/ucpe/importChainTopo?id=" + reference_id + "&filename=" + filename + "&status=" + status); + }else if ( filename.substring(0,16) == 'ucpevnfportinfo_' ){ + location.assign("/ucpe/importVnfPortInfo?id=" + reference_id + "&filename=" + filename + "&status=" + status); + } else { + bootbox.alert('Invalid Filename: ' + filename); + return; + } + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +function deleteReferenceData(reference_id,filename) +{ + + bootbox.confirm({ + message: "Are you sure you want to delete uploaded file [" + filename + "]? (This action will not effect the database.)", + callback: function(result) { + if ( result ) + { + location.assign("/ucpe/deleteReferenceData?id=" + reference_id + "&filename=" + filename); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/ucpe/serviceManagerCredentials.ejs b/admportal/views/ucpe/serviceManagerCredentials.ejs new file mode 100644 index 00000000..9e156f2a --- /dev/null +++ b/admportal/views/ucpe/serviceManagerCredentials.ejs @@ -0,0 +1,171 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#service_manager_credentials').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>Service Manager Credentials</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <% if(priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_service_manager_credentials"> + Add Service Manager Credentials + </button> + </div> + <% } %> + + <table id="service_manager_credentials" class="table table-hover table-condensed"> + <thead> + <tr> + <th>Service Manager Username</th> + <th>Service Manager Password</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.service_manager_username %></td> + <td>*****</td> + <% if(priv == 'A') { %> + <td> + <button type="button" class="btn btn-default btn-xs" + onclick="updateServiceManagerCredentials('<%=row.service_manager_username %>','<%= row.service_manager_password %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteServiceManagerCredentials('<%= row.service_manager_username %>', '<%= row.service_manager_password %>');">Delete</button> + </td> + <% } %> + + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<% include ../partials/service_manager_credentials %> +<footer> + <% include ../partials/footer %> +</footer> + +<script type="text/javascript"> +function submitServiceManagerCredentials(form) +{ + var errorMsg=''; + var service_manager_username = ''; + var service_manager_password = ''; + var confirm_service_manager_password = ''; + + if ( form.name == 'addForm' ) + { + service_manager_username = form.nf_service_manager_username; + service_manager_password = form.nf_service_manager_password; + confirm_service_manager_password = form.nf_confirm_service_manager_password; + + if ( service_manager_password.value != confirm_service_manager_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + else + { + service_manager_username = form.uf_service_manager_username; + service_manager_password = form.uf_service_manager_password; + confirm_service_manager_password = form.uf_confirm_service_manager_password; + + if ( service_manager_password.value != confirm_service_manager_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + form.submit(); +} + +function updateServiceManagerCredentials(service_manager_username,service_manager_password) { + + document.getElementById('uf_service_manager_username').value=service_manager_username; + document.getElementById('uf_service_manager_password').value=service_manager_password; + + $('#update_service_manager_credentials').modal('show'); +} + +function deleteServiceManagerCredentials(service_manager_username, service_manager_password) { + + var url_string = encodeURI("/ucpe/deleteServiceManagerCredentials?service_manager_username=" + service_manager_username + + "&service_manager_password=" + service_manager_password); + + + bootbox.confirm({ + message: "Are you sure you want to delete Service Manager Credentials? " + service_manager_username, + callback: function(result) { + if ( result ) + { + location.assign(url_string); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} + +</script> + +</body> +</html> + diff --git a/admportal/views/ucpe/servicePort.ejs b/admportal/views/ucpe/servicePort.ejs new file mode 100644 index 00000000..80537133 --- /dev/null +++ b/admportal/views/ucpe/servicePort.ejs @@ -0,0 +1,88 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#service_port').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE Service Port</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + + <table id="service_port" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*DEVICE_VENDOR_NAME</th> + <th>*DEVICE_MODEL</th> + <th>*SERVICE_PORT_NAME</th> + <th>PHYSICAL_PORT_NAME</th> + <th>PHYSICAL_SPEED</th> + <th>PHYSICAL_SPEED_UNITS</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.device_vendor_name %></td> + <td><%= row.device_model %></td> + <td><%= row.service_port_name %></td> + <td><%= row.physical_port_name %></td> + <td><%= row.physical_speed %></td> + <td><%= row.physical_speed_units %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/vnfLogins.ejs b/admportal/views/ucpe/vnfLogins.ejs new file mode 100644 index 00000000..f5e88731 --- /dev/null +++ b/admportal/views/ucpe/vnfLogins.ejs @@ -0,0 +1,94 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vnf_logins').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE VNF Logins</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="vnf_logins" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*CUSTOMER_NAME</th> + <th>*VNF_VENDOR_NAME</th> + <th>*VNF_MODEL</th> + <th>HASHED_PASSWORD</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.customer_name %></td> + <td><%= row.vnf_vendor_name %></td> + <td><%= row.vnf_model %></td> + <td><%= row.hashed_password %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/vnfMapDevice.ejs b/admportal/views/ucpe/vnfMapDevice.ejs new file mode 100644 index 00000000..fbfa2ba5 --- /dev/null +++ b/admportal/views/ucpe/vnfMapDevice.ejs @@ -0,0 +1,98 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vnf_map_to_device').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE VNF Map to Device</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="vnf_map_to_device" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*VNF_VENDOR_NAME</th> + <th>*VNF_MODEL</th> + <th>*SERVICE_PORT_NAME</th> + <th>*DEVICE_VENDOR_NAME</th> + <th>*DEVICE_MODEL</th> + <th>*MAPPED_SERVICE_PORT_NAME</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.vnf_vendor_name %></td> + <td><%= row.vnf_model %></td> + <td><%= row.service_port_name %></td> + <td><%= row.device_vendor_name %></td> + <td><%= row.device_model %></td> + <td><%= row.mapped_service_port_name %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/vnfModelFeatures.ejs b/admportal/views/ucpe/vnfModelFeatures.ejs new file mode 100644 index 00000000..40151790 --- /dev/null +++ b/admportal/views/ucpe/vnfModelFeatures.ejs @@ -0,0 +1,90 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vnf_model_features').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE VNF Model Features</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="vnf_model_features" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*ATT PART NUMBER</th> + <th>*VNF_FEATURE</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.att_part_number %></td> + <td><%= row.vnf_feature %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/vnfModelSoftware.ejs b/admportal/views/ucpe/vnfModelSoftware.ejs new file mode 100644 index 00000000..f82b5b8a --- /dev/null +++ b/admportal/views/ucpe/vnfModelSoftware.ejs @@ -0,0 +1,98 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vnf_model_software').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE VNF Model Software</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="vnf_model_software" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*ATT PART NUMBER</th> + <th>*SOFTWARE_VERSION</th> + <th>SOFTWARE_VERSION_STATE</th> + <th>SOFTWARE_FILENAME</th> + <th>SOFTWARE_FILETYPE</th> + <th>FILE_MD5_VALUE</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.att_part_number %></td> + <td><%= row.software_version %></td> + <td><%= row.software_version_state %></td> + <td><%= row.software_filename %></td> + <td><%= row.software_filetype %></td> + <td><%= row.file_md5_value %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/vnfModels.ejs b/admportal/views/ucpe/vnfModels.ejs new file mode 100644 index 00000000..df71306b --- /dev/null +++ b/admportal/views/ucpe/vnfModels.ejs @@ -0,0 +1,122 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vnf_models').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE VNF Models</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="vnf_models" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*ATT PART NUMBER</th> + <th>VNF_TYPE</th> + <th>VENDOR_NAME</th> + <th>VENDOR_PART_NUMBER</th> + <th>VENDOR_MODEL</th> + <th>VCPU_DEFAULT</th> + <th>VCPU_MIN</th> + <th>VCPU_MAX</th> + <th>VMEMORY_DEFAULT</th> + <th>VMEMORY_UNITS</th> + <th>VMEMORY_MIN</th> + <th>VMEMORY_MAX</th> + <th>VDISK_DEFAULT</th> + <th>VDISK_UNITS</th> + <th>VDISK_MIN</th> + <th>VDISK_MAX</th> + <th>SPEED_UNITS</th> + <th>SPEED</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.att_part_number %></td> + <td><%= row.vnf_type %></td> + <td><%= row.vendor_name %></td> + <td><%= row.vendor_part_number %></td> + <td><%= row.vendor_model %></td> + <td><%= row.vcpu_default %></td> + <td><%= row.vcpu_min %></td> + <td><%= row.vcpu_max %></td> + <td><%= row.vmemory_default %></td> + <td><%= row.vmemory_units %></td> + <td><%= row.vmemory_min %></td> + <td><%= row.vmemory_max %></td> + <td><%= row.vdisk_default %></td> + <td><%= row.vdisk_units %></td> + <td><%= row.vdisk_min %></td> + <td><%= row.vdisk_max %></td> + <td><%= row.speed_units %></td> + <td><%= row.speed %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/vnfNmInterfaces.ejs b/admportal/views/ucpe/vnfNmInterfaces.ejs new file mode 100644 index 00000000..3430f6b0 --- /dev/null +++ b/admportal/views/ucpe/vnfNmInterfaces.ejs @@ -0,0 +1,98 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vnf_nm_interfaces').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE VNF NM Interfaces</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="vnf_nm_interfaces" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*DEVICE_VENDOR_NAME</th> + <th>*DEVICE_MODEL</th> + <th>*VNF_VENDOR_NAME</th> + <th>*VNF_MODEL</th> + <th>NM_LAN_INTERFACE</th> + <th>NM_LOOPBACK_INTERFACE</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.device_vendor_name %></td> + <td><%= row.device_model %></td> + <td><%= row.vnf_vendor_name %></td> + <td><%= row.vnf_model %></td> + <td><%= row.nm_lan_interface %></td> + <td><%= row.nm_loopback_interface %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/ucpe/vnfPorts.ejs b/admportal/views/ucpe/vnfPorts.ejs new file mode 100644 index 00000000..834eada9 --- /dev/null +++ b/admportal/views/ucpe/vnfPorts.ejs @@ -0,0 +1,94 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>SDN-C AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#vnf_ports').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> +<body> + +<div class="well well-sm"> +<h3>uCPE VNF Ports</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } else { %> + <div class='alert alert-danger' role='danger'> + <% + for ( x in result.msg ){ %> + <div><%= result.msg[x] %></div> + <% } %> + </div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + +<!-- + <% if (priv == 'A'){ %> + <div class="actions" style="padding:15px 0px;"> + <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile"> + Add VNF Profile + </button> + </div> + <% } %> +--> + + <table id="vnf_ports" class="table table-hover table-condensed"> + <thead> + <tr> + <th>*VNF_VENDOR_NAME</th> + <th>*VNF_MODEL</th> + <th>*SERVICE_PORT_NAME</th> + <th>PHYSICAL_PORT_NAME</th> + </tr> + </thead> + <tbody> + <% rows.forEach( function(row) { %> + <tr> + <td><%= row.vnf_vendor_name %></td> + <td><%= row.vnf_model %></td> + <td><%= row.service_port_name %></td> + <td><%= row.physical_port_name %></td> + </tr> + <% }); %> + </tbody> + </table> + +</div> + +<footer> + <% include ../partials/footer %> +</footer> + + +</body> +</html> + diff --git a/admportal/views/user/list.ejs b/admportal/views/user/list.ejs new file mode 100644 index 00000000..4a4e909c --- /dev/null +++ b/admportal/views/user/list.ejs @@ -0,0 +1,194 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <% include ../partials/head %> + <% include ../partials/header %> + <script type="text/javascript" src="/javascripts/admportal.js" async></script> + <title>AdminPortal</title> +<script class="init"> + $(document).ready(function() { + $('#user_admin').DataTable( { + "order": [[ 0, "asc" ]] + } ); +} ); +</script> + +</head> + +<body> + +<div class="well well-sm"> +<h3>User Administration</h3> +</div> + +<% if ( typeof result != 'undefined' ) { + if (result.code.length > 0) { + if ( result.code == 'success' ) { %> + <div class='alert alert-success' role='alert'><%=result.msg %></div> + <% } else { %> + <div class='alert alert-danger' role='danger'><%=result.msg %></div> + <% } %> + <% } %> +<% } %> + +<% if( typeof privilege != 'undefined'){ + var priv = privilege.privilege; +} else { + var priv = 'A'; +} %> + + +<div class="container-fluid"> + <div class="actions" style="padding:15px 0px;"> + <% if(priv == 'A') { %> + <button class="btn btn-primary" data-toggle="modal" data-target="#newUserModal">Add User</button> + <% } %> + + </div> + <div class="content"> + <table id="user_admin" class="table table-hover table-condensed"> + <thead> + <tr> + <th>Email</th> + <th>Password</th> + <th>Privilege</th> + <% if(priv == 'A'){ %> + <th>Action</th> + <% } %> + </tr> + </thead> + <tbody> + <% if (rows) { + rows.forEach(function(row) { %> + <tr> + <td><%= row.email %></td> + <td>**********</td> + <td> + <% if(row.privilege == 'A'){ %> + Administrator + <% } else if (row.privilege == 'R') { %> + Readonly + <% } else { %> + unknown + <% } %> + </td> + <% if(priv == 'A') { %> + <td><form name="rowform"> + <input type="hidden" name="rfemail" id="rfemail" value="<%= row.email %>"</input> + </form> + <button type="button" class="btn btn-default btn-xs" + onclick="updateRequest('<%=row.email %>', '<%=row.password %>', '<%=row.privilege %>');">Update</button> + <button type="button" class="btn btn-default btn-xs" + onclick="deleteRequest('<%=row.email %>');">Delete</button> + </td> + <% } %> + </tr> + <% }); }; %> + </tbody> + </table> + </div> + + <% include ../partials/newuserform %> + <% include ../partials/userform %> + + <footer> + <% include ../partials/footer %> + </footer> + +<script type="text/javascript"> + +function submitUserAdmin(form) +{ + var errorMsg=''; + var email = ''; + var password = ''; + var confirm_password = ''; + var privilege = ''; + + if ( form.name == 'addForm' ) + { + email = form.nf_email; + password = form.nf_password; + confirm_password = form.nf_confirm_password; + privilege = form.nf_privilege; + + if ( (email.value == null) || (email.value == "") || isblank(email.value) ) + { + errorMsg += 'Email is required.<br>'; + } + if( errorMsg.length > 0 ) { + bootbox.alert(errorMsg); + return; + } + + if ( password.value != confirm_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + else + { + email = form.uf_email; + password = form.uf_password; + confirm_password = form.uf_confirm_password; + privilege = form.uf_privilege; + + if ( (email.value == null) || (email.value == "") || isblank(email.value) ) + { + errorMsg += 'Email is required.<br>'; + } + if ( password.value != confirm_password.value ) + { + bootbox.alert('Passwords do not match.'); + return; + } + } + form.submit(); +} + +function deleteRequest(email) { + + bootbox.confirm({ + message: "Are you sure you want to delete user [" + email + "] ?", + callback: function(result) { + if ( result ) + { + location.assign("/user/deleteUser?email=" + email); + } + return; + }, + buttons: { + cancel: { + label: "Cancel" + }, + confirm: { + label: "Yes" + } + } + }); +} +function updateRequest(email,password,privilege) { + + document.getElementById('uf_email').value = email; + document.getElementById('uf_key_email').value = email; + document.getElementById('uf_password').value = password; + document.getElementById('uf_confirm_password').value = password; + if ( privilege == "A" ){ + document.getElementById('uf_privilege').value = 'admin'; + }else if (priv == "R"){ + document.getElementById('uf_privilege').value = 'readonly'; + }else{ + document.getElementById('uf_privilege').value = 'admin'; + } + document.getElementById('uf_action').value = "/user/updateUser"; + $('#myUserModal').modal('show'); + +} +</script> + +</body> +</html> + |