diff options
author | DushyantSinghThakur <dt00503496@techmahindra.com> | 2018-09-06 12:46:04 +0530 |
---|---|---|
committer | Dan Timoney <dt5972@att.com> | 2018-09-12 13:10:46 +0000 |
commit | 43d4b00848ebd0567b020fe219f07d4f7049ff0b (patch) | |
tree | f5c09d0006348c82a94693605349e79db4889b71 /configbackuprestore/vnfconfigbackupservice | |
parent | 4e2db0d6e56bc19425e6afa3efc7011820942e9e (diff) |
Epic-231:versioning, and backup the configuration
Merging the sdnc jira stories- 255,256
Change-Id: Iacb9274dae93f534f1331c4eb7d0669896d379d4
Issue-ID: SDNC-256
Signed-off-by: DushyantSinghThakur <dt00503496@techmahindra.com>
Former-commit-id: 94d8b3d82b82dedfd5949da2e5d1ed348ab066e2
Diffstat (limited to 'configbackuprestore/vnfconfigbackupservice')
113 files changed, 9735 insertions, 0 deletions
diff --git a/configbackuprestore/vnfconfigbackupservice/pom.xml b/configbackuprestore/vnfconfigbackupservice/pom.xml new file mode 100644 index 00000000..bf6fdf0e --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/pom.xml @@ -0,0 +1,137 @@ +<?xml version="1.0"?> +<project + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" + xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>configbackuprestore</artifactId> + <version>1.0-SNAPSHOT</version> + </parent> + + <groupId>com.onap.sdnc.vnfbackupservice</groupId> + <artifactId>vnfconfigbackupservice</artifactId> + <version>1.0-SNAPSHOT</version> + <name>vnfconfigbackupservice</name> + <url>http://maven.apache.org</url> + + <dependencies> + + <dependency> + <groupId>org.jmockit</groupId> + <artifactId>jmockit</artifactId> + <version>1.19</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.jmockit</groupId> + <artifactId>jmockit-coverage</artifactId> + <version>1.19</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.9</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>jstl</artifactId> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>org.mariadb.jdbc</groupId> + <artifactId>mariadb-java-client</artifactId> + <version>1.1.9</version> + </dependency> + + <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --> + <dependency> + <groupId>commons-codec</groupId> + <artifactId>commons-codec</artifactId> + <version>1.9</version> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + <version>1.5.4.RELEASE</version> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + <version>4.3.9.RELEASE</version> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-tomcat</artifactId> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>org.apache.tomcat.embed</groupId> + <artifactId>tomcat-embed-jasper</artifactId> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-devtools</artifactId> + <optional>true</optional> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + <version>1.5.3.RELEASE</version> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> + </dependency> + + <!-- Add Log4j2 Dependency --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-log4j2</artifactId> + </dependency> + + <dependency> + <groupId>org.json</groupId> + <artifactId>json</artifactId> + <version>20180130</version> + </dependency> + + <!-- https://mvnrepository.com/artifact/com.fasterxml/jackson-xml-databind --> + <dependency> + <groupId>com.fasterxml</groupId> + <artifactId>jackson-xml-databind</artifactId> + <version>0.6.2</version> + </dependency> + + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>2.21.0</version> + <configuration> + <argLine>-XX:+StartAttachListener</argLine> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/configbackuprestore/vnfconfigbackupservice/read.md b/configbackuprestore/vnfconfigbackupservice/read.md new file mode 100644 index 00000000..1ac32802 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/read.md @@ -0,0 +1,13 @@ +vnfconfigbackupservice + +--------------------- + +Need to change in application.properties: + - Update properties file based on the Database. + e.g-spring.datasource.url=jdbc:mariadb://localhost:3306/DBNAME + - Need to change Rest-conf values: + eg.sdnc.rest.vnf.api.host=10.53.172.121 + sdnc.rest.vnf.api.port=8282 + sdnc.rest.vnf.api.basepath=/restconf + sdnc.rest.vnf.api.username=xxxx + sdnc.rest.vnf.api.password=xxxx
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/config/ApplicationConfiguration.java b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/config/ApplicationConfiguration.java new file mode 100644 index 00000000..03d65a68 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/config/ApplicationConfiguration.java @@ -0,0 +1,49 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.config; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.web.client.RestTemplate; + +@SpringBootApplication +@EnableJpaRepositories("com.onap.sdnc.*") +@EntityScan("com.onap.sdnc.*") +@ComponentScan({"com.onap.sdnc.*"}) +@EnableAutoConfiguration +public class ApplicationConfiguration { + private static final Logger logger = LogManager.getLogger(ApplicationConfiguration.class); + public static void main(String[] args) { + + SpringApplication.run(ApplicationConfiguration.class, args); + logger.info("SDNC REPORTS API Has Started.."); + } + @Bean + public RestTemplate template() { + return new RestTemplate(); + } +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/config/ServletInitializer.java b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/config/ServletInitializer.java new file mode 100644 index 00000000..5267262f --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/config/ServletInitializer.java @@ -0,0 +1,32 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.config; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(ApplicationConfiguration.class); + } + +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/controller/VnfBackupServiceController.java b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/controller/VnfBackupServiceController.java new file mode 100644 index 00000000..a04aac7f --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/controller/VnfBackupServiceController.java @@ -0,0 +1,74 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import com.onap.sdnc.vnfbackupservice.model.VnfServiceResponse; +import com.onap.sdnc.vnfbackupservice.scheduler.VnfConfigBackupScheduler; +import com.onap.sdnc.vnfbackupservice.service.VnfbackupService; + +@RestController +public class VnfBackupServiceController { + + @Autowired + VnfbackupService vnfbackupService; + + @Autowired + VnfConfigBackupScheduler vnfConfigBackupScheduler; + + @RequestMapping("/") + ModelAndView home(ModelAndView modelAndView) { + modelAndView.setViewName("index"); + return modelAndView; + } + + @RequestMapping(value="/getAllVnfIds", method=RequestMethod.GET,produces="application/json") + public VnfServiceResponse getAllVnfIds() { + return vnfbackupService.getAllVnfDetails(); + } + + @RequestMapping(value="/backupVnfconfigById/{vnfId}", method=RequestMethod.GET) + public String getAllVnfIds(@PathVariable("vnfId") String vnfId) { + return vnfbackupService.backupVnfconfig(vnfId); + } + + @RequestMapping(value="/vnf-list/{vnf-Id}", method=RequestMethod.PUT) + public String putOneVnfconfig(@RequestBody String configfile, @PathVariable("vnf-Id") String vnfId) { + String vnfconfigupdated = vnfbackupService.putVnfconfig(configfile,vnfId); + return vnfconfigupdated; + } + + @RequestMapping(value="/backup", method=RequestMethod.GET, produces="application/text") + public String backupVnfConfigs() { + return "current time: " + vnfConfigBackupScheduler.initiateBackupService() ; + } + + @RequestMapping(value="/backuptime", method=RequestMethod.GET, produces="application/text") + public String lastUpdatedBackuptime() { + return vnfbackupService.updatedBackuptime(); + } +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/dao/VnfBackupServiceRepo.java b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/dao/VnfBackupServiceRepo.java new file mode 100644 index 00000000..7a132338 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/dao/VnfBackupServiceRepo.java @@ -0,0 +1,68 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.dao; + +import java.sql.Timestamp; +import java.util.List; + +import javax.transaction.Transactional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + + +import com.onap.sdnc.vnfbackupservice.model.VnfConfigDetailsDB; + +@Repository +public interface VnfBackupServiceRepo extends JpaRepository<VnfConfigDetailsDB, Long> { + + @Query(value = "Select * from vnfconfigdetails where vnfid = :vnfid", nativeQuery = true) + List<VnfConfigDetailsDB> getVnfDetails(@Param("vnfid") String vnfid); + + @Query(value = "Select * from vnfconfigdetails where vnfid = :vnfid ORDER BY vnfversion DESC LIMIT 1", nativeQuery = true) + VnfConfigDetailsDB getVnfDetail(@Param("vnfid") String vnfid); + + @Modifying + @Query(value = "insert into vnfconfigdetails (configinfo,creationdate,lastupdated,status,vnfid,vnfname,vnfversion) VALUES (:configinfo,:creationdate,:lastupdated,:status,:vnfid,:vnfname,:vnfversion)", nativeQuery = true) + @Transactional + void saveVnfDetails(@Param("configinfo") String configinfo, @Param("creationdate") Timestamp creationDate, + @Param("lastupdated") Timestamp lastupdated, @Param("status") int status, @Param("vnfid") String vnfid, + @Param("vnfname") String vnfname,@Param("vnfversion") String vnfversion); + + @Query(value = "Select configinfo && vnfversion from vnfconfigdetails where vnfid = :vnfid", nativeQuery = true) + List<VnfConfigDetailsDB> getVnfDetailhavingAllVersion(@Param("vnfid") String vnfid); + + @Query(value = "Select backuptime from vnfschedulertime where id=1", nativeQuery = true) + String getvnfschedulertime(); + + @Modifying + @Query(value = "insert into vnfschedulertime(id, backuptime) VALUES (:id, :backuptime)", nativeQuery = true) + @Transactional + void insertSchedulerTime(@Param("id") int id, @Param("backuptime") String backuptime); + + @Modifying + @Query(value = "UPDATE vnfschedulertime SET backuptime =:formatDateTime WHERE id = 1", nativeQuery = true) + @Transactional + void updateSchedulerTime(@Param("formatDateTime") String formatDateTime); + +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/model/VnfConfigDetailsDB.java b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/model/VnfConfigDetailsDB.java new file mode 100644 index 00000000..5ac86b3d --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/model/VnfConfigDetailsDB.java @@ -0,0 +1,137 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.model; + +import java.io.Serializable; +import java.sql.Timestamp; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.Table; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@Entity +@Table(name = "vnfconfigdetails", schema = "testreports") +@JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, + allowGetters = true) +public class VnfConfigDetailsDB implements Serializable{ + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column(name = "vnfid") + private String vnfid; + + @Column(name = "vnfversion") + private String vnfversion; + + @Column(name = "vnfname") + private String vnfname; + + @Column(name = "configinfo") + @Lob + private String configinfo; + + @Column(nullable = false, updatable = false,columnDefinition="DATETIME") + @CreatedDate + private Timestamp creationdate; + + @Column(nullable = false,columnDefinition="DATETIME") + @LastModifiedDate + private Timestamp lastupdated; + + @Column(name = "status") + private int status; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getVnfid() { + return vnfid; + } + + public void setVnfid(String vnfid) { + this.vnfid = vnfid; + } + + public String getVnfversion() { + return vnfversion; + } + + public void setVnfversion(String vnfversion) { + this.vnfversion = vnfversion; + } + + public String getVnfname() { + return vnfname; + } + + public void setVnfname(String vnfname) { + this.vnfname = vnfname; + } + + public String getConfiginfo() { + return configinfo; + } + + public void setConfiginfo(String configinfo) { + this.configinfo = configinfo; + } + + public Timestamp getCreationdate() { + return creationdate; + } + + public void setCreationdate(Timestamp creationdate) { + this.creationdate = creationdate; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public Timestamp getLastupdated() { + return lastupdated; + } + + public void setLastupdated(Timestamp lastupdated) { + this.lastupdated = lastupdated; + } + +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/model/VnfConfigSchedulerTimeStamp.java b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/model/VnfConfigSchedulerTimeStamp.java new file mode 100644 index 00000000..a5293265 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/model/VnfConfigSchedulerTimeStamp.java @@ -0,0 +1,55 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "vnfschedulertime", schema = "testreports") +public class VnfConfigSchedulerTimeStamp { + + @Id + @GeneratedValue + private int id; + + @Column(name = "backuptime") + private String backuptime; + + public String getBackuptime() { + return backuptime; + } + + public void setBackuptime(String backuptime) { + this.backuptime = backuptime; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/model/VnfDisplayParams.java b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/model/VnfDisplayParams.java new file mode 100644 index 00000000..9f0753bf --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/model/VnfDisplayParams.java @@ -0,0 +1,39 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.model; + +public class VnfDisplayParams { + + private String vnfName; + private String vnfId; + + public String getVnfName() { + return vnfName; + } + public void setVnfName(String vnfName) { + this.vnfName = vnfName; + } + public String getVnfId() { + return vnfId; + } + public void setVnfId(String vnfId) { + this.vnfId = vnfId; + } +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/model/VnfServiceResponse.java b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/model/VnfServiceResponse.java new file mode 100644 index 00000000..e9c311fb --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/model/VnfServiceResponse.java @@ -0,0 +1,36 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.model; + +import java.util.ArrayList; +import java.util.List; + +public class VnfServiceResponse { + + private List<VnfDisplayParams> vnfDisplayList = new ArrayList<VnfDisplayParams>(); + + public List<VnfDisplayParams> getVnfDisplayList() { + return vnfDisplayList; + } + + public void setVnfDisplayList(List<VnfDisplayParams> vnfDisplayList) { + this.vnfDisplayList = vnfDisplayList; + } +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/scheduler/VnfConfigBackupScheduler.java b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/scheduler/VnfConfigBackupScheduler.java new file mode 100644 index 00000000..13363300 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/scheduler/VnfConfigBackupScheduler.java @@ -0,0 +1,82 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.scheduler; + +import java.util.List; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import com.onap.sdnc.vnfbackupservice.dao.VnfBackupServiceRepo; +import com.onap.sdnc.vnfbackupservice.model.VnfDisplayParams; +import com.onap.sdnc.vnfbackupservice.model.VnfServiceResponse; +import com.onap.sdnc.vnfbackupservice.service.VnfbackupService; +import com.onap.sdnc.vnfbackupservice.service.VnfbackupServiceImpl; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Component +@EnableScheduling +public class VnfConfigBackupScheduler { + + @Autowired + VnfbackupService vnfConfigBackService; + + @Autowired + VnfBackupServiceRepo vnfBackupServiceDao; + + private static final Logger logger = Logger.getLogger(VnfbackupServiceImpl.class); + + @Scheduled(cron = "0 0 * * * *") + public String initiateBackupService() { + + String lastupdatedtime = null; + VnfServiceResponse s = vnfConfigBackService.getAllVnfDetails(); + List<VnfDisplayParams> displayParams = s.getVnfDisplayList(); + for (VnfDisplayParams params : displayParams) { + lastupdatedtime = invokeDetails(params.getVnfId()); + } + return lastupdatedtime; + } + + public String invokeDetails(String vnfId) { + String formatDateTime = null; + try { + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter format = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss"); + formatDateTime = now.format(format); + String dbschedulertime = vnfBackupServiceDao.getvnfschedulertime(); + if (dbschedulertime == null) { + int id = 1; + vnfBackupServiceDao.insertSchedulerTime(id, formatDateTime); + } + vnfBackupServiceDao.updateSchedulerTime(formatDateTime); + } catch (Exception e) { + logger.error(":::::::::exception is at vackupVnfconfig():::: " + e); + } + vnfConfigBackService.backupVnfconfig(vnfId); + return formatDateTime; + } + +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/scheduler/VnfRestClient.java b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/scheduler/VnfRestClient.java new file mode 100644 index 00000000..2af4e084 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/scheduler/VnfRestClient.java @@ -0,0 +1,58 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.scheduler; + + +import java.util.Arrays; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + + +@Service +public class VnfRestClient { + + @Autowired + private RestTemplate restTemplate; + + public String vnfRestClient(String url, String userName, String password) { + restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + HttpEntity<String> entity = new HttpEntity<String>(generateHeaders(headers, userName, password)); + ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String result = response.getBody(); + return result; + } + + public HttpHeaders generateHeaders(HttpHeaders headers, String userName, String password) { + headers.setAccept(Arrays.asList(new MediaType[] { MediaType.APPLICATION_JSON })); + headers.setContentType(MediaType.APPLICATION_JSON); + String base64Username = userName + ":" + password; + byte[] message = base64Username.getBytes(); + headers.set("Authorization", "Basic " + java.util.Base64.getEncoder().encodeToString(message)); + return headers; + } +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/service/VnfbackupService.java b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/service/VnfbackupService.java new file mode 100644 index 00000000..d7cb1f51 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/service/VnfbackupService.java @@ -0,0 +1,31 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.service; + +import com.onap.sdnc.vnfbackupservice.model.VnfServiceResponse; + +public interface VnfbackupService { + + public VnfServiceResponse getAllVnfDetails(); + public String backupVnfconfig(String vnfId); + public String putVnfconfig(String configfile, String vnfId); + public String updatedBackuptime(); + +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/service/VnfbackupServiceImpl.java b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/service/VnfbackupServiceImpl.java new file mode 100644 index 00000000..c3c86df7 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/java/com/onap/sdnc/vnfbackupservice/service/VnfbackupServiceImpl.java @@ -0,0 +1,234 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.service; + +import java.io.IOException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.onap.sdnc.vnfbackupservice.dao.VnfBackupServiceRepo; +import com.onap.sdnc.vnfbackupservice.model.VnfConfigDetailsDB; +import com.onap.sdnc.vnfbackupservice.model.VnfDisplayParams; +import com.onap.sdnc.vnfbackupservice.model.VnfServiceResponse; + +import com.onap.sdnc.vnfbackupservice.scheduler.VnfConfigBackupScheduler; +import com.onap.sdnc.vnfbackupservice.scheduler.VnfRestClient; + +@Service +public class VnfbackupServiceImpl implements VnfbackupService { + + @Autowired + private RestTemplate restTemplate; + + @Autowired + VnfBackupServiceRepo vnfBackupServiceDao; + + @Autowired + VnfConfigBackupScheduler vnfConfigBackupScheduler; + + @Value("${sdnc.rest.vnf.api.host}") + private String host; + + @Value("${sdnc.rest.vnf.api.port}") + private String port; + + @Value("${sdnc.rest.vnf.api.basepath}") + private String basePath; + + @Value("${sdnc.rest.vnf.api.username}") + private String username; + + @Value("${sdnc.rest.vnf.api.password}") + private String password; + + @Autowired + VnfRestClient vnfRestClientlocal; + + private static final Logger logger = Logger.getLogger(VnfbackupServiceImpl.class); + + @Override + public VnfServiceResponse getAllVnfDetails() { + VnfServiceResponse vnfServiceResponse = new VnfServiceResponse(); + String finalURL = "http://" + host + ":" + port + basePath + "/config/VNF-API:vnfs"; + String response = vnfRestClientlocal.vnfRestClient(finalURL, username, password); + List<VnfDisplayParams> displayParams = parseVnfConfigDetails(response); + vnfServiceResponse.setVnfDisplayList(displayParams); + return vnfServiceResponse; + } + + public List<VnfDisplayParams> parseVnfConfigDetails(String jsonInput) { + List<VnfDisplayParams> displayParams = new ArrayList<VnfDisplayParams>(); + + try { + JSONObject vnf = new JSONObject(jsonInput); + JSONArray vnfList = vnf.getJSONObject("vnfs").getJSONArray("vnf-list"); + + for (int i = 0; i < vnfList.length(); i++) { + VnfDisplayParams vnfDisplayParams = new VnfDisplayParams(); + String responseStatus = vnfList.getJSONObject(i).getJSONObject("service-status").get("response-code") + .toString(); + if ("200".equalsIgnoreCase(responseStatus)) { + String vnfId = vnfList.getJSONObject(i).get("vnf-id").toString(); + String vnfName = vnfList.getJSONObject(i).getJSONObject("service-data") + .getJSONObject("vnf-request-information").get("vnf-name").toString(); + vnfDisplayParams.setVnfId(vnfId); + vnfDisplayParams.setVnfName(vnfName); + displayParams.add(vnfDisplayParams); + } + } + } catch (JSONException e) { + logger.error("Exception is at parseVnfConfigDetails() : " + e); + } + return displayParams; + } + + @Override + public String backupVnfconfig(String vnfId) { + long millis = System.currentTimeMillis(); + Timestamp date = new java.sql.Timestamp(millis); + String finalURL = "http://" + host + ":" + port + basePath + "/config/VNF-API:vnfs/vnf-list/" + vnfId; + logger.debug("connecting to restconf device:::" + finalURL); + String response = vnfRestClientlocal.vnfRestClient(finalURL, username, password); + String configInfo = response; + Timestamp creationDate = date; + Timestamp lastupdated = date; + int status = 1; + String vnfid = vnfId; + String vnfname = ""; + VnfConfigDetailsDB getVnfDetails = null; + String vnfversion = "Version-1"; + try { + getVnfDetails = vnfBackupServiceDao.getVnfDetail(vnfId); + } catch (Exception e) { + logger.error("exception is at getVnfdetails() : " + e); + } + if (getVnfDetails == null) { + JSONObject vnf; + try { + vnf = new JSONObject(response); + vnfname = vnf.getJSONArray("vnf-list").getJSONObject(0).getJSONObject("service-data") + .getJSONObject("vnf-request-information").get("vnf-name").toString(); + + } catch (JSONException e) { + logger.error("exception is at getVnfdetails() : " + e); + } + vnfBackupServiceDao.saveVnfDetails(configInfo, creationDate, lastupdated, status, vnfid, vnfname, + vnfversion); + } else { + try { + String[] vnfvesionsplit = getVnfDetails.getVnfversion().split("-"); + int tmpVnfversion = Integer.parseInt(vnfvesionsplit[1]) + 1; + vnfversion = vnfvesionsplit[0] + "-" + String.valueOf(tmpVnfversion); + + ObjectMapper om = new ObjectMapper(); + try { + Map<String, Object> m1 = (Map<String, Object>) (om.readValue(getVnfDetails.getConfiginfo(), + Map.class)); + Map<String, Object> m2 = (Map<String, Object>) (om.readValue(response, Map.class)); + + JSONObject vnf; + vnf = new JSONObject(response); + vnfname = vnf.getJSONArray("vnf-list").getJSONObject(0).getJSONObject("service-data") + .getJSONObject("vnf-request-information").get("vnf-name").toString(); + + if (!m1.equals(m2)) { + vnfBackupServiceDao.saveVnfDetails(configInfo, creationDate, lastupdated, status, vnfid, + vnfname, vnfversion); + } + } catch (Exception e) { + logger.error("exception is at getVnfdetails() : " + e); + } + } catch (Exception e) { + logger.error("exception is at getVnfdetails() : " + e); + } + } + return "success"; + } + + @Override + public String putVnfconfig(String configfile, String vnfId) { + + String indented = null; + + if (configfile != null) { + restTemplate = new RestTemplate(); + String finalURL = "http://" + host + ":" + port + basePath + "/config/VNF-API:vnfs/vnf-list/" + vnfId; + + HttpHeaders headers = new HttpHeaders(); + + logger.info("connecting to restconf device:::" + finalURL); + String response = vnfRestClientlocal.vnfRestClient(finalURL, username, password); + logger.info(response); + ObjectMapper mapper = new ObjectMapper(); + try { + Object json = mapper.readValue(response, Object.class); + indented = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(json); + logger.info(indented); + } catch (JsonParseException e) { + logger.error("exception occer" + e); + } catch (JsonMappingException e) { + logger.error("exception occer" + e); + } catch (IOException e) { + logger.error("exception occer" + e); + } + + if (!(configfile.equals(indented))) { + HttpEntity<String> requestEntity = new HttpEntity<String>(configfile, + vnfRestClientlocal.generateHeaders(headers, username, password)); + + ResponseEntity<String> uri = restTemplate.exchange(finalURL, HttpMethod.PUT, requestEntity, + String.class); + logger.info(uri.getStatusCode()); + if (uri.getStatusCodeValue() == 200) { + vnfConfigBackupScheduler.initiateBackupService(); + } + return "ok"; + } else { + throw new RuntimeException("Both configurations are same"); + } + } + return "ok"; + } + + @Override + public String updatedBackuptime() { + String sdtime = vnfBackupServiceDao.getvnfschedulertime(); + return sdtime; + } + +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/resource/application.properties b/configbackuprestore/vnfconfigbackupservice/src/main/resource/application.properties new file mode 100644 index 00000000..4c2287b2 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/resource/application.properties @@ -0,0 +1,72 @@ +server.port = 9003 +#server.error.whitelabel.enabled=false +spring.mvc.view.prefix = /WEB-INF/views/ +spring.mvc.view.suffix = .jsp +# +#spring.datasource.url=jdbc:mariadb://localhost:3306/testreports?useSSL=false +##spring.datasource.url=jdbc:mysql://localhost:3306/mysql?useSSL=false +##spring.datasource.driver-class-name=com.mysql.jdbc.Driver +#spring.datasource.driver-class-name=org.mariadb.jdbc.Driver +#spring.datasource.name=mysql +#spring.jpa.database=testreports +#spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect +##org.hibernate.dialect.MySQLDialect +# +# +#spring.datasource.username=root +#spring.datasource.password=12345 +#spring.jpa.generate-ddl=true +#spring.datasource.tomcat.max-wait=20000 +#spring.datasource.tomcat.max-active=50 +#spring.datasource.tomcat.max-idle=20 +#spring.datasource.tomcat.min-idle=15 +# +spring.jpa.hibernate.ddl-auto=update +# +#spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL5InnoDBDialect +## org.hibernate.dialect.MySQLDialect +# +#spring.jpa.properties.hibernate.id.new_generator_mappings = false +#spring.jpa.properties.hibernate.format_sql = true +# +#logging.level.org.hibernate.SQL=DEBUG +#logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE +sdnc.rest.vnf.api.host=10.53.172.121 +sdnc.rest.vnf.api.port=8282 +sdnc.rest.vnf.api.basepath=/restconf +sdnc.rest.vnf.api.username=admin +sdnc.rest.vnf.api.password=Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U + +spring.jackson.serialization.fail-on-empty-beans=false + +server.tomcat.uri-encoding=utf-8 + +#server.error.whitelabel.enabled=false +#spring.mvc.view.prefix = /WEB-INF/views/ +#spring.mvc.view.suffix = .jsp + +logging.level.org.springframework=TRACE +logging.level.com=TRACE + +# =============================== +# Set here configurations for the database connection +spring.datasource.url=jdbc:mariadb://localhost:3306/configtest +spring.datasource.username=root +spring.datasource.password=root +spring.datasource.driver-class-name=org.mariadb.jdbc.Driver +# Keep the connection alive if idle for a long time (needed in production) +spring.datasource.testWhileIdle=true +spring.datasource.validationQuery=SELECT 1 +# =============================== +# = JPA / HIBERNATE +# =============================== +# Show or not log for each sql query +spring.jpa.show-sql=true +# Hibernate ddl auto (create, create-drop, update): with "create-drop" the database +# schema will be automatically created afresh for every start of application +#spring.jpa.hibernate.ddl-auto=validate +# Naming strategy +spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl +spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy +# Allows Hibernate to generate SQL optimized for a particular DBMS +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/resource/log4j2.xml b/configbackuprestore/vnfconfigbackupservice/src/main/resource/log4j2.xml new file mode 100644 index 00000000..e443b529 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/resource/log4j2.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration status="WARN" monitorInterval="30"> + <Properties> + <Property name="LOG_PATTERN"> + %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex + </Property> + </Properties> + <Appenders> + + <!-- <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true"> + <PatternLayout pattern="${LOG_PATTERN}"/> + </Console> --> + + <!-- Rolling File Appender --> + <RollingFile name="FileAppender" fileName="logs/sdnc_report_api.log" + filePattern="logs/sdnc_report_api-%d{yyyy-MM-dd}-%i.log"> + <PatternLayout> + <Pattern>${LOG_PATTERN}</Pattern> + </PatternLayout> + <Policies> + <SizeBasedTriggeringPolicy size="10MB" /> + </Policies> + <DefaultRolloverStrategy max="10"/> + </RollingFile> + + </Appenders> + + <Loggers> + <Logger name="com.onap.sdnc.reports" level="debug" additivity="false"> + <AppenderRef ref="FileAppender" /> + </Logger> + + <Root level="debug"> + <!-- <AppenderRef ref="ConsoleAppender" /> --> + <AppenderRef ref="FileAppender"/> + </Root> + </Loggers> +</Configuration>
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/WEB-INF/lib/jsp-api-2.0.jar b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/WEB-INF/lib/jsp-api-2.0.jar Binary files differnew file mode 100644 index 00000000..3d0c81fe --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/WEB-INF/lib/jsp-api-2.0.jar diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/WEB-INF/lib/jstl-1.2.jar b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/WEB-INF/lib/jstl-1.2.jar Binary files differnew file mode 100644 index 00000000..0fd275e9 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/WEB-INF/lib/jstl-1.2.jar diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/WEB-INF/views/index.jsp b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/WEB-INF/views/index.jsp new file mode 100644 index 00000000..b6a3e552 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/WEB-INF/views/index.jsp @@ -0,0 +1,73 @@ +<!-- /* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ + --> +<!-- index.html --> +<!DOCTYPE html> +<html ng-app="myApp"> + <head> + <meta charset="utf-8"> + <!-- CSS --> + <script src="./node_modules/jquery.min.js"></script> + <script src="./node_modules/tether.min.js" ></script> + <link rel="stylesheet" href="./node_modules/bootstrap-3.3.7/dist/css/bootstrap.min.css"> + <script src="./node_modules/bootstrap-3.3.7/dist/js/bootstrap.min.js"></script> + <link rel="stylesheet" href="/static/style/sdnc-style.css"> + <!-- JS --> + <!-- load angular,date-time picker,pagination,growl and ui-router --> + <script src = "./node_modules/angular.min.js"></script> + <script src = "./node_modules/angular-route.min.js"></script> + <script src="./node_modules/angular-utils-pagination/dirPagination.js"></script> + <script src="./node_modules/ng-csv/build/ng-csv.min.js"></script> + <script src="./node_modules/angular-sanitize.min.js"></script> + <link rel="stylesheet" href="./node_modules/angularjs-datetime-picker/angularjs-datetime-picker.css" /> + <script src="./node_modules/angularjs-datetime-picker/angularjs-datetime-picker.js"></script> + <script data-require="jquery@*" data-semver="2.1.4" src="https://code.jquery.com/jquery-2.1.4.js"></script> + <script src="./node_modules/angular-utils-pagination/dirPagination.js"></script> + <script src="./js/app.js"></script> + <script src="./js/sdnc-controller/sdnc-viewreport-controller.js"></script> + <script src="./js/sdnc-controller/sdnc-validationTest-controller.js"></script> + <script src="./js/sdnc-services/sdnc-viewReport-service.js"></script> + <script src="./js/sdnc-services/sdnc-validationTest-service.js"></script> + <script src="./js/sdnc-controller/sdnc-backupConfig-controller.js"></script> + <script src="./js/sdnc-controller/sdnc-applyConfig-controller.js"></script> + <script src="./js/sdnc-controller/sdnc-compareConfig-controller.js"></script> + <script src="./js/sdnc-services/sdnc-compareConfig-service.js"></script> + <script src="./node_modules/angular-growl-v2/build/angular-growl.min.js" ></script> + <script src="./node_modules/ng-ip-address/ngIpAddress.min.js" ></script> + <link rel="stylesheet" type="text/css" href="./node_modules/angular-growl-v2/build/angular-growl.css"> + <link rel="stylesheet" href="/static/style/w3.css"> + <link type="text/css" href="./node_modules/angular-object-diff/dist/angular-object-diff.css" rel='stylesheet'> + <script type="text/javascript" src="/node_modules/angular-object-diff/dist/angular-object-diff.js"></script> + </head> + <!-- apply our angular app --> + <body> + <div class="container"> + <!-- header page --> + <div ng-include="'static/views/header.html'"></div> + <div style="border-style:ridge;height:auto;"> + <div ng-include="'static/views/tabs.html'" ></div> + <!-- views will be injected here --> + <div ng-view></div> + </div> + <!-- footer page --> + <div ng-include="'static/views/footer.html'" ></div> + </div> + </body> +</html>
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/app.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/app.js new file mode 100644 index 00000000..109baec5 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/app.js @@ -0,0 +1,68 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ + +// app.js This is first entry point for the application +// ============================================================================= +var myApp = angular.module('myApp', ['ngRoute', 'ngSanitize', 'ngCsv', 'angularUtils.directives.dirPagination', 'angular-growl','ng-ip-address','ds.objectDiff']); + +myApp.config(['growlProvider',function(growlProvider) { + growlProvider.globalDisableCloseButton(false); +}]); + + +// configuring our routes +// ============================================================================= +myApp.config(['$routeProvider', function($routeProvider) { + + //Called when user select pre validation test from the UI + $routeProvider. + when('/testReportsById', { + templateUrl: 'static/views/form-viewReportById.html', + controller: 'ReportController' + }). + when('/', { + templateUrl: 'static/views/form-viewReport.html', + controller: 'ReportController' + }). + //Called when user select view test report from the UI + when('/testReports', { + templateUrl: 'static/views/form-viewReport.html', + controller: 'ReportController' + }). + when('/deviceConfig', { + templateUrl: 'static/views/form-backupConfig.html', + controller: 'BackupConfigCtrl' + }). + when('/applyConfig', { + templateUrl: 'static/views/form-applyConfig.jsp', + controller: 'ApplyConfigCtrl' + }). + when('/compareConfig', { + templateUrl: 'static/views/form-compareConfig.html', + controller: 'CompareConfigCtrl' + }). + otherwise({ + redirectTo: 'static/views/form-viewReport.html' + }); +}]); + + +myApp.constant('CERTIFICATION_API_BASE', 'http://myapp.production.com/'); +myApp.constant('VNF_API_BASE', 'http://myapp.production.com/');
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-applyConfig-controller.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-applyConfig-controller.js new file mode 100644 index 00000000..faff3633 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-applyConfig-controller.js @@ -0,0 +1,93 @@ +myApp.controller('ApplyConfigCtrl', ['$scope','$window', '$http', 'growl', 'deviceConfigService', 'ObjectDiff', function($scope, $http,$window, growl, deviceConfigService, ObjectDiff) { + + $scope.showResult = false; + + //THIS FUNCTION WILL BE CALLED ON PAGE LOAD + $scope.getAllVNFFromRc = function() { + + deviceConfigService.getAllVNFFromRc().then(function(data) { + if (data != null) { + console.log(data); + $scope.objvnfList = data; + console.log("CompareConfigCtrl:getAllVNFFromRc called" + $scope.objvnfList); + } else { + $scope.warningMessage = "No VNF is eligible for configuration!!!"; + growl.error($scope.warningMessage, { + title: 'Warning!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + } + }); + }; + $scope.getAllVNFFromRc(); + + + + $scope.selectVnf = function(selectedValueVnf) { + + var vnfId = selectedValueVnf; + + $scope.fileContent = ''; + $scope.fileSize = 0; + $scope.fileName = ''; + + $scope.submit = function () { + var file = document.getElementById("myFileInput").files[0]; + $scope.result1={}; + + if (file) { + var aReader = new FileReader(); + aReader.readAsText(file, "UTF-8"); + aReader.onload = function (evt) { + // $scope.fileContent = aReader.result; + $scope.fileName = document.getElementById("myFileInput").files[0].name; + $scope.fileSize = document.getElementById("myFileInput").files[0].size; + var id= vnfId; + result1=JSON.parse(aReader.result); + /*var item = JSON.parse(result1);*/ + $scope.fileContent = aReader.result.search(id); + $scope.successMessagebool = false; + if( $scope.fileContent == -1){ + $scope.errorMessage = "VNF Id is different!!! Select different file and try again"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + } + else{ + + $scope.apply(); + + } + } + aReader.onerror = function (evt) { + $scope.fileContent = "error"; + } + } + $scope.successMessagebool1 = false; + $scope.apply = function() { + if (file) { + deviceConfigService.runApplyconfig(vnfId,result1); + $scope.successMessage = "File uploaded successfully"; + growl.success($scope.successMessage, { + title: 'Success!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + $scope.successMessagebool1 = true; + + + } }; + + } + + } + + +}]); + diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-backupConfig-controller.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-backupConfig-controller.js new file mode 100644 index 00000000..3ea9c755 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-backupConfig-controller.js @@ -0,0 +1,314 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ +myApp.controller('BackupConfigCtrl', ['$scope', '$http','$window', 'growl', 'deviceConfigService', 'ObjectDiff', '$timeout' , function($scope, $http, $window, growl, deviceConfigService, ObjectDiff, $timeout) { + + $scope.showResult = false; + $scope.showCompare = false; + + //THIS FUNCTION WILL BE CALLED ON PAGE LOAD + $scope.getAllVNF = function() { + + deviceConfigService.getAllVNF().then(function(data) { + if (data != null) { + console.log(data); + $scope.objvnfList = data; + console.log("CompareConfigCtrl:getAllVNF called" + $scope.objvnfList); + } else { + $scope.warningMessage = "No VNF is eligible for configuration!!!"; + growl.error($scope.warningMessage, { + title: 'Warning!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + } + }); + }; + $scope.getAllVNF(); + + $scope.selectVnf = function(selectedValueVnf) { + + if (selectedValueVnf != null && selectedValueVnf != "") { + console.log("selectedvnf Value", selectedValueVnf); + //selectedItem = selectedValueVnf.split("%"); +// var vnfName = selectedItem[0]; +// var vnfType = selectedItem[1]; + var vnfId = selectedValueVnf; + $scope.getVersionList(vnfId); + } else { + $scope.ShowResult = false; + $scope.showCompare = false; + $scope.showResult = false; + $scope.errorMessage = "Please select a VNF!!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + } + + } + + //THIS FUNCTION WILL BE CALLED ON SELECTION OF VNF + $scope.getVersionList = function(vnfId) { + + $scope.ShowResult = false; + + //service call to fetch the version list + deviceConfigService.getVersions(vnfId).then(function(result) { + console.log("--CompareConfigCtrl::getVersionList called from controler--", JSON.stringify(result)); + var status = result.status; + var result = result.data; + if (status == 200) { + if (result.length >= 1) { + //in case of success, build the model object to store the service output here + $scope.createVersionModel(result); + } else { + $scope.ShowResult = false; + $scope.warningMessage = "No configruation found for the selected VNF !!"; + growl.warning($scope.warningMessage, { + title: 'Warning!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + } + } else { + $scope.ShowResult = false; + $scope.warningMessage = "No configruation found for the selected VNF !!"; + growl.warning($scope.warningMessage, { + title: 'Warning!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + } + }, + function(response) { + $scope.errorMessage = "Something went wrong, Please try again !!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + console.log("--CompareConfigCtrl::getVersionList::Error--", response); + }); + } + + //Function to build the UI model to be shown + $scope.createVersionModel = function(result) { + + $scope.objVersionModel = result; + $scope.objVersion = []; + + console.log("--CompareConfigCtrl::createVersionModel::--", JSON.stringify($scope.objVersionModel)); + if ($scope.objVersionModel.length >= 1) { + $scope.ShowResult = true; + $scope.showCompare = true; + for (var i = 0; i < $scope.objVersionModel.length; i++) { + var objVersionDetail = {}; + objVersionDetail.vnfname = $scope.objVersionModel[i].vnfname; + objVersionDetail.vnfid = $scope.objVersionModel[i].vnfid; + objVersionDetail.versionNo = $scope.objVersionModel[i].vnfversion; + objVersionDetail.createdAt = $scope.objVersionModel[i].creationdate; + objVersionDetail.configinfo = $scope.objVersionModel[i].configinfo; + objVersionDetail.selected = false; + + $scope.objVersion.push(objVersionDetail); + } + } + console.log("--CompareConfigCtrl::createVersionModel::final VersionModel--" + JSON.stringify($scope.objVersion)); + + } + + $scope.CompareConfig = function(objVersion) { + var count = 0; + angular.forEach(objVersion, function(item) { + if (item.selected == true) + count++; + }); + if (count > 2) { + $scope.errorMessage = "Only two config files can be selected for the comparison!!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + } else if (count === 1){ + $scope.errorMessage = "At least two config files can be selected for the comparison!!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + }else + $scope.createCompareModelNew(objVersion); + }; + + $scope.createCompareModelNew = function(objVersion) { + + $scope.objCompareModel1 = {}; + $scope.objCompareModel2 = {}; + + $scope.versionsSelected = []; + angular.forEach(objVersion, function(item) { + angular.forEach($scope.objVersionModel, function(val, index) { + if (item.versionNo == val['versionNo'] && item.selected == false) { + $scope.objVersionModel.splice(index, 1); + } + if (item.selected) { + if ($scope.versionsSelected.indexOf(item) == -1) + $scope.versionsSelected.push(item); + } + }) + }); + console.log("--CompareConfigCtrl::createCompareModel::$scope.objVersionModel", JSON.stringify($scope.objVersionModel)); + angular.forEach($scope.objVersionModel, function(item) { + var versionObj = {}; + var versionDetails = {}; + versionDetails.versionNo = item['vnfversion']; + /*versionDetails.vnfName = item['vnfname']; + versionDetails.vnfid = item['vnfid'];*/ + versionDetails.timeStamp = item.creationdate; + versionObj.versionDetails = versionDetails; + + //fetch all the other topology/network,opertaion status for the vnf + // versionObj.topologyInfo = $scope.fetchConfigDetails(item); + versionObj.topologyInfo = $scope.fetchTopologyInfo(item); + + versionObj.networkTopologyInfo = $scope.fetchNetworkTopologyInfo(item); + versionObj.operationStatus = $scope.operationStatus(item); + versionObj.vnfTopologyIdentifier = $scope.vnfTopologyIdentifier(item); + + if ((versionObj.versionDetails.versionNo == $scope.versionsSelected[0].versionNo)) { + $scope.objCompareModel1 = versionObj; + } else + $scope.objCompareModel2 = versionObj; + + }); + $scope.showResult = true; + console.log("CompareConfigCtrl::createCompareModel::objCompareModel1", JSON.stringify($scope.objCompareModel1)); + console.log("CompareConfigCtrl::createCompareModel::objCompareModel2", JSON.stringify($scope.objCompareModel2)); + } + + + + $scope.fetchTopologyInfo = function(item) { + var topologyInfo = {}; + item = JSON.parse(item.configinfo); + if (angular.isDefined(item['preload-data']) && angular.isDefined(item['preload-data']['vnf-topology-information'])) { + var vnfTopologyInfo = item['preload-data']['vnf-topology-information']; + if (angular.isDefined(vnfTopologyInfo['vnf-parameters'] && vnfTopologyInfo['vnf-parameters'] != null)) { + var vnfParameters = vnfTopologyInfo['vnf-parameters']; + for (var i = 0; i < vnfParameters.length; i++) { + + var key = vnfParameters[i]['vnf-parameter-name']; + var value = vnfParameters[i]['vnf-parameter-value']; + console.log("CompareConfigCtrl::fetchTopologyInfo::key", key); + console.log("CompareConfigCtrl::fetchTopologyInfo::value", value); + topologyInfo[key] = value; + + } + console.log("CompareConfigCtrl::fetchTopologyInfo::", JSON.stringify(topologyInfo)); + return topologyInfo; + } + } + } + + $scope.fetchNetworkTopologyInfo = function(item) { + var networkTopology = {}; + item = JSON.parse(item.configinfo); + if (angular.isDefined(item['preload-data']) && angular.isDefined(item['preload-data']['network-topology-information'])) { + var netwrokTopologyInfo = item['preload-data']['network-topology-information']; + if (angular.isDefined(netwrokTopologyInfo) && netwrokTopologyInfo != null) { + for (var i = 0; i < netwrokTopologyInfo.length; i++) { + + var key = netwrokTopologyInfo[i]['vnf-parameter-name']; + var value = netwrokTopologyInfo[i]['vnf-parameter-value']; + console.log("CompareConfigCtrl::fetchTopologyInfo::key", key); + console.log("CompareConfigCtrl::fetchTopologyInfo::value", value); + networkTopology[key] = value; + } + } + } + console.log("CompareConfigCtrl::fetchNetworkTopologyInfo::", JSON.stringify(networkTopology)); + return networkTopology; + } + + $scope.operationStatus = function(item) { + var operationStatus = {}; + item = JSON.parse(item.configinfo); + if (angular.isDefined(item['preload-data']) && angular.isDefined(item['preload-data']['oper-status'])) { + var operStatus = item['preload-data']['oper-status']; + if (angular.isDefined(operStatus) && operStatus != null) { + + var value = operStatus['order-status']; + operationStatus['order-status'] = value; + + } + } + console.log("CompareConfigCtrl::operationStatus::", JSON.stringify(operationStatus)); + return operationStatus; + } + + $scope.vnfTopologyIdentifier = function(item) { + var topologyIdnetifier = {}; + item = JSON.parse(item.configinfo); + if (angular.isDefined(item['preload-data']) && angular.isDefined(item['preload-data']['vnf-topology-information']['vnf-topology-identifier'])) { + var topologyInfoidentifier = item['preload-data']['vnf-topology-information']['vnf-topology-identifier']; + if (angular.isDefined(topologyInfoidentifier)) { + angular.forEach(topologyInfoidentifier, function(value, key) { + + console.log("CompareConfigCtrl::fetchTopologyInfo::key", key); + console.log("CompareConfigCtrl::fetchTopologyInfo::value", value); + topologyIdnetifier[key] = value; + }); + } + } + + console.log("CompareConfigCtrl::vnfTopologyIdentifier::", JSON.stringify(topologyIdnetifier)); + return topologyIdnetifier; + } + + $scope.invokeBackup = function(){ + deviceConfigService.invokeBackup().then(function(data) { + console.log("response -- data -- "+data) + $window.location.reload(); + }); + } + + $scope.getLastModifiedTime=function(){ +// $timeout(function(result){ +// console.log("response-data-"+ result); +// $scope.lastModifiedTime="Testcode Dushyant" +// } +// ,5000); + + deviceConfigService.getlastupdated().then(function(result) { + $scope.lastModifiedTime= result.data; + console.log("response -- getlastupdated -- "+JSON.stringify(result)) + }); + } + $scope.getLastModifiedTime() +}]);
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-compareConfig-controller.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-compareConfig-controller.js new file mode 100644 index 00000000..91584b00 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-compareConfig-controller.js @@ -0,0 +1,690 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ +myApp.controller('CompareConfigCtrl', ['$scope','$filter', '$http','$window', 'growl', 'deviceConfigService', 'ObjectDiff', function($scope,$filter, $http,$window, growl, deviceConfigService, ObjectDiff) { + + $scope.showResult = false; + $scope.showCompare = false; + $scope.showView=false; + $scope.pagination = false; + $scope.gap = 2; + $scope.filteredItems = []; + $scope.groupedItems = []; + $scope.itemsPerPage = 5; + $scope.pagedItems = []; + $scope.currentPage = 0; + //THIS FUNCTION WILL BE CALLED ON PAGE LOAD + $scope.getAllVNF = function() { + + deviceConfigService.getAllVNF().then(function(data) { + if (data != null) { + console.log(data); + $scope.objvnfList = data; + console.log("CompareConfigCtrl:getAllVNF called" + $scope.objvnfList); + } else { + $scope.warningMessage = "No VNF is eligible for configuration!!!"; + growl.error($scope.warningMessage, { + title: 'Warning!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + } + }); + }; + $scope.getAllVNF(); + + $scope.selectVnf = function(selectedValueVnf) { + + if (selectedValueVnf != null && selectedValueVnf != "") { + console.log("selectedvnf Value", selectedValueVnf); + //selectedItem = selectedValueVnf.split("%"); +// var vnfName = selectedItem[0]; +// var vnfType = selectedItem[1]; + var vnfId = selectedValueVnf; + $scope.getVersionList(vnfId); + } else { + $scope.ShowResult = false; + $scope.showCompare = false; + $scope.showResult = false; + $scope.errorMessage = "Please select a VNF!!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + } + + } + + //THIS FUNCTION WILL BE CALLED ON SELECTION OF VNF + $scope.getVersionList = function(vnfId) { + + $scope.ShowResult = false; + + //service call to fetch the version list + deviceConfigService.getVersions(vnfId).then(function(result) { + console.log("-----CompareConfigCtrl::getVersionList called from controler--", JSON.stringify(result)); + var status = result.status; + var result = result.data; + if (status == 200) { + if (result.length >= 1) { + //in case of success, build the model object to store the service output here + $scope.createVersionModel(result); + + } else { + $scope.ShowResult = false; + $scope.warningMessage = "No configruation found for the selected VNF !!"; + growl.warning($scope.warningMessage, { + title: 'Warning!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + } + } else { + $scope.ShowResult = false; + $scope.warningMessage = "No configruation found for the selected VNF !!"; + growl.warning($scope.warningMessage, { + title: 'Warning!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + } + }, + function(response) { + $scope.errorMessage = "Something went wrong, Please try again !!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + console.log("--CompareConfigCtrl::getVersionList::Error--", response); + }); + } + + //Function to build the UI model to be shown + $scope.createVersionModel = function(result) { + + $scope.objVersionModel = result; + $scope.objVersion = []; + + console.log("-----CompareConfigCtrl::createVersionModel::--", JSON.stringify($scope.objVersionModel)); + if ($scope.objVersionModel.length >= 1) { + $scope.ShowResult = true; + $scope.showCompare = true; + $scope.showView =true; + for (var i = 0; i < $scope.objVersionModel.length; i++) { + var objVersionDetail = {}; + objVersionDetail.vnfname = $scope.objVersionModel[i].vnfname; + objVersionDetail.vnfid = $scope.objVersionModel[i].vnfid; + objVersionDetail.vnfversion = $scope.objVersionModel[i].vnfversion; + objVersionDetail.createdAt = $scope.objVersionModel[i].creationdate; + objVersionDetail.updatedAt = $scope.objVersionModel[i].lastupdated; + objVersionDetail.configinfo = $scope.objVersionModel[i].configinfo; + objVersionDetail.selected = false; + $scope.objVersion.push(objVersionDetail); + + } + } + console.log("-----CompareConfigCtrl::createVersionModel::final VersionModel--" + JSON.stringify($scope.objVersion)); + + // init + $scope.sort = { + sortingOrder : 'vnfversion', + reverse : true + }; + + var searchMatch = function(haystack, needle) { + if (!needle) { + return true; + } + return haystack.toLowerCase().indexOf( + needle.toLowerCase()) !== -1; + }; + + // init the filtered items + $scope.search = function() { + $scope.filteredItems = $filter('filter')( + $scope.objVersion, + function(item) { + for ( var attr in item) { + if (searchMatch(item[attr], + $scope.query)) + return true; + } + return false; + }); + // take care of the sorting order + if ($scope.sort.sortingOrder !== '') { + $scope.filteredItems = $filter( + 'orderBy')( + $scope.filteredItems, + $scope.sort.sortingOrder, + $scope.sort.reverse); + } + $scope.currentPage = 0; + // now group by pages + $scope.groupToPages(); + }; + + // calculate page in place + $scope.groupToPages = function() { + $scope.pagedItems = []; + + for (var i = 0; i < $scope.filteredItems.length; i++) { + if (i % $scope.itemsPerPage === 0) { + $scope.pagedItems[Math.floor(i + / $scope.itemsPerPage)] = [ $scope.filteredItems[i] ]; + } else { + $scope.pagedItems[Math.floor(i + / $scope.itemsPerPage)] + .push($scope.filteredItems[i]); + } + } + }; + + $scope.range = function(size, start, end) { + var ret = []; + //console.log(size, start, end); + + if (size < end) { + end = size; + start = size - $scope.gap; + } + for (var i = start; i < end; i++) { + ret.push(i); + } + //console.log(ret); + return ret; + }; + + $scope.prevPage = function() { + if ($scope.currentPage > 0) { + $scope.currentPage--; + } + }; + + $scope.nextPage = function() { + if ($scope.currentPage < $scope.pagedItems.length - 1) { + $scope.currentPage++; + } + }; + + $scope.setPage = function() { + $scope.currentPage = this.n; + }; + + // functions have been describe process the data + // for display + $scope.search(); + + } + + + + //For apply version + + $scope.ApplyConfig = function(objVersion){ + var count = 0; + angular.forEach(objVersion, function(item) { + if (item.selected == true) + count++; + }); + if (count < 1) { + $scope.errorMessage = "Select a config file to apply !!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + }else if (count > 1) { + $scope.errorMessage = "Only one config file can be applyed at a time !!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + }else + $scope.applyModelNew(objVersion); + }; + + + $scope.applyModelNew = function(objVersion){ + + $scope.objCompareModel1 = {}; + + $scope.versionsSelected = []; + angular.forEach(objVersion, function(item) { + angular.forEach($scope.objVersionModel, function(val, index) { + /* if (item.vnfversion == val['vnfversion'] && item.selected == false) { + $scope.objVersionModel.splice(index, 1); + }*/ + if (item.selected) { + if ($scope.versionsSelected.indexOf(item) == -1) + $scope.versionsSelected.push(item); + } + }) + }); + console.log("--CompareConfigCtrl::createCompareModel::$scope.objVersionModel", JSON.stringify($scope.objVersionModel)); + + angular.forEach($scope.versionsSelected, function(item) { + var versionObj = {}; + var versionDetails = {}; + versionDetails.vnfversion = item['vnfversion']; + versionDetails.vnfName = item['vnfname']; + var vnfid = item['vnfid']; + // var config = JSON.parse(item['configinfo']); + var config = item['configinfo']; + var config1=JSON.parse(config); + console.log("CompareConfigCtrl::createCompareModel::objCompareModel1", config1); + deviceConfigService.runApplyconfig(vnfid,config1); + $scope.successMessage = "File uploaded successfully"; + growl.success($scope.successMessage, { + title: 'Success!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + }); + } + +//View Configuration + + $scope.ViewConfig = function(objVersion){ + var elmnt1 = document.getElementById("view"); + + elmnt1.style.display = "block"; + var count = 0; + angular.forEach(objVersion, function(item) { + if (item.selected == true) + count++; + }); + if (count < 1) { + $scope.showResult = false; + $scope.errorMessage = "Select a config file to view !!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + }else if (count > 1) { + $scope.showResult = false; + $scope.errorMessage = "Only one config file can be viewed at a time !!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + }else + $scope.ViewCompareModelNew(objVersion); + }; + + $scope.ViewCompareModelNew = function(objVersion) { + $scope.objCompareModel1 = {}; + + $scope.versionsSelected = []; + angular.forEach(objVersion, function(item) { + angular.forEach($scope.objVersionModel, function(val, index) { + /*if (item.vnfversion == val['vnfversion'] && item.selected == false) { + $scope.objVersionModel.splice(index, 1); + }*/ + if (item.selected) { + if ($scope.versionsSelected.indexOf(item) == -1) + $scope.versionsSelected.push(item); + } + }) + }); + console.log("--CompareConfigCtrl::createCompareModel::$scope.objVersionModel", JSON.stringify($scope.objVersionModel)); + + angular.forEach($scope.versionsSelected, function(item) { + var versionObj = {}; + var versionDetails = {}; + versionDetails.vnfversion = item['vnfversion']; + versionDetails.vnfName = item['vnfname']; + var vnfid = item['vnfid']; + + + versionDetails.timeStamp = item.createdAt; + versionObj.versionDetails = versionDetails; + + //fetch all the other topology/network,opertaion status for the vnf + // versionObj.topologyInfo = $scope.fetchConfigDetails(item); + versionObj.topologyInfo = $scope.fetchTopologyInfo(item); + versionObj.vnfIdInfo = $scope.fetchVnfId(item); + versionObj.serviceStatusInfo= $scope.fetchServiceStatus(item); + versionObj.vnfTopologyIdentifier = $scope.vnfTopologyIdentifier(item); + versionObj.operationStatus = $scope.operationStatus(item); + versionObj.vnfRequestInfo=$scope.fetchVnfRequestInfo(item); + versionObj.serviceInfo= $scope.fetchServiceInfo(item); + versionObj.requestHeader= $scope.serviceRequestHeader(item); + versionObj.requestInfo=$scope.fetchRequestInfo(item); + + if ((versionObj.versionDetails.vnfversion == $scope.versionsSelected[0].vnfversion)) { + $scope.objCompareModel1 = versionObj; + } else + {console.log("CompareConfigCtrl::createCompareModel::objCompareModel1"); + + } + document.getElementById("compare").style.display = "none"; + } ); + $scope.showView=true; + $scope.showResult = true; + var elmnt1 = document.getElementById("view"); + elmnt1.scrollIntoView(); + console.log("CompareConfigCtrl::createCompareModel::objCompareModel1", JSON.stringify($scope.objCompareModel1)); + } + + + //compare + + + $scope.CompareConfig = function(objVersion) { + var elmnt = document.getElementById("compare"); + elmnt.style.display = "block"; + var count = 0; + angular.forEach(objVersion, function(item) { + if (item.selected == true) + count++; + }); + if (count > 4) { + $scope.showResult = false; + $scope.errorMessage = "Four or lessthan four and gretterthan two config files can be selected for the comparison!!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + } else if (count < 2){ + $scope.showResult = false; + $scope.errorMessage = "At least two config files can be selected for the comparison!!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton: false, + ttl: 7000, + disableCountDown: true + }); + }else + $scope.createCompareModelNew(objVersion); + }; + + $scope.createCompareModelNew = function(objVersion) { + + $scope.objCompareModel1 = {}; + $scope.objCompareModel2 = {}; + + $scope.versionsSelected = []; + angular.forEach(objVersion, function(item) { + angular.forEach($scope.objVersionModel, function(val, index) { + /*if ((item.vnfversion == val['vnfversion']) && item.selected == false) { + // $scope.objVersionModel.splice(index, 1); + }*/ + if (item.selected) { + if ($scope.versionsSelected.indexOf(item) == -1) + $scope.versionsSelected.push(item); + } + }) + }); + console.log("--CompareConfigCtrl::createCompareModel::$scope.objVersionModel", JSON.stringify($scope.objVersionModel)); + console.log("--CompareConfigCtrl::createCompareModel::$scope.objVersionModel", JSON.stringify($scope.versionsSelected)); + + angular.forEach($scope.versionsSelected, function(item) { + var versionObj = {}; + var versionDetails = {}; + versionDetails.vnfversion = item.vnfversion; + /*versionDetails.vnfName = item['vnfname']; + versionDetails.vnfid = item['vnfid'];*/ + versionDetails.timeStamp = item.createdAt; + versionObj.versionDetails = versionDetails; + + //fetch all the other topology/network,opertaion status for the vnf + // versionObj.topologyInfo = $scope.fetchConfigDetails(item); + versionObj.topologyInfo = $scope.fetchTopologyInfo(item); + versionObj.vnfIdInfo = $scope.fetchVnfId(item); + versionObj.serviceStatusInfo= $scope.fetchServiceStatus(item); + versionObj.vnfTopologyIdentifier = $scope.vnfTopologyIdentifier(item); + versionObj.operationStatus = $scope.operationStatus(item); + versionObj.vnfRequestInfo=$scope.fetchVnfRequestInfo(item); + versionObj.serviceInfo= $scope.fetchServiceInfo(item); + versionObj.requestHeader= $scope.serviceRequestHeader(item); + versionObj.requestInfo=$scope.fetchRequestInfo(item); + + if ((versionObj.versionDetails.vnfversion == $scope.versionsSelected[0].vnfversion)) { + $scope.objCompareModel1 = versionObj; + } else if ((versionObj.versionDetails.vnfversion == $scope.versionsSelected[1].vnfversion)) + {$scope.objCompareModel2 = versionObj; + } + document.getElementById("view").style.display = "none"; + } ); + $scope.showResult = true; + var elmnt = document.getElementById("compare"); + elmnt.scrollIntoView(); + console.log("CompareConfigCtrl::createCompareModel::objCompareModel1", JSON.stringify($scope.objCompareModel1)); + console.log("CompareConfigCtrl::createCompareModel::objCompareModel2", JSON.stringify($scope.objCompareModel2)); + + } + + //1'st comparison for vnf topology info vnf-parameters + $scope.fetchTopologyInfo = function(item) { + var topologyInfo = {}; + item = JSON.parse(item.configinfo); + var item= item['vnf-list'][0]; + if (angular.isDefined(item['service-data']) && angular.isDefined(item['service-data']['vnf-topology-information'])) { + var vnfTopologyInfo = item['service-data']['vnf-topology-information']; + if (angular.isDefined(vnfTopologyInfo['vnf-parameters'] && vnfTopologyInfo['vnf-parameters'] != null)) { + var vnfParameters = vnfTopologyInfo['vnf-parameters']; + for (var i = 0; i < vnfParameters.length; i++) { + + var key = vnfParameters[i]['vnf-parameter-name']; + var value = vnfParameters[i]['vnf-parameter-value']; + console.log("CompareConfigCtrl::fetchTopologyInfo::key", key); + console.log("CompareConfigCtrl::fetchTopologyInfo::value", value); + topologyInfo[key] = value; + + } + console.log("CompareConfigCtrl::fetchTopologyInfo::", JSON.stringify(topologyInfo)); + return topologyInfo; + } + } + } + + + + //2nd comparison for vnf id + + $scope.fetchVnfId = function(item){ + var vnfIdInfo = {}; + item = JSON.parse(item.configinfo); + var item= item['vnf-list'][0]; + if (angular.isDefined(item['vnf-id'])) { + var key=item['vnf-id']; + vnfIdInfo['vnf-id']=key; + } + console.log("CompareConfigCtrl::fetchVnfId::", JSON.stringify( vnfIdInfo)); + return vnfIdInfo; + } + + + //3rd comparison for service status + + $scope.fetchServiceStatus = function(item) { + var serviceStatusInfo = {}; + + item = JSON.parse(item.configinfo); + var item= item['vnf-list'][0]; + + if (angular.isDefined(item['service-status'])) { + var serviceStatus = item['service-status']; + if (angular.isDefined(serviceStatus)) { + angular.forEach(serviceStatus, function(value, key) { + + console.log("CompareConfigCtrl::fetchServiceStatus::key", key); + console.log("CompareConfigCtrl::fetchServiceStatus::value", value); + serviceStatusInfo[key] = value; + }); + } + } + + console.log("CompareConfigCtrl::fetchServiceStatus::", JSON.stringify(serviceStatusInfo)); + return serviceStatusInfo; + } + + // 4th comparison for vnf topology identifire + + $scope.vnfTopologyIdentifier = function(item) { + var topologyIdnetifier = {}; + item = JSON.parse(item.configinfo); + var item= item['vnf-list'][0]; + if (angular.isDefined(item['service-data']) && angular.isDefined(item['service-data']['vnf-topology-information']['vnf-topology-identifier'])) { + var topologyInfoidentifier = item['service-data']['vnf-topology-information']['vnf-topology-identifier']; + if (angular.isDefined(topologyInfoidentifier)) { + angular.forEach(topologyInfoidentifier, function(value, key) { + + console.log("CompareConfigCtrl::fetchTopologyInfo::key", key); + console.log("CompareConfigCtrl::fetchTopologyInfo::value", value); + topologyIdnetifier[key] = value; + }); + } + } + + console.log("CompareConfigCtrl::vnfTopologyIdentifier::", JSON.stringify(topologyIdnetifier)); + return topologyIdnetifier; + } + + // 5th comparison for vnf request information + + $scope.fetchVnfRequestInfo = function(item) { + var vnfRequestInfo = {}; + item = JSON.parse(item.configinfo); + var item= item['vnf-list'][0]; + if (angular.isDefined(item['service-data']) && angular.isDefined(item['service-data']['vnf-request-information'])) { + var vnfRequest = item['service-data']['vnf-request-information']; + if (angular.isDefined(vnfRequest) && vnfRequest != null) { + + angular.forEach(vnfRequest, function(value, key) { + + console.log("CompareConfigCtrl::fetchVnfRequestInfo::key", key); + console.log("CompareConfigCtrl::fetchVnfRequestInfo::value", value); + vnfRequestInfo[key] = value; + }); + } + } +console.log("CompareConfigCtrl::fetchVnfRequestInfo::", JSON.stringify(vnfRequestInfo)); + return vnfRequestInfo; + } + + // 6th comparison for service info + + + $scope.fetchServiceInfo = function(item) { + var serviceInfo = {}; + item = JSON.parse(item.configinfo); + var item= item['vnf-list'][0]; + if (angular.isDefined(item['service-data']) && angular.isDefined(item['service-data']['service-information'])) { + var service= item['service-data']['service-information']; + if (angular.isDefined(service) && service != null) { + + angular.forEach(service, function(value, key) { + + console.log("CompareConfigCtrl::fetchServiceInfo::key", key); + console.log("CompareConfigCtrl::fetchServiceInfo::value", value); + serviceInfo[key] = value; + }); + } + } + console.log("CompareConfigCtrl::fetchServiceInfo::", JSON.stringify(serviceInfo)); + return serviceInfo; + } + + // 7th comparison for sdnc request header + + $scope.serviceRequestHeader = function(item) { + var requestHeader = {}; + item = JSON.parse(item.configinfo); + var item= item['vnf-list'][0]; + if (angular.isDefined(item['service-data']) && angular.isDefined(item['service-data']['sdnc-request-header'])) { + var requestHeaderInfo = item['service-data']['sdnc-request-header']; + if (angular.isDefined(requestHeaderInfo) && requestHeaderInfo != null) { + + angular.forEach(requestHeaderInfo, function(value, key) { + + console.log("CompareConfigCtrl::serviceRequestHeader::key", key); + console.log("CompareConfigCtrl::serviceRequestHeader::value", value); + requestHeader[key] = value; + }); + + } + } + console.log("CompareConfigCtrl::serviceRequestHeader::", JSON.stringify(requestHeader)); + return requestHeader; + } + + // 8th comparison for oper status + $scope.operationStatus = function(item) { + var operationStatus = {}; + item = JSON.parse(item.configinfo); + var item= item['vnf-list'][0]; + if (angular.isDefined(item['service-data']) && angular.isDefined(item['service-data']['oper-status'])) { + var operStatus = item['service-data']['oper-status']; + if (angular.isDefined(operStatus) && operStatus != null) { + + angular.forEach(operStatus, function(value, key) { + + console.log("CompareConfigCtrl::operationStatus::key", key); + console.log("CompareConfigCtrl::operationStatus::value", value); + operationStatus[key] = value; + }); + + } + } + console.log("CompareConfigCtrl::operationStatus::", JSON.stringify(operationStatus)); + return operationStatus; + } + // 9th comparison for request info + + $scope.fetchRequestInfo = function(item) { + var requestInfo = {}; + item = JSON.parse(item.configinfo); + var item= item['vnf-list'][0]; + if (angular.isDefined(item['service-data']) && angular.isDefined(item['service-data']['request-information'])) { + var request = item['service-data']['request-information']; + if (angular.isDefined(request) && request != null) { + + angular.forEach(request, function(value, key) { + + console.log("CompareConfigCtrl::fetchRequestInfo::key", key); + console.log("CompareConfigCtrl::fetchRequestInfo::value", value); + requestInfo[key] = value; + }); + + } + } + console.log("CompareConfigCtrl::fetchRequestInfo::", JSON.stringify(requestInfo)); + return requestInfo; + } + +}]);
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-validationTest-controller.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-validationTest-controller.js new file mode 100644 index 00000000..0e80836f --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-validationTest-controller.js @@ -0,0 +1,222 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ + + +myApp.controller('TestController', ['$scope', '$http', 'growl', 'viewReportService', 'validationTestService','CERTIFICATION_API_BASE', function($scope, $http, growl, viewReportService, validationTestService,CERTIFICATION_API_BASE) { + + $scope.showTestReport = false; + + //Input data for validation test dropdown + var validationTestList = [{ + "typeId": 1, + "validationType": "Network Layer", + "Selected": false + }, + { + "typeId": 2, + "validationType": "Protocol Layer", + "Selected": false + } + ]; + + $scope.validationTestList = validationTestList; + + + $scope.getselectval = function() { + $scope.selectedvalues = 'Name: ' + $scope.selitem.validationType + ' Id: ' + $scope.selitem.typeId; + } + + $scope.showError = false; + $scope.errorMessage = ""; + $scope.showSuccess = false; + $scope.successMessage = ""; + $scope.showWarning = false; + $scope.warningMessage = ""; + $scope.showInfo = false; + $scope.infoMessage = ""; + $scope.ShowResult = false; + $scope.allowTestSelection = false; + $scope.hostNamePattern = /([a-z0-9](.[a-z0-9-]*[a-z0-9]))/; + + //Called when user clicks on runtest button + $scope.runTest = function() { + + $scope.showError = false; + $scope.vnfSelected = []; + $scope.testSelected = []; + + var message = ""; + for (var i = 0; i < $scope.validationTestList.length; i++) { + if ($scope.validationTestList[i].Selected) { + var typeId = $scope.validationTestList[i].typeId; + var validationType = $scope.validationTestList[i].validationType; + message += "typeId: " + typeId + " validationType: " + validationType + "\n"; + console.log("--TestController::Runtest--", message); + var testDetails = {}; + testDetails.typeId = typeId; + testDetails.validationType = validationType; + $scope.testSelected.push(testDetails); + } + } + console.log("--TestController::Runtest--", JSON.stringify($scope.testSelected)); + + var vnfDetails = {}; + if ($scope.IPAddress != null && $scope.HostName != null && $scope.testSelected.length >= 1) { + vnfDetails.IpAddress = $scope.IPAddress; + vnfDetails.HostName = $scope.HostName; + $scope.vnfSelected.push(vnfDetails); + console.log("--TestController::Runtest--", JSON.stringify($scope.vnfSelected)); + + //Call the validation test service with vnfselected and testType as the parameter + + validationTestService.runPretest($scope.vnfSelected, $scope.testSelected).then(function(response) { + console.log("--TestController::runTest--", JSON.stringify(response)); + + //in case of success, build the model object to store the service output here + if (response.status === 200) { + if (response.preTestResponse != null && response.preTestResponse.length >= 1) { + $scope.ShowResult = true; + $scope.createTestModel(response.preTestResponse); + $scope.showMessage(response.preTestResponse); + + } else { + console.log(response); + $scope.showError = true; + $scope.errorMessage = "Something went wrong!!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton:false + }); + } + } else { + console.log(response); + $scope.showError = true; + $scope.errorMessage = "Something went wrong!!! Please try again later"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton:false + }); + } + }, + function(response) { + console.log("--TestController--", response); + }); + } else { + $scope.showError = true; + $scope.errorMessage = "Please provide the inputs for VNF and test to be performed!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton:false + }); + } + + }; + +$scope.showMessage=function(data){ + + var iterate = true; + if(angular.isDefined(data) && data.length>=1){ + + iterate=true; + angular.forEach(data, function(value, key){ + + if(iterate=true){ + if(value.status == "unreachable"){ + console.log("--TestController::showMessage--",value.status); + $scope.showError = true; + $scope.errorMessage = "PreTest validation Failed, Please check logs for further details!!!"; + growl.error($scope.errorMessage, { + title: 'Error!', + globalDisableCloseButton:false + }); + iterate=false; + } + } + else + { + $scope.showSuccess = true; + $scope.successMessage = "Pre test validation completed!!"; + growl.success($scope.successMessage, { + title: 'Success!', + globalDisableCloseButton:false + }); + } + + }); + + } + } + + //Function to build the UI model to be shown + $scope.createTestModel = function(result) { + + $scope.showError = false; + $scope.showWarning = false; + $scope.objPreTestModel = result; + $scope.objPreTest = []; + + + if ($scope.objPreTestModel.length >= 1) { + for (var i = 0; i < $scope.objPreTestModel.length; i++) { + var objTestReport = {}; + objTestReport.ipaddress = $scope.objPreTestModel[i].ipaddress; + objTestReport.status = $scope.objPreTestModel[i].status; + objTestReport.testtype = $scope.objPreTestModel[i].testtype; + objTestReport.statistics = $scope.objPreTestModel[i].statistics; + objTestReport.avgTime = $scope.objPreTestModel[i].avgTime; + + + if ($scope.objPreTestModel[i].testtype === "Network Layer") { + if (objTestReport.statistics != null) { + //fetching the statistics to show in progress bar + + var statistics = objTestReport.statistics; + statistics = statistics.split("%"); + objTestReport.statistics = statistics[0]; + if (objTestReport.statistics == 0) { + objTestReport.statisticPer = parseInt(objTestReport.statistics) + 50; + } else + objTestReport.statisticPer = objTestReport.statistics; + } + + //fetching the avg time to show in progress bar + + if (objTestReport.avgTime != null) { + var avgTime = objTestReport.avgTime; + avgTime = avgTime.split("="); + var Testtime = avgTime[1]; + objTestReport.avgTime = Testtime.slice(0, -2).trim(); + console.log("--TestController::createTestModel--", objTestReport.avgTime); + if (objTestReport.avgTime < 50) { + objTestReport.avgTimePer = parseInt(objTestReport.avgTime) + 10; + } else + objTestReport.avgTimePer = objTestReport.avgTime; + + } + } + $scope.objPreTest.push(objTestReport); + console.log("--TestController::createTestModel--", JSON.stringify($scope.objPreTest)); + } + } + console.log("--TestController::createTestModel::final PreTestModel--" + JSON.stringify($scope.objPreTest)); + + } + +}]);
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-viewreport-controller.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-viewreport-controller.js new file mode 100644 index 00000000..951ac5d5 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-controller/sdnc-viewreport-controller.js @@ -0,0 +1,519 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ + +myApp.controller( + 'ReportController', + [ + '$scope', + '$http', + '$filter', + 'viewReportService', + 'growl', + function($scope, $http, $filter, viewReportService, + growl) { + $scope.isDisabled = true; + $scope.pagination = false; + $scope.selectedDevice; + $scope.ShowResult = false; + $scope.dateValidation = false; + $scope.NoSearchResult = false; + $scope.showError = false; + $scope.errorMessage = ""; + $scope.showSuccess = false; + $scope.successMessage = ""; + $scope.showWarning = false; + $scope.warningMessage = ""; + $scope.showExecutionDetails = true; + $scope.showData = false; + + $scope.gap = 2; + $scope.filteredItems = []; + $scope.groupedItems = []; + $scope.itemsPerPage = 5; + $scope.pagedItems = []; + $scope.currentPage = 0; + + // THIS FUNCTION WILL BE CALLED ON PAGE LOAD + $scope.getAllVNF = function() { + + viewReportService + .getAllVNF() + .then( + function(data) { + if (data != null) { + console.log(data); + $scope.objvnfList = data; + console + .log("ViewConfigCtrl:getAllVNF called" + + $scope.objvnfList); + } else { + $scope.warningMessage = "No VNF is eligible for configuration!!!"; + growl + .error( + $scope.warningMessage, + { + title : 'Warning!', + globalDisableCloseButton : false, + ttl : 7000, + disableCountDown : true + }); + } + }); + }; + $scope.getAllVNF(); + + $scope.selectVnf = function(selectedValueVnf) { + + if (selectedValueVnf != null + && selectedValueVnf != "") { + console.log("selectedvnf Value", + selectedValueVnf); + var vnfId = selectedValueVnf; + $scope.ShowResult = true; + + } else { + $scope.ShowResult = false; + $scope.showCompare = false; + $scope.showResult = false; + $scope.errorMessage = "Please select a VNF!!!"; + growl.error($scope.errorMessage, { + title : 'Error!', + globalDisableCloseButton : false, + ttl : 7000, + disableCountDown : true + }); + } + } + + // THIS FUNCTION WILL BE CALLED WHEN USER CLICK + // SUBMIT FROM UI + $scope.getReportsById = function(selectedValueVnf, + startdate, enddate) { + + $scope.ShowResult = true; + if (new Date(startdate) > new Date(enddate)) { + $scope.dateValidation = true; + $scope.showError = true; + $scope.errorMessage = "Start date cannot be greated than End date"; + growl.error($scope.errorMessage, { + title : 'Error!', + globalDisableCloseButton : false, + ttl : 7000, + disableCountDown : true + }); + return false; + } + var date = new Date(startdate); + if (angular.isDefined(startdate)) { + $scope.startDate = startdate; + } + if (angular.isDefined(enddate)) { + $scope.endDate = enddate; + } + + $scope.startdate1 = $filter('date')( + $scope.startDate, 'dd-MM-yyyy'); + $scope.enddate1 = $filter('date')( + $scope.endDate, 'dd-MM-yyyy'); + if (startdate != null && enddate != null) { + + // service call to fetch the reports start + // date,end date,test name + viewReportService + .getDataById(selectedValueVnf, + $scope.startdate1, + $scope.enddate1) + .then( + function(result) { + console + .log( + "-----------------------------------ReportController::getdata called from controler--", + JSON + .stringify(result.data)); + if (result.status == 200) { + if (result.data != null + && result.data.length >= 1) { + + // in case of + // success, + // build the + // model object + // to store the + // service + // output here + $scope + .createTestReportModel(result.data);// result.data.data + } else { + $scope.ShowResult = false; + $scope.showWarning = true; + $scope.warningMessage = "No result found for specified Date !!"; + growl + .warning( + $scope.warningMessage, + { + title : 'Warning!', + globalDisableCloseButton : false, + ttl : 7000, + disableCountDown : true + }); + } + } else { + $scope.ShowResult = false; + $scope.showWarning = true; + $scope.warningMessage = "No result found for specified Date !!"; + growl + .warning( + $scope.warningMessage, + { + title : 'Warning!', + globalDisableCloseButton : false, + ttl : 7000, + disableCountDown : true + }); + } + }, + function(response) { + $scope.ShowError = true; + $scope.errorMessage = "Something went wrong, Please try again !!"; + growl + .error( + $scope.errorMessage, + { + title : 'Error!', + globalDisableCloseButton : false, + ttl : 7000, + disableCountDown : true + }); + console + .log( + "--ReportController::getdata::Error--", + response); + }); + } + } + + // FUNCTION WILL BE CALLED WHEN USER CLICK DOWNLOAD + // FROM UI + $scope.exportToExcel = function(tableId) { // ex: + // '#my-table' + var exportHref = Excel.tableToExcel(tableId, + 'export'); + $timeout(function() { + location.href = exportHref; + }, 100); // trigger download + + console + .log("--ReportController::exportToexcel--"); + } + + $scope.createTestReportModel = function(result) { + + $scope.showError = false; + $scope.showWarning = false; + $scope.objTestReportModel = result; + $scope.objTestModel = []; + + if ($scope.objTestReportModel.length >= 1) { + for (var i = 0; i < $scope.objTestReportModel.length; i++) { + var objTestReport = {}; + objTestReport.vnfname = $scope.objTestReportModel[i].vnfname; + objTestReport.vnfid = $scope.objTestReportModel[i].vnfid; + objTestReport.versionNo = $scope.objTestReportModel[i].vnfversion; + objTestReport.createdAt = $scope.objTestReportModel[i].creationdate; + objTestReport.updatedAt = $scope.objTestReportModel[i].lastupdated; + objTestReport.status = $scope.objTestReportModel[i].status; + objTestReport.Id = $scope.objTestReportModel[i].id; + // objTestReport.configinfo = + // $scope.objVersionModel[i].configinfo; + $scope.objTestModel.push(objTestReport); + console + .log( + "--ReportController::CreateTestReportModel--", + JSON + .stringify($scope.objTestModel)); + + } + $scope.showresult = true; + $scope.pagination = true; + } + console + .log("--ReportController::createTestReportModel::final TestReportModel--" + + JSON + .stringify($scope.objTestModel)); + $scope.csvOrder = [ 'testname', 'timeStamp', + 'status', 'statistics', 'avgTime', + 'result' ]; + + } + + // THIS FUNCTION WILL BE CALLED WHEN USER CLICK + // SUBMIT FROM UI + $scope.getReports = function(startdate, enddate) { + + $scope.ShowResult = false; + if (new Date(startdate) > new Date(enddate)) { + $scope.dateValidation = true; + $scope.showError = true; + $scope.errorMessage = "Start date cannot be greated than End date"; + growl.error($scope.errorMessage, { + title : 'Error!', + globalDisableCloseButton : false, + ttl : 7000, + disableCountDown : true + }); + return false; + } + var date = new Date(startdate); + /* + * if (angular.isDefined(deviceName)) { + * $scope.DeviceName = deviceName; } + */ + if (angular.isDefined(startdate)) { + $scope.startDate = startdate; + } + if (angular.isDefined(enddate)) { + $scope.endDate = enddate; + } + + $scope.startdate1 = $filter('date')( + $scope.startDate, 'dd-MM-yyyy'); + $scope.enddate1 = $filter('date')( + $scope.endDate, 'dd-MM-yyyy'); + if (startdate != null && enddate != null) { + + // service call to fetch the reports start + // date,end date,test name + viewReportService + .getData($scope.startdate1, + $scope.enddate1) + .then( + function(result) { + console + .log( + "-----------------------------------ReportController::getdata called from controler--", + JSON + .stringify(result.data)); + if (result.status == 200) { + if (result.data != null + && result.data.length >= 1) { + + // in case of + // success, + // build the + // model object + // to store the + // service + // output here + $scope + .createTestReportModel(result.data);// result.data.data + } else { + $scope.ShowResult = false; + $scope.showWarning = true; + $scope.warningMessage = "No result found for specified Date !!"; + growl + .warning( + $scope.warningMessage, + { + title : 'Warning!', + globalDisableCloseButton : false, + ttl : 7000, + disableCountDown : true + }); + } + } else { + $scope.ShowResult = false; + $scope.showWarning = true; + $scope.warningMessage = "No result found for specified Date !!"; + growl + .warning( + $scope.warningMessage, + { + title : 'Warning!', + globalDisableCloseButton : false, + ttl : 7000, + disableCountDown : true + }); + } + }, + function(response) { + $scope.ShowError = true; + $scope.errorMessage = "Something went wrong, Please try again !!"; + growl + .error( + $scope.errorMessage, + { + title : 'Error!', + globalDisableCloseButton : false, + ttl : 7000, + disableCountDown : true + }); + console + .log( + "--ReportController::getdata::Error--", + response); + }); + } + } + + // FUNCTION WILL BE CALLED WHEN USER CLICK DOWNLOAD + // FROM UI + $scope.exportToExcel = function(tableId) { // ex: + // '#my-table' + var exportHref = Excel.tableToExcel(tableId, + 'export'); + $timeout(function() { + location.href = exportHref; + }, 100); // trigger download + + console + .log("--ReportController::exportToexcel--"); + } + + $scope.createTestReportModel = function(result) { + + $scope.showError = false; + $scope.showWarning = false; + $scope.objTestReportModel = result; + $scope.objTestModel = []; + + if ($scope.objTestReportModel.length >= 1) { + for (var i = 0; i < $scope.objTestReportModel.length; i++) { + var objTestReport = {}; + objTestReport.vnfname = $scope.objTestReportModel[i].vnfname; + objTestReport.vnfid = $scope.objTestReportModel[i].vnfid; + objTestReport.versionNo = $scope.objTestReportModel[i].vnfversion; + objTestReport.createdAt = $scope.objTestReportModel[i].creationdate; + objTestReport.updatedAt = $scope.objTestReportModel[i].lastupdated; + objTestReport.status = $scope.objTestReportModel[i].status; + objTestReport.Id = $scope.objTestReportModel[i].id; + // objTestReport.configinfo = + // $scope.objVersionModel[i].configinfo; + $scope.objTestModel.push(objTestReport); + console + .log( + "--ReportController::CreateTestReportModel--", + JSON + .stringify($scope.objTestModel)); + + } + $scope.showresult = true; + $scope.pagination = true; + } + console + .log("--ReportController::createTestReportModel::final TestReportModel--" + + JSON + .stringify($scope.objTestModel)); + $scope.csvOrder = [ 'testname', 'timeStamp', + 'status', 'statistics', 'avgTime', + 'result' ]; + + // init + $scope.sort = { + sortingOrder : 'createdAt', + reverse : false + }; + + var searchMatch = function(haystack, needle) { + if (!needle) { + return true; + } + return haystack.toLowerCase().indexOf( + needle.toLowerCase()) !== -1; + }; + + // init the filtered items + $scope.search = function() { + $scope.filteredItems = $filter('filter')( + $scope.objTestModel, + function(item) { + for ( var attr in item) { + if (searchMatch(item[attr], + $scope.query)) + return true; + } + return false; + }); + // take care of the sorting order + if ($scope.sort.sortingOrder !== '') { + $scope.filteredItems = $filter( + 'orderBy')( + $scope.filteredItems, + $scope.sort.sortingOrder, + $scope.sort.reverse); + } + $scope.currentPage = 0; + // now group by pages + $scope.groupToPages(); + }; + + // calculate page in place + $scope.groupToPages = function() { + $scope.pagedItems = []; + + for (var i = 0; i < $scope.filteredItems.length; i++) { + if (i % $scope.itemsPerPage === 0) { + $scope.pagedItems[Math.floor(i + / $scope.itemsPerPage)] = [ $scope.filteredItems[i] ]; + } else { + $scope.pagedItems[Math.floor(i + / $scope.itemsPerPage)] + .push($scope.filteredItems[i]); + } + } + }; + + $scope.range = function(size, start, end) { + var ret = []; + console.log(size, start, end); + + if (size < end) { + end = size; + start = size - $scope.gap; + } + for (var i = start; i < end; i++) { + ret.push(i); + } + console.log(ret); + return ret; + }; + + $scope.prevPage = function() { + if ($scope.currentPage > 0) { + $scope.currentPage--; + } + }; + + $scope.nextPage = function() { + if ($scope.currentPage < $scope.pagedItems.length - 1) { + $scope.currentPage++; + } + }; + + $scope.setPage = function() { + $scope.currentPage = this.n; + }; + + // functions have been describe process the data + // for display + $scope.search(); + + } + + } ]);
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-services/sdnc-compareConfig-service.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-services/sdnc-compareConfig-service.js new file mode 100644 index 00000000..7b5c688e --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-services/sdnc-compareConfig-service.js @@ -0,0 +1,166 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ +myApp.service('deviceConfigService', ['$http','VNF_API_BASE', function($http, VNF_API_BASE) { + + + this.getAllVNFFromRc = function() { + var rctestlist = {}; + return $http.get('/getAllBackupVnfIds') + .then(function(response) { + console.log("---validationTestService::getAllVNF From Restconf::TestResponse---" + JSON.stringify(response)); + vnflist = response.data; + return vnflist; + }, + function(response) { + console.log("validationTestService::getAllVNF From Restconf::Status Code", response.status); + return response; + }); + + }; + + + this.getAllVNF = function() { + var testlist = {}; + return $http.get('/getAllBackupVnfIds') + .then(function(response) { + console.log("---validationTestService::getAllVNF::TestResponse---" + JSON.stringify(response)); + vnflist = response.data; + return vnflist; + }, + function(response) { + console.log("validationTestService::getAllVNF::Status Code", response.status); + return response; + }); + + }; + + this.getVersions = function(vnfId) { + + var data = {}; +// data.selectedVnfName = vnfName; +// data.selectedVnfType = vnfType; + data.vnfId = vnfId; + var config = { + params: data, + headers: { + 'Accept': 'application/json' + } + }; + + console.log("deviceConfigService::getVersions::config", JSON.stringify(config)); + + var baseUrl = VNF_API_BASE; + // var baseApi='runtest'; + // var apiUrl= baseUrl + baseApi; + + // Call the pre validation service + var request = { + method: 'GET', + url: '/configDetailsById/'+vnfId, + //url: 'sdnc-stubs/getAllConfigForVNF.json', + //data: data, + + headers: { + 'Content-Type': 'application/json', + } + }; + + return $http(request) + .then(function(response) { + console.log("---deviceConfigService::getVersions::Response---" + JSON.stringify(response)); + return response; + }, + function(response) { + console.log("--deviceConfigService::getVersions::Status Code--", response.status); + return response; + }); + + + } + + this.invokeBackup = function() { + var testlist = {}; + return $http.get('/backup') + .then(function(response) { + console.log("---validationTestService::getAllVNF::TestResponse---" + response); + vnflist = response; + return vnflist; + }, + function(response) { + console.log("validationTestService::getAllVNF::Status Code", response); + return response; + }); + + }; + + this.getlastupdated = function() { + var testlist = {}; + return $http.get('/backuptime') + .then(function(response) { + console.log("---validationTestService::getBackuptime::---" + response); + return response; + }) + + }; + + this.runApplyconfig = function(vnfid, newConfig) { + + + + var url='/vnf-list/'+vnfid; + + + + var config = { + headers : { + 'Content-Type': 'application/json' + } + } + + $http.put(url, newConfig, config) + .success(function(newConfig) { + console.log("---validationTestService::getAllVNF::TestResponse---" ,response); + + return newConfig; + }, + function(newConfig) { + console.log("validationTestService::getAllVNF::Status Code", response); + return newConfig; + }); + /*.then(function (response) { + if (response.data) + { $scope.successMessage1 = "Put Data Method Executed Successfully!"; + return response; + } + var status= response.status; + if (status == 200){ + $window.alert("applyed successfully "); + } + var successMessage1 = "Put Data Method Executed Successfully!"; + }, + function (response) { + var successMessage1 = "Service not Exists"; + }); + + */ + }; + + +}]);
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-services/sdnc-validationTest-service.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-services/sdnc-validationTest-service.js new file mode 100644 index 00000000..36c916c5 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-services/sdnc-validationTest-service.js @@ -0,0 +1,66 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +myApp.service('validationTestService', ['$http','CERTIFICATION_API_BASE', function($http,CERTIFICATION_API_BASE) { + + this.runPretest = function(vnfList, validationTestType) { + + + var data = {}; + data.vnfList = vnfList; + data.validationTestType = validationTestType; + + var config = { + params: data, + headers: { + 'Accept': 'application/json' + } + }; + + console.log("validationTestService::runPretest::config", JSON.stringify(config)); + + var baseUrl = CERTIFICATION_API_BASE; + var baseApi='runtest'; + var apiUrl= baseUrl + baseApi; + + // Call the pre validation service + var request = { + method: 'POST', + url: apiUrl, + data: data, + headers: { + 'Content-Type': undefined + } + }; + + // // SEND VNF FOR VALIDATION + return $http(request) + .then(function(response) { + console.log("---validationTestService::runPretest::Response---" + JSON.stringify(response)); + return response.data; + }, + function(response) { + console.log("--validationTestService::Status Code--", response.status); + return response; + }); + + + } + +}]);
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-services/sdnc-viewReport-service.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-services/sdnc-viewReport-service.js new file mode 100644 index 00000000..82ab83aa --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/js/sdnc-services/sdnc-viewReport-service.js @@ -0,0 +1,101 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ + +myApp.service('viewReportService', ['$http', function($http) { + +this.getAllVNF = function() { + var testlist = {}; + return $http.get('/getAllBackupVnfIds') + .then(function(response) { + console.log("---validationTestService::getAllVNF::TestResponse---" + JSON.stringify(response)); + vnflist = response.data; + return vnflist; + }, + function(response) { + console.log("validationTestService::getAllVNF::Status Code", response.status); + return response; + }); + + }; + + this.getData = function(startDate, endDate) { + + var data = {}; + if (startDate != null && endDate != null) { + + data.startdate = startDate; + data.enddate = endDate; + + } + var request = { + method: 'GET', + url: '/getVnfDetBetDates/'+startDate+'/'+endDate+'/', + + headers: { + 'Content-Type': 'application/json', + } + }; + + return $http(request) + .then(function(response) { + console.log("---deviceConfigService::getVersions::Response---" + JSON.stringify(response)); + return response; + }, + function(response) { + console.log("--deviceConfigService::getVersions::Status Code--", response.status); + return response; + }); + + } + + + this.getDataById = function(selectedValueVnf,startDate, endDate) { + + var data = {}; + if (startDate != null && endDate != null) { + + data.startdate = startDate; + data.enddate = endDate; + + } + var request = { + method: 'GET', + url: '/getVnfDetByVnfidBetDates/'+selectedValueVnf+'/'+startDate+'/'+endDate+'/', + + headers: { + 'Content-Type': 'application/json', + } + }; + + return $http(request) + .then(function(response) { + console.log("---deviceConfigService::getVersions::Response---" + JSON.stringify(response)); + return response; + }, + function(response) { + console.log("--deviceConfigService::getVersions::Status Code--", response.status); + return response; + }); + + } + + + +}]);
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl-v2/build/angular-growl.css b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl-v2/build/angular-growl.css new file mode 100644 index 00000000..3fcd12db --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl-v2/build/angular-growl.css @@ -0,0 +1,88 @@ +/** + * angular-growl-v2 - v0.7.5 - 2015-06-17 + * http://janstevens.github.io/angular-growl-2 + * Copyright (c) 2015 Marco Rinck,Jan Stevens; Licensed MIT + */ +/* + * growl-container styles + */ +/* + * growl-item styles + */ +.growl-container > .growl-item { + padding: 10px; + padding-right: 35px; + margin-bottom: 10px; + cursor: pointer; +} + +.growl-container > button { + border: none; + outline:none; +} +.growl-container > .growl-item.ng-enter, +.growl-container > .growl-item.ng-leave { + -webkit-transition:0.5s linear all; + -moz-transition:0.5s linear all; + -o-transition:0.5s linear all; + transition:0.5s linear all; +} + +.growl-container > .growl-item.ng-enter, +.growl-container > .growl-item.ng-leave.ng-leave-active { + opacity:0; +} +.growl-container > .growl-item.ng-leave, +.growl-container > .growl-item.ng-enter.ng-enter-active { + opacity:1; +} + +.growl-container > div.growl-item { + background-position: 12px center; + background-repeat: no-repeat; +} + +/* + * growl-title styles + */ +.growl-title { + font-size: 16px; +} +.growl-item.icon > .growl-title { + margin: 0 0 0 40px; +} + +/* + * growl-message styles + */ +.growl-item.icon > .growl-message { + margin: 0 0 0 40px; +} + +/* + * growl background images + */ +.growl-container > .alert-info.icon { + /* for the white images + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII="); + */ + background-image: url("data:image/png;base64,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"); +} +.growl-container > .alert-error.icon { + /* for the white images + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII="); + */ + background-image: url("data:image/png;base64,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"); +} +.growl-container > .alert-success.icon { + /* for the white images + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg=="); + */ + background-image: url("data:image/png;base64,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"); +} +.growl-container > .alert-warning.icon { + /* for the white images + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII="); + */ + background-image: url("data:image/png;base64,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"); +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl-v2/build/angular-growl.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl-v2/build/angular-growl.js new file mode 100644 index 00000000..2bc3e956 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl-v2/build/angular-growl.js @@ -0,0 +1,419 @@ +/** + * angular-growl-v2 - v0.7.5 - 2015-06-17 + * http://janstevens.github.io/angular-growl-2 + * Copyright (c) 2015 Marco Rinck,Jan Stevens; Licensed MIT + */ +angular.module('angular-growl', []); +angular.module('angular-growl').directive('growl', [function () { + 'use strict'; + return { + restrict: 'A', + templateUrl: 'templates/growl/growl.html', + replace: false, + scope: { + reference: '@', + inline: '=', + limitMessages: '=' + }, + controller: [ + '$scope', + '$timeout', + 'growl', + 'growlMessages', + function ($scope, $timeout, growl, growlMessages) { + $scope.referenceId = $scope.reference || 0; + growlMessages.initDirective($scope.referenceId, $scope.limitMessages); + $scope.growlMessages = growlMessages; + $scope.inlineMessage = angular.isDefined($scope.inline) ? $scope.inline : growl.inlineMessages(); + $scope.$watch('limitMessages', function (limitMessages) { + var directive = growlMessages.directives[$scope.referenceId]; + if (!angular.isUndefined(limitMessages) && !angular.isUndefined(directive)) { + directive.limitMessages = limitMessages; + } + }); + $scope.stopTimeoutClose = function (message) { + if (!message.clickToClose) { + angular.forEach(message.promises, function (promise) { + $timeout.cancel(promise); + }); + if (message.close) { + growlMessages.deleteMessage(message); + } else { + message.close = true; + } + } + }; + $scope.alertClasses = function (message) { + return { + 'alert-success': message.severity === 'success', + 'alert-error': message.severity === 'error', + 'alert-danger': message.severity === 'error', + 'alert-info': message.severity === 'info', + 'alert-warning': message.severity === 'warning', + 'icon': message.disableIcons === false, + 'alert-dismissable': !message.disableCloseButton + }; + }; + $scope.showCountDown = function (message) { + return !message.disableCountDown && message.ttl > 0; + }; + $scope.wrapperClasses = function () { + var classes = {}; + classes['growl-fixed'] = !$scope.inlineMessage; + classes[growl.position()] = true; + return classes; + }; + $scope.computeTitle = function (message) { + var ret = { + 'success': 'Success', + 'error': 'Error', + 'info': 'Information', + 'warn': 'Warning' + }; + return ret[message.severity]; + }; + } + ] + }; + }]); +angular.module('angular-growl').run([ + '$templateCache', + function ($templateCache) { + 'use strict'; + if ($templateCache.get('templates/growl/growl.html') === undefined) { + $templateCache.put('templates/growl/growl.html', '<div class="growl-container" ng-class="wrapperClasses()">' + '<div class="growl-item alert" ng-repeat="message in growlMessages.directives[referenceId].messages" ng-class="alertClasses(message)" ng-click="stopTimeoutClose(message)">' + '<button type="button" class="close" data-dismiss="alert" aria-hidden="true" ng-click="growlMessages.deleteMessage(message)" ng-show="!message.disableCloseButton">×</button>' + '<button type="button" class="close" aria-hidden="true" ng-show="showCountDown(message)">{{message.countdown}}</button>' + '<h4 class="growl-title" ng-show="message.title" ng-bind="message.title"></h4>' + '<div class="growl-message" ng-bind-html="message.text"></div>' + '</div>' + '</div>'); + } + } +]); +angular.module('angular-growl').provider('growl', function () { + 'use strict'; + var _ttl = { + success: null, + error: null, + warning: null, + info: null + }, _messagesKey = 'messages', _messageTextKey = 'text', _messageTitleKey = 'title', _messageSeverityKey = 'severity', _onlyUniqueMessages = true, _messageVariableKey = 'variables', _referenceId = 0, _inline = false, _position = 'top-right', _disableCloseButton = false, _disableIcons = false, _reverseOrder = false, _disableCountDown = false, _translateMessages = true; + this.globalTimeToLive = function (ttl) { + if (typeof ttl === 'object') { + for (var k in ttl) { + if (ttl.hasOwnProperty(k)) { + _ttl[k] = ttl[k]; + } + } + } else { + for (var severity in _ttl) { + if (_ttl.hasOwnProperty(severity)) { + _ttl[severity] = ttl; + } + } + } + return this; + }; + this.globalTranslateMessages = function (translateMessages) { + _translateMessages = translateMessages; + return this; + }; + this.globalDisableCloseButton = function (disableCloseButton) { + _disableCloseButton = disableCloseButton; + return this; + }; + this.globalDisableIcons = function (disableIcons) { + _disableIcons = disableIcons; + return this; + }; + this.globalReversedOrder = function (reverseOrder) { + _reverseOrder = reverseOrder; + return this; + }; + this.globalDisableCountDown = function (countDown) { + _disableCountDown = countDown; + return this; + }; + this.messageVariableKey = function (messageVariableKey) { + _messageVariableKey = messageVariableKey; + return this; + }; + this.globalInlineMessages = function (inline) { + _inline = inline; + return this; + }; + this.globalPosition = function (position) { + _position = position; + return this; + }; + this.messagesKey = function (messagesKey) { + _messagesKey = messagesKey; + return this; + }; + this.messageTextKey = function (messageTextKey) { + _messageTextKey = messageTextKey; + return this; + }; + this.messageTitleKey = function (messageTitleKey) { + _messageTitleKey = messageTitleKey; + return this; + }; + this.messageSeverityKey = function (messageSeverityKey) { + _messageSeverityKey = messageSeverityKey; + return this; + }; + this.onlyUniqueMessages = function (onlyUniqueMessages) { + _onlyUniqueMessages = onlyUniqueMessages; + return this; + }; + this.serverMessagesInterceptor = [ + '$q', + 'growl', + function ($q, growl) { + function checkResponse(response) { + if (response !== undefined && response.data && response.data[_messagesKey] && response.data[_messagesKey].length > 0) { + growl.addServerMessages(response.data[_messagesKey]); + } + } + return { + 'response': function (response) { + checkResponse(response); + return response; + }, + 'responseError': function (rejection) { + checkResponse(rejection); + return $q.reject(rejection); + } + }; + } + ]; + this.$get = [ + '$rootScope', + '$interpolate', + '$sce', + '$filter', + '$timeout', + 'growlMessages', + function ($rootScope, $interpolate, $sce, $filter, $timeout, growlMessages) { + var translate; + growlMessages.onlyUnique = _onlyUniqueMessages; + growlMessages.reverseOrder = _reverseOrder; + try { + translate = $filter('translate'); + } catch (e) { + } + function broadcastMessage(message) { + if (translate && message.translateMessage) { + message.text = translate(message.text, message.variables) || message.text; + message.title = translate(message.title) || message.title; + } else { + var polation = $interpolate(message.text); + message.text = polation(message.variables); + } + var addedMessage = growlMessages.addMessage(message); + $rootScope.$broadcast('growlMessage', message); + $timeout(function () { + }, 0); + return addedMessage; + } + function sendMessage(text, config, severity) { + var _config = config || {}, message; + message = { + text: text, + title: _config.title, + severity: severity, + ttl: _config.ttl || _ttl[severity], + variables: _config.variables || {}, + disableCloseButton: _config.disableCloseButton === undefined ? _disableCloseButton : _config.disableCloseButton, + disableIcons: _config.disableIcons === undefined ? _disableIcons : _config.disableIcons, + disableCountDown: _config.disableCountDown === undefined ? _disableCountDown : _config.disableCountDown, + position: _config.position || _position, + referenceId: _config.referenceId || _referenceId, + translateMessage: _config.translateMessage === undefined ? _translateMessages : _config.translateMessage, + destroy: function () { + growlMessages.deleteMessage(message); + }, + setText: function (newText) { + message.text = $sce.trustAsHtml(String(newText)); + }, + onclose: _config.onclose, + onopen: _config.onopen + }; + return broadcastMessage(message); + } + function warning(text, config) { + return sendMessage(text, config, 'warning'); + } + function error(text, config) { + return sendMessage(text, config, 'error'); + } + function info(text, config) { + return sendMessage(text, config, 'info'); + } + function success(text, config) { + return sendMessage(text, config, 'success'); + } + function general(text, config, severity) { + severity = (severity || 'error').toLowerCase(); + return sendMessage(text, config, severity); + } + function addServerMessages(messages) { + if (!messages || !messages.length) { + return; + } + var i, message, severity, length; + length = messages.length; + for (i = 0; i < length; i++) { + message = messages[i]; + if (message[_messageTextKey]) { + severity = (message[_messageSeverityKey] || 'error').toLowerCase(); + var config = {}; + config.variables = message[_messageVariableKey] || {}; + config.title = message[_messageTitleKey]; + sendMessage(message[_messageTextKey], config, severity); + } + } + } + function onlyUnique() { + return _onlyUniqueMessages; + } + function reverseOrder() { + return _reverseOrder; + } + function inlineMessages() { + return _inline; + } + function position() { + return _position; + } + return { + warning: warning, + error: error, + info: info, + success: success, + general: general, + addServerMessages: addServerMessages, + onlyUnique: onlyUnique, + reverseOrder: reverseOrder, + inlineMessages: inlineMessages, + position: position + }; + } + ]; +}); +angular.module('angular-growl').service('growlMessages', [ + '$sce', + '$timeout', + function ($sce, $timeout) { + 'use strict'; + var self = this; + this.directives = {}; + var preloadDirectives = {}; + function preLoad(referenceId) { + var directive; + if (preloadDirectives[referenceId]) { + directive = preloadDirectives[referenceId]; + } else { + directive = preloadDirectives[referenceId] = { messages: [] }; + } + return directive; + } + function directiveForRefId(referenceId) { + var refId = referenceId || 0; + return self.directives[refId] || preloadDirectives[refId]; + } + this.initDirective = function (referenceId, limitMessages) { + if (preloadDirectives[referenceId]) { + this.directives[referenceId] = preloadDirectives[referenceId]; + this.directives[referenceId].limitMessages = limitMessages; + } else { + this.directives[referenceId] = { + messages: [], + limitMessages: limitMessages + }; + } + return this.directives[referenceId]; + }; + this.getAllMessages = function (referenceId) { + referenceId = referenceId || 0; + var messages; + if (directiveForRefId(referenceId)) { + messages = directiveForRefId(referenceId).messages; + } else { + messages = []; + } + return messages; + }; + this.destroyAllMessages = function (referenceId) { + var messages = this.getAllMessages(referenceId); + for (var i = messages.length - 1; i >= 0; i--) { + messages[i].destroy(); + } + var directive = directiveForRefId(referenceId); + if (directive) { + directive.messages = []; + } + }; + this.addMessage = function (message) { + var directive, messages, found, msgText; + if (this.directives[message.referenceId]) { + directive = this.directives[message.referenceId]; + } else { + directive = preLoad(message.referenceId); + } + messages = directive.messages; + if (this.onlyUnique) { + angular.forEach(messages, function (msg) { + msgText = $sce.getTrustedHtml(msg.text); + if (message.text === msgText && message.severity === msg.severity && message.title === msg.title) { + found = true; + } + }); + if (found) { + return; + } + } + message.text = $sce.trustAsHtml(String(message.text)); + if (message.ttl && message.ttl !== -1) { + message.countdown = message.ttl / 1000; + message.promises = []; + message.close = false; + message.countdownFunction = function () { + if (message.countdown > 1) { + message.countdown--; + message.promises.push($timeout(message.countdownFunction, 1000)); + } else { + message.countdown--; + } + }; + } + if (angular.isDefined(directive.limitMessages)) { + var diff = messages.length - (directive.limitMessages - 1); + if (diff > 0) { + messages.splice(directive.limitMessages - 1, diff); + } + } + if (this.reverseOrder) { + messages.unshift(message); + } else { + messages.push(message); + } + if (typeof message.onopen === 'function') { + message.onopen(); + } + if (message.ttl && message.ttl !== -1) { + var self = this; + message.promises.push($timeout(angular.bind(this, function () { + self.deleteMessage(message); + }), message.ttl)); + message.promises.push($timeout(message.countdownFunction, 1000)); + } + return message; + }; + this.deleteMessage = function (message) { + var messages = this.getAllMessages(message.referenceId), index = messages.indexOf(message); + if (index > -1) { + messages[index].close = true; + messages.splice(index, 1); + } + if (typeof message.onclose === 'function') { + message.onclose(); + } + }; + } +]);
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl-v2/build/angular-growl.min.css b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl-v2/build/angular-growl.min.css new file mode 100644 index 00000000..0de520b3 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl-v2/build/angular-growl.min.css @@ -0,0 +1,7 @@ +/** + * angular-growl-v2 - v0.7.5 - 2015-06-17 + * http://janstevens.github.io/angular-growl-2 + * Copyright (c) 2015 Marco Rinck,Jan Stevens; Licensed MIT + */ + +.growl-container.growl-fixed{position:fixed;float:right;width:90%;max-width:400px;z-index:9999}.growl-container.growl-fixed.top-right{top:10px;right:15px}.growl-container.growl-fixed.bottom-right{bottom:10px;right:15px}.growl-container.growl-fixed.middle-right{top:49%;right:15px}.growl-container.growl-fixed.top-left{top:10px;left:15px}.growl-container.growl-fixed.bottom-left{bottom:10px;left:15px}.growl-container.growl-fixed.middle-left{top:49%;left:15px}.growl-container.growl-fixed.top-center{top:10px;left:50%;margin-left:-200px}.growl-container.growl-fixed.bottom-center{bottom:10px;left:50%;margin-left:-200px}.growl-container.growl-fixed.middle-center{top:49%;left:50%;margin-left:-200px}.growl-container>.growl-item{padding:10px;padding-right:35px;margin-bottom:10px;cursor:pointer}.growl-container>button{border:0;outline:0}.growl-container>.growl-item.ng-enter,.growl-container>.growl-item.ng-leave{-webkit-transition:.5s linear all;-moz-transition:.5s linear all;-o-transition:.5s linear all;transition:.5s linear all}.growl-container>.growl-item.ng-enter,.growl-container>.growl-item.ng-leave.ng-leave-active{opacity:0}.growl-container>.growl-item.ng-leave,.growl-container>.growl-item.ng-enter.ng-enter-active{opacity:1}.growl-container>div.growl-item{background-position:12px center;background-repeat:no-repeat}.growl-title{font-size:16px}.growl-item.icon>.growl-title{margin:0 0 0 40px}.growl-item.icon>.growl-message{margin:0 0 0 40px}.growl-container>.alert-info.icon{background-image:url("data:image/png;base64,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")}.growl-container>.alert-error.icon{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAwBJREFUeNqsll1IU2EYx5+zj7Ozdo477sOPuZiJ+Nlm2CRZ6yJKJcGICDRvEjY2+rg0EIkuxLzRC+lGEUZGRJd1EQahoikUiBVZF64hzAYqhlvbztzZOdvpavNsunOm9b96X97nfX7P877ned6DcBwHCIKAkNY8HlMkEHge9vutusbGSUyrfXS2ry8OIuI4DpB8gDWPx8RQVHd8b69rZ3X1IkNRGSOUIFKaurqfp0pK3spx/F2T2z0nCFgaHPzBJZNokqZVSZpWJsJhFbW9LYcCJVepOFV5eUSmVFJShYJi9/eJFMMork5MFMsAAP5sbNTs7+7KxBzJMIxj4/FD6TIUhYR8viIAKMpdkwAAKNTqmJBjRCqFM52dkzdnZiR1PT2XNPX1vwvNTgIAIJHJWCGjIpMp2tLffxcAwOJyLWtqa0fFHEtR9AAgx/E9wShyA0CQhBgAVatZfgYx+M9CCSKeAcgwbFfIOB4M4scG4HgoA0DV6gUh4xTDSPjzJE1XiQGUOt3XAwCOvxAypkOhLECKZXUF1MbnDMDscPjxioq4WLvgZWAQBRDEywwAAAA3GjcEj4llG9NjNhYrE7Ilq6vDFqfTmwVQarVzQpsSkUhXZhyNakUAbzLVz7uUxwqSvJ973mkFvd7eldFReZKmjZvz8zqhqsc0mieZOb+bfhwamv21sHDlX75/vcUSuDw+fjrdTbOiVRkM99IlfhJJURS0DQ23D/WitCxOp7fUav1y1ObimpqQqb39lcFm+yLDMO4om/LW1mWLy7WcFwAAoK6svKbU69ncyMpaWs5dGBjotQ8PNxtstve5+zCNJkkYjbeO7KZ8mZ3OnQq7/WFW5SYSwFBUNwDA9+lpMrq1dZ6/riDJlKmt7brZ6dw5dOn5nsxPIyOvN2dnb2SVv17PMpGIlP/oKEgyVdnR0dXkds8c603OB8mNPJ/zggAAACtjY08Di4sP+I++XKXiSq3WD4TReMfscPhP9FfB17epKXvQ53sWXF+vKmluXhJzzAf8HQAC8i1VVpW6ogAAAABJRU5ErkJggg==")}.growl-container>.alert-success.icon{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAASZJREFUeNrs1bFKA0EQgOF/LyksrkgXi8wbpLTIFEICgnkACxGsbCzdzs5CxCZwvoGFhYUgNmJlJ2wgD6DIlSm0T382d3IkBnOX3S4DW9wsfMssszcmyzJCRkTgCH6A8Ymp1S3gFDgBxsBV0yPeBO6AgzzVBVrGI35fwouYRQFxgCcTEP8CdqOA+MAlLjUB8Y9abVoFBzBqtQWcAfvAM3DjEjfzgRcv+SJfPeAScGq14wMvDtiby3WBiVrdWRcHaIhKG+jP5WPgSFTeRSWtixcVjIC3P/Zi4AGY1MV/uyj/Sd0Chys200r4Qpuq1Wvg3BcO0Ch/TMfTV1H5BoZLZkUlfOlDU6vD/P7jdfCFCkqVpKLyAmwDHeAROHaJ+6w80TZD/7/4GQBAp3eJ4awpVwAAAABJRU5ErkJggg==")}.growl-container>.alert-warning.icon{background-image:url("data:image/png;base64,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")}
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl-v2/build/angular-growl.min.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl-v2/build/angular-growl.min.js new file mode 100644 index 00000000..f2cad7ff --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl-v2/build/angular-growl.min.js @@ -0,0 +1,6 @@ +/** + * angular-growl-v2 - v0.7.5 - 2015-06-17 + * http://janstevens.github.io/angular-growl-2 + * Copyright (c) 2015 Marco Rinck,Jan Stevens; Licensed MIT + */ +angular.module("angular-growl",[]),angular.module("angular-growl").directive("growl",[function(){"use strict";return{restrict:"A",templateUrl:"templates/growl/growl.html",replace:!1,scope:{reference:"@",inline:"=",limitMessages:"="},controller:["$scope","$timeout","growl","growlMessages",function(a,b,c,d){a.referenceId=a.reference||0,d.initDirective(a.referenceId,a.limitMessages),a.growlMessages=d,a.inlineMessage=angular.isDefined(a.inline)?a.inline:c.inlineMessages(),a.$watch("limitMessages",function(b){var c=d.directives[a.referenceId];angular.isUndefined(b)||angular.isUndefined(c)||(c.limitMessages=b)}),a.stopTimeoutClose=function(a){a.clickToClose||(angular.forEach(a.promises,function(a){b.cancel(a)}),a.close?d.deleteMessage(a):a.close=!0)},a.alertClasses=function(a){return{"alert-success":"success"===a.severity,"alert-error":"error"===a.severity,"alert-danger":"error"===a.severity,"alert-info":"info"===a.severity,"alert-warning":"warning"===a.severity,icon:a.disableIcons===!1,"alert-dismissable":!a.disableCloseButton}},a.showCountDown=function(a){return!a.disableCountDown&&a.ttl>0},a.wrapperClasses=function(){var b={};return b["growl-fixed"]=!a.inlineMessage,b[c.position()]=!0,b},a.computeTitle=function(a){var b={success:"Success",error:"Error",info:"Information",warn:"Warning"};return b[a.severity]}}]}}]),angular.module("angular-growl").run(["$templateCache",function(a){"use strict";void 0===a.get("templates/growl/growl.html")&&a.put("templates/growl/growl.html",'<div class="growl-container" ng-class="wrapperClasses()"><div class="growl-item alert" ng-repeat="message in growlMessages.directives[referenceId].messages" ng-class="alertClasses(message)" ng-click="stopTimeoutClose(message)"><button type="button" class="close" data-dismiss="alert" aria-hidden="true" ng-click="growlMessages.deleteMessage(message)" ng-show="!message.disableCloseButton">×</button><button type="button" class="close" aria-hidden="true" ng-show="showCountDown(message)">{{message.countdown}}</button><h4 class="growl-title" ng-show="message.title" ng-bind="message.title"></h4><div class="growl-message" ng-bind-html="message.text"></div></div></div>')}]),angular.module("angular-growl").provider("growl",function(){"use strict";var a={success:null,error:null,warning:null,info:null},b="messages",c="text",d="title",e="severity",f=!0,g="variables",h=0,i=!1,j="top-right",k=!1,l=!1,m=!1,n=!1,o=!0;this.globalTimeToLive=function(b){if("object"==typeof b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);else for(var d in a)a.hasOwnProperty(d)&&(a[d]=b);return this},this.globalTranslateMessages=function(a){return o=a,this},this.globalDisableCloseButton=function(a){return k=a,this},this.globalDisableIcons=function(a){return l=a,this},this.globalReversedOrder=function(a){return m=a,this},this.globalDisableCountDown=function(a){return n=a,this},this.messageVariableKey=function(a){return g=a,this},this.globalInlineMessages=function(a){return i=a,this},this.globalPosition=function(a){return j=a,this},this.messagesKey=function(a){return b=a,this},this.messageTextKey=function(a){return c=a,this},this.messageTitleKey=function(a){return d=a,this},this.messageSeverityKey=function(a){return e=a,this},this.onlyUniqueMessages=function(a){return f=a,this},this.serverMessagesInterceptor=["$q","growl",function(a,c){function d(a){void 0!==a&&a.data&&a.data[b]&&a.data[b].length>0&&c.addServerMessages(a.data[b])}return{response:function(a){return d(a),a},responseError:function(b){return d(b),a.reject(b)}}}],this.$get=["$rootScope","$interpolate","$sce","$filter","$timeout","growlMessages",function(b,p,q,r,s,t){function u(a){if(G&&a.translateMessage)a.text=G(a.text,a.variables)||a.text,a.title=G(a.title)||a.title;else{var c=p(a.text);a.text=c(a.variables)}var d=t.addMessage(a);return b.$broadcast("growlMessage",a),s(function(){},0),d}function v(b,c,d){var e,f=c||{};return e={text:b,title:f.title,severity:d,ttl:f.ttl||a[d],variables:f.variables||{},disableCloseButton:void 0===f.disableCloseButton?k:f.disableCloseButton,disableIcons:void 0===f.disableIcons?l:f.disableIcons,disableCountDown:void 0===f.disableCountDown?n:f.disableCountDown,position:f.position||j,referenceId:f.referenceId||h,translateMessage:void 0===f.translateMessage?o:f.translateMessage,destroy:function(){t.deleteMessage(e)},setText:function(a){e.text=q.trustAsHtml(String(a))},onclose:f.onclose,onopen:f.onopen},u(e)}function w(a,b){return v(a,b,"warning")}function x(a,b){return v(a,b,"error")}function y(a,b){return v(a,b,"info")}function z(a,b){return v(a,b,"success")}function A(a,b,c){return c=(c||"error").toLowerCase(),v(a,b,c)}function B(a){if(a&&a.length){var b,f,h,i;for(i=a.length,b=0;i>b;b++)if(f=a[b],f[c]){h=(f[e]||"error").toLowerCase();var j={};j.variables=f[g]||{},j.title=f[d],v(f[c],j,h)}}}function C(){return f}function D(){return m}function E(){return i}function F(){return j}var G;t.onlyUnique=f,t.reverseOrder=m;try{G=r("translate")}catch(H){}return{warning:w,error:x,info:y,success:z,general:A,addServerMessages:B,onlyUnique:C,reverseOrder:D,inlineMessages:E,position:F}}]}),angular.module("angular-growl").service("growlMessages",["$sce","$timeout",function(a,b){"use strict";function c(a){var b;return b=f[a]?f[a]:f[a]={messages:[]}}function d(a){var b=a||0;return e.directives[b]||f[b]}var e=this;this.directives={};var f={};this.initDirective=function(a,b){return f[a]?(this.directives[a]=f[a],this.directives[a].limitMessages=b):this.directives[a]={messages:[],limitMessages:b},this.directives[a]},this.getAllMessages=function(a){a=a||0;var b;return b=d(a)?d(a).messages:[]},this.destroyAllMessages=function(a){for(var b=this.getAllMessages(a),c=b.length-1;c>=0;c--)b[c].destroy();var e=d(a);e&&(e.messages=[])},this.addMessage=function(d){var e,f,g,h;if(e=this.directives[d.referenceId]?this.directives[d.referenceId]:c(d.referenceId),f=e.messages,!this.onlyUnique||(angular.forEach(f,function(b){h=a.getTrustedHtml(b.text),d.text===h&&d.severity===b.severity&&d.title===b.title&&(g=!0)}),!g)){if(d.text=a.trustAsHtml(String(d.text)),d.ttl&&-1!==d.ttl&&(d.countdown=d.ttl/1e3,d.promises=[],d.close=!1,d.countdownFunction=function(){d.countdown>1?(d.countdown--,d.promises.push(b(d.countdownFunction,1e3))):d.countdown--}),angular.isDefined(e.limitMessages)){var i=f.length-(e.limitMessages-1);i>0&&f.splice(e.limitMessages-1,i)}if(this.reverseOrder?f.unshift(d):f.push(d),"function"==typeof d.onopen&&d.onopen(),d.ttl&&-1!==d.ttl){var j=this;d.promises.push(b(angular.bind(this,function(){j.deleteMessage(d)}),d.ttl)),d.promises.push(b(d.countdownFunction,1e3))}return d}},this.deleteMessage=function(a){var b=this.getAllMessages(a.referenceId),c=b.indexOf(a);c>-1&&(b[c].close=!0,b.splice(c,1)),"function"==typeof a.onclose&&a.onclose()}}]);
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl.min.css b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl.min.css new file mode 100644 index 00000000..4b326d1e --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl.min.css @@ -0,0 +1,7 @@ +/** + * angular-growl - v0.4.0 - 2013-11-19 + * https://github.com/marcorinck/angular-growl + * Copyright (c) 2013 Marco Rinck; Licensed MIT + */ + +.growl{position:fixed;top:10px;right:10px;float:right;width:250px}.growl-item.ng-enter,.growl-item.ng-leave{-webkit-transition:.5s linear all;-moz-transition:.5s linear all;-o-transition:.5s linear all;transition:.5s linear all}.growl-item.ng-enter,.growl-item.ng-leave.ng-leave-active{opacity:0}.growl-item.ng-leave,.growl-item.ng-enter.ng-enter-active{opacity:1} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl.min.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl.min.js new file mode 100644 index 00000000..e07b22bc --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-growl.min.js @@ -0,0 +1,6 @@ +/** + * angular-growl - v0.4.0 - 2013-11-19 + * https://github.com/marcorinck/angular-growl + * Copyright (c) 2013 Marco Rinck; Licensed MIT + */ +angular.module("angular-growl",[]),angular.module("angular-growl").directive("growl",["$rootScope",function(a){"use strict";return{restrict:"A",template:'<div class="growl"> <div class="growl-item alert" ng-repeat="message in messages" ng-class="computeClasses(message)"> <button type="button" class="close" ng-click="deleteMessage(message)">×</button> <div ng-switch="message.enableHtml"> <div ng-switch-when="true" ng-bind-html="message.text"></div> <div ng-switch-default ng-bind="message.text"></div> </div> </div></div>',replace:!1,scope:!0,controller:["$scope","$timeout","growl",function(b,c,d){function e(a){b.messages.push(a),a.ttl&&-1!==a.ttl&&c(function(){b.deleteMessage(a)},a.ttl)}var f=d.onlyUnique();b.messages=[],a.$on("growlMessage",function(a,c){var d;f?(angular.forEach(b.messages,function(a){c.text===a.text&&c.severity===a.severity&&(d=!0)}),d||e(c)):e(c)}),b.deleteMessage=function(a){var c=b.messages.indexOf(a);c>-1&&b.messages.splice(c,1)},b.computeClasses=function(a){return{"alert-success":"success"===a.severity,"alert-error":"error"===a.severity,"alert-danger":"error"===a.severity,"alert-info":"info"===a.severity,"alert-warning":"warn"===a.severity}}}]}}]),angular.module("angular-growl").provider("growl",function(){"use strict";var a=null,b=!1,c="messages",d="text",e="severity",f=!0;this.globalTimeToLive=function(b){a=b},this.globalEnableHtml=function(a){b=a},this.messagesKey=function(a){c=a},this.messageTextKey=function(a){d=a},this.messageSeverityKey=function(a){e=a},this.onlyUniqueMessages=function(a){f=a},this.serverMessagesInterceptor=["$q","growl",function(a,b){function d(a){a.data[c]&&a.data[c].length>0&&b.addServerMessages(a.data[c])}function e(a){return d(a),a}function f(b){return d(b),a.reject(b)}return function(a){return a.then(e,f)}}],this.$get=["$rootScope","$filter",function(c,g){function h(a){p&&(a.text=p(a.text)),c.$broadcast("growlMessage",a)}function i(c,d,e){var f,g=d||{};f={text:c,severity:e,ttl:g.ttl||a,enableHtml:g.enableHtml||b},h(f)}function j(a,b){i(a,b,"warn")}function k(a,b){i(a,b,"error")}function l(a,b){i(a,b,"info")}function m(a,b){i(a,b,"success")}function n(a){var b,c,f,g;for(g=a.length,b=0;g>b;b++)if(c=a[b],c[d]&&c[e]){switch(c[e]){case"warn":f="warn";break;case"success":f="success";break;case"info":f="info";break;case"error":f="error"}i(c[d],void 0,f)}}function o(){return f}var p;try{p=g("translate")}catch(q){}return{addWarnMessage:j,addErrorMessage:k,addInfoMessage:l,addSuccessMessage:m,addServerMessages:n,onlyUnique:o}}]}); diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.editorconfig b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.editorconfig new file mode 100644 index 00000000..85653605 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.editorconfig @@ -0,0 +1,18 @@ +# This file is for unifying the coding style for different editors and IDEs +# editorconfig.org + +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +# Tabs in JS unless otherwise specified +[**.js] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.gitattributes b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.gitattributes new file mode 100644 index 00000000..bdb0cabc --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.jscsrc b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.jscsrc new file mode 100644 index 00000000..e91fa415 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.jscsrc @@ -0,0 +1,52 @@ +{ + "requireCurlyBraces": [ + "try", + "catch", + "do" + ], + "requireCamelCaseOrUpperCaseIdentifiers": "ignoreProperties", + "requireCapitalizedConstructors": true, + "validateIndentation": 2, + "validateQuoteMarks": "'", + + "disallowQuotedKeysInObjects": true, + "disallowSpaceAfterObjectKeys": true, + + "requireSpaceBeforeBinaryOperators": [ + "=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", + "&=", "|=", "^=", "+=", + + "+", "-", "*", "/", "%", "<<", ">>", ">>>", "&", + "|", "^", "&&", "||", "===", "==", ">=", + "<=", "<", ">", "!=", "!==" + ], + "requireSpaceAfterBinaryOperators": true, + "requireSpacesInConditionalExpression": true, + "requireSpaceBeforeBlockStatements": true, + "requireSpacesInForStatement": true, + "requireLineFeedAtFileEnd": true, + "requireSpacesInFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "requireDotNotation": true, + "disallowSpacesInsideArrayBrackets": "all", + "disallowSpacesInsideParentheses": true, + + + "validateJSDoc": { + "checkParamNames": true, + "requireParamTypes": true + }, + + "disallowMultipleLineBreaks": true, + "disallowNewlineBeforeBlockStatements": true, + "disallowKeywords": [ "with" ], + + "excludeFiles": [ + "bower_components/**", + "node_modules/**", + "dist/**", + "test/coverage/**", + "examples/smoothscroll.min.js" + ] +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.jshintignore b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.jshintignore new file mode 100644 index 00000000..997cf2dc --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.jshintignore @@ -0,0 +1,6 @@ +bower_components/ +node_modules/ +dist/ +tmp/ +examples/ + diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.jshintrc b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.jshintrc new file mode 100644 index 00000000..c569ff2f --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.jshintrc @@ -0,0 +1,19 @@ +{ + "strict" : true, // true: Requires all functions run in ES5 Strict Mode + "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) + "unused" : true, // true: Require all defined variables be used + "noempty" : true, // Prohibit use of empty blocks + "trailing" : true, // Prohibit trailing whitespaces. + "white" : false, // Check against strict whitespace and indentation rules. + "indent" : 2, // {int} Number of spaces to use for indentation + "newcap" : true, // true: Require capitalization of all constructor functions e.g. `new F()` + "quotmark" : "single", // Quotation mark consistency + "-W058" : true, // Missing '()' invoking a constructor + "browser" : true, // Standard browser globals e.g. `window`, `document`. + "predef" : [ // Custom globals. + "angular", + "G_vmlCanvasManager", + "require", + "console" + ] +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.npmignore b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.npmignore new file mode 100644 index 00000000..aeb776de --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/.npmignore @@ -0,0 +1,4 @@ +.idea/ +node_modules/ +test/fixtures/shots/ +bower_components/ diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/LICENSE b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/LICENSE new file mode 100644 index 00000000..0f2fefcf --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Deepu k Sasidharan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/README.md b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/README.md new file mode 100644 index 00000000..bc3190d1 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/README.md @@ -0,0 +1,121 @@ +# angular-diff +An Angular JS plugin to compare and show object differences in JSON format. [Demo](http://hipster-labs.github.io/angular-object-diff/) + +![Screenshot](/screenshot.png) +# Installation + +with bower +``` +bower install angular-object-diff --save +``` + +``` +<link type="text/css" href="bower_components/dist/angular-object-diff.css" rel='stylesheet'> +<script type="text/javascript" src="bower_components/dist/angular-object-diff.js"></script> +``` + +or with npm +``` +npm i angular-object-diff +``` + +# Available methods on `ObjectDiff` service + + +`setOpenChar`: set the opening character for the view, default is `{` + +`setCloseChar`: set the closing character for the view, default is `}` + +`diff`: compare and build all the difference of two objects including prototype properties + +`diffOwnProperties`: compare and build the difference of two objects taking only its own properties into account + +`toJsonView`: format a diff object to a full JSON formatted object view + +`toJsonDiffView`: format a diff object to a JSON formatted view with only changes + +`objToJsonView`: format any javascript object to a JSON formatted view + + +# Available filters + +`toJsonView`: format a diff object to a full JSON formatted object view + +`toJsonDiffView`: format a diff object to a JSON formatted view with only changes + +`objToJsonView`: format any javascript object to a JSON formatted view + + +# Usage + +Declare the dependency +``` +angular.module('myModule', ['ds.objectDiff']); + +``` + +Inject the service + +```javascript +angular.module('myModule') + .controller('MyController', ['$scope', 'ObjectDiff', function($scope, ObjectDiff){ + $scope.yourObjectOne = {//all your object attributes and values here}; + $scope.yourObjectTwo = {//all your object attributes and values here}; + + // This is required only if you want to show a JSON formatted view of your object without using a filter + $scope.yourObjectOneJsonView = ObjectDiff.objToJsonView($scope.yourObjectOne); + $scope.yourObjectTwoJsonView = ObjectDiff.objToJsonView($scope.yourObjectTwo); + + // you can directly diff your objects js now or parse a Json to object and diff + var diff = ObjectDiff.diffOwnProperties($scope.yourObjectOne, $scope.yourObjectTwo); + + // you can directly diff your objects including prototype properties and inherited properties using `diff` method + var diffAll = ObjectDiff.diff($scope.yourObjectOne, $scope.yourObjectTwo); + + // gives a full object view with Diff highlighted + $scope.diffValue = ObjectDiff.toJsonView(diff); + + // gives object view with onlys Diff highlighted + $scope.diffValueChanges = ObjectDiff.toJsonDiffView(diff); + + }]); +``` + +Bind the variables directly in your html using the `ng-bind-html` angular directive. +Use a `<pre>` element for better results + +```html +<pre ng-bind-html="diffValue"></pre> +<pre ng-bind-html="diffValueChanges"></pre> +<pre ng-bind-html="yourObjectOneJsonView"></pre> +<pre ng-bind-html="yourObjectTwoJsonView"></pre> +``` + +The same can be done with filters as well + +```javascript +angular.module('myModule') + .controller('MyController', ['$scope', 'ObjectDiff', function($scope, ObjectDiff){ + $scope.yourObjectOne = {//all your object attributes and values here}; + $scope.yourObjectTwo = {//all your object attributes and values here}; + + // you can directly diff your objects js now or parse a Json to object and diff + var diff = ObjectDiff.diffOwnProperties($scope.yourObjectOne, $scope.yourObjectTwo); + + // you can directly diff your objects including prototype properties and inherited properties using `diff` method + var diffAll = ObjectDiff.diff($scope.yourObjectOne, $scope.yourObjectTwo); + + }]); +``` + +Bind the variables directly in your html using the `ng-bind-html` angular directive. +Use a `<pre>` element for better results + +```html +<pre ng-bind-html="diffValue | toJsonView"></pre> +<pre ng-bind-html="diffValueChanges | toJsonDiffView"></pre> +<pre ng-bind-html="yourObjectOneJsonView | objToJsonView"></pre> +<pre ng-bind-html="yourObjectTwoJsonView | objToJsonView"></pre> +``` + +Inspired from https://github.com/NV/objectDiff.js diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/angular-object-diff.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/angular-object-diff.js new file mode 100644 index 00000000..08b124fc --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/angular-object-diff.js @@ -0,0 +1,344 @@ +(function () { + 'use strict'; + + angular + .module('ds.objectDiff', []) + .factory('ObjectDiff', objectDiff) + .filter('toJsonView', toJsonViewFilter) + .filter('toJsonDiffView', toJsonDiffViewFilter) + .filter('objToJsonView', objToJsonViewFilter); + + objectDiff.$inject = ['$sce']; + toJsonViewFilter.$inject = ['ObjectDiff']; + toJsonDiffViewFilter.$inject = ['ObjectDiff']; + objToJsonViewFilter.$inject = ['ObjectDiff']; + + /* service implementation */ + function objectDiff($sce) { + + var openChar = '{', + closeChar = '}', + service = { + setOpenChar: setOpenChar, + setCloseChar: setCloseChar, + diff: diff, + diffOwnProperties: diffOwnProperties, + toJsonView: formatToJsonXMLString, + objToJsonView: formatObjToJsonXMLString, + toJsonDiffView: formatChangesToXMLString + }; + + return service; + + + /* service methods */ + + /** + * @param char + */ + function setOpenChar(char) { + openChar = char; + } + + /** + * @param char + */ + function setCloseChar(char) { + closeChar = char; + } + + /** + * diff between object a and b + * @param {Object} a + * @param {Object} b + * @param shallow + * @param isOwn + * @return {Object} + */ + function diff(a, b, shallow, isOwn) { + + if (a === b) { + return equalObj(a); + } + + var diffValue = {}; + var equal = true; + + for (var key in a) { + if ((!isOwn && key in b) || (isOwn && typeof b != 'undefined' && b.hasOwnProperty(key))) { + if (a[key] === b[key]) { + diffValue[key] = equalObj(a[key]); + } else { + if (!shallow && isValidAttr(a[key], b[key])) { + var valueDiff = diff(a[key], b[key], shallow, isOwn); + if (valueDiff.changed == 'equal') { + diffValue[key] = equalObj(a[key]); + } else { + equal = false; + diffValue[key] = valueDiff; + } + } else { + equal = false; + diffValue[key] = { + changed: 'primitive change', + removed: a[key], + added: b[key] + } + } + } + } else { + equal = false; + diffValue[key] = { + changed: 'removed', + value: a[key] + } + } + } + + for (key in b) { + if ((!isOwn && !(key in a)) || (isOwn && typeof a != 'undefined' && !a.hasOwnProperty(key))) { + equal = false; + diffValue[key] = { + changed: 'added', + value: b[key] + } + } + } + + if (equal) { + return equalObj(a); + } else { + return { + changed: 'object change', + value: diffValue + } + } + } + + + /** + * diff between object a and b own properties only + * @param {Object} a + * @param {Object} b + * @return {Object} + * @param deep + */ + function diffOwnProperties(a, b, shallow) { + return diff(a, b, shallow, true); + } + + /** + * Convert to a readable xml/html Json structure + * @param {Object} changes + * @return {string} + * @param shallow + */ + function formatToJsonXMLString(changes, shallow) { + var properties = []; + + var diff = changes.value; + if (changes.changed == 'equal') { + return $sce.trustAsHtml(inspect(diff, shallow)); + } + + for (var key in diff) { + properties.push(formatChange(key, diff[key], shallow)); + } + + return $sce.trustAsHtml('<span>' + openChar + '</span>\n<div class="diff-level">' + properties.join('<span>,</span>\n') + '\n</div><span>' + closeChar + '</span>'); + + } + + /** + * Convert to a readable xml/html Json structure + * @return {string} + * @param obj + * @param shallow + */ + function formatObjToJsonXMLString(obj, shallow) { + return $sce.trustAsHtml(inspect(obj, shallow)); + } + + /** + * Convert to a readable xml/html Json structure + * @param {Object} changes + * @return {string} + * @param shallow + */ + function formatChangesToXMLString(changes, shallow) { + var properties = []; + + if (changes.changed == 'equal') { + return ''; + } + + var diff = changes.value; + + for (var key in diff) { + var changed = diff[key].changed; + if (changed !== 'equal') + properties.push(formatChange(key, diff[key], shallow, true)); + } + + return $sce.trustAsHtml('<span>' + openChar + '</span>\n<div class="diff-level">' + properties.join('<span>,</span>\n') + '\n</div><span>' + closeChar + '</span>'); + + } + + /** + * @param obj + * @returns {{changed: string, value: *}} + */ + function equalObj(obj) { + return { + changed: 'equal', + value: obj + } + } + + /** + * @param a + * @param b + * @returns {*|boolean} + */ + function isValidAttr(a, b) { + var typeA = typeof a; + var typeB = typeof b; + return (a && b && (typeA == 'object' || typeA == 'function') && (typeB == 'object' || typeB == 'function')); + } + + /** + * @param key + * @param diffItem + * @returns {*} + * @param shallow + * @param diffOnly + */ + function formatChange(key, diffItem, shallow, diffOnly) { + var changed = diffItem.changed; + var property; + switch (changed) { + case 'equal': + property = (stringifyObjectKey(escapeHTML(key)) + '<span>: </span>' + inspect(diffItem.value)); + break; + + case 'removed': + property = ('<del class="diff">' + stringifyObjectKey(escapeHTML(key)) + '<span>: </span>' + inspect(diffItem.value) + '</del>'); + break; + + case 'added': + property = ('<ins class="diff">' + stringifyObjectKey(escapeHTML(key)) + '<span>: </span>' + inspect(diffItem.value) + '</ins>'); + break; + + case 'primitive change': + var prefix = stringifyObjectKey(escapeHTML(key)) + '<span>: </span>'; + property = ( + '<del class="diff diff-key">' + prefix + inspect(diffItem.removed) + '</del><span>,</span>\n' + + '<ins class="diff diff-key">' + prefix + inspect(diffItem.added) + '</ins>'); + break; + + case 'object change': + property = shallow ? '' : (stringifyObjectKey(key) + '<span>: </span>' + ( diffOnly ? formatChangesToXMLString(diffItem) : formatToJsonXMLString(diffItem))); + break; + } + + return property; + } + + /** + * @param {string} key + * @return {string} + */ + function stringifyObjectKey(key) { + return /^[a-z0-9_$]*$/i.test(key) ? + key : + JSON.stringify(key); + } + + /** + * @param {string} string + * @return {string} + */ + function escapeHTML(string) { + return string.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); + } + + /** + * @param {Object} obj + * @return {string} + * @param shallow + */ + function inspect(obj, shallow) { + + return _inspect('', obj, shallow); + + /** + * @param {string} accumulator + * @param {object} obj + * @see http://jsperf.com/continuation-passing-style/3 + * @return {string} + * @param shallow + */ + function _inspect(accumulator, obj, shallow) { + switch (typeof obj) { + case 'object': + if (!obj) { + accumulator += 'null'; + break; + } + if (shallow) { + accumulator += '[object]'; + break; + } + var keys = Object.keys(obj); + var length = keys.length; + if (length === 0) { + accumulator += '<span>' + openChar + closeChar + '</span>'; + } else { + accumulator += '<span>' + openChar + '</span>\n<div class="diff-level">'; + for (var i = 0; i < length; i++) { + var key = keys[i]; + accumulator = _inspect(accumulator + stringifyObjectKey(escapeHTML(key)) + '<span>: </span>', obj[key]); + if (i < length - 1) { + accumulator += '<span>,</span>\n'; + } + } + accumulator += '\n</div><span>' + closeChar + '</span>' + } + break; + + case 'string': + accumulator += JSON.stringify(escapeHTML(obj)); + break; + + case 'undefined': + accumulator += 'undefined'; + break; + + default: + accumulator += escapeHTML(String(obj)); + break; + } + return accumulator; + } + } + } + + /* filter implementation */ + function toJsonViewFilter(ObjectDiff) { + return function (value) { + return ObjectDiff.toJsonView(value); + }; + } + + function toJsonDiffViewFilter(ObjectDiff) { + return function (value) { + return ObjectDiff.toJsonDiffView(value); + }; + } + + function objToJsonViewFilter(ObjectDiff) { + return function (value) { + return ObjectDiff.objToJsonView(value); + }; + } +})(); diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/angular-object-diff.less b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/angular-object-diff.less new file mode 100644 index 00000000..08115548 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/angular-object-diff.less @@ -0,0 +1,42 @@ +.diff { + display: inline-block; +} +.diff-level { + margin-left: 1.6em; +} +.diff-holder { + color: #666; + margin: 0; +} +.diff-holder span { + color: #AAA; +} +del.diff { + text-decoration: none; + color: #b30000; + background: #fadad7; +} +ins.diff { + background: #eaf2c2; + color: #406619; + text-decoration: none; +} +del.diff-key { + border: 1px solid #f8a4a4; +} +ins.diff-key { + border: 1px solid #a3ce4c; + margin-top: -1px; + position: relative; +} +ins.diff span { + color: #AABF40; +} +del.diff span { + color: #EE8177; +} +.audit-obj { + max-height: 300px; + max-width: 300px; + overflow: auto; +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/bower.json b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/bower.json new file mode 100644 index 00000000..7602502a --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/bower.json @@ -0,0 +1,50 @@ +{ + "name": "angular-object-diff", + "version": "1.0.3", + "main": [ + "./dist/angular-object-diff.js", + "./dist/angular-object-diff.css" + ], + "authors": [ + "Deepu K Sasidharan <d4udts@gmail.com>" + ], + "repository": { + "type": "git", + "url": "git://github.com/hipster-labs/angular-object-diff.git" + }, + "description": "An Angular JS plugin to compare and show object differences.", + "moduleType": [ + "globals" + ], + "keywords": [ + "angular", + "angular.js", + "object", + "diff", + "json", + "json-diff", + "object-diff", + "compare" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ], + "dependencies": { + "angular": "1.x" + }, + "devDependencies": { + "angular-bootstrap": "~0.11.0", + "font-awesome": "~4.1.0", + "rainbow": "~1.1.9", + "angular-mocks": "~1.3.10" + }, + "resolutions": { + "angular": "1.x", + "angular-mocks": "1.3.10" + } +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/demo.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/demo.js new file mode 100644 index 00000000..3613fcca --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/demo.js @@ -0,0 +1,68 @@ +// Angular JS code +(function () { + 'use-strict'; + + angular.module('demoApp', ['ds.objectDiff']) + .config([ + '$interpolateProvider', + function ($interpolateProvider) { + return $interpolateProvider.startSymbol('{(').endSymbol(')}'); + } + ]) + .controller('DemoController', DemoController); + + DemoController.$inject = ['$scope', 'ObjectDiff']; + + function DemoController($scope, ObjectDiff) { + $scope.objectOne = "{\n" + + " a: {\n" + + " b: 1,\n" + + " c: [1, 2]\n" + + " },\n" + + " \"2b\": {\n" + + " foo: 'bar'\n" + + " }\n" + + " }"; + $scope.objectTwo = "{\n" + + " a: { \n" + + " b: 2,\n" + + " c: [1, 2, 3]\n" + + " },\n" + + " x: 1\n" + + " }"; + + + function makeDiff() { + var objectOne, objectTwo, diff; + try { + $scope.errorA = false; + objectOne = eval('(' + $scope.objectOne + ')'); //JSON.parse($scope.objectOne); + } catch (err) { + $scope.errorA = true; + } + try { + $scope.errorB = false; + objectTwo = eval('(' + $scope.objectTwo + ')'); //JSON.parse($scope.objectTwo); + } catch (err) { + $scope.errorB = true; + } + + // you can directly diff your objects if they are not string + diff = ObjectDiff.diffOwnProperties(objectOne, objectTwo); + + $scope.diffValue = ObjectDiff.toJsonView(diff); + $scope.diffValueChanges = ObjectDiff.toJsonDiffView(diff); + + $scope.yourObjectOne = objectOne; + $scope.yourObjectTwo = objectTwo; + } + + $scope.$watch('objectOne', function (newValue, oldValue) { + makeDiff(); + }); + $scope.$watch('objectTwo', function (newValue, oldValue) { + makeDiff(); + }); + } + +})(); diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/gulpfile.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/gulpfile.js new file mode 100644 index 00000000..78fdc574 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/gulpfile.js @@ -0,0 +1,169 @@ +(function () { + 'use strict'; + + var gulp = require('gulp'); + var less = require('gulp-less'); + var sourcemaps = require('gulp-sourcemaps'); + var uglify = require('gulp-uglify'); + var csso = require('gulp-csso'); + var jshint = require('gulp-jshint'); + var stylish = require('jshint-stylish'); + var jscs = require('gulp-jscs'); + var mocha = require('gulp-spawn-mocha'); + var mochaPhantomJS = require('gulp-mocha-phantomjs'); + var tar = require('gulp-tar'); + var gzip = require('gulp-gzip'); + var bumper = require('gulp-bump'); + var git = require('gulp-git'); + var shell = require('gulp-shell'); + var rename = require('gulp-rename'); + var fs = require('fs'); + var sequence = require('gulp-sequence'); + + gulp.task('less', function () { + return gulp.src('./*.less') + .pipe(sourcemaps.init()) + .pipe(less()) + .pipe(csso()) + .pipe(sourcemaps.write('./')) + .pipe(gulp.dest('./dist')); + }); + + gulp.task('lint', function () { + return gulp.src('**/*.js') + .pipe(jshint()) + .pipe(jshint.reporter(stylish)); + }); + + /* gulp.task('style', function() { + return gulp.src('**/ + /*.js') + .pipe(jscs()); + });*/ + + gulp.task('unit', function () { + return gulp + .src('test/index.html') + .pipe(mochaPhantomJS()); + }); + + gulp.task('bump-patch', bump('patch')); + gulp.task('bump-minor', bump('minor')); + gulp.task('bump-major', bump('major')); + + gulp.task('bower', function () { + return gulp.src('./angular-object-diff.js') + .pipe(gulp.dest('./dist')); + }); + + gulp.task('js', ['lint' /*, 'style'*/ , 'bower'], function () { + return gulp.src('./angular-object-diff.js') + .pipe(rename('angular-object-diff.min.js')) + .pipe(sourcemaps.init()) + .pipe(uglify()) + .pipe(sourcemaps.write('./')) + .pipe(gulp.dest('./dist')); + }); + + gulp.task('build', function () { + return gulp.src(['dist/*', '!./dist/*.tar.gz']) + .pipe(tar('angular-object-diff.js.tar')) + .pipe(gzip({ + gzipOptions: { + level: 9 + } + })) + .pipe(gulp.dest('dist/')); + }); + + gulp.task('update', function (cb) { + fs.readFile('./examples/index.template.html', 'utf8', function (err, file) { + if (err) return cb(err); + file = file.replace('<!-- version -->', version()); + fs.writeFile('./examples/index.html', file, cb); + }); + }); + + gulp.task('git-commit', function () { + var v = 'update to version ' + version(); + gulp.src(['./dist/*', './examples/*', './test/*', './package.json', './bower.json', './angular-object-diff.js', './angular-object-diff.less']) + .pipe(git.add()) + .pipe(git.commit(v)); + }); + + gulp.task('git-push', function (cb) { + var v = 'v' + version(); + git.push('origin', 'master', function (err) { + if (err) return cb(err); + git.tag(v, v, function (err) { + if (err) return cb(err); + git.push('origin', 'master', { + args: '--tags' + }, function(err){ + if (err) return cb(err); + git.checkout('gh-pages', function (err) { + if (err) return cb(err); + git.reset('master', { + args: '--hard' + }, function (err) { + if (err) return cb(err); + git.push('origin', 'gh-pages', function (err) { + if (err) return cb(err); + git.checkout('master', cb); + }); + }); + }); + }); + }); + }); + }); + + gulp.task('git-demo', function (cb) { + var v = 'v' + version(); + git.checkout('gh-pages', function (err) { + if (err) return cb(err); + git.reset('master', { + args: '--hard' + }, function (err) { + if (err) return cb(err); + git.push('origin', 'gh-pages', function (err) { + if (err) return cb(err); + git.checkout('master', cb); + }); + }); + }); + }); + + gulp.task('npm', shell.task([ + 'npm publish' + ])); + + gulp.task('watch', function () { + gulp.watch('./*.js', ['js']); + gulp.watch('./*.less', ['less']); + return true; + }); + + function bump(level) { + return function () { + return gulp.src(['./package.json', './bower.json']) + .pipe(bumper({ + type: level + })) + .pipe(gulp.dest('./')); + }; + } + + function version() { + return JSON.parse(fs.readFileSync('package.json', 'utf8')).version; + } + + gulp.task('default', sequence('check', ['less', 'js'], 'build')); + gulp.task('test', sequence('unit' /*, 'integration'*/ )); + gulp.task('check', sequence(['lint' /*, 'style'*/ ], 'test')); + gulp.task('publish', sequence(['git-commit', 'git-push', 'npm'])); + gulp.task('deploy-patch', sequence('default', 'bump-patch', /*'update',*/ 'publish')); + gulp.task('deploy-minor', sequence('default', 'bump-minor', /*'update',*/ 'publish')); + gulp.task('deploy-major', sequence('default', 'bump-major', /*'update',*/ 'publish')); + +})(); diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/index.html b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/index.html new file mode 100644 index 00000000..986a8b23 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/index.html @@ -0,0 +1,95 @@ +<!DOCTYPE html> +<html lang="en-US"> + +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="description" content="A Demo page for angular-object-diff plugin."> + <meta name="author" content="Deepu KS (deepu.js.org)"> + <meta name="twitter:site" content="@deepu105" /> + <meta name="twitter:title" content="A Demo page for angular-object-diff plugin" /> + <meta name="twitter:description" content="A Demo page for angular-object-diff plugin." /> + <meta name="twitter:url" content="http://hipster-labs.js.org/angular-object-diff/" /> + <title>Angular Object Diff Demo</title> + <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" /> + <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/font-awesome/4.0.0/css/font-awesome.css" /> + <link rel="stylesheet" href="dist/angular-object-diff.css" /> + <style> + .error { + background-color: red; + } + </style> +</head> + +<body> + + <!-- Static navbar --> + <div class="navbar navbar-default navbar-static-top" role="navigation"> + <div class="container"> + <div class="navbar-header"> + <a class="navbar-brand" href="#">Angular Object Diff</a> + </div> + <div class="navbar-collapse collapse"> + <ul class="nav navbar-nav"> + <li class="active"><a href="#">Home</a></li> + <li><a href="https://github.com/hipster-labs/angular-object-diff">Github</a></li> + </ul> + </div> + <!--/.nav-collapse --> + </div> + </div> + + + <div class="container-fluid" ng-app="demoApp"> + + <!-- content is injected here --> + <div ng-controller="DemoController"> + <div class="row"> + <div class="col-md-4 col-xs-12"> + <label>Object A</label> + <textarea class="form-control" ng-class="[{'error': errorA}]" rows="15" ng-model="objectOne"></textarea> + </div> + <div class="col-md-4 col-xs-12"> + <label>Object B</label> + <textarea class="form-control" ng-class="[{'error': errorB}]" rows="15" ng-model="objectTwo"></textarea> + </div> + <div class="col-md-4 col-xs-12"> + <label>Full Diff</label> + <pre ng-bind-html="diffValue"></pre> + </div> + </div> + <div class="row"> + <div class="col-md-4 col-xs-12"> + <label>Object A JSON View</label> + <pre ng-bind-html="yourObjectOne | objToJsonView"></pre> + </div> + <div class="col-md-4 col-xs-12"> + <label>Object B JSON View</label> + <pre ng-bind-html="yourObjectTwo | objToJsonView"></pre> + </div> + <div class="col-md-4 col-xs-12"> + <label>Diff Changes only</label> + <pre ng-bind-html="diffValueChanges"></pre> + </div> + </div> + </div> + + </div> + <!-- /container --> + + <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> + <script src="angular-object-diff.js"></script> + <script src="demo.js"></script> + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + + ga('create', 'UA-74370272-3', 'auto'); + ga('send', 'pageview'); + + </script> +</body> + +</html> diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/package.json b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/package.json new file mode 100644 index 00000000..ea694e00 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/package.json @@ -0,0 +1,84 @@ +{ + "_from": "angular-object-diff", + "_id": "angular-object-diff@1.0.3", + "_inBundle": false, + "_integrity": "sha1-zUu3X+n/Extw08NCzUxhBFFtXF8=", + "_location": "/angular-object-diff", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "angular-object-diff", + "name": "angular-object-diff", + "escapedName": "angular-object-diff", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/angular-object-diff/-/angular-object-diff-1.0.3.tgz", + "_shasum": "cd4bb75fe9ff131b70d3c342cd4c6104516d5c5f", + "_spec": "angular-object-diff", + "_where": "D:\\SDNC_UI\\app\\node_modules", + "author": { + "name": "Deepu K Sasidharan", + "email": "d4udts@gmail.com" + }, + "bugs": { + "url": "https://github.com/hipster-labs/angular-object-diff/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "An Angular JS plugin to compare and show object differences.", + "devDependencies": { + "chai": "^1.10.0", + "chai-string": "^1.1.1", + "cp": "^0.2.0", + "gm": "^1.17.0", + "gulp": "^3.8.6", + "gulp-bump": "^0.1.11", + "gulp-csso": "^0.2.9", + "gulp-git": "^0.5.6", + "gulp-gzip": "0.0.8", + "gulp-jscs": "^1.4.0", + "gulp-jshint": "^1.9.2", + "gulp-less": "^1.3.1", + "gulp-mocha-phantomjs": "^0.6.1", + "gulp-rename": "^1.2.0", + "gulp-sequence": "^0.3.1", + "gulp-shell": "^0.2.11", + "gulp-sourcemaps": "^1.0.0", + "gulp-spawn-mocha": "^2.0.1", + "gulp-tar": "^0.5.0", + "gulp-uglify": "^0.3.1", + "imgur-node-api": "^0.1.0", + "jshint-stylish": "^1.0.0", + "less": "^1.7.3", + "mkdirp": "^0.5.0", + "mocha": "^2.1.0", + "mocha-phantomjs": "^3.5.3", + "sinon": "^1.12.2", + "sinon-chai": "^2.7.0", + "testatic": "^0.1.0", + "tmp-sync": "github:jtblin/node-tmp-sync", + "webshot": "^0.15.3" + }, + "directories": { + "example": "examples" + }, + "homepage": "https://github.com/hipster-labs/angular-object-diff#readme", + "license": "MIT", + "main": "angular-object-diff.js", + "name": "angular-object-diff", + "repository": { + "type": "git", + "url": "git://github.com/hipster-labs/angular-object-diff.git" + }, + "scripts": { + "test": "gulp check" + }, + "version": "1.0.3" +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/screenshot.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/screenshot.png Binary files differnew file mode 100644 index 00000000..938110db --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-object-diff/screenshot.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-route.min.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-route.min.js new file mode 100644 index 00000000..a30b8ab9 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-route.min.js @@ -0,0 +1,15 @@ +/* + AngularJS v1.3.14 + (c) 2010-2014 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(q,d,C){'use strict';function v(r,k,h){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,f,b,c,y){function z(){l&&(h.cancel(l),l=null);m&&(m.$destroy(),m=null);n&&(l=h.leave(n),l.then(function(){l=null}),n=null)}function x(){var b=r.current&&r.current.locals;if(d.isDefined(b&&b.$template)){var b=a.$new(),c=r.current;n=y(b,function(b){h.enter(b,null,n||f).then(function(){!d.isDefined(t)||t&&!a.$eval(t)||k()});z()});m=c.scope=b;m.$emit("$viewContentLoaded"); +m.$eval(w)}else z()}var m,n,l,t=b.autoscroll,w=b.onload||"";a.$on("$routeChangeSuccess",x);x()}}}function A(d,k,h){return{restrict:"ECA",priority:-400,link:function(a,f){var b=h.current,c=b.locals;f.html(c.$template);var y=d(f.contents());b.controller&&(c.$scope=a,c=k(b.controller,c),b.controllerAs&&(a[b.controllerAs]=c),f.data("$ngControllerController",c),f.children().data("$ngControllerController",c));y(a)}}}q=d.module("ngRoute",["ng"]).provider("$route",function(){function r(a,f){return d.extend(Object.create(a), +f)}function k(a,d){var b=d.caseInsensitiveMatch,c={originalPath:a,regexp:a},h=c.keys=[];a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,d,b,c){a="?"===c?c:null;c="*"===c?c:null;h.push({name:b,optional:!!a});d=d||"";return""+(a?"":d)+"(?:"+(a?d:"")+(c&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1");c.regexp=new RegExp("^"+a+"$",b?"i":"");return c}var h={};this.when=function(a,f){var b=d.copy(f);d.isUndefined(b.reloadOnSearch)&&(b.reloadOnSearch=!0); +d.isUndefined(b.caseInsensitiveMatch)&&(b.caseInsensitiveMatch=this.caseInsensitiveMatch);h[a]=d.extend(b,a&&k(a,b));if(a){var c="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";h[c]=d.extend({redirectTo:a},k(c,b))}return this};this.caseInsensitiveMatch=!1;this.otherwise=function(a){"string"===typeof a&&(a={redirectTo:a});this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(a,f,b,c,k,q,x){function m(b){var e=s.current; +(v=(p=l())&&e&&p.$$route===e.$$route&&d.equals(p.pathParams,e.pathParams)&&!p.reloadOnSearch&&!w)||!e&&!p||a.$broadcast("$routeChangeStart",p,e).defaultPrevented&&b&&b.preventDefault()}function n(){var u=s.current,e=p;if(v)u.params=e.params,d.copy(u.params,b),a.$broadcast("$routeUpdate",u);else if(e||u)w=!1,(s.current=e)&&e.redirectTo&&(d.isString(e.redirectTo)?f.path(t(e.redirectTo,e.params)).search(e.params).replace():f.url(e.redirectTo(e.pathParams,f.path(),f.search())).replace()),c.when(e).then(function(){if(e){var a= +d.extend({},e.resolve),b,g;d.forEach(a,function(b,e){a[e]=d.isString(b)?k.get(b):k.invoke(b,null,null,e)});d.isDefined(b=e.template)?d.isFunction(b)&&(b=b(e.params)):d.isDefined(g=e.templateUrl)&&(d.isFunction(g)&&(g=g(e.params)),g=x.getTrustedResourceUrl(g),d.isDefined(g)&&(e.loadedTemplateUrl=g,b=q(g)));d.isDefined(b)&&(a.$template=b);return c.all(a)}}).then(function(c){e==s.current&&(e&&(e.locals=c,d.copy(e.params,b)),a.$broadcast("$routeChangeSuccess",e,u))},function(b){e==s.current&&a.$broadcast("$routeChangeError", +e,u,b)})}function l(){var a,b;d.forEach(h,function(c,h){var g;if(g=!b){var k=f.path();g=c.keys;var m={};if(c.regexp)if(k=c.regexp.exec(k)){for(var l=1,n=k.length;l<n;++l){var p=g[l-1],q=k[l];p&&q&&(m[p.name]=q)}g=m}else g=null;else g=null;g=a=g}g&&(b=r(c,{params:d.extend({},f.search(),a),pathParams:a}),b.$$route=c)});return b||h[null]&&r(h[null],{params:{},pathParams:{}})}function t(a,b){var c=[];d.forEach((a||"").split(":"),function(a,d){if(0===d)c.push(a);else{var f=a.match(/(\w+)(?:[?*])?(.*)/), +h=f[1];c.push(b[h]);c.push(f[2]||"");delete b[h]}});return c.join("")}var w=!1,p,v,s={routes:h,reload:function(){w=!0;a.$evalAsync(function(){m();n()})},updateParams:function(a){if(this.current&&this.current.$$route)a=d.extend({},this.current.params,a),f.path(t(this.current.$$route.originalPath,a)),f.search(a);else throw B("norout");}};a.$on("$locationChangeStart",m);a.$on("$locationChangeSuccess",n);return s}]});var B=d.$$minErr("ngRoute");q.provider("$routeParams",function(){this.$get=function(){return{}}}); +q.directive("ngView",v);q.directive("ngView",A);v.$inject=["$route","$anchorScroll","$animate"];A.$inject=["$compile","$controller","$route"]})(window,window.angular); +//# sourceMappingURL=angular-route.min.js.map
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-sanitize.min.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-sanitize.min.js new file mode 100644 index 00000000..65fc5a4e --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-sanitize.min.js @@ -0,0 +1,16 @@ +/* + AngularJS v1.3.14 + (c) 2010-2014 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(n,h,p){'use strict';function E(a){var e=[];r(e,h.noop).chars(a);return e.join("")}function g(a){var e={};a=a.split(",");var d;for(d=0;d<a.length;d++)e[a[d]]=!0;return e}function F(a,e){function d(a,b,d,l){b=h.lowercase(b);if(s[b])for(;f.last()&&t[f.last()];)c("",f.last());u[b]&&f.last()==b&&c("",b);(l=v[b]||!!l)||f.push(b);var m={};d.replace(G,function(a,b,e,c,d){m[b]=q(e||c||d||"")});e.start&&e.start(b,m,l)}function c(a,b){var c=0,d;if(b=h.lowercase(b))for(c=f.length-1;0<=c&&f[c]!=b;c--); +if(0<=c){for(d=f.length-1;d>=c;d--)e.end&&e.end(f[d]);f.length=c}}"string"!==typeof a&&(a=null===a||"undefined"===typeof a?"":""+a);var b,k,f=[],m=a,l;for(f.last=function(){return f[f.length-1]};a;){l="";k=!0;if(f.last()&&w[f.last()])a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+f.last()+"[^>]*>","i"),function(a,b){b=b.replace(H,"$1").replace(I,"$1");e.chars&&e.chars(q(b));return""}),c("",f.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",b)===b&&(e.comment&& +e.comment(a.substring(4,b)),a=a.substring(b+3),k=!1);else if(x.test(a)){if(b=a.match(x))a=a.replace(b[0],""),k=!1}else if(J.test(a)){if(b=a.match(y))a=a.substring(b[0].length),b[0].replace(y,c),k=!1}else K.test(a)&&((b=a.match(z))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(z,d)),k=!1):(l+="<",a=a.substring(1)));k&&(b=a.indexOf("<"),l+=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),e.chars&&e.chars(q(l)))}if(a==m)throw L("badparse",a);m=a}c()}function q(a){if(!a)return"";A.innerHTML=a.replace(/</g, +"<");return A.textContent}function B(a){return a.replace(/&/g,"&").replace(M,function(a){var d=a.charCodeAt(0);a=a.charCodeAt(1);return"&#"+(1024*(d-55296)+(a-56320)+65536)+";"}).replace(N,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"<").replace(/>/g,">")}function r(a,e){var d=!1,c=h.bind(a,a.push);return{start:function(a,k,f){a=h.lowercase(a);!d&&w[a]&&(d=a);d||!0!==C[a]||(c("<"),c(a),h.forEach(k,function(d,f){var k=h.lowercase(f),g="img"===a&&"src"===k||"background"=== +k;!0!==O[k]||!0===D[k]&&!e(d,g)||(c(" "),c(f),c('="'),c(B(d)),c('"'))}),c(f?"/>":">"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c("</"),c(a),c(">"));a==d&&(d=!1)},chars:function(a){d||c(B(a))}}}var L=h.$$minErr("$sanitize"),z=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,y=/^<\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,K=/^</,J=/^<\//,H=/\x3c!--(.*?)--\x3e/g,x=/<!DOCTYPE([^>]*?)>/i, +I=/<!\[CDATA\[(.*?)]]\x3e/g,M=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,N=/([^\#-~| |!])/g,v=g("area,br,col,hr,img,wbr");n=g("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr");p=g("rp,rt");var u=h.extend({},p,n),s=h.extend({},n,g("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),t=h.extend({},p,g("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")); +n=g("animate,animateColor,animateMotion,animateTransform,circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,set,stop,svg,switch,text,title,tspan,use");var w=g("script,style"),C=h.extend({},v,s,t,u,n),D=g("background,cite,href,longdesc,src,usemap,xlink:href");n=g("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,target,title,type,valign,value,vspace,width"); +p=g("accent-height,accumulate,additive,alphabetic,arabic-form,ascent,attributeName,attributeType,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan"); +var O=h.extend({},D,p,n),A=document.createElement("pre");h.module("ngSanitize",[]).provider("$sanitize",function(){this.$get=["$$sanitizeUri",function(a){return function(e){var d=[];F(e,r(d,function(c,b){return!/^unsafe/.test(a(c,b))}));return d.join("")}}]});h.module("ngSanitize").filter("linky",["$sanitize",function(a){var e=/((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/,d=/^mailto:/;return function(c,b){function k(a){a&&g.push(E(a))}function f(a,c){g.push("<a "); +h.isDefined(b)&&g.push('target="',b,'" ');g.push('href="',a.replace(/"/g,"""),'">');k(c);g.push("</a>")}if(!c)return c;for(var m,l=c,g=[],n,p;m=l.match(e);)n=m[0],m[2]||m[4]||(n=(m[3]?"http://":"mailto:")+n),p=m.index,k(l.substr(0,p)),f(n,m[0].replace(d,"")),l=l.substring(p+m[0].length);k(l);return a(g.join(""))}}])})(window,window.angular); +//# sourceMappingURL=angular-sanitize.min.js.map
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-utils-pagination/dirPagination.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-utils-pagination/dirPagination.js new file mode 100644 index 00000000..a1a72652 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular-utils-pagination/dirPagination.js @@ -0,0 +1,639 @@ +/** + * dirPagination - AngularJS module for paginating (almost) anything. + * + * + * Credits + * ======= + * + * Daniel Tabuenca: https://groups.google.com/d/msg/angular/an9QpzqIYiM/r8v-3W1X5vcJ + * for the idea on how to dynamically invoke the ng-repeat directive. + * + * I borrowed a couple of lines and a few attribute names from the AngularUI Bootstrap project: + * https://github.com/angular-ui/bootstrap/blob/master/src/pagination/pagination.js + * + * Copyright 2014 Michael Bromley <michael@michaelbromley.co.uk> + */ + +(function() { + + /** + * Config + */ + var moduleName = 'angularUtils.directives.dirPagination'; + var DEFAULT_ID = '__default'; + + /** + * Module + */ + angular.module(moduleName, []) + .directive('dirPaginate', ['$compile', '$parse', 'paginationService', dirPaginateDirective]) + .directive('dirPaginateNoCompile', noCompileDirective) + .directive('dirPaginationControls', ['paginationService', 'paginationTemplate', dirPaginationControlsDirective]) + .filter('itemsPerPage', ['paginationService', itemsPerPageFilter]) + .service('paginationService', paginationService) + .provider('paginationTemplate', paginationTemplateProvider) + .run(['$templateCache',dirPaginationControlsTemplateInstaller]); + + function dirPaginateDirective($compile, $parse, paginationService) { + + return { + terminal: true, + multiElement: true, + priority: 100, + compile: dirPaginationCompileFn + }; + + function dirPaginationCompileFn(tElement, tAttrs){ + + var expression = tAttrs.dirPaginate; + // regex taken directly from https://github.com/angular/angular.js/blob/v1.4.x/src/ng/directive/ngRepeat.js#L339 + var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/); + + var filterPattern = /\|\s*itemsPerPage\s*:\s*(.*\(\s*\w*\)|([^\)]*?(?=\s+as\s+))|[^\)]*)/; + if (match[2].match(filterPattern) === null) { + throw 'pagination directive: the \'itemsPerPage\' filter must be set.'; + } + var itemsPerPageFilterRemoved = match[2].replace(filterPattern, ''); + var collectionGetter = $parse(itemsPerPageFilterRemoved); + + addNoCompileAttributes(tElement); + + // If any value is specified for paginationId, we register the un-evaluated expression at this stage for the benefit of any + // dir-pagination-controls directives that may be looking for this ID. + var rawId = tAttrs.paginationId || DEFAULT_ID; + paginationService.registerInstance(rawId); + + return function dirPaginationLinkFn(scope, element, attrs){ + + // Now that we have access to the `scope` we can interpolate any expression given in the paginationId attribute and + // potentially register a new ID if it evaluates to a different value than the rawId. + var paginationId = $parse(attrs.paginationId)(scope) || attrs.paginationId || DEFAULT_ID; + + // (TODO: this seems sound, but I'm reverting as many bug reports followed it's introduction in 0.11.0. + // Needs more investigation.) + // In case rawId != paginationId we deregister using rawId for the sake of general cleanliness + // before registering using paginationId + // paginationService.deregisterInstance(rawId); + paginationService.registerInstance(paginationId); + + var repeatExpression = getRepeatExpression(expression, paginationId); + addNgRepeatToElement(element, attrs, repeatExpression); + + removeTemporaryAttributes(element); + var compiled = $compile(element); + + var currentPageGetter = makeCurrentPageGetterFn(scope, attrs, paginationId); + paginationService.setCurrentPageParser(paginationId, currentPageGetter, scope); + + if (typeof attrs.totalItems !== 'undefined') { + paginationService.setAsyncModeTrue(paginationId); + scope.$watch(function() { + return $parse(attrs.totalItems)(scope); + }, function (result) { + if (0 <= result) { + paginationService.setCollectionLength(paginationId, result); + } + }); + } else { + paginationService.setAsyncModeFalse(paginationId); + scope.$watchCollection(function() { + return collectionGetter(scope); + }, function(collection) { + if (collection) { + var collectionLength = (collection instanceof Array) ? collection.length : Object.keys(collection).length; + paginationService.setCollectionLength(paginationId, collectionLength); + } + }); + } + + // Delegate to the link function returned by the new compilation of the ng-repeat + compiled(scope); + + // (TODO: Reverting this due to many bug reports in v 0.11.0. Needs investigation as the + // principle is sound) + // When the scope is destroyed, we make sure to remove the reference to it in paginationService + // so that it can be properly garbage collected + // scope.$on('$destroy', function destroyDirPagination() { + // paginationService.deregisterInstance(paginationId); + // }); + }; + } + + /** + * If a pagination id has been specified, we need to check that it is present as the second argument passed to + * the itemsPerPage filter. If it is not there, we add it and return the modified expression. + * + * @param expression + * @param paginationId + * @returns {*} + */ + function getRepeatExpression(expression, paginationId) { + var repeatExpression, + idDefinedInFilter = !!expression.match(/(\|\s*itemsPerPage\s*:[^|]*:[^|]*)/); + + if (paginationId !== DEFAULT_ID && !idDefinedInFilter) { + repeatExpression = expression.replace(/(\|\s*itemsPerPage\s*:\s*[^|\s]*)/, "$1 : '" + paginationId + "'"); + } else { + repeatExpression = expression; + } + + return repeatExpression; + } + + /** + * Adds the ng-repeat directive to the element. In the case of multi-element (-start, -end) it adds the + * appropriate multi-element ng-repeat to the first and last element in the range. + * @param element + * @param attrs + * @param repeatExpression + */ + function addNgRepeatToElement(element, attrs, repeatExpression) { + if (element[0].hasAttribute('dir-paginate-start') || element[0].hasAttribute('data-dir-paginate-start')) { + // using multiElement mode (dir-paginate-start, dir-paginate-end) + attrs.$set('ngRepeatStart', repeatExpression); + element.eq(element.length - 1).attr('ng-repeat-end', true); + } else { + attrs.$set('ngRepeat', repeatExpression); + } + } + + /** + * Adds the dir-paginate-no-compile directive to each element in the tElement range. + * @param tElement + */ + function addNoCompileAttributes(tElement) { + angular.forEach(tElement, function(el) { + if (el.nodeType === 1) { + angular.element(el).attr('dir-paginate-no-compile', true); + } + }); + } + + /** + * Removes the variations on dir-paginate (data-, -start, -end) and the dir-paginate-no-compile directives. + * @param element + */ + function removeTemporaryAttributes(element) { + angular.forEach(element, function(el) { + if (el.nodeType === 1) { + angular.element(el).removeAttr('dir-paginate-no-compile'); + } + }); + element.eq(0).removeAttr('dir-paginate-start').removeAttr('dir-paginate').removeAttr('data-dir-paginate-start').removeAttr('data-dir-paginate'); + element.eq(element.length - 1).removeAttr('dir-paginate-end').removeAttr('data-dir-paginate-end'); + } + + /** + * Creates a getter function for the current-page attribute, using the expression provided or a default value if + * no current-page expression was specified. + * + * @param scope + * @param attrs + * @param paginationId + * @returns {*} + */ + function makeCurrentPageGetterFn(scope, attrs, paginationId) { + var currentPageGetter; + if (attrs.currentPage) { + currentPageGetter = $parse(attrs.currentPage); + } else { + // If the current-page attribute was not set, we'll make our own. + // Replace any non-alphanumeric characters which might confuse + // the $parse service and give unexpected results. + // See https://github.com/michaelbromley/angularUtils/issues/233 + var defaultCurrentPage = (paginationId + '__currentPage').replace(/\W/g, '_'); + scope[defaultCurrentPage] = 1; + currentPageGetter = $parse(defaultCurrentPage); + } + return currentPageGetter; + } + } + + /** + * This is a helper directive that allows correct compilation when in multi-element mode (ie dir-paginate-start, dir-paginate-end). + * It is dynamically added to all elements in the dir-paginate compile function, and it prevents further compilation of + * any inner directives. It is then removed in the link function, and all inner directives are then manually compiled. + */ + function noCompileDirective() { + return { + priority: 5000, + terminal: true + }; + } + + function dirPaginationControlsTemplateInstaller($templateCache) { + $templateCache.put('angularUtils.directives.dirPagination.template', '<ul class="pagination" ng-if="1 < pages.length || !autoHide"><li ng-if="boundaryLinks" ng-class="{ disabled : pagination.current == 1 }"><a href="" ng-click="setCurrent(1)">«</a></li><li ng-if="directionLinks" ng-class="{ disabled : pagination.current == 1 }"><a href="" ng-click="setCurrent(pagination.current - 1)">‹</a></li><li ng-repeat="pageNumber in pages track by tracker(pageNumber, $index)" ng-class="{ active : pagination.current == pageNumber, disabled : pageNumber == \'...\' || ( ! autoHide && pages.length === 1 ) }"><a href="" ng-click="setCurrent(pageNumber)">{{ pageNumber }}</a></li><li ng-if="directionLinks" ng-class="{ disabled : pagination.current == pagination.last }"><a href="" ng-click="setCurrent(pagination.current + 1)">›</a></li><li ng-if="boundaryLinks" ng-class="{ disabled : pagination.current == pagination.last }"><a href="" ng-click="setCurrent(pagination.last)">»</a></li></ul>'); + } + + function dirPaginationControlsDirective(paginationService, paginationTemplate) { + + var numberRegex = /^\d+$/; + + var DDO = { + restrict: 'AE', + scope: { + maxSize: '=?', + onPageChange: '&?', + paginationId: '=?', + autoHide: '=?' + }, + link: dirPaginationControlsLinkFn + }; + + // We need to check the paginationTemplate service to see whether a template path or + // string has been specified, and add the `template` or `templateUrl` property to + // the DDO as appropriate. The order of priority to decide which template to use is + // (highest priority first): + // 1. paginationTemplate.getString() + // 2. attrs.templateUrl + // 3. paginationTemplate.getPath() + var templateString = paginationTemplate.getString(); + if (templateString !== undefined) { + DDO.template = templateString; + } else { + DDO.templateUrl = function(elem, attrs) { + return attrs.templateUrl || paginationTemplate.getPath(); + }; + } + return DDO; + + function dirPaginationControlsLinkFn(scope, element, attrs) { + + // rawId is the un-interpolated value of the pagination-id attribute. This is only important when the corresponding dir-paginate directive has + // not yet been linked (e.g. if it is inside an ng-if block), and in that case it prevents this controls directive from assuming that there is + // no corresponding dir-paginate directive and wrongly throwing an exception. + var rawId = attrs.paginationId || DEFAULT_ID; + var paginationId = scope.paginationId || attrs.paginationId || DEFAULT_ID; + + if (!paginationService.isRegistered(paginationId) && !paginationService.isRegistered(rawId)) { + var idMessage = (paginationId !== DEFAULT_ID) ? ' (id: ' + paginationId + ') ' : ' '; + if (window.console) { + console.warn('Pagination directive: the pagination controls' + idMessage + 'cannot be used without the corresponding pagination directive, which was not found at link time.'); + } + } + + if (!scope.maxSize) { scope.maxSize = 9; } + scope.autoHide = scope.autoHide === undefined ? true : scope.autoHide; + scope.directionLinks = angular.isDefined(attrs.directionLinks) ? scope.$parent.$eval(attrs.directionLinks) : true; + scope.boundaryLinks = angular.isDefined(attrs.boundaryLinks) ? scope.$parent.$eval(attrs.boundaryLinks) : false; + + var paginationRange = Math.max(scope.maxSize, 5); + scope.pages = []; + scope.pagination = { + last: 1, + current: 1 + }; + scope.range = { + lower: 1, + upper: 1, + total: 1 + }; + + scope.$watch('maxSize', function(val) { + if (val) { + paginationRange = Math.max(scope.maxSize, 5); + generatePagination(); + } + }); + + scope.$watch(function() { + if (paginationService.isRegistered(paginationId)) { + return (paginationService.getCollectionLength(paginationId) + 1) * paginationService.getItemsPerPage(paginationId); + } + }, function(length) { + if (0 < length) { + generatePagination(); + } + }); + + scope.$watch(function() { + if (paginationService.isRegistered(paginationId)) { + return (paginationService.getItemsPerPage(paginationId)); + } + }, function(current, previous) { + if (current != previous && typeof previous !== 'undefined') { + goToPage(scope.pagination.current); + } + }); + + scope.$watch(function() { + if (paginationService.isRegistered(paginationId)) { + return paginationService.getCurrentPage(paginationId); + } + }, function(currentPage, previousPage) { + if (currentPage != previousPage) { + goToPage(currentPage); + } + }); + + scope.setCurrent = function(num) { + if (paginationService.isRegistered(paginationId) && isValidPageNumber(num)) { + num = parseInt(num, 10); + paginationService.setCurrentPage(paginationId, num); + } + }; + + /** + * Custom "track by" function which allows for duplicate "..." entries on long lists, + * yet fixes the problem of wrongly-highlighted links which happens when using + * "track by $index" - see https://github.com/michaelbromley/angularUtils/issues/153 + * @param id + * @param index + * @returns {string} + */ + scope.tracker = function(id, index) { + return id + '_' + index; + }; + + function goToPage(num) { + if (paginationService.isRegistered(paginationId) && isValidPageNumber(num)) { + var oldPageNumber = scope.pagination.current; + + scope.pages = generatePagesArray(num, paginationService.getCollectionLength(paginationId), paginationService.getItemsPerPage(paginationId), paginationRange); + scope.pagination.current = num; + updateRangeValues(); + + // if a callback has been set, then call it with the page number as the first argument + // and the previous page number as a second argument + if (scope.onPageChange) { + scope.onPageChange({ + newPageNumber : num, + oldPageNumber : oldPageNumber + }); + } + } + } + + function generatePagination() { + if (paginationService.isRegistered(paginationId)) { + var page = parseInt(paginationService.getCurrentPage(paginationId)) || 1; + scope.pages = generatePagesArray(page, paginationService.getCollectionLength(paginationId), paginationService.getItemsPerPage(paginationId), paginationRange); + scope.pagination.current = page; + scope.pagination.last = scope.pages[scope.pages.length - 1]; + if (scope.pagination.last < scope.pagination.current) { + scope.setCurrent(scope.pagination.last); + } else { + updateRangeValues(); + } + } + } + + /** + * This function updates the values (lower, upper, total) of the `scope.range` object, which can be used in the pagination + * template to display the current page range, e.g. "showing 21 - 40 of 144 results"; + */ + function updateRangeValues() { + if (paginationService.isRegistered(paginationId)) { + var currentPage = paginationService.getCurrentPage(paginationId), + itemsPerPage = paginationService.getItemsPerPage(paginationId), + totalItems = paginationService.getCollectionLength(paginationId); + + scope.range.lower = (currentPage - 1) * itemsPerPage + 1; + scope.range.upper = Math.min(currentPage * itemsPerPage, totalItems); + scope.range.total = totalItems; + } + } + function isValidPageNumber(num) { + return (numberRegex.test(num) && (0 < num && num <= scope.pagination.last)); + } + } + + /** + * Generate an array of page numbers (or the '...' string) which is used in an ng-repeat to generate the + * links used in pagination + * + * @param currentPage + * @param rowsPerPage + * @param paginationRange + * @param collectionLength + * @returns {Array} + */ + function generatePagesArray(currentPage, collectionLength, rowsPerPage, paginationRange) { + var pages = []; + var totalPages = Math.ceil(collectionLength / rowsPerPage); + var halfWay = Math.ceil(paginationRange / 2); + var position; + + if (currentPage <= halfWay) { + position = 'start'; + } else if (totalPages - halfWay < currentPage) { + position = 'end'; + } else { + position = 'middle'; + } + + var ellipsesNeeded = paginationRange < totalPages; + var i = 1; + while (i <= totalPages && i <= paginationRange) { + var pageNumber = calculatePageNumber(i, currentPage, paginationRange, totalPages); + + var openingEllipsesNeeded = (i === 2 && (position === 'middle' || position === 'end')); + var closingEllipsesNeeded = (i === paginationRange - 1 && (position === 'middle' || position === 'start')); + if (ellipsesNeeded && (openingEllipsesNeeded || closingEllipsesNeeded)) { + pages.push('...'); + } else { + pages.push(pageNumber); + } + i ++; + } + return pages; + } + + /** + * Given the position in the sequence of pagination links [i], figure out what page number corresponds to that position. + * + * @param i + * @param currentPage + * @param paginationRange + * @param totalPages + * @returns {*} + */ + function calculatePageNumber(i, currentPage, paginationRange, totalPages) { + var halfWay = Math.ceil(paginationRange/2); + if (i === paginationRange) { + return totalPages; + } else if (i === 1) { + return i; + } else if (paginationRange < totalPages) { + if (totalPages - halfWay < currentPage) { + return totalPages - paginationRange + i; + } else if (halfWay < currentPage) { + return currentPage - halfWay + i; + } else { + return i; + } + } else { + return i; + } + } + } + + /** + * This filter slices the collection into pages based on the current page number and number of items per page. + * @param paginationService + * @returns {Function} + */ + function itemsPerPageFilter(paginationService) { + + return function(collection, itemsPerPage, paginationId) { + if (typeof (paginationId) === 'undefined') { + paginationId = DEFAULT_ID; + } + if (!paginationService.isRegistered(paginationId)) { + throw 'pagination directive: the itemsPerPage id argument (id: ' + paginationId + ') does not match a registered pagination-id.'; + } + var end; + var start; + if (angular.isObject(collection)) { + itemsPerPage = parseInt(itemsPerPage) || 9999999999; + if (paginationService.isAsyncMode(paginationId)) { + start = 0; + } else { + start = (paginationService.getCurrentPage(paginationId) - 1) * itemsPerPage; + } + end = start + itemsPerPage; + paginationService.setItemsPerPage(paginationId, itemsPerPage); + + if (collection instanceof Array) { + // the array just needs to be sliced + return collection.slice(start, end); + } else { + // in the case of an object, we need to get an array of keys, slice that, then map back to + // the original object. + var slicedObject = {}; + angular.forEach(keys(collection).slice(start, end), function(key) { + slicedObject[key] = collection[key]; + }); + return slicedObject; + } + } else { + return collection; + } + }; + } + + /** + * Shim for the Object.keys() method which does not exist in IE < 9 + * @param obj + * @returns {Array} + */ + function keys(obj) { + if (!Object.keys) { + var objKeys = []; + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + objKeys.push(i); + } + } + return objKeys; + } else { + return Object.keys(obj); + } + } + + /** + * This service allows the various parts of the module to communicate and stay in sync. + */ + function paginationService() { + + var instances = {}; + var lastRegisteredInstance; + + this.registerInstance = function(instanceId) { + if (typeof instances[instanceId] === 'undefined') { + instances[instanceId] = { + asyncMode: false + }; + lastRegisteredInstance = instanceId; + } + }; + + this.deregisterInstance = function(instanceId) { + delete instances[instanceId]; + }; + + this.isRegistered = function(instanceId) { + return (typeof instances[instanceId] !== 'undefined'); + }; + + this.getLastInstanceId = function() { + return lastRegisteredInstance; + }; + + this.setCurrentPageParser = function(instanceId, val, scope) { + instances[instanceId].currentPageParser = val; + instances[instanceId].context = scope; + }; + this.setCurrentPage = function(instanceId, val) { + instances[instanceId].currentPageParser.assign(instances[instanceId].context, val); + }; + this.getCurrentPage = function(instanceId) { + var parser = instances[instanceId].currentPageParser; + return parser ? parser(instances[instanceId].context) : 1; + }; + + this.setItemsPerPage = function(instanceId, val) { + instances[instanceId].itemsPerPage = val; + }; + this.getItemsPerPage = function(instanceId) { + return instances[instanceId].itemsPerPage; + }; + + this.setCollectionLength = function(instanceId, val) { + instances[instanceId].collectionLength = val; + }; + this.getCollectionLength = function(instanceId) { + return instances[instanceId].collectionLength; + }; + + this.setAsyncModeTrue = function(instanceId) { + instances[instanceId].asyncMode = true; + }; + + this.setAsyncModeFalse = function(instanceId) { + instances[instanceId].asyncMode = false; + }; + + this.isAsyncMode = function(instanceId) { + return instances[instanceId].asyncMode; + }; + } + + /** + * This provider allows global configuration of the template path used by the dir-pagination-controls directive. + */ + function paginationTemplateProvider() { + + var templatePath = 'angularUtils.directives.dirPagination.template'; + var templateString; + + /** + * Set a templateUrl to be used by all instances of <dir-pagination-controls> + * @param {String} path + */ + this.setPath = function(path) { + templatePath = path; + }; + + /** + * Set a string of HTML to be used as a template by all instances + * of <dir-pagination-controls>. If both a path *and* a string have been set, + * the string takes precedence. + * @param {String} str + */ + this.setString = function(str) { + templateString = str; + }; + + this.$get = function() { + return { + getPath: function() { + return templatePath; + }, + getString: function() { + return templateString; + } + }; + }; + } +})(); diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular.min.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular.min.js new file mode 100644 index 00000000..7f3704c9 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angular.min.js @@ -0,0 +1,250 @@ +/* + AngularJS v1.3.14 + (c) 2010-2014 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(P,X,u){'use strict';function M(b){return function(){var a=arguments[0],c;c="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.3.14/"+(b?b+"/":"")+a;for(a=1;a<arguments.length;a++){c=c+(1==a?"?":"&")+"p"+(a-1)+"=";var d=encodeURIComponent,e;e=arguments[a];e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e;c+=d(e)}return Error(c)}}function Ta(b){if(null==b||Ua(b))return!1;var a=b.length;return b.nodeType=== +na&&a?!0:x(b)||E(b)||0===a||"number"===typeof a&&0<a&&a-1 in b}function s(b,a,c){var d,e;if(b)if(G(b))for(d in b)"prototype"==d||"length"==d||"name"==d||b.hasOwnProperty&&!b.hasOwnProperty(d)||a.call(c,b[d],d,b);else if(E(b)||Ta(b)){var f="object"!==typeof b;d=0;for(e=b.length;d<e;d++)(f||d in b)&&a.call(c,b[d],d,b)}else if(b.forEach&&b.forEach!==s)b.forEach(a,c,b);else for(d in b)b.hasOwnProperty(d)&&a.call(c,b[d],d,b);return b}function Ed(b,a,c){for(var d=Object.keys(b).sort(),e=0;e<d.length;e++)a.call(c, +b[d[e]],d[e]);return d}function lc(b){return function(a,c){b(c,a)}}function Fd(){return++ob}function mc(b,a){a?b.$$hashKey=a:delete b.$$hashKey}function w(b){for(var a=b.$$hashKey,c=1,d=arguments.length;c<d;c++){var e=arguments[c];if(e)for(var f=Object.keys(e),g=0,h=f.length;g<h;g++){var l=f[g];b[l]=e[l]}}mc(b,a);return b}function $(b){return parseInt(b,10)}function Pb(b,a){return w(Object.create(b),a)}function B(){}function oa(b){return b}function da(b){return function(){return b}}function z(b){return"undefined"=== +typeof b}function y(b){return"undefined"!==typeof b}function J(b){return null!==b&&"object"===typeof b}function x(b){return"string"===typeof b}function V(b){return"number"===typeof b}function pa(b){return"[object Date]"===Da.call(b)}function G(b){return"function"===typeof b}function pb(b){return"[object RegExp]"===Da.call(b)}function Ua(b){return b&&b.window===b}function Va(b){return b&&b.$evalAsync&&b.$watch}function Wa(b){return"boolean"===typeof b}function nc(b){return!(!b||!(b.nodeName||b.prop&& +b.attr&&b.find))}function Gd(b){var a={};b=b.split(",");var c;for(c=0;c<b.length;c++)a[b[c]]=!0;return a}function ta(b){return R(b.nodeName||b[0]&&b[0].nodeName)}function Xa(b,a){var c=b.indexOf(a);0<=c&&b.splice(c,1);return a}function Ea(b,a,c,d){if(Ua(b)||Va(b))throw Ka("cpws");if(a){if(b===a)throw Ka("cpi");c=c||[];d=d||[];if(J(b)){var e=c.indexOf(b);if(-1!==e)return d[e];c.push(b);d.push(a)}if(E(b))for(var f=a.length=0;f<b.length;f++)e=Ea(b[f],null,c,d),J(b[f])&&(c.push(b[f]),d.push(e)),a.push(e); +else{var g=a.$$hashKey;E(a)?a.length=0:s(a,function(b,c){delete a[c]});for(f in b)b.hasOwnProperty(f)&&(e=Ea(b[f],null,c,d),J(b[f])&&(c.push(b[f]),d.push(e)),a[f]=e);mc(a,g)}}else if(a=b)E(b)?a=Ea(b,[],c,d):pa(b)?a=new Date(b.getTime()):pb(b)?(a=new RegExp(b.source,b.toString().match(/[^\/]*$/)[0]),a.lastIndex=b.lastIndex):J(b)&&(e=Object.create(Object.getPrototypeOf(b)),a=Ea(b,e,c,d));return a}function qa(b,a){if(E(b)){a=a||[];for(var c=0,d=b.length;c<d;c++)a[c]=b[c]}else if(J(b))for(c in a=a||{}, +b)if("$"!==c.charAt(0)||"$"!==c.charAt(1))a[c]=b[c];return a||b}function ea(b,a){if(b===a)return!0;if(null===b||null===a)return!1;if(b!==b&&a!==a)return!0;var c=typeof b,d;if(c==typeof a&&"object"==c)if(E(b)){if(!E(a))return!1;if((c=b.length)==a.length){for(d=0;d<c;d++)if(!ea(b[d],a[d]))return!1;return!0}}else{if(pa(b))return pa(a)?ea(b.getTime(),a.getTime()):!1;if(pb(b)&&pb(a))return b.toString()==a.toString();if(Va(b)||Va(a)||Ua(b)||Ua(a)||E(a))return!1;c={};for(d in b)if("$"!==d.charAt(0)&&!G(b[d])){if(!ea(b[d], +a[d]))return!1;c[d]=!0}for(d in a)if(!c.hasOwnProperty(d)&&"$"!==d.charAt(0)&&a[d]!==u&&!G(a[d]))return!1;return!0}return!1}function Ya(b,a,c){return b.concat(Za.call(a,c))}function oc(b,a){var c=2<arguments.length?Za.call(arguments,2):[];return!G(a)||a instanceof RegExp?a:c.length?function(){return arguments.length?a.apply(b,Ya(c,arguments,0)):a.apply(b,c)}:function(){return arguments.length?a.apply(b,arguments):a.call(b)}}function Hd(b,a){var c=a;"string"===typeof b&&"$"===b.charAt(0)&&"$"===b.charAt(1)? +c=u:Ua(a)?c="$WINDOW":a&&X===a?c="$DOCUMENT":Va(a)&&(c="$SCOPE");return c}function $a(b,a){if("undefined"===typeof b)return u;V(a)||(a=a?2:null);return JSON.stringify(b,Hd,a)}function pc(b){return x(b)?JSON.parse(b):b}function ua(b){b=C(b).clone();try{b.empty()}catch(a){}var c=C("<div>").append(b).html();try{return b[0].nodeType===qb?R(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+R(b)})}catch(d){return R(c)}}function qc(b){try{return decodeURIComponent(b)}catch(a){}}function rc(b){var a= +{},c,d;s((b||"").split("&"),function(b){b&&(c=b.replace(/\+/g,"%20").split("="),d=qc(c[0]),y(d)&&(b=y(c[1])?qc(c[1]):!0,sc.call(a,d)?E(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Qb(b){var a=[];s(b,function(b,d){E(b)?s(b,function(b){a.push(Fa(d,!0)+(!0===b?"":"="+Fa(b,!0)))}):a.push(Fa(d,!0)+(!0===b?"":"="+Fa(b,!0)))});return a.length?a.join("&"):""}function rb(b){return Fa(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Fa(b,a){return encodeURIComponent(b).replace(/%40/gi, +"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,a?"%20":"+")}function Id(b,a){var c,d,e=sb.length;b=C(b);for(d=0;d<e;++d)if(c=sb[d]+a,x(c=b.attr(c)))return c;return null}function Jd(b,a){var c,d,e={};s(sb,function(a){a+="app";!c&&b.hasAttribute&&b.hasAttribute(a)&&(c=b,d=b.getAttribute(a))});s(sb,function(a){a+="app";var e;!c&&(e=b.querySelector("["+a.replace(":","\\:")+"]"))&&(c=e,d=e.getAttribute(a))});c&&(e.strictDi=null!==Id(c,"strict-di"), +a(c,d?[d]:[],e))}function tc(b,a,c){J(c)||(c={});c=w({strictDi:!1},c);var d=function(){b=C(b);if(b.injector()){var d=b[0]===X?"document":ua(b);throw Ka("btstrpd",d.replace(/</,"<").replace(/>/,">"));}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);c.debugInfoEnabled&&a.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);a.unshift("ng");d=ab(a,c.strictDi);d.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector", +d);c(b)(a)})}]);return d},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;P&&e.test(P.name)&&(c.debugInfoEnabled=!0,P.name=P.name.replace(e,""));if(P&&!f.test(P.name))return d();P.name=P.name.replace(f,"");aa.resumeBootstrap=function(b){s(b,function(b){a.push(b)});return d()};G(aa.resumeDeferredBootstrap)&&aa.resumeDeferredBootstrap()}function Kd(){P.name="NG_ENABLE_DEBUG_INFO!"+P.name;P.location.reload()}function Ld(b){b=aa.element(b).injector();if(!b)throw Ka("test");return b.get("$$testability")} +function uc(b,a){a=a||"_";return b.replace(Md,function(b,d){return(d?a:"")+b.toLowerCase()})}function Nd(){var b;vc||((ra=P.jQuery)&&ra.fn.on?(C=ra,w(ra.fn,{scope:La.scope,isolateScope:La.isolateScope,controller:La.controller,injector:La.injector,inheritedData:La.inheritedData}),b=ra.cleanData,ra.cleanData=function(a){var c;if(Rb)Rb=!1;else for(var d=0,e;null!=(e=a[d]);d++)(c=ra._data(e,"events"))&&c.$destroy&&ra(e).triggerHandler("$destroy");b(a)}):C=Q,aa.element=C,vc=!0)}function Sb(b,a,c){if(!b)throw Ka("areq", +a||"?",c||"required");return b}function tb(b,a,c){c&&E(b)&&(b=b[b.length-1]);Sb(G(b),a,"not a function, got "+(b&&"object"===typeof b?b.constructor.name||"Object":typeof b));return b}function Ma(b,a){if("hasOwnProperty"===b)throw Ka("badname",a);}function wc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;g<f;g++)d=a[g],b&&(b=(e=b)[d]);return!c&&G(b)?oc(e,b):b}function ub(b){var a=b[0];b=b[b.length-1];var c=[a];do{a=a.nextSibling;if(!a)break;c.push(a)}while(a!==b);return C(c)}function fa(){return Object.create(null)} +function Od(b){function a(a,b,c){return a[b]||(a[b]=c())}var c=M("$injector"),d=M("ng");b=a(b,"angular",Object);b.$$minErr=b.$$minErr||M;return a(b,"module",function(){var b={};return function(f,g,h){if("hasOwnProperty"===f)throw d("badname","module");g&&b.hasOwnProperty(f)&&(b[f]=null);return a(b,f,function(){function a(c,d,e,f){f||(f=b);return function(){f[e||"push"]([c,d,arguments]);return t}}if(!g)throw c("nomod",f);var b=[],d=[],e=[],q=a("$injector","invoke","push",d),t={_invokeQueue:b,_configBlocks:d, +_runBlocks:e,requires:g,name:f,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),animation:a("$animateProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:q,run:function(a){e.push(a);return this}};h&&q(h);return t})}})}function Pd(b){w(b,{bootstrap:tc,copy:Ea,extend:w,equals:ea, +element:C,forEach:s,injector:ab,noop:B,bind:oc,toJson:$a,fromJson:pc,identity:oa,isUndefined:z,isDefined:y,isString:x,isFunction:G,isObject:J,isNumber:V,isElement:nc,isArray:E,version:Qd,isDate:pa,lowercase:R,uppercase:vb,callbacks:{counter:0},getTestability:Ld,$$minErr:M,$$csp:bb,reloadWithDebugInfo:Kd});cb=Od(P);try{cb("ngLocale")}catch(a){cb("ngLocale",[]).provider("$locale",Rd)}cb("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:Sd});a.provider("$compile",xc).directive({a:Td, +input:yc,textarea:yc,form:Ud,script:Vd,select:Wd,style:Xd,option:Yd,ngBind:Zd,ngBindHtml:$d,ngBindTemplate:ae,ngClass:be,ngClassEven:ce,ngClassOdd:de,ngCloak:ee,ngController:fe,ngForm:ge,ngHide:he,ngIf:ie,ngInclude:je,ngInit:ke,ngNonBindable:le,ngPluralize:me,ngRepeat:ne,ngShow:oe,ngStyle:pe,ngSwitch:qe,ngSwitchWhen:re,ngSwitchDefault:se,ngOptions:te,ngTransclude:ue,ngModel:ve,ngList:we,ngChange:xe,pattern:zc,ngPattern:zc,required:Ac,ngRequired:Ac,minlength:Bc,ngMinlength:Bc,maxlength:Cc,ngMaxlength:Cc, +ngValue:ye,ngModelOptions:ze}).directive({ngInclude:Ae}).directive(wb).directive(Dc);a.provider({$anchorScroll:Be,$animate:Ce,$browser:De,$cacheFactory:Ee,$controller:Fe,$document:Ge,$exceptionHandler:He,$filter:Ec,$interpolate:Ie,$interval:Je,$http:Ke,$httpBackend:Le,$location:Me,$log:Ne,$parse:Oe,$rootScope:Pe,$q:Qe,$$q:Re,$sce:Se,$sceDelegate:Te,$sniffer:Ue,$templateCache:Ve,$templateRequest:We,$$testability:Xe,$timeout:Ye,$window:Ze,$$rAF:$e,$$asyncCallback:af,$$jqLite:bf})}])}function db(b){return b.replace(cf, +function(a,b,d,e){return e?d.toUpperCase():d}).replace(df,"Moz$1")}function Fc(b){b=b.nodeType;return b===na||!b||9===b}function Gc(b,a){var c,d,e=a.createDocumentFragment(),f=[];if(Tb.test(b)){c=c||e.appendChild(a.createElement("div"));d=(ef.exec(b)||["",""])[1].toLowerCase();d=ga[d]||ga._default;c.innerHTML=d[1]+b.replace(ff,"<$1></$2>")+d[2];for(d=d[0];d--;)c=c.lastChild;f=Ya(f,c.childNodes);c=e.firstChild;c.textContent=""}else f.push(a.createTextNode(b));e.textContent="";e.innerHTML="";s(f,function(a){e.appendChild(a)}); +return e}function Q(b){if(b instanceof Q)return b;var a;x(b)&&(b=T(b),a=!0);if(!(this instanceof Q)){if(a&&"<"!=b.charAt(0))throw Ub("nosel");return new Q(b)}if(a){a=X;var c;b=(c=gf.exec(b))?[a.createElement(c[1])]:(c=Gc(b,a))?c.childNodes:[]}Hc(this,b)}function Vb(b){return b.cloneNode(!0)}function xb(b,a){a||yb(b);if(b.querySelectorAll)for(var c=b.querySelectorAll("*"),d=0,e=c.length;d<e;d++)yb(c[d])}function Ic(b,a,c,d){if(y(d))throw Ub("offargs");var e=(d=zb(b))&&d.events,f=d&&d.handle;if(f)if(a)s(a.split(" "), +function(a){if(y(c)){var d=e[a];Xa(d||[],c);if(d&&0<d.length)return}b.removeEventListener(a,f,!1);delete e[a]});else for(a in e)"$destroy"!==a&&b.removeEventListener(a,f,!1),delete e[a]}function yb(b,a){var c=b.ng339,d=c&&Ab[c];d&&(a?delete d.data[a]:(d.handle&&(d.events.$destroy&&d.handle({},"$destroy"),Ic(b)),delete Ab[c],b.ng339=u))}function zb(b,a){var c=b.ng339,c=c&&Ab[c];a&&!c&&(b.ng339=c=++hf,c=Ab[c]={events:{},data:{},handle:u});return c}function Wb(b,a,c){if(Fc(b)){var d=y(c),e=!d&&a&&!J(a), +f=!a;b=(b=zb(b,!e))&&b.data;if(d)b[a]=c;else{if(f)return b;if(e)return b&&b[a];w(b,a)}}}function Bb(b,a){return b.getAttribute?-1<(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+a+" "):!1}function Cb(b,a){a&&b.setAttribute&&s(a.split(" "),function(a){b.setAttribute("class",T((" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+T(a)+" "," ")))})}function Db(b,a){if(a&&b.setAttribute){var c=(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," "); +s(a.split(" "),function(a){a=T(a);-1===c.indexOf(" "+a+" ")&&(c+=a+" ")});b.setAttribute("class",T(c))}}function Hc(b,a){if(a)if(a.nodeType)b[b.length++]=a;else{var c=a.length;if("number"===typeof c&&a.window!==a){if(c)for(var d=0;d<c;d++)b[b.length++]=a[d]}else b[b.length++]=a}}function Jc(b,a){return Eb(b,"$"+(a||"ngController")+"Controller")}function Eb(b,a,c){9==b.nodeType&&(b=b.documentElement);for(a=E(a)?a:[a];b;){for(var d=0,e=a.length;d<e;d++)if((c=C.data(b,a[d]))!==u)return c;b=b.parentNode|| +11===b.nodeType&&b.host}}function Kc(b){for(xb(b,!0);b.firstChild;)b.removeChild(b.firstChild)}function Lc(b,a){a||xb(b);var c=b.parentNode;c&&c.removeChild(b)}function jf(b,a){a=a||P;if("complete"===a.document.readyState)a.setTimeout(b);else C(a).on("load",b)}function Mc(b,a){var c=Fb[a.toLowerCase()];return c&&Nc[ta(b)]&&c}function kf(b,a){var c=b.nodeName;return("INPUT"===c||"TEXTAREA"===c)&&Oc[a]}function lf(b,a){var c=function(c,e){c.isDefaultPrevented=function(){return c.defaultPrevented};var f= +a[e||c.type],g=f?f.length:0;if(g){if(z(c.immediatePropagationStopped)){var h=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();h&&h.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};1<g&&(f=qa(f));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||f[l].call(b,c)}};c.elem=b;return c}function bf(){this.$get=function(){return w(Q,{hasClass:function(b,a){b.attr&&(b=b[0]); +return Bb(b,a)},addClass:function(b,a){b.attr&&(b=b[0]);return Db(b,a)},removeClass:function(b,a){b.attr&&(b=b[0]);return Cb(b,a)}})}}function Na(b,a){var c=b&&b.$$hashKey;if(c)return"function"===typeof c&&(c=b.$$hashKey()),c;c=typeof b;return c="function"==c||"object"==c&&null!==b?b.$$hashKey=c+":"+(a||Fd)():c+":"+b}function eb(b,a){if(a){var c=0;this.nextUid=function(){return++c}}s(b,this.put,this)}function mf(b){return(b=b.toString().replace(Pc,"").match(Qc))?"function("+(b[1]||"").replace(/[\s\r\n]+/, +" ")+")":"fn"}function ab(b,a){function c(a){return function(b,c){if(J(b))s(b,lc(a));else return a(b,c)}}function d(a,b){Ma(a,"service");if(G(b)||E(b))b=q.instantiate(b);if(!b.$get)throw Ga("pget",a);return p[a+"Provider"]=b}function e(a,b){return function(){var c=r.invoke(b,this);if(z(c))throw Ga("undef",a);return c}}function f(a,b,c){return d(a,{$get:!1!==c?e(a,b):b})}function g(a){var b=[],c;s(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=q.get(e[0]);f[e[1]].apply(f, +e[2])}}if(!m.get(a)){m.put(a,!0);try{x(a)?(c=cb(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):G(a)?b.push(q.invoke(a)):E(a)?b.push(q.invoke(a)):tb(a,"module")}catch(e){throw E(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ga("modulerr",a,e.stack||e.message||e);}}});return b}function h(b,c){function d(a,e){if(b.hasOwnProperty(a)){if(b[a]===l)throw Ga("cdep",a+" <- "+k.join(" <- "));return b[a]}try{return k.unshift(a), +b[a]=l,b[a]=c(a,e)}catch(f){throw b[a]===l&&delete b[a],f;}finally{k.shift()}}function e(b,c,f,g){"string"===typeof f&&(g=f,f=null);var h=[],k=ab.$$annotate(b,a,g),l,q,p;q=0;for(l=k.length;q<l;q++){p=k[q];if("string"!==typeof p)throw Ga("itkn",p);h.push(f&&f.hasOwnProperty(p)?f[p]:d(p,g))}E(b)&&(b=b[l]);return b.apply(c,h)}return{invoke:e,instantiate:function(a,b,c){var d=Object.create((E(a)?a[a.length-1]:a).prototype||null);a=e(a,d,b,c);return J(a)||G(a)?a:d},get:d,annotate:ab.$$annotate,has:function(a){return p.hasOwnProperty(a+ +"Provider")||b.hasOwnProperty(a)}}}a=!0===a;var l={},k=[],m=new eb([],!0),p={$provide:{provider:c(d),factory:c(f),service:c(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:c(function(a,b){return f(a,da(b),!1)}),constant:c(function(a,b){Ma(a,"constant");p[a]=b;t[a]=b}),decorator:function(a,b){var c=q.get(a+"Provider"),d=c.$get;c.$get=function(){var a=r.invoke(d,c);return r.invoke(b,null,{$delegate:a})}}}},q=p.$injector=h(p,function(a,b){aa.isString(b)&&k.push(b); +throw Ga("unpr",k.join(" <- "));}),t={},r=t.$injector=h(t,function(a,b){var c=q.get(a+"Provider",b);return r.invoke(c.$get,c,u,a)});s(g(b),function(a){r.invoke(a||B)});return r}function Be(){var b=!0;this.disableAutoScrolling=function(){b=!1};this.$get=["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;Array.prototype.some.call(a,function(a){if("a"===ta(a))return b=a,!0});return b}function f(b){if(b){b.scrollIntoView();var c;c=g.yOffset;G(c)?c=c():nc(c)?(c=c[0],c="fixed"!== +a.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):V(c)||(c=0);c&&(b=b.getBoundingClientRect().top,a.scrollBy(0,b-c))}else a.scrollTo(0,0)}function g(){var a=c.hash(),b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var h=a.document;b&&d.$watch(function(){return c.hash()},function(a,b){a===b&&""===a||jf(function(){d.$evalAsync(g)})});return g}]}function af(){this.$get=["$$rAF","$timeout",function(b,a){return b.supported?function(a){return b(a)}: +function(b){return a(b,0,!1)}}]}function nf(b,a,c,d){function e(a){try{a.apply(null,Za.call(arguments,1))}finally{if(n--,0===n)for(;D.length;)try{D.pop()()}catch(b){c.error(b)}}}function f(a,b){(function ca(){s(H,function(a){a()});v=b(ca,a)})()}function g(){h();l()}function h(){A=b.history.state;A=z(A)?null:A;ea(A,O)&&(A=O);O=A}function l(){if(F!==m.url()||N!==A)F=m.url(),N=A,s(W,function(a){a(m.url(),A)})}function k(a){try{return decodeURIComponent(a)}catch(b){return a}}var m=this,p=a[0],q=b.location, +t=b.history,r=b.setTimeout,S=b.clearTimeout,K={};m.isMock=!1;var n=0,D=[];m.$$completeOutstandingRequest=e;m.$$incOutstandingRequestCount=function(){n++};m.notifyWhenNoOutstandingRequests=function(a){s(H,function(a){a()});0===n?a():D.push(a)};var H=[],v;m.addPollFn=function(a){z(v)&&f(100,r);H.push(a);return a};var A,N,F=q.href,ba=a.find("base"),I=null;h();N=A;m.url=function(a,c,e){z(e)&&(e=null);q!==b.location&&(q=b.location);t!==b.history&&(t=b.history);if(a){var f=N===e;if(F===a&&(!d.history|| +f))return m;var g=F&&Ha(F)===Ha(a);F=a;N=e;!d.history||g&&f?(g||(I=a),c?q.replace(a):g?(c=q,e=a.indexOf("#"),a=-1===e?"":a.substr(e+1),c.hash=a):q.href=a):(t[c?"replaceState":"pushState"](e,"",a),h(),N=A);return m}return I||q.href.replace(/%27/g,"'")};m.state=function(){return A};var W=[],va=!1,O=null;m.onUrlChange=function(a){if(!va){if(d.history)C(b).on("popstate",g);C(b).on("hashchange",g);va=!0}W.push(a);return a};m.$$checkUrlChange=l;m.baseHref=function(){var a=ba.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/, +""):""};var wa={},y="",ha=m.baseHref();m.cookies=function(a,b){var d,e,f,g;if(a)b===u?p.cookie=encodeURIComponent(a)+"=;path="+ha+";expires=Thu, 01 Jan 1970 00:00:00 GMT":x(b)&&(d=(p.cookie=encodeURIComponent(a)+"="+encodeURIComponent(b)+";path="+ha).length+1,4096<d&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!"));else{if(p.cookie!==y)for(y=p.cookie,d=y.split("; "),wa={},f=0;f<d.length;f++)e=d[f],g=e.indexOf("="),0<g&&(a=k(e.substring(0,g)), +wa[a]===u&&(wa[a]=k(e.substring(g+1))));return wa}};m.defer=function(a,b){var c;n++;c=r(function(){delete K[c];e(a)},b||0);K[c]=!0;return c};m.defer.cancel=function(a){return K[a]?(delete K[a],S(a),e(B),!0):!1}}function De(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new nf(b,d,a,c)}]}function Ee(){this.$get=function(){function b(b,d){function e(a){a!=p&&(q?q==a&&(q=a.n):q=a,f(a.n,a.p),f(a,p),p=a,p.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(b in a)throw M("$cacheFactory")("iid", +b);var g=0,h=w({},d,{id:b}),l={},k=d&&d.capacity||Number.MAX_VALUE,m={},p=null,q=null;return a[b]={put:function(a,b){if(k<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}if(!z(b))return a in l||g++,l[a]=b,g>k&&this.remove(q.key),b},get:function(a){if(k<Number.MAX_VALUE){var b=m[a];if(!b)return;e(b)}return l[a]},remove:function(a){if(k<Number.MAX_VALUE){var b=m[a];if(!b)return;b==p&&(p=b.p);b==q&&(q=b.n);f(b.n,b.p);delete m[a]}delete l[a];g--},removeAll:function(){l={};g=0;m={};p=q=null},destroy:function(){m= +h=l=null;delete a[b]},info:function(){return w({},h,{size:g})}}}var a={};b.info=function(){var b={};s(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function Ve(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function xc(b,a){function c(a,b){var c=/^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*$/,d={};s(a,function(a,e){var f=a.match(c);if(!f)throw ia("iscp",b,e,a);d[e]={mode:f[1][0],collection:"*"===f[2],optional:"?"===f[3],attrName:f[4]||e}});return d}var d= +{},e=/^\s*directive\:\s*([\w\-]+)\s+(.*)$/,f=/(([\w\-]+)(?:\:([^;]+))?;?)/,g=Gd("ngSrc,ngSrcset,src,srcset"),h=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,l=/^(on[a-z]+|formaction)$/;this.directive=function p(a,e){Ma(a,"directive");x(a)?(Sb(e,"directiveFactory"),d.hasOwnProperty(a)||(d[a]=[],b.factory(a+"Directive",["$injector","$exceptionHandler",function(b,e){var f=[];s(d[a],function(d,g){try{var h=b.invoke(d);G(h)?h={compile:da(h)}:!h.compile&&h.link&&(h.compile=da(h.link));h.priority=h.priority||0;h.index= +g;h.name=h.name||a;h.require=h.require||h.controller&&h.name;h.restrict=h.restrict||"EA";J(h.scope)&&(h.$$isolateBindings=c(h.scope,h.name));f.push(h)}catch(l){e(l)}});return f}])),d[a].push(e)):s(a,lc(p));return this};this.aHrefSanitizationWhitelist=function(b){return y(b)?(a.aHrefSanitizationWhitelist(b),this):a.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(b){return y(b)?(a.imgSrcSanitizationWhitelist(b),this):a.imgSrcSanitizationWhitelist()};var k=!0;this.debugInfoEnabled= +function(a){return y(a)?(k=a,this):k};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",function(a,b,c,r,S,K,n,D,H,v,A){function N(a,b){try{a.addClass(b)}catch(c){}}function F(a,b,c,d,e){a instanceof C||(a=C(a));s(a,function(b,c){b.nodeType==qb&&b.nodeValue.match(/\S+/)&&(a[c]=C(b).wrap("<span></span>").parent()[0])});var f=ba(a,b,a,c,d,e);F.$$addScopeClass(a);var g=null;return function(b, +c,d){Sb(b,"scope");d=d||{};var e=d.parentBoundTranscludeFn,h=d.transcludeControllers;d=d.futureParentElement;e&&e.$$boundTransclude&&(e=e.$$boundTransclude);g||(g=(d=d&&d[0])?"foreignobject"!==ta(d)&&d.toString().match(/SVG/)?"svg":"html":"html");d="html"!==g?C(Xb(g,C("<div>").append(a).html())):c?La.clone.call(a):a;if(h)for(var l in h)d.data("$"+l+"Controller",h[l].instance);F.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,e);return d}}function ba(a,b,c,d,e,f){function g(a,c,d,e){var f,l,k,q,p,r,D;if(n)for(D= +Array(c.length),q=0;q<h.length;q+=3)f=h[q],D[f]=c[f];else D=c;q=0;for(p=h.length;q<p;)l=D[h[q++]],c=h[q++],f=h[q++],c?(c.scope?(k=a.$new(),F.$$addScopeInfo(C(l),k)):k=a,r=c.transcludeOnThisElement?I(a,c.transclude,e,c.elementTranscludeOnThisElement):!c.templateOnThisElement&&e?e:!e&&b?I(a,b):null,c(f,k,l,d,r)):f&&f(a,l.childNodes,u,e)}for(var h=[],l,k,q,p,n,r=0;r<a.length;r++){l=new Yb;k=W(a[r],[],l,0===r?d:u,e);(f=k.length?y(k,a[r],l,b,c,null,[],[],f):null)&&f.scope&&F.$$addScopeClass(l.$$element); +l=f&&f.terminal||!(q=a[r].childNodes)||!q.length?null:ba(q,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b);if(f||l)h.push(r,f,l),p=!0,n=n||f;f=null}return p?g:null}function I(a,b,c,d){return function(d,e,f,g,h){d||(d=a.$new(!1,h),d.$$transcluded=!0);return b(d,e,{parentBoundTranscludeFn:c,transcludeControllers:f,futureParentElement:g})}}function W(a,b,c,d,g){var h=c.$attr,l;switch(a.nodeType){case na:ha(b,ya(ta(a)),"E",d,g);for(var k,q,p,n=a.attributes,r=0,D=n&&n.length;r< +D;r++){var S=!1,t=!1;k=n[r];l=k.name;q=T(k.value);k=ya(l);if(p=Pa.test(k))l=l.replace(Sc,"").substr(8).replace(/_(.)/g,function(a,b){return b.toUpperCase()});var A=k.replace(/(Start|End)$/,"");fb(A)&&k===A+"Start"&&(S=l,t=l.substr(0,l.length-5)+"end",l=l.substr(0,l.length-6));k=ya(l.toLowerCase());h[k]=l;if(p||!c.hasOwnProperty(k))c[k]=q,Mc(a,k)&&(c[k]=!0);Aa(a,b,q,k,p);ha(b,k,"A",d,g,S,t)}a=a.className;J(a)&&(a=a.animVal);if(x(a)&&""!==a)for(;l=f.exec(a);)k=ya(l[2]),ha(b,k,"C",d,g)&&(c[k]=T(l[3])), +a=a.substr(l.index+l[0].length);break;case qb:P(b,a.nodeValue);break;case 8:try{if(l=e.exec(a.nodeValue))k=ya(l[1]),ha(b,k,"M",d,g)&&(c[k]=T(l[2]))}catch(v){}}b.sort(ca);return b}function va(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ia("uterdir",b,c);a.nodeType==na&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return C(d)}function O(a,b,c){return function(d,e,f,g,h){e=va(e[0],b,c);return a(d,e,f,g,h)}}function y(a, +d,e,f,g,l,k,p,n){function r(a,b,c,d){if(a){c&&(a=O(a,c,d));a.require=L.require;a.directiveName=ca;if(I===L||L.$$isolateScope)a=Y(a,{isolateScope:!0});k.push(a)}if(b){c&&(b=O(b,c,d));b.require=L.require;b.directiveName=ca;if(I===L||L.$$isolateScope)b=Y(b,{isolateScope:!0});p.push(b)}}function D(a,b,c,d){var e,f="data",g=!1,l=c,k;if(x(b)){k=b.match(h);b=b.substring(k[0].length);k[3]&&(k[1]?k[3]=null:k[1]=k[3]);"^"===k[1]?f="inheritedData":"^^"===k[1]&&(f="inheritedData",l=c.parent());"?"===k[2]&&(g= +!0);e=null;d&&"data"===f&&(e=d[b])&&(e=e.instance);e=e||l[f]("$"+b+"Controller");if(!e&&!g)throw ia("ctreq",b,a);return e||null}E(b)&&(e=[],s(b,function(b){e.push(D(a,b,c,d))}));return e}function A(a,c,f,g,h){function l(a,b,c){var d;Va(a)||(c=b,b=a,a=u);B&&(d=N);c||(c=B?W.parent():W);return h(a,b,d,c,va)}var n,r,t,v,N,gb,W,O;d===f?(O=e,W=e.$$element):(W=C(f),O=new Yb(W,e));I&&(v=c.$new(!0));h&&(gb=l,gb.$$boundTransclude=h);H&&(ba={},N={},s(H,function(a){var b={$scope:a===I||a.$$isolateScope?v:c,$element:W, +$attrs:O,$transclude:gb};t=a.controller;"@"==t&&(t=O[a.name]);b=K(t,b,!0,a.controllerAs);N[a.name]=b;B||W.data("$"+a.name+"Controller",b.instance);ba[a.name]=b}));if(I){F.$$addScopeInfo(W,v,!0,!(ja&&(ja===I||ja===I.$$originalDirective)));F.$$addScopeClass(W,!0);g=ba&&ba[I.name];var xa=v;g&&g.identifier&&!0===I.bindToController&&(xa=g.instance);s(v.$$isolateBindings=I.$$isolateBindings,function(a,d){var e=a.attrName,f=a.optional,g,h,l,k;switch(a.mode){case "@":O.$observe(e,function(a){xa[d]=a});O.$$observers[e].$$scope= +c;O[e]&&(xa[d]=b(O[e])(c));break;case "=":if(f&&!O[e])break;h=S(O[e]);k=h.literal?ea:function(a,b){return a===b||a!==a&&b!==b};l=h.assign||function(){g=xa[d]=h(c);throw ia("nonassign",O[e],I.name);};g=xa[d]=h(c);f=function(a){k(a,xa[d])||(k(a,g)?l(c,a=xa[d]):xa[d]=a);return g=a};f.$stateful=!0;f=a.collection?c.$watchCollection(O[e],f):c.$watch(S(O[e],f),null,h.literal);v.$on("$destroy",f);break;case "&":h=S(O[e]),xa[d]=function(a){return h(c,a)}}})}ba&&(s(ba,function(a){a()}),ba=null);g=0;for(n=k.length;g< +n;g++)r=k[g],Z(r,r.isolateScope?v:c,W,O,r.require&&D(r.directiveName,r.require,W,N),gb);var va=c;I&&(I.template||null===I.templateUrl)&&(va=v);a&&a(va,f.childNodes,u,h);for(g=p.length-1;0<=g;g--)r=p[g],Z(r,r.isolateScope?v:c,W,O,r.require&&D(r.directiveName,r.require,W,N),gb)}n=n||{};for(var v=-Number.MAX_VALUE,N,H=n.controllerDirectives,ba,I=n.newIsolateScopeDirective,ja=n.templateDirective,wa=n.nonTlbTranscludeDirective,ha=!1,fb=!1,B=n.hasElementTranscludeDirective,w=e.$$element=C(d),L,ca,U,R=f, +P,Q=0,Aa=a.length;Q<Aa;Q++){L=a[Q];var Pa=L.$$start,$=L.$$end;Pa&&(w=va(d,Pa,$));U=u;if(v>L.priority)break;if(U=L.scope)L.templateUrl||(J(U)?(Oa("new/isolated scope",I||N,L,w),I=L):Oa("new/isolated scope",I,L,w)),N=N||L;ca=L.name;!L.templateUrl&&L.controller&&(U=L.controller,H=H||{},Oa("'"+ca+"' controller",H[ca],L,w),H[ca]=L);if(U=L.transclude)ha=!0,L.$$tlb||(Oa("transclusion",wa,L,w),wa=L),"element"==U?(B=!0,v=L.priority,U=w,w=e.$$element=C(X.createComment(" "+ca+": "+e[ca]+" ")),d=w[0],V(g,Za.call(U, +0),d),R=F(U,f,v,l&&l.name,{nonTlbTranscludeDirective:wa})):(U=C(Vb(d)).contents(),w.empty(),R=F(U,f));if(L.template)if(fb=!0,Oa("template",ja,L,w),ja=L,U=G(L.template)?L.template(w,e):L.template,U=Tc(U),L.replace){l=L;U=Tb.test(U)?Uc(Xb(L.templateNamespace,T(U))):[];d=U[0];if(1!=U.length||d.nodeType!==na)throw ia("tplrt",ca,"");V(g,w,d);Aa={$attr:{}};U=W(d,[],Aa);var of=a.splice(Q+1,a.length-(Q+1));I&&z(U);a=a.concat(U).concat(of);Rc(e,Aa);Aa=a.length}else w.html(U);if(L.templateUrl)fb=!0,Oa("template", +ja,L,w),ja=L,L.replace&&(l=L),A=M(a.splice(Q,a.length-Q),w,e,g,ha&&R,k,p,{controllerDirectives:H,newIsolateScopeDirective:I,templateDirective:ja,nonTlbTranscludeDirective:wa}),Aa=a.length;else if(L.compile)try{P=L.compile(w,e,R),G(P)?r(null,P,Pa,$):P&&r(P.pre,P.post,Pa,$)}catch(aa){c(aa,ua(w))}L.terminal&&(A.terminal=!0,v=Math.max(v,L.priority))}A.scope=N&&!0===N.scope;A.transcludeOnThisElement=ha;A.elementTranscludeOnThisElement=B;A.templateOnThisElement=fb;A.transclude=R;n.hasElementTranscludeDirective= +B;return A}function z(a){for(var b=0,c=a.length;b<c;b++)a[b]=Pb(a[b],{$$isolateScope:!0})}function ha(b,e,f,g,h,l,k){if(e===h)return null;h=null;if(d.hasOwnProperty(e)){var q;e=a.get(e+"Directive");for(var n=0,r=e.length;n<r;n++)try{q=e[n],(g===u||g>q.priority)&&-1!=q.restrict.indexOf(f)&&(l&&(q=Pb(q,{$$start:l,$$end:k})),b.push(q),h=q)}catch(D){c(D)}}return h}function fb(b){if(d.hasOwnProperty(b))for(var c=a.get(b+"Directive"),e=0,f=c.length;e<f;e++)if(b=c[e],b.multiElement)return!0;return!1}function Rc(a, +b){var c=b.$attr,d=a.$attr,e=a.$$element;s(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});s(b,function(b,f){"class"==f?(N(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function M(a,b,c,d,e,f,g,h){var l=[],k,q,p=b[0],n=a.shift(),D=Pb(n,{templateUrl:null,transclude:null,replace:null,$$originalDirective:n}), +S=G(n.templateUrl)?n.templateUrl(b,c):n.templateUrl,t=n.templateNamespace;b.empty();r(H.getTrustedResourceUrl(S)).then(function(r){var A,v;r=Tc(r);if(n.replace){r=Tb.test(r)?Uc(Xb(t,T(r))):[];A=r[0];if(1!=r.length||A.nodeType!==na)throw ia("tplrt",n.name,S);r={$attr:{}};V(d,b,A);var H=W(A,[],r);J(n.scope)&&z(H);a=H.concat(a);Rc(c,r)}else A=p,b.html(r);a.unshift(D);k=y(a,A,c,e,b,n,f,g,h);s(d,function(a,c){a==A&&(d[c]=b[0])});for(q=ba(b[0].childNodes,e);l.length;){r=l.shift();v=l.shift();var F=l.shift(), +K=l.shift(),H=b[0];if(!r.$$destroyed){if(v!==p){var O=v.className;h.hasElementTranscludeDirective&&n.replace||(H=Vb(A));V(F,C(v),H);N(C(H),O)}v=k.transcludeOnThisElement?I(r,k.transclude,K):K;k(q,r,H,d,v)}}l=null});return function(a,b,c,d,e){a=e;b.$$destroyed||(l?l.push(b,c,d,a):(k.transcludeOnThisElement&&(a=I(b,k.transclude,e)),k(q,b,c,d,a)))}}function ca(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function Oa(a,b,c,d){if(b)throw ia("multidir", +b.name,c.name,a,ua(d));}function P(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&F.$$addBindingClass(a);return function(a,c){var e=c.parent();b||F.$$addBindingClass(e);F.$$addBindingInfo(e,d.expressions);a.$watch(d,function(a){c[0].nodeValue=a})}}})}function Xb(a,b){a=R(a||"html");switch(a){case "svg":case "math":var c=X.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function Q(a,b){if("srcdoc"== +b)return H.HTML;var c=ta(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return H.RESOURCE_URL}function Aa(a,c,d,e,f){var h=Q(a,e);f=g[e]||f;var k=b(d,!0,h,f);if(k){if("multiple"===e&&"select"===ta(a))throw ia("selmulti",ua(a));c.push({priority:100,compile:function(){return{pre:function(a,c,g){c=g.$$observers||(g.$$observers={});if(l.test(e))throw ia("nodomevents");var n=g[e];n!==d&&(k=n&&b(n,!0,h,f),d=n);k&&(g[e]=k(a),(c[e]||(c[e]=[])).$$inter=!0,(g.$$observers&&g.$$observers[e].$$scope|| +a).$watch(k,function(a,b){"class"===e&&a!=b?g.$updateClass(a,b):g.$set(e,a)}))}}}})}}function V(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c;h=g+e-1;for(var l=a.length;g<l;g++,h++)h<l?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&(a.context=c);break}f&&f.replaceChild(c,d);a=X.createDocumentFragment();a.appendChild(d);C(c).data(C(d).data());ra?(Rb=!0,ra.cleanData([d])):delete C.cache[d[C.expando]];d=1;for(e=b.length;d<e;d++)f=b[d],C(f).remove(), +a.appendChild(f),delete b[d];b[0]=c;b.length=1}function Y(a,b){return w(function(){return a.apply(null,arguments)},a,b)}function Z(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,ua(d))}}var Yb=function(a,b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d<e;d++)f=c[d],this[f]=b[f]}else this.$attr={};this.$$element=a};Yb.prototype={$normalize:ya,$addClass:function(a){a&&0<a.length&&v.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&v.removeClass(this.$$element,a)},$updateClass:function(a, +b){var c=Vc(a,b);c&&c.length&&v.addClass(this.$$element,c);(c=Vc(b,a))&&c.length&&v.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=this.$$element[0],g=Mc(f,a),h=kf(f,a),f=a;g?(this.$$element.prop(a,b),e=g):h&&(this[h]=b,f=h);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=uc(a,"-"));g=ta(this.$$element);if("a"===g&&"href"===a||"img"===g&&"src"===a)this[a]=b=A(b,"src"===a);else if("img"===g&&"srcset"===a){for(var g="",h=T(b),l=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,l=/\s/.test(h)? +l:/(,)/,h=h.split(l),l=Math.floor(h.length/2),k=0;k<l;k++)var q=2*k,g=g+A(T(h[q]),!0),g=g+(" "+T(h[q+1]));h=T(h[2*k]).split(/\s/);g+=A(T(h[0]),!0);2===h.length&&(g+=" "+T(h[1]));this[a]=b=g}!1!==d&&(null===b||b===u?this.$$element.removeAttr(e):this.$$element.attr(e,b));(a=this.$$observers)&&s(a[f],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=fa()),e=d[a]||(d[a]=[]);e.push(b);n.$evalAsync(function(){!e.$$inter&&c.hasOwnProperty(a)&&b(c[a])}); +return function(){Xa(e,b)}}};var U=b.startSymbol(),ja=b.endSymbol(),Tc="{{"==U||"}}"==ja?oa:function(a){return a.replace(/\{\{/g,U).replace(/}}/g,ja)},Pa=/^ngAttr[A-Z]/;F.$$addBindingInfo=k?function(a,b){var c=a.data("$binding")||[];E(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:B;F.$$addBindingClass=k?function(a){N(a,"ng-binding")}:B;F.$$addScopeInfo=k?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:B;F.$$addScopeClass=k?function(a,b){N(a,b?"ng-isolate-scope": +"ng-scope")}:B;return F}]}function ya(b){return db(b.replace(Sc,""))}function Vc(b,a){var c="",d=b.split(/\s+/),e=a.split(/\s+/),f=0;a:for(;f<d.length;f++){for(var g=d[f],h=0;h<e.length;h++)if(g==e[h])continue a;c+=(0<c.length?" ":"")+g}return c}function Uc(b){b=C(b);var a=b.length;if(1>=a)return b;for(;a--;)8===b[a].nodeType&&pf.call(b,a,1);return b}function Fe(){var b={},a=!1,c=/^(\S+)(\s+as\s+(\w+))?$/;this.register=function(a,c){Ma(a,"controller");J(a)?w(b,a):b[a]=c};this.allowGlobals=function(){a= +!0};this.$get=["$injector","$window",function(d,e){function f(a,b,c,d){if(!a||!J(a.$scope))throw M("$controller")("noscp",d,b);a.$scope[b]=c}return function(g,h,l,k){var m,p,q;l=!0===l;k&&x(k)&&(q=k);if(x(g)){k=g.match(c);if(!k)throw qf("ctrlfmt",g);p=k[1];q=q||k[3];g=b.hasOwnProperty(p)?b[p]:wc(h.$scope,p,!0)||(a?wc(e,p,!0):u);tb(g,p,!0)}if(l)return l=(E(g)?g[g.length-1]:g).prototype,m=Object.create(l||null),q&&f(h,q,m,p||g.name),w(function(){d.invoke(g,m,h,p);return m},{instance:m,identifier:q}); +m=d.instantiate(g,h,p);q&&f(h,q,m,p||g.name);return m}}]}function Ge(){this.$get=["$window",function(b){return C(b.document)}]}function He(){this.$get=["$log",function(b){return function(a,c){b.error.apply(b,arguments)}}]}function Zb(b,a){if(x(b)){var c=b.replace(rf,"").trim();if(c){var d=a("Content-Type");(d=d&&0===d.indexOf(Wc))||(d=(d=c.match(sf))&&tf[d[0]].test(c));d&&(b=pc(c))}}return b}function Xc(b){var a=fa(),c,d,e;if(!b)return a;s(b.split("\n"),function(b){e=b.indexOf(":");c=R(T(b.substr(0, +e)));d=T(b.substr(e+1));c&&(a[c]=a[c]?a[c]+", "+d:d)});return a}function Yc(b){var a=J(b)?b:u;return function(c){a||(a=Xc(b));return c?(c=a[R(c)],void 0===c&&(c=null),c):a}}function Zc(b,a,c,d){if(G(d))return d(b,a,c);s(d,function(d){b=d(b,a,c)});return b}function Ke(){var b=this.defaults={transformResponse:[Zb],transformRequest:[function(a){return J(a)&&"[object File]"!==Da.call(a)&&"[object Blob]"!==Da.call(a)&&"[object FormData]"!==Da.call(a)?$a(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"}, +post:qa($b),put:qa($b),patch:qa($b)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},a=!1;this.useApplyAsync=function(b){return y(b)?(a=!!b,this):a};var c=this.interceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(d,e,f,g,h,l){function k(a){function c(a){var b=w({},a);b.data=a.data?Zc(a.data,a.headers,a.status,e.transformResponse):a.data;a=a.status;return 200<=a&&300>a?b:h.reject(b)}function d(a){var b,c={};s(a,function(a,d){G(a)?(b= +a(),null!=b&&(c[d]=b)):c[d]=a});return c}if(!aa.isObject(a))throw M("$http")("badreq",a);var e=w({method:"get",transformRequest:b.transformRequest,transformResponse:b.transformResponse},a);e.headers=function(a){var c=b.headers,e=w({},a.headers),f,g,c=w({},c.common,c[R(a.method)]);a:for(f in c){a=R(f);for(g in e)if(R(g)===a)continue a;e[f]=c[f]}return d(e)}(a);e.method=vb(e.method);var f=[function(a){var d=a.headers,e=Zc(a.data,Yc(d),u,a.transformRequest);z(e)&&s(d,function(a,b){"content-type"===R(b)&& +delete d[b]});z(a.withCredentials)&&!z(b.withCredentials)&&(a.withCredentials=b.withCredentials);return m(a,e).then(c,c)},u],g=h.when(e);for(s(t,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var l=f.shift(),g=g.then(a,l)}g.success=function(a){g.then(function(b){a(b.data,b.status,b.headers,e)});return g};g.error=function(a){g.then(null,function(b){a(b.data,b.status,b.headers,e)}); +return g};return g}function m(c,f){function l(b,c,d,e){function f(){n(c,b,d,e)}N&&(200<=b&&300>b?N.put(I,[b,c,Xc(d),e]):N.remove(I));a?g.$applyAsync(f):(f(),g.$$phase||g.$apply())}function n(a,b,d,e){b=Math.max(b,0);(200<=b&&300>b?v.resolve:v.reject)({data:a,status:b,headers:Yc(d),config:c,statusText:e})}function m(a){n(a.data,a.status,qa(a.headers()),a.statusText)}function t(){var a=k.pendingRequests.indexOf(c);-1!==a&&k.pendingRequests.splice(a,1)}var v=h.defer(),A=v.promise,N,F,s=c.headers,I=p(c.url, +c.params);k.pendingRequests.push(c);A.then(t,t);!c.cache&&!b.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(N=J(c.cache)?c.cache:J(b.cache)?b.cache:q);N&&(F=N.get(I),y(F)?F&&G(F.then)?F.then(m,m):E(F)?n(F[1],F[0],qa(F[2]),F[3]):n(F,200,{},"OK"):N.put(I,A));z(F)&&((F=$c(c.url)?e.cookies()[c.xsrfCookieName||b.xsrfCookieName]:u)&&(s[c.xsrfHeaderName||b.xsrfHeaderName]=F),d(c.method,I,f,l,s,c.timeout,c.withCredentials,c.responseType));return A}function p(a,b){if(!b)return a;var c=[];Ed(b, +function(a,b){null===a||z(a)||(E(a)||(a=[a]),s(a,function(a){J(a)&&(a=pa(a)?a.toISOString():$a(a));c.push(Fa(b)+"="+Fa(a))}))});0<c.length&&(a+=(-1==a.indexOf("?")?"?":"&")+c.join("&"));return a}var q=f("$http"),t=[];s(c,function(a){t.unshift(x(a)?l.get(a):l.invoke(a))});k.pendingRequests=[];(function(a){s(arguments,function(a){k[a]=function(b,c){return k(w(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){s(arguments,function(a){k[a]=function(b,c,d){return k(w(d||{},{method:a, +url:b,data:c}))}})})("post","put","patch");k.defaults=b;return k}]}function uf(){return new P.XMLHttpRequest}function Le(){this.$get=["$browser","$window","$document",function(b,a,c){return vf(b,uf,b.defer,a.angular.callbacks,c[0])}]}function vf(b,a,c,d,e){function f(a,b,c){var f=e.createElement("script"),m=null;f.type="text/javascript";f.src=a;f.async=!0;m=function(a){f.removeEventListener("load",m,!1);f.removeEventListener("error",m,!1);e.body.removeChild(f);f=null;var g=-1,t="unknown";a&&("load"!== +a.type||d[b].called||(a={type:"error"}),t=a.type,g="error"===a.type?404:200);c&&c(g,t)};f.addEventListener("load",m,!1);f.addEventListener("error",m,!1);e.body.appendChild(f);return m}return function(e,h,l,k,m,p,q,t){function r(){n&&n();D&&D.abort()}function S(a,d,e,f,g){v!==u&&c.cancel(v);n=D=null;a(d,e,f,g);b.$$completeOutstandingRequest(B)}b.$$incOutstandingRequestCount();h=h||b.url();if("jsonp"==R(e)){var K="_"+(d.counter++).toString(36);d[K]=function(a){d[K].data=a;d[K].called=!0};var n=f(h.replace("JSON_CALLBACK", +"angular.callbacks."+K),K,function(a,b){S(k,a,d[K].data,"",b);d[K]=B})}else{var D=a();D.open(e,h,!0);s(m,function(a,b){y(a)&&D.setRequestHeader(b,a)});D.onload=function(){var a=D.statusText||"",b="response"in D?D.response:D.responseText,c=1223===D.status?204:D.status;0===c&&(c=b?200:"file"==Ba(h).protocol?404:0);S(k,c,b,D.getAllResponseHeaders(),a)};e=function(){S(k,-1,null,null,"")};D.onerror=e;D.onabort=e;q&&(D.withCredentials=!0);if(t)try{D.responseType=t}catch(H){if("json"!==t)throw H;}D.send(l|| +null)}if(0<p)var v=c(r,p);else p&&G(p.then)&&p.then(r)}}function Ie(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b};this.endSymbol=function(b){return b?(a=b,this):a};this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function f(a){return"\\\\\\"+a}function g(f,g,t,r){function S(c){return c.replace(k,b).replace(m,a)}function K(a){try{var b=a;a=t?e.getTrusted(t,b):e.valueOf(b);var c;if(r&&!y(a))c=a;else if(null==a)c="";else{switch(typeof a){case "string":break;case "number":a= +""+a;break;default:a=$a(a)}c=a}return c}catch(g){c=ac("interr",f,g.toString()),d(c)}}r=!!r;for(var n,D,H=0,v=[],A=[],N=f.length,F=[],s=[];H<N;)if(-1!=(n=f.indexOf(b,H))&&-1!=(D=f.indexOf(a,n+h)))H!==n&&F.push(S(f.substring(H,n))),H=f.substring(n+h,D),v.push(H),A.push(c(H,K)),H=D+l,s.push(F.length),F.push("");else{H!==N&&F.push(S(f.substring(H)));break}if(t&&1<F.length)throw ac("noconcat",f);if(!g||v.length){var I=function(a){for(var b=0,c=v.length;b<c;b++){if(r&&z(a[b]))return;F[s[b]]=a[b]}return F.join("")}; +return w(function(a){var b=0,c=v.length,e=Array(c);try{for(;b<c;b++)e[b]=A[b](a);return I(e)}catch(g){a=ac("interr",f,g.toString()),d(a)}},{exp:f,expressions:v,$$watchDelegate:function(a,b,c){var d;return a.$watchGroup(A,function(c,e){var f=I(c);G(b)&&b.call(this,f,c!==e?d:f,a);d=f},c)}})}}var h=b.length,l=a.length,k=new RegExp(b.replace(/./g,f),"g"),m=new RegExp(a.replace(/./g,f),"g");g.startSymbol=function(){return b};g.endSymbol=function(){return a};return g}]}function Je(){this.$get=["$rootScope", +"$window","$q","$$q",function(b,a,c,d){function e(e,h,l,k){var m=a.setInterval,p=a.clearInterval,q=0,t=y(k)&&!k,r=(t?d:c).defer(),S=r.promise;l=y(l)?l:0;S.then(null,null,e);S.$$intervalId=m(function(){r.notify(q++);0<l&&q>=l&&(r.resolve(q),p(S.$$intervalId),delete f[S.$$intervalId]);t||b.$apply()},h);f[S.$$intervalId]=r;return S}var f={};e.cancel=function(b){return b&&b.$$intervalId in f?(f[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete f[b.$$intervalId],!0):!1};return e}]} +function Rd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "), +DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function bc(b){b=b.split("/");for(var a=b.length;a--;)b[a]=rb(b[a]);return b.join("/")}function ad(b,a){var c=Ba(b);a.$$protocol= +c.protocol;a.$$host=c.hostname;a.$$port=$(c.port)||wf[c.protocol]||null}function bd(b,a){var c="/"!==b.charAt(0);c&&(b="/"+b);var d=Ba(b);a.$$path=decodeURIComponent(c&&"/"===d.pathname.charAt(0)?d.pathname.substring(1):d.pathname);a.$$search=rc(d.search);a.$$hash=decodeURIComponent(d.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function za(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Ha(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Gb(b){return b.replace(/(#.+)|#$/, +"$1")}function cc(b){return b.substr(0,Ha(b).lastIndexOf("/")+1)}function dc(b,a){this.$$html5=!0;a=a||"";var c=cc(b);ad(b,this);this.$$parse=function(a){var b=za(c,a);if(!x(b))throw Hb("ipthprfx",a,c);bd(b,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Qb(this.$$search),b=this.$$hash?"#"+rb(this.$$hash):"";this.$$url=bc(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)), +!0;var f,g;(f=za(b,d))!==u?(g=f,g=(f=za(a,f))!==u?c+(za("/",f)||f):b+g):(f=za(c,d))!==u?g=c+f:c==d+"/"&&(g=c);g&&this.$$parse(g);return!!g}}function ec(b,a){var c=cc(b);ad(b,this);this.$$parse=function(d){d=za(b,d)||za(c,d);var e;"#"===d.charAt(0)?(e=za(a,d),z(e)&&(e=d)):e=this.$$html5?d:"";bd(e,this);d=this.$$path;var f=/^\/[A-Z]:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,""));f.exec(e)||(d=(e=f.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Qb(this.$$search),e=this.$$hash? +"#"+rb(this.$$hash):"";this.$$url=bc(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$parseLinkUrl=function(a,c){return Ha(b)==Ha(a)?(this.$$parse(a),!0):!1}}function cd(b,a){this.$$html5=!0;ec.apply(this,arguments);var c=cc(b);this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;b==Ha(d)?f=d:(g=za(c,d))?f=b+a+g:c===d+"/"&&(f=c);f&&this.$$parse(f);return!!f};this.$$compose=function(){var c=Qb(this.$$search),e=this.$$hash?"#"+rb(this.$$hash): +"";this.$$url=bc(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+a+this.$$url}}function Ib(b){return function(){return this[b]}}function dd(b,a){return function(c){if(z(c))return this[b];this[b]=a(c);this.$$compose();return this}}function Me(){var b="",a={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(a){return y(a)?(b=a,this):b};this.html5Mode=function(b){return Wa(b)?(a.enabled=b,this):J(b)?(Wa(b.enabled)&&(a.enabled=b.enabled),Wa(b.requireBase)&&(a.requireBase=b.requireBase),Wa(b.rewriteLinks)&& +(a.rewriteLinks=b.rewriteLinks),this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(c,d,e,f,g){function h(a,b,c){var e=k.url(),f=k.$$state;try{d.url(a,b,c),k.$$state=d.state()}catch(g){throw k.url(e),k.$$state=f,g;}}function l(a,b){c.$broadcast("$locationChangeSuccess",k.absUrl(),a,k.$$state,b)}var k,m;m=d.baseHref();var p=d.url(),q;if(a.enabled){if(!m&&a.requireBase)throw Hb("nobase");q=p.substring(0,p.indexOf("/",p.indexOf("//")+2))+(m||"/");m=e.history?dc:cd}else q= +Ha(p),m=ec;k=new m(q,"#"+b);k.$$parseLinkUrl(p,p);k.$$state=d.state();var t=/^\s*(javascript|mailto):/i;f.on("click",function(b){if(a.rewriteLinks&&!b.ctrlKey&&!b.metaKey&&!b.shiftKey&&2!=b.which&&2!=b.button){for(var e=C(b.target);"a"!==ta(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),l=e.attr("href")||e.attr("xlink:href");J(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=Ba(h.animVal).href);t.test(h)||!h||e.attr("target")||b.isDefaultPrevented()||!k.$$parseLinkUrl(h, +l)||(b.preventDefault(),k.absUrl()!=d.url()&&(c.$apply(),g.angular["ff-684208-preventDefault"]=!0))}});Gb(k.absUrl())!=Gb(p)&&d.url(k.absUrl(),!0);var r=!0;d.onUrlChange(function(a,b){c.$evalAsync(function(){var d=k.absUrl(),e=k.$$state,f;k.$$parse(a);k.$$state=b;f=c.$broadcast("$locationChangeStart",a,d,b,e).defaultPrevented;k.absUrl()===a&&(f?(k.$$parse(d),k.$$state=e,h(d,!1,e)):(r=!1,l(d,e)))});c.$$phase||c.$digest()});c.$watch(function(){var a=Gb(d.url()),b=Gb(k.absUrl()),f=d.state(),g=k.$$replace, +q=a!==b||k.$$html5&&e.history&&f!==k.$$state;if(r||q)r=!1,c.$evalAsync(function(){var b=k.absUrl(),d=c.$broadcast("$locationChangeStart",b,a,k.$$state,f).defaultPrevented;k.absUrl()===b&&(d?(k.$$parse(a),k.$$state=f):(q&&h(b,g,f===k.$$state?null:k.$$state),l(a,f)))});k.$$replace=!1});return k}]}function Ne(){var b=!0,a=this;this.debugEnabled=function(a){return y(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)? +"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||B;a=!1;try{a=!!e.apply}catch(l){}return a?function(){var a=[];s(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function sa(b,a){if("__defineGetter__"=== +b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===b)throw ka("isecfld",a);return b}function la(b,a){if(b){if(b.constructor===b)throw ka("isecfn",a);if(b.window===b)throw ka("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw ka("isecdom",a);if(b===Object)throw ka("isecobj",a);}return b}function fc(b){return b.constant}function hb(b,a,c,d,e){la(b,e);la(a,e);c=c.split(".");for(var f,g=0;1<c.length;g++){f=sa(c.shift(),e);var h=0===g&&a&&a[f]|| +b[f];h||(h={},b[f]=h);b=la(h,e)}f=sa(c.shift(),e);la(b[f],e);return b[f]=d}function Qa(b){return"constructor"==b}function ed(b,a,c,d,e,f,g){sa(b,f);sa(a,f);sa(c,f);sa(d,f);sa(e,f);var h=function(a){return la(a,f)},l=g||Qa(b)?h:oa,k=g||Qa(a)?h:oa,m=g||Qa(c)?h:oa,p=g||Qa(d)?h:oa,q=g||Qa(e)?h:oa;return function(f,g){var h=g&&g.hasOwnProperty(b)?g:f;if(null==h)return h;h=l(h[b]);if(!a)return h;if(null==h)return u;h=k(h[a]);if(!c)return h;if(null==h)return u;h=m(h[c]);if(!d)return h;if(null==h)return u; +h=p(h[d]);return e?null==h?u:h=q(h[e]):h}}function xf(b,a){return function(c,d){return b(c,d,la,a)}}function yf(b,a,c){var d=a.expensiveChecks,e=d?zf:Af,f=e[b];if(f)return f;var g=b.split("."),h=g.length;if(a.csp)f=6>h?ed(g[0],g[1],g[2],g[3],g[4],c,d):function(a,b){var e=0,f;do f=ed(g[e++],g[e++],g[e++],g[e++],g[e++],c,d)(a,b),b=u,a=f;while(e<h);return f};else{var l="";d&&(l+="s = eso(s, fe);\nl = eso(l, fe);\n");var k=d;s(g,function(a,b){sa(a,c);var e=(b?"s":'((l&&l.hasOwnProperty("'+a+'"))?l:s)')+ +"."+a;if(d||Qa(a))e="eso("+e+", fe)",k=!0;l+="if(s == null) return undefined;\ns="+e+";\n"});l+="return s;";a=new Function("s","l","eso","fe",l);a.toString=da(l);k&&(a=xf(a,c));f=a}f.sharedGetter=!0;f.assign=function(a,c,d){return hb(a,d,b,c,b)};return e[b]=f}function gc(b){return G(b.valueOf)?b.valueOf():Bf.call(b)}function Oe(){var b=fa(),a=fa();this.$get=["$filter","$sniffer",function(c,d){function e(a){var b=a;a.sharedGetter&&(b=function(b,c){return a(b,c)},b.literal=a.literal,b.constant=a.constant, +b.assign=a.assign);return b}function f(a,b){for(var c=0,d=a.length;c<d;c++){var e=a[c];e.constant||(e.inputs?f(e.inputs,b):-1===b.indexOf(e)&&b.push(e))}return b}function g(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=gc(a),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function h(a,b,c,d){var e=d.$$inputs||(d.$$inputs=f(d.inputs,[])),h;if(1===e.length){var l=g,e=e[0];return a.$watch(function(a){var b=e(a);g(b,l)||(h=d(a),l=b&&gc(b));return h},b,c)}for(var k=[],q=0,p=e.length;q<p;q++)k[q]= +g;return a.$watch(function(a){for(var b=!1,c=0,f=e.length;c<f;c++){var l=e[c](a);if(b||(b=!g(l,k[c])))k[c]=l&&gc(l)}b&&(h=d(a));return h},b,c)}function l(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;G(b)&&b.apply(this,arguments);y(a)&&d.$$postDigest(function(){y(f)&&e()})},c)}function k(a,b,c,d){function e(a){var b=!0;s(a,function(a){y(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,c,d){g=a;G(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&& +f()})},c)}function m(a,b,c,d){var e;return e=a.$watch(function(a){return d(a)},function(a,c,d){G(b)&&b.apply(this,arguments);e()},c)}function p(a,b){if(!b)return a;var c=a.$$watchDelegate,c=c!==k&&c!==l?function(c,d){var e=a(c,d);return b(e,c,d)}:function(c,d){var e=a(c,d),f=b(e,c,d);return y(e)?f:e};a.$$watchDelegate&&a.$$watchDelegate!==h?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=h,c.inputs=[a]);return c}var q={csp:d.csp,expensiveChecks:!1},t={csp:d.csp,expensiveChecks:!0}; +return function(d,f,g){var n,D,H;switch(typeof d){case "string":H=d=d.trim();var v=g?a:b;n=v[H];n||(":"===d.charAt(0)&&":"===d.charAt(1)&&(D=!0,d=d.substring(2)),g=g?t:q,n=new hc(g),n=(new ib(n,c,g)).parse(d),n.constant?n.$$watchDelegate=m:D?(n=e(n),n.$$watchDelegate=n.literal?k:l):n.inputs&&(n.$$watchDelegate=h),v[H]=n);return p(n,f);case "function":return p(d,f);default:return p(B,f)}}}]}function Qe(){this.$get=["$rootScope","$exceptionHandler",function(b,a){return fd(function(a){b.$evalAsync(a)}, +a)}]}function Re(){this.$get=["$browser","$exceptionHandler",function(b,a){return fd(function(a){b.defer(a)},a)}]}function fd(b,a){function c(a,b,c){function d(b){return function(c){e||(e=!0,b.call(a,c))}}var e=!1;return[d(b),d(c)]}function d(){this.$$state={status:0}}function e(a,b){return function(c){b.call(a,c)}}function f(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,b(function(){var b,d,e;e=c.pending;c.processScheduled=!1;c.pending=u;for(var f=0,g=e.length;f<g;++f){d=e[f][0];b=e[f][c.status]; +try{G(b)?d.resolve(b(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),a(h)}}}))}function g(){this.promise=new d;this.resolve=e(this,this.resolve);this.reject=e(this,this.reject);this.notify=e(this,this.notify)}var h=M("$q",TypeError);d.prototype={then:function(a,b,c){var d=new g;this.$$state.pending=this.$$state.pending||[];this.$$state.pending.push([d,a,b,c]);0<this.$$state.status&&f(this.$$state);return d.promise},"catch":function(a){return this.then(null,a)},"finally":function(a, +b){return this.then(function(b){return k(b,!0,a)},function(b){return k(b,!1,a)},b)}};g.prototype={resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(h("qcycle",a)):this.$$resolve(a))},$$resolve:function(b){var d,e;e=c(this,this.$$resolve,this.$$reject);try{if(J(b)||G(b))d=b&&b.then;G(d)?(this.promise.$$state.status=-1,d.call(b,e[0],e[1],this.notify)):(this.promise.$$state.value=b,this.promise.$$state.status=1,f(this.promise.$$state))}catch(g){e[1](g),a(g)}},reject:function(a){this.promise.$$state.status|| +this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a;this.promise.$$state.status=2;f(this.promise.$$state)},notify:function(c){var d=this.promise.$$state.pending;0>=this.promise.$$state.status&&d&&d.length&&b(function(){for(var b,e,f=0,g=d.length;f<g;f++){e=d[f][0];b=d[f][3];try{e.notify(G(b)?b(c):c)}catch(h){a(h)}}})}};var l=function(a,b){var c=new g;b?c.resolve(a):c.reject(a);return c.promise},k=function(a,b,c){var d=null;try{G(c)&&(d=c())}catch(e){return l(e,!1)}return d&&G(d.then)? +d.then(function(){return l(a,b)},function(a){return l(a,!1)}):l(a,b)},m=function(a,b,c,d){var e=new g;e.resolve(a);return e.promise.then(b,c,d)},p=function t(a){if(!G(a))throw h("norslvr",a);if(!(this instanceof t))return new t(a);var b=new g;a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise};p.defer=function(){return new g};p.reject=function(a){var b=new g;b.reject(a);return b.promise};p.when=m;p.all=function(a){var b=new g,c=0,d=E(a)?[]:{};s(a,function(a,e){c++;m(a).then(function(a){d.hasOwnProperty(e)|| +(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise};return p}function $e(){this.$get=["$window","$timeout",function(b,a){var c=b.requestAnimationFrame||b.webkitRequestAnimationFrame,d=b.cancelAnimationFrame||b.webkitCancelAnimationFrame||b.webkitCancelRequestAnimationFrame,e=!!c,f=e?function(a){var b=c(a);return function(){d(b)}}:function(b){var c=a(b,16.66,!1);return function(){a.cancel(c)}};f.supported=e;return f}]}function Pe(){var b= +10,a=M("$rootScope"),c=null,d=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$injector","$exceptionHandler","$parse","$browser",function(e,f,g,h){function l(){this.$id=++ob;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=!1;this.$$listeners={};this.$$listenerCount={};this.$$isolateBindings=null}function k(b){if(r.$$phase)throw a("inprog",r.$$phase);r.$$phase=b}function m(a, +b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function p(){}function q(){for(;n.length;)try{n.shift()()}catch(a){f(a)}d=null}function t(){null===d&&(d=h.defer(function(){r.$apply(q)}))}l.prototype={constructor:l,$new:function(a,b){function c(){d.$$destroyed=!0}var d;b=b||this;a?(d=new l,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=function(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners= +{};this.$$listenerCount={};this.$id=++ob;this.$$ChildScope=null},this.$$ChildScope.prototype=this),d=new this.$$ChildScope);d.$parent=b;d.$$prevSibling=b.$$childTail;b.$$childHead?(b.$$childTail.$$nextSibling=d,b.$$childTail=d):b.$$childHead=b.$$childTail=d;(a||b!=this)&&d.$on("$destroy",c);return d},$watch:function(a,b,d){var e=g(a);if(e.$$watchDelegate)return e.$$watchDelegate(this,b,d,e);var f=this.$$watchers,h={fn:b,last:p,get:e,exp:a,eq:!!d};c=null;G(b)||(h.fn=B);f||(f=this.$$watchers=[]);f.unshift(h); +return function(){Xa(f,h);c=null}},$watchGroup:function(a,b){function c(){h=!1;l?(l=!1,b(e,e,g)):b(e,d,g)}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,l=!0;if(!a.length){var k=!0;g.$evalAsync(function(){k&&b(e,e,g)});return function(){k=!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});s(a,function(a,b){var l=g.$watch(a,function(a,f){e[b]=a;d[b]=f;h||(h=!0,g.$evalAsync(c))});f.push(l)});return function(){for(;f.length;)f.shift()()}},$watchCollection:function(a, +b){function c(a){e=a;var b,d,g,h;if(!z(e)){if(J(e))if(Ta(e))for(f!==q&&(f=q,t=f.length=0,k++),a=e.length,t!==a&&(k++,f.length=t=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h===g||(k++,f[b]=g);else{f!==m&&(f=m={},t=0,k++);a=0;for(b in e)e.hasOwnProperty(b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(k++,f[b]=g)):(t++,f[b]=g,k++));if(t>a)for(b in k++,f)e.hasOwnProperty(b)||(t--,delete f[b])}else f!==e&&(f=e,k++);return k}}c.$stateful=!0;var d=this,e,f,h,l=1<b.length,k=0,p=g(a,c),q=[],m= +{},n=!0,t=0;return this.$watch(p,function(){n?(n=!1,b(e,e,d)):b(e,h,d);if(l)if(J(e))if(Ta(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)sc.call(e,a)&&(h[a]=e[a]);else h=e})},$digest:function(){var e,g,l,m,n,t,s=b,I,W=[],y,O;k("$digest");h.$$checkUrlChange();this===r&&null!==d&&(h.defer.cancel(d),q());c=null;do{t=!1;for(I=this;S.length;){try{O=S.shift(),O.scope.$eval(O.expression,O.locals)}catch(w){f(w)}c=null}a:do{if(m=I.$$watchers)for(n=m.length;n--;)try{if(e=m[n])if((g= +e.get(I))!==(l=e.last)&&!(e.eq?ea(g,l):"number"===typeof g&&"number"===typeof l&&isNaN(g)&&isNaN(l)))t=!0,c=e,e.last=e.eq?Ea(g,null):g,e.fn(g,l===p?g:l,I),5>s&&(y=4-s,W[y]||(W[y]=[]),W[y].push({msg:G(e.exp)?"fn: "+(e.exp.name||e.exp.toString()):e.exp,newVal:g,oldVal:l}));else if(e===c){t=!1;break a}}catch(C){f(C)}if(!(m=I.$$childHead||I!==this&&I.$$nextSibling))for(;I!==this&&!(m=I.$$nextSibling);)I=I.$parent}while(I=m);if((t||S.length)&&!s--)throw r.$$phase=null,a("infdig",b,W);}while(t||S.length); +for(r.$$phase=null;u.length;)try{u.shift()()}catch(B){f(B)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;if(this!==r){for(var b in this.$$listenerCount)m(this,this.$$listenerCount[b],b);a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling); +this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=B;this.$on=this.$watch=this.$watchGroup=function(){return B};this.$$listeners={};this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=this.$$watchers=null}}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){r.$$phase||S.length||h.defer(function(){S.length&&r.$digest()});S.push({scope:this,expression:a,locals:b})},$$postDigest:function(a){u.push(a)},$apply:function(a){try{return k("$apply"), +this.$eval(a)}catch(b){f(b)}finally{r.$$phase=null;try{r.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&n.push(b);t()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,m(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e, +stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},l=Ya([h],arguments,1),k,m;do{d=e.$$listeners[a]||c;h.currentScope=e;k=0;for(m=d.length;k<m;k++)if(d[k])try{d[k].apply(null,l)}catch(p){f(p)}else d.splice(k,1),k--,m--;if(g)return h.currentScope=null,h;e=e.$parent}while(e);h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return e; +for(var g=Ya([e],arguments,1),h,l;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(l=d.length;h<l;h++)if(d[h])try{d[h].apply(null,g)}catch(k){f(k)}else d.splice(h,1),h--,l--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope=null;return e}};var r=new l,S=r.$$asyncQueue=[],u=r.$$postDigestQueue=[],n=r.$$applyAsyncQueue=[];return r}]}function Sd(){var b=/^\s*(https?|ftp|mailto|tel|file):/,a=/^\s*((https?|ftp|file|blob):|data:image\/)/; +this.aHrefSanitizationWhitelist=function(a){return y(a)?(b=a,this):b};this.imgSrcSanitizationWhitelist=function(b){return y(b)?(a=b,this):a};this.$get=function(){return function(c,d){var e=d?a:b,f;f=Ba(c).href;return""===f||f.match(e)?c:"unsafe:"+f}}}function Cf(b){if("self"===b)return b;if(x(b)){if(-1<b.indexOf("***"))throw Ca("iwcard",b);b=gd(b).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*");return new RegExp("^"+b+"$")}if(pb(b))return new RegExp("^"+b.source+"$");throw Ca("imatcher");}function hd(b){var a= +[];y(b)&&s(b,function(b){a.push(Cf(b))});return a}function Te(){this.SCE_CONTEXTS=ma;var b=["self"],a=[];this.resourceUrlWhitelist=function(a){arguments.length&&(b=hd(a));return b};this.resourceUrlBlacklist=function(b){arguments.length&&(a=hd(b));return a};this.$get=["$injector",function(c){function d(a,b){return"self"===a?$c(b):!!a.exec(b.href)}function e(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()}; +b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var f=function(a){throw Ca("unsafe");};c.has("$sanitize")&&(f=c.get("$sanitize"));var g=e(),h={};h[ma.HTML]=e(g);h[ma.CSS]=e(g);h[ma.URL]=e(g);h[ma.JS]=e(g);h[ma.RESOURCE_URL]=e(h[ma.URL]);return{trustAs:function(a,b){var c=h.hasOwnProperty(a)?h[a]:null;if(!c)throw Ca("icontext",a,b);if(null===b||b===u||""===b)return b;if("string"!==typeof b)throw Ca("itype",a);return new c(b)},getTrusted:function(c,e){if(null=== +e||e===u||""===e)return e;var g=h.hasOwnProperty(c)?h[c]:null;if(g&&e instanceof g)return e.$$unwrapTrustedValue();if(c===ma.RESOURCE_URL){var g=Ba(e.toString()),p,q,t=!1;p=0;for(q=b.length;p<q;p++)if(d(b[p],g)){t=!0;break}if(t)for(p=0,q=a.length;p<q;p++)if(d(a[p],g)){t=!1;break}if(t)return e;throw Ca("insecurl",e.toString());}if(c===ma.HTML)return f(e);throw Ca("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function Se(){var b=!0;this.enabled=function(a){arguments.length&& +(b=!!a);return b};this.$get=["$parse","$sceDelegate",function(a,c){if(b&&8>Ra)throw Ca("iequirks");var d=qa(ma);d.isEnabled=function(){return b};d.trustAs=c.trustAs;d.getTrusted=c.getTrusted;d.valueOf=c.valueOf;b||(d.trustAs=d.getTrusted=function(a,b){return b},d.valueOf=oa);d.parseAs=function(b,c){var e=a(c);return e.literal&&e.constant?e:a(c,function(a){return d.getTrusted(b,a)})};var e=d.parseAs,f=d.getTrusted,g=d.trustAs;s(ma,function(a,b){var c=R(b);d[db("parse_as_"+c)]=function(b){return e(a, +b)};d[db("get_trusted_"+c)]=function(b){return f(a,b)};d[db("trust_as_"+c)]=function(b){return g(a,b)}});return d}]}function Ue(){this.$get=["$window","$document",function(b,a){var c={},d=$((/android (\d+)/.exec(R((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g,h=/^(Moz|webkit|ms)(?=[A-Z])/,l=f.body&&f.body.style,k=!1,m=!1;if(l){for(var p in l)if(k=h.exec(p)){g=k[0];g=g.substr(0,1).toUpperCase()+g.substr(1);break}g||(g="WebkitOpacity"in l&&"webkit"); +k=!!("transition"in l||g+"Transition"in l);m=!!("animation"in l||g+"Animation"in l);!d||k&&m||(k=x(f.body.style.webkitTransition),m=x(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hasEvent:function(a){if("input"===a&&11>=Ra)return!1;if(z(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:bb(),vendorPrefix:g,transitions:k,animations:m,android:d}}]}function We(){this.$get=["$templateCache","$http","$q",function(b,a,c){function d(e,f){d.totalPendingRequests++; +var g=a.defaults&&a.defaults.transformResponse;E(g)?g=g.filter(function(a){return a!==Zb}):g===Zb&&(g=null);return a.get(e,{cache:b,transformResponse:g}).finally(function(){d.totalPendingRequests--}).then(function(a){return a.data},function(a){if(!f)throw ia("tpload",e);return c.reject(a)})}d.totalPendingRequests=0;return d}]}function Xe(){this.$get=["$rootScope","$browser","$location",function(b,a,c){return{findBindings:function(a,b,c){a=a.getElementsByClassName("ng-binding");var g=[];s(a,function(a){var d= +aa.element(a).data("$binding");d&&s(d,function(d){c?(new RegExp("(^|\\s)"+gd(b)+"(\\s|\\||$)")).test(d)&&g.push(a):-1!=d.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,c){for(var g=["ng-","data-ng-","ng\\:"],h=0;h<g.length;++h){var l=a.querySelectorAll("["+g[h]+"model"+(c?"=":"*=")+'"'+b+'"]');if(l.length)return l}},getLocation:function(){return c.url()},setLocation:function(a){a!==c.url()&&(c.url(a),b.$digest())},whenStable:function(b){a.notifyWhenNoOutstandingRequests(b)}}}]}function Ye(){this.$get= +["$rootScope","$browser","$q","$$q","$exceptionHandler",function(b,a,c,d,e){function f(f,l,k){var m=y(k)&&!k,p=(m?d:c).defer(),q=p.promise;l=a.defer(function(){try{p.resolve(f())}catch(a){p.reject(a),e(a)}finally{delete g[q.$$timeoutId]}m||b.$apply()},l);q.$$timeoutId=l;g[l]=p;return q}var g={};f.cancel=function(b){return b&&b.$$timeoutId in g?(g[b.$$timeoutId].reject("canceled"),delete g[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1};return f}]}function Ba(b){Ra&&(Y.setAttribute("href",b),b=Y.href); +Y.setAttribute("href",b);return{href:Y.href,protocol:Y.protocol?Y.protocol.replace(/:$/,""):"",host:Y.host,search:Y.search?Y.search.replace(/^\?/,""):"",hash:Y.hash?Y.hash.replace(/^#/,""):"",hostname:Y.hostname,port:Y.port,pathname:"/"===Y.pathname.charAt(0)?Y.pathname:"/"+Y.pathname}}function $c(b){b=x(b)?Ba(b):b;return b.protocol===id.protocol&&b.host===id.host}function Ze(){this.$get=da(P)}function Ec(b){function a(c,d){if(J(c)){var e={};s(c,function(b,c){e[c]=a(c,b)});return e}return b.factory(c+ +"Filter",d)}this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+"Filter")}}];a("currency",jd);a("date",kd);a("filter",Df);a("json",Ef);a("limitTo",Ff);a("lowercase",Gf);a("number",ld);a("orderBy",md);a("uppercase",Hf)}function Df(){return function(b,a,c){if(!E(b))return b;var d;switch(typeof a){case "function":break;case "boolean":case "number":case "string":d=!0;case "object":a=If(a,c,d);break;default:return b}return b.filter(a)}}function If(b,a,c){var d=J(b)&&"$"in +b;!0===a?a=ea:G(a)||(a=function(a,b){if(J(a)||J(b))return!1;a=R(""+a);b=R(""+b);return-1!==a.indexOf(b)});return function(e){return d&&!J(e)?Ia(e,b.$,a,!1):Ia(e,b,a,c)}}function Ia(b,a,c,d,e){var f=typeof b,g=typeof a;if("string"===g&&"!"===a.charAt(0))return!Ia(b,a.substring(1),c,d);if(E(b))return b.some(function(b){return Ia(b,a,c,d)});switch(f){case "object":var h;if(d){for(h in b)if("$"!==h.charAt(0)&&Ia(b[h],a,c,!0))return!0;return e?!1:Ia(b,a,c,!1)}if("object"===g){for(h in a)if(e=a[h],!G(e)&& +(f="$"===h,!Ia(f?b:b[h],e,c,f,f)))return!1;return!0}return c(b,a);case "function":return!1;default:return c(b,a)}}function jd(b){var a=b.NUMBER_FORMATS;return function(b,d,e){z(d)&&(d=a.CURRENCY_SYM);z(e)&&(e=a.PATTERNS[1].maxFrac);return null==b?b:nd(b,a.PATTERNS[1],a.GROUP_SEP,a.DECIMAL_SEP,e).replace(/\u00A4/g,d)}}function ld(b){var a=b.NUMBER_FORMATS;return function(b,d){return null==b?b:nd(b,a.PATTERNS[0],a.GROUP_SEP,a.DECIMAL_SEP,d)}}function nd(b,a,c,d,e){if(!isFinite(b)||J(b))return"";var f= +0>b;b=Math.abs(b);var g=b+"",h="",l=[],k=!1;if(-1!==g.indexOf("e")){var m=g.match(/([\d\.]+)e(-?)(\d+)/);m&&"-"==m[2]&&m[3]>e+1?b=0:(h=g,k=!0)}if(k)0<e&&1>b&&(h=b.toFixed(e),b=parseFloat(h));else{g=(g.split(od)[1]||"").length;z(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e);var g=(""+b).split(od),k=g[0],g=g[1]||"",p=0,q=a.lgSize,t=a.gSize;if(k.length>=q+t)for(p=k.length-q,m=0;m<p;m++)0===(p-m)%t&&0!==m&&(h+=c),h+=k.charAt(m);for(m=p;m<k.length;m++)0=== +(k.length-m)%q&&0!==m&&(h+=c),h+=k.charAt(m);for(;g.length<e;)g+="0";e&&"0"!==e&&(h+=d+g.substr(0,e))}0===b&&(f=!1);l.push(f?a.negPre:a.posPre,h,f?a.negSuf:a.posSuf);return l.join("")}function Jb(b,a,c){var d="";0>b&&(d="-",b=-b);for(b=""+b;b.length<a;)b="0"+b;c&&(b=b.substr(b.length-a));return d+b}function Z(b,a,c,d){c=c||0;return function(e){e=e["get"+b]();if(0<c||e>-c)e+=c;0===e&&-12==c&&(e=12);return Jb(e,a,d)}}function Kb(b,a){return function(c,d){var e=c["get"+b](),f=vb(a?"SHORT"+b:b);return d[f][e]}} +function pd(b){var a=(new Date(b,0,1)).getDay();return new Date(b,0,(4>=a?5:12)-a)}function qd(b){return function(a){var c=pd(a.getFullYear());a=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))-+c;a=1+Math.round(a/6048E5);return Jb(a,b)}}function kd(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,l=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=$(b[9]+b[10]),g=$(b[9]+b[11]));h.call(a,$(b[1]),$(b[2])-1,$(b[3]));f=$(b[4]||0)-f;g=$(b[5]|| +0)-g;h=$(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));l.call(a,f,g,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e,f){var g="",h=[],l,k;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;x(c)&&(c=Jf.test(c)?$(c):a(c));V(c)&&(c=new Date(c));if(!pa(c))return c;for(;e;)(k=Kf.exec(e))?(h=Ya(h,k,1),e=h.pop()):(h.push(e),e=null);f&&"UTC"===f&&(c=new Date(c.getTime()),c.setMinutes(c.getMinutes()+c.getTimezoneOffset())); +s(h,function(a){l=Lf[a];g+=l?l(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function Ef(){return function(b,a){z(a)&&(a=2);return $a(b,a)}}function Ff(){return function(b,a){V(b)&&(b=b.toString());return E(b)||x(b)?(a=Infinity===Math.abs(Number(a))?Number(a):$(a))?0<a?b.slice(0,a):b.slice(a):x(b)?"":[]:b}}function md(b){return function(a,c,d){function e(a,b){return b?function(b,c){return a(c,b)}:a}function f(a){switch(typeof a){case "number":case "boolean":case "string":return!0; +default:return!1}}function g(a){return null===a?"null":"function"===typeof a.valueOf&&(a=a.valueOf(),f(a))||"function"===typeof a.toString&&(a=a.toString(),f(a))?a:""}function h(a,b){var c=typeof a,d=typeof b;c===d&&"object"===c&&(a=g(a),b=g(b));return c===d?("string"===c&&(a=a.toLowerCase(),b=b.toLowerCase()),a===b?0:a<b?-1:1):c<d?-1:1}if(!Ta(a))return a;c=E(c)?c:[c];0===c.length&&(c=["+"]);c=c.map(function(a){var c=!1,d=a||oa;if(x(a)){if("+"==a.charAt(0)||"-"==a.charAt(0))c="-"==a.charAt(0),a=a.substring(1); +if(""===a)return e(h,c);d=b(a);if(d.constant){var f=d();return e(function(a,b){return h(a[f],b[f])},c)}}return e(function(a,b){return h(d(a),d(b))},c)});return Za.call(a).sort(e(function(a,b){for(var d=0;d<c.length;d++){var e=c[d](a,b);if(0!==e)return e}return 0},d))}}function Ja(b){G(b)&&(b={link:b});b.restrict=b.restrict||"AC";return da(b)}function rd(b,a,c,d,e){var f=this,g=[],h=f.$$parentForm=b.parent().controller("form")||Lb;f.$error={};f.$$success={};f.$pending=u;f.$name=e(a.name||a.ngForm|| +"")(c);f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;f.$submitted=!1;h.$addControl(f);f.$rollbackViewValue=function(){s(g,function(a){a.$rollbackViewValue()})};f.$commitViewValue=function(){s(g,function(a){a.$commitViewValue()})};f.$addControl=function(a){Ma(a.$name,"input");g.push(a);a.$name&&(f[a.$name]=a)};f.$$renameControl=function(a,b){var c=a.$name;f[c]===a&&delete f[c];f[b]=a;a.$name=b};f.$removeControl=function(a){a.$name&&f[a.$name]===a&&delete f[a.$name];s(f.$pending,function(b,c){f.$setValidity(c, +null,a)});s(f.$error,function(b,c){f.$setValidity(c,null,a)});s(f.$$success,function(b,c){f.$setValidity(c,null,a)});Xa(g,a)};sd({ctrl:this,$element:b,set:function(a,b,c){var d=a[b];d?-1===d.indexOf(c)&&d.push(c):a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(Xa(d,c),0===d.length&&delete a[b])},parentForm:h,$animate:d});f.$setDirty=function(){d.removeClass(b,Sa);d.addClass(b,Mb);f.$dirty=!0;f.$pristine=!1;h.$setDirty()};f.$setPristine=function(){d.setClass(b,Sa,Mb+" ng-submitted");f.$dirty=!1;f.$pristine= +!0;f.$submitted=!1;s(g,function(a){a.$setPristine()})};f.$setUntouched=function(){s(g,function(a){a.$setUntouched()})};f.$setSubmitted=function(){d.addClass(b,"ng-submitted");f.$submitted=!0;h.$setSubmitted()}}function ic(b){b.$formatters.push(function(a){return b.$isEmpty(a)?a:a.toString()})}function jb(b,a,c,d,e,f){var g=R(a[0].type);if(!e.android){var h=!1;a.on("compositionstart",function(a){h=!0});a.on("compositionend",function(){h=!1;l()})}var l=function(b){k&&(f.defer.cancel(k),k=null);if(!h){var e= +a.val();b=b&&b.type;"password"===g||c.ngTrim&&"false"===c.ngTrim||(e=T(e));(d.$viewValue!==e||""===e&&d.$$hasNativeValidators)&&d.$setViewValue(e,b)}};if(e.hasEvent("input"))a.on("input",l);else{var k,m=function(a,b,c){k||(k=f.defer(function(){k=null;b&&b.value===c||l(a)}))};a.on("keydown",function(a){var b=a.keyCode;91===b||15<b&&19>b||37<=b&&40>=b||m(a,this,this.value)});if(e.hasEvent("paste"))a.on("paste cut",m)}a.on("change",l);d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)}} +function Nb(b,a){return function(c,d){var e,f;if(pa(c))return c;if(x(c)){'"'==c.charAt(0)&&'"'==c.charAt(c.length-1)&&(c=c.substring(1,c.length-1));if(Mf.test(c))return new Date(c);b.lastIndex=0;if(e=b.exec(c))return e.shift(),f=d?{yyyy:d.getFullYear(),MM:d.getMonth()+1,dd:d.getDate(),HH:d.getHours(),mm:d.getMinutes(),ss:d.getSeconds(),sss:d.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},s(e,function(b,c){c<a.length&&(f[a[c]]=+b)}),new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0, +1E3*f.sss||0)}return NaN}}function kb(b,a,c,d){return function(e,f,g,h,l,k,m){function p(a){return a&&!(a.getTime&&a.getTime()!==a.getTime())}function q(a){return y(a)?pa(a)?a:c(a):u}td(e,f,g,h);jb(e,f,g,h,l,k);var t=h&&h.$options&&h.$options.timezone,r;h.$$parserName=b;h.$parsers.push(function(b){return h.$isEmpty(b)?null:a.test(b)?(b=c(b,r),"UTC"===t&&b.setMinutes(b.getMinutes()-b.getTimezoneOffset()),b):u});h.$formatters.push(function(a){if(a&&!pa(a))throw Ob("datefmt",a);if(p(a)){if((r=a)&&"UTC"=== +t){var b=6E4*r.getTimezoneOffset();r=new Date(r.getTime()+b)}return m("date")(a,d,t)}r=null;return""});if(y(g.min)||g.ngMin){var s;h.$validators.min=function(a){return!p(a)||z(s)||c(a)>=s};g.$observe("min",function(a){s=q(a);h.$validate()})}if(y(g.max)||g.ngMax){var K;h.$validators.max=function(a){return!p(a)||z(K)||c(a)<=K};g.$observe("max",function(a){K=q(a);h.$validate()})}}}function td(b,a,c,d){(d.$$hasNativeValidators=J(a[0].validity))&&d.$parsers.push(function(b){var c=a.prop("validity")||{}; +return c.badInput&&!c.typeMismatch?u:b})}function ud(b,a,c,d,e){if(y(d)){b=b(d);if(!b.constant)throw M("ngModel")("constexpr",c,d);return b(a)}return e}function jc(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],m=0;m<b.length;m++)if(e==b[m])continue a;c.push(e)}return c}function e(a){if(!E(a)){if(x(a))return a.split(" ");if(J(a)){var b=[];s(a,function(a,c){a&&(b=b.concat(c.split(" ")))});return b}}return a}return{restrict:"AC",link:function(f, +g,h){function l(a,b){var c=g.data("$classCounts")||{},d=[];s(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data("$classCounts",c);return d.join(" ")}function k(b){if(!0===a||f.$index%2===a){var k=e(b||[]);if(!m){var t=l(k,1);h.$addClass(t)}else if(!ea(b,m)){var r=e(m),t=d(k,r),k=d(r,k),t=l(t,1),k=l(k,-1);t&&t.length&&c.addClass(g,t);k&&k.length&&c.removeClass(g,k)}}m=qa(b)}var m;f.$watch(h[b],k,!0);h.$observe("class",function(a){k(f.$eval(h[b]))});"ngClass"!==b&&f.$watch("$index", +function(c,d){var g=c&1;if(g!==(d&1)){var k=e(f.$eval(h[b]));g===a?(g=l(k,1),h.$addClass(g)):(g=l(k,-1),h.$removeClass(g))}})}}}]}function sd(b){function a(a,b){b&&!f[a]?(k.addClass(e,a),f[a]=!0):!b&&f[a]&&(k.removeClass(e,a),f[a]=!1)}function c(b,c){b=b?"-"+uc(b,"-"):"";a(lb+b,!0===c);a(vd+b,!1===c)}var d=b.ctrl,e=b.$element,f={},g=b.set,h=b.unset,l=b.parentForm,k=b.$animate;f[vd]=!(f[lb]=e.hasClass(lb));d.$setValidity=function(b,e,f){e===u?(d.$pending||(d.$pending={}),g(d.$pending,b,f)):(d.$pending&& +h(d.$pending,b,f),wd(d.$pending)&&(d.$pending=u));Wa(e)?e?(h(d.$error,b,f),g(d.$$success,b,f)):(g(d.$error,b,f),h(d.$$success,b,f)):(h(d.$error,b,f),h(d.$$success,b,f));d.$pending?(a(xd,!0),d.$valid=d.$invalid=u,c("",null)):(a(xd,!1),d.$valid=wd(d.$error),d.$invalid=!d.$valid,c("",d.$valid));e=d.$pending&&d.$pending[b]?u:d.$error[b]?!1:d.$$success[b]?!0:null;c(b,e);l.$setValidity(b,e,d)}}function wd(b){if(b)for(var a in b)return!1;return!0}var Nf=/^\/(.+)\/([a-z]*)$/,R=function(b){return x(b)?b.toLowerCase(): +b},sc=Object.prototype.hasOwnProperty,vb=function(b){return x(b)?b.toUpperCase():b},Ra,C,ra,Za=[].slice,pf=[].splice,Of=[].push,Da=Object.prototype.toString,Ka=M("ng"),aa=P.angular||(P.angular={}),cb,ob=0;Ra=X.documentMode;B.$inject=[];oa.$inject=[];var E=Array.isArray,T=function(b){return x(b)?b.trim():b},gd=function(b){return b.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},bb=function(){if(y(bb.isActive_))return bb.isActive_;var b=!(!X.querySelector("[ng-csp]")&&!X.querySelector("[data-ng-csp]")); +if(!b)try{new Function("")}catch(a){b=!0}return bb.isActive_=b},sb=["ng-","data-ng-","ng:","x-ng-"],Md=/[A-Z]/g,vc=!1,Rb,na=1,qb=3,Qd={full:"1.3.14",major:1,minor:3,dot:14,codeName:"instantaneous-browserification"};Q.expando="ng339";var Ab=Q.cache={},hf=1;Q._data=function(b){return this.cache[b[this.expando]]||{}};var cf=/([\:\-\_]+(.))/g,df=/^moz([A-Z])/,Pf={mouseleave:"mouseout",mouseenter:"mouseover"},Ub=M("jqLite"),gf=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Tb=/<|&#?\w+;/,ef=/<([\w:]+)/,ff=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, +ga={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,"",""]};ga.optgroup=ga.option;ga.tbody=ga.tfoot=ga.colgroup=ga.caption=ga.thead;ga.th=ga.td;var La=Q.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===X.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),Q(P).on("load",a))}, +toString:function(){var b=[];s(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?C(this[b]):C(this[this.length+b])},length:0,push:Of,sort:[].sort,splice:[].splice},Fb={};s("multiple selected checked disabled readOnly required open".split(" "),function(b){Fb[R(b)]=b});var Nc={};s("input select option textarea button form details".split(" "),function(b){Nc[b]=!0});var Oc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"}; +s({data:Wb,removeData:yb},function(b,a){Q[a]=b});s({data:Wb,inheritedData:Eb,scope:function(b){return C.data(b,"$scope")||Eb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return C.data(b,"$isolateScope")||C.data(b,"$isolateScopeNoTemplate")},controller:Jc,injector:function(b){return Eb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Bb,css:function(b,a,c){a=db(a);if(y(c))b.style[a]=c;else return b.style[a]},attr:function(b,a,c){var d=R(a);if(Fb[d])if(y(c))c? +(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||B).specified?d:u;else if(y(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?u:b},prop:function(b,a,c){if(y(c))b[a]=c;else return b[a]},text:function(){function b(a,b){if(z(b)){var d=a.nodeType;return d===na||d===qb?a.textContent:""}a.textContent=b}b.$dv="";return b}(),val:function(b,a){if(z(a)){if(b.multiple&&"select"===ta(b)){var c=[];s(b.options,function(a){a.selected&& +c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(z(a))return b.innerHTML;xb(b,!0);b.innerHTML=a},empty:Kc},function(b,a){Q.prototype[a]=function(a,d){var e,f,g=this.length;if(b!==Kc&&(2==b.length&&b!==Bb&&b!==Jc?a:d)===u){if(J(a)){for(e=0;e<g;e++)if(b===Wb)b(this[e],a);else for(f in a)b(this[e],f,a[f]);return this}e=b.$dv;g=e===u?Math.min(g,1):g;for(f=0;f<g;f++){var h=b(this[f],a,d);e=e?e+h:h}return e}for(e=0;e<g;e++)b(this[e],a,d);return this}}); +s({removeData:yb,on:function a(c,d,e,f){if(y(f))throw Ub("onargs");if(Fc(c)){var g=zb(c,!0);f=g.events;var h=g.handle;h||(h=g.handle=lf(c,f));for(var g=0<=d.indexOf(" ")?d.split(" "):[d],l=g.length;l--;){d=g[l];var k=f[d];k||(f[d]=[],"mouseenter"===d||"mouseleave"===d?a(c,Pf[d],function(a){var c=a.relatedTarget;c&&(c===this||this.contains(c))||h(a,d)}):"$destroy"!==d&&c.addEventListener(d,h,!1),k=f[d]);k.push(e)}}},off:Ic,one:function(a,c,d){a=C(a);a.on(c,function f(){a.off(c,d);a.off(c,f)});a.on(c, +d)},replaceWith:function(a,c){var d,e=a.parentNode;xb(a);s(new Q(c),function(c){d?e.insertBefore(c,d.nextSibling):e.replaceChild(c,a);d=c})},children:function(a){var c=[];s(a.childNodes,function(a){a.nodeType===na&&c.push(a)});return c},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,c){var d=a.nodeType;if(d===na||11===d){c=new Q(c);for(var d=0,e=c.length;d<e;d++)a.appendChild(c[d])}},prepend:function(a,c){if(a.nodeType===na){var d=a.firstChild;s(new Q(c),function(c){a.insertBefore(c, +d)})}},wrap:function(a,c){c=C(c).eq(0).clone()[0];var d=a.parentNode;d&&d.replaceChild(c,a);c.appendChild(a)},remove:Lc,detach:function(a){Lc(a,!0)},after:function(a,c){var d=a,e=a.parentNode;c=new Q(c);for(var f=0,g=c.length;f<g;f++){var h=c[f];e.insertBefore(h,d.nextSibling);d=h}},addClass:Db,removeClass:Cb,toggleClass:function(a,c,d){c&&s(c.split(" "),function(c){var f=d;z(f)&&(f=!Bb(a,c));(f?Db:Cb)(a,c)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling}, +find:function(a,c){return a.getElementsByTagName?a.getElementsByTagName(c):[]},clone:Vb,triggerHandler:function(a,c,d){var e,f,g=c.type||c,h=zb(a);if(h=(h=h&&h.events)&&h[g])e={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:B,type:g,target:a},c.type&&(e=w(e, +c)),c=qa(h),f=d?[e].concat(d):[e],s(c,function(c){e.isImmediatePropagationStopped()||c.apply(a,f)})}},function(a,c){Q.prototype[c]=function(c,e,f){for(var g,h=0,l=this.length;h<l;h++)z(g)?(g=a(this[h],c,e,f),y(g)&&(g=C(g))):Hc(g,a(this[h],c,e,f));return y(g)?g:this};Q.prototype.bind=Q.prototype.on;Q.prototype.unbind=Q.prototype.off});eb.prototype={put:function(a,c){this[Na(a,this.nextUid)]=c},get:function(a){return this[Na(a,this.nextUid)]},remove:function(a){var c=this[a=Na(a,this.nextUid)];delete this[a]; +return c}};var Qc=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,Qf=/,/,Rf=/^\s*(_?)(\S+?)\1\s*$/,Pc=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ga=M("$injector");ab.$$annotate=function(a,c,d){var e;if("function"===typeof a){if(!(e=a.$inject)){e=[];if(a.length){if(c)throw x(d)&&d||(d=a.name||mf(a)),Ga("strictdi",d);c=a.toString().replace(Pc,"");c=c.match(Qc);s(c[1].split(Qf),function(a){a.replace(Rf,function(a,c,d){e.push(d)})})}a.$inject=e}}else E(a)?(c=a.length-1,tb(a[c],"fn"),e=a.slice(0,c)):tb(a,"fn",!0);return e}; +var Sf=M("$animate"),Ce=["$provide",function(a){this.$$selectors={};this.register=function(c,d){var e=c+"-animation";if(c&&"."!=c.charAt(0))throw Sf("notcsel",c);this.$$selectors[c.substr(1)]=e;a.factory(e,d)};this.classNameFilter=function(a){1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null);return this.$$classNameFilter};this.$get=["$$q","$$asyncCallback","$rootScope",function(a,d,e){function f(d){var f,g=a.defer();g.promise.$$cancelFn=function(){f&&f()};e.$$postDigest(function(){f= +d(function(){g.resolve()})});return g.promise}function g(a,c){var d=[],e=[],f=fa();s((a.attr("class")||"").split(/\s+/),function(a){f[a]=!0});s(c,function(a,c){var g=f[c];!1===a&&g?e.push(c):!0!==a||g||d.push(c)});return 0<d.length+e.length&&[d.length?d:null,e.length?e:null]}function h(a,c,d){for(var e=0,f=c.length;e<f;++e)a[c[e]]=d}function l(){m||(m=a.defer(),d(function(){m.resolve();m=null}));return m.promise}function k(a,c){if(aa.isObject(c)){var d=w(c.from||{},c.to||{});a.css(d)}}var m;return{animate:function(a, +c,d){k(a,{from:c,to:d});return l()},enter:function(a,c,d,e){k(a,e);d?d.after(a):c.prepend(a);return l()},leave:function(a,c){a.remove();return l()},move:function(a,c,d,e){return this.enter(a,c,d,e)},addClass:function(a,c,d){return this.setClass(a,c,[],d)},$$addClassImmediately:function(a,c,d){a=C(a);c=x(c)?c:E(c)?c.join(" "):"";s(a,function(a){Db(a,c)});k(a,d);return l()},removeClass:function(a,c,d){return this.setClass(a,[],c,d)},$$removeClassImmediately:function(a,c,d){a=C(a);c=x(c)?c:E(c)?c.join(" "): +"";s(a,function(a){Cb(a,c)});k(a,d);return l()},setClass:function(a,c,d,e){var k=this,l=!1;a=C(a);var m=a.data("$$animateClasses");m?e&&m.options&&(m.options=aa.extend(m.options||{},e)):(m={classes:{},options:e},l=!0);e=m.classes;c=E(c)?c:c.split(" ");d=E(d)?d:d.split(" ");h(e,c,!0);h(e,d,!1);l&&(m.promise=f(function(c){var d=a.data("$$animateClasses");a.removeData("$$animateClasses");if(d){var e=g(a,d.classes);e&&k.$$setClassImmediately(a,e[0],e[1],d.options)}c()}),a.data("$$animateClasses",m)); +return m.promise},$$setClassImmediately:function(a,c,d,e){c&&this.$$addClassImmediately(a,c);d&&this.$$removeClassImmediately(a,d);k(a,e);return l()},enabled:B,cancel:B}}]}],ia=M("$compile");xc.$inject=["$provide","$$sanitizeUriProvider"];var Sc=/^((?:x|data)[\:\-_])/i,qf=M("$controller"),Wc="application/json",$b={"Content-Type":Wc+";charset=utf-8"},sf=/^\[|^\{(?!\{)/,tf={"[":/]$/,"{":/}$/},rf=/^\)\]\}',?\n/,ac=M("$interpolate"),Tf=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,wf={http:80,https:443,ftp:21},Hb= +M("$location"),Uf={$$html5:!1,$$replace:!1,absUrl:Ib("$$absUrl"),url:function(a){if(z(a))return this.$$url;var c=Tf.exec(a);(c[1]||""===a)&&this.path(decodeURIComponent(c[1]));(c[2]||c[1]||""===a)&&this.search(c[3]||"");this.hash(c[5]||"");return this},protocol:Ib("$$protocol"),host:Ib("$$host"),port:Ib("$$port"),path:dd("$$path",function(a){a=null!==a?a.toString():"";return"/"==a.charAt(0)?a:"/"+a}),search:function(a,c){switch(arguments.length){case 0:return this.$$search;case 1:if(x(a)||V(a))a= +a.toString(),this.$$search=rc(a);else if(J(a))a=Ea(a,{}),s(a,function(c,e){null==c&&delete a[e]}),this.$$search=a;else throw Hb("isrcharg");break;default:z(c)||null===c?delete this.$$search[a]:this.$$search[a]=c}this.$$compose();return this},hash:dd("$$hash",function(a){return null!==a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};s([cd,ec,dc],function(a){a.prototype=Object.create(Uf);a.prototype.state=function(c){if(!arguments.length)return this.$$state;if(a!==dc||!this.$$html5)throw Hb("nostate"); +this.$$state=z(c)?null:c;return this}});var ka=M("$parse"),Vf=Function.prototype.call,Wf=Function.prototype.apply,Xf=Function.prototype.bind,mb=fa();s({"null":function(){return null},"true":function(){return!0},"false":function(){return!1},undefined:function(){}},function(a,c){a.constant=a.literal=a.sharedGetter=!0;mb[c]=a});mb["this"]=function(a){return a};mb["this"].sharedGetter=!0;var nb=w(fa(),{"+":function(a,c,d,e){d=d(a,c);e=e(a,c);return y(d)?y(e)?d+e:d:y(e)?e:u},"-":function(a,c,d,e){d=d(a, +c);e=e(a,c);return(y(d)?d:0)-(y(e)?e:0)},"*":function(a,c,d,e){return d(a,c)*e(a,c)},"/":function(a,c,d,e){return d(a,c)/e(a,c)},"%":function(a,c,d,e){return d(a,c)%e(a,c)},"===":function(a,c,d,e){return d(a,c)===e(a,c)},"!==":function(a,c,d,e){return d(a,c)!==e(a,c)},"==":function(a,c,d,e){return d(a,c)==e(a,c)},"!=":function(a,c,d,e){return d(a,c)!=e(a,c)},"<":function(a,c,d,e){return d(a,c)<e(a,c)},">":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a, +c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"!":function(a,c,d){return!d(a,c)},"=":!0,"|":!0}),Yf={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},hc=function(a){this.options=a};hc.prototype={constructor:hc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index<this.text.length;)if(a=this.text.charAt(this.index),'"'===a||"'"===a)this.readString(a);else if(this.isNumber(a)||"."===a&&this.isNumber(this.peek()))this.readNumber(); +else if(this.isIdent(a))this.readIdent();else if(this.is(a,"(){}[].,;:?"))this.tokens.push({index:this.index,text:a}),this.index++;else if(this.isWhitespace(a))this.index++;else{var c=a+this.peek(),d=c+this.peek(2),e=nb[c],f=nb[d];nb[a]||e||f?(a=f?d:e?c:a,this.tokens.push({index:this.index,text:a,operator:!0}),this.index+=a.length):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a,c){return-1!==c.indexOf(a)},peek:function(a){a=a||1;return this.index+ +a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=y(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw ka("lexerr",a,c,this.text); +},readNumber:function(){for(var a="",c=this.index;this.index<this.text.length;){var d=R(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var e=this.peek();if("e"==d&&this.isExpOperator(e))a+=d;else if(this.isExpOperator(d)&&e&&this.isNumber(e)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||e&&this.isNumber(e)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}this.tokens.push({index:c,text:a,constant:!0,value:Number(a)})},readIdent:function(){for(var a= +this.index;this.index<this.text.length;){var c=this.text.charAt(this.index);if(!this.isIdent(c)&&!this.isNumber(c))break;this.index++}this.tokens.push({index:a,text:this.text.slice(a,this.index),identifier:!0})},readString:function(a){var c=this.index;this.index++;for(var d="",e=a,f=!1;this.index<this.text.length;){var g=this.text.charAt(this.index),e=e+g;if(f)"u"===g?(f=this.text.substring(this.index+1,this.index+5),f.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+f+"]"),this.index+= +4,d+=String.fromCharCode(parseInt(f,16))):d+=Yf[g]||g,f=!1;else if("\\"===g)f=!0;else{if(g===a){this.index++;this.tokens.push({index:c,text:e,constant:!0,value:d});return}d+=g}this.index++}this.throwError("Unterminated quote",c)}};var ib=function(a,c,d){this.lexer=a;this.$filter=c;this.options=d};ib.ZERO=w(function(){return 0},{sharedGetter:!0,constant:!0});ib.prototype={constructor:ib,parse:function(a){this.text=a;this.tokens=this.lexer.lex(a);a=this.statements();0!==this.tokens.length&&this.throwError("is an unexpected token", +this.tokens[0]);a.literal=!!a.literal;a.constant=!!a.constant;return a},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.peek().identifier&&this.peek().text in mb?a=mb[this.consume().text]:this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",this.peek());for(var c,d;c=this.expect("(","[",".");)"("===c.text?(a=this.functionCall(a, +d),d=null):"["===c.text?(d=a,a=this.objectIndex(a)):"."===c.text?(d=a,a=this.fieldAccess(a)):this.throwError("IMPOSSIBLE");return a},throwError:function(a,c){throw ka("syntax",c.text,a,c.index+1,this.text,this.text.substring(c.index));},peekToken:function(){if(0===this.tokens.length)throw ka("ueoe",this.text);return this.tokens[0]},peek:function(a,c,d,e){return this.peekAhead(0,a,c,d,e)},peekAhead:function(a,c,d,e,f){if(this.tokens.length>a){a=this.tokens[a];var g=a.text;if(g===c||g===d||g===e||g=== +f||!(c||d||e||f))return a}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},consume:function(a){if(0===this.tokens.length)throw ka("ueoe",this.text);var c=this.expect(a);c||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return c},unaryFn:function(a,c){var d=nb[a];return w(function(a,f){return d(a,f,c)},{constant:c.constant,inputs:[c]})},binaryFn:function(a,c,d,e){var f=nb[c];return w(function(c,e){return f(c,e,a,d)},{constant:a.constant&& +d.constant,inputs:!e&&[a,d]})},identifier:function(){for(var a=this.consume().text;this.peek(".")&&this.peekAhead(1).identifier&&!this.peekAhead(2,"(");)a+=this.consume().text+this.consume().text;return yf(a,this.options,this.text)},constant:function(){var a=this.consume().value;return w(function(){return a},{constant:!0,literal:!0})},statements:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.filterChain()),!this.expect(";"))return 1===a.length?a[0]:function(c, +d){for(var e,f=0,g=a.length;f<g;f++)e=a[f](c,d);return e}},filterChain:function(){for(var a=this.expression();this.expect("|");)a=this.filter(a);return a},filter:function(a){var c=this.$filter(this.consume().text),d,e;if(this.peek(":"))for(d=[],e=[];this.expect(":");)d.push(this.expression());var f=[a].concat(d||[]);return w(function(f,h){var l=a(f,h);if(e){e[0]=l;for(l=d.length;l--;)e[l+1]=d[l](f,h);return c.apply(u,e)}return c(l)},{constant:!c.$stateful&&f.every(fc),inputs:!c.$stateful&&f})},expression:function(){return this.assignment()}, +assignment:function(){var a=this.ternary(),c,d;return(d=this.expect("="))?(a.assign||this.throwError("implies assignment but ["+this.text.substring(0,d.index)+"] can not be assigned to",d),c=this.ternary(),w(function(d,f){return a.assign(d,c(d,f),f)},{inputs:[a,c]})):a},ternary:function(){var a=this.logicalOR(),c;if(this.expect("?")&&(c=this.assignment(),this.consume(":"))){var d=this.assignment();return w(function(e,f){return a(e,f)?c(e,f):d(e,f)},{constant:a.constant&&c.constant&&d.constant})}return a}, +logicalOR:function(){for(var a=this.logicalAND(),c;c=this.expect("||");)a=this.binaryFn(a,c.text,this.logicalAND(),!0);return a},logicalAND:function(){for(var a=this.equality(),c;c=this.expect("&&");)a=this.binaryFn(a,c.text,this.equality(),!0);return a},equality:function(){for(var a=this.relational(),c;c=this.expect("==","!=","===","!==");)a=this.binaryFn(a,c.text,this.relational());return a},relational:function(){for(var a=this.additive(),c;c=this.expect("<",">","<=",">=");)a=this.binaryFn(a,c.text, +this.additive());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.text,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.text,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(ib.ZERO,a.text,this.unary()):(a=this.expect("!"))?this.unaryFn(a.text,this.unary()):this.primary()},fieldAccess:function(a){var c= +this.identifier();return w(function(d,e,f){d=f||a(d,e);return null==d?u:c(d)},{assign:function(d,e,f){var g=a(d,f);g||a.assign(d,g={},f);return c.assign(g,e)}})},objectIndex:function(a){var c=this.text,d=this.expression();this.consume("]");return w(function(e,f){var g=a(e,f),h=d(e,f);sa(h,c);return g?la(g[h],c):u},{assign:function(e,f,g){var h=sa(d(e,g),c),l=la(a(e,g),c);l||a.assign(e,l={},g);return l[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression()); +while(this.expect(","))}this.consume(")");var e=this.text,f=d.length?[]:null;return function(g,h){var l=c?c(g,h):y(c)?u:g,k=a(g,h,l)||B;if(f)for(var m=d.length;m--;)f[m]=la(d[m](g,h),e);la(l,e);if(k){if(k.constructor===k)throw ka("isecfn",e);if(k===Vf||k===Wf||k===Xf)throw ka("isecff",e);}l=k.apply?k.apply(l,f):k(f[0],f[1],f[2],f[3],f[4]);f&&(f.length=0);return la(l,e)}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(",")) +}this.consume("]");return w(function(c,d){for(var e=[],f=0,g=a.length;f<g;f++)e.push(a[f](c,d));return e},{literal:!0,constant:a.every(fc),inputs:a})},object:function(){var a=[],c=[];if("}"!==this.peekToken().text){do{if(this.peek("}"))break;var d=this.consume();d.constant?a.push(d.value):d.identifier?a.push(d.text):this.throwError("invalid key",d);this.consume(":");c.push(this.expression())}while(this.expect(","))}this.consume("}");return w(function(d,f){for(var g={},h=0,l=c.length;h<l;h++)g[a[h]]= +c[h](d,f);return g},{literal:!0,constant:c.every(fc),inputs:c})}};var Af=fa(),zf=fa(),Bf=Object.prototype.valueOf,Ca=M("$sce"),ma={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},ia=M("$compile"),Y=X.createElement("a"),id=Ba(P.location.href);Ec.$inject=["$provide"];jd.$inject=["$locale"];ld.$inject=["$locale"];var od=".",Lf={yyyy:Z("FullYear",4),yy:Z("FullYear",2,0,!0),y:Z("FullYear",1),MMMM:Kb("Month"),MMM:Kb("Month",!0),MM:Z("Month",2,1),M:Z("Month",1,1),dd:Z("Date",2),d:Z("Date", +1),HH:Z("Hours",2),H:Z("Hours",1),hh:Z("Hours",2,-12),h:Z("Hours",1,-12),mm:Z("Minutes",2),m:Z("Minutes",1),ss:Z("Seconds",2),s:Z("Seconds",1),sss:Z("Milliseconds",3),EEEE:Kb("Day"),EEE:Kb("Day",!0),a:function(a,c){return 12>a.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Jb(Math[0<a?"floor":"ceil"](a/60),2)+Jb(Math.abs(a%60),2))},ww:qd(2),w:qd(1)},Kf=/((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/,Jf=/^\-?\d+$/; +kd.$inject=["$locale"];var Gf=da(R),Hf=da(vb);md.$inject=["$parse"];var Td=da({restrict:"E",compile:function(a,c){if(!c.href&&!c.xlinkHref&&!c.name)return function(a,c){if("a"===c[0].nodeName.toLowerCase()){var f="[object SVGAnimatedString]"===Da.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)||a.preventDefault()})}}}}),wb={};s(Fb,function(a,c){if("multiple"!=a){var d=ya("ng-"+c);wb[d]=function(){return{restrict:"A",priority:100,link:function(a,f,g){a.$watch(g[d],function(a){g.$set(c, +!!a)})}}}}});s(Oc,function(a,c){wb[c]=function(){return{priority:100,link:function(a,e,f){if("ngPattern"===c&&"/"==f.ngPattern.charAt(0)&&(e=f.ngPattern.match(Nf))){f.$set("ngPattern",new RegExp(e[1],e[2]));return}a.$watch(f[c],function(a){f.$set(c,a)})}}}});s(["src","srcset","href"],function(a){var c=ya("ng-"+a);wb[c]=function(){return{priority:99,link:function(d,e,f){var g=a,h=a;"href"===a&&"[object SVGAnimatedString]"===Da.call(e.prop("href"))&&(h="xlinkHref",f.$attr[h]="xlink:href",g=null);f.$observe(c, +function(c){c?(f.$set(h,c),Ra&&g&&e.prop(g,f[h])):"href"===a&&f.$set(h,null)})}}}});var Lb={$addControl:B,$$renameControl:function(a,c){a.$name=c},$removeControl:B,$setValidity:B,$setDirty:B,$setPristine:B,$setSubmitted:B};rd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var yd=function(a){return["$timeout",function(c){return{name:"form",restrict:a?"EAC":"E",controller:rd,compile:function(a){a.addClass(Sa).addClass(lb);return{pre:function(a,d,g,h){if(!("action"in g)){var l=function(c){a.$apply(function(){h.$commitViewValue(); +h.$setSubmitted()});c.preventDefault()};d[0].addEventListener("submit",l,!1);d.on("$destroy",function(){c(function(){d[0].removeEventListener("submit",l,!1)},0,!1)})}var k=h.$$parentForm,m=h.$name;m&&(hb(a,null,m,h,m),g.$observe(g.name?"name":"ngForm",function(c){m!==c&&(hb(a,null,m,u,m),m=c,hb(a,null,m,h,m),k.$$renameControl(h,m))}));d.on("$destroy",function(){k.$removeControl(h);m&&hb(a,null,m,u,m);w(h,Lb)})}}}}}]},Ud=yd(),ge=yd(!0),Mf=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/, +Zf=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,$f=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,ag=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,zd=/^(\d{4})-(\d{2})-(\d{2})$/,Ad=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,kc=/^(\d{4})-W(\d\d)$/,Bd=/^(\d{4})-(\d\d)$/,Cd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Dd={text:function(a,c,d,e,f,g){jb(a,c,d,e,f,g);ic(e)},date:kb("date",zd,Nb(zd,["yyyy", +"MM","dd"]),"yyyy-MM-dd"),"datetime-local":kb("datetimelocal",Ad,Nb(Ad,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:kb("time",Cd,Nb(Cd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:kb("week",kc,function(a,c){if(pa(a))return a;if(x(a)){kc.lastIndex=0;var d=kc.exec(a);if(d){var e=+d[1],f=+d[2],g=d=0,h=0,l=0,k=pd(e),f=7*(f-1);c&&(d=c.getHours(),g=c.getMinutes(),h=c.getSeconds(),l=c.getMilliseconds());return new Date(e,0,k.getDate()+f,d,g,h,l)}}return NaN},"yyyy-Www"),month:kb("month", +Bd,Nb(Bd,["yyyy","MM"]),"yyyy-MM"),number:function(a,c,d,e,f,g){td(a,c,d,e);jb(a,c,d,e,f,g);e.$$parserName="number";e.$parsers.push(function(a){return e.$isEmpty(a)?null:ag.test(a)?parseFloat(a):u});e.$formatters.push(function(a){if(!e.$isEmpty(a)){if(!V(a))throw Ob("numfmt",a);a=a.toString()}return a});if(y(d.min)||d.ngMin){var h;e.$validators.min=function(a){return e.$isEmpty(a)||z(h)||a>=h};d.$observe("min",function(a){y(a)&&!V(a)&&(a=parseFloat(a,10));h=V(a)&&!isNaN(a)?a:u;e.$validate()})}if(y(d.max)|| +d.ngMax){var l;e.$validators.max=function(a){return e.$isEmpty(a)||z(l)||a<=l};d.$observe("max",function(a){y(a)&&!V(a)&&(a=parseFloat(a,10));l=V(a)&&!isNaN(a)?a:u;e.$validate()})}},url:function(a,c,d,e,f,g){jb(a,c,d,e,f,g);ic(e);e.$$parserName="url";e.$validators.url=function(a,c){var d=a||c;return e.$isEmpty(d)||Zf.test(d)}},email:function(a,c,d,e,f,g){jb(a,c,d,e,f,g);ic(e);e.$$parserName="email";e.$validators.email=function(a,c){var d=a||c;return e.$isEmpty(d)||$f.test(d)}},radio:function(a,c, +d,e){z(d.name)&&c.attr("name",++ob);c.on("click",function(a){c[0].checked&&e.$setViewValue(d.value,a&&a.type)});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e,f,g,h,l){var k=ud(l,a,"ngTrueValue",d.ngTrueValue,!0),m=ud(l,a,"ngFalseValue",d.ngFalseValue,!1);c.on("click",function(a){e.$setViewValue(c[0].checked,a&&a.type)});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return!1===a};e.$formatters.push(function(a){return ea(a, +k)});e.$parsers.push(function(a){return a?k:m})},hidden:B,button:B,submit:B,reset:B,file:B},yc=["$browser","$sniffer","$filter","$parse",function(a,c,d,e){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,g,h,l){l[0]&&(Dd[R(h.type)]||Dd.text)(f,g,h,l[0],c,a,d,e)}}}}],bg=/^(true|false|\d+)$/,ye=function(){return{restrict:"A",priority:100,compile:function(a,c){return bg.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value", +a)})}}}},Zd=["$compile",function(a){return{restrict:"AC",compile:function(c){a.$$addBindingClass(c);return function(c,e,f){a.$$addBindingInfo(e,f.ngBind);e=e[0];c.$watch(f.ngBind,function(a){e.textContent=a===u?"":a})}}}}],ae=["$interpolate","$compile",function(a,c){return{compile:function(d){c.$$addBindingClass(d);return function(d,f,g){d=a(f.attr(g.$attr.ngBindTemplate));c.$$addBindingInfo(f,d.expressions);f=f[0];g.$observe("ngBindTemplate",function(a){f.textContent=a===u?"":a})}}}}],$d=["$sce", +"$parse","$compile",function(a,c,d){return{restrict:"A",compile:function(e,f){var g=c(f.ngBindHtml),h=c(f.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(e);return function(c,e,f){d.$$addBindingInfo(e,f.ngBindHtml);c.$watch(h,function(){e.html(a.getTrustedHtml(g(c))||"")})}}}}],xe=da({restrict:"A",require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),be=jc("",!0),de=jc("Odd",0),ce=jc("Even",1),ee=Ja({compile:function(a,c){c.$set("ngCloak", +u);a.removeClass("ng-cloak")}}),fe=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Dc={},cg={blur:!0,focus:!0};s("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=ya("ng-"+a);Dc[c]=["$parse","$rootScope",function(d,e){return{restrict:"A",compile:function(f,g){var h=d(g[c],null,!0);return function(c,d){d.on(a,function(d){var f=function(){h(c,{$event:d})}; +cg[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var ie=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,l,k;c.$watch(e.ngIf,function(c){c?l||g(function(c,f){l=f;c[c.length++]=X.createComment(" end ngIf: "+e.ngIf+" ");h={clone:c};a.enter(c,d.parent(),d)}):(k&&(k.remove(),k=null),l&&(l.$destroy(),l=null),h&&(k=ub(h.clone),a.leave(k).then(function(){k=null}),h=null))})}}}],je=["$templateRequest","$anchorScroll", +"$animate","$sce",function(a,c,d,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:aa.noop,compile:function(f,g){var h=g.ngInclude||g.src,l=g.onload||"",k=g.autoscroll;return function(f,g,q,s,r){var u=0,w,n,D,H=function(){n&&(n.remove(),n=null);w&&(w.$destroy(),w=null);D&&(d.leave(D).then(function(){n=null}),n=D,D=null)};f.$watch(e.parseAsResourceUrl(h),function(e){var h=function(){!y(k)||k&&!f.$eval(k)||c()},n=++u;e?(a(e,!0).then(function(a){if(n===u){var c=f.$new(); +s.template=a;a=r(c,function(a){H();d.enter(a,null,g).then(h)});w=c;D=a;w.$emit("$includeContentLoaded",e);f.$eval(l)}},function(){n===u&&(H(),f.$emit("$includeContentError",e))}),f.$emit("$includeContentRequested",e)):(H(),s.template=null)})}}}}],Ae=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){/SVG/.test(d[0].toString())?(d.empty(),a(Gc(f.template,X).childNodes)(c,function(a){d.append(a)},{futureParentElement:d})):(d.html(f.template),a(d.contents())(c))}}}], +ke=Ja({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),we=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,c,d,e){var f=c.attr(d.$attr.ngList)||", ",g="false"!==d.ngTrim,h=g?T(f):f;e.$parsers.push(function(a){if(!z(a)){var c=[];a&&s(a.split(h),function(a){a&&c.push(g?T(a):a)});return c}});e.$formatters.push(function(a){return E(a)?a.join(f):u});e.$isEmpty=function(a){return!a||!a.length}}}},lb="ng-valid",vd="ng-invalid",Sa="ng-pristine", +Mb="ng-dirty",xd="ng-pending",Ob=new M("ngModel"),dg=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,c,d,e,f,g,h,l,k,m){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=u;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success= +{};this.$pending=u;this.$name=m(d.name||"",!1)(a);var p=f(d.ngModel),q=p.assign,t=p,r=q,w=null,C,n=this;this.$$setOptions=function(a){if((n.$options=a)&&a.getterSetter){var c=f(d.ngModel+"()"),g=f(d.ngModel+"($$$p)");t=function(a){var d=p(a);G(d)&&(d=c(a));return d};r=function(a,c){G(p(a))?g(a,{$$$p:n.$modelValue}):q(a,n.$modelValue)}}else if(!p.assign)throw Ob("nonassign",d.ngModel,ua(e));};this.$render=B;this.$isEmpty=function(a){return z(a)||""===a||null===a||a!==a};var D=e.inheritedData("$formController")|| +Lb,H=0;sd({ctrl:this,$element:e,set:function(a,c){a[c]=!0},unset:function(a,c){delete a[c]},parentForm:D,$animate:g});this.$setPristine=function(){n.$dirty=!1;n.$pristine=!0;g.removeClass(e,Mb);g.addClass(e,Sa)};this.$setDirty=function(){n.$dirty=!0;n.$pristine=!1;g.removeClass(e,Sa);g.addClass(e,Mb);D.$setDirty()};this.$setUntouched=function(){n.$touched=!1;n.$untouched=!0;g.setClass(e,"ng-untouched","ng-touched")};this.$setTouched=function(){n.$touched=!0;n.$untouched=!1;g.setClass(e,"ng-touched", +"ng-untouched")};this.$rollbackViewValue=function(){h.cancel(w);n.$viewValue=n.$$lastCommittedViewValue;n.$render()};this.$validate=function(){if(!V(n.$modelValue)||!isNaN(n.$modelValue)){var a=n.$$rawModelValue,c=n.$valid,d=n.$modelValue,e=n.$options&&n.$options.allowInvalid;n.$$runValidators(a,n.$$lastCommittedViewValue,function(f){e||c===f||(n.$modelValue=f?a:u,n.$modelValue!==d&&n.$$writeModelToScope())})}};this.$$runValidators=function(a,c,d){function e(){var d=!0;s(n.$validators,function(e, +f){var h=e(a,c);d=d&&h;g(f,h)});return d?!0:(s(n.$asyncValidators,function(a,c){g(c,null)}),!1)}function f(){var d=[],e=!0;s(n.$asyncValidators,function(f,h){var k=f(a,c);if(!k||!G(k.then))throw Ob("$asyncValidators",k);g(h,u);d.push(k.then(function(){g(h,!0)},function(a){e=!1;g(h,!1)}))});d.length?k.all(d).then(function(){h(e)},B):h(!0)}function g(a,c){l===H&&n.$setValidity(a,c)}function h(a){l===H&&d(a)}H++;var l=H;(function(){var a=n.$$parserName||"parse";if(C===u)g(a,null);else return C||(s(n.$validators, +function(a,c){g(c,null)}),s(n.$asyncValidators,function(a,c){g(c,null)})),g(a,C),C;return!0})()?e()?f():h(!1):h(!1)};this.$commitViewValue=function(){var a=n.$viewValue;h.cancel(w);if(n.$$lastCommittedViewValue!==a||""===a&&n.$$hasNativeValidators)n.$$lastCommittedViewValue=a,n.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var c=n.$$lastCommittedViewValue;if(C=z(c)?u:!0)for(var d=0;d<n.$parsers.length;d++)if(c=n.$parsers[d](c),z(c)){C=!1;break}V(n.$modelValue)&& +isNaN(n.$modelValue)&&(n.$modelValue=t(a));var e=n.$modelValue,f=n.$options&&n.$options.allowInvalid;n.$$rawModelValue=c;f&&(n.$modelValue=c,n.$modelValue!==e&&n.$$writeModelToScope());n.$$runValidators(c,n.$$lastCommittedViewValue,function(a){f||(n.$modelValue=a?c:u,n.$modelValue!==e&&n.$$writeModelToScope())})};this.$$writeModelToScope=function(){r(a,n.$modelValue);s(n.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}})};this.$setViewValue=function(a,c){n.$viewValue=a;n.$options&&!n.$options.updateOnDefault|| +n.$$debounceViewValueCommit(c)};this.$$debounceViewValueCommit=function(c){var d=0,e=n.$options;e&&y(e.debounce)&&(e=e.debounce,V(e)?d=e:V(e[c])?d=e[c]:V(e["default"])&&(d=e["default"]));h.cancel(w);d?w=h(function(){n.$commitViewValue()},d):l.$$phase?n.$commitViewValue():a.$apply(function(){n.$commitViewValue()})};a.$watch(function(){var c=t(a);if(c!==n.$modelValue){n.$modelValue=n.$$rawModelValue=c;C=u;for(var d=n.$formatters,e=d.length,f=c;e--;)f=d[e](f);n.$viewValue!==f&&(n.$viewValue=n.$$lastCommittedViewValue= +f,n.$render(),n.$$runValidators(c,f,B))}return c})}],ve=["$rootScope",function(a){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:dg,priority:1,compile:function(c){c.addClass(Sa).addClass("ng-untouched").addClass(lb);return{pre:function(a,c,f,g){var h=g[0],l=g[1]||Lb;h.$$setOptions(g[2]&&g[2].$options);l.$addControl(h);f.$observe("name",function(a){h.$name!==a&&l.$$renameControl(h,a)});a.$on("$destroy",function(){l.$removeControl(h)})},post:function(c,e,f,g){var h=g[0]; +if(h.$options&&h.$options.updateOn)e.on(h.$options.updateOn,function(a){h.$$debounceViewValueCommit(a&&a.type)});e.on("blur",function(e){h.$touched||(a.$$phase?c.$evalAsync(h.$setTouched):c.$apply(h.$setTouched))})}}}}}],eg=/(\s+|^)default(\s+|$)/,ze=function(){return{restrict:"A",controller:["$scope","$attrs",function(a,c){var d=this;this.$options=a.$eval(c.ngModelOptions);this.$options.updateOn!==u?(this.$options.updateOnDefault=!1,this.$options.updateOn=T(this.$options.updateOn.replace(eg,function(){d.$options.updateOnDefault= +!0;return" "}))):this.$options.updateOnDefault=!0}]}},le=Ja({terminal:!0,priority:1E3}),me=["$locale","$interpolate",function(a,c){var d=/{}/g,e=/^when(Minus)?(.+)$/;return{restrict:"EA",link:function(f,g,h){function l(a){g.text(a||"")}var k=h.count,m=h.$attr.when&&g.attr(h.$attr.when),p=h.offset||0,q=f.$eval(m)||{},t={},m=c.startSymbol(),r=c.endSymbol(),u=m+k+"-"+p+r,w=aa.noop,n;s(h,function(a,c){var d=e.exec(c);d&&(d=(d[1]?"-":"")+R(d[2]),q[d]=g.attr(h.$attr[c]))});s(q,function(a,e){t[e]=c(a.replace(d, +u))});f.$watch(k,function(c){c=parseFloat(c);var d=isNaN(c);d||c in q||(c=a.pluralCat(c-p));c===n||d&&isNaN(n)||(w(),w=f.$watch(t[c],l),n=c)})}}}],ne=["$parse","$animate",function(a,c){var d=M("ngRepeat"),e=function(a,c,d,e,k,m,p){a[d]=e;k&&(a[k]=m);a.$index=c;a.$first=0===c;a.$last=c===p-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(c&1))};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,compile:function(f,g){var h=g.ngRepeat,l=X.createComment(" end ngRepeat: "+ +h+" "),k=h.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!k)throw d("iexp",h);var m=k[1],p=k[2],q=k[3],t=k[4],k=m.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/);if(!k)throw d("iidexp",m);var r=k[3]||k[1],w=k[2];if(q&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(q)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(q)))throw d("badident",q);var y,n,D,H,v={$id:Na};t?y=a(t):(D=function(a,c){return Na(c)}, +H=function(a){return a});return function(a,f,g,k,m){y&&(n=function(c,d,e){w&&(v[w]=c);v[r]=d;v.$index=e;return y(a,v)});var t=fa();a.$watchCollection(p,function(g){var k,p,y=f[0],F,v=fa(),B,z,G,E,J,x,K;q&&(a[q]=g);if(Ta(g))J=g,p=n||D;else{p=n||H;J=[];for(K in g)g.hasOwnProperty(K)&&"$"!=K.charAt(0)&&J.push(K);J.sort()}B=J.length;K=Array(B);for(k=0;k<B;k++)if(z=g===J?k:J[k],G=g[z],E=p(z,G,k),t[E])x=t[E],delete t[E],v[E]=x,K[k]=x;else{if(v[E])throw s(K,function(a){a&&a.scope&&(t[a.id]=a)}),d("dupes", +h,E,G);K[k]={id:E,scope:u,clone:u};v[E]=!0}for(F in t){x=t[F];E=ub(x.clone);c.leave(E);if(E[0].parentNode)for(k=0,p=E.length;k<p;k++)E[k].$$NG_REMOVED=!0;x.scope.$destroy()}for(k=0;k<B;k++)if(z=g===J?k:J[k],G=g[z],x=K[k],x.scope){F=y;do F=F.nextSibling;while(F&&F.$$NG_REMOVED);x.clone[0]!=F&&c.move(ub(x.clone),null,C(y));y=x.clone[x.clone.length-1];e(x.scope,k,r,G,w,z,B)}else m(function(a,d){x.scope=d;var f=l.cloneNode(!1);a[a.length++]=f;c.enter(a,null,C(y));y=f;x.clone=a;v[x.id]=x;e(x.scope,k,r, +G,w,z,B)});t=v})}}}}],oe=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(c,d,e){c.$watch(e.ngShow,function(c){a[c?"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],he=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(c,d,e){c.$watch(e.ngHide,function(c){a[c?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],pe=Ja(function(a,c,d){a.$watchCollection(d.ngStyle,function(a,d){d&&a!==d&&s(d,function(a, +d){c.css(d,"")});a&&c.css(a)})}),qe=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(c,d,e,f){var g=[],h=[],l=[],k=[],m=function(a,c){return function(){a.splice(c,1)}};c.$watch(e.ngSwitch||e.on,function(c){var d,e;d=0;for(e=l.length;d<e;++d)a.cancel(l[d]);d=l.length=0;for(e=k.length;d<e;++d){var r=ub(h[d].clone);k[d].$destroy();(l[d]=a.leave(r)).then(m(l,d))}h.length=0;k.length=0;(g=f.cases["!"+c]||f.cases["?"])&&s(g,function(c){c.transclude(function(d, +e){k.push(e);var f=c.element;d[d.length++]=X.createComment(" end ngSwitchWhen: ");h.push({clone:d});a.enter(d,f.parent(),f)})})})}}}],re=Ja({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,c,d,e,f){e.cases["!"+d.ngSwitchWhen]=e.cases["!"+d.ngSwitchWhen]||[];e.cases["!"+d.ngSwitchWhen].push({transclude:f,element:c})}}),se=Ja({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,c,d,e,f){e.cases["?"]=e.cases["?"]||[];e.cases["?"].push({transclude:f, +element:c})}}),ue=Ja({restrict:"EAC",link:function(a,c,d,e,f){if(!f)throw M("ngTransclude")("orphan",ua(c));f(function(a){c.empty();c.append(a)})}}),Vd=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){"text/ng-template"==d.type&&a.put(d.id,c[0].text)}}}],fg=M("ngOptions"),te=da({restrict:"A",terminal:!0}),Wd=["$compile","$parse",function(a,c){var d=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/, +e={$setViewValue:B};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var l=this,k={},m=e,p;l.databound=d.ngModel;l.init=function(a,c,d){m=a;p=d};l.addOption=function(c,d){Ma(c,'"option value"');k[c]=!0;m.$viewValue==c&&(a.val(c),p.parent()&&p.remove());d&&d[0].hasAttribute("selected")&&(d[0].selected=!0)};l.removeOption=function(a){this.hasOption(a)&&(delete k[a],m.$viewValue===a&&this.renderUnknownOption(a))};l.renderUnknownOption=function(c){c= +"? "+Na(c)+" ?";p.val(c);a.prepend(p);a.val(c);p.prop("selected",!0)};l.hasOption=function(a){return k.hasOwnProperty(a)};c.$on("$destroy",function(){l.renderUnknownOption=B})}],link:function(e,g,h,l){function k(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(v.parent()&&v.remove(),c.val(a),""===a&&B.prop("selected",!0)):z(a)&&B?c.val(""):e.renderUnknownOption(a)};c.on("change",function(){a.$apply(function(){v.parent()&&v.remove();d.$setViewValue(c.val())})})}function m(a,c,d){var e; +d.$render=function(){var a=new eb(d.$viewValue);s(c.find("option"),function(c){c.selected=y(a.get(c.value))})};a.$watch(function(){ea(e,d.$viewValue)||(e=qa(d.$viewValue),d.$render())});c.on("change",function(){a.$apply(function(){var a=[];s(c.find("option"),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function p(e,f,g){function h(a,c,d){R[B]=d;G&&(R[G]=c);return a(e,R)}function k(a){var c;if(t)if(K&&E(a)){c=new eb([]);for(var d=0;d<a.length;d++)c.put(h(K,null,a[d]),!0)}else c= +new eb(a);else K&&(a=h(K,null,a));return function(d,e){var f;f=K?K:z?z:A;return t?y(c.remove(h(f,d,e))):a===h(f,d,e)}}function l(){n||(e.$$postDigest(p),n=!0)}function m(a,c,d){a[c]=a[c]||0;a[c]+=d?1:-1}function p(){n=!1;var a={"":[]},c=[""],d,l,r,u,v;r=g.$viewValue;u=N(e)||[];var B=G?Object.keys(u).sort():u,x,z,E,A,O={};v=k(r);var M=!1,T,V;Q={};for(A=0;E=B.length,A<E;A++){x=A;if(G&&(x=B[A],"$"===x.charAt(0)))continue;z=u[x];d=h(J,x,z)||"";(l=a[d])||(l=a[d]=[],c.push(d));d=v(x,z);M=M||d;z=h(C,x,z); +z=y(z)?z:"";V=K?K(e,R):G?B[A]:A;K&&(Q[V]=x);l.push({id:V,label:z,selected:d})}t||(w||null===r?a[""].unshift({id:"",label:"",selected:!M}):M||a[""].unshift({id:"?",label:"",selected:!0}));x=0;for(B=c.length;x<B;x++){d=c[x];l=a[d];P.length<=x?(r={element:H.clone().attr("label",d),label:l.label},u=[r],P.push(u),f.append(r.element)):(u=P[x],r=u[0],r.label!=d&&r.element.attr("label",r.label=d));M=null;A=0;for(E=l.length;A<E;A++)d=l[A],(v=u[A+1])?(M=v.element,v.label!==d.label&&(m(O,v.label,!1),m(O,d.label, +!0),M.text(v.label=d.label),M.prop("label",v.label)),v.id!==d.id&&M.val(v.id=d.id),M[0].selected!==d.selected&&(M.prop("selected",v.selected=d.selected),Ra&&M.prop("selected",v.selected))):(""===d.id&&w?T=w:(T=D.clone()).val(d.id).prop("selected",d.selected).attr("selected",d.selected).prop("label",d.label).text(d.label),u.push(v={element:T,label:d.label,id:d.id,selected:d.selected}),m(O,d.label,!0),M?M.after(T):r.element.append(T),M=T);for(A++;u.length>A;)d=u.pop(),m(O,d.label,!1),d.element.remove()}for(;P.length> +x;){l=P.pop();for(A=1;A<l.length;++A)m(O,l[A].label,!1);l[0].element.remove()}s(O,function(a,c){0<a?q.addOption(c):0>a&&q.removeOption(c)})}var v;if(!(v=r.match(d)))throw fg("iexp",r,ua(f));var C=c(v[2]||v[1]),B=v[4]||v[6],x=/ as /.test(v[0])&&v[1],z=x?c(x):null,G=v[5],J=c(v[3]||""),A=c(v[2]?v[1]:B),N=c(v[7]),K=v[8]?c(v[8]):null,Q={},P=[[{element:f,label:""}]],R={};w&&(a(w)(e),w.removeClass("ng-scope"),w.remove());f.empty();f.on("change",function(){e.$apply(function(){var a=N(e)||[],c;if(t)c=[],s(f.val(), +function(d){d=K?Q[d]:d;c.push("?"===d?u:""===d?null:h(z?z:A,d,a[d]))});else{var d=K?Q[f.val()]:f.val();c="?"===d?u:""===d?null:h(z?z:A,d,a[d])}g.$setViewValue(c);p()})});g.$render=p;e.$watchCollection(N,l);e.$watchCollection(function(){var a=N(e),c;if(a&&E(a)){c=Array(a.length);for(var d=0,f=a.length;d<f;d++)c[d]=h(C,d,a[d])}else if(a)for(d in c={},a)a.hasOwnProperty(d)&&(c[d]=h(C,d,a[d]));return c},l);t&&e.$watchCollection(function(){return g.$modelValue},l)}if(l[1]){var q=l[0];l=l[1];var t=h.multiple, +r=h.ngOptions,w=!1,B,n=!1,D=C(X.createElement("option")),H=C(X.createElement("optgroup")),v=D.clone();h=0;for(var x=g.children(),G=x.length;h<G;h++)if(""===x[h].value){B=w=x.eq(h);break}q.init(l,w,v);t&&(l.$isEmpty=function(a){return!a||0===a.length});r?p(e,g,l):t?m(e,g,l):k(e,g,l,q)}}}}],Yd=["$interpolate",function(a){var c={addOption:B,removeOption:B};return{restrict:"E",priority:100,compile:function(d,e){if(z(e.value)){var f=a(d.text(),!0);f||e.$set("value",d.text())}return function(a,d,e){var k= +d.parent(),m=k.data("$selectController")||k.parent().data("$selectController");m&&m.databound||(m=c);f?a.$watch(f,function(a,c){e.$set("value",a);c!==a&&m.removeOption(c);m.addOption(a,d)}):m.addOption(e.value,d);d.on("$destroy",function(){m.removeOption(e.value)})}}}}],Xd=da({restrict:"E",terminal:!1}),Ac=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){e&&(d.required=!0,e.$validators.required=function(a,c){return!d.required||!e.$isEmpty(c)},d.$observe("required",function(){e.$validate()}))}}}, +zc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f,g=d.ngPattern||d.pattern;d.$observe("pattern",function(a){x(a)&&0<a.length&&(a=new RegExp("^"+a+"$"));if(a&&!a.test)throw M("ngPattern")("noregexp",g,a,ua(c));f=a||u;e.$validate()});e.$validators.pattern=function(a){return e.$isEmpty(a)||z(f)||f.test(a)}}}}},Cc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=-1;d.$observe("maxlength",function(a){a=$(a);f=isNaN(a)?-1:a;e.$validate()}); +e.$validators.maxlength=function(a,c){return 0>f||e.$isEmpty(c)||c.length<=f}}}}},Bc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("minlength",function(a){f=$(a)||0;e.$validate()});e.$validators.minlength=function(a,c){return e.$isEmpty(c)||c.length>=f}}}}};P.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):(Nd(),Pd(aa),C(X).ready(function(){Jd(X,tc)}))})(window,document);!window.angular.$$csp()&&window.angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}</style>'); +//# sourceMappingURL=angular.min.js.map
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.css b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.css new file mode 100644 index 00000000..240be45b --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.css @@ -0,0 +1,74 @@ +.angularjs-datetime-picker { + color: #333; + font: normal 14px sans-serif; + border: 1px solid #ddd; + display: inline-block; + background: #fff; +} +.angularjs-datetime-picker > .adp-month { + text-align: center; + line-height: 22px; + padding: 10px; + background: #fcfcfc; + text-transform: uppercase; + font-weight: bold; + border-bottom: 1px solid #ddd; + position: relative; +} +.angularjs-datetime-picker > .adp-month > button { + color: #555; + font: normal 14px sans-serif; + outline: none; + position: absolute; + background: transparent; + border: none; + cursor: pointer; +} +.angularjs-datetime-picker > .adp-month > button:hover { + color: #333; +} +.angularjs-datetime-picker > .adp-month > button.adp-prev { + left: 10px; +} +.angularjs-datetime-picker > .adp-month > button.adp-next { + right: 10px; +} +.angularjs-datetime-picker > .adp-days { + width: 210px; /* 30 x 7 */ + margin: 10px; + text-align: center; +} +.angularjs-datetime-picker > .adp-days > .adp-day-of-week, .angularjs-datetime-picker > .adp-days > .adp-day { + box-sizing: border-box; + -moz-box-sizing: border-box; + border: 1px solid transparent; + width: 30px; + line-height: 28px; + float: left; +} +.angularjs-datetime-picker > .adp-days > .adp-day-of-week { + font-weight: bold; +} +.angularjs-datetime-picker > .adp-days > .adp-day:not(.selectable) { + opacity: 0.15; + cursor: default; +} +.angularjs-datetime-picker > .adp-days > .adp-day.selectable { + cursor: pointer; +} +.angularjs-datetime-picker > .adp-days > .adp-day.selected { + background: #e0e0e0; +} +.angularjs-datetime-picker > .adp-days > .adp-day.selectable:hover { + background: #eee; +} +.angularjs-datetime-picker > .adp-days:after { + content: ''; + display: block; + clear: left; + height: 0; +} + +.angularjs-datetime-picker input[type=range] { + width: 150px; +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.js new file mode 100644 index 00000000..946f12e8 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.js @@ -0,0 +1,332 @@ +(function() { + 'use strict'; + + angular.module('angularjs-datetime-picker', []); + + var getTimezoneOffset = function(date) { + (typeof date == 'string') && (date = new Date(date)); + var jan = new Date(date.getFullYear(), 0, 1); + var jul = new Date(date.getFullYear(), 6, 1); + var stdTimezoneOffset = Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); + var isDST = date.getTimezoneOffset() < stdTimezoneOffset; + var offset = isDST ? stdTimezoneOffset - 60 : stdTimezoneOffset; + var diff = offset >=0 ? '-' : '+'; + return diff + + ("0"+ (offset / 60)).slice(-2) + ':' + + ("0"+ (offset % 60)).slice(-2); + }; + + var DatetimePicker = function($compile, $document, $controller){ + var datetimePickerCtrl = $controller('DatetimePickerCtrl'); //directive controller + return { + open: function(options) { + datetimePickerCtrl.openDatetimePicker(options); + }, + close: function() { + datetimePickerCtrl.closeDatetimePicker(); + } + }; + }; + DatetimePicker.$inject = ['$compile', '$document', '$controller']; + angular.module('angularjs-datetime-picker').factory('DatetimePicker', DatetimePicker); + + var DatetimePickerCtrl = function($compile, $document) { + var datetimePickerEl; + var _this = this; + var removeEl = function(el) { + el && el.remove(); + $document[0].body.removeEventListener('click', _this.closeDatetimePicker); + }; + + this.openDatetimePicker = function(options) { + this.closeDatetimePicker(); + var div = angular.element('<div datetime-picker-popup ng-cloak></div>'); + options.dateFormat && div.attr('date-format', options.dateFormat); + options.ngModel && div.attr('ng-model', options.ngModel); + options.year && div.attr('year', parseInt(options.year)); + options.month && div.attr('month', parseInt(options.month)); + options.day && div.attr('day', parseInt(options.day)); + options.hour && div.attr('hour', parseInt(options.hour)); + options.minute && div.attr('minute', parseInt(options.minute)); + if (options.dateOnly === '' || options.dateOnly === true) { + div.attr('date-only', 'true'); + } + if (options.closeOnSelect === 'false') { + div.attr('close-on-select', 'false'); + } + + var triggerEl = options.triggerEl; + options.scope = options.scope || angular.element(triggerEl).scope(); + datetimePickerEl = $compile(div)(options.scope)[0]; + datetimePickerEl.triggerEl = options.triggerEl; + + $document[0].body.appendChild(datetimePickerEl); + + //show datetimePicker below triggerEl + var bcr = triggerEl.getBoundingClientRect(); + datetimePickerEl.style.position='absolute'; + datetimePickerEl.style.left= (bcr.left + window.scrollX) + 'px'; + + options.scope.$apply(); + + var datePickerElBcr = datetimePickerEl.getBoundingClientRect(); + + if (bcr.top < 300 || window.innerHeight - bcr.bottom > 300) { + datetimePickerEl.style.top = (bcr.bottom + window.scrollY) + 'px'; + } else { + datetimePickerEl.style.top = (bcr.top - datePickerElBcr.height + window.scrollY) + 'px'; + } + + $document[0].body.addEventListener('click', this.closeDatetimePicker); + }; + + this.closeDatetimePicker = function(evt) { + var target = evt && evt.target; + var popupEl = $document[0].querySelector('div[datetime-picker-popup]'); + if (evt && target) { + if (target.hasAttribute('datetime-picker')) { // element with datetimePicker behaviour + // do nothing + } else if (popupEl && popupEl.contains(target)) { // datetimePicker itself + // do nothing + } else { + removeEl(popupEl); + } + } else { + removeEl(popupEl); + } + } + }; + DatetimePickerCtrl.$inject = ['$compile', '$document']; + angular.module('angularjs-datetime-picker').controller('DatetimePickerCtrl', DatetimePickerCtrl); + + var tmpl = [ + '<div class="angularjs-datetime-picker">' , + ' <div class="adp-month">', + ' <button type="button" class="adp-prev" ng-click="addMonth(-1)">«</button>', + ' <span title="{{months[mv.month].fullName}}">{{months[mv.month].shortName}}</span> {{mv.year}}', + ' <button type="button" class="adp-next" ng-click="addMonth(1)">»</button>', + ' </div>', + ' <div class="adp-days" ng-click="setDate($event)">', + ' <div class="adp-day-of-week" ng-repeat="dayOfWeek in ::daysOfWeek" title="{{dayOfWeek.fullName}}">{{::dayOfWeek.firstLetter}}</div>', + ' <div class="adp-day" ng-repeat="day in mv.leadingDays">{{::day}}</div>', + ' <div class="adp-day selectable" ng-repeat="day in mv.days" ', + ' ng-class="{selected: (day == selectedDay)}">{{::day}}</div>', + ' <div class="adp-day" ng-repeat="day in mv.trailingDays">{{::day}}</div>', + ' </div>', + ' <div class="adp-days" id="adp-time"> ', + ' Time : {{("0"+inputHour).slice(-2)}} : {{("0"+inputMinute).slice(-2)}} <br/>', + ' <label>Hour:</label> <input type="range" min="0" max="23" ng-model="inputHour" ng-change="updateNgModel()" />', + ' <label>Min.:</label> <input type="range" min="0" max="59" ng-model="inputMinute" ng-change="updateNgModel()"/> ', + ' </div> ', + '</div>'].join("\n"); + + var datetimePickerPopup = function($locale, dateFilter){ + var days, months, daysOfWeek, firstDayOfWeek; + + var initVars = function() { + days =[], months=[]; daysOfWeek=[], firstDayOfWeek=0; + for (var i = 1; i <= 31; i++) { + days.push(i); + } + + for (var i = 0; i < 12; i++) { //jshint ignore:line + months.push({ + fullName: $locale.DATETIME_FORMATS.MONTH[i], + shortName: $locale.DATETIME_FORMATS.SHORTMONTH[i] + }); + } + + for (var i = 0; i < 7; i++) { //jshint ignore:line + var day = $locale.DATETIME_FORMATS.DAY[(i + firstDayOfWeek) % 7]; + + daysOfWeek.push({ + fullName: day, + firstLetter: day.substr(0, 2) + }); + } + firstDayOfWeek = $locale.DATETIME_FORMATS.FIRSTDAYOFWEEK || 0; + }; + + var getMonthView = function(year, month) { + if (month>11) { + year++; + } else if (month < 0) { + year--; + } + month = (month + 12) % 12; + var firstDayOfMonth = new Date(year, month, 1), + lastDayOfMonth = new Date(year, month + 1, 0), + lastDayOfPreviousMonth = new Date(year, month, 0), + daysInMonth = lastDayOfMonth.getDate(), + daysInLastMonth = lastDayOfPreviousMonth.getDate(), + dayOfWeek = firstDayOfMonth.getDay(), + leadingDays = (dayOfWeek - firstDayOfWeek + 7) % 7 || 7, // Ensure there are always leading days to give context + trailingDays = days.slice(0, 6 * 7 - (leadingDays + daysInMonth)); + if (trailingDays.length > 7) { + trailingDays = trailingDays.slice(0, trailingDays.length-7); + } + + return { + year: year, + month: month, + days: days.slice(0, daysInMonth), + leadingDays: days.slice(- leadingDays - (31 - daysInLastMonth), daysInLastMonth), + trailingDays: trailingDays + }; + }; + + var linkFunc = function(scope, element, attrs, ctrl) { //jshint ignore:line + initVars(); //initialize days, months, daysOfWeek, and firstDayOfWeek; + var dateFormat = attrs.dateFormat || 'short'; + scope.months = months; + scope.daysOfWeek = daysOfWeek; + scope.inputHour; + scope.inputMinute; + + if (scope.dateOnly === true){ + element[0].querySelector('#adp-time').style.display = 'none'; + } + + scope.$applyAsync( function() { + ctrl.triggerEl = angular.element(element[0].triggerEl); + if (attrs.ngModel) { // need to parse date string + var dateStr = ''+ctrl.triggerEl.scope().$eval(attrs.ngModel); + if (dateStr) { + if (!dateStr.match(/[0-9]{2}:/)) { // if no time is given, add 00:00:00 at the end + dateStr += " 00:00:00"; + } + dateStr = dateStr.replace(/([0-9]{2}-[0-9]{2})-([0-9]{4})/,'$2-$1'); //mm-dd-yyyy to yyyy-mm-dd + dateStr = dateStr.replace(/([\/-][0-9]{2,4})\ ([0-9]{2}\:[0-9]{2}\:)/,'$1T$2'); //reformat for FF + dateStr = dateStr.replace(/EDT|EST|CDT|CST|MDT|PDT|PST|UT|GMT/g,''); //remove timezone + dateStr = dateStr.replace(/\s*\(\)\s*/,''); //remove timezone + dateStr = dateStr.replace(/[\-\+][0-9]{2}:?[0-9]{2}$/,''); //remove timezone + dateStr += getTimezoneOffset(dateStr); + var d = new Date(dateStr); + scope.selectedDate = new Date( + d.getFullYear(), + d.getMonth(), + d.getDate(), + d.getHours(), + d.getMinutes(), + d.getSeconds() + ); + } + } + + if (!scope.selectedDate || isNaN(scope.selectedDate.getTime())) { // no predefined date + var today = new Date(); + var year = scope.year || today.getFullYear(); + var month = scope.month ? (scope.month-1) : today.getMonth(); + var day = scope.day || today.getDate(); + var hour = scope.hour || today.getHours(); + var minute = scope.minute || today.getMinutes(); + scope.selectedDate = new Date(year, month, day, hour, minute, 0); + } + scope.inputHour = scope.selectedDate.getHours(); + scope.inputMinute = scope.selectedDate.getMinutes(); + + // Default to current year and month + scope.mv = getMonthView(scope.selectedDate.getFullYear(), scope.selectedDate.getMonth()); + if (scope.mv.year == scope.selectedDate.getFullYear() && scope.mv.month == scope.selectedDate.getMonth()) { + scope.selectedDay = scope.selectedDate.getDate(); + } else { + scope.selectedDay = null; + } + }); + + scope.addMonth = function (amount) { + scope.mv = getMonthView(scope.mv.year, scope.mv.month + amount); + }; + + scope.setDate = function (evt) { + var target = angular.element(evt.target)[0]; + if (target.className.indexOf('selectable')) { + scope.updateNgModel(parseInt(target.innerHTML)); + if (scope.closeOnSelect !== false) { + ctrl.closeDatetimePicker(); + } + } + }; + + scope.updateNgModel = function(day) { + day = day ? day : scope.selectedDate.getDate(); + scope.selectedDate = new Date( + scope.mv.year, scope.mv.month, day, scope.inputHour, scope.inputMinute, 0 + ); + scope.selectedDay = scope.selectedDate.getDate(); + if (attrs.ngModel) { + //console.log('attrs.ngModel',attrs.ngModel); + var elScope = ctrl.triggerEl.scope(), dateValue; + if (elScope.$eval(attrs.ngModel) && elScope.$eval(attrs.ngModel).constructor.name === 'Date') { + dateValue = new Date(dateFilter(scope.selectedDate, dateFormat)); + } else { + dateValue = dateFilter(scope.selectedDate, dateFormat); + } + elScope.$eval(attrs.ngModel + '= date', {date: dateValue}); + } + }; + + scope.$on('$destroy', ctrl.closeDatetimePicker); + }; + + return { + restrict: 'A', + template: tmpl, + controller: 'DatetimePickerCtrl', + replace: true, + scope: { + year: '=', + month: '=', + day: '=', + hour: '=', + minute: '=', + dateOnly: '=', + closeOnSelect: '=' + }, + link: linkFunc + }; + }; + datetimePickerPopup.$inject = ['$locale', 'dateFilter']; + angular.module('angularjs-datetime-picker').directive('datetimePickerPopup', datetimePickerPopup); + + var datetimePicker = function($parse, DatetimePicker) { + return { + // An ngModel is required to get the controller argument + require: 'ngModel', + link: function(scope, element, attrs, ctrl) { + // Attach validation watcher + scope.$watch(attrs.ngModel, function(value) { + if( !value || value == '' ){ + return; + } + // The value has already been cleaned by the above code + var date = new Date(value); + ctrl.$setValidity('date', !date? false : true); + var now = new Date(); + if( attrs.hasOwnProperty('futureOnly') ){ + ctrl.$setValidity('future-only', date < now? false : true); + } + }); + + element[0].addEventListener('click', function() { + DatetimePicker.open({ + triggerEl: element[0], + dateFormat: attrs.dateFormat, + ngModel: attrs.ngModel, + year: attrs.year, + month: attrs.month, + day: attrs.day, + hour: attrs.hour, + minute: attrs.minute, + dateOnly: attrs.dateOnly, + futureOnly: attrs.futureOnly, + closeOnSelect: attrs.closeOnSelect + }); + }); + } + }; + }; + datetimePicker.$inject=['$parse', 'DatetimePicker']; + angular.module('angularjs-datetime-picker').directive('datetimePicker', datetimePicker); + +})(); diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.min.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.min.js new file mode 100644 index 00000000..bc6c19ac --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.min.js @@ -0,0 +1 @@ +!function(){"use strict";angular.module("angularjs-datetime-picker",[]);var e=function(e){"string"==typeof e&&(e=new Date(e));var t=new Date(e.getFullYear(),0,1),a=new Date(e.getFullYear(),6,1),n=Math.max(t.getTimezoneOffset(),a.getTimezoneOffset()),l=e.getTimezoneOffset()<n,r=l?n-60:n,i=r>=0?"-":"+";return i+("0"+r/60).slice(-2)+":"+("0"+r%60).slice(-2)},t=function(e,t,a){var n=a("DatetimePickerCtrl");return{open:function(e){n.openDatetimePicker(e)},close:function(){n.closeDatetimePicker()}}};t.$inject=["$compile","$document","$controller"],angular.module("angularjs-datetime-picker").factory("DatetimePicker",t);var a=function(e,t){var a,n=this,l=function(e){e&&e.remove(),t[0].body.removeEventListener("click",n.closeDatetimePicker)};this.openDatetimePicker=function(n){this.closeDatetimePicker();var l=angular.element("<div datetime-picker-popup ng-cloak></div>");n.dateFormat&&l.attr("date-format",n.dateFormat),n.ngModel&&l.attr("ng-model",n.ngModel),n.year&&l.attr("year",parseInt(n.year)),n.month&&l.attr("month",parseInt(n.month)),n.day&&l.attr("day",parseInt(n.day)),n.hour&&l.attr("hour",parseInt(n.hour)),n.minute&&l.attr("minute",parseInt(n.minute)),(""===n.dateOnly||n.dateOnly===!0)&&l.attr("date-only","true"),"false"===n.closeOnSelect&&l.attr("close-on-select","false");var r=n.triggerEl;n.scope=n.scope||angular.element(r).scope(),a=e(l)(n.scope)[0],a.triggerEl=n.triggerEl,t[0].body.appendChild(a);var i=r.getBoundingClientRect();a.style.position="absolute",a.style.left=i.left+window.scrollX+"px",n.scope.$apply();var o=a.getBoundingClientRect();a.style.top=i.top<300||window.innerHeight-i.bottom>300?i.bottom+window.scrollY+"px":i.top-o.height+window.scrollY+"px",t[0].body.addEventListener("click",this.closeDatetimePicker)},this.closeDatetimePicker=function(e){var a=e&&e.target,n=t[0].querySelector("div[datetime-picker-popup]");e&&a?a.hasAttribute("datetime-picker")||n&&n.contains(a)||l(n):l(n)}};a.$inject=["$compile","$document"],angular.module("angularjs-datetime-picker").controller("DatetimePickerCtrl",a);var n=['<div class="angularjs-datetime-picker">',' <div class="adp-month">',' <button type="button" class="adp-prev" ng-click="addMonth(-1)">«</button>',' <span title="{{months[mv.month].fullName}}">{{months[mv.month].shortName}}</span> {{mv.year}}',' <button type="button" class="adp-next" ng-click="addMonth(1)">»</button>'," </div>",' <div class="adp-days" ng-click="setDate($event)">',' <div class="adp-day-of-week" ng-repeat="dayOfWeek in ::daysOfWeek" title="{{dayOfWeek.fullName}}">{{::dayOfWeek.firstLetter}}</div>',' <div class="adp-day" ng-repeat="day in mv.leadingDays">{{::day}}</div>',' <div class="adp-day selectable" ng-repeat="day in mv.days" ',' ng-class="{selected: (day == selectedDay)}">{{::day}}</div>',' <div class="adp-day" ng-repeat="day in mv.trailingDays">{{::day}}</div>'," </div>",' <div class="adp-days" id="adp-time"> ',' Time : {{("0"+inputHour).slice(-2)}} : {{("0"+inputMinute).slice(-2)}} <br/>',' <label>Hour:</label> <input type="range" min="0" max="23" ng-model="inputHour" ng-change="updateNgModel()" />',' <label>Min.:</label> <input type="range" min="0" max="59" ng-model="inputMinute" ng-change="updateNgModel()"/> '," </div> ","</div>"].join("\n"),l=function(t,a){var l,r,i,o,c=function(){l=[],r=[],i=[],o=0;for(var e=1;31>=e;e++)l.push(e);for(var e=0;12>e;e++)r.push({fullName:t.DATETIME_FORMATS.MONTH[e],shortName:t.DATETIME_FORMATS.SHORTMONTH[e]});for(var e=0;7>e;e++){var a=t.DATETIME_FORMATS.DAY[(e+o)%7];i.push({fullName:a,firstLetter:a.substr(0,2)})}o=t.DATETIME_FORMATS.FIRSTDAYOFWEEK||0},d=function(e,t){t>11?e++:0>t&&e--,t=(t+12)%12;var a=new Date(e,t,1),n=new Date(e,t+1,0),r=new Date(e,t,0),i=n.getDate(),c=r.getDate(),d=a.getDay(),s=(d-o+7)%7||7,u=l.slice(0,42-(s+i));return u.length>7&&(u=u.slice(0,u.length-7)),{year:e,month:t,days:l.slice(0,i),leadingDays:l.slice(-s-(31-c),c),trailingDays:u}},s=function(t,n,l,o){c();var s=l.dateFormat||"short";t.months=r,t.daysOfWeek=i,t.inputHour,t.inputMinute,t.dateOnly===!0&&(n[0].querySelector("#adp-time").style.display="none"),t.$applyAsync(function(){if(o.triggerEl=angular.element(n[0].triggerEl),l.ngModel){var a=""+o.triggerEl.scope().$eval(l.ngModel);if(a){a.match(/[0-9]{2}:/)||(a+=" 00:00:00"),a=a.replace(/([0-9]{2}-[0-9]{2})-([0-9]{4})/,"$2-$1"),a=a.replace(/([\/-][0-9]{2,4})\ ([0-9]{2}\:[0-9]{2}\:)/,"$1T$2"),a=a.replace(/EDT|EST|CDT|CST|MDT|PDT|PST|UT|GMT/g,""),a=a.replace(/\s*\(\)\s*/,""),a=a.replace(/[\-\+][0-9]{2}:?[0-9]{2}$/,""),a+=e(a);var r=new Date(a);t.selectedDate=new Date(r.getFullYear(),r.getMonth(),r.getDate(),r.getHours(),r.getMinutes(),r.getSeconds())}}if(!t.selectedDate||isNaN(t.selectedDate.getTime())){var i=new Date,c=t.year||i.getFullYear(),s=t.month?t.month-1:i.getMonth(),u=t.day||i.getDate(),m=t.hour||i.getHours(),g=t.minute||i.getMinutes();t.selectedDate=new Date(c,s,u,m,g,0)}t.inputHour=t.selectedDate.getHours(),t.inputMinute=t.selectedDate.getMinutes(),t.mv=d(t.selectedDate.getFullYear(),t.selectedDate.getMonth()),t.selectedDay=t.mv.year==t.selectedDate.getFullYear()&&t.mv.month==t.selectedDate.getMonth()?t.selectedDate.getDate():null}),t.addMonth=function(e){t.mv=d(t.mv.year,t.mv.month+e)},t.setDate=function(e){var a=angular.element(e.target)[0];a.className.indexOf("selectable")&&(t.updateNgModel(parseInt(a.innerHTML)),t.closeOnSelect!==!1&&o.closeDatetimePicker())},t.updateNgModel=function(e){if(e=e?e:t.selectedDate.getDate(),t.selectedDate=new Date(t.mv.year,t.mv.month,e,t.inputHour,t.inputMinute,0),t.selectedDay=t.selectedDate.getDate(),l.ngModel){var n,r=o.triggerEl.scope();n=r.$eval(l.ngModel)&&"Date"===r.$eval(l.ngModel).constructor.name?new Date(a(t.selectedDate,s)):a(t.selectedDate,s),r.$eval(l.ngModel+"= date",{date:n})}},t.$on("$destroy",o.closeDatetimePicker)};return{restrict:"A",template:n,controller:"DatetimePickerCtrl",replace:!0,scope:{year:"=",month:"=",day:"=",hour:"=",minute:"=",dateOnly:"=",closeOnSelect:"="},link:s}};l.$inject=["$locale","dateFilter"],angular.module("angularjs-datetime-picker").directive("datetimePickerPopup",l);var r=function(e,t){return{require:"ngModel",link:function(e,a,n,l){e.$watch(n.ngModel,function(e){if(e&&""!=e){var t=new Date(e);l.$setValidity("date",t?!0:!1);var a=new Date;n.hasOwnProperty("futureOnly")&&l.$setValidity("future-only",a>t?!1:!0)}}),a[0].addEventListener("click",function(){t.open({triggerEl:a[0],dateFormat:n.dateFormat,ngModel:n.ngModel,year:n.year,month:n.month,day:n.day,hour:n.hour,minute:n.minute,dateOnly:n.dateOnly,futureOnly:n.futureOnly,closeOnSelect:n.closeOnSelect})})}}};r.$inject=["$parse","DatetimePicker"],angular.module("angularjs-datetime-picker").directive("datetimePicker",r)}();
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/bootstrap-3.3.7/package.json b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/bootstrap-3.3.7/package.json new file mode 100644 index 00000000..fe4b31de --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/bootstrap-3.3.7/package.json @@ -0,0 +1,89 @@ +{ + "name": "bootstrap", + "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", + "version": "3.3.7", + "keywords": [ + "css", + "less", + "mobile-first", + "responsive", + "front-end", + "framework", + "web" + ], + "homepage": "http://getbootstrap.com", + "author": "Twitter, Inc.", + "scripts": { + "change-version": "node grunt/change-version.js", + "update-shrinkwrap": "npm shrinkwrap --dev && shx mv ./npm-shrinkwrap.json ./grunt/npm-shrinkwrap.json", + "test": "grunt test" + }, + "style": "dist/css/bootstrap.css", + "less": "less/bootstrap.less", + "main": "./dist/js/npm", + "repository": { + "type": "git", + "url": "https://github.com/twbs/bootstrap.git" + }, + "bugs": { + "url": "https://github.com/twbs/bootstrap/issues" + }, + "license": "MIT", + "devDependencies": { + "btoa": "~1.1.2", + "glob": "~7.0.3", + "grunt": "~1.0.1", + "grunt-autoprefixer": "~3.0.4", + "grunt-contrib-clean": "~1.0.0", + "grunt-contrib-compress": "~1.3.0", + "grunt-contrib-concat": "~1.0.0", + "grunt-contrib-connect": "~1.0.0", + "grunt-contrib-copy": "~1.0.0", + "grunt-contrib-csslint": "~1.0.0", + "grunt-contrib-cssmin": "~1.0.0", + "grunt-contrib-htmlmin": "~1.5.0", + "grunt-contrib-jshint": "~1.0.0", + "grunt-contrib-less": "~1.3.0", + "grunt-contrib-pug": "~1.0.0", + "grunt-contrib-qunit": "~0.7.0", + "grunt-contrib-uglify": "~1.0.0", + "grunt-contrib-watch": "~1.0.0", + "grunt-csscomb": "~3.1.0", + "grunt-exec": "~1.0.0", + "grunt-html": "~8.0.1", + "grunt-jekyll": "~0.4.4", + "grunt-jscs": "~3.0.1", + "grunt-saucelabs": "~9.0.0", + "load-grunt-tasks": "~3.5.0", + "markdown-it": "^7.0.0", + "shelljs": "^0.7.0", + "shx": "^0.1.2", + "time-grunt": "^1.3.0" + }, + "engines": { + "node": ">=0.10.1" + }, + "files": [ + "dist", + "fonts", + "grunt", + "js/*.js", + "less/**/*.less", + "Gruntfile.js", + "LICENSE" + ], + "jspm": { + "main": "js/bootstrap", + "shim": { + "js/bootstrap": { + "deps": "jquery", + "exports": "$" + } + }, + "files": [ + "css", + "fonts", + "js" + ] + } +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/jquery.min.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/jquery.min.js new file mode 100644 index 00000000..4d9b3a25 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:"jQuery"+("3.3.1"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==c.call(e))&&(!(t=i(e))||"function"==typeof(n=f.call(t,"constructor")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),"function"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function C(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",I="\\["+M+"*("+R+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+R+"))|)"+M+"*\\]",W=":("+R+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+I+")*)|.*)\\)|)",$=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),F=new RegExp("^"+M+"*,"+M+"*"),_=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),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("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="<a id='"+b+"'></a><select id='"+b+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:he(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:he(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=r.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=fe(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=pe(t);function ye(){}ye.prototype=r.filters=r.pseudos,r.setFilters=new ye,a=oe.tokenize=function(e,t){var n,i,o,a,s,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=r.preFilter;while(s){n&&!(i=F.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),n=!1,(i=_.exec(s))&&(n=i.shift(),o.push({value:n,type:i[0].replace(B," ")}),s=s.slice(n.length));for(a in r.filter)!(i=V[a].exec(s))||l[a]&&!(i=l[a](i))||(n=i.shift(),o.push({value:n,type:a,matches:i}),s=s.slice(n.length));if(!n)break}return t?s.length:s?oe.error(e):k(e,u).slice(0)};function ve(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function me(e,t,n){var r=t.dir,i=t.next,o=i||r,a=n&&"parentNode"===o,s=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||a)return e(t,n,i);return!1}:function(t,n,u){var l,c,f,p=[T,s];if(u){while(t=t[r])if((1===t.nodeType||a)&&e(t,n,u))return!0}else while(t=t[r])if(1===t.nodeType||a)if(f=t[b]||(t[b]={}),c=f[t.uniqueID]||(f[t.uniqueID]={}),i&&i===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[o])&&l[0]===T&&l[1]===s)return p[2]=l[2];if(c[o]=p,p[2]=e(t,n,u))return!0}return!1}}function xe(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r<i;r++)oe(e,t[r],n);return n}function we(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Te(e,t,n,r,i,o){return r&&!r[b]&&(r=Te(r)),i&&!i[b]&&(i=Te(i,o)),se(function(o,a,s,u){var l,c,f,p=[],d=[],h=a.length,g=o||be(t||"*",s.nodeType?[s]:s,[]),y=!e||!o&&t?g:we(g,p,e,s,u),v=n?i||(o?e:h||r)?[]:a:y;if(n&&n(y,v,s,u),r){l=we(v,d),r(l,[],s,u),c=l.length;while(c--)(f=l[c])&&(v[d[c]]=!(y[d[c]]=f))}if(o){if(i||e){if(i){l=[],c=v.length;while(c--)(f=v[c])&&l.push(y[c]=f);i(null,v=[],l,u)}c=v.length;while(c--)(f=v[c])&&(l=i?O(o,f):p[c])>-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u<o;u++)if(n=r.relative[e[u].type])p=[me(xe(p),n)];else{if((n=r.filter[e[u].type].apply(null,e[u].matches))[b]){for(i=++u;i<o;i++)if(r.relative[e[i].type])break;return Te(u>1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u<i&&Ce(e.slice(u,i)),i<o&&Ce(e=e.slice(i)),i<o&&ve(e))}p.push(n)}return xe(p)}function Ee(e,t){var n=t.length>0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t<r;t++)if(w.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)w.find(e,i[t],n);return r>1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(w.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&w(e);if(!D.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s<o.length)!1===o[s].apply(n[0],n[1])&&e.stopOnFalse&&(s=o.length,n=!1)}e.memory||(n=!1),t=!1,i&&(o=n?[]:"")},l={add:function(){return o&&(n&&!t&&(s=o.length-1,a.push(n)),function t(n){w.each(n,function(n,r){g(r)?e.unique&&l.has(r)||o.push(r):r&&r.length&&"string"!==x(r)&&t(r)})}(arguments),n&&!t&&u()),this},remove:function(){return w.each(arguments,function(e,t){var n;while((n=w.inArray(t,o,n))>-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t<o)){if((e=r.apply(s,u))===n.promise())throw new TypeError("Thenable self-resolution");l=e&&("object"==typeof e||"function"==typeof e)&&e.then,g(l)?i?l.call(e,a(o,n,I,i),a(o,n,W,i)):(o++,l.call(e,a(o,n,I,i),a(o,n,W,i),a(o,n,I,n.notifyWith))):(r!==I&&(s=void 0,u=[e]),(i||n.resolveWith)(s,u))}},c=i?l:function(){try{l()}catch(e){w.Deferred.exceptionHook&&w.Deferred.exceptionHook(e,c.stackTrace),t+1>=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},X=/^-ms-/,U=/-([a-z])/g;function V(e,t){return t.toUpperCase()}function G(e){return e.replace(X,"ms-").replace(U,V)}var Y=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Q(){this.expando=w.expando+Q.uid++}Q.uid=1,Q.prototype={cache:function(e){var t=e[this.expando];return t||(t={},Y(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[G(t)]=n;else for(r in t)i[G(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][G(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(G):(t=G(t))in r?[t]:t.match(M)||[]).length;while(n--)delete r[t[n]]}(void 0===t||w.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!w.isEmptyObject(t)}};var J=new Q,K=new Q,Z=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ee=/[A-Z]/g;function te(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Z.test(e)?JSON.parse(e):e)}function ne(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(ee,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n=te(n)}catch(e){}K.set(e,t,n)}else n=void 0;return n}w.extend({hasData:function(e){return K.hasData(e)||J.hasData(e)},data:function(e,t,n){return K.access(e,t,n)},removeData:function(e,t){K.remove(e,t)},_data:function(e,t,n){return J.access(e,t,n)},_removeData:function(e,t){J.remove(e,t)}}),w.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=K.get(o),1===o.nodeType&&!J.get(o,"hasDataAttrs"))){n=a.length;while(n--)a[n]&&0===(r=a[n].name).indexOf("data-")&&(r=G(r.slice(5)),ne(o,r,i[r]));J.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof e?this.each(function(){K.set(this,e)}):z(this,function(t){var n;if(o&&void 0===t){if(void 0!==(n=K.get(o,e)))return n;if(void 0!==(n=ne(o,e)))return n}else this.each(function(){K.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?w.queue(this[0],e):void 0===t?this:this.each(function(){var n=w.queue(this,e,t);w._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&w.dequeue(this,e)})},dequeue:function(e){return this.each(function(){w.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=w.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=J.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var re=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ie=new RegExp("^(?:([+-])=|)("+re+")([a-z%]*)$","i"),oe=["Top","Right","Bottom","Left"],ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&w.contains(e.ownerDocument,e)&&"none"===w.css(e,"display")},se=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i};function ue(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return w.css(e,t,"")},u=s(),l=n&&n[3]||(w.cssNumber[t]?"":"px"),c=(w.cssNumber[t]||"px"!==l&&+u)&&ie.exec(w.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)w.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,w.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var le={};function ce(e){var t,n=e.ownerDocument,r=e.nodeName,i=le[r];return i||(t=n.body.appendChild(n.createElement(r)),i=w.css(t,"display"),t.parentNode.removeChild(t),"none"===i&&(i="block"),le[r]=i,i)}function fe(e,t){for(var n,r,i=[],o=0,a=e.length;o<a;o++)(r=e[o]).style&&(n=r.style.display,t?("none"===n&&(i[o]=J.get(r,"display")||null,i[o]||(r.style.display="")),""===r.style.display&&ae(r)&&(i[o]=ce(r))):"none"!==n&&(i[o]="none",J.set(r,"display",n)));for(o=0;o<a;o++)null!=i[o]&&(e[o].style.display=i[o]);return e}w.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?w(this).show():w(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={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,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n<r;n++)J.set(e[n],"globalEval",!t||J.get(t[n],"globalEval"))}var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))w.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+w.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;w.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&w.inArray(o,r)>-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="<textarea>x</textarea>",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n<arguments.length;n++)u[n]=arguments[n];if(t.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,t)){s=w.event.handlers.call(this,t,l),n=0;while((o=s[n++])&&!t.isPropagationStopped()){t.currentTarget=o.elem,r=0;while((a=o.handlers[r++])&&!t.isImmediatePropagationStopped())t.rnamespace&&!t.rnamespace.test(a.namespace)||(t.handleObj=a,t.data=a.data,void 0!==(i=((w.event.special[a.origType]||{}).handle||a.handler).apply(o.elem,u))&&!1===(t.result=i)&&(t.preventDefault(),t.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,t),t.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?w(i,this).index(l)>-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(w.Event.prototype,e,{enumerable:!0,configurable:!0,get:g(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[w.expando]?e:new w.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==Se()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===Se()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&N(this,"input"))return this.click(),!1},_default:function(e){return N(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},w.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},w.Event=function(e,t){if(!(this instanceof w.Event))return new w.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ee:ke,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&w.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[w.expando]=!0},w.Event.prototype={constructor:w.Event,isDefaultPrevented:ke,isPropagationStopped:ke,isImmediatePropagationStopped:ke,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ee,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ee,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ee,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},w.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&we.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Te.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},w.event.addProp),w.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){w.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||w.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),w.fn.extend({on:function(e,t,n,r){return De(this,e,t,n,r)},one:function(e,t,n,r){return De(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,w(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=ke),this.each(function(){w.event.remove(this,e,n,t)})}});var Ne=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/<script|<style|<link/i,je=/checked\s*(?:[^=]|=\s*.checked.)/i,qe=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n<r;n++)w.event.add(t,i,l[i][n])}K.hasData(e)&&(s=K.access(e),u=w.extend({},s),K.set(t,u))}}function Me(e,t){var n=t.nodeName.toLowerCase();"input"===n&&pe.test(e.type)?t.checked=e.checked:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}function Re(e,t,n,r){t=a.apply([],t);var i,o,s,u,l,c,f=0,p=e.length,d=p-1,y=t[0],v=g(y);if(v||p>1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f<p;f++)l=i,f!==d&&(l=w.clone(l,!0,!0),u&&w.merge(s,ye(l,"script"))),n.call(e[f],l,f);if(u)for(c=s[s.length-1].ownerDocument,w.map(s,Oe),f=0;f<u;f++)l=s[f],he.test(l.type||"")&&!J.access(l,"globalEval")&&w.contains(c,l)&&(l.src&&"module"!==(l.type||"").toLowerCase()?w._evalUrl&&w._evalUrl(l.src):m(l.textContent.replace(qe,""),c,l))}return e}function Ie(e,t,n){for(var r,i=t?w.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||w.cleanData(ye(r)),r.parentNode&&(n&&w.contains(r.ownerDocument,r)&&ve(ye(r,"script")),r.parentNode.removeChild(r));return e}w.extend({htmlPrefilter:function(e){return e.replace(Ne,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r<i;r++)Me(o[r],a[r]);if(t)if(n)for(o=o||ye(e),a=a||ye(s),r=0,i=o.length;r<i;r++)Pe(o[r],a[r]);else Pe(e,s);return(a=ye(s,"script")).length>0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(w.cleanData(ye(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return Re(this,arguments,function(t){var n=this.parentNode;w.inArray(this,e)<0&&(w.cleanData(ye(this)),n&&n.replaceChild(t,this))},e)}}),w.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){w.fn[e]=function(e){for(var n,r=[],i=w(e),o=i.length-1,a=0;a<=o;a++)n=a===o?this:this.clone(!0),w(i[a])[t](n),s.apply(r,n.get());return this.pushStack(r)}});var We=new RegExp("^("+re+")(?!px)[a-z%]+$","i"),$e=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},Be=new RegExp(oe.join("|"),"i");!function(){function t(){if(c){l.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",c.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",be.appendChild(l).appendChild(c);var t=e.getComputedStyle(c);i="1%"!==t.top,u=12===n(t.marginLeft),c.style.right="60%",s=36===n(t.right),o=36===n(t.width),c.style.position="absolute",a=36===c.offsetWidth||"absolute",be.removeChild(l),c=null}}function n(e){return Math.round(parseFloat(e))}var i,o,a,s,u,l=r.createElement("div"),c=r.createElement("div");c.style&&(c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",h.clearCloneStyle="content-box"===c.style.backgroundClip,w.extend(h,{boxSizingReliable:function(){return t(),o},pixelBoxStyles:function(){return t(),s},pixelPosition:function(){return t(),i},reliableMarginLeft:function(){return t(),u},scrollboxSize:function(){return t(),a}}))}();function Fe(e,t,n){var r,i,o,a,s=e.style;return(n=n||$e(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||w.contains(e.ownerDocument,e)||(a=w.style(e,t)),!h.pixelBoxStyles()&&We.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function _e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}var ze=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ue={position:"absolute",visibility:"hidden",display:"block"},Ve={letterSpacing:"0",fontWeight:"400"},Ge=["Webkit","Moz","ms"],Ye=r.createElement("div").style;function Qe(e){if(e in Ye)return e;var t=e[0].toUpperCase()+e.slice(1),n=Ge.length;while(n--)if((e=Ge[n]+t)in Ye)return e}function Je(e){var t=w.cssProps[e];return t||(t=w.cssProps[e]=Qe(e)||e),t}function Ke(e,t,n){var r=ie.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ze(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=w.css(e,n+oe[a],!0,i)),r?("content"===n&&(u-=w.css(e,"padding"+oe[a],!0,i)),"margin"!==n&&(u-=w.css(e,"border"+oe[a]+"Width",!0,i))):(u+=w.css(e,"padding"+oe[a],!0,i),"padding"!==n?u+=w.css(e,"border"+oe[a]+"Width",!0,i):s+=w.css(e,"border"+oe[a]+"Width",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},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:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a<i;a++)o[t[a]]=w.css(e,t[a],!1,r);return o}return void 0!==n?w.style(e,t,n):w.css(e,t)},e,t,arguments.length>1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ct(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),y=J.get(e,"fxshow");n.queue||(null==(a=w._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,w.queue(e,"fx").length||a.empty.fire()})}));for(r in t)if(i=t[r],it.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!y||void 0===y[r])continue;g=!0}d[r]=y&&y[r]||w.style(e,r)}if((u=!w.isEmptyObject(t))||!w.isEmptyObject(d)){f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=y&&y.display)&&(l=J.get(e,"display")),"none"===(c=w.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=w.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===w.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1;for(r in d)u||(y?"hidden"in y&&(g=y.hidden):y=J.access(e,"fxshow",{display:l}),o&&(y.hidden=!g),g&&fe([e],!0),p.done(function(){g||fe([e]),J.remove(e,"fxshow");for(r in d)w.style(e,r,d[r])})),u=lt(g?y[r]:0,r,p),r in y||(y[r]=u.start,g&&(u.end=u.start,u.start=0))}}function ft(e,t){var n,r,i,o,a;for(n in e)if(r=G(n),i=t[r],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=w.cssHooks[r])&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function pt(e,t,n){var r,i,o=0,a=pt.prefilters.length,s=w.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=nt||st(),n=Math.max(0,l.startTime+l.duration-t),r=1-(n/l.duration||0),o=0,a=l.tweens.length;o<a;o++)l.tweens[o].run(r);return s.notifyWith(e,[l,r,n]),r<1&&a?n:(a||s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:w.extend({},t),opts:w.extend(!0,{specialEasing:{},easing:w.easing._default},n),originalProperties:t,originalOptions:n,startTime:nt||st(),duration:n.duration,tweens:[],createTween:function(t,n){var r=w.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(ft(c,l.opts.specialEasing);o<a;o++)if(r=pt.prefilters[o].call(l,e,c,l.opts))return g(r.stop)&&(w._queueHooks(l.elem,l.opts.queue).stop=r.stop.bind(r)),r;return w.map(c,lt,l),g(l.opts.start)&&l.opts.start.call(e,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),w.fx.timer(w.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l}w.Animation=w.extend(pt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return ue(n.elem,e,ie.exec(t),n),n}]},tweener:function(e,t){g(e)?(t=e,e=["*"]):e=e.match(M);for(var n,r=0,i=e.length;r<i;r++)n=e[r],pt.tweeners[n]=pt.tweeners[n]||[],pt.tweeners[n].unshift(t)},prefilters:[ct],prefilter:function(e,t){t?pt.prefilters.unshift(e):pt.prefilters.push(e)}}),w.speed=function(e,t,n){var r=e&&"object"==typeof e?w.extend({},e):{complete:n||!n&&t||g(e)&&e,duration:e,easing:n&&t||t&&!g(t)&&t};return w.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in w.fx.speeds?r.duration=w.fx.speeds[r.duration]:r.duration=w.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){g(r.old)&&r.old.call(this),r.queue&&w.dequeue(this,r.queue)},r},w.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=w.isEmptyObject(e),o=w.speed(t,n,r),a=function(){var t=pt(this,w.extend({},e),o);(i||J.get(this,"finish"))&&t.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&!1!==e&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=w.timers,a=J.get(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&ot.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||w.dequeue(this,e)})},finish:function(e){return!1!==e&&(e=e||"fx"),this.each(function(){var t,n=J.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=w.timers,a=r?r.length:0;for(n.finish=!0,w.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),w.each(["toggle","show","hide"],function(e,t){var n=w.fn[t];w.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ut(t,!0),e,r,i)}}),w.each({slideDown:ut("show"),slideUp:ut("hide"),slideToggle:ut("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){w.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),w.timers=[],w.fx.tick=function(){var e,t=0,n=w.timers;for(nt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||w.fx.stop(),nt=void 0},w.fx.timer=function(e){w.timers.push(e),w.fx.start()},w.fx.interval=13,w.fx.start=function(){rt||(rt=!0,at())},w.fx.stop=function(){rt=null},w.fx.speeds={slow:600,fast:200,_default:400},w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement("input"),t=r.createElement("select").appendChild(r.createElement("option"));e.type="checkbox",h.checkOn=""!==e.value,h.optSelected=t.selected,(e=r.createElement("input")).value="t",e.type="radio",h.radioValue="t"===e.value}();var dt,ht=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return z(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!N(n.parentNode,"optgroup"))){if(t=w(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=w.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=w.inArray(w.valHooks.option.get(r),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,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":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("<script>").prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&o("error"===e.type?404:200,e.type)}),r.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Yt=[],Qt=/(=)\?(?=&|$)|\?\?/;w.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Yt.pop()||w.expando+"_"+Et++;return this[e]=!0,e}}),w.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=!1!==t.jsonp&&(Qt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Qt.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=g(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Qt,"$1"+i):!1!==t.jsonp&&(t.url+=(kt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||w.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?w(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,Yt.push(i)),a&&g(o)&&o(a[0]),a=o=void 0}),"script"}),h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument("").body;return e.innerHTML="<form></form><form></form>",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if("string"!=typeof e)return[];"boolean"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(i)):t=r),o=A.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=xe([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=vt(e.slice(s)),e=e.slice(0,s)),g(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&w.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?w("<div>").append(w.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},w.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){w.fn[t]=function(e){return this.on(t,e)}}),w.expr.pseudos.animated=function(e){return w.grep(w.timers,function(t){return e===t.elem}).length},w.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=w.css(e,"position"),f=w(e),p={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=w.css(e,"top"),u=w.css(e,"left"),(l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),g(t)&&(t=t.call(e,n,w.extend({},s))),null!=t.top&&(p.top=t.top-s.top+a),null!=t.left&&(p.left=t.left-s.left+i),"using"in t?t.using.call(e,p):f.css(p)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===w.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===w.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,"borderTopWidth",!0),i.left+=w.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-w.css(r,"marginTop",!0),left:t.left-i.left-w.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===w.css(e,"position"))e=e.offsetParent;return e||be})}}),w.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;w.fn[e]=function(r){return z(this,function(e,r,i){var o;if(y(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each(["top","left"],function(e,t){w.cssHooks[t]=_e(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),We.test(n)?w(e).position()[t]+"px":n})}),w.each({Height:"height",Width:"width"},function(e,t){w.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),s=n||(!0===i||!0===o?"margin":"border");return z(this,function(t,n,i){var o;return y(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),w.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w}); diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-csv/build/ng-csv.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-csv/build/ng-csv.js new file mode 100644 index 00000000..80432ecf --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-csv/build/ng-csv.js @@ -0,0 +1,319 @@ +(function(window, document) { + +// Create all modules and define dependencies to make sure they exist +// and are loaded in the correct order to satisfy dependency injection +// before all nested files are concatenated by Grunt + +// Config +angular.module('ngCsv.config', []). + value('ngCsv.config', { + debug: true + }). + config(['$compileProvider', function($compileProvider){ + if (angular.isDefined($compileProvider.urlSanitizationWhitelist)) { + $compileProvider.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/); + } else { + $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/); + } + }]); + +// Modules +angular.module('ngCsv.directives', ['ngCsv.services']); +angular.module('ngCsv.services', []); +angular.module('ngCsv', + [ + 'ngCsv.config', + 'ngCsv.services', + 'ngCsv.directives', + 'ngSanitize' + ]); + +// Common.js package manager support (e.g. ComponentJS, WebPack) +if (typeof module !== 'undefined' && typeof exports !== 'undefined' && module.exports === exports) { + module.exports = 'ngCsv'; +} +/** + * Created by asafdav on 15/05/14. + */ +angular.module('ngCsv.services'). + service('CSV', ['$q', function ($q) { + + var EOL = '\r\n'; + var BOM = "\ufeff"; + + var specialChars = { + '\\t': '\t', + '\\b': '\b', + '\\v': '\v', + '\\f': '\f', + '\\r': '\r' + }; + + /** + * Stringify one field + * @param data + * @param options + * @returns {*} + */ + this.stringifyField = function (data, options) { + if (options.decimalSep === 'locale' && this.isFloat(data)) { + return data.toLocaleString(); + } + + if (options.decimalSep !== '.' && this.isFloat(data)) { + return data.toString().replace('.', options.decimalSep); + } + + if (typeof data === 'string') { + data = data.replace(/"/g, '""'); // Escape double qoutes + + if (options.quoteStrings || data.indexOf(',') > -1 || data.indexOf('\n') > -1 || data.indexOf('\r') > -1) { + data = options.txtDelim + data + options.txtDelim; + } + + return data; + } + + if (typeof data === 'boolean') { + return data ? 'TRUE' : 'FALSE'; + } + + return data; + }; + + /** + * Helper function to check if input is float + * @param input + * @returns {boolean} + */ + this.isFloat = function (input) { + return +input === input && (!isFinite(input) || Boolean(input % 1)); + }; + + /** + * Creates a csv from a data array + * @param data + * @param options + * * header - Provide the first row (optional) + * * fieldSep - Field separator, default: ',', + * * addByteOrderMarker - Add Byte order mark, default(false) + * @param callback + */ + this.stringify = function (data, options) { + var def = $q.defer(); + + var that = this; + var csv = ""; + var csvContent = ""; + + var dataPromise = $q.when(data).then(function (responseData) { + //responseData = angular.copy(responseData);//moved to row creation + // Check if there's a provided header array + if (angular.isDefined(options.header) && options.header) { + var encodingArray, headerString; + + encodingArray = []; + angular.forEach(options.header, function (title, key) { + this.push(that.stringifyField(title, options)); + }, encodingArray); + + headerString = encodingArray.join(options.fieldSep ? options.fieldSep : ","); + csvContent += headerString + EOL; + } + + var arrData = []; + + if (angular.isArray(responseData)) { + arrData = responseData; + } + else if (angular.isFunction(responseData)) { + arrData = responseData(); + } + + // Check if using keys as labels + if (angular.isDefined(options.label) && options.label && typeof options.label === 'boolean') { + var labelArray, labelString; + + labelArray = []; + angular.forEach(arrData[0], function(value, label) { + this.push(that.stringifyField(label, options)); + }, labelArray); + labelString = labelArray.join(options.fieldSep ? options.fieldSep : ","); + csvContent += labelString + EOL; + } + + angular.forEach(arrData, function (oldRow, index) { + var row = angular.copy(arrData[index]); + var dataString, infoArray; + + infoArray = []; + + var iterator = !!options.columnOrder ? options.columnOrder : row; + angular.forEach(iterator, function (field, key) { + var val = !!options.columnOrder ? row[field] : field; + this.push(that.stringifyField(val, options)); + }, infoArray); + + dataString = infoArray.join(options.fieldSep ? options.fieldSep : ","); + csvContent += index < arrData.length ? dataString + EOL : dataString; + }); + + // Add BOM if needed + if (options.addByteOrderMarker) { + csv += BOM; + } + + // Append the content and resolve. + csv += csvContent; + def.resolve(csv); + }); + + if (typeof dataPromise['catch'] === 'function') { + dataPromise['catch'](function (err) { + def.reject(err); + }); + } + + return def.promise; + }; + + /** + * Helper function to check if input is really a special character + * @param input + * @returns {boolean} + */ + this.isSpecialChar = function(input){ + return specialChars[input] !== undefined; + }; + + /** + * Helper function to get what the special character was supposed to be + * since Angular escapes the first backslash + * @param input + * @returns {special character string} + */ + this.getSpecialChar = function (input) { + return specialChars[input]; + }; + + + }]); +/** + * ng-csv module + * Export Javascript's arrays to csv files from the browser + * + * Author: asafdav - https://github.com/asafdav + */ +angular.module('ngCsv.directives'). + directive('ngCsv', ['$parse', '$q', 'CSV', '$document', '$timeout', function ($parse, $q, CSV, $document, $timeout) { + return { + restrict: 'AC', + scope: { + data: '&ngCsv', + filename: '@filename', + header: '&csvHeader', + columnOrder: '&csvColumnOrder', + txtDelim: '@textDelimiter', + decimalSep: '@decimalSeparator', + quoteStrings: '@quoteStrings', + fieldSep: '@fieldSeparator', + lazyLoad: '@lazyLoad', + addByteOrderMarker: "@addBom", + ngClick: '&', + charset: '@charset', + label: '&csvLabel' + }, + controller: [ + '$scope', + '$element', + '$attrs', + '$transclude', + function ($scope, $element, $attrs, $transclude) { + $scope.csv = ''; + + if (!angular.isDefined($scope.lazyLoad) || $scope.lazyLoad != "true") { + if (angular.isArray($scope.data)) { + $scope.$watch("data", function (newValue) { + $scope.buildCSV(); + }, true); + } + } + + $scope.getFilename = function () { + return $scope.filename || 'download.csv'; + }; + + function getBuildCsvOptions() { + var options = { + txtDelim: $scope.txtDelim ? $scope.txtDelim : '"', + decimalSep: $scope.decimalSep ? $scope.decimalSep : '.', + quoteStrings: $scope.quoteStrings, + addByteOrderMarker: $scope.addByteOrderMarker + }; + if (angular.isDefined($attrs.csvHeader)) options.header = $scope.$eval($scope.header); + if (angular.isDefined($attrs.csvColumnOrder)) options.columnOrder = $scope.$eval($scope.columnOrder); + if (angular.isDefined($attrs.csvLabel)) options.label = $scope.$eval($scope.label); + + options.fieldSep = $scope.fieldSep ? $scope.fieldSep : ","; + + // Replaces any badly formatted special character string with correct special character + options.fieldSep = CSV.isSpecialChar(options.fieldSep) ? CSV.getSpecialChar(options.fieldSep) : options.fieldSep; + + return options; + } + + /** + * Creates the CSV and updates the scope + * @returns {*} + */ + $scope.buildCSV = function () { + var deferred = $q.defer(); + + $element.addClass($attrs.ngCsvLoadingClass || 'ng-csv-loading'); + + CSV.stringify($scope.data(), getBuildCsvOptions()).then(function (csv) { + $scope.csv = csv; + $element.removeClass($attrs.ngCsvLoadingClass || 'ng-csv-loading'); + deferred.resolve(csv); + }); + $scope.$apply(); // Old angular support + + return deferred.promise; + }; + } + ], + link: function (scope, element, attrs) { + function doClick() { + var charset = scope.charset || "utf-8"; + var blob = new Blob([scope.csv], { + type: "text/csv;charset="+ charset + ";" + }); + + if (window.navigator.msSaveOrOpenBlob) { + navigator.msSaveBlob(blob, scope.getFilename()); + } else { + + var downloadContainer = angular.element('<div data-tap-disabled="true"><a></a></div>'); + var downloadLink = angular.element(downloadContainer.children()[0]); + downloadLink.attr('href', window.URL.createObjectURL(blob)); + downloadLink.attr('download', scope.getFilename()); + downloadLink.attr('target', '_blank'); + + $document.find('body').append(downloadContainer); + $timeout(function () { + downloadLink[0].click(); + downloadLink.remove(); + }, null); + } + } + + element.bind('click', function (e) { + scope.buildCSV().then(function (csv) { + doClick(); + }); + scope.$apply(); + }); + } + }; + }]); +})(window, document);
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-csv/build/ng-csv.min.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-csv/build/ng-csv.min.js new file mode 100644 index 00000000..94dcd7f5 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-csv/build/ng-csv.min.js @@ -0,0 +1,2 @@ +/*! ng-csv 10-10-2015 */ +!function(a){angular.module("ngCsv.config",[]).value("ngCsv.config",{debug:!0}).config(["$compileProvider",function(a){angular.isDefined(a.urlSanitizationWhitelist)?a.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/):a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/)}]),angular.module("ngCsv.directives",["ngCsv.services"]),angular.module("ngCsv.services",[]),angular.module("ngCsv",["ngCsv.config","ngCsv.services","ngCsv.directives","ngSanitize"]),"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ngCsv"),angular.module("ngCsv.services").service("CSV",["$q",function(a){var b="\r\n",c="",d={"\\t":" ","\\b":"\b","\\v":"","\\f":"\f","\\r":"\r"};this.stringifyField=function(a,b){return"locale"===b.decimalSep&&this.isFloat(a)?a.toLocaleString():"."!==b.decimalSep&&this.isFloat(a)?a.toString().replace(".",b.decimalSep):"string"==typeof a?(a=a.replace(/"/g,'""'),(b.quoteStrings||a.indexOf(",")>-1||a.indexOf("\n")>-1||a.indexOf("\r")>-1)&&(a=b.txtDelim+a+b.txtDelim),a):"boolean"==typeof a?a?"TRUE":"FALSE":a},this.isFloat=function(a){return+a===a&&(!isFinite(a)||Boolean(a%1))},this.stringify=function(d,e){var f=a.defer(),g=this,h="",i="",j=a.when(d).then(function(a){if(angular.isDefined(e.header)&&e.header){var d,j;d=[],angular.forEach(e.header,function(a){this.push(g.stringifyField(a,e))},d),j=d.join(e.fieldSep?e.fieldSep:","),i+=j+b}var k=[];if(angular.isArray(a)?k=a:angular.isFunction(a)&&(k=a()),angular.isDefined(e.label)&&e.label&&"boolean"==typeof e.label){var l,m;l=[],angular.forEach(k[0],function(a,b){this.push(g.stringifyField(b,e))},l),m=l.join(e.fieldSep?e.fieldSep:","),i+=m+b}angular.forEach(k,function(a,c){var d,f,h=angular.copy(k[c]);f=[];var j=e.columnOrder?e.columnOrder:h;angular.forEach(j,function(a){var b=e.columnOrder?h[a]:a;this.push(g.stringifyField(b,e))},f),d=f.join(e.fieldSep?e.fieldSep:","),i+=c<k.length?d+b:d}),e.addByteOrderMarker&&(h+=c),h+=i,f.resolve(h)});return"function"==typeof j["catch"]&&j["catch"](function(a){f.reject(a)}),f.promise},this.isSpecialChar=function(a){return void 0!==d[a]},this.getSpecialChar=function(a){return d[a]}}]),angular.module("ngCsv.directives").directive("ngCsv",["$parse","$q","CSV","$document","$timeout",function(b,c,d,e,f){return{restrict:"AC",scope:{data:"&ngCsv",filename:"@filename",header:"&csvHeader",columnOrder:"&csvColumnOrder",txtDelim:"@textDelimiter",decimalSep:"@decimalSeparator",quoteStrings:"@quoteStrings",fieldSep:"@fieldSeparator",lazyLoad:"@lazyLoad",addByteOrderMarker:"@addBom",ngClick:"&",charset:"@charset",label:"&csvLabel"},controller:["$scope","$element","$attrs","$transclude",function(a,b,e){function f(){var b={txtDelim:a.txtDelim?a.txtDelim:'"',decimalSep:a.decimalSep?a.decimalSep:".",quoteStrings:a.quoteStrings,addByteOrderMarker:a.addByteOrderMarker};return angular.isDefined(e.csvHeader)&&(b.header=a.$eval(a.header)),angular.isDefined(e.csvColumnOrder)&&(b.columnOrder=a.$eval(a.columnOrder)),angular.isDefined(e.csvLabel)&&(b.label=a.$eval(a.label)),b.fieldSep=a.fieldSep?a.fieldSep:",",b.fieldSep=d.isSpecialChar(b.fieldSep)?d.getSpecialChar(b.fieldSep):b.fieldSep,b}a.csv="",angular.isDefined(a.lazyLoad)&&"true"==a.lazyLoad||angular.isArray(a.data)&&a.$watch("data",function(){a.buildCSV()},!0),a.getFilename=function(){return a.filename||"download.csv"},a.buildCSV=function(){var g=c.defer();return b.addClass(e.ngCsvLoadingClass||"ng-csv-loading"),d.stringify(a.data(),f()).then(function(c){a.csv=c,b.removeClass(e.ngCsvLoadingClass||"ng-csv-loading"),g.resolve(c)}),a.$apply(),g.promise}}],link:function(b,c){function d(){var c=b.charset||"utf-8",d=new Blob([b.csv],{type:"text/csv;charset="+c+";"});if(a.navigator.msSaveOrOpenBlob)navigator.msSaveBlob(d,b.getFilename());else{var g=angular.element('<div data-tap-disabled="true"><a></a></div>'),h=angular.element(g.children()[0]);h.attr("href",a.URL.createObjectURL(d)),h.attr("download",b.getFilename()),h.attr("target","_blank"),e.find("body").append(g),f(function(){h[0].click(),h.remove()},null)}}c.bind("click",function(){b.buildCSV().then(function(){d()}),b.$apply()})}}}])}(window,document);
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-ip-address/ngIpAddress.min.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-ip-address/ngIpAddress.min.js new file mode 100644 index 00000000..fa1a0208 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-ip-address/ngIpAddress.min.js @@ -0,0 +1 @@ +!function(){"use strict";angular.module("ng-ip-address",[]).directive("ngIpAddress",function(){return{restrict:"A",require:"?ngModel",scope:{config:"=?ngIpConfig"},link:function(e,i,n,r){function t(e){return!isNaN(parseFloat(e))&&isFinite(e)}if(r){var l=!1,c=!1,s=new RegExp("^0","g"),a=new RegExp("^\\.","g"),o=new RegExp("\\.\\.+","g"),h=new RegExp(":","g"),u=new RegExp("^:","g"),p=0,w=!1;e.$watchCollection("config",function(e){e?(c="boolean"==typeof e.requirePort&&e.requirePort,l=c||"boolean"==typeof e.allowPort&&e.allowPort):(l=!1,c=!1),l||!r.$viewValue?r.$parsers[0](r.$viewValue):r.$setViewValue(r.$viewValue.replace(h,""))}),i.bind("keydown",function(e){17!==e.which&&91!==e.which||(w=!0)}),i.bind("keyup",function(e){17!==e.which&&91!==e.which||(w=!1)}),i.bind("keypress",function(e){(e.which<46&&0!==e.which&&8!==e.which&&13!==e.which||47===e.which||58===e.which&&!l||e.which>58&&(!w||99!==e.which&&118!==e.which&&120!==e.which))&&e.preventDefault()}),r.$parsers.push(function(e){if(!e)return r.$setValidity("ipAddress",!0),e;p=i[0].selectionStart;var n=!0,w=null,g=(e=(e=e.replace(a,"")).replace(o,".")).split("."),f=g.length;f<4?n=!1:f>4&&(g.length=4,f=4);for(var d=0;d<f;d++){var $=g[d];if(l)if(d<3)$=$.replace(h,"");else if(-1!==($=$.replace(u,"")).indexOf(":")){var v=$.split(":");$=v[0],(!(w=v[1].replace(s,"").substring(0,5))||!t($)||w>65535)&&(n=!1)}else c&&(n=!1);$.length>1?(!t($=$.replace(s,"").substring(0,3))||$>255)&&(n=!1):$||(n=!1),g[d]=$}return e=g.join("."),null!==w&&(e+=":"+w),r.$setValidity("ipAddress",n),r.$setViewValue(e),r.$render(),i[0].setSelectionRange(p,p),e})}}}})}();
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-ip-address/ngIpAddress.vanilla.min.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-ip-address/ngIpAddress.vanilla.min.js new file mode 100644 index 00000000..5c1f0dd2 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-ip-address/ngIpAddress.vanilla.min.js @@ -0,0 +1 @@ +!function(){"use strict";angular.module("ng-ip-address",[]).directive("ngIpAddress",function(){return{restrict:"A",require:"?ngModel",link:function(e,i,n,r){function t(e){return!isNaN(parseFloat(e))&&isFinite(e)}if(r){var h=new RegExp("^0","g"),c=new RegExp("^\\.","g"),s=new RegExp("\\.\\.+","g"),u=0,a=!1;i.bind("keydown",function(e){17!==e.which&&91!==e.which||(a=!0)}),i.bind("keyup",function(e){17!==e.which&&91!==e.which||(a=!1)}),i.bind("keypress",function(e){(e.which<46&&0!==e.which&&8!==e.which&&13!==e.which||47===e.which||e.which>57&&(!a||99!==e.which&&118!==e.which&&120!==e.which))&&e.preventDefault()}),r.$parsers.push(function(e){if(!e)return r.$setValidity("ipAddress",!0),e;u=i[0].selectionStart;var n=!0,a=(e=(e=e.replace(c,"")).replace(s,".")).split("."),d=a.length;d<4?n=!1:d>4&&(a.length=4,d=4);for(var l=0;l<d;l++){var w=a[l];w.length>1?(!t(w=w.replace(h,"").substring(0,3))||w>255)&&(n=!1):w||(n=!1),a[l]=w}return e=a.join("."),r.$setValidity("ipAddress",n),r.$setViewValue(e),r.$render(),i[0].setSelectionRange(u,u),e})}}}})}();
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-ip-address/package.json b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-ip-address/package.json new file mode 100644 index 00000000..87f59cb5 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/ng-ip-address/package.json @@ -0,0 +1,67 @@ +{ + "_from": "ng-ip-address", + "_id": "ng-ip-address@1.1.12", + "_inBundle": false, + "_integrity": "sha1-reynz2xY/ZSD8FLv30DF+2UMYrg=", + "_location": "/ng-ip-address", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "ng-ip-address", + "name": "ng-ip-address", + "escapedName": "ng-ip-address", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/ng-ip-address/-/ng-ip-address-1.1.12.tgz", + "_shasum": "adeca7cf6c58fd9483f052efdf40c5fb650c62b8", + "_spec": "ng-ip-address", + "_where": "D:\\routing", + "author": { + "name": "Scott Gullen" + }, + "bugs": { + "url": "https://github.com/CautemocSg/ng-ip-address/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "AngularJS directive that will validate an IP address and impose relevant character and structure limits", + "devDependencies": { + "gulp": "^3.9.1", + "gulp-rename": "^1.2.2", + "gulp-uglify": "^3.0.0", + "jasmine-core": "^2.6.4", + "karma": "^1.7.0", + "karma-jasmine": "^1.1.0", + "karma-phantomjs-launcher": "^1.0.4", + "phantomjs-prebuilt": "^2.1.14" + }, + "homepage": "https://github.com/CautemocSg/ng-ip-address#readme", + "keywords": [ + "angular", + "angularjs", + "directive", + "ip address", + "form", + "input", + "validation" + ], + "license": "MIT", + "main": "index.js", + "name": "ng-ip-address", + "repository": { + "type": "git", + "url": "git+https://github.com/CautemocSg/ng-ip-address.git" + }, + "scripts": { + "build": "gulp default", + "test": "gulp test" + }, + "version": "1.1.12" +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/tether.min.js b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/tether.min.js new file mode 100644 index 00000000..bd608c07 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/node_modules/tether.min.js @@ -0,0 +1 @@ +!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=t.getBoundingClientRect(),o={};for(var i in e)o[i]=e[i];if(t.ownerDocument!==document){var r=t.ownerDocument.defaultView.frameElement;if(r){var s=n(r);o.top+=s.top,o.bottom+=s.top,o.left+=s.left,o.right+=s.left}}return o}function r(t){var e=getComputedStyle(t)||{},o=e.position,i=[];if("fixed"===o)return[t];for(var n=t;(n=n.parentNode)&&n&&1===n.nodeType;){var r=void 0;try{r=getComputedStyle(n)}catch(s){}if("undefined"==typeof r||null===r)return i.push(n),i;var a=r,f=a.overflow,l=a.overflowX,h=a.overflowY;/(auto|scroll|overlay)/.test(f+h+l)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&i.push(n)}return i.push(t.ownerDocument.body),t.ownerDocument!==document&&i.push(t.ownerDocument.defaultView),i}function s(){A&&document.body.removeChild(A),A=null}function a(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i=n(t),r=P();return i.top-=r.top,i.left-=r.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function f(t){return t.offsetParent||document.documentElement}function l(){if(M)return M;var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");h(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return M={width:n,height:n}}function h(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function d(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=c(t).replace(o," ");g(t,i)}}function p(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{d(t,e);var o=c(t)+(" "+e);g(t,o)}}function u(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=c(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function c(t){return t.className instanceof t.ownerDocument.defaultView.SVGAnimatedString?t.className.baseVal:t.className}function g(t,e){t.setAttribute("class",e)}function m(t,e,o){o.forEach(function(o){e.indexOf(o)===-1&&u(t,o)&&d(t,o)}),e.forEach(function(e){u(t,e)||p(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function y(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function b(){return"object"==typeof performance&&"function"==typeof performance.now?performance.now():+new Date}function w(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;i<e;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function C(t,e){return"string"==typeof t.left&&t.left.indexOf("%")!==-1&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&t.top.indexOf("%")!==-1&&(t.top=parseFloat(t.top,10)/100*e.height),t}function O(t,e){return"scrollParent"===e?e=t.scrollParents[0]:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=e,o=a(e),i=o,n=getComputedStyle(e);if(e=[i.left,i.top,o.width+i.left,o.height+i.top],t.ownerDocument!==document){var r=t.ownerDocument.defaultView;e[0]+=r.pageXOffset,e[1]+=r.pageYOffset,e[2]+=r.pageXOffset,e[3]+=r.pageYOffset}G.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(n["border"+t+"Width"]):e[o]-=parseFloat(n["border"+t+"Width"])})}(),e}var E=function(){function t(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,o,i){return o&&t(e.prototype,o),i&&t(e,i),e}}(),x=void 0;"undefined"==typeof x&&(x={modules:[]});var A=null,T=function(){var t=0;return function(){return++t}}(),S={},P=function(){var t=A;t&&document.body.contains(t)||(t=document.createElement("div"),t.setAttribute("data-tether-id",T()),h(t.style,{top:0,left:0,position:"absolute"}),document.body.appendChild(t),A=t);var e=t.getAttribute("data-tether-id");return"undefined"==typeof S[e]&&(S[e]=n(t),k(function(){delete S[e]})),S[e]},M=null,W=[],k=function(t){W.push(t)},_=function(){for(var t=void 0;t=W.pop();)t()},B=function(){function t(){i(this,t)}return E(t,[{key:"on",value:function(t,e,o){var i=!(arguments.length<=3||void 0===arguments[3])&&arguments[3];"undefined"==typeof this.bindings&&(this.bindings={}),"undefined"==typeof this.bindings[t]&&(this.bindings[t]=[]),this.bindings[t].push({handler:e,ctx:o,once:i})}},{key:"once",value:function(t,e,o){this.on(t,e,o,!0)}},{key:"off",value:function(t,e){if("undefined"!=typeof this.bindings&&"undefined"!=typeof this.bindings[t])if("undefined"==typeof e)delete this.bindings[t];else for(var o=0;o<this.bindings[t].length;)this.bindings[t][o].handler===e?this.bindings[t].splice(o,1):++o}},{key:"trigger",value:function(t){if("undefined"!=typeof this.bindings&&this.bindings[t]){for(var e=0,o=arguments.length,i=Array(o>1?o-1:0),n=1;n<o;n++)i[n-1]=arguments[n];for(;e<this.bindings[t].length;){var r=this.bindings[t][e],s=r.handler,a=r.ctx,f=r.once,l=a;"undefined"==typeof l&&(l=this),s.apply(l,i),f?this.bindings[t].splice(e,1):++e}}}}]),t}();x.Utils={getActualBoundingClientRect:n,getScrollParents:r,getBounds:a,getOffsetParent:f,extend:h,addClass:p,removeClass:d,hasClass:u,updateClasses:m,defer:k,flush:_,uniqueId:T,Evented:B,getScrollBarSize:l,removeUtilElements:s};var j=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),E=function(){function t(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,o,i){return o&&t(e.prototype,o),i&&t(e,i),e}}(),z=function(t,e,o){for(var i=!0;i;){var n=t,r=e,s=o;i=!1,null===n&&(n=Function.prototype);var a=Object.getOwnPropertyDescriptor(n,r);if(void 0!==a){if("value"in a)return a.value;var f=a.get;if(void 0===f)return;return f.call(s)}var l=Object.getPrototypeOf(n);if(null===l)return;t=l,e=r,o=s,i=!0,a=l=void 0}};if("undefined"==typeof x)throw new Error("You must include the utils.js file before tether.js");var Y=x.Utils,r=Y.getScrollParents,a=Y.getBounds,f=Y.getOffsetParent,h=Y.extend,p=Y.addClass,d=Y.removeClass,m=Y.updateClasses,k=Y.defer,_=Y.flush,l=Y.getScrollBarSize,s=Y.removeUtilElements,L=function(){if("undefined"==typeof document)return"";for(var t=document.createElement("div"),e=["transform","WebkitTransform","OTransform","MozTransform","msTransform"],o=0;o<e.length;++o){var i=e[o];if(void 0!==t.style[i])return i}}(),D=[],X=function(){D.forEach(function(t){t.position(!1)}),_()};!function(){var t=null,e=null,o=null,i=function n(){return"undefined"!=typeof e&&e>16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&b()-t<10||(null!=o&&(clearTimeout(o),o=null),t=b(),X(),e=b()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var F={center:"center",left:"right",right:"left"},H={middle:"middle",top:"bottom",bottom:"top"},N={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},U=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=F[e.left]),"auto"===i&&(i=H[e.top]),{left:o,top:i}},V=function(t){var e=t.left,o=t.top;return"undefined"!=typeof N[t.left]&&(e=N[t.left]),"undefined"!=typeof N[t.top]&&(o=N[t.top]),{left:e,top:o}},R=function(t){var e=t.split(" "),o=j(e,2),i=o[0],n=o[1];return{top:i,left:n}},q=R,I=function(t){function e(t){var o=this;i(this,e),z(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.position=this.position.bind(this),D.push(this),this.history=[],this.setOptions(t,!1),x.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return v(e,t),E(e,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]||arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=h(i,t);var n=this.options,s=n.element,a=n.target,f=n.targetModifier;if(this.element=s,this.target=a,this.targetModifier=f,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),p(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&p(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=q(this.options.targetAttachment),this.attachment=q(this.options.attachment),this.offset=R(this.options.offset),this.targetOffset=R(this.options.targetOffset),"undefined"!=typeof this.scrollParents&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=r(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return a(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=a(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.top<pageYOffset&&(e.top=pageYOffset),e.left<pageXOffset&&(e.left=pageXOffset),e}if("scroll-handle"===this.targetModifier){var t=void 0,o=this.target;o===document.body?(o=document.documentElement,t={left:pageXOffset,top:pageYOffset,height:innerHeight,width:innerWidth}):t=a(o);var i=getComputedStyle(o),n=o.scrollWidth>o.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,r=0;n&&(r=15);var s=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-r,e={width:15,height:.975*s*(s/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;s<408&&this.target===document.body&&(f=-11e-5*Math.pow(s,2)-.00727*s+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var l=this.target.scrollTop/(o.scrollHeight-s);return e.top=l*(s-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];this.options.addTargetClasses!==!1&&p(this.target,this.getClass("enabled")),p(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==t.target.ownerDocument&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;d(this.target,this.getClass("enabled")),d(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),D.forEach(function(e,o){e===t&&D.splice(o,1)}),0===D.length&&s()}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),k(function(){"undefined"!=typeof o._addAttachClasses&&(m(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&m(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];if(this.enabled){this.clearCache();var o=U(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return a(t.element)}),n=i.width,r=i.height;if(0===n&&0===r&&"undefined"!=typeof this.lastSize){var s=this.lastSize;n=s.width,r=s.height}else this.lastSize={width:n,height:r};var h=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=h,p=C(V(this.attachment),{width:n,height:r}),u=C(V(o),d),c=C(this.offset,{width:n,height:r}),g=C(this.targetOffset,d);p=w(p,c),u=w(u,g);for(var m=h.left+u.left-p.left,v=h.top+u.top-p.top,y=0;y<x.modules.length;++y){var b=x.modules[y],O=b.position.call(this,{left:m,top:v,targetAttachment:o,targetPos:h,elementPos:i,offset:p,targetOffset:u,manualOffset:c,manualTargetOffset:g,scrollbarSize:S,attachment:this.attachment});if(O===!1)return!1;"undefined"!=typeof O&&"object"==typeof O&&(v=O.top,m=O.left)}var E={page:{top:v,left:m},viewport:{top:v-pageYOffset,bottom:pageYOffset-v-r+innerHeight,left:m-pageXOffset,right:pageXOffset-m-n+innerWidth}},A=this.target.ownerDocument,T=A.defaultView,S=void 0;return T.innerHeight>A.documentElement.clientHeight&&(S=this.cache("scrollbar-size",l),E.viewport.bottom-=S.height),T.innerWidth>A.documentElement.clientWidth&&(S=this.cache("scrollbar-size",l),E.viewport.right-=S.width),["","static"].indexOf(A.body.style.position)!==-1&&["","static"].indexOf(A.body.parentElement.style.position)!==-1||(E.page.bottom=A.body.scrollHeight-v-r,E.page.right=A.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return f(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return a(e)}),i=getComputedStyle(e),n=o,r={};if(["Top","Left","Bottom","Right"].forEach(function(t){r[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=A.body.scrollWidth-o.left-n.width+r.right,o.bottom=A.body.scrollHeight-o.top-n.height+r.bottom,E.page.top>=o.top+r.top&&E.page.bottom>=o.bottom&&E.page.left>=o.left+r.left&&E.page.right>=o.right){var s=e.scrollTop,l=e.scrollLeft;E.offset={top:E.page.top-o.top+s-r.top,left:E.page.left-o.left+l-r.left}}}(),this.move(E),this.history.unshift(E),this.history.length>3&&this.history.pop(),e&&_(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,s=0;s<this.history.length;++s){var a=this.history[s];if("undefined"!=typeof a[i]&&!y(a[i][n],t[i][n])){r=!0;break}}r||(o[i][n]=!0)}}var l={top:"",left:"",right:"",bottom:""},d=function(t,o){var i="undefined"!=typeof e.options.optimizations,n=i?e.options.optimizations.gpu:null;if(n!==!1){var r=void 0,s=void 0;if(t.top?(l.top=0,r=o.top):(l.bottom=0,r=-o.bottom),t.left?(l.left=0,s=o.left):(l.right=0,s=-o.right),window.matchMedia){var a=window.matchMedia("only screen and (min-resolution: 1.3dppx)").matches||window.matchMedia("only screen and (-webkit-min-device-pixel-ratio: 1.3)").matches;a||(s=Math.round(s),r=Math.round(r))}l[L]="translateX("+s+"px) translateY("+r+"px)","msTransform"!==L&&(l[L]+=" translateZ(0)")}else t.top?l.top=o.top+"px":l.bottom=o.bottom+"px",t.left?l.left=o.left+"px":l.right=o.right+"px"},p=!1;if((o.page.top||o.page.bottom)&&(o.page.left||o.page.right)?(l.position="absolute",d(o.page,t.page)):(o.viewport.top||o.viewport.bottom)&&(o.viewport.left||o.viewport.right)?(l.position="fixed",d(o.viewport,t.viewport)):"undefined"!=typeof o.offset&&o.offset.top&&o.offset.left?!function(){l.position="absolute";var i=e.cache("target-offsetparent",function(){return f(e.target)});f(e.element)!==i&&k(function(){e.element.parentNode.removeChild(e.element),i.appendChild(e.element)}),d(o.offset,t.offset),p=!0}():(l.position="absolute",d({top:!0,left:!0},t.page)),!p)if(this.options.bodyElement)this.element.parentNode!==this.options.bodyElement&&this.options.bodyElement.appendChild(this.element);else{for(var u=!0,c=this.element.parentNode;c&&1===c.nodeType&&"BODY"!==c.tagName;){if("static"!==getComputedStyle(c).position){u=!1;break}c=c.parentNode}u||(this.element.parentNode.removeChild(this.element),this.element.ownerDocument.body.appendChild(this.element))}var g={},m=!1;for(var n in l){var v=l[n],b=this.element.style[n];b!==v&&(m=!0,g[n]=v)}m&&k(function(){h(e.element.style,g),e.trigger("repositioned")})}}}]),e}(B);I.modules=[],x.position=X;var $=h(I,x),j=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),Y=x.Utils,a=Y.getBounds,h=Y.extend,m=Y.updateClasses,k=Y.defer,G=["left","top","right","bottom"];x.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=t.targetAttachment;if(!this.options.constraints)return!0;var r=this.cache("element-bounds",function(){return a(e.element)}),s=r.height,f=r.width;if(0===f&&0===s&&"undefined"!=typeof this.lastSize){var l=this.lastSize;f=l.width,s=l.height}var d=this.cache("target-bounds",function(){return e.getTargetBounds()}),p=d.height,u=d.width,c=[this.getClass("pinned"),this.getClass("out-of-bounds")];this.options.constraints.forEach(function(t){var e=t.outOfBoundsClass,o=t.pinnedClass;e&&c.push(e),o&&c.push(o)}),c.forEach(function(t){["left","top","right","bottom"].forEach(function(e){c.push(t+"-"+e)})});var g=[],v=h({},n),y=h({},this.attachment);return this.options.constraints.forEach(function(t){var r=t.to,a=t.attachment,l=t.pin;"undefined"==typeof a&&(a="");var h=void 0,d=void 0;if(a.indexOf(" ")>=0){var c=a.split(" "),m=j(c,2);d=m[0],h=m[1]}else h=d=a;var b=O(e,r);"target"!==d&&"both"!==d||(o<b[1]&&"top"===v.top&&(o+=p,v.top="bottom"),o+s>b[3]&&"bottom"===v.top&&(o-=p,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&o<b[1]?(o+=p,v.top="bottom",o+=s,y.top="top"):"top"===y.top&&o+s>b[3]&&o-(s-p)>=b[1]&&(o-=s-p,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+s>b[3]?(o-=p,v.top="top",o-=s,y.top="bottom"):"bottom"===y.top&&o<b[1]&&o+(2*s-p)<=b[3]&&(o+=s-p,v.top="top",y.top="top")),"middle"===v.top&&(o+s>b[3]&&"top"===y.top?(o-=s,y.top="bottom"):o<b[1]&&"bottom"===y.top&&(o+=s,y.top="top"))),"target"!==h&&"both"!==h||(i<b[0]&&"left"===v.left&&(i+=u,v.left="right"),i+f>b[2]&&"right"===v.left&&(i-=u,v.left="left")),"together"===h&&(i<b[0]&&"left"===v.left?"right"===y.left?(i+=u,v.left="right",i+=f,y.left="left"):"left"===y.left&&(i+=u,v.left="right",i-=f,y.left="right"):i+f>b[2]&&"right"===v.left?"left"===y.left?(i-=u,v.left="left",i-=f,y.left="right"):"right"===y.left&&(i-=u,v.left="left",i+=f,y.left="left"):"center"===v.left&&(i+f>b[2]&&"left"===y.left?(i-=f,y.left="right"):i<b[0]&&"right"===y.left&&(i+=f,y.left="left"))),"element"!==d&&"both"!==d||(o<b[1]&&"bottom"===y.top&&(o+=s,y.top="top"),o+s>b[3]&&"top"===y.top&&(o-=s,y.top="bottom")),"element"!==h&&"both"!==h||(i<b[0]&&("right"===y.left?(i+=f,y.left="left"):"center"===y.left&&(i+=f/2,y.left="left")),i+f>b[2]&&("left"===y.left?(i-=f,y.left="right"):"center"===y.left&&(i-=f/2,y.left="right"))),"string"==typeof l?l=l.split(",").map(function(t){return t.trim()}):l===!0&&(l=["top","left","right","bottom"]),l=l||[];var w=[],C=[];o<b[1]&&(l.indexOf("top")>=0?(o=b[1],w.push("top")):C.push("top")),o+s>b[3]&&(l.indexOf("bottom")>=0?(o=b[3]-s,w.push("bottom")):C.push("bottom")),i<b[0]&&(l.indexOf("left")>=0?(i=b[0],w.push("left")):C.push("left")),i+f>b[2]&&(l.indexOf("right")>=0?(i=b[2]-f,w.push("right")):C.push("right")),w.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),g.push(t),w.forEach(function(e){g.push(t+"-"+e)})}(),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),g.push(t),C.forEach(function(e){g.push(t+"-"+e)})}(),(w.indexOf("left")>=0||w.indexOf("right")>=0)&&(y.left=v.left=!1),(w.indexOf("top")>=0||w.indexOf("bottom")>=0)&&(y.top=v.top=!1),v.top===n.top&&v.left===n.left&&y.top===e.attachment.top&&y.left===e.attachment.left||(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),k(function(){e.options.addTargetClasses!==!1&&m(e.target,g,c),m(e.element,g,c)}),{top:o,left:i}}});var Y=x.Utils,a=Y.getBounds,m=Y.updateClasses,k=Y.defer;x.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return a(e.element)}),r=n.height,s=n.width,f=this.getTargetBounds(),l=o+r,h=i+s,d=[];o<=f.bottom&&l>=f.top&&["left","right"].forEach(function(t){var e=f[t];e!==i&&e!==h||d.push(t)}),i<=f.right&&h>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];e!==o&&e!==l||d.push(t)});var p=[],u=[],c=["left","top","right","bottom"];return p.push(this.getClass("abutted")),c.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),d.length&&u.push(this.getClass("abutted")),d.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),k(function(){e.options.addTargetClasses!==!1&&m(e.target,u,p),m(e.element,u,p)}),!0}});var j=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return x.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=j(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),$});
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/package.json b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/package.json new file mode 100644 index 00000000..ffb97151 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/package.json @@ -0,0 +1,32 @@ +{ + "name": "myapp", + "version": "1.0.0", + "description": "list of node modules for myapp", + "main": "app.js", + "scripts": { + "test": "standard" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/NMSVishal/SDNCReports.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/NMSVishal/SDNCReports/issues" + }, + "homepage": "https://github.com/NMSVishal/SDNCReports#readme", + "dependencies": { + "angular": "^1.6.9", + "angular-growl": "^0.1.0", + "angular-mocks": "^1.6.9", + "angular-route": "^1.6.9", + "angular-sanitize": "^1.6.9", + "angular-utils-pagination": "^0.11.1", + "angularjs-datetime-picker": "^0.1.16", + "bootstrap": "^4.0.0", + "jquery": "^3.3.1", + "ng-csv": "^0.3.6", + "ng-ip-address": "^1.1.12" + } +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/Apply.jpg b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/Apply.jpg Binary files differnew file mode 100644 index 00000000..f7ea085b --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/Apply.jpg diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/FailImage.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/FailImage.png Binary files differnew file mode 100644 index 00000000..22c44f7c --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/FailImage.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/backup.jpg b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/backup.jpg Binary files differnew file mode 100644 index 00000000..a38acc79 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/backup.jpg diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/backupConfig.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/backupConfig.png Binary files differnew file mode 100644 index 00000000..33347d22 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/backupConfig.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/compare.jpg b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/compare.jpg Binary files differnew file mode 100644 index 00000000..e463494c --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/compare.jpg diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/compare.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/compare.png Binary files differnew file mode 100644 index 00000000..f7611478 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/compare.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/download.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/download.png Binary files differnew file mode 100644 index 00000000..0b1f9492 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/download.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/downloadImage.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/downloadImage.png Binary files differnew file mode 100644 index 00000000..e72e1285 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/downloadImage.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/error.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/error.png Binary files differnew file mode 100644 index 00000000..3f44964b --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/error.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/fail.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/fail.png Binary files differnew file mode 100644 index 00000000..898fa264 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/fail.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/images.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/images.png Binary files differnew file mode 100644 index 00000000..3bce5731 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/images.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/networklayer.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/networklayer.png Binary files differnew file mode 100644 index 00000000..c8e8008f --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/networklayer.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/protocaol.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/protocaol.png Binary files differnew file mode 100644 index 00000000..2c6f8fa0 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/protocaol.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/protocol.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/protocol.png Binary files differnew file mode 100644 index 00000000..aea9c7c3 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/protocol.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/reachable.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/reachable.png Binary files differnew file mode 100644 index 00000000..bb771b32 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/reachable.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/router.jpg b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/router.jpg Binary files differnew file mode 100644 index 00000000..cb4c50ec --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/router.jpg diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/router.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/router.png Binary files differnew file mode 100644 index 00000000..94de9f5a --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/router.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/search.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/search.png Binary files differnew file mode 100644 index 00000000..a8b4b35d --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/search.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/success.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/success.png Binary files differnew file mode 100644 index 00000000..76689fef --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/success.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/validation.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/validation.png Binary files differnew file mode 100644 index 00000000..77c53ffa --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/validation.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/waning.png b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/waning.png Binary files differnew file mode 100644 index 00000000..2ae29877 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/images/waning.png diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllConfigForVNF.json b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllConfigForVNF.json new file mode 100644 index 00000000..040d2ee7 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllConfigForVNF.json @@ -0,0 +1,199 @@ +{ + "preload-vnfs": { + "vnf-preload-list": [ + { + "vnf-name": "vDNS-vIMS", + "vnf-type": "VimsClearwaterVsp..sproutScaling..module-1", + "vnf-version":"1.0", + "timeStamp":"2018-03-16", + "preload-data": { + "vnf-topology-information": { + "vnf-parameters": [ + { + "vnf-parameter-name": "dn_range_length", + "vnf-parameter-value": "10000" + }, + { + "vnf-parameter-name": "public_net_id", + "vnf-parameter-value": "d05b5f2a-37ce-4d75-810a-c7592a123ca3" + }, + { + "vnf-parameter-name": "dn_range_start", + "vnf-parameter-value": "2425550000" + }, + { + "vnf-parameter-name": "etcd_ip", + "vnf-parameter-value": "30.30.30.20" + }, + { + "vnf-parameter-name": "zone", + "vnf-parameter-value": "me.cw-ngv.com" + }, + { + "vnf-parameter-name": "dnssec_key", + "vnf-parameter-value": "9FPdYTWhk5+LbhrqtTPQKw==" + }, + { + "vnf-parameter-name": "dns_ip", + "vnf-parameter-value": "30.30.30.9" + }, + { + "vnf-parameter-name": "key_name", + "vnf-parameter-value": "sprout_scale_key1" + }, + { + "vnf-parameter-name": "repo_url", + "vnf-parameter-value": "http://repo.cw-ngv.com/stable" + } + ], + "vnf-topology-identifier": { + "service-type": "dcdae039-b762-4f25-a4aa-92e6034cf3bd", + "vnf-type": "VimsClearwaterVsp..sproutScaling..module-1", + "generic-vnf-name": "vIMS-vnf-inst-1", + "generic-vnf-type": "vIMS-ClearWater-VSP 0", + "vnf-name": "vDNS-vIMS" + } + }, + "oper-status": { + "order-status": "PendingAssignment" + }, + "network-topology-information": {} + } + }, + { + "vnf-name": "vDNS-vIMS", + "vnf-type": "VimsClearwaterVsp..sproutScaling..module-1", + "vnf-version":"2.0", + "timeStamp":"2018-03-17", + "preload-data": { + "vnf-topology-information": { + "vnf-parameters": [ + { + "vnf-parameter-name": "dn_range_length", + "vnf-parameter-value": "20000" + }, + { + "vnf-parameter-name": "public_net_id", + "vnf-parameter-value": "60dc8a1c-86b8-4cc4-b5c8-9b0272113c1f" + }, + { + "vnf-parameter-name": "dn_range_start", + "vnf-parameter-value": "2425550111" + }, + { + "vnf-parameter-name": "etcd_ip", + "vnf-parameter-value": "10.53.172.155" + }, + { + "vnf-parameter-name": "zone", + "vnf-parameter-value": "me.cw-ngv.com" + }, + { + "vnf-parameter-name": "dnssec_key", + "vnf-parameter-value": "9FPdYTWhk5+LbhrqtTPQKw==" + }, + { + "vnf-parameter-name": "dns_ip", + "vnf-parameter-value": "10.53.172.152" + }, + { + "vnf-parameter-name": "key_name", + "vnf-parameter-value": "vm1-key-vims" + }, + { + "vnf-parameter-name": "repo_url", + "vnf-parameter-value": "http://repo.cw-ngv.com/stable" + } + ], + "vnf-topology-identifier": { + "service-type": "dcdae039-b762-4f25-a4aa-92e6034cf3bd", + "vnf-type": "VimsClearwaterVsp..base_clearwater..module-0", + "generic-vnf-name": "vIMS-vnf-inst-1", + "generic-vnf-type": "vIMS-ClearWater-VSP 0", + "vnf-name": "Vfmodule-vIMS" + } + }, + "oper-status": { + "order-status": "PendingAssignment" + }, + "network-topology-information": {} + } + }, + { + "vnf-name": "vDNS-vIMS", + "vnf-type": "VimsClearwaterVsp..sproutScaling..module-1", + "vnf-version":"3.0", + "timeStamp":"2018-03-16", + "preload-data": { + "vnf-topology-information": { + "vnf-parameters": [ + { + "vnf-parameter-name": "dn_range_length", + "vnf-parameter-value": "10000" + }, + { + "vnf-parameter-name": "public_net_id", + "vnf-parameter-value": "d05b5f2a-37ce-4d75-810a-c7592a123ca3" + }, + { + "vnf-parameter-name": "dn_range_start", + "vnf-parameter-value": "2425550000" + }, + { + "vnf-parameter-name": "etcd_ip", + "vnf-parameter-value": "30.30.30.20" + }, + { + "vnf-parameter-name": "zone", + "vnf-parameter-value": "me.cw-ngv.com" + }, + { + "vnf-parameter-name": "dnssec_key", + "vnf-parameter-value": "9FPdYTWhk5+LbhrqtTPQKw==" + }, + { + "vnf-parameter-name": "dns_ip", + "vnf-parameter-value": "30.30.30.9" + }, + { + "vnf-parameter-name": "key_name", + "vnf-parameter-value": "sprout_scale_key1" + }, + { + "vnf-parameter-name": "repo_url", + "vnf-parameter-value": "http://repo.cw-ngv.com/stable" + } + ], + "vnf-topology-identifier": { + "service-type": "dcdae039-b762-4f25-a4aa-92e6034cf3bd", + "vnf-type": "VimsClearwaterVsp..sproutScaling..module-1", + "generic-vnf-name": "vIMS-vnf-inst-1", + "generic-vnf-type": "vIMS-ClearWater-VSP 0", + "vnf-name": "vDNS-vIMS" + } + }, + "oper-status": { + "order-status": "PendingAssignment" + }, + "network-topology-information": {} + } + } + ] +}, + "status":200, + "config":{ + "method":"GET", + "transformRequest":[ + null + ], + "transformResponse":[ + null + ], + "params":"", + "headers":{ + "Accept":"application/json" + }, + "url":"/getAllConfigForVNF/Thu Mar 15 2018 00:00:00 GMT+0530 (India Standard Time)/Fri Mar 16 2018 00:00:00 GMT+0530 (India Standard Time)/Router" + }, + "statusText":"" + }
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllDevices.json b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllDevices.json new file mode 100644 index 00000000..d7faef5a --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllDevices.json @@ -0,0 +1,17 @@ + +{ + "deviceList":[ + { + "deviceId":"1", + "deviceName":"Device1" + }, + { + "deviceId":"2", + "deviceName":"Device2" + }, + { + "deviceId":"3", + "deviceName":"Device3" + } + ] +}
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllReports.json b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllReports.json new file mode 100644 index 00000000..cd0723f1 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllReports.json @@ -0,0 +1,75 @@ + +{ + "data":[ + { + "testid":1, + "deviceid":1, + "testName":"Network Layer", + "deviceName":"Router", + "execuationDetails":{"output": {"hostname": "google.com","testresult": "pass", "status": "reachable","statistics": "0% loss","ipaddress": "10.53.122.44","avgTime": "Minimum = 70ms"}}, + "result":"Pass", + "timeStamp":"2018-03-16" + }, + { + "testid":2, + "deviceid":1, + "testName":"Network Layer", + "deviceName":"Router", + "execuationDetails":{"output": {"hostname": "google.com","testresult": "fail", "status": "unreachable","statistics": "100% loss","ipaddress": "10.53.122.44","avgTime": "Minimum = 33ms"}}, + "result":"Pass", + "timeStamp":"2018-03-16" + }, + { + "testid":4, + "deviceid":1, + "testName":"Protocol Layer", + "deviceName":"Router", + "execuationDetails":{"output": {"status": "unreachable"}}, + "result":"Fail", + "timeStamp":"2018-03-08" + }, + { + "testid":5, + "deviceid":1, + "testName":"Protocol Layer", + "deviceName":"Router", + "execuationDetails":{"output": {"status": "reachable"}}, + "result":"Pass", + "timeStamp":"2018-03-15" + }, + { + "testid":6, + "deviceid":1, + "testName":"Network Layer", + "deviceName":"Router", + "execuationDetails":{"output": {"hostname": "google.com","testresult": "fail", "status": "unreachable","statistics": "100% loss","ipaddress": "10.53.122.44","avgTime": "Minimum = 33ms"}}, + "result":"Fail", + "timeStamp":"2018-03-15" + }, + { + "testid":7, + "deviceid":1, + "testName":"Network Layer", + "deviceName":"Router", + "execuationDetails":{"output": {"hostname": "google.com","testresult": "fail", "status": "unreachable","statistics": "100% loss","ipaddress": "10.53.122.44","avgTime": "Minimum = 50ms"}}, + "result":"Fail", + "timeStamp":"2018-03-15" + } + ], + "status":200, + "config":{ + "method":"GET", + "transformRequest":[ + null + ], + "transformResponse":[ + null + ], + "params":"", + "headers":{ + "Accept":"application/json" + }, + "url":"/findReportByDeviceName/Thu Mar 15 2018 00:00:00 GMT+0530 (India Standard Time)/Fri Mar 16 2018 00:00:00 GMT+0530 (India Standard Time)/Router" + }, + "statusText":"" +}
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllTest.json b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllTest.json new file mode 100644 index 00000000..fc9b2901 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllTest.json @@ -0,0 +1,17 @@ + +{ + "testList":[ + { + "testId":"1", + "testName":"Test1" + }, + { + "testId":"2", + "testName":"Test2" + }, + { + "testId":"3", + "testName":"Test3" + } + ] +}
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllVNF.json b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllVNF.json new file mode 100644 index 00000000..49b91a4a --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllVNF.json @@ -0,0 +1,33 @@ + +{ + "vnfList":[ + { + "IpAddress":"1.160.10.240", + "HostName":"Vfmodule-vIMS", + "Selected":false, + "PortNo":"8282", + "vnfType": "VimsClearwaterVsp..sproutScaling..module-1" + }, + { + "IpAddress":"1.160.10.241", + "HostName":"vDNS-vIMS", + "Selected":false, + "PortNo":"8080", + "vnfType": "VimsClearwaterVsp..sproutScaling..module-1" + }, + { + "IpAddress":"1.160.10.242", + "HostName":"Vfmodule-F5", + "Selected":false, + "PortNo":"8285", + "vnfType": "VimsClearwaterVsp..sproutScaling..module-1" + }, + { + "IpAddress":"1.160.10.243", + "HostName":"Vfmodule-F6", + "Selected":false, + "PortNo":"8286", + "vnfType": "VimsClearwaterVsp..sproutScaling..module-1" + } + ] +}
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllVersion.json b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllVersion.json new file mode 100644 index 00000000..7d0172e0 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getAllVersion.json @@ -0,0 +1,133 @@ +{ + "versionlist":[ + { + "model":"CSR1000V", + "vendor":"CISCO", + "versionNo":"1.0", + "timestamp":"2017/09/01", + "router":{ + "ospf":{ + "process-id":"1", + "networks":{ + "subnet-ip":"10.10.1.0/24", + "area-id":"20" + } + }, + "bgp":{ + "as-number":"2000", + "router-id":"10.10.1.2", + "neighbors":{ + "as-number":"1000", + "peer-ip":"10.10.2.1" + } + }, + "ipsla":[ + { + "cos-entry-number":"40102", + "destination-address":"13.13.13.13", + "source-address":"10.10.1.1", + "customer-name":"Hello Inc" + }, + { + "cos-entry-number":"40103", + "destination-address":"10.11.12.12", + "source-address":"10.10.1.2", + "customer-name":"ABC Inc" + }, + { + "cos-entry-number":"40105", + "destination-address":"12.5.12.12", + "source-address":"10.10.1.3", + "customer-name":"test Inc" + } + ] + } + }, + { + "model":"CSR1000V", + "vendor":"CISCO", + "versionNo":"2.0", + "timestamp":"2017/10/01", + "router":{ + "ospf":{ + "process-id":"1", + "networks":{ + "subnet-ip":"10.10.1.0/25", + "area-id":"20" + } + }, + "bgp":{ + "as-number":"2000", + "router-id":"10.10.1.2", + "neighbors":{ + "as-number":"1000", + "peer-ip":"10.10.2.1" + } + }, + "ipsla":[ + { + "cos-entry-number":"40102", + "destination-address":"12.12.12.12", + "source-address":"10.10.1.1", + "customer-name":"Hello Inc" + }, + { + "cos-entry-number":"40103", + "destination-address":"10.11.12.12", + "source-address":"10.10.1.1", + "customer-name":"ABC Inc" + }, + { + "cos-entry-number":"40105", + "destination-address":"12.5.12.12", + "source-address":"10.10.1.2", + "customer-name":"test Inc" + } + ] + } + }, + { + "model":"CSR1000V", + "vendor":"CISCO", + "versionNo":"3.0", + "timestamp":"2017/10/01", + "router":{ + "ospf":{ + "process-id":"1", + "networks":{ + "subnet-ip":"10.10.1.0/25", + "area-id":"20" + } + }, + "bgp":{ + "as-number":"2000", + "router-id":"10.10.1.2", + "neighbors":{ + "as-number":"1000", + "peer-ip":"10.10.2.1" + } + }, + "ipsla":[ + { + "cos-entry-number":"40102", + "destination-address":"12.12.12.12", + "source-address":"10.10.1.1", + "customer-name":"Hello Inc" + }, + { + "cos-entry-number":"40103", + "destination-address":"10.11.12.12", + "source-address":"10.10.1.1", + "customer-name":"ABC Inc" + }, + { + "cos-entry-number":"40105", + "destination-address":"12.5.12.12", + "source-address":"10.10.1.2", + "customer-name":"test Inc" + } + ] + } + } + ] +}
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getTestResult.json b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getTestResult.json new file mode 100644 index 00000000..581c8b08 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/sdnc-stubs/getTestResult.json @@ -0,0 +1,42 @@ + +{ + "preTestResponse":[ + { + "ipaddress":"1.160.10.240", + "status":"unreachable", + "testtype":"Network Layer", + "statistics":null, + "avgTime":null + }, + { + "ipaddress":"1.160.10.240", + "status":"unreachable", + "testtype":"Protocol Layer", + "statistics":null, + "avgTime":null + }, + { + "ipaddress":"1.160.10.240", + "status":"reachable", + "testtype":"Network Layer", + "statistics":"0% loss", + "avgTime":"Minimum = 70ms" + } + ], + "status":200, + "config":{ + "method":"GET", + "transformRequest":[ + null + ], + "transformResponse":[ + null + ], + "params":"", + "headers":{ + "Accept":"application/json" + }, + "url":"/findReportByDeviceName/Thu Mar 15 2018 00:00:00 GMT+0530 (India Standard Time)/Fri Mar 16 2018 00:00:00 GMT+0530 (India Standard Time)/Router" + }, + "statusText":"" +}
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/style/sdnc-style.css b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/style/sdnc-style.css new file mode 100644 index 00000000..5f192049 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/style/sdnc-style.css @@ -0,0 +1,543 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ + + body{ + padding-top:10px; + overflow-y:scroll; + padding-bottom:10px; + } + +/* form styling */ +#form-container{ + margin-bottom:20px; + border-radius:5px; +} +#form-container .page-header{ + margin:0; padding:30px; + border-top-left-radius:5px; border-top-right-radius:5px; + } + + table.tableDisplay{ + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + width: 100%; + table-layout: auto; +} + table.tableDisplay tr:nth-child(even){ + background-color: #E1E0DA; +} + table.tableDisplay th{ + padding-top: 12px; + padding-bottom: 12px; + text-align: left; + background: linear-gradient(to top, #f8f8f8 0%, #cce5ff 83%); + color: black; +} + table.tableDisplay td,table.tableDisplay th { + border: 1px solid #ABABAB; + padding: 8px; + width:30px; + height:10%; + +} + table.tableDisplay tr:{ + text-align: left; + height:105;; +} + table.tableDisplay tr:hover { + background-color:#cce5ff; +} + .first_row{ + background-color: #cce5ff; + color: black; + text-align:left; +} + .column { + float: left; + width: 32.2%; + padding: 10px; + margin-left:20px; + height: 60px; + /* Should be removed. Only for demonstration */ +} +.columnComp{ + float: left; + width: 22%; + padding: 10px; + margin-left:20px; + height: 60px; +} +/* Clear floats after the columns */ + .row:after { + content: ""; + display: table; + clear: both; +} + #btnSubmit{ + background-color: #AED6F1; + margin-top:20px; + margin-left:20px; + margin-bottom:10px; + width:75px; + height:28px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + border: 1px solid #5DADE2; + font-weight:700; +} + .btndownload{ + background-color: #AED6F1; + margin-top:20px; + margin-bottom:10px; + margin-left:20px; + width:130px; + height:30px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + border: 1px solid #5DADE2; + font-weight:700; +} + #exampleInput{ + margin-left:25px; + width:160px; +} + #exampleEndInput{ + margin-left:10px; +} + .error{ + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + color:Red; + font-size: 14px; + margin-bottom:10px; +} + .labeltext{ + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; +} + .sort-icon { + font-size: 9px; + margin-left: 5px; +} + th { + cursor:pointer; +} + .heading{ + margin-top:10px; + width:100%; + height:45px; + margin-bottom:20px; + font-family:Trebuchet MS, Arial, Helvetica, sans-serif; + margin-top: 15px; + margin-right: auto; + margin-left: auto; + font-size: 20px; + background: linear-gradient(to top, #f8f8f8 0%, #cce5ff 83%); + padding-top: 15px; + padding-bottom: 50px; + +} +form_validationBody{ + width:900px; + margin-left:15px; + margin-top:60px; + margin-bottom:20px; +} +button:hover { + position: relative; +} +button[title]:hover:after { + padding: 4px 8px; + position: absolute; + left: 0; + top: 100%; + white-space: nowrap; + z-index: 20px; + background:red; +} +.pagination{ +display: inline-block; + padding-left: 0; + margin: 5px 0; + border-radius: 4px; + border: 1px solid #ABABAB; + font-size: 13px; +} +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + line-height: 1.42857143; + text-decoration: none; + color: #337ab7; + background-color: #fff; + border: 1px solid #ABABAB; + margin-left: -1px; +} +.pagination > .active >a{ + z-index: 3; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; + cursor: default; +} +.arrowRed { +font-size: 30px; +color: red; +} +.arrowGreen { +font-size: 30px; +color: green; +} +.ng-invalid { border: 1px ridge #ddd; } +.testMain{ + width:100%; + margin-bottom:20px; + min-height:400px; + margin-top:10px; +} +.testNotification{ + padding:0px; +} +.testImgIcon{ + margin-left:5px; + margin-right:10px; + padding-right:10px; +} +.testCol{ + background-color:#f2f2f2; + width:25%; + margin-left:35px; +} +.check{ + margin-left:10px; + margin-right:10px; +} +.btnRunTest{ + background-color:#f2f2f2; + width:75%; + height:75px; + margin-left:35px; + margin-bottom:35px; +} +.ReportMain{ + width:100%; + min-height:400px; + margin-top:10px; +} +.ReportNotification{ + padding:0px; + margin-right:10px; + text-align:center; +} +.ReportImgIcon{ + margin-left:5px; + margin-right:10px; +} +input[type=checkbox] { + padding-right: 3px; + !important; + } + +.header{ + margin-top:20px; + width:1145px; + height:45px; + margin-bottom:5px; + font-family:Trebuchet MS, Arial, Helvetica, sans-serif; + font-size: 20px; + background: linear-gradient(to top, #f8f8f8 0%, #8F8484 83%); + padding-top:15px; + +} +.footer{ + margin-top:10px; + width:1145px; + height:30px; + margin-bottom:5px; + font-family:Trebuchet MS, Arial, Helvetica, sans-serif; + font-size: 15px; + background: linear-gradient(to top, #f8f8f8 0%, #8F8484 83%); + padding-top:15px; + +} +.btn-danger{ + background-color: #ffb3b3; + width: 1090px; + text-align: left; + color:black; + height:45px; +} +.btn-success{ + width: 1090px; + text-align: left; + color:black; + background-color: #66cc66; + height:45px; + +} +.btn-warning{ + width: 1090px; + text-align: left; + color:black; + height:45px; + background-color: #ffff99; +} +/* Dropdown Button */ +.dropbtn { + background-color: #ffe0b3; + font-family: Trebuchet MS, Arial, Helvetica, sans-serif; + color: #333333; + padding: 15px; + font-size: 17px; + border: none; + padding-right:20px; + padding-left: 30px; +} + +/* The container <div> - needed to position the dropdown content */ +.dropdown { + position: relative; + display: inline-block; +} + +/* Dropdown Content (Hidden by Default) */ +.dropdown-content { + display: none; + position: absolute; + background-color: #f1f1f1; + min-width: 240px; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + z-index: 1; +} + +/* Links inside the dropdown */ +.dropdown-content a { + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; + font-family: Trebuchet MS, Arial, Helvetica, sans-serif; +} + +/* Change color of dropdown links on hover */ +.dropdown-content a:hover {background-color: #ddd} + +/* Show the dropdown menu on hover */ +.dropdown:hover .dropdown-content { + display: block; + color: black; +} + + +.navbar-default .navbar-nav>li> a:hover {background-color: #ddd} +.btnapply{ + background-color:#AED6F1 ; + margin-top:10px; + margin-bottom:10px; + margin-right:20px; + width:150px; + height:30px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + border: 1px solid #5DADE2; + font-weight:700; +} + + +.btnview{ + background-color: #AED6F1; + margin-top:8px; + margin-bottom:10px; + margin-right:20px; + width:150px; + height:30px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + border: 1px solid #5DADE2; + font-weight:700; +} +.btnview:hover {background-color: #85C1E9} + +.btnview:active { + background-color: #85C1E9; + box-shadow: 0 5px #85C1E9; + transform: translateY(4px); +} + +.btnapplycfg{ + background-color: #AED6F1; + margin-top:8px; + margin-bottom:10px; + margin-right:20px; + width:150px; + height:30px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + border: 1px solid #5DADE2; + font-weight:700; +} +.btnapplycfg:hover {background-color: #85C1E9} + +.btnapplycfg:active { + background-color: #85C1E9; + box-shadow: 0 5px #85C1E9; + transform: translateY(4px); +} + +.navbar-default .navbar-nav>li> a:hover {background-color: #FFFF00} + + .btnCompareVersion{ + background-color: #AED6F1; + margin-top:8px; + margin-bottom:10px; + margin-right:20px; + width:150px; + height:30px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + border: 1px solid #5DADE2; + font-weight:700; +} + +.btnCompareVersion:hover {background-color: #85C1E9} + +.btnCompareVersion:active { + background-color: #85C1E9; + box-shadow: 0 5px #85C1E9; + transform: translateY(4px); + border-collapse: collapse; + border: 2px solid #5DADE2; +} + +.btnapply{ + background-color: #AED6F1; + margin-top:8px; + margin-bottom:10px; + margin-right:20px; + width:150px; + height:30px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + border: 1px solid #5DADE2; + font-weight:700; +} + +.btnapply:hover {background-color: #85C1E9} + +.btnapply:active { + background-color: #85C1E9; + box-shadow: 0 5px #85C1E9; + transform: translateY(4px); + border-collapse: collapse; + border: 2px solid #5DADE2; +} + +.Formclass{ + width:100%; + margin-top:30px; + min-height:10000; +} + +.VersionMain{ + width:100%; + margin-top:60px; + min-height:2200px; + border: 0.5px solid lightgrey; +} + +.versionHeading{ + width:100%; + height:35px; + margin-bottom:20px; + background-color: #cce5ff; + font-family:Trebuchet MS, Arial, Helvetica, sans-serif; + margin-right: -15px; + font-size: 15px; + padding-top:5px; + color:black; + +} +{ + box-sizing: border-box; + +} + +.columnsVersion { + float: left; + width: 33.3%; + padding: 8px; + border-radius: 15px; +} + +.columnsVersionview{ + float: left; + width: 50%; + padding: 8px; + border-radius: 15px; +} + +.price { + list-style-type: none; + border: 1px solid grey; + border-radius: 25px; + margin: 0; + padding: 0; + -webkit-transition: 0.3s; + transition: 0.3s; +} + +.price:hover { + box-shadow: 0 8px 12px 0 rgba(0,0,0,0.2) +} + +.price .headerVersion { + background-color:#484848; + color: white; + font-size: 15px; + border-radius: 50px; + height:40px; +} + +.price li { + border-bottom: 1px solid #eee; + padding: 5px; + text-align: center; + font-size: 12px; + word-wrap: break-word; +} + +.price .grey { + background-color: #FFCCCC; + font-size: 12px; + margin-left:20px; + margin-right:20px; +} + +@media only screen and (max-width: 600px) { + .columnsVersion { + width: 100%; + } +} +.separator{ + border-color:darkgrey; + min-height:2px; +} +.listHeading{ + background-color: #ffcccc; +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/style/w3.css b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/style/w3.css new file mode 100644 index 00000000..e73d2696 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/style/w3.css @@ -0,0 +1,231 @@ +/* W3.CSS 4.10 February 2018 by Jan Egil and Borge Refsnes */ +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} +/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ +html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} +article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block} +audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} +audio:not([controls]){display:none;height:0}[hidden],template{display:none} +a{background-color:transparent;-webkit-text-decoration-skip:objects} +a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} +dfn{font-style:italic}mark{background:#ff0;color:#000} +small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}svg:not(:root){overflow:hidden} +code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} +button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:bold} +button,input{overflow:visible}button,select{text-transform:none} +button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button} +button::-moz-focus-inner, [type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner{border-style:none;padding:0} +button:-moz-focusring, [type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring{outline:1px dotted ButtonText} +fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} +legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} +[type=checkbox],[type=radio]{padding:0} +[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} +[type=search]{-webkit-appearance:textfield;outline-offset:-2px} +[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none} +::-webkit-input-placeholder{color:inherit;opacity:0.54} +::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +/* End extract */ +html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} +h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}.w3-serif{font-family:serif} +h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px} +hr{border:0;border-top:1px solid #eee;margin:20px 0} +.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit} +.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} +.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} +.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} +.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center} +.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} +.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px} +.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} +.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} +.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} +.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} +.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} +.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} +.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} +.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} +.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%} +.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc} +.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} +.w3-dropdown-hover:hover .w3-dropdown-content{display:block} +.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} +.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} +.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} +.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px} +.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} +.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} +.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} +.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} +.w3-main,#main{transition:margin-left .4s} +.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)} +.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} +.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} +.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} +.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} +.w3-bar .w3-button{white-space:normal} +.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} +.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} +.w3-responsive{display:block;overflow-x:auto} +.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, +.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} +.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} +.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} +.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} +.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} +@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%} +.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%} +.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}} +@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} +.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} +.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} +.w3-content{max-width:980px;margin:auto}.w3-rest{overflow:hidden} +.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} +.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} +.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} +@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} +.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} +.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} +.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} +@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} +@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} +@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} +@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}} +.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} +.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2} +.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} +.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} +.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} +.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} +.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} +.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} +.w3-display-position{position:absolute} +.w3-circle{border-radius:50%} +.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} +.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px} +.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} +.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} +.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} +.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} +.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)} +.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} +.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} +.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} +.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} +.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} +.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} +.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} +.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} +.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} +.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} +.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} +.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} +.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} +.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} +.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} +.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} +.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} +.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important} +.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} +.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} +.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} +.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} +.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} +.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} +.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} +.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} +.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} +.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} +.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} +.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} +.w3-left{float:left!important}.w3-right{float:right!important} +.w3-button:hover{color:#000!important;background-color:#ccc!important} +.w3-transparent,.w3-hover-none:hover{background-color:transparent!important} +.w3-hover-none:hover{box-shadow:none!important} +/* Colors */ +.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important} +.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important} +.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important} +.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important} +.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important} +.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important} +.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important} +.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important} +.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important} +.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important} +.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important} +.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important} +.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important} +.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important} +.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important} +.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important} +.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important} +.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important} +.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important} +.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important} +.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important} +.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important} +.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important} +.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important} +.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important} +.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important} +.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important} +.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important} +.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important} +.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important} +.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important} +.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important} +.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important} +.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important} +.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important} +.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important} +.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important} +.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important} +.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important} +.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important} +.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important} +.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important} +.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important} +.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important} +.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important} +.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important} +.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important} +.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important} +.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important} +.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important} +.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important} +.w3-text-white,.w3-hover-text-white:hover{color:#fff!important} +.w3-text-black,.w3-hover-text-black:hover{color:#000!important} +.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important} +.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important} +.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important} +.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important} +.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important} +.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important} +.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important} +.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important} +.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important} +.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important} +.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important} +.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important} +.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important} +.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important} +.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important} +.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important} +.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important} +.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important} +.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important} +.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important} +.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important} +.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important} +.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important} +.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important} +.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important} +.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important} +.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important} +.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important} +.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important} +.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important} +.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important}
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/footer.html b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/footer.html new file mode 100644 index 00000000..9d252bf0 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/footer.html @@ -0,0 +1,3 @@ +<div class="footer"> + <p style="margin-left:20px;text-align:center"> @Copyright 2018 All rights reserved</p> +</div> diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-applyConfig.jsp b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-applyConfig.jsp new file mode 100644 index 00000000..76293840 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-applyConfig.jsp @@ -0,0 +1,48 @@ +<!-- /* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ + --> +<div class="ReportMain" > + <div class="heading"><img src="static/images/Apply.jpg" width=70 height="40" style="margin-left:5px;"> Apply Configruation</div> + <form name="myForm" style="background-color:#f2f2f2; border: 1px solid #ddd;"> + <div growl></div> + + <div class="row" style="background-color:#f2f2f2;width:100%;margin-left:1px;height:75px"> + <div class="column" style="width:30%;background-color:#f2f2f2;height:55px;margin-left:40px;"> + <label class="labeltext">Select Avaliable VNF</label> + </div> + <div class="column" style="background-color:#f2f2f2;width:60%;height:55px;margin-left:0px;"> + <select class="form-control" style="width:100%;margin-top:0px;" ng-model="selectedValueVnf" ng-change="selectVnf(selectedValueVnf)"> + <option ng-repeat="vnf in objvnfList" value="{{vnf.vnfid}}">VnfId- {{vnf.vnfid}} VnfName- {{vnf.vnfname}}</option> + <option value="">Select VNFId</option> + </select> + </div> + </div> + <div class="row" style="background-color:#f2f2f2;width:100%;margin-left:1px;height:100px"> + <div class="column" style="width:30%;height:55px;margin-left:35px;"> + <input type="file" style="width:300px" id="myFileInput" ng-model="file" accept=".json"/> + </div> + <div class="column" style="width:50%;height:55px;margin-left:10px;"> + <button type="submit" class="btnapply" ng-click="submit()">Apply Config</button> + </div> + </div> + </form> +</div> +</body> +</html>
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-backupConfig.html b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-backupConfig.html new file mode 100644 index 00000000..15c1c4b0 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-backupConfig.html @@ -0,0 +1,39 @@ +<!-- /* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ + --> +<div class="ReportMain"> + <div class="heading"><img src="static/images/backupConfig.png" width=50 height="40" style="margin-left:5px;"> Backup Configruation + <label style="float: right; margin-right: 84px;"><font size='2'>Last Updated Time : <span style="color:red">{{lastModifiedTime}}</span></font></label> + </div> + <form name="myForm"> + <div growl></div> + <div class="row"> + + </div> + <div class="row"> + <div class="column" style="background-color:#f2f2f2;width:97%;border: 1px solid #ddd;"> + <input type="button" class="btnapply" ng-click="invokeBackup()" value=" Config Backup" /> + </div> + </div> + <div class="row"> + + </div> + </form> +</div>
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-compareConfig.html b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-compareConfig.html new file mode 100644 index 00000000..93ab7b64 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-compareConfig.html @@ -0,0 +1,85 @@ + <!-- /* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ + --> +<div class="ReportMain"> + <div class="heading"><img src="static/images/compare.png" width=45 height="40" style="margin-left:5px;"> Compare Configruation</div> + <form name="myForm" class="Formclass"> + <div growl></div> + <div class="row" style="background-color:#f2f2f2;width:100%;margin-left:1px; border: 1px solid #ddd;"> + <div class="column" style="width:30%;background-color:#f2f2f2;height:55px;margin-left:40px;"> + <label class="labeltext">Select Avaliable VNF</label> + </div> + <div class="column" style="background-color:#f2f2f2;width:60%;height:55px;margin-left:0px;"> + <select class="form-control" style="width:100%;margin-top:0px;" ng-model="selectedValueVnf" ng-change="selectVnf(selectedValueVnf)"> + <option ng-repeat="vnf in objvnfList" value="{{vnf.vnfid}}">VnfId- {{vnf.vnfid}} VnfName- {{vnf.vnfname}}</option> + <option value="">Select VNFId</option> + </select> + </div> + </div> + <table class="tableDisplay" ng-show="ShowResult" id="tableToExport" style="margin-top:15px;"> + <tr class="first_row" style="background-color:#6D7B8D;"> + <th>SNo. + </th> + <th>VersionNo + </th> + <th>Backup Date + </th> + <th>Updated Date + </th> + <th>Action</th> + </tr> + <tr ng-repeat="version in pagedItems[currentPage] | orderBy:sort.sortingOrder:sort.reverse"> + <td>{{$index+1}}</td> + <td>{{version.vnfversion}}</td> + <td>{{version.createdAt}}</td> + <td>{{version.updatedAt}}</td> + <td><input type=checkbox ng-model="version.selected"> + </td> + </tr> + + <td colspan="5"> + <!-- ng-show="pagedItems.length > 5" --> + <ul class="pagination pull-right"> + <li ng-class="{disabled: currentPage == 0}"><a href + ng-click="prevPage()">«</a></li> + <li ng-repeat="n in range(pagedItems.length, currentPage, currentPage + gap) " + ng-class="{active: n == currentPage}" ng-click="setPage()"><a + href ng-bind="n + 1">1</a></li> + <li ng-class="{disabled: (currentPage) == pagedItems.length - 1}"> + <a href ng-click="nextPage()">»</a> + </li> + </ul> + </td> + + <tr> + <td colspan="5"> + <div class="row pull-right"> + <button type="button" class="btnview" ng-click="ViewConfig(objVersion)" ng-show="showView" ng-model="version.selected" >View Config</button> + <button type="button" class="btnapplycfg" ng-click="ApplyConfig(objVersion)" >Apply Config</button> + <button type="button" class="btnCompareVersion" ng-click="CompareConfig(objVersion)" ng-show="showCompare" ng-model="version.selected" >Compare Config</button> + </div> + </td> + </tr> + </table> + <div id="compare" ng-form = "compare" ng-include="" src="'static/views/form-deviceConfig.html'"></div> + <div id="view" ng-form = "view" ng-include="" src="'static/views/form-deviceConfigView.html'"></div> + + </form> +</div>
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-deviceConfig.html b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-deviceConfig.html new file mode 100644 index 00000000..54b39b27 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-deviceConfig.html @@ -0,0 +1,332 @@ +<!-- /* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ + --> +<!-- <div class="VersionMain" ng-show="showResult"> + <div class="versionHeading"><img src="static/images/compare.jpg" width=25 height="25" style="margin-left:5px;"> Version Comparision Result</div> + <div class="columnsVersion"> + <ul class="price"> + <li class="headerVersion">Attributes</li> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Config Details</li> + <li ng-repeat="(key,value) in objCompareModel1.versionDetails">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology</li> + <li ng-repeat="(key,value) in objCompareModel1.topologyInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;" ng-if="objCompareModel1.networkTopologyInfo.length>=1"> + <li class="listHeading">Network Topology</li> + <li ng-repeat="(key,value) in objCompareModel1.networkTopologyInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Operation Status</li> + <li ng-repeat="(key,value) in objCompareModel1.operationStatus">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology Identifer</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfTopologyIdentifier">{{key}}</li> + <hr class="separator"> + </hr> + </div> + </ul> + </div> + <div class="columnsVersion"> + <ul class="price"> + <li class="headerVersion" style="background-color:#807C7C">Version {{objCompareModel1.versionDetails.vnfversion}}</li> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Config Details</li> + <li ng-repeat="(key,value) in objCompareModel1.versionDetails">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology</li> + <li ng-repeat="(key,value) in objCompareModel1.topologyInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;" ng-if="objCompareModel1.networkTopologyInfo.length>=1"> + <li class="listHeading">Network Topology</li> + <li ng-repeat="(key,value) in objCompareModel1.networkTopologyInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Operation Status</li> + <li ng-repeat="(key,value) in objCompareModel1.operationStatus">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology Identifer</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfTopologyIdentifier">{{value}}</li> + <hr class="separator"> + </hr> + </div> + </ul> + </div> + <div class="columnsVersion"> + <ul class="price"> + <li class="headerVersion"style="background-color:#807C7C">Version {{objCompareModel2.versionDetails.vnfversion}}</li> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Config Details</li> + <li ng-repeat="(key,value) in objCompareModel2.versionDetails">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology</li> + <li ng-repeat="(key,value) in objCompareModel2.topologyInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;" ng-if="objCompareModel1.networkTopologyInfo.length>=1"> + <li class="listHeading">Network Topology</li> + <li ng-repeat="(key,value) in objCompareModel2.networkTopologyInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Operation Status</li> + <li ng-repeat="(key,value) in objCompareModel2.operationStatus">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology Identifer</li> + <li ng-repeat="(key,value) in objCompareModel2.vnfTopologyIdentifier">{{value}}</li> + <hr class="separator"> + </hr> + </div> + </ul> + </div> +</div> --> + + + +<div id = "Div1" class="VersionMain" ng-show="showResult"> + <div class="versionHeading"><img src="static/images/compare.jpg" width=25 height="25" style="margin-left:5px;"> Version Comparision Result</div> + <div class="columnsVersion"> + <ul class="price"> + <li class="headerVersion">Attributes</li> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Config Details</li> + <li ng-repeat="(key,value) in objCompareModel1.versionDetails">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF ID</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfIdInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">SERVICE STATUS</li> + <li ng-repeat="(key,value) in objCompareModel1.serviceStatusInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology Identifer</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfTopologyIdentifier">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Operation Status</li> + <li ng-repeat="(key,value) in objCompareModel1.operationStatus">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Request Info</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfRequestInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Service Info</li> + <li ng-repeat="(key,value) in objCompareModel1.serviceInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Service Request Header</li> + <li ng-repeat="(key,value) in objCompareModel1.requestHeader">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Request Information</li> + <li ng-repeat="(key,value) in objCompareModel1.requestInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology</li> + <li ng-repeat="(key,value) in objCompareModel1.topologyInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + </ul> + </div> + + <div class="columnsVersion"> + <ul class="price"> + <li class="headerVersion" style="background-color:#807C7C">Version {{objCompareModel1.versionDetails.vnfversion}}</li> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Config Details</li> + <li ng-repeat="(key,value) in objCompareModel1.versionDetails">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;" > + <li class="listHeading">VNF ID</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfIdInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">SERVICE STATUS</li> + <li ng-repeat="(key,value) in objCompareModel1.serviceStatusInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology Identifer</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfTopologyIdentifier">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Operation Status</li> + <li ng-repeat="(key,value) in objCompareModel1.operationStatus">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Request Info</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfRequestInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Service Info</li> + <li ng-repeat="(key,value) in objCompareModel1.serviceInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Service Request Header</li> + <li style="height:29px;overflow: auto;" ng-repeat="(key,value) in objCompareModel1.requestHeader">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Request Information</li> + <li ng-repeat="(key,value) in objCompareModel1.requestInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology</li> + <li style="height:29px;overflow: auto;" ng-repeat="(key,value) in objCompareModel1.topologyInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + </ul> + </div> + + <div class="columnsVersion"> + <ul class="price"> + <li class="headerVersion"style="background-color:#807C7C">Version {{objCompareModel2.versionDetails.vnfversion}}</li> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Config Details</li> + <li ng-repeat="(key,value) in objCompareModel2.versionDetails">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF ID</li> + <li ng-repeat="(key,value) in objCompareModel2.vnfIdInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">SERVICE STATUS</li> + <li ng-repeat="(key,value) in objCompareModel2.serviceStatusInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology Identifer</li> + <li ng-repeat="(key,value) in objCompareModel2.vnfTopologyIdentifier">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Operation Status</li> + <li ng-repeat="(key,value) in objCompareModel2.operationStatus">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Request Info</li> + <li ng-repeat="(key,value) in objCompareModel2.vnfRequestInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Service Info</li> + <li ng-repeat="(key,value) in objCompareModel2.serviceInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Service Request Header</li> + <li style="height:29px;overflow: auto;" ng-repeat="(key,value) in objCompareModel2.requestHeader">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Request Information</li> + <li ng-repeat="(key,value) in objCompareModel2.requestInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology</li> + <li style="height:29px;overflow: auto;" ng-repeat="(key,value) in objCompareModel2.topologyInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + </ul> + </div> + +</div>
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-deviceConfigView.html b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-deviceConfigView.html new file mode 100644 index 00000000..e9a19aa3 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-deviceConfigView.html @@ -0,0 +1,154 @@ +<!-- /* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ + --> + <div class="VersionMain" ng-show="showResult"> + <div class="versionHeading"><img src="static/images/compare.jpg" width=25 height="25" style="margin-left:5px;"> Version Comparision Result</div> + <div class="columnsVersionview"> + <ul class="price"> + <li class="headerVersion">Attributes</li> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Config Details</li> + <li ng-repeat="(key,value) in objCompareModel1.versionDetails">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF ID</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfIdInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">SERVICE STATUS</li> + <li ng-repeat="(key,value) in objCompareModel1.serviceStatusInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology Identifer</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfTopologyIdentifier">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Operation Status</li> + <li ng-repeat="(key,value) in objCompareModel1.operationStatus">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Request Info</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfRequestInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Service Info</li> + <li ng-repeat="(key,value) in objCompareModel1.serviceInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Service Request Header</li> + <li ng-repeat="(key,value) in objCompareModel1.requestHeader">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Request Information</li> + <li ng-repeat="(key,value) in objCompareModel1.requestInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology</li> + <li ng-repeat="(key,value) in objCompareModel1.topologyInfo">{{key}}</li> + <hr class="separator"> + </hr> + </div> + </ul> + </div> + <div class="columnsVersionview"> + <ul class="price"> + <li class="headerVersion" style="background-color:#807C7C">Version {{objCompareModel1.versionDetails.vnfversion}}</li> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Config Details</li> + <li ng-repeat="(key,value) in objCompareModel1.versionDetails">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;" > + <li class="listHeading">VNF ID</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfIdInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">SERVICE STATUS</li> + <li ng-repeat="(key,value) in objCompareModel1.serviceStatusInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology Identifer</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfTopologyIdentifier">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Operation Status</li> + <li ng-repeat="(key,value) in objCompareModel1.operationStatus">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Request Info</li> + <li ng-repeat="(key,value) in objCompareModel1.vnfRequestInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Service Info</li> + <li ng-repeat="(key,value) in objCompareModel1.serviceInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Service Request Header</li> + <li style="height:29px;overflow: auto;" ng-repeat="(key,value) in objCompareModel1.requestHeader">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">Request Information</li> + <li ng-repeat="(key,value) in objCompareModel1.requestInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + <div style="background-color:#E1E0DA;"> + <li class="listHeading">VNF Topology</li> + <li style="height:29px;overflow: auto;" ng-repeat="(key,value) in objCompareModel1.topologyInfo">{{value}}</li> + <hr class="separator"> + </hr> + </div> + </ul> + </div> + +</div>
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-validationTest.html b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-validationTest.html new file mode 100644 index 00000000..0bf39f66 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-validationTest.html @@ -0,0 +1,135 @@ +<!-- /* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ + --> +<div class="testMain"> + <div class="heading"><img src="static/images/validation.png" width=30 height="30" style="margin-left:5px;"> Pre-test/Certification</div> + <form name="reportForm"> + <div growl></div> + <div class="row"> + <div class="column testCol"> + <label class="labeltext">Specify IP Address</label> + </div> + <div class="column" style="background-color:#f2f2f2;width:50%;margin-left:0px;"> + <input type="text" ng-model="IPAddress" name="IPAddress" style="margin-left:5px;width:170px;" ng-ip-address placeholder='255.255.255.255' required></input> + <div role="alert"> + <span class="error" ng-show="reportForm.IPAddress.$error.required">Required!</span> + </div> + <div role="alert"> + <span class="error" ng-if="reportForm.IPAddress.$invalid">Not a valid IPAddress!</span> + </div> + <div role="alert"> + <span class="error" ng-if="reportForm.IPAddress.pattern">Not a valid IPAddress!</span> + </div> + </div> + </div> + <div class="row"> + <div class="column testCol"> + <label class="labeltext">Specify Host Name</label> + </div> + <div class="column" style="background-color:#f2f2f2;width:50%;margin-left:0px;"> + <input type="text" ng-model="HostName" name="HostName" style="margin-left:5px;width:170px;" required ng-pattern="hostNamePattern"></input> + <div role="alert"> + <span class="error" ng-show="reportForm.HostName.$error.required">Required!</span> + </div> + <div role="alert"> + <span class="error" ng-show="reportForm.HostName.$invalid">Not a valid HostName!</span> + </div> + </div> + </div> + <div class="row"> + <div class="column" style="width:25%;background-color:#f2f2f2;height:45px;margin-left:35px;"> + <label class="labeltext">Select Certification</label> + </div> + <div class="column" style="background-color:#f2f2f2;width:50%;height:45px;margin-left:0px;"> + <label ng-repeat="val in validationTestList" class="labeltext" style="margin-right:35px;"> + <input type="checkbox" ng-model="val.Selected" class="check" ng-change="updateSelection($index,validationTestList,val.validationType);">{{val.validationType}}</input> + </label> + </div> + </div> + <!--<hr style="border-color:darkGrey;">--> + <div class="row"> + <div class="column btnRunTest"> + <input type="submit" ng-click="runTest()" value="Run PreTest" id="btnSubmit" ng-disabled="showError" style="margin-left:0px;"/> + </div> + </div> + + <table class="tableDisplay" ng-show="ShowResult" id="tableToExport" style="margin-left:10px;width:1000px;"> + <tr class="first_row"> + <th>SNo. + </th> + <th colspan="2" style="text-align:center;">TestName + </th> + <th>Device IP + </th> + <th>Status + </th> + <th style="width:20%;">Statistics (%Loss)</th> + <th style="width:20%;">Average Time (ms)</th> + <th>Result + </th> + </tr> + <tr ng-repeat="test in objPreTest"> + <td>{{$index+1}} + </td> + <td><img src="{{(test.testtype=='Network Layer') ? 'static/images/images.png': 'static/images/protocol.png'}}" width=40 height=30 ></img></td> + <td>{{test.testtype}} + </td> + <td>{{test.ipaddress}} + </td> + <td>{{test.status | uppercase}} + </td> + <td> + <div ng-show="test.testtype =='Network Layer'" class="w3-light-grey"> + <div ng-show=test.statistics!=null class="w3-container w3-red w3-center" style="width:{{test.statisticPer}}%">{{test.statistics}}% Loss + </div> + <div ng-show=test.statistics==null class="w3-orange w3-center" style="width:{{test.statisticPer}}%">No Statistics Recorded + </div> + </div> + <div ng-show="test.testtype =='Protocol Layer'"> + <img src='static/images/router.png' width=30 height=30 style="margin-bottom:10px;"></img> + <span class="{{(test.status == 'unreachable') ? 'arrowRed':'arrowGreen'}}">→</span><span class="{{(test.status == 'unreachable') ? 'arrowRed':'arrowGreen'}}">→</span><span class="{{(test.status == 'unreachable') ? 'arrowRed':'arrowGreen'}}">→ + <img src='static/images/router.png' width=30 height=30 ></img> + </div> + </td> + <td> + <div ng-show="test.testtype =='Network Layer'" class="w3-light-grey"> + <div ng-show=test.avgTime!=null class="w3-container w3-green w3-center" style="width:{{test.avgTimePer}}%">{{test.avgTime}} ms</div> + <div ng-show=test.statistics==null class="w3-blue w3-center" style="width:{{test.statisticPer}}%">No AvgTime Recorded + </div> + </div> + </td> + <td><img src="{{(test.status=='reachable') ? 'static/images/success.png': 'static/images/FailImage.png'}}" width=30 height=25></img> + </td> + </tr> + </table> + <div class="row"> + <div class="column" style="margin-top:10px;width:800px;" ng-show="ShowResult"> + <span class='arrowRed'>→</span> + <label class="labeltext">UnReachable</label> + <span class='arrowGreen'>→</span> + <label class="labeltext">Reachable</label> + <span><img src='static/images/success.png' width=30 height=25></span> + <label class="labeltext">Pass</label> + <span><img src='static/images/FailImage.png' width=30 height=25></span> + <label class="labeltext">Fail</label> + </div> + </div> + </form> +</div>
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-versionCompare.html b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-versionCompare.html new file mode 100644 index 00000000..182c31fc --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-versionCompare.html @@ -0,0 +1,59 @@ +<!-- /* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ + --> +<div class="VersionMain"> + <div class="versionHeading"><img src="images/compare.jpg" width=25 height="25" style="margin-left:5px;"> Version Comparision Result</div> + + <div class="columnsVersion"> + <ul class="price"> + <li class="headerVersion">Basic</li> + <li class="grey">$ 9.99 / year</li> + <li>10GB Storage</li> + <li>10 Emails</li> + <li>10 Domains</li> + <li>1GB Bandwidth</li> + <li class="grey"><a href="#" class="button">Sign Up</a></li> + </ul> +</div> + +<div class="columnsVersion"> + <ul class="price"> + <li class="headerVersion" style="background-color:#4CAF50">Pro</li> + <li class="grey">$ 24.99 / year</li> + <li>25GB Storage</li> + <li>25 Emails</li> + <li>25 Domains</li> + <li>2GB Bandwidth</li> + <li class="grey"><a href="#" class="button">Sign Up</a></li> + </ul> +</div> + +<div class="columnsVersion"> + <ul class="price"> + <li class="headerVersion">Premium</li> + <li class="grey">$ 49.99 / year</li> + <li>50GB Storage</li> + <li>50 Emails</li> + <li>50 Domains</li> + <li>5GB Bandwidth</li> + <li class="grey"><a href="#" class="button">Sign Up</a></li> + </ul> +</div> + </div>
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-viewReport.html b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-viewReport.html new file mode 100644 index 00000000..d4841ad5 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-viewReport.html @@ -0,0 +1,90 @@ +<!-- /* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ + --> +<div class="ReportMain"> + <div class="heading"> + <img src="static/images/search.png" width=50 height="40" + style="margin-left: 5px;"> Search For Vnf Reports + </div> + <form name="myForm" style="background-color: #f2f2f2;"> + <div growl></div> + <div class="row"> + <div class="column" style="width: 40%;"> + <label for="exampleInput" class="labeltext">Start Date</label> <input + type="date" id="exampleInput" name="input" + ng-model="startdate.value" placeholder="yyyy-MM-dd" + style="margin-left: 20px; width: 170px;" required /> + <div role="alert"> + <span class="error" ng-show="myForm.input.$error.required">Required!</span> + <span class="error" ng-show="myForm.input.$error.date">Not a + valid date!</span> + </div> + </div> + <div class="column" style="margin-left: 0px; width: 50%;"> + <label for="exampleEndInput" class="labeltext">End Date</label> <input + type="date" id="exampleEndInput" name="input" + ng-model="enddate.value" placeholder="yyyy-MM-dd" + style="margin-left: 20px; width: 170px;" required /> + <div role="alert"> + <span class="error" ng-show="myForm.input.$error.required"> + Required!</span> <span class="error" ng-show="myForm.input.$error.date"> + Not a valid date!</span> + </div> + </div> + </div> + <br> + <div class="row"> + <input type="submit" id="btnSubmit" + ng-click="getReports(startdate.value,enddate.value)" + style="width: 120px;"> + </div> + + <table class="tableDisplay" + style="text-align: center;" ng-show="showresult" id="tableToExport"> + <tr class="first_row"> + <th style="text-align: center;">SNo.</th> + <th style="text-align: center;">Time Period</th> + <th style="text-align: center;">Vnf Name</th> + <th style="text-align: center;">Vnf Id</th> + </tr> + <tr ng-repeat="version in pagedItems[currentPage] | orderBy:sort.sortingOrder:sort.reverse"> + <td>{{ ($index + 1) + (currentPage - 1) * itemsPerPage + 5}}</td> + <td>{{version.createdAt}}</td> + <td>{{version.vnfname }}</td> + <td>{{version.vnfid}}</td> + </tr> + <td colspan="4"> + <!-- ng-show="pagedItems.length > 5" --> + <ul class="pagination pull-right"> + <li ng-class="{disabled: currentPage == 0}"><a href + ng-click="prevPage()">«</a></li> + <li ng-repeat="n in range(pagedItems.length, currentPage, currentPage + gap) " + ng-class="{active: n == currentPage}" ng-click="setPage()"><a + href ng-bind="n + 1">1</a></li> + <li ng-class="{disabled: (currentPage) == pagedItems.length - 1}"> + <a href ng-click="nextPage()">»</a> + </li> + </ul> + </td> + </table> + </form> +</div> +</body> +</html>
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-viewReportById.html b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-viewReportById.html new file mode 100644 index 00000000..b4eec391 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/form-viewReportById.html @@ -0,0 +1,122 @@ +<!-- /* + * ============LICENSE_START======================================================= + * ONAP : SDNC-FEATURES + * ================================================================================ + * Copyright 2018 TechMahindra + *================================================================================= + * 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========================================================= + */ + --> +<div class="ReportMain"> + <div class="heading"> + <img src="static/images/search.png" width=50 height="40" + style="margin-left: 5px;"> Search For Vnf Reports + </div> + <form name="myForm" style="background-color: #f2f2f2;padding:20px 15px;"> + <div growl></div> + + <div class="row"> + <div class="column" + style="width: 20%; background-color: #f2f2f2; height: 35px; margin-left: 35px;"> + <label class="labeltext">Select Avaliable VNF</label> + </div> + <div class="column" + style="background-color: #f2f2f2; width: 45%; height: 55px; margin-left: 0px;"> + <select class="form-control" style="width: 100%; margin-top: 0px;" + name="select" ng-model="selectedValueVnf" + ng-change=selectVnf(selectedValueVnf) required> + <option ng-repeat="vnf in objvnfList" value="{{vnf.vnfid}}">VnfId- + {{vnf.vnfid}} VnfName- {{vnf.vnfname}}</option> + <option value="">Select VNF</option> + </select> + <div role="alert"> + <span class="error" ng-show="myForm.select.$error.required"> + Required!</span> + </div> + </div> + </div> + + <div class="row" ng-show="ShowResult"> + <div class="column" style="margin-left: 13px; width: 40%;"> + <label for="exampleInput" class="labeltext">Start Date</label> <input + type="date" id="exampleInput" name="input" + ng-model="startdate.value" placeholder="yyyy-MM-dd" + style="margin-left: 20px; width: 170px;" required /> + <div role="alert"> + <span class="error" ng-show="myForm.input.$error.required"> + Required!</span> <span class="error" ng-show="myForm.input.$error.date"> + Not a valid date!</span> + </div> + </div> + + <div class="column" style="margin-left: 0px; width: 50%;"> + <label for="exampleEndInput" class="labeltext">End Date</label> <input + type="date" id="exampleEndInput" name="input" + ng-model="enddate.value" placeholder="yyyy-MM-dd" + style="margin-left: 20px; width: 170px;" required /> + <div role="alert"> + <span class="error" ng-show="myForm.input.$error.required"> + Required!</span> <span class="error" ng-show="myForm.input.$error.date"> + Not a valid date!</span> + </div> + </div> + <br> + <div class="column"> + <input type="submit" id="btnSubmit" + ng-click="getReportsById(selectedValueVnf,startdate.value,enddate.value)" + style="width: 120px;"> + </div> + + </div> + <br> + <div class="row" ng-show="showresult"> + <div class="column" + style="width: 80%; background-color: #f2f2f2; height: 35px; margin-left: 35px; font-size: 14px;font-weight:500;color:#1B4F72;"> + Vnfid: {{selectedValueVnf}} + </div> + </div> + <br> + <div> + <table class="tableDisplay" + style="text-align: center;" ng-show="showresult" id="tableToExport"> + <tr class="first_row"> + <th style="text-align: center;">SNo.</th> + <th style="text-align: center;">Time Period</th> + <th style="text-align: center;">Vnf Name</th> + <th style="text-align: center;">Version No.</th> + </tr> + <tr ng-repeat="version in pagedItems[currentPage] | orderBy:sort.sortingOrder:sort.reverse"> + <td>{{ ($index + 1) + (currentPage - 1) * itemsPerPage + 5}}</td> + <td>{{version.createdAt}}</td> + <td>{{version.vnfname }}</td> + <td>{{version.versionNo}}</td> + </tr> + <td colspan="4"> + <ul class="pagination pull-right"> + <li ng-class="{disabled: currentPage == 0}"><a href + ng-click="prevPage()">«</a></li> + <li ng-repeat="n in range(pagedItems.length, currentPage, currentPage + gap) " + ng-class="{active: n == currentPage}" ng-click="setPage()"><a + href ng-bind="n + 1">1</a></li> + <li ng-class="{disabled: (currentPage) == pagedItems.length - 1}"> + <a href ng-click="nextPage()">»</a> + </li> + </ul> + </td> + </table> + </div> + </form> +</div> +</body> +</html>
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/header.html b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/header.html new file mode 100644 index 00000000..23851589 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/header.html @@ -0,0 +1,3 @@ +<div class="header"> + <p style="margin-left:20px;"> ONAP Certification Test Page </p> +</div> diff --git a/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/tabs.html b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/tabs.html new file mode 100644 index 00000000..178a8180 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/main/webapp/static/views/tabs.html @@ -0,0 +1,25 @@ +<div> +<nav role="navigation" class="navbar navbar-default" style="margin-top:10px;"> + <div class="navbar-header" style="background-color:#ffe0b3;font-size: 15px;font-weight: bold;color:black;"> + <ul class="nav navbar-nav"> + <li><div class="dropdown"> + <button class="dropbtn" style="padding-right:40px;padding-left: 30px; ">VIEW ALL REPORTS</button> + <div class="dropdown-content"> + <a ng-href="#testReports">Search Vnf Reports</a> + <a ng-href="#testReportsById">Search Vnf Reports By ID</a> + </div> + </div> + <li><div class="dropdown"> + <button class="dropbtn">DEVICE CONFIGRUATION</button> + <div class="dropdown-content"> + <a ng-href="#deviceConfig">Backup Config</a> + <a ng-href="#applyConfig">Apply Config</a> + <a ng-href="#compareConfig">Compare Config</a> + </div> + </div> + </li> + + </ul> + </div> +</nav> +</div>
\ No newline at end of file diff --git a/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/model/VnfConfigDetailsDBTest.java b/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/model/VnfConfigDetailsDBTest.java new file mode 100644 index 00000000..38973235 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/model/VnfConfigDetailsDBTest.java @@ -0,0 +1,62 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.model; + +import static org.junit.Assert.assertEquals; + +import java.sql.Timestamp; + +import org.junit.Test; + +import com.onap.sdnc.vnfbackupservice.model.VnfConfigDetailsDB; + +public class VnfConfigDetailsDBTest { + + @Test + public void configDetailsDbTest() { + + long millis = System.currentTimeMillis(); + Timestamp date = new java.sql.Timestamp(millis); + String configinfo = "configifo"; + Timestamp creationDate = date; + Timestamp lastupdated = date; + int status = 1; + String vnfid = "vnfId"; + String vnfname = "vnfname"; + String vnfversion = "Version-1"; + + VnfConfigDetailsDB vnfConfigDetailsDB = new VnfConfigDetailsDB(); + vnfConfigDetailsDB.setVnfid(vnfid); + vnfConfigDetailsDB.setConfiginfo(configinfo); + vnfConfigDetailsDB.setCreationdate(creationDate); + vnfConfigDetailsDB.setLastupdated(lastupdated); + vnfConfigDetailsDB.setStatus(status); + vnfConfigDetailsDB.setVnfname(vnfname); + vnfConfigDetailsDB.setVnfversion(vnfversion); + + assertEquals(vnfid, vnfConfigDetailsDB.getVnfid()); + assertEquals(configinfo, vnfConfigDetailsDB.getConfiginfo()); + assertEquals(creationDate, vnfConfigDetailsDB.getCreationdate()); + assertEquals(lastupdated, vnfConfigDetailsDB.getLastupdated()); + assertEquals(status, vnfConfigDetailsDB.getStatus()); + assertEquals(vnfname, vnfConfigDetailsDB.getVnfname()); + assertEquals(vnfversion, vnfConfigDetailsDB.getVnfversion()); + } +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/model/VnfConfigSchedulerTimeStampTest.java b/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/model/VnfConfigSchedulerTimeStampTest.java new file mode 100644 index 00000000..ee6d5326 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/model/VnfConfigSchedulerTimeStampTest.java @@ -0,0 +1,39 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.model; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class VnfConfigSchedulerTimeStampTest { + + @Test + public void vnfConfSchedulerTimeTest() { + String time="12:00"; + int id=1; + + VnfConfigSchedulerTimeStamp vcst= new VnfConfigSchedulerTimeStamp(); + vcst.setBackuptime(time); + vcst.setId(id); + assertEquals(time, vcst.getBackuptime()); + assertEquals(id, vcst.getId()); + } +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/scheduler/VnfConfigBackupSchedulerTest.java b/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/scheduler/VnfConfigBackupSchedulerTest.java new file mode 100644 index 00000000..9308eeb8 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/scheduler/VnfConfigBackupSchedulerTest.java @@ -0,0 +1,85 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.scheduler; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import com.onap.sdnc.vnfbackupservice.model.VnfDisplayParams; +import com.onap.sdnc.vnfbackupservice.model.VnfServiceResponse; +import com.onap.sdnc.vnfbackupservice.scheduler.VnfConfigBackupScheduler; +import com.onap.sdnc.vnfbackupservice.service.VnfbackupServiceImpl; + +public class VnfConfigBackupSchedulerTest { + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @Mock + VnfbackupServiceImpl vnfbackupServiceImpl; + + @InjectMocks + VnfConfigBackupScheduler vnfconfigBackScheduler; + + @Test + public void initiateBackupServiceTest() { + + String backuptime="timeee"; + String vnfId = "vnfid"; + String vnfName = "vnfname"; + VnfDisplayParams vnfDisplayParams = new VnfDisplayParams(); + vnfDisplayParams.setVnfId(vnfId); + vnfDisplayParams.setVnfName(vnfName); + + VnfServiceResponse vnfServiceResponse = new VnfServiceResponse(); + + List<VnfDisplayParams> vnfdisplaylist = new ArrayList<VnfDisplayParams>(); + vnfdisplaylist.add(vnfDisplayParams); + vnfServiceResponse.setVnfDisplayList(vnfdisplaylist); + + when(vnfbackupServiceImpl.getAllVnfDetails()).thenReturn(vnfServiceResponse); + when(vnfconfigBackScheduler.initiateBackupService()).thenReturn(backuptime); + + vnfconfigBackScheduler.initiateBackupService(); + } + + @Test + public void invokebackupTest() { + + String vnfId="vnfid"; + VnfConfigBackupScheduler vnfConBackSch= mock(VnfConfigBackupScheduler.class); + when(vnfConBackSch.invokeDetails(vnfId)).thenReturn(vnfId); + assertEquals(vnfId, vnfConBackSch.invokeDetails(vnfId)); + vnfConBackSch.invokeDetails(vnfId); + } + +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/scheduler/VnfRestClientTest.java b/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/scheduler/VnfRestClientTest.java new file mode 100644 index 00000000..29b1c0f0 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/scheduler/VnfRestClientTest.java @@ -0,0 +1,62 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.scheduler; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.junit.Test; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import mockit.Mock; +import mockit.MockUp; + + +public class VnfRestClientTest { + + String url = "/restconf/config/VNF-API:vnfs"; + String userName = "abc"; + String password = "abc"; + + @Test + public void restClientTest() { + + new MockUp<RestTemplate>() { + @SuppressWarnings("unchecked") + @Mock + public <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, + Class<T> responseType, Object... uriVariables) throws RestClientException { + ResponseEntity<String> str = new ResponseEntity<String>(HttpStatus.ACCEPTED); + return (ResponseEntity<T>) str; + } + }; + VnfRestClient vnfRestClientmock = mock(VnfRestClient.class); + when(vnfRestClientmock.vnfRestClient(url, userName, password)).thenReturn("successfully mocked"); + + VnfRestClient vnfRestClient =new VnfRestClient(); + vnfRestClient.vnfRestClient(url, userName, password); + + } +} diff --git a/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/service/VnfbackupServiceImplTest.java b/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/service/VnfbackupServiceImplTest.java new file mode 100644 index 00000000..3428bce9 --- /dev/null +++ b/configbackuprestore/vnfconfigbackupservice/src/test/java/com/onap/sdnc/vnfbackupservice/service/VnfbackupServiceImplTest.java @@ -0,0 +1,150 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* 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========================================================= +*/ +package com.onap.sdnc.vnfbackupservice.service; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import com.onap.sdnc.vnfbackupservice.dao.VnfBackupServiceRepo; +import com.onap.sdnc.vnfbackupservice.model.VnfConfigDetailsDB; +import com.onap.sdnc.vnfbackupservice.scheduler.VnfRestClient; +import com.onap.sdnc.vnfbackupservice.service.VnfbackupServiceImpl; + +public class VnfbackupServiceImplTest { + + @Mock + VnfBackupServiceRepo vrepo; + + @Mock + private RestTemplate rTemplate; + + @Mock + private VnfRestClient vnfclient; + + @InjectMocks + VnfbackupServiceImpl vnfserviceimpl; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + } + + String json = "{\r\n" + " \"vnfs\": {\r\n" + " \"vnf-list\": [\r\n" + " {\r\n" + + " \"vnf-id\": \"f24ae4f1-ed6b-4f8b-9ad6-4110a6fe26e7\",\r\n" + + " \"service-data\": {\r\n" + " \"vnf-request-information\": {\r\n" + + " \"vnf-name\": \"vDNS-Techm_vIMS_vnf_1\"\r\n" + " },\r\n" + + " \"service-status\": { \r\n" + " \"response-code\": \"200\"\r\n" + + " }},\r\n" + " \"service-status\": { \r\n" + + " \"response-code\": \"200\"\r\n" + " }\r\n" + " }\r\n" + " \r\n" + + " ]\r\n" + " }\r\n" + " }"; + + String url = "http://localhost:8023/test/api/foos"; + String vnfId="vnfid"; + String userName = "abc"; + String password = "abc"; + String configfile="config"; + String vnfversion = "Version-1"; + String jsonInput="jsoninput"; + String vnfName = "vnfname"; + + long millis = System.currentTimeMillis(); + Timestamp date = new java.sql.Timestamp(millis); + String configinfo =json; + Timestamp creationDate = date; + Timestamp lastupdated = date; + int status = 1; + String vnfname = "vnfname"; + + @Test + public void parseConfigTest() { + VnfbackupServiceImpl vnfbackupServiceImpl = new VnfbackupServiceImpl(); + vnfbackupServiceImpl.parseVnfConfigDetails(json); + assertTrue(true); + } + + @Test() + public void backupVnfconfigTest() + { + HttpHeaders headers = new HttpHeaders(); + HttpHeaders headers1= new HttpHeaders(); + + headers1.setAccept(Arrays.asList(new MediaType[] { MediaType.APPLICATION_JSON })); + headers1.setContentType(MediaType.APPLICATION_JSON); + String base64Username = userName + ":" + password; + byte[] message = base64Username.getBytes(); + headers1.set("Authorization", "Basic " + java.util.Base64.getEncoder().encodeToString(message)); + + when(vnfclient.generateHeaders(headers, userName, password)).thenReturn(headers1); + + ResponseEntity<String> entity = new ResponseEntity<String>(HttpStatus.OK); + + when(rTemplate.exchange(url, HttpMethod.GET, entity, String.class)).thenReturn(entity) ; + + when(vnfclient.vnfRestClient(url, userName, password)).thenReturn(json); + + VnfConfigDetailsDB vnfConfigDetailsDB = new VnfConfigDetailsDB(); + vnfConfigDetailsDB.setVnfid(vnfId); + vnfConfigDetailsDB.setConfiginfo(configinfo); + vnfConfigDetailsDB.setCreationdate(date); + vnfConfigDetailsDB.setLastupdated(date); + vnfConfigDetailsDB.setStatus(status); + vnfConfigDetailsDB.setVnfname(vnfname); + vnfConfigDetailsDB.setVnfversion(vnfversion); + + when(vrepo.getVnfDetail(vnfId)).thenReturn(vnfConfigDetailsDB); + + List<VnfConfigDetailsDB> listvnfconfdb= new ArrayList<VnfConfigDetailsDB>(); + + when(vrepo.getVnfDetails(vnfId)).thenReturn(listvnfconfdb); + + doNothing().when(vrepo).saveVnfDetails(configinfo, creationDate, lastupdated, status, vnfId, vnfname, vnfversion); + + vnfserviceimpl.backupVnfconfig(vnfId); + + assertEquals("success", vnfserviceimpl.backupVnfconfig(vnfId)); + } + + @Test + public void updatedBackuptimeTest() { + String sdtime="12:00"; + when(vrepo.getvnfschedulertime()).thenReturn(sdtime); + vnfserviceimpl.updatedBackuptime(); + } + +} |