junos-ex-conf-routing-instances

Junos routing-instances configuration module

  • Version: 2019-01-01

    junos-ex-conf-routing-instances@2019-01-01


    
      module junos-ex-conf-routing-instances {
    
        yang-version 1;
    
        namespace
          "http://yang.juniper.net/junos-ex/conf/routing-instances";
    
        prefix jc-routing-instances;
    
        import junos-common-ddl-extensions {
          prefix junos;
          revision-date "2019-01-01";
        }
        import junos-common-types {
          prefix jt;
          revision-date "2019-01-01";
        }
        import junos-ex-conf-root {
          prefix jc;
          revision-date "2019-01-01";
        }
    
        organization "Juniper Networks, Inc.";
    
        contact "yang-support@juniper.net";
    
        description
          "Junos routing-instances configuration module";
    
        revision "2019-01-01" {
          description "Junos: 21.3R1.9";
        }
    
    
        augment /jc:configuration {
          uses routing-instances-group;
        }
    
        augment /jc:configuration/jc:groups {
          uses routing-instances-group;
        }
    
        grouping routing-instances-group {
          container routing-instances {
            description
              "Routing instance configuration";
            uses apply-advanced;
    
            list instance {
              key "name";
              uses juniper-routing-instance;
            }  // list instance
          }  // container routing-instances
        }  // grouping routing-instances-group
    
        grouping apply-advanced {
          description
            "Apply advanced configuration logic";
          leaf-list apply-groups {
            type string;
            ordered-by user;
            description
              "Groups from which to inherit configuration data";
          }
    
          leaf-list apply-groups-except {
            type string;
            ordered-by user;
            description
              "Don't inherit configuration data from these groups";
          }
    
          list apply-macro {
            key "name";
            ordered-by user;
            description
              "Macro and parameters for commit script expansion";
            uses apply-macro-type;
          }  // list apply-macro
        }  // grouping apply-advanced
    
        grouping apply-macro-type {
          description
            "Macro data for commit-script expansion";
          leaf name {
            type string;
            description
              "Name of the macro to be expanded";
          }
    
          list data {
            key "name";
            uses macro-data-type;
          }  // list data
        }  // grouping apply-macro-type
    
        grouping juniper-routing-instance {
          description "Routing instance";
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description "Routing instance name";
          }
    
          uses apply-advanced;
    
          leaf instance-type {
            type enumeration {
              enum "virtual-switch" {
                value 0;
                description
                  "Virtual switch routing instance";
              }
              enum "layer2-control" {
                value 1;
                description
                  "Layer 2 control protocols";
              }
              enum "mac-vrf" {
                junos:must "((".. bridge-domains" || ".. vlans"))";
                junos:must-message "bridge-domains must be configured for mac-vrf instance";
                junos:must "(".. service-type")";
                junos:must-message "service-type must be configured for mac-vrf instance";
                junos:must "("routing-instances ${instance} protocols evpn")";
                junos:must-message "Protocol EVPN must be configured in the mac-vrf instance";
                value 2;
                description
                  "MAC-VRF routing instance";
              }
              enum "forwarding" {
                value 3;
                description
                  "Forwarding instance";
              }
              enum "no-forwarding" {
                value 4;
                description
                  "Nonforwarding instance";
              }
              enum "l2vpn" {
                value 5;
                description
                  "Layer 2 VPN routing instance";
              }
              enum "vpls" {
                value 6;
                description
                  "VPLS routing instance";
              }
              enum "virtual-router" {
                value 7;
                description
                  "Virtual routing instance";
              }
              enum "l2backhaul-vpn" {
                junos:must "(".. instance-role")";
                junos:must-message "'instance-role' statement must be configured for l2backhaul-vpn instance";
                junos:must "(".. no-local-switching")";
                junos:must-message "'no-local-switching' statement must be configured for l2backhaul-vpn instance";
                junos:must "(".. vlan-model")";
                junos:must-message "'vlan-model' statement must be configured for l2backhaul-vpn instance";
                value 8;
                description
                  "L2Backhaul/L2Wholesale routing instance";
              }
              enum "mpls-internet-multicast" {
                junos:must "(("protocols pim" || ".. provider-tunnel inter-region"))";
                junos:must-message "Protocol PIM must be configured in the master instance";
                value 9;
                description
                  "Internet Multicast over MPLS routing instance";
              }
              enum "evpn" {
                junos:must "("routing-instances ${instance} protocols evpn")";
                junos:must-message "Protocol EVPN must be configured in the evpn instance";
                value 10;
                description
                  "EVPN routing instance";
              }
              enum "mpls-forwarding" {
                value 11;
                description
                  "Routing instance provides a MPLS forwarding-context";
              }
              enum "evpn-vpws" {
                junos:must "("routing-instances ${instance} protocols evpn")";
                junos:must-message "Protocol EVPN must be configured in the evpn-vpws instance";
                value 12;
                description
                  "EVPN VPWS routing instance";
              }
              enum "vrf" {
                value 13;
                description
                  "Virtual routing forwarding instance";
              }
            }
            description
              "Type of routing instance";
          }
    
          container l2vpn-id {
            description
              "Layer-2 vpn-id for this instance";
            uses apply-advanced;
    
            leaf community {
              junos:must "(!(".. .. protocols vpls neighbor"))";
              junos:must-message "Does not support FEC129 LDP-VPLS and BGP-VPLS/FEC128-LDP-VPLS under the default mesh-group";
              junos:must "(!(".. .. protocols vpls vpls-id"))";
              junos:must-message "Does not support FEC129 LDP-VPLS and BGP-VPLS/FEC128-LDP-VPLS under the default mesh-group";
              junos:must "(!(".. .. protocols vpls site"))";
              junos:must-message "Does not support FEC129 LDP-VPLS and BGP-VPLS/FEC128-LDP-VPLS under the same instance";
              junos:must "(!(".. .. protocols vpls site-range"))";
              junos:must-message "site-range is not supported for FEC129 LDP VPLS";
              junos:must "(!(".. .. protocols vpls mac-flush"))";
              junos:must-message "mac-flush is not supported for FEC129 LDP VPLS";
              junos:must "(!(".. .. protocols vpls label-block-size"))";
              junos:must-message "label-block-size is not supported for FEC129 LDP VPLS";
              junos:must "(!(".. .. protocols vpls connectivity-type"))";
              junos:must-message "connectivity-type is not supported for FEC129 LDP VPLS";
              junos:must "(!(".. .. protocols vpls community"))";
              junos:must-message "community is not supported for FEC129 LDP VPLS";
              junos:must "(!(".. .. provider-tunnel"))";
              junos:must-message "provider-tunnel is not supported for FEC129 LDP VPLS/VPWS";
              type string {
                junos:posix-pattern "^(l2vpn-id)+:[0-9.]+:[0-9]+$";
                junos:pattern-message "Use format 'l2vpn-id:x:y' where 'x' is 2 byte AS number, or an IP address and 'y' is a number. e.g. l2vpn-id:1:100, l2vpn-id:1.2.3.4:100";
              }
              description
                "L2VPN ID community for FEC129 VPLS/VPWS with BGP auto-discovery";
            }
          }  // container l2vpn-id
    
          container routing-options {
            description
              "Protocol-independent routing option configuration";
            uses juniper-routing-options;
          }  // container routing-options
    
          container egress-protection {
            description
              "Egress instance protection";
            uses apply-advanced;
    
            leaf protector {
              junos:must "(any "protocols mpls egress-protection context-identifier <*> protector")";
              junos:must-message "context-identifier must be type protector";
              type empty;
              description
                "Enable Edge Protector functionality for this VPN";
            }
    
            container context-identifier {
              description "Context identifier";
              uses apply-advanced;
    
              leaf context-id {
                junos:must "("protocols mpls egress-protection context-identifier $$ primary")";
                junos:must-message "context-identifier must be type primary";
                junos:must "("protocols mpls egress-protection context-identifier $$")";
                junos:must-message "same context-identifier must be defined in protocols mpls egress-protection";
                type jt:ipv4addr;
                description "IP address";
              }
            }  // container context-identifier
          }  // container egress-protection
    
          container protocols {
            junos:must "((!(". pim") || (".. instance-type" && !(".. instance-type no-forwarding"))))";
            junos:must-message "pim configuration is not allowed for 'instance-type no-forwarding'";
            description
              "Routing protocol configuration";
            uses apply-advanced;
    
            container bfd {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "bfd configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "bfd configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "bfd configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "bfd configuration is not allowed for 'instance-type virtual-switch'";
              presence "enable bfd";
              uses juniper-ri-protocols-bfd;
            }  // container bfd
    
            container igmp-snooping {
              junos:must "((".. .. instance-type vpls" || (".. .. instance-type evpn" || (".. .. instance-type mac-vrf" || ".. .. instance-type virtual-switch"))))";
              junos:must-message "igmp-snooping configuration is allowed only for 'instance-type vpls/virtual-switch/evpn/mac-vrf'";
              junos:must "(!(".. pim-snooping"))";
              junos:must-message "igmp-snooping configuration do not co-exist with pim-snooping";
              junos:must "((".. .. instance-type vpls" || (".. .. instance-type evpn" || (".. .. instance-type mac-vrf" || (".. .. instance-type virtual-switch " && !(".. vpls"))))))";
              junos:must-message "igmp-snooping configuration is allowed only for 'instance-type vpls/evpn/mac-vrf or instance-type virtual-switch without vpls'";
              presence "enable igmp-snooping";
              description
                "IGMP snooping configuration";
              uses juniper-ri-protocols-igmp-snooping;
            }  // container igmp-snooping
    
            container mld-snooping {
              junos:must "((".. .. instance-type vpls" || (".. .. instance-type evpn" || ".. .. instance-type virtual-switch")))";
              junos:must-message "mld-snooping configuration is allowed only for 'instance-type vpls/virtual-switch/evpn'";
              junos:must "((".. .. instance-type vpls" || (".. .. instance-type evpn" || (".. .. instance-type mac-vrf" || (".. .. instance-type virtual-switch " && !(".. vpls"))))))";
              junos:must-message "mld-snooping configuration is allowed only for 'instance-type vpls/evpn/mac-vrf or instance-type virtual-switch without vpls'";
              presence "enable mld-snooping";
              description
                "MLD snooping configuration";
              uses juniper-ri-protocols-mld-snooping;
            }  // container mld-snooping
    
            container amt {
              junos:must "(!(".. .. instance-type no-forwarding"))";
              junos:must-message "amt configuration is not allowed for 'instance-type no-forwarding'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "amt configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "amt configuration is not allowed for 'instance-type virtual-switch'";
              description
                "AMT relay configuration";
              uses juniper-protocols-amt;
            }  // container amt
    
            container bgp {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "bgp configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "bgp configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "bgp configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "bgp configuration is not allowed for 'instance-type virtual-switch'";
              description "BGP options";
              uses juniper-protocols-bgp;
            }  // container bgp
    
            container router-discovery {
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "This configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "This configuration is not allowed for 'instance-type virtual-switch'";
              description
                "ICMP router discovery options";
              uses juniper-protocols-router-discovery;
            }  // container router-discovery
    
            container isis {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "isis configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "isis configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "isis configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "isis configuration is not allowed for 'instance-type virtual-switch'";
              description "IS-IS configuration";
              uses juniper-protocols-isis;
            }  // container isis
    
            container l2vpn {
              junos:must "(!(".. evpn"))";
              junos:must-message "This configuration is not allowed with 'protocols evpn'";
              junos:must "(!(".. vpls"))";
              junos:must-message "This configuration is not allowed with 'protocols vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "This configuration is not allowed for 'instance-type layer2-control'";
              description
                "Layer 2 VPN configuration";
              uses juniper-protocols-l2vpn;
            }  // container l2vpn
    
            container vpls {
              junos:must "(!(".. .. instance-type mac-vrf"))";
              junos:must-message "This configuration is not allowed for instance-type mac-vrf";
              junos:must "(!((".. .. instance-type virtual-switch" && ".. evpn")))";
              junos:must-message "This configuration is not allowed for instance-type virtual-switch with 'protocols evpn' enabled";
              junos:must "(!(".. l2vpn"))";
              junos:must-message "This configuration is not allowed with 'protocols l2vpn'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "This configuration is not allowed for 'instance-type layer2-control'";
              presence "enable vpls";
              description "VPLS configuration";
              uses juniper-protocols-l2vpn;
            }  // container vpls
    
            container ldp {
              junos:must "((!(".. ldp p2mp") || (".. ldp p2mp" && !(".. .. instance-type virtual-router"))))";
              junos:must-message "p2mp under ldp is not allowed for 'instance-type virtual-router'";
              junos:must "((!(".. ldp p2mp") || (".. ldp p2mp" && !(".. .. instance-type vrf"))))";
              junos:must-message "p2mp under ldp is not allowed for 'instance-type vrf'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "ldp configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "ldp configuration is not allowed for 'instance-type virtual-switch'";
              description "LDP configuration";
              uses juniper-protocols-ldp;
            }  // container ldp
    
            container mpls {
              junos:must "(!(".. .. instance-type evpn"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type evpn'";
              junos:must "(!(".. .. instance-type mpls-internet-multicast"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type mpls-internet-multicast'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type atmvpn"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type atmvpn'";
              junos:must "(!(".. .. instance-type l2backhaul-vpn"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type l2backhaul-vpn'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type virtual-switch'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type no-forwarding"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type no-forwarding'";
              junos:must "(!(".. .. instance-type forwarding"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type forwarding'";
              description "MPLS configuration";
              uses juniper-protocols-mpls;
            }  // container mpls
    
            container msdp {
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "msdp configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "msdp configuration is not allowed for 'instance-type virtual-switch'";
              description "MSDP configuration";
              uses juniper-protocols-msdp;
            }  // container msdp
    
            container mvpn {
              junos:must "((!("system processes routing bgp rib-sharding") || (!(".. .. protocols bgp group") || (!(".. .. routing-options auto-export") || "system processes routing bgp rib-sharding no-l3vpn"))))";
              junos:must-message "Auto-export of BGP learned routes will not work with sharding MVPN context";
              junos:must "((".. pim" || (".. .. instance-type mpls-internet-multicast" || (".. .. provider-tunnel inter-as" || ".. .. provider-tunnel inter-region"))))";
              junos:must-message "MVPN configuration requires PIM configuration in the VRF or MPLS internet multicast instance";
              junos:must "((!("routing-options nonstop-routing") || (".. .. route-distinguisher" || (".. pim mvpn" || ".. .. instance-type mpls-internet-multicast"))))";
              junos:must-message "Nonstop routing and auto-rd mvpn instance may not be configured together";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "mvpn configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "mvpn configuration is not allowed for 'instance-type virtual-switch'";
              presence "enable mvpn";
              description
                "BGP-MVPN configuration";
              uses juniper-protocols-mvpn;
            }  // container mvpn
    
            container ospf {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type virtual-switch'";
              description "OSPF configuration";
              uses juniper-protocols-ospf;
            }  // container ospf
    
            container ospf3 {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type virtual-switch'";
              description "OSPF3 configuration";
              uses juniper-protocols-ospf3;
            }  // container ospf3
    
            container pim {
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "pim configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "pim configuration is not allowed for 'instance-type virtual-switch'";
              description "PIM configuration";
              uses juniper-protocols-pim;
            }  // container pim
    
            container ripng {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "ripng configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "ripng configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "ripng configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "ripng configuration is not allowed for 'instance-type virtual-switch'";
              description "RIPng options";
              uses juniper-protocols-ripng;
            }  // container ripng
    
            container rip {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "rip configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "rip configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "rip configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "rip configuration is not allowed for 'instance-type virtual-switch'";
              description "RIP options";
              uses juniper-protocols-rip;
            }  // container rip
    
            container rsvp {
              junos:must "(!(".. .. instance-type evpn"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type evpn'";
              junos:must "(!(".. .. instance-type mpls-internet-multicast"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type mpls-internet-multicast'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type atmvpn"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type atmvpn'";
              junos:must "(!(".. .. instance-type l2backhaul-vpn"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type l2backhaul-vpn'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type virtual-switch'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type no-forwarding"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type no-forwarding'";
              junos:must "(!(".. .. instance-type forwarding"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type forwarding'";
              description "RSVP configuration";
              uses juniper-protocols-rsvp;
            }  // container rsvp
    
            container pim-snooping {
              junos:must "(!(".. .. routing-interface"))";
              junos:must-message "routing-interface can not be configured when pim-snooping is configured";
              junos:must "(!(".. igmp-snooping"))";
              junos:must-message "pim-snooping configuration can not coexist with igmp-snooping";
              junos:must "(".. .. instance-type vpls")";
              junos:must-message "pim-snooping configuration is allowed only for 'instance-type vpls'";
              presence "enable pim-snooping";
              description
                "PIM snooping configuration";
              uses juniper-protocols-pim-snooping;
            }  // container pim-snooping
    
            container mvrp {
              junos:must "((!(".. vstp") || ".. vstp disable"))";
              junos:must-message "vstp enabled, mvrp is not supported";
              junos:must "(((".. mstp" && !(".. mstp disable")) || (".. rstp" && !(".. rstp disable"))))";
              junos:must-message "rstp/mstp is not enabled, mvrp is not allowed";
              junos:must "(".. .. instance-type virtual-switch")";
              junos:must-message "mvrp is allowed only in virtual-switch instance";
              description "MVRP configuration";
              uses juniper-protocols-mvrp;
            }  // container mvrp
    
            container rstp {
              junos:must "((".. .. instance-type layer2-control" || ".. .. instance-type virtual-switch"))";
              junos:must-message "STP protocols allowed only in layer2-control or virtual-switch instance";
              description "RSTP configuration";
              uses juniper-protocols-stp;
            }  // container rstp
    
            container mstp {
              junos:must "((".. .. instance-type layer2-control" || ".. .. instance-type virtual-switch"))";
              junos:must-message "STP protocols allowed only in layer2-control or virtual-switch instance";
              description "MSTP configuration";
              uses juniper-protocols-mstp;
            }  // container mstp
    
            container vstp {
              junos:must "((".. vstp disable" || (!(".. mstp") || ".. mstp disable")))";
              junos:must-message "MSTP is enabled in the same routing instance, VSTP not allowed";
              junos:must "((".. .. instance-type layer2-control" || ".. .. instance-type virtual-switch"))";
              junos:must-message "STP protocols allowed only in layer2-control or virtual-switch instance";
              description "VSTP configuration";
              uses juniper-protocols-vstp;
            }  // container vstp
          }  // container protocols
    
          leaf description {
            type string {
              junos:posix-pattern "^.{1,255}$";
              junos:pattern-message "Must be a string of 255 characters or less";
            }
            description
              "Text description of routing instance";
          }
    
          leaf vlan-model {
            type enumeration {
              enum "one-to-one" {
                value 0;
                description
                  "Customer VLAN model (1:1)";
              }
            }
            description
              "Subscriber vlan-model in L2Wholesale framework";
          }
    
          container vtep-source-interface {
            description
              "Source layer-3 IFL for VXLAN";
            leaf interface-name {
              junos:must "("interfaces $$")";
              junos:must-message "Interface must be defined";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
            }
    
            choice family {
              container inet {
                presence "enable inet";
                description "IPv4 source";
                uses apply-advanced;
              }  // container inet
              container inet6 {
                junos:must "((!("routing-instances ${instance} protocols evpn") || "routing-instances ${instance} protocols evpn encapsulation vxlan"))";
                junos:must-message "encapsulation vxlan must be enabled for IPv6 underlay";
                presence "enable inet6";
                description "IPv6 source";
                uses apply-advanced;
              }  // container inet6
            }  // choice family
          }  // container vtep-source-interface
    
          container vtep-remote-interface {
            description "Remote VTEP interface";
            uses apply-advanced;
    
            list remote-ip {
              key "name";
              ordered-by user;
              description
                "Remote VTEP IP address";
              leaf name {
                type jt:ipv4addr;
                description "IP address";
              }
    
              uses apply-advanced;
    
              leaf dynamic-profile {
                junos:must "("dynamic-profiles $$")";
                junos:must-message "Dynamic profile must be defined";
                type string;
                description
                  "Define associate dynamic profile";
              }
            }  // list remote-ip
    
            container default {
              description
                "To all remote vtep interface";
              uses apply-advanced;
    
              leaf dynamic-profile {
                junos:must "("dynamic-profiles $$")";
                junos:must-message "Dynamic profile must be defined";
                type string;
                description
                  "Define associate dynamic profile";
              }
            }  // container default
          }  // container vtep-remote-interface
    
          leaf-list remote-vtep-list {
            type jt:ipaddr;
            max-elements 1024;
            description
              "Configure static remote VXLAN tunnel endpoints";
          }
    
          leaf-list remote-vtep-v6-list {
            type jt:ipv6addr;
            max-elements 1024;
            description
              "Configurate static ipv6 remote VXLAN tunnel endpoints";
          }
    
          leaf instance-role {
            type enumeration {
              enum "access" {
                value 0;
                description
                  "Role of Access/Aggregation router";
              }
              enum "nni" {
                value 1;
                description
                  "Role of Provider network interfacing router";
              }
            }
            description
              "Primary role of L2Backhaul-vpn router";
          }
    
          choice vlan_choice {
            leaf vlan-id {
              junos:must "(!(".. instance-type mac-vrf"))";
              junos:must-message "'vlan-id' must be configured within bridge-domains for 'instance-type mac-vrf'";
              junos:must "((".. instance-type vpls" || ".. instance-type evpn"))";
              junos:must-message "'vlan-id' statement can be included only for a VPLS or EVPN";
              type string;
              description
                "IEEE 802.1q VLAN identifier for bridging domain";
            }
            container vlan-tags {
              junos:must "(".. instance-type vpls")";
              junos:must-message "'vlan-tags' statement can be included only for VPLS instance";
              presence "enable vlan-tags";
              description
                "IEEE 802.1q VLAN tags for bridging domain";
              leaf outer {
                type string {
                  junos:posix-pattern "^(0[Xx][0-9A-Fa-f]{4}.([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4]))$|^([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4])$";
                  junos:pattern-message "vlan-id in vlan-tag (0xNNNN.vlan-id) must be 0 to 4094";
                }
                description
                  "[tpid.]vlan-id, tpid format is 0xNNNN and is optional";
              }
    
              leaf inner {
                type string {
                  junos:posix-pattern "^(0[Xx][0-9A-Fa-f]{4}.([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4]))$|^([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4])$";
                  junos:pattern-message "vlan-id in vlan-tag (0xNNNN.vlan-id) must be 0 to 4094";
                }
                description
                  "[tpid.]vlan-id, tpid format is 0xNNNN and is optional";
              }
            }  // container vlan-tags
          }  // choice vlan_choice
    
          container system {
            description "System parameters";
            uses apply-advanced;
    
            container services {
              description "System services";
              uses apply-advanced;
    
              container dhcp-local-server {
                description
                  "Dynamic Host Configuration Protocol server configuration";
                uses jdhcp-local-server-type;
              }  // container dhcp-local-server
    
              container static-subscribers {
                description
                  "Static Subscriber Client configuration";
                uses jsscd-static-subscribers-type;
              }  // container static-subscribers
            }  // container services
          }  // container system
    
          container access {
            description
              "Network access configuration";
            uses apply-advanced;
    
            container address-assignment {
              description
                "Address assignment configuration";
              uses address-assignment-type;
            }  // container address-assignment
    
            container address-protection {
              presence
                "enable address-protection";
              description
                "Initiate Duplicate Address Protection";
              uses apply-advanced;
    
              leaf reassign-on-match {
                type empty;
                description
                  "Disconnect owning session and reassign to this session";
              }
            }  // container address-protection
          }  // container access
    
          container access-profile {
            description
              "Access profile for this instance";
            leaf access-profile-name {
              junos:must "("access profile $$")";
              junos:must-message "Access-profile must be defined in the [edit access profile] hierarchy";
              type string;
              description "Profile name";
            }
          }  // container access-profile
    
          leaf routing-interface {
            junos:must "(!("interfaces $$-IFL family mpls"))";
            junos:must-message "routing-interface with family mpls cannot be added to VPLS instance";
            junos:must "(!(".. instance-type virtual-switch"))";
            junos:must-message "routing-interface must be configured within bridge-domains for 'instance-type virtual-switch'";
            junos:must "(!("routing-instances ${instance} service-type vlan-bundle"))";
            junos:must-message "routing-interface not valid for vlan-bundle service type";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id inner-all")))";
            junos:must-message "routing-interface cannot be configured under routing-instance with 'vlan-id all' or 'vlan-id inner-all'";
            junos:must "((".. vlan-id" || ".. vlan-tags"))";
            junos:must-message "routing-interface can be configured only under routing-instance with 'vlan-id' or 'vlan-tags'";
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Routing interface name for this routing-instance";
          }
    
          container vxlan {
            junos:must "((". ovsdb-managed" || (". multicast-group" || (". multicast-v6-group" || (". ingress-node-replication" || ("routing-instances ${instance} switch-options ovsdb-managed" || "routing-instances ${instance} protocols evpn encapsulation vxlan"))))))";
            junos:must-message "multicast-group or multicast-v6-group or ovsdb-managed or ingress-node-replication or protocols evpn encapsulation vxlan should be enabled. ingress-node-replication must be configured when remote-vtep-list is configured";
            junos:must "((". ovsdb-managed" || ("routing-instances ${instance} switch-options ovsdb-managed" || (". multicast-group" || (". multicast-v6-group" || ("routing-instances ${instance} remote-vtep-list" || ("routing-instances ${instance} remote-vtep-v6-list" || "routing-instances ${instance} protocols evpn encapsulation vxlan")))))))";
            junos:must-message "One of multicast-group or multicast-v6-group or ovsdb-managed or protocols evpn encapsulation vxlan or remote-vtep-list or remote-vtep-v6-list should be enabled";
            junos:must "((".. vlan-id" || (".. instance-type vpls" || (".. instance-type evpn" && ".. vxlan decapsulate-accept-inner-vlan"))))";
            junos:must-message "decapsulate-accept-inner-vlan must be configured when vlan-id is not present for evpn vxlan";
            junos:must "((".. vlan-id" || (".. instance-type vpls" || (".. instance-type evpn" && ".. vxlan encapsulate-inner-vlan"))))";
            junos:must-message "encapsulate-inner-vlan must be configured when vlan-id is not present for evpn vxlan";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id inner-all")))";
            junos:must-message "vxlan does not support bridge domain with 'vlan-id all' or  'vlan-id inner-all'";
            junos:must "(!(".. instance-type mac-vrf"))";
            junos:must-message "vxlan must be configured within bridge-domains for 'instance-type mac-vrf'";
            junos:must "(!(".. instance-type virtual-switch"))";
            junos:must-message "vxlan must be configured within bridge-domains for 'instance-type virtual-switch'";
            junos:must "((".. instance-type vpls" || ".. instance-type evpn"))";
            junos:must-message "vxlan in routing-instance is valid only for instance-type vpls or evpn";
            junos:must "("routing-instances ${instance} vtep-source-interface")";
            junos:must-message "vtep-source-interface is required for VXLAN configuration";
            description "VXLAN options";
            uses apply-advanced;
    
            leaf ovsdb-managed {
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || ".. multicast-group")))";
              junos:must-message "ovsdb-managed not valid with remote-vtep-list or multicast-group";
              type empty;
              description
                "Managed remotely via VXLAN OVSDB Controller";
            }
    
            leaf vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 16777214";
                }
              }
              description "VXLAN identifier";
            }
    
            leaf translation-vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16777214";
                }
              }
              description
                "Translated VXLAN identifier";
            }
    
            leaf multicast-group {
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || (".. ovsdb-managed" || (".. multicast-v6-group" || "routing-instances ${instance} switch-options ovsdb-managed")))))";
              junos:must-message "multicast-group not valid with remote-vtep-list or ovsdb-managed or multicast-v6-group";
              type jt:ipv4addr;
              description
                "Multicast group registered for VXLAN segment";
            }
    
            leaf multicast-v6-group {
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || (".. ovsdb-managed" || (".. multicast-group" || "routing-instances ${instance} switch-options ovsdb-managed")))))";
              junos:must-message "multicast-v6-group not valid with remote-vtep-list or ovsdb-managed or multicast-group";
              type jt:ipv6addr;
              description
                "Multicast IPv6 group registered for VXLAN segment";
            }
    
            leaf encapsulate-inner-vlan {
              junos:must "(!(".. .. vlan-id none"))";
              junos:must-message "encapsulate inner vlan not valid with vlan-id none ";
              type empty;
              description
                "Retain inner VLAN in the packet";
            }
    
            leaf decapsulate-accept-inner-vlan {
              junos:must "(!(".. .. vlan-id none"))";
              junos:must-message "accept inner vlan not valid with vlan-id none";
              type empty;
              description
                "Accept VXLAN packets with inner VLAN";
            }
    
            leaf unreachable-vtep-aging-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "300 .. 1800";
                }
              }
              units "seconds";
              description
                "Unreachable VXLAN tunnel endpoint removal timer";
            }
    
            leaf ingress-node-replication {
              junos:must "(!(".. .. .. .. protocols evpn assisted-replication"))";
              junos:must-message "ingress-node-replication cannot be configured with assisted-replication";
              junos:must "((".. ovsdb-managed" || (".. .. .. .. switch-options ovsdb-managed" || ("routing-instances ${instance} remote-vtep-list" || ("routing-instances ${instance} remote-vtep-v6-list" || "routing-instances ${instance} protocols evpn encapsulation vxlan")))))";
              junos:must-message "Valid for ovsdb-managed instance or with remote-vtep-list or remote-vtep-v6-list or evpn vxlan";
              type empty;
              description
                "Enable ingress node replication";
            }
          }  // container vxlan
    
          leaf no-local-switching {
            junos:must "((".. instance-type vpls" || ((".. instance-type evpn" && ".. protocols vpls") || ".. instance-type l2backhaul-vpn")))";
            junos:must-message "'no-local-switching' statement can be configured only for VPLS instances";
            type empty;
            description
              "Disable local switching within CE-facing interfaces";
          }
    
          leaf no-normalization {
            type empty;
            description
              "Disable vlan id normalization for interfaces";
          }
    
          leaf qualified-bum-pruning-mode {
            junos:must "((".. instance-type vpls" || (".. instance-type evpn" && ".. protocols vpls")))";
            junos:must-message "'bum-pruning-mode' statement can be configured only for VPLS instances!";
            type empty;
            description
              "Enable BUM pruning for VPLS instance";
          }
    
          leaf no-irb-layer-2-copy {
            junos:must "((".. routing-interface" || ".. l3-interface"))";
            junos:must-message "routing-interface/l3-interface must be configured for this feature";
            type empty;
            description
              "Disable transmission of layer-2 copy of packets of irb routing-interface";
          }
    
          leaf connector-id-advertise {
            type empty;
            description
              "Advertise connector-id attribute";
          }
    
          container forwarding-options {
            description
              "Forwarding options configuration";
            uses juniper-forwarding-options;
          }  // container forwarding-options
    
          container bridge-domains {
            junos:must "((".. instance-type virtual-switch" || ".. instance-type mac-vrf"))";
            junos:must-message "'bridge-domains' configuration can only be used for 'instance-type virtual-switch' or 'instance-type mac-vrf'";
            junos:must "(!("vlans"))";
            junos:must-message "BDs cannot be configured when VLANs are configured";
            description
              "Bridge domain configuration";
            uses apply-advanced;
    
            list domain {
              key "name";
              uses juniper-bridge-domains;
            }  // list domain
          }  // container bridge-domains
    
          container switch-options {
            junos:must "(".. instance-type virtual-switch")";
            junos:must-message "This configuration is allowed for only 'instance-type virtual-switch'";
            description
              "L2 options for routing-instance of type virtual-switch";
            uses juniper-routing-instance-switch-options;
          }  // container switch-options
    
          leaf service-type {
            junos:must "(".. instance-type mac-vrf")";
            junos:must-message "service-type config is allowed for instance type mac-vrf only";
            type enumeration {
              enum "vlan-based" {
                value 0;
                description
                  "Instance service type vlan-based";
              }
              enum "vlan-bundle" {
                value 1;
                description
                  "Instance service type vlan-bundle";
              }
              enum "vlan-aware" {
                value 2;
                description
                  "Instance service type vlan-aware";
              }
            }
            description "Sevice type";
          }
    
          list interface {
            key "name";
            description
              "Interface name for this routing instance";
            leaf name {
              junos:must "((!("interfaces $$-IFL etree-ac-role") || ".. .. protocols evpn evpn-etree"))";
              junos:must-message "etree must be enabled under routing-instance";
              junos:must "(!(("interfaces $$-IFL family bridge interface-mode" && ".. .. instance-type evpn")))";
              junos:must-message "access/trunk interfaces are not allowed in evpn instance";
              junos:must "((!(("interfaces $$-IFL vlan-id-list" || "interfaces $$-IFL vlan-tags inner-list")) || !((".. .. vlan-id" || ".. .. vlan-tags"))))";
              junos:must-message "interface with vlan-id-list/inner-list cannot be added to routing-instance with a vlan-id/vlan-tags configured";
              junos:must "((!(("interfaces $$-IFL family bridge interface-mode" || "interfaces $$-IFL family ethernet-switching")) || (".. .. instance-type virtual-switch" || ".. .. instance-type mac-vrf")))";
              junos:must-message "Interface with 'interface-mode' is allowed only in a virtual-switch or mac-vrf instance";
              junos:must "((!(".. .. instance-type virtual-switch") || ("interfaces $$-IFL family bridge interface-mode" || "interfaces $$-IFL family ethernet-switching")))";
              junos:must-message "Only interface with 'interface-mode' is allowed in a virtual-switch";
              junos:must "(!(".. .. .. routing-instances bridge-domains interfaces $$"))";
              junos:must-message "The interface cannot be defined both at routing-instance and bridge-domain level";
              junos:must "((!("interfaces $$-IFL vlan-id-range") || (".. .. instance-type vpls" || ".. .. instance-type evpn")))";
              junos:must-message "vlan-id-range is specified for this logical interface; the routing instance must be of type vpls or evpn";
              junos:must "(((".. .. vlan-id all" && "interfaces $$-IFL input-vlan-map pop") || (".. .. vlan-id inner-all" || (!((".. .. vlan-id" || ".. .. vlan-tags")) || (!(("interfaces $$-IFL input-vlan-map" || "interfaces $$-IFL output-vlan-map")) || (".. .. no-normalization" || ".. .. bridge-options no-normalization"))))))";
              junos:must-message "interface with input/output vlan-maps cannot be added to a routing-instance with a vlan-id/vlan-tags configured";
              junos:must "((!("interfaces $$-IFL vlan-tags inner-range") || ((".. .. vlan-id all" || ".. .. vlan-id inner-all") || (".. .. no-normalization" || ".. .. bridge-options no-normalization"))))";
              junos:must-message "vlan-tags inner-range is specified for this logical interface; 'vlan-id all' or 'vlan-id inner-all' should also be enabled";
              type string;
            }
    
            uses apply-advanced;
    
            choice mode {
              leaf any {
                type empty;
                description
                  "Interface used for both unicast and multicast traffic";
              }
              leaf unicast {
                type empty;
                description
                  "Interface used for unicast traffic only";
              }
              leaf multicast {
                type empty;
                description
                  "Interface used for multicast traffic only";
              }
            }  // choice mode
    
            leaf primary {
              junos:must "(!(".. unicast"))";
              junos:must-message "'primary' option can not be configured for unicast interface";
              junos:must "((".. .. instance-type vrf" || ".. .. instance-type mpls-internet-multicast"))";
              junos:must-message "'primary' option can only be configured for instance-type 'vrf' or 'mpls-internet-multicast'";
              type empty;
              description
                "Preferred multicast vt interface for the routing-instance";
            }
    
            leaf protect-interface {
              junos:must "("interfaces $$")";
              junos:must-message "Interface must be part of this routing instance";
              junos:must "(!("interfaces ${inter_name} esi"))";
              junos:must-message "ESI can not be configured for protect interface";
              junos:must "("routing-instances ${instance} protocols evpn")";
              junos:must-message "Protocol EVPN must be configured in the evpn instance";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Name of protect interface";
            }
          }  // list interface
    
          container route-distinguisher {
            description
              "Route distinguisher for this instance";
            leaf rd-type {
              type string {
                junos:posix-pattern "^[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. 123456L:100";
              }
              description
                "Number in (16 bit:32 bit) or (32 bit 'L':16 bit) or (IP address:16 bit) format";
            }
          }  // container route-distinguisher
    
          leaf-list vrf-import {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Import policy for VRF instance RIBs";
          }
    
          leaf-list vrf-export {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Export policy for VRF instance RIBs";
          }
    
          container vrf-target {
            description
              "VRF target community configuration";
            uses apply-advanced;
    
            leaf community {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use in import and export";
            }
    
            leaf import {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use when filtering on import";
            }
    
            leaf export {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use when marking routes on export";
            }
    
            leaf auto {
              junos:must "((".. .. instance-type evpn" || (".. .. instance-type virtual-switch" || ".. .. instance-type mac-vrf")))";
              junos:must-message "vrf-target auto is meant only for evpn or virtual-switch instance or mac-vrf";
              type empty;
              description
                "Auto derive import and export target community from BGP AS & L2";
            }
          }  // container vrf-target
    
          leaf no-vrf-advertise {
            type empty;
            description
              "Don't advertise this instance to remote PEs";
          }
    
          leaf non-forwarding-vrf {
            junos:must "(".. provider-tunnel inter-as")";
            junos:must-message "Inter-AS segmented p-tunnel configuration is required";
            type empty;
            description
              "Don't create VRF forwarding table for local or transit routes belonging to this VPN";
          }
    
          container vrf-advertise-selective {
            junos:must "(!(".. no-vrf-advertise"))";
            junos:must-message "Selective vrf advertise cannot be used with no-vrf-advertise knob";
            presence
              "enable vrf-advertise-selective";
            description
              "Override no-vrf-advertise knob for the specified address family";
            uses apply-advanced;
    
            container family {
              description
                "Protocol family to be selectively advertised";
              uses apply-advanced;
    
              leaf inet-mvpn {
                type empty;
                description
                  "IPv4 MVPN Address Family";
              }
    
              leaf inet6-mvpn {
                type empty;
                description
                  "IPv6 MVPN Address Family";
              }
            }  // container family
          }  // container vrf-advertise-selective
    
          container vrf-table-label {
            presence "enable vrf-table-label";
            description
              "Advertise a single VPN label for all routes in the VRF";
            leaf static {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "16 .. 1048575";
                }
              }
              description
                "Specify label value to be used";
            }
    
            leaf source-class-usage {
              type empty;
              description
                "Enable source class usage";
            }
          }  // container vrf-table-label
    
          choice vrf-propagate-ttl-or-no-vrf-propagate-ttl {
            leaf no-vrf-propagate-ttl {
              type empty;
              description
                "Disable TTL propagation from IP to MPLS (on push) and MPLS to IP (on pop)";
            }
            leaf vrf-propagate-ttl {
              type empty;
              description
                "Enable TTL propagation from IP to MPLS (on push) and MPLS to IP (on pop)";
            }
          }  // choice vrf-propagate-ttl-or-no-vrf-propagate-ttl
    
          container provider-tunnel {
            junos:must "(!((". inter-as" && ". selective")))";
            junos:must-message "Selective p-tunnel configuration not allowed on ASBR";
            junos:must "(!((" .. non-forwarding-vrf" && (". rsvp-te" || (". pim-asm" || (". pim-ssm" || ". ldp-p2mp"))))))";
            junos:must-message "Inclusive p-tunnel configuration not allowed on ASBR with non-forwarding-vrf";
            junos:must "((!(".. non-forwarding-vrf") || ". inter-as"))";
            junos:must-message "Non-forwarding VRF can only be configured with Inter-AS segmented p-tunnels";
            description
              "Provider tunnel configuration";
            uses apply-advanced;
    
            container external-controller {
              junos:must "((".. .. protocols mvpn" && (".. .. instance-type vrf" || ".. .. instance-type mpls-internet-multicast")))";
              junos:must-message "External point-to-multipoint LSP provider can be configured only for MVPN instances";
              description
                "External point-to-multipoint LSP provider for flooding";
              uses apply-advanced;
    
              choice external-provider {
                leaf pccd {
                  type empty;
                  description
                    "Use PCCD for external point-to-multipoint LSP computation entity";
                }
              }  // choice external-provider
            }  // container external-controller
    
            choice tunnel-type {
              container rsvp-te {
                junos:must "(!(((".. .. instance-type evpn" || ".. .. instance-type virtual-switch") && ".. .. protocols evpn encapsulation vxlan")))";
                junos:must-message "P2MP Provider Tunnels are not allowed for VxLAN encapsulation";
                junos:must "(!(((".. .. instance-type evpn" || ".. .. instance-type virtual-switch") && ".. .. protocols evpn pbb-evpn-core")))";
                junos:must-message "P2MP Provider Tunnels are not allowed for PBB-EVPN";
                junos:must "((".. .. instance-type evpn" || (".. .. instance-type virtual-switch" || (".. .. instance-type vpls" || (".. .. protocols mvpn" && (".. .. instance-type vrf" || ".. .. instance-type mpls-internet-multicast"))))))";
                junos:must-message "Point-to-multipoint LSPs can be configured only for EVPN, VPLS or MVPN instances";
                junos:must "("protocols rsvp")";
                junos:must-message "RSVP must be configured in the master instance";
                description
                  "RSVP-TE point-to-multipoint LSP for flooding";
                uses apply-advanced;
    
                choice static-or-dynamic {
                  leaf static-lsp {
                    junos:must "(!((".. .. .. instance-type evpn" || ".. .. .. instance-type virtual-switch")))";
                    junos:must-message "Static LSPs are not allowed for EVPN instances";
                    junos:must "((any "protocols mpls label-switched-path <*> p2mp $$" || ".. .. .. instance-type vpls"))";
                    junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                    type string {
                      junos:posix-pattern "^.{1,32}$";
                      junos:pattern-message "Must be a string of 32 characters or less";
                    }
                    description
                      "Name of point-to-multipoint LSP";
                  }
                  container label-switched-path-template {
                    description
                      "Template for dynamic point-to-multipoint LSP parameters";
                    uses apply-advanced;
    
                    choice dynamic-template {
                      leaf template-name {
                        junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                        junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                        type string {
                          junos:posix-pattern "^.{1,32}$";
                          junos:pattern-message "Must be a string of 32 characters or less";
                        }
                        description
                          "Name of point-to-multipoint LSP template";
                      }
                      leaf default-template {
                        type empty;
                        description
                          "Use default parameters";
                      }
                    }  // choice dynamic-template
                  }  // container label-switched-path-template
                }  // choice static-or-dynamic
              }  // container rsvp-te
              container ldp-p2mp {
                junos:must "("protocols ldp p2mp")";
                junos:must-message "LDP P2MP must be configured in the master instance";
                junos:must "((".. .. instance-type evpn" || (".. .. instance-type virtual-switch" || (".. .. protocols mvpn" && (".. .. instance-type vrf" || ".. .. instance-type mpls-internet-multicast")))))";
                junos:must-message "LDP P2MP LSPs can be configured only for EVPN or MVPN instances";
                junos:must "(!(((".. .. instance-type evpn" || ".. .. instance-type virtual-switch") && ".. .. protocols evpn encapsulation vxlan")))";
                junos:must-message "P2MP Provider Tunnels are not allowed for VxLAN encapsulation";
                junos:must "(!(((".. .. instance-type evpn" || ".. .. instance-type virtual-switch") && ".. .. protocols evpn pbb-evpn-core")))";
                junos:must-message "P2MP Provider Tunnels are not allowed for PBB-EVPN";
                presence "enable ldp-p2mp";
                description
                  "LDP point-to-multipoint LSP for flooding";
              }  // container ldp-p2mp
              container ingress-replication {
                junos:must "(((".. .. instance-type vrf" || ".. .. instance-type mpls-internet-multicast") && ".. .. protocols mvpn"))";
                junos:must-message "Ingress Replication can be configured only for MVPN instances";
                junos:must "(!(".. .. protocols mvpn sender-based-rpf"))";
                junos:must-message "This release does not support Sender based RPF for inclusive ingress replication provider tunnels";
                description
                  "Ingress replication tunnel";
                uses apply-advanced;
    
                leaf create-new-ucast-tunnel {
                  junos:must "(".. label-switched-path label-switched-path-template")";
                  junos:must-message "label-switched-path-template must be defined";
                  type empty;
                  description
                    "Create new unicast tunnel for ingress replication";
                }
    
                container label-switched-path {
                  presence
                    "enable label-switched-path";
                  description
                    "Point-to-point LSP unicast tunnel";
                  uses apply-advanced;
    
                  container label-switched-path-template {
                    junos:must "(".. .. create-new-ucast-tunnel")";
                    junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                    description
                      "Template for dynamic point-to-point LSP parameters";
                    uses apply-advanced;
    
                    choice dynamic-template {
                      leaf template-name {
                        junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                        junos:must-message "Referenced point-to-point LSP template does not exist";
                        type string {
                          junos:posix-pattern "^.{1,32}$";
                          junos:pattern-message "Must be a string of 32 characters or less";
                        }
                        description
                          "Name of point-to-point LSP template";
                      }
                      leaf default-template {
                        type empty;
                        description
                          "Use default parameters";
                      }
                    }  // choice dynamic-template
                  }  // container label-switched-path-template
                }  // container label-switched-path
              }  // container ingress-replication
              container pim-asm {
                junos:must "(!(".. .. protocols mvpn sender-based-rpf"))";
                junos:must-message "this release does not support sender based RPF for PIM-SM provider tunnels";
                junos:must "(!("protocols pim mpls-internet-multicast"))";
                junos:must-message "mpls-internet-multicast must not be configured";
                junos:must "("protocols pim")";
                junos:must-message "PIM-SM must be configured in the master instance";
                junos:must "(".. .. instance-type vrf")";
                junos:must-message "PIM-SM must be configured only for vrf instances";
                description
                  "PIM-SM provider tunnel";
                uses apply-advanced;
    
                leaf group-address {
                  type jt:ipv4addr;
                  description
                    "PIM-SM provider tunnel group address";
                }
    
                container family {
                  presence "enable family";
                  status deprecated;
                  description
                    "PIM-SM provider tunnel address family";
                  uses apply-advanced;
    
                  container inet {
                    presence "enable inet";
                    description
                      "IPv4 PIM-SM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SM provider tunnel group address for IPV4";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container inet
    
                  container inet6 {
                    presence "enable inet6";
                    description
                      "IPv6 PIM-SM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SM provider tunnel group address for IPV6";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container inet6
                }  // container family
              }  // container pim-asm
              container pim-ssm {
                junos:must "(!(".. .. protocols mvpn sender-based-rpf"))";
                junos:must-message "This release does not support sender based RPF for PIM-SSM provider tunnels";
                junos:must "(!("protocols pim mpls-internet-multicast"))";
                junos:must-message "mpls-internet-multicast must not be configured";
                junos:must "("protocols pim")";
                junos:must-message "PIM-SSM must be configured in the master instance";
                junos:must "(".. .. protocols mvpn")";
                junos:must-message "PIM-SSM provider tunnel can be configured only for multicast VPN instances";
                junos:must "(".. .. instance-type vrf")";
                junos:must-message "PIM-SM must be configured only for vrf instances";
                description
                  "PIM-SSM provider tunnel";
                uses apply-advanced;
    
                leaf group-address {
                  type jt:ipv4addr;
                  description
                    "PIM-SSM provider tunnel group address";
                }
    
                container family {
                  presence "enable family";
                  status deprecated;
                  description
                    "PIM-SSM provider tunnel address family";
                  uses apply-advanced;
    
                  container inet {
                    presence "enable inet";
                    description
                      "IPv4 PIM-SSM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SSM provider tunnel group address for IPV4";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container inet
    
                  container inet6 {
                    presence "enable inet6";
                    description
                      "IPv6 PIM-SSM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SSM provider tunnel group address for IPV6";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container inet6
                }  // container family
              }  // container pim-ssm
            }  // choice tunnel-type
    
            container inter-as {
              junos:must "(".. .. non-forwarding-vrf")";
              junos:must-message "Inter-as segmented tunnels can only be configured for non-forwarding-vrfs";
              junos:must "(!(".. .. protocols mvpn sender-based-rpf"))";
              junos:must-message "This release does not support sender based RPF for inter-as provider tunnels";
              junos:must "(".. .. instance-type vrf")";
              junos:must-message "Inter-as segmented tunnels can only be configured for VRF instances";
              junos:must "(".. .. protocols mvpn")";
              junos:must-message "Inter-as segmented tunnels can only be configured for MVPN instances";
              description
                "Inter-AS segmented tunnels";
              uses apply-advanced;
    
              choice tunnel-type {
                container ingress-replication {
                  junos:must "(". label-switched-path label-switched-path-template")";
                  junos:must-message "label-switched-path template must be configured for Inter-AS segmented tunnel";
                  description
                    "Ingress replication tunnel";
                  uses apply-advanced;
    
                  leaf create-new-ucast-tunnel {
                    junos:must "(".. label-switched-path label-switched-path-template")";
                    junos:must-message "label-switched-path-template must be defined";
                    type empty;
                    description
                      "Create new unicast tunnel for ingress replication";
                  }
    
                  container label-switched-path {
                    presence
                      "enable label-switched-path";
                    description
                      "Point-to-point LSP unicast tunnel";
                    uses apply-advanced;
    
                    container label-switched-path-template {
                      junos:must "(".. .. create-new-ucast-tunnel")";
                      junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                      description
                        "Template for dynamic point-to-point LSP parameters";
                      uses apply-advanced;
    
                      choice dynamic-template {
                        leaf template-name {
                          junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                          junos:must-message "Referenced point-to-point LSP template does not exist";
                          type string {
                            junos:posix-pattern "^.{1,32}$";
                            junos:pattern-message "Must be a string of 32 characters or less";
                          }
                          description
                            "Name of point-to-point LSP template";
                        }
                        leaf default-template {
                          type empty;
                          description
                            "Use default parameters";
                        }
                      }  // choice dynamic-template
                    }  // container label-switched-path-template
                  }  // container label-switched-path
                }  // container ingress-replication
                container rsvp-te {
                  junos:must "("protocols rsvp")";
                  junos:must-message "RSVP must be configured in the master instance";
                  description
                    "RSVP-TE point-to-multipoint LSP for flooding";
                  uses apply-advanced;
    
                  choice static-or-dynamic {
                    container label-switched-path-template {
                      description
                        "Template for dynamic point-to-multipoint LSP parameters";
                      uses apply-advanced;
    
                      choice dynamic-template {
                        leaf template-name {
                          junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                          junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                          type string {
                            junos:posix-pattern "^.{1,32}$";
                            junos:pattern-message "Must be a string of 32 characters or less";
                          }
                          description
                            "Name of point-to-multipoint LSP template";
                        }
                        leaf default-template {
                          type empty;
                          description
                            "Use default parameters";
                        }
                      }  // choice dynamic-template
                    }  // container label-switched-path-template
                  }  // choice static-or-dynamic
                }  // container rsvp-te
                container ldp-p2mp {
                  junos:must "("protocols ldp p2mp")";
                  junos:must-message "LDP P2MP must be configured in the master instance";
                  presence "enable ldp-p2mp";
                  description
                    "LDP point-to-multipoint LSP for flooding";
                }  // container ldp-p2mp
              }  // choice tunnel-type
    
              container inter-region-segmented {
                junos:must "(!((".. pim-ssm" || ".. pim-asm")))";
                junos:must-message "Inter-region-segmented cannot be set for PIM tunnel";
                description
                  "Inter-Region Segmented LSP triggered by threshold rate and/or fan-out";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 1000000";
                    }
                  }
                  units "kilobits";
                  description
                    "Data threshold rate to trigger segmentation";
                }
    
                leaf fan-out {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 10000";
                    }
                  }
                  description
                    "Number of remote Leaf-AD routes";
                }
              }  // container inter-region-segmented
            }  // container inter-as
    
            container inter-region {
              junos:must "((".. .. instance-type vrf" || ".. .. instance-type mpls-internet-multicast"))";
              junos:must-message "Inter-region segmented tunnels can only be configured for VRF or Internet-multicast instances";
              junos:must "(!((".. selective" || (".. pim-ssm" || (".. pim-asm" || (".. rsvp-te" || (".. ldp-p2mp" || (".. ingress-replication" || ".. inter-as"))))))))";
              junos:must-message "Inter-region on RBR can not be allowed with other tunnel options";
              description
                "Inter-region segmented tunnels";
              uses apply-advanced;
    
              choice segmented-or-not {
                leaf template {
                  junos:must "("protocols mvpn inter-region-template template $$")";
                  junos:must-message "Referenced template doesn't exist";
                  type string;
                  description
                    "Use inter-region segmentation template";
                }
                leaf no-inter-region-segmentation {
                  type empty;
                  description
                    "Do not participate in inter-region segmentation";
                }
              }  // choice segmented-or-not
            }  // container inter-region
    
            container inter-region-segmented {
              junos:must "(!((".. pim-ssm" || ".. pim-asm")))";
              junos:must-message "Inter-region-segmented cannot be set for PIM tunnel";
              description
                "Inter-Region Segmented LSP triggered by fan-out factor only";
              uses apply-advanced;
    
              leaf fan-out {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 10000";
                  }
                }
                description
                  "Number of remote Leaf-AD routes";
              }
            }  // container inter-region-segmented
    
            container selective {
              junos:must "(".. .. protocols mvpn")";
              junos:must-message "Selective tunnels can only be configured for MVPN instances";
              description "Selective tunnels";
              uses apply-advanced;
    
              leaf tunnel-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 30000";
                  }
                }
                description
                  "Maximum number of selective tunnels";
              }
    
              leaf leaf-tunnel-limit-inet {
                junos:must "(".. .. .. protocols mvpn mvpn-mode rpt-spt")";
                junos:must-message "Selective leaf tunnel limit can only be configured for MVPN rpt-spt mode";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 15000";
                  }
                }
                description
                  "Maximum number of selective leaf tunnels for v4";
              }
    
              leaf leaf-tunnel-limit-inet6 {
                junos:must "(".. .. .. protocols mvpn mvpn-mode rpt-spt")";
                junos:must-message "Selective leaf tunnel limit can only be configured for MVPN rpt-spt mode";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 15000";
                  }
                }
                description
                  "Maximum number of selective leaf tunnels for v6";
              }
    
              container wildcard-group-inet {
                description
                  "IPv4 wilcard group matching any group address";
                uses apply-advanced;
    
                container wildcard-source {
                  junos:must "(".. .. .. .. protocols mvpn mvpn-mode rpt-spt")";
                  junos:must-message "MVPN instance needs to be in rpt-spt mode while configuring wildcard-source for selective provider tunnels";
                  presence
                    "enable wildcard-source";
                  description
                    "Use Selective-Tunnel for wildcard-source (*,G) joins";
                  uses apply-advanced;
    
                  leaf threshold-rate {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1000000";
                      }
                    }
                    units "kilobits";
                    description
                      "Data threshold to create new tunnel";
                  }
    
                  choice tunnel-type {
                    container ingress-replication {
                      junos:must "(((".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast") && ".. .. .. .. .. protocols mvpn"))";
                      junos:must-message "Ingress Replication can be configured only for MVPN instances. Sender based RPF is not supported for ingress-replication provider-tunnels";
                      description
                        "Ingress replication tunnel";
                      uses apply-advanced;
    
                      leaf create-new-ucast-tunnel {
                        junos:must "(".. label-switched-path label-switched-path-template")";
                        junos:must-message "label-switched-path-template must be defined";
                        type empty;
                        description
                          "Create new unicast tunnel for ingress replication";
                      }
    
                      container label-switched-path {
                        presence
                          "enable label-switched-path";
                        description
                          "Point-to-point LSP unicast tunnel";
                        uses apply-advanced;
    
                        container label-switched-path-template {
                          junos:must "(".. .. create-new-ucast-tunnel")";
                          junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                          description
                            "Template for dynamic point-to-point LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                              junos:must-message "Referenced point-to-point LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-point LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // container label-switched-path
                    }  // container ingress-replication
                    container rsvp-te {
                      junos:must "("protocols rsvp")";
                      junos:must-message "RSVP must be configured in the master instance";
                      description
                        "RSVP-TE point-to-multipoint LSP for flooding";
                      uses apply-advanced;
    
                      choice static-or-dynamic {
                        leaf static-lsp {
                          junos:must "(!(".. .. .. .. .. rsvp-te static-lsp $$"))";
                          junos:must-message "Referenced point-to-multipoint static LSP configured for inclusive tunnel";
                          junos:must "(any "protocols mpls label-switched-path <*> p2mp $$")";
                          junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                          type string {
                            junos:posix-pattern "^.{1,32}$";
                            junos:pattern-message "Must be a string of 32 characters or less";
                          }
                          description
                            "Name of point-to-multipoint LSP";
                        }
                        container label-switched-path-template {
                          description
                            "Template for dynamic point-to-multipoint LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                              junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-multipoint LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // choice static-or-dynamic
                    }  // container rsvp-te
                    container ldp-p2mp {
                      junos:must "("protocols ldp p2mp")";
                      junos:must-message "LDP P2MP must be configured in the master instance";
                      junos:must "((".. .. .. .. .. protocols mvpn" && (".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast")))";
                      junos:must-message "LDP P2MP LSPs can be configured only for MVPN instances";
                      presence "enable ldp-p2mp";
                      description
                        "LDP point-to-multipoint LSP for flooding";
                    }  // container ldp-p2mp
                    container pim-ssm {
                      junos:must "(!(".. .. .. .. .. protocols mvpn sender-based-rpf"))";
                      junos:must-message "This release does not support sender based RPF for PIM-SSM provider-tunnel";
                      junos:must "(".. .. .. .. .. protocols mvpn")";
                      junos:must-message "";
                      junos:must "(".. .. .. .. .. instance-type vrf")";
                      junos:must-message "PIM-SSM can be configured only for vrf instances";
                      junos:must "("protocols pim")";
                      junos:must-message "PIM-SSM must be configured in the master instance";
                      description
                        "PIM-SSM provider tunnel";
                      uses apply-advanced;
    
                      leaf group-range {
                        type jt:ipv4prefix;
                        description
                          "PIM-SSM provider tunnel group range";
                      }
                    }  // container pim-ssm
                  }  // choice tunnel-type
    
                  container inter-region-segmented {
                    junos:must "(!((".. pim-ssm" || ".. pim-asm")))";
                    junos:must-message "Inter-region-segmented cannot be set for PIM tunnel";
                    description
                      "Inter-Region Segmented LSP triggered by fan-out factor only";
                    uses apply-advanced;
    
                    leaf fan-out {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 10000";
                        }
                      }
                      description
                        "Number of remote Leaf-AD routes";
                    }
                  }  // container inter-region-segmented
                }  // container wildcard-source
              }  // container wildcard-group-inet
    
              container wildcard-group-inet6 {
                description
                  "IPv6 wilcard group matching any group address";
                uses apply-advanced;
    
                container wildcard-source {
                  junos:must "(".. .. .. .. protocols mvpn mvpn-mode rpt-spt")";
                  junos:must-message "MVPN instance needs to be in rpt-spt mode while configuring wildcard-source for selective provider tunnels";
                  presence
                    "enable wildcard-source";
                  description
                    "Use Selective-Tunnel for wildcard-source (*,G) joins";
                  uses apply-advanced;
    
                  leaf threshold-rate {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1000000";
                      }
                    }
                    units "kilobits";
                    description
                      "Data threshold to create new tunnel";
                  }
    
                  choice tunnel-type {
                    container ingress-replication {
                      junos:must "(((".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast") && ".. .. .. .. .. protocols mvpn"))";
                      junos:must-message "Ingress Replication can be configured only for MVPN instances";
                      description
                        "Ingress replication tunnel";
                      uses apply-advanced;
    
                      leaf create-new-ucast-tunnel {
                        junos:must "(".. label-switched-path label-switched-path-template")";
                        junos:must-message "label-switched-path-template must be defined";
                        type empty;
                        description
                          "Create new unicast tunnel for ingress replication";
                      }
    
                      container label-switched-path {
                        presence
                          "enable label-switched-path";
                        description
                          "Point-to-point LSP unicast tunnel";
                        uses apply-advanced;
    
                        container label-switched-path-template {
                          junos:must "(".. .. create-new-ucast-tunnel")";
                          junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                          description
                            "Template for dynamic point-to-point LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                              junos:must-message "Referenced point-to-point LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-point LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // container label-switched-path
                    }  // container ingress-replication
                    container rsvp-te {
                      junos:must "("protocols rsvp")";
                      junos:must-message "RSVP must be configured in the master instance";
                      description
                        "RSVP-TE point-to-multipoint LSP for flooding";
                      uses apply-advanced;
    
                      choice static-or-dynamic {
                        leaf static-lsp {
                          junos:must "(!(".. .. .. .. .. rsvp-te static-lsp $$"))";
                          junos:must-message "Referenced point-to-multipoint static LSP configured for inclusive tunnel";
                          junos:must "(any "protocols mpls label-switched-path <*> p2mp $$")";
                          junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                          type string {
                            junos:posix-pattern "^.{1,32}$";
                            junos:pattern-message "Must be a string of 32 characters or less";
                          }
                          description
                            "Name of point-to-multipoint LSP";
                        }
                        container label-switched-path-template {
                          description
                            "Template for dynamic point-to-multipoint LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                              junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-multipoint LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // choice static-or-dynamic
                    }  // container rsvp-te
                    container ldp-p2mp {
                      junos:must "("protocols ldp p2mp")";
                      junos:must-message "LDP P2MP must be configured in the master instance";
                      junos:must "((".. .. .. .. .. protocols mvpn" && (".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast")))";
                      junos:must-message "LDP P2MP LSPs can be configured only for MVPN instances";
                      presence "enable ldp-p2mp";
                      description
                        "LDP point-to-multipoint LSP for flooding";
                    }  // container ldp-p2mp
                    container pim-ssm {
                      junos:must "(!(".. .. .. .. .. protocols mvpn sender-based-rpf"))";
                      junos:must-message "This release does not support sender based RPF for PIM-SSM provider-tunnel";
                      junos:must "(".. .. .. .. .. protocols mvpn")";
                      junos:must-message "";
                      junos:must "(".. .. .. .. .. instance-type vrf")";
                      junos:must-message "PIM-SSM can be configured only for vrf instances";
                      junos:must "("protocols pim")";
                      junos:must-message "PIM-SSM must be configured in the master instance";
                      description
                        "PIM-SSM provider tunnel";
                      uses apply-advanced;
    
                      leaf group-range {
                        type jt:ipv4prefix;
                        description
                          "PIM-SSM provider tunnel group range";
                      }
                    }  // container pim-ssm
                  }  // choice tunnel-type
    
                  container inter-region-segmented {
                    junos:must "(!((".. pim-ssm" || ".. pim-asm")))";
                    junos:must-message "Inter-region-segmented cannot be set for PIM tunnel";
                    description
                      "Inter-Region Segmented LSP triggered by fan-out factor only";
                    uses apply-advanced;
    
                    leaf fan-out {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 10000";
                        }
                      }
                      description
                        "Number of remote Leaf-AD routes";
                    }
                  }  // container inter-region-segmented
                }  // container wildcard-source
              }  // container wildcard-group-inet6
    
              list group {
                key "name";
                ordered-by user;
                description
                  "IP prefix of multicast group";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP prefix of group";
                }
    
                uses apply-advanced;
    
                container wildcard-source {
                  junos:must "(".. .. .. .. protocols mvpn mvpn-mode rpt-spt")";
                  junos:must-message "MVPN instance needs to be in rpt-spt mode while configuring wildcard-source for selective provider tunnels";
                  presence
                    "enable wildcard-source";
                  description
                    "Use Selective-Tunnel for wildcard-source (*,G) joins";
                  uses apply-advanced;
    
                  leaf threshold-rate {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1000000";
                      }
                    }
                    units "kilobits";
                    description
                      "Data threshold to create new tunnel";
                  }
    
                  choice tunnel-type {
                    container ingress-replication {
                      junos:must "(((".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast") && ".. .. .. .. .. protocols mvpn"))";
                      junos:must-message "Ingress Replication can be configured only for MVPN instances.";
                      description
                        "Ingress replication tunnel";
                      uses apply-advanced;
    
                      leaf create-new-ucast-tunnel {
                        junos:must "(".. label-switched-path label-switched-path-template")";
                        junos:must-message "label-switched-path-template must be defined";
                        type empty;
                        description
                          "Create new unicast tunnel for ingress replication";
                      }
    
                      container label-switched-path {
                        presence
                          "enable label-switched-path";
                        description
                          "Point-to-point LSP unicast tunnel";
                        uses apply-advanced;
    
                        container label-switched-path-template {
                          junos:must "(".. .. create-new-ucast-tunnel")";
                          junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                          description
                            "Template for dynamic point-to-point LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                              junos:must-message "Referenced point-to-point LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-point LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // container label-switched-path
                    }  // container ingress-replication
                    container rsvp-te {
                      junos:must "("protocols rsvp")";
                      junos:must-message "RSVP must be configured in the master instance";
                      description
                        "RSVP-TE point-to-multipoint LSP for flooding";
                      uses apply-advanced;
    
                      choice static-or-dynamic {
                        leaf static-lsp {
                          junos:must "(!(".. .. .. .. .. rsvp-te static-lsp $$"))";
                          junos:must-message "Referenced point-to-multipoint static LSP configured for inclusive tunnel";
                          junos:must "(any "protocols mpls label-switched-path <*> p2mp $$")";
                          junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                          type string {
                            junos:posix-pattern "^.{1,32}$";
                            junos:pattern-message "Must be a string of 32 characters or less";
                          }
                          description
                            "Name of point-to-multipoint LSP";
                        }
                        container label-switched-path-template {
                          description
                            "Template for dynamic point-to-multipoint LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                              junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-multipoint LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // choice static-or-dynamic
                    }  // container rsvp-te
                    container ldp-p2mp {
                      junos:must "("protocols ldp p2mp")";
                      junos:must-message "LDP P2MP must be configured in the master instance";
                      junos:must "((".. .. .. .. .. protocols mvpn" && (".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast")))";
                      junos:must-message "LDP P2MP LSPs can be configured only for MVPN instances";
                      presence "enable ldp-p2mp";
                      description
                        "LDP point-to-multipoint LSP for flooding";
                    }  // container ldp-p2mp
                    container pim-ssm {
                      junos:must "(!(".. .. .. .. .. protocols mvpn sender-based-rpf"))";
                      junos:must-message "This release does not support sender based RPF for PIM-SSM provider-tunnel";
                      junos:must "(".. .. .. .. .. protocols mvpn")";
                      junos:must-message "";
                      junos:must "(".. .. .. .. .. instance-type vrf")";
                      junos:must-message "PIM-SSM can be configured only for vrf instances";
                      junos:must "("protocols pim")";
                      junos:must-message "PIM-SSM must be configured in the master instance";
                      description
                        "PIM-SSM provider tunnel";
                      uses apply-advanced;
    
                      leaf group-range {
                        type jt:ipv4prefix;
                        description
                          "PIM-SSM provider tunnel group range";
                      }
                    }  // container pim-ssm
                  }  // choice tunnel-type
    
                  container inter-region-segmented {
                    junos:must "(!((".. pim-ssm" || ".. pim-asm")))";
                    junos:must-message "Inter-region-segmented cannot be set for PIM tunnel";
                    description
                      "Inter-Region Segmented LSP triggered by threshold rate and/or fan-out";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 1000000";
                        }
                      }
                      units "kilobits";
                      description
                        "Data threshold rate to trigger segmentation";
                    }
    
                    leaf fan-out {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 10000";
                        }
                      }
                      description
                        "Number of remote Leaf-AD routes";
                    }
                  }  // container inter-region-segmented
                }  // container wildcard-source
    
                list source {
                  key "name";
                  ordered-by user;
                  description
                    "IP prefix of one or more multicast sources";
                  leaf name {
                    type jt:ipprefix;
                    description
                      "IP prefix of source";
                  }
    
                  uses apply-advanced;
    
                  choice tunnel-type {
                    container ingress-replication {
                      junos:must "(((".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast") && ".. .. .. .. .. protocols mvpn"))";
                      junos:must-message "Ingress Replication can be configured only for MVPN instances";
                      description
                        "Ingress replication tunnel";
                      uses apply-advanced;
    
                      leaf create-new-ucast-tunnel {
                        junos:must "(".. label-switched-path label-switched-path-template")";
                        junos:must-message "label-switched-path-template must be defined";
                        type empty;
                        description
                          "Create new unicast tunnel for ingress replication";
                      }
    
                      container label-switched-path {
                        presence
                          "enable label-switched-path";
                        description
                          "Point-to-point LSP unicast tunnel";
                        uses apply-advanced;
    
                        container label-switched-path-template {
                          junos:must "(".. .. create-new-ucast-tunnel")";
                          junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                          description
                            "Template for dynamic point-to-point LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                              junos:must-message "Referenced point-to-point LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-point LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // container label-switched-path
                    }  // container ingress-replication
                    container rsvp-te {
                      junos:must "("protocols rsvp")";
                      junos:must-message "RSVP must be configured in the master instance";
                      description
                        "RSVP-TE point-to-multipoint LSP for flooding";
                      uses apply-advanced;
    
                      choice static-or-dynamic {
                        leaf static-lsp {
                          junos:must "(!(".. .. .. .. .. rsvp-te static-lsp $$"))";
                          junos:must-message "Referenced point-to-multipoint static LSP configured for inclusive tunnel";
                          junos:must "(any "protocols mpls label-switched-path <*> p2mp $$")";
                          junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                          type string {
                            junos:posix-pattern "^.{1,32}$";
                            junos:pattern-message "Must be a string of 32 characters or less";
                          }
                          description
                            "Name of point-to-multipoint LSP";
                        }
                        container label-switched-path-template {
                          description
                            "Template for dynamic point-to-multipoint LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                              junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-multipoint LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // choice static-or-dynamic
                    }  // container rsvp-te
                    container pim-ssm {
                      junos:must "(!(".. .. .. .. .. protocols mvpn sender-based-rpf"))";
                      junos:must-message "This release does not support sender based RPF for PIM-SSM provider-tunnel";
                      junos:must "(".. .. .. .. .. protocols mvpn")";
                      junos:must-message "";
                      junos:must "(".. .. .. .. .. instance-type vrf")";
                      junos:must-message "PIM-SSM can be configured only for vrf instances";
                      junos:must "("protocols pim")";
                      junos:must-message "PIM-SSM must be configured in the master instance";
                      description
                        "PIM-SSM provider tunnel";
                      uses apply-advanced;
    
                      leaf group-range {
                        type jt:ipv4prefix;
                        description
                          "PIM-SSM provider tunnel group range";
                      }
                    }  // container pim-ssm
                    container ldp-p2mp {
                      junos:must "("protocols ldp p2mp")";
                      junos:must-message "LDP P2MP must be configured in the master instance";
                      junos:must "((".. .. .. .. .. protocols mvpn" && (".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast")))";
                      junos:must-message "LDP P2MP LSPs can be configured only for MVPN instances";
                      presence "enable ldp-p2mp";
                      description
                        "LDP point-to-multipoint LSP for flooding";
                    }  // container ldp-p2mp
                  }  // choice tunnel-type
    
                  leaf threshold-rate {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1000000";
                      }
                    }
                    units "kilobits";
                    description
                      "Data threshold to create new tunnel";
                  }
    
                  container inter-region-segmented {
                    junos:must "(!((".. pim-ssm" || ".. pim-asm")))";
                    junos:must-message "Inter-region-segmented cannot be set for PIM tunnel";
                    description
                      "Inter-Region Segmented LSP triggered by threshold rate and/or fan-out";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 1000000";
                        }
                      }
                      units "kilobits";
                      description
                        "Data threshold rate to trigger segmentation";
                    }
    
                    leaf fan-out {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 10000";
                        }
                      }
                      description
                        "Number of remote Leaf-AD routes";
                    }
                  }  // container inter-region-segmented
                }  // list source
              }  // list group
            }  // container selective
    
            container mdt {
              junos:must "(".. .. protocols pim mvpn")";
              junos:must-message "Data MDT tunnels can only be configured for PIM MVPN instances";
              status deprecated;
              description
                "Data MDT tunnels for PIM MVPN";
              uses apply-advanced;
    
              container threshold {
                description
                  "Threshold for creation of multicast tunnels";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP prefix of multicast group";
                  leaf name {
                    type jt:ipprefix;
                    description
                      "IP prefix of group";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP prefix of one or more multicast sources ";
                    leaf name {
                      type jt:ipprefix;
                      description
                        "IP prefix of source";
                    }
    
                    uses apply-advanced;
    
                    leaf rate {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "10 .. 1000000";
                        }
                      }
                      units "kilobits";
                      description
                        "Data threshold to create new tunnel";
                    }
                  }  // list source
                }  // list group
              }  // container threshold
    
              leaf data-mdt-reuse {
                type empty;
                description
                  "Allow multiple customer streams to be transmitted over one data tunnel ";
              }
    
              leaf tunnel-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 8192";
                  }
                }
                description
                  "Maximum multicast data tunnels";
              }
    
              leaf group-range {
                type jt:ipprefix;
                description
                  "Group address range for multicast data tunnels";
              }
            }  // container mdt
    
            container family {
              presence "enable family";
              uses apply-advanced;
    
              container inet {
                junos:must "(!((" .. .. .. non-forwarding-vrf" && (". rsvp-te" || (". pim-asm" || (". pim-ssm" || ". ldp-p2mp"))))))";
                junos:must-message "Inclusive p-tunnel configuration not allowed on ASBR with non-forwarding-vrf";
                presence "enable inet";
                uses apply-advanced;
    
                choice tunnel-type {
                  container rsvp-te {
                    junos:must "((".. .. .. .. instance-type vpls" || (".. .. .. .. protocols mvpn" && (".. .. .. .. instance-type vrf" || ".. .. .. .. instance-type mpls-internet-multicast"))))";
                    junos:must-message "Point-to-multipoint LSPs can be configured only for VPLS or MVPN instances";
                    junos:must "("protocols rsvp")";
                    junos:must-message "RSVP must be configured in the master instance";
                    description
                      "RSVP-TE point-to-multipoint LSP for flooding";
                    uses apply-advanced;
    
                    choice static-or-dynamic {
                      leaf static-lsp {
                        junos:must "((any "protocols mpls label-switched-path <*> p2mp $$" || ".. .. .. instance-type vpls"))";
                        junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                        type string {
                          junos:posix-pattern "^.{1,32}$";
                          junos:pattern-message "Must be a string of 32 characters or less";
                        }
                        description
                          "Name of point-to-multipoint LSP";
                      }
                      container label-switched-path-template {
                        description
                          "Template for dynamic point-to-multipoint LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                            junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-multipoint LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // choice static-or-dynamic
                  }  // container rsvp-te
                  container ldp-p2mp {
                    junos:must "("protocols ldp p2mp")";
                    junos:must-message "LDP P2MP must be configured in the master instance";
                    junos:must "((".. .. .. .. protocols mvpn" && (".. .. .. .. instance-type vrf" || ".. .. .. .. instance-type mpls-internet-multicast")))";
                    junos:must-message "LDP P2MP LSPs can be configured only for valid MVPN instances";
                    presence "enable ldp-p2mp";
                    description
                      "LDP point-to-multipoint LSP for flooding";
                  }  // container ldp-p2mp
                  container ingress-replication {
                    junos:must "(((".. .. .. .. instance-type vrf" || ".. .. .. .. instance-type mpls-internet-multicast") && ".. .. .. .. protocols mvpn"))";
                    junos:must-message "Ingress Replication can be configured only for MVPN instances";
                    junos:must "(!(".. .. .. .. protocols mvpn sender-based-rpf"))";
                    junos:must-message "This release does not support Sender based RPF for inclusive ingress replication provider tunnels";
                    description
                      "Ingress replication tunnel";
                    uses apply-advanced;
    
                    leaf create-new-ucast-tunnel {
                      junos:must "(".. label-switched-path label-switched-path-template")";
                      junos:must-message "label-switched-path-template must be defined";
                      type empty;
                      description
                        "Create new unicast tunnel for ingress replication";
                    }
    
                    container label-switched-path {
                      presence
                        "enable label-switched-path";
                      description
                        "Point-to-point LSP unicast tunnel";
                      uses apply-advanced;
    
                      container label-switched-path-template {
                        junos:must "(".. .. create-new-ucast-tunnel")";
                        junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                        description
                          "Template for dynamic point-to-point LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                            junos:must-message "Referenced point-to-point LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-point LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // container label-switched-path
                  }  // container ingress-replication
                  container pim-asm {
                    junos:must "(!(".. .. .. .. protocols mvpn sender-based-rpf"))";
                    junos:must-message "this release does not support sender based RPF for PIM-SM provider tunnels";
                    junos:must "(!("protocols pim mpls-internet-multicast"))";
                    junos:must-message "mpls-internet-multicast must not be configured";
                    junos:must "("protocols pim")";
                    junos:must-message "PIM-SM must be configured in the master instance";
                    junos:must "(".. .. .. .. instance-type vrf")";
                    junos:must-message "PIM-SM must be configured only for vrf instances";
                    description
                      "PIM-SM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SM provider tunnel group address";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container pim-asm
                  container pim-ssm {
                    junos:must "(!(".. .. .. .. protocols mvpn sender-based-rpf"))";
                    junos:must-message "this release does not support sender based RPF for PIM-SSM provider tunnels";
                    junos:must "(!("protocols pim mpls-internet-multicast"))";
                    junos:must-message "mpls-internet-multicast must not be configured";
                    junos:must "("protocols pim")";
                    junos:must-message "PIM-SSM must be configured in the master instance";
                    junos:must "(".. .. .. .. protocols mvpn")";
                    junos:must-message "PIM-SSM provider tunnel can be configured only for multicast VPN instances";
                    junos:must "(".. .. .. .. instance-type vrf")";
                    junos:must-message "PIM-SM must be configured only for vrf instances";
                    description
                      "PIM-SSM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SSM provider tunnel group address";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container pim-ssm
                }  // choice tunnel-type
    
                container mdt {
                  junos:must "(".. .. .. .. protocols pim mvpn")";
                  junos:must-message "Data MDT tunnels can only be configured for PIM
    MVPN instances";
                  description
                    "IPv4 Data MDT tunnels for PIM MVPN";
                  uses apply-advanced;
    
                  container threshold {
                    description
                      "Threshold for creation of multicast tunnels";
                    uses apply-advanced;
    
                    list group {
                      key "name";
                      ordered-by user;
                      description
                        "IP prefix of multicast group";
                      leaf name {
                        type jt:ipprefix;
                        description
                          "IP prefix of group";
                      }
    
                      uses apply-advanced;
    
                      list source {
                        key "name";
                        ordered-by user;
                        description
                          "IP prefix of one or more multicast sources ";
                        leaf name {
                          type jt:ipprefix;
                          description
                            "IP prefix of source";
                        }
    
                        uses apply-advanced;
    
                        leaf rate {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "10 .. 1000000";
                            }
                          }
                          units "kilobits";
                          description
                            "Data threshold to create new tunnel";
                        }
                      }  // list source
                    }  // list group
                  }  // container threshold
    
                  leaf data-mdt-reuse {
                    type empty;
                    description
                      "Allow multiple customer streams to be transmitted over one data tunnel ";
                  }
    
                  leaf tunnel-limit {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 8192";
                      }
                    }
                    description
                      "Maximum multicast data tunnels";
                  }
    
                  leaf group-range {
                    type jt:ipprefix;
                    description
                      "Group address range for multicast data tunnels";
                  }
                }  // container mdt
              }  // container inet
    
              container inet6 {
                junos:must "(!((" .. .. .. non-forwarding-vrf" && (". rsvp-te" || (". pim-asm" || (". pim-ssm" || ". ldp-p2mp"))))))";
                junos:must-message "Inclusive p-tunnel configuration not allowed on ASBR with non-forwarding-vrf";
                presence "enable inet6";
                uses apply-advanced;
    
                choice tunnel-type {
                  container rsvp-te {
                    junos:must "((".. .. .. .. instance-type vpls" || (".. .. .. .. protocols mvpn" && (".. .. .. .. instance-type vrf" || ".. .. .. .. instance-type mpls-internet-multicast"))))";
                    junos:must-message "Point-to-multipoint LSPs can be configured only for VPLS or MVPN instances";
                    junos:must "("protocols rsvp")";
                    junos:must-message "RSVP must be configured in the master instance";
                    description
                      "RSVP-TE point-to-multipoint LSP for flooding";
                    uses apply-advanced;
    
                    choice static-or-dynamic {
                      leaf static-lsp {
                        junos:must "((any "protocols mpls label-switched-path <*> p2mp $$" || ".. .. .. instance-type vpls"))";
                        junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                        type string {
                          junos:posix-pattern "^.{1,32}$";
                          junos:pattern-message "Must be a string of 32 characters or less";
                        }
                        description
                          "Name of point-to-multipoint LSP";
                      }
                      container label-switched-path-template {
                        description
                          "Template for dynamic point-to-multipoint LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                            junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-multipoint LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // choice static-or-dynamic
                  }  // container rsvp-te
                  container ldp-p2mp {
                    junos:must "("protocols ldp p2mp")";
                    junos:must-message "LDP P2MP must be configured in the master instance";
                    junos:must "((".. .. .. .. protocols mvpn" && (".. .. .. .. instance-type vrf" || ".. .. .. .. instance-type mpls-internet-multicast")))";
                    junos:must-message "LDP P2MP LSPs can be configured only for valid MVPN instances";
                    presence "enable ldp-p2mp";
                    description
                      "LDP point-to-multipoint LSP for flooding";
                  }  // container ldp-p2mp
                  container ingress-replication {
                    junos:must "(((".. .. .. .. instance-type vrf" || ".. .. .. .. instance-type mpls-internet-multicast") && ".. .. .. .. protocols mvpn"))";
                    junos:must-message "Ingress Replication can be configured only for MVPN instances";
                    junos:must "(!(".. .. .. .. protocols mvpn sender-based-rpf"))";
                    junos:must-message "This release does not support Sender based RPF for inclusive ingress replication provider tunnels";
                    description
                      "Ingress replication tunnel";
                    uses apply-advanced;
    
                    leaf create-new-ucast-tunnel {
                      junos:must "(".. label-switched-path label-switched-path-template")";
                      junos:must-message "label-switched-path-template must be defined";
                      type empty;
                      description
                        "Create new unicast tunnel for ingress replication";
                    }
    
                    container label-switched-path {
                      presence
                        "enable label-switched-path";
                      description
                        "Point-to-point LSP unicast tunnel";
                      uses apply-advanced;
    
                      container label-switched-path-template {
                        junos:must "(".. .. create-new-ucast-tunnel")";
                        junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                        description
                          "Template for dynamic point-to-point LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                            junos:must-message "Referenced point-to-point LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-point LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // container label-switched-path
                  }  // container ingress-replication
                  container pim-asm {
                    junos:must "(!(".. .. .. .. protocols mvpn sender-based-rpf"))";
                    junos:must-message "this release does not support sender based RPF for PIM-SM provider tunnels";
                    junos:must "(!("protocols pim mpls-internet-multicast"))";
                    junos:must-message "mpls-internet-multicast must not be configured";
                    junos:must "("protocols pim")";
                    junos:must-message "PIM-SM must be configured in the master instance";
                    junos:must "(".. .. .. .. instance-type vrf")";
                    junos:must-message "PIM-SM must be configured only for vrf instances";
                    description
                      "PIM-SM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SM provider tunnel group address";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container pim-asm
                  container pim-ssm {
                    junos:must "(!(".. .. .. .. protocols mvpn sender-based-rpf"))";
                    junos:must-message "this release does not support sender based RPF for PIM-SSM provider tunnels";
                    junos:must "(!("protocols pim mpls-internet-multicast"))";
                    junos:must-message "mpls-internet-multicast must not be configured";
                    junos:must "("protocols pim")";
                    junos:must-message "PIM-SSM must be configured in the master instance";
                    junos:must "(".. .. .. .. protocols mvpn")";
                    junos:must-message "PIM-SSM provider tunnel can be configured only for multicast VPN instances";
                    junos:must "(".. .. .. .. instance-type vrf")";
                    junos:must-message "PIM-SM must be configured only for vrf instances";
                    description
                      "PIM-SSM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SSM provider tunnel group address";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container pim-ssm
                }  // choice tunnel-type
    
                container mdt {
                  junos:must "(".. .. .. .. protocols pim mvpn")";
                  junos:must-message "Data MDT tunnels can only be configured for PIM
    MVPN instances";
                  description
                    "IPv6 Data MDT tunnels for PIM MVPN";
                  uses apply-advanced;
    
                  container threshold {
                    description
                      "Threshold for creation of multicast tunnels";
                    uses apply-advanced;
    
                    list group {
                      key "name";
                      ordered-by user;
                      description
                        "IP prefix of multicast group";
                      leaf name {
                        type jt:ipprefix;
                        description
                          "IP prefix of group";
                      }
    
                      uses apply-advanced;
    
                      list source {
                        key "name";
                        ordered-by user;
                        description
                          "IP prefix of one or more multicast sources ";
                        leaf name {
                          type jt:ipprefix;
                          description
                            "IP prefix of source";
                        }
    
                        uses apply-advanced;
    
                        leaf rate {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "10 .. 1000000";
                            }
                          }
                          units "kilobits";
                          description
                            "Data threshold to create new tunnel";
                        }
                      }  // list source
                    }  // list group
                  }  // container threshold
    
                  leaf data-mdt-reuse {
                    type empty;
                    description
                      "Allow multiple customer streams to be transmitted over one data tunnel ";
                  }
    
                  leaf tunnel-limit {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 8192";
                      }
                    }
                    description
                      "Maximum multicast data tunnels";
                  }
    
                  leaf group-range {
                    type jt:ipprefix;
                    description
                      "Group address range for multicast data tunnels";
                  }
                }  // container mdt
              }  // container inet6
            }  // container family
          }  // container provider-tunnel
    
          container multicast-snooping-options {
            junos:must "((".. instance-type vpls" || (".. instance-type evpn" || (".. instance-type virtual-switch " || ".. instance-type mac-vrf "))))";
            junos:must-message "multicast-snooping-options configuration is allowed only for 'instance-type vpls/evpn or instance-type virtual-switch/mac-vrf'";
            description
              "Multicast snooping option configuration";
            uses juniper-multicast-snooping-options;
          }  // container multicast-snooping-options
    
          container mld-snooping-options {
            junos:must "((".. instance-type vpls" || (".. instance-type virtual-switch" || (".. instance-type evpn" && ".. protocols vpls"))))";
            junos:must-message "mld-snooping-options configuration is allowed only for 'instance-type vpls or instance-type virtual-switch'";
            description
              "MLD snooping option configuration";
            uses juniper-mld-snooping-options;
          }  // container mld-snooping-options
    
          container vlans {
            junos:must "((".. instance-type virtual-switch" || ".. instance-type mac-vrf"))";
            junos:must-message "'vlans' configuration can only be used for 'instance-type virtual-switch' or 'instance-type mac-vrf'";
            junos:must "(!("bridge-domains"))";
            junos:must-message "VLANs cannot be configured when BDs are configured";
            description "VLAN configuration";
            uses apply-advanced;
    
            list vlan {
              key "name";
              description "Virtual LAN";
              uses vlan-types;
            }  // list vlan
          }  // container vlans
        }  // grouping juniper-routing-instance
    
        grouping address-assignment-type {
          description
            "Address assignment configuration";
          uses apply-advanced;
    
          container neighbor-discovery-router-advertisement {
            description
              "Designated NDRA pool for this instance";
            leaf ndra-name {
              junos:must "(".. .. pool $$  family inet6")";
              junos:must-message "designated NDRA pool must be configured and family inet6 must be set";
              type string {
                junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                length "1 .. 63";
              }
              description
                "Designated NDRA pool name";
            }
          }  // container neighbor-discovery-router-advertisement
    
          leaf high-utilization {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "2 .. 99";
              }
            }
            description
              "Generate an SNMP trap when address pool use surpasses this percentage";
          }
    
          leaf abated-utilization {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 98";
              }
            }
            description
              "Generate an SNMP clear trap when address pool use falls below this percentage";
          }
    
          leaf high-utilization-v6 {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "2 .. 99";
              }
            }
            description
              "Generate an SNMP trap when address pool use surpasses this percentage";
          }
    
          leaf abated-utilization-v6 {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 98";
              }
            }
            description
              "Generate an SNMP clear trap when address pool use falls below this percentage";
          }
    
          list pool {
            key "name";
            ordered-by user;
            description "Address pool";
            leaf name {
              junos:must "(!(".. link $$"))";
              junos:must-message "Link cannot be self referential";
              type string {
                junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                length "1 .. 63";
              }
              description "Address pool name";
            }
    
            uses apply-advanced;
    
            leaf active-drain {
              type empty;
              description
                "Notify client of pool active drain mode";
            }
    
            leaf hold-down {
              type empty;
              description
                "Place pool in passive drain mode";
            }
    
            leaf link {
              junos:must "(".. .. pool $$")";
              junos:must-message "Link must be to a valid pool name";
              type string {
                junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                length "1 .. 63";
              }
              description
                "Address pool link name";
            }
    
            container family {
              presence "enable family";
              description "Address family";
              choice family_type {
                container inet {
                  presence "enable inet";
                  description "IPv4";
                  uses apply-advanced;
    
                  leaf network {
                    type jt:ipv4prefix;
                    description
                      "Network address";
                  }
    
                  list range {
                    key "name";
                    ordered-by user;
                    description "Address range";
                    leaf name {
                      type string {
                        junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                        junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                        length "1 .. 63";
                      }
                      description "Range name";
                    }
    
                    uses apply-advanced;
    
                    leaf low {
                      type jt:ipv4addr;
                      description
                        "Lower limit of address range";
                    }
    
                    leaf high {
                      type jt:ipv4addr;
                      description
                        "Upper limit of address range";
                    }
                  }  // list range
    
                  container dhcp-attributes {
                    description
                      "DHCP options and match criteria";
                    uses dhcp-attribute-type;
                  }  // container dhcp-attributes
    
                  container xauth-attributes {
                    description
                      "Configure xauth attributes";
                    uses apply-advanced;
    
                    leaf primary-dns {
                      type jt:ipv4prefix;
                      description
                        "Specify the primary-dns IP address";
                    }
    
                    leaf secondary-dns {
                      type jt:ipv4prefix;
                      description
                        "Specify the secondary-dns IP address";
                    }
    
                    leaf primary-wins {
                      type jt:ipv4prefix;
                      description
                        "Specify the primary-wins IP address";
                    }
    
                    leaf secondary-wins {
                      type jt:ipv4prefix;
                      description
                        "Specify the secondary-wins IP address";
                    }
                  }  // container xauth-attributes
    
                  list host {
                    key "name";
                    ordered-by user;
                    description
                      "Hostname for static reservations";
                    leaf name {
                      junos:must "((".. hardware-address" || ".. user-name"))";
                      junos:must-message "either host's hardware address or identifier must be set";
                      type string {
                        length "1 .. 256";
                      }
                      description "Hostname";
                    }
    
                    uses apply-advanced;
    
                    leaf hardware-address {
                      type jt:mac-addr;
                      description
                        "Hardware address";
                    }
    
                    leaf ip-address {
                      type jt:ipv4addr;
                      description
                        "Reserved address";
                    }
    
                    choice host-identifier-type {
                      leaf user-name {
                        type empty;
                        description
                          "Set subscriber user name as host identifier";
                      }
                    }  // choice host-identifier-type
                  }  // list host
    
                  list excluded-address {
                    key "name";
                    max-elements 20;
                    ordered-by user;
                    description
                      "Excluded Addresses";
                    leaf name {
                      type jt:ipv4addr;
                      description
                        "Excluded address";
                    }
    
                    uses apply-advanced;
                  }  // list excluded-address
    
                  list excluded-range {
                    key "name";
                    max-elements 20;
                    ordered-by user;
                    description
                      "Excluded address range";
                    leaf name {
                      type string {
                        junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                        junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                        length "1 .. 63";
                      }
                      description "Range name";
                    }
    
                    uses apply-advanced;
    
                    leaf low {
                      type jt:ipv4addr;
                      description
                        "Lower limit of excluded address range";
                    }
    
                    leaf high {
                      type jt:ipv4addr;
                      description
                        "Upper limit of excluded address range";
                    }
                  }  // list excluded-range
                }  // container inet
                container inet6 {
                  presence "enable inet6";
                  description "IPv6";
                  uses apply-advanced;
    
                  leaf prefix {
                    type jt:ipv6prefix-mandatory;
                    description
                      "IPv6 network prefix";
                  }
    
                  list range {
                    key "name";
                    ordered-by user;
                    description
                      "IPv6 address range";
                    leaf name {
                      type string {
                        junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                        junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                        length "1 .. 63";
                      }
                      description "Range name";
                    }
    
                    uses apply-advanced;
    
                    leaf low {
                      junos:must "(".. high")";
                      junos:must-message "range upper bound must be defined";
                      type jt:ipv6prefix-mandatory;
                      description
                        "Lower limit of ipv6 address range";
                    }
    
                    leaf high {
                      junos:must "(".. low")";
                      junos:must-message "range lower bound must be defined";
                      type jt:ipv6prefix-mandatory;
                      description
                        "Upper limit of ipv6 address range";
                    }
    
                    leaf prefix-length {
                      junos:must "(!(".. low"))";
                      junos:must-message "range lower bound may not be defined";
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 128";
                        }
                      }
                      description
                        "IPv6 delegated prefix length";
                    }
                  }  // list range
    
                  container dhcp-attributes {
                    description
                      "DHCP options and match criteria";
                    uses dhcp-attribute-type;
                  }  // container dhcp-attributes
    
                  container xauth-attributes {
                    description
                      "Configure xauth ipv6 attributes";
                    uses apply-advanced;
    
                    leaf primary-dns-ipv6 {
                      type jt:ipv6addr;
                      description
                        "Specify the primary-dns IPv6 address";
                    }
    
                    leaf secondary-dns-ipv6 {
                      type jt:ipv6addr;
                      description
                        "Specify the secondary-dns IPv6 address";
                    }
                  }  // container xauth-attributes
    
                  list host {
                    key "name";
                    ordered-by user;
                    description
                      "Hostname for static reservations";
                    leaf name {
                      junos:must "((".. hardware-address" || ".. user-name"))";
                      junos:must-message "either host's hardware address or identifier must be set";
                      type string {
                        length "1 .. 256";
                      }
                      description "Hostname";
                    }
    
                    uses apply-advanced;
    
                    leaf hardware-address {
                      type jt:mac-addr;
                      description
                        "Hardware address";
                    }
    
                    leaf ip-address {
                      type jt:ipv6addr;
                      description
                        "Reserved address";
                    }
    
                    choice host-identifier-type {
                      leaf user-name {
                        type empty;
                        description
                          "Set subscriber user name as host identifier";
                      }
                    }  // choice host-identifier-type
                  }  // list host
    
                  list excluded-address {
                    key "name";
                    max-elements 20;
                    ordered-by user;
                    description
                      "Excluded Addresses";
                    leaf name {
                      type jt:ipv6addr;
                      description
                        "Excluded address";
                    }
    
                    uses apply-advanced;
                  }  // list excluded-address
    
                  list excluded-range {
                    key "name";
                    max-elements 20;
                    ordered-by user;
                    description
                      "Excluded address range";
                    leaf name {
                      type string {
                        junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                        junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                        length "1 .. 63";
                      }
                      description "Range name";
                    }
    
                    uses apply-advanced;
    
                    leaf low {
                      type jt:ipv6addr;
                      description
                        "Lower limit of excluded address range";
                    }
    
                    leaf high {
                      type jt:ipv6addr;
                      description
                        "Upper limit of excluded address range";
                    }
                  }  // list excluded-range
                }  // container inet6
              }  // choice family_type
            }  // container family
          }  // list pool
    
          list domain-profile {
            key "name";
            ordered-by user;
            description "Address domain profile";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Pool domain profile name";
            }
    
            uses apply-advanced;
    
            container family {
              description
                "Network family to which this configuration belongs";
              uses apply-advanced;
    
              container inet {
                description
                  "The IPv4 internet family";
                uses apply-advanced;
    
                leaf preferred-prefix-length {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "8 .. 30";
                    }
                  }
                  description
                    "Preferred prefix length";
                }
    
                leaf source-partition-qualifier {
                  type string {
                    length "1 .. 63";
                  }
                  description
                    "Prefix source qualifier appended to location for partition name";
                }
    
                container excluded-address {
                  description
                    "Excluded addresses from allocation";
                  leaf-list last-octet {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint8 {
                        range "0 .. 255";
                      }
                    }
                    ordered-by user;
                    description
                      "Last octet of the excluded address";
                  }
                }  // container excluded-address
    
                leaf install-discard-routes {
                  type empty;
                  description
                    "Install discard route domain pool prefix";
                }
    
                leaf dhcp-router-host-part {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "1 .. 8";
                    }
                  }
                  description
                    "DHCP host address component to be excluded and passed to DHCP";
                }
    
                leaf protocol-attributes {
                  junos:must "("access protocol-attributes $$")";
                  junos:must-message "referenced protocol-attributes must be defined";
                  type string {
                    length "1 .. 63";
                  }
                  description
                    "Access protocol-attributes name";
                }
              }  // container inet
            }  // container family
          }  // list domain-profile
        }  // grouping address-assignment-type
    
        grouping dhcp-attribute-type {
          uses apply-advanced;
    
          container option-match {
            description "Match";
            uses apply-advanced;
    
            container option-82 {
              uses apply-advanced;
    
              list circuit-id {
                key "name";
                ordered-by user;
                description
                  "Circuit ID portion of the option 82";
                leaf name {
                  type string;
                }
    
                leaf range {
                  type string;
                  description "Range name";
                }
              }  // list circuit-id
    
              list remote-id {
                key "name";
                ordered-by user;
                description
                  "Remote ID portion of the option 82";
                leaf name {
                  type string;
                }
    
                leaf range {
                  type string;
                  description "Range name";
                }
              }  // list remote-id
            }  // container option-82
          }  // container option-match
    
          leaf maximum-lease-time {
            type string;
            units "seconds";
            description
              "Maximum lease time advertised to clients";
          }
    
          leaf server-identifier {
            type jt:ipv4addr;
            description
              "Server Identifier - IP address value";
          }
    
          leaf grace-period {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            units "seconds";
            description
              "Grace period for leases";
          }
    
          leaf domain-name {
            type string {
              junos:posix-pattern "^[[:alnum:]._-]+$";
              junos:pattern-message "Must be a string of letters, numbers, dashes or underscores";
            }
            description
              "Domain name advertised to clients";
          }
    
          list name-server {
            key "name";
            ordered-by user;
            description
              "Domain name servers available to the client";
            leaf name {
              type jt:ipv4addr;
              description
                "DNS server's IPv4 address";
            }
    
            uses apply-advanced;
          }  // list name-server
    
          list wins-server {
            key "name";
            ordered-by user;
            description "WINS name servers";
            leaf name {
              type jt:ipv4addr;
              description
                "WINS server's IPv4 address";
            }
    
            uses apply-advanced;
          }  // list wins-server
    
          list router {
            key "name";
            ordered-by user;
            description
              "Routers advertised to clients";
            leaf name {
              type jt:ipv4addr;
              description
                "Router's IPv4 address";
            }
    
            uses apply-advanced;
          }  // list router
    
          leaf boot-file {
            type string;
            description
              "Boot filename advertised to clients";
          }
    
          leaf boot-server {
            type string {
              junos:posix-pattern "^[[:alnum:]._-]+$";
              junos:pattern-message "Must be a string of letters, numbers, dashes or underscores";
            }
            description
              "Boot server advertised to clients";
          }
    
          leaf tftp-server {
            type jt:ipv4addr;
            description
              "TFTP server IP address advertised to clients";
          }
    
          leaf netbios-node-type {
            type enumeration {
              enum "b-node" {
                value 0;
                description "Broadcast node";
              }
              enum "p-node" {
                value 1;
                description "Peer-to-peer node";
              }
              enum "m-node" {
                value 2;
                description "Mixed Node";
              }
              enum "h-node" {
                value 3;
                description "Hybrid node";
              }
            }
            description
              "Type of NETBIOS node advertised to clients";
          }
    
          leaf sip-server-domain-name {
            type string {
              junos:posix-pattern "^[[:alnum:]._-]+$";
              junos:pattern-message "Must be a string of letters, numbers, dashes or underscores";
            }
            description
              "SIP server domain name available to clients";
          }
    
          list sip-server-address {
            key "name";
            ordered-by user;
            description
              "SIP Servers list of IPv6 addresses available to the client";
            leaf name {
              type jt:ipv6addr;
              description
                "SIP Server's IPv6 address";
            }
    
            uses apply-advanced;
          }  // list sip-server-address
    
          list dns-server {
            key "name";
            ordered-by user;
            description
              "Domain name servers available to the client";
            leaf name {
              type jt:ipv6addr;
              description
                "DNS server's IPv6 address";
            }
    
            uses apply-advanced;
          }  // list dns-server
    
          list option {
            key "name";
            ordered-by user;
            description "DHCP option";
            leaf name {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "DHCP option identifier code";
            }
    
            choice option-type-choice {
              leaf flag {
                type enumeration {
                  enum "true" {
                    value 0;
                    description "True value";
                  }
                  enum "false" {
                    value 1;
                    description "False value";
                  }
                  enum "on" {
                    value 2;
                    description "On value";
                  }
                  enum "off" {
                    value 3;
                    description "Off value";
                  }
                }
                description "Boolean flag value";
              }
              leaf byte {
                type union {
                  type uint8;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Unsigned 8-bit value";
              }
              leaf short {
                type union {
                  type int16;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Signed 16-bit numeric value";
              }
              leaf unsigned-short {
                type union {
                  type uint16;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Unsigned 16-bit numeric value";
              }
              leaf integer {
                type union {
                  type int32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Signed 32-bit numeric value";
              }
              leaf unsigned-integer {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Unsigned 32-bit numeric value";
              }
              leaf hex-string {
                type string {
                  junos:posix-pattern "^[[:xdigit:]]+$";
                  junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                  length "1 .. 510";
                }
                description "Hexadecimal string";
              }
              leaf string {
                type string {
                  length "1 .. 254";
                }
                description
                  "Character string value";
              }
              leaf ip-address {
                type jt:ipv4addr;
                description "IP address value";
              }
              leaf ipv6-address {
                type jt:ipv6addr;
                description "IPV6 address value";
              }
              container array {
                presence "enable array";
                description "Array of values";
                uses apply-advanced;
    
                choice option-type-array-choice {
                  leaf-list flag {
                    type enumeration {
                      enum "true" {
                        value 0;
                        description "True value";
                      }
                      enum "false" {
                        value 1;
                        description
                          "False value";
                      }
                      enum "on" {
                        value 2;
                        description "On value";
                      }
                      enum "off" {
                        value 3;
                        description "Off value";
                      }
                    }
                    ordered-by user;
                    description
                      "Array of boolean flag values";
                  }
                  leaf-list byte {
                    type union {
                      type uint8;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Array of unsigned 8-bit values";
                  }
                  leaf-list short {
                    type union {
                      type int16;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Array of signed 16-bit numeric values";
                  }
                  leaf-list unsigned-short {
                    type union {
                      type uint16;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Array of 16-bit numeric values";
                  }
                  leaf-list integer {
                    type union {
                      type int32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Array of signed 32-bit numeric values";
                  }
                  leaf-list unsigned-integer {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Array of unsigned 32-bit numeric values";
                  }
                  leaf-list hex-string {
                    type string {
                      length "1 .. 510";
                    }
                    ordered-by user;
                    description
                      "Hexadecimal string";
                  }
                  leaf-list string {
                    type string {
                      length "1 .. 254";
                    }
                    ordered-by user;
                    description
                      "Array of character string values";
                  }
                  leaf-list ip-address {
                    type jt:ipv4addr;
                    ordered-by user;
                    description
                      "Array of IP address values";
                  }
                  leaf-list ipv6-address {
                    type jt:ipv6addr;
                    ordered-by user;
                    description
                      "Array of IPv6 address values";
                  }
                }  // choice option-type-array-choice
              }  // container array
            }  // choice option-type-choice
          }  // list option
    
          leaf valid-lifetime {
            junos:must "(!(".. maximum-lease-time"))";
            junos:must-message "'valid-lifetime' statement cannot be included along with 'maximum-lease-time'";
            type string;
            units "seconds";
            description
              "Valid lifetime advertised to clients";
          }
    
          leaf preferred-lifetime {
            junos:must "(!(".. maximum-lease-time"))";
            junos:must-message "'preferred-lifetime' statement cannot be included along with 'maximum-lease-time'";
            type string;
            units "seconds";
            description
              "Preferred lifetime advertised to clients";
          }
    
          leaf t1-percentage {
            junos:must "(!(".. t2-rebinding-time"))";
            junos:must-message "T1 must be configured in seconds to match T2";
            junos:must "(!(".. t1-renewal-time"))";
            junos:must-message "T1 time in seconds already configured";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 100";
              }
            }
            units "percent";
            description
              "T1 time as percentage of preferred lifetime or max lease";
          }
    
          leaf t2-percentage {
            junos:must "(!(".. t1-renewal-time"))";
            junos:must-message "T2 must be configured in seconds to match T1";
            junos:must "(!(".. t2-rebinding-time"))";
            junos:must-message "T2 time in seconds already configured";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 100";
              }
            }
            units "percent";
            description
              "T2 time as percentage of preferred lifetime or max lease";
          }
    
          leaf exclude-prefix-len {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 128";
              }
            }
            description
              "Length of IPv6 prefix to be excluded from delegated prefix";
          }
    
          leaf t1-renewal-time {
            junos:must "(!(".. t2-percentage"))";
            junos:must-message "T1 must be configured as percentage to match T2";
            junos:must "(!(".. t1-percentage"))";
            junos:must-message "T1 time as percentage already configured";
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            units "seconds";
            description "T1 renewal time";
          }
    
          leaf t2-rebinding-time {
            junos:must "(!(".. t1-percentage"))";
            junos:must-message "T2 must be configured as percentage to match T1";
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            units "seconds";
            description "T2 rebinding time";
          }
        }  // grouping dhcp-attribute-type
    
        grouping jdhcp-local-server-type {
          uses apply-advanced;
    
          container traceoptions {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "Incompatible with 'forwarding-options helpers bootp'";
            junos:must "(!("system services dhcp"))";
            junos:must-message "Incompatible with 'set system services dhcp'";
            status deprecated;
            description
              "DHCP local server trace options";
            uses jdhcp-traceoptions-type;
          }  // container traceoptions
    
          container interface-traceoptions {
            status deprecated;
            description
              "DHCP local server interface trace options";
            uses jdhcp-interface-traceoptions-type;
          }  // container interface-traceoptions
    
          container dhcpv6 {
            description "DHCPv6 configuration";
            uses dhcpv6-local-server-type;
          }  // container dhcpv6
    
          list pool-match-order {
            key "name";
            ordered-by user;
            description
              "Define order of attribute matching for pool selection";
            leaf name {
              type enumeration {
                enum "external-authority" {
                  value 0;
                  description
                    "External authority handles address selection";
                }
                enum "ip-address-first" {
                  value 1;
                  description
                    "IP address used first to select a pool";
                }
                enum "option-82" {
                  value 2;
                  description
                    "Option 82 used in matching of pool";
                }
                enum "option-82-strict" {
                  value 3;
                  description
                    "Option 82 used in strict matching of pool";
                }
              }
              description "Match type";
            }
    
            uses apply-advanced;
          }  // list pool-match-order
    
          leaf duplicate-clients-on-interface {
            type empty;
            status deprecated;
            description
              "Allow duplicate clients on different interfaces in a subnet";
          }
    
          container duplicate-clients-in-subnet {
            junos:must "(!(".. duplicate-clients-on-interface"))";
            junos:must-message "Cannot specify duplicate-clients-in-subnet with duplicate-clients-on-interface";
            description
              "Allow duplicate clients in a subnet";
            uses jdhcp-duplicate-clients-in-subnet-type;
          }  // container duplicate-clients-in-subnet
    
          container forward-snooped-clients {
            junos:must "((!(".. forward-only") && (!(".. forward-only-replies") && !(any ".. group <*> forward-only"))))";
            junos:must-message "forward-only and forward-only-replies cannot be configured when forward-snooped-clients is configured";
            description
              "Forward snooped (unicast) packets";
            choice interface-type {
              leaf configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured interfaces";
              }
              leaf non-configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on non-configured interfaces";
              }
              leaf all-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured and non-configured interfaces";
              }
            }  // choice interface-type
          }  // container forward-snooped-clients
    
          container authentication {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'authentication' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description "DHCP authentication";
            uses authentication-type;
          }  // container authentication
    
          container liveness-detection {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'liveness-detection' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description
              "DHCP client liveness detection processing";
            uses dhcp-liveness-detection-type;
          }  // container liveness-detection
    
          container reconfigure {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'reconfigure' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            presence "enable reconfigure";
            description
              "DHCP reconfigure processing";
            uses reconfigure-type;
          }  // container reconfigure
    
          container overrides {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'overrides' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            presence "enable overrides";
            description
              "DHCP override processing";
            uses override-local-server-type;
          }  // container overrides
    
          container dynamic-profile {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'dynamic-profile' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'access-profile' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container route-suppression {
            junos:must "(!(".. liveness-detection method layer2-liveness-detection"))";
            junos:must-message "Cannot specify route-suppression with liveness-detection method layer2-liveness-detection";
            junos:must "(!(".. overrides no-arp"))";
            junos:must-message "Cannot specify route-suppression with overrides no-arp";
            description
              "Suppress access-internal and/or destination route addition";
            uses dhcp-route-suppression-type;
          }  // container route-suppression
    
          list group {
            junos:must "(!("system services dhcp"))";
            junos:must-message "Incompatible with the dhcp server configured under 'system services dhcp'";
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'group' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            key "name";
            ordered-by user;
            description
              "Define a DHCP local server group";
            uses dhcp-local-server-group;
          }  // list group
    
          list dual-stack-group {
            key "name";
            description
              "Define a DHCP dual stack group";
            uses dhcp-local-server-dual-stack-group;
          }  // list dual-stack-group
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              choice violation-action-choice {
                leaf strict {
                  type empty;
                  description
                    "Reject discover and renew";
                }
                leaf override-lease {
                  type empty;
                  description
                    "Override assigned lease time with threshold";
                }
              }  // choice violation-action-choice
            }  // container violation-action
          }  // container lease-time-validation
    
          choice requested-ip-check {
            leaf requested-ip-network-match {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 31";
                }
              }
              default "8";
              description
                "Subnet to match server's address for active and giaddr for passive clients";
            }
            leaf requested-ip-interface-match {
              type empty;
              description
                "Use incoming-interface's subnet to check";
            }
          }  // choice requested-ip-check
    
          leaf no-snoop {
            junos:must "(!("legacy-snooping"))";
            junos:must-message "'no-snoop' statement cannot be included along with 'legacy-snooping' statement";
            type empty;
            description
              "Do not snoop DHCP packets";
          }
    
          container persistent-storage {
            description
              "Trigger to enable flat file storage";
            leaf automatic {
              type empty;
              description
                "Trigger automatically";
            }
          }  // container persistent-storage
    
          container allow-leasequery {
            presence "enable allow-leasequery";
            description "Allow DHCP leasequery";
            uses server-leasequery-type;
          }  // container allow-leasequery
    
          container remote-id-mismatch {
            junos:must "(!(".. reauthenticate"))";
            junos:must-message "'remote-id-mismatch' statement cannot be included with 'reauthenticate'";
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container reauthenticate {
            junos:must "(!(".. remote-id-mismatch"))";
            junos:must-message "'reauthenticate' statement cannot be included with 'remote-id-mismatch'";
            junos:must "((".. authentication" || ".. .. authentication"))";
            junos:must-message "'authentication' statement must be included with 'reauthenticate'";
            description
              "DHCP client reauthenticate processing";
            leaf lease-renewal {
              type empty;
              description
                "Reauthenticate on each renew, rebind, DISCOVER or SOLICIT";
            }
    
            leaf remote-id-mismatch {
              type empty;
              description
                "Reauthenticate on remote-id mismatch for renew, rebind and re-negotiation";
            }
          }  // container reauthenticate
    
          container allow-bulk-leasequery {
            presence
              "enable allow-bulk-leasequery";
            description
              "Allow DHCP bulk leasequery";
            uses server-bulk-leasequery-type;
          }  // container allow-bulk-leasequery
    
          container allow-active-leasequery {
            presence
              "enable allow-active-leasequery";
            description
              "Allow DHCP active leasequery";
            uses server-active-leasequery-type;
          }  // container allow-active-leasequery
        }  // grouping jdhcp-local-server-type
    
        grouping authentication-type {
          description "DHCP authentication";
          uses apply-advanced;
    
          leaf password {
            type string {
              length "1 .. 64";
            }
            description
              "Username password to use";
          }
    
          container username-include {
            description "Add username options";
            uses apply-advanced;
    
            leaf delimiter {
              type string {
                length "1";
              }
              description
                "Change delimiter/separator character";
            }
    
            leaf domain-name {
              type string {
                length "1 .. 64";
              }
              description "Add domain name";
            }
    
            leaf user-prefix {
              type string {
                length "1 .. 64";
              }
              description
                "Add user defined prefix";
            }
    
            leaf mac-address {
              type empty;
              description "Include MAC address";
            }
    
            container option-82 {
              presence "enable option-82";
              description "Include option 82";
              leaf circuit-id {
                type empty;
                description
                  "Include option 82 circuit-id (sub option 1)";
              }
    
              leaf remote-id {
                type empty;
                description
                  "Include option 82 remote-id (sub option 2)";
              }
            }  // container option-82
    
            leaf logical-system-name {
              type empty;
              description
                "Include logical system name";
            }
    
            leaf routing-instance-name {
              type empty;
              description
                "Include routing instance name";
            }
    
            container client-id {
              presence "enable client-id";
              description "Include client ID";
              leaf exclude-headers {
                type empty;
                description
                  "Exclude all the headers";
              }
    
              leaf use-automatic-ascii-hex-encoding {
                type empty;
                description
                  "Use automatic ascii hex username encoding";
              }
            }  // container client-id
    
            leaf option-60 {
              type empty;
              description "Include option 60";
            }
    
            leaf circuit-type {
              type empty;
              description "Include circuit type";
            }
    
            leaf interface-name {
              type empty;
              description
                "Include interface name";
            }
    
            leaf interface-description {
              type enumeration {
                enum "device" {
                  value 0;
                  description
                    "Add the device interface description";
                }
                enum "logical" {
                  value 1;
                  description
                    "Add the logical interface description";
                }
              }
              description
                "Include interface description";
            }
    
            leaf vlan-tags {
              type empty;
              description
                "Include the vlan tag(s)";
            }
          }  // container username-include
        }  // grouping authentication-type
    
        grouping dhcp-liveness-detection-type {
          description
            "DHCP client liveness detection processing";
          uses apply-advanced;
    
          container failure-action {
            description
              "Liveness detection failure action options";
            uses dhcp-liveness-detection-failure-action-type;
          }  // container failure-action
    
          container method {
            description
              "Liveness detection method options";
            uses apply-advanced;
    
            choice method-choice {
              container bfd {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses dhcp-bfd-liveness-detection-type;
              }  // container bfd
              container layer2-liveness-detection {
                junos:must "((!(".. .. route-suppression") && (!(".. .. .. route-suppression") && !(".. .. .. .. route-suppression"))))";
                junos:must-message "Method not allowed with route-suppression enabled";
                description
                  "Address resolution options";
                uses dhcp-arp-nud-liveness-detection-type;
              }  // container layer2-liveness-detection
            }  // choice method-choice
          }  // container method
        }  // grouping dhcp-liveness-detection-type
    
        grouping dhcp-arp-nud-liveness-detection-type {
          description
            "Address Resolution detection options";
          uses apply-advanced;
    
          leaf transmit-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "300 .. 1800";
              }
            }
            units "seconds";
            default "300";
            description
              "Transmit interval for address resolution";
          }
    
          leaf max-consecutive-retries {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "3 .. 6";
              }
            }
            default "3";
            description "Retry attempts";
          }
        }  // grouping dhcp-arp-nud-liveness-detection-type
    
        grouping dhcp-bfd-liveness-detection-type {
          description
            "Bidirectional Forwarding Detection (BFD) options";
          uses apply-advanced;
    
          leaf version {
            type enumeration {
              enum "0" {
                value 0;
                description
                  "BFD version 0 (deprecated)";
              }
              enum "1" {
                value 1;
                description "BFD version 1";
              }
              enum "automatic" {
                value 2;
                description
                  "Choose BFD version automatically";
              }
            }
            default "automatic";
            description
              "BFD protocol version number";
          }
    
          leaf minimum-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "30000 .. 255000";
              }
            }
            units "milliseconds";
            description
              "Minimum transmit and receive interval";
          }
    
          leaf minimum-transmit-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "30000 .. 255000";
              }
            }
            units "milliseconds";
            status deprecated;
            description
              "Minimum transmit interval";
          }
    
          leaf minimum-receive-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "30000 .. 255000";
              }
            }
            units "milliseconds";
            description
              "Minimum receive interval";
          }
    
          leaf multiplier {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 255";
              }
            }
            default "3";
            description
              "Detection time multiplier";
          }
    
          choice adaptation-choice {
            leaf no-adaptation {
              type empty;
              description "Disable adaptation";
            }
          }  // choice adaptation-choice
    
          container transmit-interval {
            description
              "Transmit-interval options";
            uses apply-advanced;
    
            leaf minimum-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30000 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum transmit interval";
            }
    
            leaf threshold {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              units "milliseconds";
              description
                "High transmit interval triggering a trap";
            }
          }  // container transmit-interval
    
          container detection-time {
            description "Detection-time options";
            uses apply-advanced;
    
            leaf threshold {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              units "milliseconds";
              description
                "High detection-time triggering a trap";
            }
          }  // container detection-time
    
          leaf session-mode {
            type enumeration {
              enum "automatic" {
                value 0;
                description
                  "Choose session-mode automatically";
              }
              enum "single-hop" {
                value 1;
                description "Use single-hop";
              }
              enum "multihop" {
                value 2;
                description "Use multihop";
              }
            }
            default "automatic";
            description
              "BFD single-hop or multihop session-mode";
          }
    
          leaf holddown-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 255000";
              }
            }
            units "milliseconds";
            default "0";
            description
              "Time to hold the session-UP notification to the client";
          }
        }  // grouping dhcp-bfd-liveness-detection-type
    
        grouping dhcp-liveness-detection-failure-action-type {
          description
            "Liveness detection failure action options";
          uses apply-advanced;
    
          choice failure-action-type {
            leaf clear-binding {
              type empty;
              description
                "Clear the client binding";
            }
            leaf clear-binding-if-interface-up {
              type empty;
              description
                "Clear the client binding only if the incoming interface is up";
            }
            leaf log-only {
              type empty;
              description
                "Maintain the client binding and log the failure event";
            }
          }  // choice failure-action-type
        }  // grouping dhcp-liveness-detection-failure-action-type
    
        grouping dhcp-local-server-dual-stack-group {
          description "DHCP dual stack groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Dual stack group name";
          }
    
          uses apply-advanced;
    
          container authentication {
            description "DHCP authentication";
            uses dual-stack-authentication-type;
          }  // container authentication
    
          leaf access-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to be used for jdhcpd";
          }
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf on-demand-address-allocation {
            type empty;
            description
              "Allocate addresses on demand";
          }
    
          container classification-key {
            junos:must "(".. dynamic-profile")";
            junos:must-message "dynamic profile configuration in dual-stack-group is must for configuring classification-type";
            description
              "Classification key for identifying dual stack household";
            uses classification-types;
          }  // container classification-key
    
          leaf dual-stack-interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of client allowed on an interface";
          }
    
          container protocol-master {
            description
              "Select family as protocol master";
            uses jdhcp-dual-stack-protocol-mstr-type;
          }  // container protocol-master
    
          container liveness-detection {
            description
              "DHCP client liveness detection processing";
            uses dhcp-liveness-detection-dualstack-type;
          }  // container liveness-detection
    
          container reauthenticate {
            junos:must "(".. on-demand-address-allocation")";
            junos:must-message "'on-demand-address-allocation' statement must be included with 'reauthenticate'";
            junos:must "(".. authentication")";
            junos:must-message "'authentication' statement must be included with 'reauthenticate'";
            description
              "DHCP client reauthenticate processing";
            leaf lease-renewal {
              type empty;
              description
                "Reauthenticate on each renew, rebind, DISCOVER or SOLICIT";
            }
    
            leaf remote-id-mismatch {
              type empty;
              description
                "Reauthenticate on remote-id mismatch for renew, rebind and re-negotiation";
            }
          }  // container reauthenticate
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
        }  // grouping dhcp-local-server-dual-stack-group
    
        grouping classification-types {
          description
            "Different mechanisms to identify a single household";
          uses apply-advanced;
    
          leaf mac-address {
            type empty;
            description "MAC address of client";
          }
    
          leaf circuit-id {
            type empty;
            description "Circuit-id as key";
          }
    
          leaf remote-id {
            type empty;
            description "Remote-id as key";
          }
        }  // grouping classification-types
    
        grouping dhcp-liveness-detection-dualstack-type {
          description
            "DHCP client liveness detection processing";
          uses apply-advanced;
    
          container failure-action {
            description
              "Liveness detection failure action options";
            uses dhcp-liveness-detection-failure-action-type;
          }  // container failure-action
    
          container method {
            description
              "Liveness detection method options";
            uses apply-advanced;
    
            choice method-choice {
              container layer2-liveness-detection {
                junos:must "((!(".. .. route-suppression") && (!(".. .. .. route-suppression") && !(".. .. .. .. route-suppression"))))";
                junos:must-message "Method not allowed with route-suppression enabled";
                description
                  "Address resolution options";
                uses dhcp-arp-nud-liveness-detection-type;
              }  // container layer2-liveness-detection
            }  // choice method-choice
          }  // container method
        }  // grouping dhcp-liveness-detection-dualstack-type
    
        grouping dhcp-local-server-group {
          description "DHCP groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          container authentication {
            description "DHCP authentication";
            uses authentication-type;
          }  // container authentication
    
          container liveness-detection {
            description
              "DHCP client liveness detection processing";
            uses dhcp-liveness-detection-type;
          }  // container liveness-detection
    
          container reconfigure {
            presence "enable reconfigure";
            description
              "DHCP reconfigure processing";
            uses reconfigure-type;
          }  // container reconfigure
    
          container overrides {
            presence "enable overrides";
            description
              "DHCP override processing";
            uses override-local-server-type;
          }  // container overrides
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container route-suppression {
            junos:must "(!(".. liveness-detection method layer2-liveness-detection"))";
            junos:must-message "Cannot specify route-suppression with liveness-detection method layer2-liveness-detection";
            junos:must "((!(".. overrides no-arp") && !(".. .. overrides no-arp")))";
            junos:must-message "Cannot specify route-suppression with overrides no-arp";
            description
              "Suppress access-internal and/or destination route addition";
            uses dhcp-route-suppression-type;
          }  // container route-suppression
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf upto {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface up to";
            }
    
            leaf exclude {
              type empty;
              description
                "Exclude this interface range";
            }
    
            leaf trace {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify tracing with exclude";
              type empty;
              description
                "Enable tracing for this interface";
            }
    
            container overrides {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "DHCP override processing";
              uses override-local-server-type;
            }  // container overrides
    
            container dynamic-profile {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "Dynamic profile to use";
              uses dynamic-profile-type;
            }  // container dynamic-profile
    
            leaf service-profile {
              type string {
                length "1 .. 128";
              }
              description
                "Dynamic profile to use for default service activation";
            }
    
            leaf access-profile {
              junos:must "("access profile $$")";
              junos:must-message "Matching access profile must be defined";
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              type string {
                length "1 .. 128";
              }
              description
                "Access profile to use for AAA services";
            }
    
            container short-cycle-protection {
              description
                "Short cycle lockout configuration";
              leaf lockout-min-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
    
              leaf lockout-max-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
            }  // container short-cycle-protection
          }  // list interface
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              choice violation-action-choice {
                leaf strict {
                  type empty;
                  description
                    "Reject discover and renew";
                }
                leaf override-lease {
                  type empty;
                  description
                    "Override assigned lease time with threshold";
                }
              }  // choice violation-action-choice
            }  // container violation-action
          }  // container lease-time-validation
    
          container remote-id-mismatch {
            junos:must "(!(".. reauthenticate"))";
            junos:must-message "'remote-id-mismatch' statement cannot be included with 'reauthenticate'";
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container reauthenticate {
            junos:must "(!(".. remote-id-mismatch"))";
            junos:must-message "'reauthenticate' statement cannot be included with 'remote-id-mismatch'";
            junos:must "((".. authentication" || ".. .. authentication"))";
            junos:must-message "'authentication' statement must be included with 'reauthenticate'";
            description
              "DHCP client reauthenticate processing";
            leaf lease-renewal {
              type empty;
              description
                "Reauthenticate on each renew, rebind, DISCOVER or SOLICIT";
            }
    
            leaf remote-id-mismatch {
              type empty;
              description
                "Reauthenticate on remote-id mismatch for renew, rebind and re-negotiation";
            }
          }  // container reauthenticate
        }  // grouping dhcp-local-server-group
    
        grouping dhcp-remote-id-mismatch-type {
          description
            "DHCP client remote-id-mismatch processing";
          uses apply-advanced;
    
          leaf disconnect {
            type empty;
            description
              "Disconnect session on remote-id mismatch";
          }
        }  // grouping dhcp-remote-id-mismatch-type
    
        grouping dhcp-route-suppression-type {
          uses apply-advanced;
    
          choice dhcp-route-suppression-choice {
            leaf access-internal {
              type empty;
              description
                "Suppress access-internal and destination route addition";
            }
            leaf destination {
              type empty;
              description
                "Suppress destination route addition";
            }
          }  // choice dhcp-route-suppression-choice
        }  // grouping dhcp-route-suppression-type
    
        grouping dhcpv6-local-server-type {
          uses apply-advanced;
    
          container authentication {
            description "DHCPv6 authentication";
            uses dhcpv6-authentication-type;
          }  // container authentication
    
          container liveness-detection {
            description
              "DHCPv6 client liveness detection processing";
            uses dhcpv6-liveness-detection-type;
          }  // container liveness-detection
    
          container reconfigure {
            presence "enable reconfigure";
            description
              "DHCPv6 reconfigure processing";
            uses dhcpv6-reconfigure-type;
          }  // container reconfigure
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          container forward-snooped-clients {
            junos:must "((!(".. forward-only") && (!(".. forward-only-replies") && !(any ".. group <*> forward-only"))))";
            junos:must-message "forward-only and forward-only-replies cannot be configured when forward-snooped-clients is configured";
            description
              "Forward snooped (unicast) packets";
            choice interface-type {
              leaf configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured interfaces";
              }
              leaf non-configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on non-configured interfaces";
              }
              leaf all-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured and non-configured interfaces";
              }
            }  // choice interface-type
          }  // container forward-snooped-clients
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container overrides {
            presence "enable overrides";
            description
              "DHCPv6 override processing";
            uses dhcpv6-override-local-server-type;
          }  // container overrides
    
          container route-suppression {
            description
              "Suppress access-internal and/or access route addition";
            uses dhcpv6-route-suppression-type;
          }  // container route-suppression
    
          list group {
            key "name";
            ordered-by user;
            description
              "Define a DHCPv6 local server group";
            uses dhcpv6-local-server-group;
          }  // list group
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              choice violation-action-choice {
                leaf strict {
                  type empty;
                  description
                    "Reject solicit and renew";
                }
                leaf override-lease {
                  type empty;
                  description
                    "Override assigned lease time with threshold";
                }
              }  // choice violation-action-choice
            }  // container violation-action
          }  // container lease-time-validation
    
          choice requested-ip-check {
            leaf requested-ip-network-match {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 127";
                }
              }
              default "16";
              description
                "Subnet to match server's address for active and link-address for passive clients";
            }
            leaf requested-ip-interface-match {
              type empty;
              description
                "Use incoming-interface's subnet to check";
            }
          }  // choice requested-ip-check
    
          leaf no-snoop {
            junos:must "(!("legacy-snooping"))";
            junos:must-message "'no-snoop' statement cannot be included along with 'legacy-snooping' statement";
            type empty;
            description
              "Do not snoop DHCPV6 packets";
          }
    
          container persistent-storage {
            description
              "Trigger to enable flat file storage";
            leaf automatic {
              type empty;
              description
                "Trigger automatically";
            }
          }  // container persistent-storage
    
          container server-duid-type {
            description
              "Define the DUID type to be used as the Server ID. Type supported is DUID-LL";
            uses duid-type;
          }  // container server-duid-type
    
          container remote-id-mismatch {
            junos:must "(!(".. reauthenticate"))";
            junos:must-message "'remote-id-mismatch' statement cannot be included with 'reauthenticate'";
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container reauthenticate {
            junos:must "(!(".. remote-id-mismatch"))";
            junos:must-message "'reauthenticate' statement cannot be included with 'remote-id-mismatch'";
            junos:must "((".. authentication" || ".. .. authentication"))";
            junos:must-message "'authentication' statement must be included with 'reauthenticate'";
            description
              "DHCP client reauthenticate processing";
            leaf lease-renewal {
              type empty;
              description
                "Reauthenticate on each renew, rebind, DISCOVER or SOLICIT";
            }
    
            leaf remote-id-mismatch {
              type empty;
              description
                "Reauthenticate on remote-id mismatch for renew, rebind and re-negotiation";
            }
          }  // container reauthenticate
    
          container allow-leasequery {
            presence "enable allow-leasequery";
            description
              "Allow DHCPv6 leasequery";
            uses server-leasequery-type;
          }  // container allow-leasequery
    
          container allow-bulk-leasequery {
            presence
              "enable allow-bulk-leasequery";
            description
              "Allow DHCPv6 bulk leasequery";
            uses server-bulk-leasequery-type;
          }  // container allow-bulk-leasequery
    
          container allow-active-leasequery {
            presence
              "enable allow-active-leasequery";
            description
              "Allow DHCPv6 active leasequery";
            uses server-active-leasequery-type;
          }  // container allow-active-leasequery
    
          container duplicate-clients {
            description
              "Allow duplicate clients";
            uses dhcpv6-duplicate-clients-type;
          }  // container duplicate-clients
        }  // grouping dhcpv6-local-server-type
    
        grouping dhcpv6-authentication-type {
          description "DHCPv6 authentication";
          uses apply-advanced;
    
          leaf password {
            type string {
              length "1 .. 64";
            }
            description
              "Username password to use";
          }
    
          container username-include {
            description "Add username options";
            uses apply-advanced;
    
            leaf delimiter {
              type string {
                length "1";
              }
              description
                "Change delimiter/separator character";
            }
    
            leaf domain-name {
              type string {
                length "1 .. 64";
              }
              description "Add domain name";
            }
    
            leaf user-prefix {
              type string {
                length "1 .. 64";
              }
              description
                "Add user defined prefix";
            }
    
            leaf mac-address {
              type empty;
              description "Include MAC address";
            }
    
            container client-id {
              presence "enable client-id";
              description "Include client ID";
              leaf exclude-headers {
                type empty;
                description
                  "Exclude all the headers";
              }
    
              leaf use-automatic-ascii-hex-encoding {
                type empty;
                description
                  "Use automatic ascii hex username encoding";
              }
            }  // container client-id
    
            container relay-agent-remote-id {
              presence
                "enable relay-agent-remote-id";
              description
                "Include the relay agent remote ID";
              uses apply-advanced;
    
              choice relay-agent-remote-id-choice {
                leaf enterprise-id {
                  type empty;
                  status deprecated;
                  description
                    "Only use enterprise-id portion of option-37";
                }
                leaf remote-id {
                  type empty;
                  status deprecated;
                  description
                    "Only use remote-id portion of option-37";
                }
              }  // choice relay-agent-remote-id-choice
            }  // container relay-agent-remote-id
    
            leaf logical-system-name {
              type empty;
              description
                "Include logical system name";
            }
    
            leaf routing-instance-name {
              type empty;
              description
                "Include routing instance name";
            }
    
            leaf relay-agent-subscriber-id {
              type empty;
              description
                "Include the relay agent subscriber ID";
            }
    
            leaf relay-agent-interface-id {
              type empty;
              description
                "Include the relay agent interface ID";
            }
    
            leaf circuit-type {
              type empty;
              description "Include circuit type";
            }
    
            leaf interface-name {
              type empty;
              description
                "Include interface name";
            }
    
            leaf interface-description {
              type enumeration {
                enum "device" {
                  value 0;
                  description
                    "Add the device interface description";
                }
                enum "logical" {
                  value 1;
                  description
                    "Add the logical interface description";
                }
              }
              description
                "Include interface description";
            }
    
            leaf vlan-tags {
              type empty;
              description
                "Include the vlan tag(s)";
            }
          }  // container username-include
        }  // grouping dhcpv6-authentication-type
    
        grouping dhcpv6-duplicate-clients-type {
          description "Allow duplicate clients";
          choice distinguish-with {
            leaf incoming-interface {
              type empty;
              description
                "Allow duplicate clients on different underlying interfaces";
            }
          }  // choice distinguish-with
        }  // grouping dhcpv6-duplicate-clients-type
    
        grouping dhcpv6-liveness-detection-type {
          description
            "DHCPv6 client liveness detection processing";
          uses apply-advanced;
    
          container failure-action {
            description
              "Liveness detection failure action options";
            uses dhcp-liveness-detection-failure-action-type;
          }  // container failure-action
    
          container method {
            description
              "Liveness detection method options";
            uses apply-advanced;
    
            choice method-choice {
              container bfd {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses dhcp-bfd-liveness-detection-type;
              }  // container bfd
              container layer2-liveness-detection {
                description
                  "Neighbor discovery options";
                uses dhcp-arp-nud-liveness-detection-type;
              }  // container layer2-liveness-detection
            }  // choice method-choice
          }  // container method
        }  // grouping dhcpv6-liveness-detection-type
    
        grouping dhcpv6-local-server-group {
          description "DHCP groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          container authentication {
            description "DHCP authentication";
            uses dhcpv6-authentication-type;
          }  // container authentication
    
          container liveness-detection {
            description
              "DHCPv6 client liveness detection processing";
            uses dhcpv6-liveness-detection-type;
          }  // container liveness-detection
    
          container reconfigure {
            presence "enable reconfigure";
            description
              "DHCPv6 reconfigure processing";
            uses dhcpv6-reconfigure-type;
          }  // container reconfigure
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container overrides {
            presence "enable overrides";
            description
              "DHCP override processing";
            uses dhcpv6-override-local-server-type;
          }  // container overrides
    
          container route-suppression {
            description
              "Suppress access-internal and/or access route addition";
            uses dhcpv6-route-suppression-type;
          }  // container route-suppression
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf upto {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface up to";
            }
    
            leaf exclude {
              type empty;
              description
                "Exclude this interface range";
            }
    
            leaf trace {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify tracing with exclude";
              type empty;
              description
                "Enable tracing for this interface";
            }
    
            container overrides {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "DHCP override processing";
              uses dhcpv6-override-local-server-type;
            }  // container overrides
    
            container dynamic-profile {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "Dynamic profile to use";
              uses dynamic-profile-type;
            }  // container dynamic-profile
    
            leaf service-profile {
              type string {
                length "1 .. 128";
              }
              description
                "Dynamic profile to use for default service activation";
            }
    
            leaf access-profile {
              junos:must "("access profile $$")";
              junos:must-message "Matching access profile must be defined";
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              type string {
                length "1 .. 128";
              }
              description
                "Access profile to use for AAA services";
            }
    
            container short-cycle-protection {
              description
                "Short cycle lockout configuration";
              leaf lockout-min-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
    
              leaf lockout-max-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
            }  // container short-cycle-protection
          }  // list interface
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              choice violation-action-choice {
                leaf strict {
                  type empty;
                  description
                    "Reject solicit and renew";
                }
                leaf override-lease {
                  type empty;
                  description
                    "Override assigned lease time with threshold";
                }
              }  // choice violation-action-choice
            }  // container violation-action
          }  // container lease-time-validation
    
          container remote-id-mismatch {
            junos:must "(!(".. reauthenticate"))";
            junos:must-message "'remote-id-mismatch' statement cannot be included with 'reauthenticate'";
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container reauthenticate {
            junos:must "(!(".. remote-id-mismatch"))";
            junos:must-message "'reauthenticate' statement cannot be included with 'remote-id-mismatch'";
            junos:must "((".. authentication" || ".. .. authentication"))";
            junos:must-message "'authentication' statement must be included with 'reauthenticate'";
            description
              "DHCP client reauthenticate processing";
            leaf lease-renewal {
              type empty;
              description
                "Reauthenticate on each renew, rebind, DISCOVER or SOLICIT";
            }
    
            leaf remote-id-mismatch {
              type empty;
              description
                "Reauthenticate on remote-id mismatch for renew, rebind and re-negotiation";
            }
          }  // container reauthenticate
        }  // grouping dhcpv6-local-server-group
    
        grouping dhcpv6-override-local-server-type {
          description "DHCP override processing";
          uses apply-advanced;
    
          leaf interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of clients allowed on an interface";
          }
    
          leaf rapid-commit {
            type empty;
            description
              "Enable rapid commit processing";
          }
    
          container client-negotiation-match {
            description
              "Use secondary match criteria for SOLICIT PDU";
            choice match-with {
              leaf incoming-interface {
                type empty;
                description
                  "Use incoming interface";
              }
            }  // choice match-with
          }  // container client-negotiation-match
    
          container process-inform {
            presence "enable process-inform";
            description
              "Process INFORMATION request PDUs";
            uses apply-advanced;
    
            leaf pool {
              type string {
                length "1 .. 64";
              }
              description
                "Pool name for family inet6";
            }
          }  // container process-inform
    
          container delay-advertise {
            presence "enable delay-advertise";
            description
              "Filter options for dhcp-server";
            uses dhcpv6-filter-option;
          }  // container delay-advertise
    
          leaf delegated-pool {
            type string {
              length "1 .. 64";
            }
            description
              "Delegated pool name for inet6";
          }
    
          leaf multi-address-embedded-option-response {
            type empty;
            description
              "If the client requests multiple addresses place the options in each address";
          }
    
          leaf always-process-option-request-option {
            type empty;
            description
              "Always process option even after address allocation failure";
          }
    
          leaf delete-binding-on-renegotiation {
            type empty;
            description
              "Delete binding on renegotiation";
          }
    
          leaf top-level-status-code {
            type empty;
            description
              "A top level status code option rather than encapsulated in IA for NoAddrsAvail in Advertise PDUs";
          }
    
          leaf always-add-option-dns-server {
            type empty;
            description
              "Add option-23, DNS recursive name server in Advertise and Reply";
          }
    
          leaf asymmetric-lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "600 .. 86400";
              }
            }
            units "seconds";
            description
              "Use a reduced lease time for the client. In seconds";
          }
    
          leaf asymmetric-prefix-lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "600 .. 86400";
              }
            }
            units "seconds";
            description
              "Use a reduced prefix lease time for the client. In seconds";
          }
    
          leaf protocol-attributes {
            type string {
              length "1 .. 64";
            }
            description
              "DHCPv6 attributes to use as defined under access protocol-attributes";
          }
    
          leaf dual-stack {
            type string {
              length "1 .. 64";
            }
            description
              "Dual stack group to use";
          }
        }  // grouping dhcpv6-override-local-server-type
    
        grouping dhcpv6-filter-option {
          description
            "Generic DHCPv6 filter processing";
          uses apply-advanced;
    
          leaf delay-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 30";
              }
            }
            units "seconds";
            default "3";
            description
              "Time delay between solicit and advertise";
          }
    
          container based-on {
            description "Option number";
            uses apply-advanced;
    
            container option-18 {
              presence "enable option-18";
              description "Option 18";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-18
    
            container option-37 {
              presence "enable option-37";
              description "Option 37";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-37
    
            container option-15 {
              presence "enable option-15";
              description "Option 15";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-15
    
            container option-16 {
              presence "enable option-16";
              description "Option 16";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-16
          }  // container based-on
        }  // grouping dhcpv6-filter-option
    
        grouping dhcpv6-reconfigure-type {
          description
            "DHCPv6 reconfigure processing";
          uses apply-advanced;
    
          leaf strict {
            type empty;
            description
              "Only allow packets containing Reconfigure Accept Option";
          }
    
          leaf clear-on-abort {
            type empty;
            description
              "Delete client on reconfiguration abort";
          }
    
          leaf attempts {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            description
              "Number of reconfigure attempts before aborting";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            description
              "Initial timeout value for retry";
          }
    
          leaf token {
            type string {
              length "1 .. 244";
            }
            description "Reconfigure token";
          }
    
          container trigger {
            description
              "DHCP reconfigure trigger";
            uses reconfigure-trigger-type;
          }  // container trigger
    
          leaf support-option-pd-exclude {
            type empty;
            description
              "Request prefix exclude option in reconfigure message";
          }
        }  // grouping dhcpv6-reconfigure-type
    
        grouping dhcpv6-route-suppression-type {
          description
            "Suppress access-internal and/or access route addition";
          leaf access {
            type empty;
            description
              "Suppress access route addition";
          }
    
          leaf access-internal {
            type empty;
            description
              "Suppress access-internal route addition";
          }
        }  // grouping dhcpv6-route-suppression-type
    
        grouping dual-stack-authentication-type {
          description
            "DHCP dual stack authentication";
          uses apply-advanced;
    
          leaf password {
            type string {
              length "1 .. 64";
            }
            description
              "Username password to use";
          }
    
          container username-include {
            description "Add username options";
            uses apply-advanced;
    
            leaf delimiter {
              type string {
                length "1";
              }
              description
                "Change delimiter/separator character";
            }
    
            leaf domain-name {
              type string {
                length "1 .. 64";
              }
              description "Add domain name";
            }
    
            leaf user-prefix {
              type string {
                length "1 .. 64";
              }
              description
                "Add user defined prefix";
            }
    
            leaf mac-address {
              type empty;
              description "Include MAC address";
            }
    
            container client-id {
              presence "enable client-id";
              description "Include client ID";
              leaf exclude-headers {
                type empty;
                description
                  "Exclude all the headers";
              }
    
              leaf use-automatic-ascii-hex-encoding {
                type empty;
                description
                  "Use automatic ascii hex username encoding";
              }
            }  // container client-id
    
            leaf relay-agent-remote-id {
              type empty;
              description
                "Include the relay agent remote ID";
            }
    
            leaf logical-system-name {
              type empty;
              description
                "Include logical system name";
            }
    
            leaf routing-instance-name {
              type empty;
              description
                "Include routing instance name";
            }
    
            leaf relay-agent-interface-id {
              type empty;
              description
                "Include the relay agent interface ID";
            }
    
            leaf interface-name {
              type empty;
              description
                "Include interface name";
            }
    
            leaf interface-description {
              type enumeration {
                enum "device" {
                  value 0;
                  description
                    "Add the device interface description";
                }
                enum "logical" {
                  value 1;
                  description
                    "Add the logical interface description";
                }
              }
              description
                "Include interface description";
            }
    
            leaf circuit-type {
              type empty;
              description "Include circuit type";
            }
    
            leaf vlan-tags {
              type empty;
              description
                "Include the vlan tag(s)";
            }
          }  // container username-include
        }  // grouping dual-stack-authentication-type
    
        grouping duid-type {
          uses apply-advanced;
    
          leaf duid_ll {
            type empty;
            description
              "Link Layer Address based DUID ";
          }
        }  // grouping duid-type
    
        grouping dynamic-profile-type {
          description "Dynamic profile to use";
          uses apply-advanced;
    
          leaf dynamic-profile {
            junos:must "("dynamic-profiles $$")";
            junos:must-message "Dynamic profile must be defined";
            type string {
              length "1 .. 80";
            }
            description "Dynamic profile to use";
          }
    
          choice dynamic-profile-type-choice {
            leaf use-primary {
              junos:must "("dynamic-profiles $$")";
              junos:must-message "Dynamic profile must be defined";
              type string {
                length "1 .. 80";
              }
              description
                "Dynamic profile to use on the primary interface";
            }
            container aggregate-clients {
              presence
                "enable aggregate-clients";
              description
                "Aggregate client profiles";
              uses apply-advanced;
    
              choice aggregate-type {
                leaf merge {
                  type empty;
                  description
                    "Merge the client dynamic profiles";
                }
                leaf replace {
                  type empty;
                  description
                    "Replace client dynamic profiles";
                }
              }  // choice aggregate-type
            }  // container aggregate-clients
          }  // choice dynamic-profile-type-choice
        }  // grouping dynamic-profile-type
    
        grouping jdhcp-dual-stack-protocol-mstr-type {
          description
            "Select family as protocol master";
          choice addr-fam {
            leaf inet {
              type empty;
              description
                "INET family has protocol master behavior";
            }
            leaf inet6 {
              type empty;
              description
                "INET6 family has protocol master behavior";
            }
          }  // choice addr-fam
        }  // grouping jdhcp-dual-stack-protocol-mstr-type
    
        grouping jdhcp-duplicate-clients-in-subnet-type {
          description
            "Allow duplicate clients in a subnet";
          choice distinguish-with {
            leaf incoming-interface {
              type empty;
              description
                "Allow duplicate clients on different interfaces in a subnet";
            }
            leaf option-82 {
              type empty;
              description
                "Allow duplicate clients using different option-82 options in a subnet";
            }
          }  // choice distinguish-with
        }  // grouping jdhcp-duplicate-clients-in-subnet-type
    
        grouping jdhcp-interface-traceoptions-type {
          description
            "Interface trace options for DHCP";
          uses apply-advanced;
    
          leaf no-remote-trace {
            junos:must "("system tracing")";
            junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
            type empty;
            description "Disable remote tracing";
          }
    
          container file {
            description "Trace file information";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "3";
              description
                "Maximum number of trace files";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
    
            leaf match {
              type jt:regular-expression;
              description
                "Regular expression for lines to be logged";
            }
          }  // container file
    
          list flag {
            key "name";
            ordered-by user;
            description
              "Interface trace categories";
            leaf name {
              type enumeration {
                enum "state" {
                  value 0;
                  description
                    "State-transition operations";
                }
                enum "packet" {
                  value 1;
                  description
                    "Packet-decoding operations";
                }
                enum "flow" {
                  value 2;
                  description
                    "Flow-decoding operations";
                }
                enum "packet-option" {
                  value 3;
                  description
                    "DHCP option-decoding operations";
                }
                enum "dhcpv6-state" {
                  value 4;
                  description
                    "State-transition operations for dhcpv6";
                }
                enum "dhcpv6-packet" {
                  value 5;
                  description
                    "Packet-decoding operations for dhcpv6";
                }
                enum "dhcpv6-packet-option" {
                  value 6;
                  description
                    "DHCP option-decoding operations for dhcpv6";
                }
                enum "all" {
                  value 7;
                  description "All operations";
                }
              }
            }
          }  // list flag
        }  // grouping jdhcp-interface-traceoptions-type
    
        grouping jdhcp-traceoptions-type {
          description "Trace options for DHCP";
          uses apply-advanced;
    
          leaf no-remote-trace {
            junos:must "("system tracing")";
            junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
            type empty;
            description "Disable remote tracing";
          }
    
          container file {
            description "Trace file information";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "3";
              description
                "Maximum number of trace files";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
    
            leaf match {
              type jt:regular-expression;
              description
                "Regular expression for lines to be logged";
            }
          }  // container file
    
          list flag {
            key "name";
            ordered-by user;
            description
              "DHCP operations to include in debugging trace";
            leaf name {
              type enumeration {
                enum "state" {
                  value 0;
                  description
                    "State-transition operations";
                }
                enum "packet" {
                  value 1;
                  description
                    "Packet-decoding operations";
                }
                enum "flow" {
                  value 2;
                  description
                    "Flow-decoding operations";
                }
                enum "packet-option" {
                  value 3;
                  description
                    "DHCP option-decoding operations";
                }
                enum "dhcpv6-state" {
                  value 4;
                  description
                    "State-transition operations for dhcpv6";
                }
                enum "dhcpv6-packet" {
                  value 5;
                  description
                    "Packet-decoding operations for dhcpv6";
                }
                enum "dhcpv6-packet-option" {
                  value 6;
                  description
                    "DHCP option-decoding operations for dhcpv6";
                }
                enum "all" {
                  value 7;
                  description "All operations";
                }
                enum "database" {
                  value 8;
                  description
                    "Database operations";
                }
                enum "persistent" {
                  value 9;
                  description
                    "Persitent file operations";
                }
                enum "lockout-db" {
                  value 10;
                  description
                    "Lockout database operations";
                }
                enum "interface" {
                  value 11;
                  description
                    "Interface operations";
                }
                enum "rtsock" {
                  value 12;
                  description
                    "Routing socket operations";
                }
                enum "flow-notify" {
                  value 13;
                  description
                    "Flow notification operations";
                }
                enum "io" {
                  value 14;
                  description "I/O operations";
                }
                enum "ha" {
                  value 15;
                  description
                    "High Availability-related operations";
                }
                enum "ui" {
                  value 16;
                  description
                    "User Interface operations";
                }
                enum "general" {
                  value 17;
                  description
                    "Miscellaneous operations";
                }
                enum "fwd" {
                  value 18;
                  description
                    "Firewall process operations";
                }
                enum "rpd" {
                  value 19;
                  description
                    "Routing Protocol process operations";
                }
                enum "auth" {
                  value 20;
                  description
                    "Authentication operations";
                }
                enum "profile" {
                  value 21;
                  description
                    "Profile operations";
                }
                enum "session-db" {
                  value 22;
                  description
                    "Session database operations";
                }
                enum "performance" {
                  value 23;
                  description
                    "Performance measurement operations";
                }
                enum "statistics" {
                  value 24;
                  description
                    "Baseline statistics operations";
                }
                enum "dhcpv6-io" {
                  value 25;
                  description
                    "I/O operations for dhcpv6";
                }
                enum "dhcpv6-rpd" {
                  value 26;
                  description
                    "Routing Protocol process operations for dhcpv6";
                }
                enum "dhcpv6-session-db" {
                  value 27;
                  description
                    "Session database operations for dhcpv6";
                }
                enum "dhcpv6-general" {
                  value 28;
                  description
                    "Miscellaneous operations for dhcpv6";
                }
                enum "liveness-detection" {
                  value 29;
                  description
                    "Liveness detection operations";
                }
                enum "security-persistence" {
                  value 30;
                  description
                    "Liveness detection operations";
                }
                enum "mclag" {
                  value 31;
                  description "Multichassis LAG";
                }
                enum "ra-guard" {
                  value 32;
                  description
                    "DHCP RA guard option for dhcpv6";
                }
              }
            }
          }  // list flag
        }  // grouping jdhcp-traceoptions-type
    
        grouping jsscd-static-subscribers-type {
          uses apply-advanced;
    
          container access-profile {
            description
              "Access profile reference";
            uses jsscd-access-profile-type;
          }  // container access-profile
    
          container dynamic-profile {
            description
              "Dynamic profile reference";
            uses jsscd-dynamic-profile-type;
          }  // container dynamic-profile
    
          container service-profile {
            description
              "Dynamic profile to use for default service activation";
            uses jsscd-service-profile-type;
          }  // container service-profile
    
          container authentication {
            description
              "Static Subscriber Client authentication";
            uses jsscd-authentication-type;
          }  // container authentication
    
          list group {
            key "name";
            ordered-by user;
            description
              "Static Subscriber Client group configuration";
            uses jsscd-group-type;
          }  // list group
    
          leaf auto-login {
            type empty;
            description
              "Auto login the operator logged-out static subscribers";
          }
    
          leaf baseline-stats {
            type empty;
            description
              "Baseline the statistics for static subscribers";
          }
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              junos:must "((".. subscriber-ip-address" || ".. subscriber-ipv6-address"))";
              junos:must-message "subscriber ip or ipv6 address must be configured";
              type union {
                type jt:interface-unit;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container subscriber-ip-address {
              description
                "Assigned IP address to report externally";
              uses apply-advanced;
    
              leaf address {
                type jt:ipv4addr;
                description "IPv4 address";
              }
            }  // container subscriber-ip-address
    
            container subscriber-ipv6-address {
              description
                "Assigned IPv6 address to report externally";
              uses apply-advanced;
    
              leaf address {
                type jt:ipv6prefix;
                description
                  "IPv6 Address or Prefix";
              }
            }  // container subscriber-ipv6-address
          }  // list interface
        }  // grouping jsscd-static-subscribers-type
    
        grouping jsscd-access-profile-type {
          description
            "Access profile for static subscribers";
          uses apply-advanced;
    
          leaf access-profile-name {
            junos:must "("access profile $$")";
            junos:must-message "referenced access profile must be defined";
            type string;
            description "Profile name";
          }
        }  // grouping jsscd-access-profile-type
    
        grouping jsscd-authentication-type {
          description
            "Static Subscriber Client authentication";
          uses apply-advanced;
    
          leaf password {
            type jt:unreadable;
            description
              "Username password to use";
          }
    
          container username-include {
            description "Add username options";
            uses apply-advanced;
    
            leaf delimiter {
              type string {
                length "1";
              }
              description
                "Change delimiter/separator character";
            }
    
            leaf domain-name {
              type string {
                length "1 .. 64";
              }
              description "Add domain name";
            }
    
            leaf user-prefix {
              type string {
                length "1 .. 64";
              }
              description
                "Add user defined prefix";
            }
    
            leaf interface {
              type empty;
              description
                "Include interface name";
            }
    
            leaf logical-system-name {
              type empty;
              description
                "Include logical system name";
            }
    
            leaf routing-instance-name {
              type empty;
              description
                "Include routing instance name";
            }
    
            leaf vlan-tags {
              type empty;
              description "Include vlan tag(s)";
            }
          }  // container username-include
        }  // grouping jsscd-authentication-type
    
        grouping jsscd-dynamic-profile-type {
          description "Dynamic profile to use";
          uses apply-advanced;
    
          leaf dynamic-profile-name {
            junos:must "("dynamic-profiles $$")";
            junos:must-message "Dynamic profile must be defined";
            type string {
              length "1 .. 80";
            }
            description "Dynamic profile to use";
          }
    
          container aggregate-clients {
            presence "enable aggregate-clients";
            description
              "Aggregate client profiles";
            uses apply-advanced;
    
            choice aggregate-type {
              leaf merge {
                type empty;
                description
                  "Merge the client dynamic profiles";
              }
              leaf replace {
                type empty;
                description
                  "Replace client dynamic profiles";
              }
            }  // choice aggregate-type
          }  // container aggregate-clients
        }  // grouping jsscd-dynamic-profile-type
    
        grouping jsscd-group-type {
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          container service-profile {
            description
              "Dynamic profile to use for default service activation";
            uses jsscd-service-profile-type;
          }  // container service-profile
    
          container access-profile {
            description
              "Access profile reference";
            uses jsscd-access-profile-type;
          }  // container access-profile
    
          container dynamic-profile {
            description
              "Dynamic profile reference";
            uses jsscd-dynamic-profile-type;
          }  // container dynamic-profile
    
          container authentication {
            description
              "Static Subscriber Client authentication";
            uses jsscd-authentication-type;
          }  // container authentication
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              type union {
                type jt:interface-unit;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            leaf upto {
              type union {
                type jt:interface-unit;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface up to";
            }
    
            leaf exclude {
              type empty;
              description
                "Exclude this interface range";
            }
          }  // list interface
    
          leaf auto-login {
            type empty;
            description
              "Auto login the operator logged-out static subscribers";
          }
        }  // grouping jsscd-group-type
    
        grouping jsscd-service-profile-type {
          description
            "Service profile for static subscribers";
          uses apply-advanced;
    
          leaf service-profile-name {
            junos:must "("dynamic-profiles $$")";
            junos:must-message "referenced service profile must be defined";
            type string {
              length "1 .. 80";
            }
            description "Service profile name";
          }
        }  // grouping jsscd-service-profile-type
    
        grouping juniper-bridge-domains {
          description "Bridge domains";
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(.{129,})|(.*[+].*))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less";
            }
            description "Bridge domain name";
          }
    
          uses apply-advanced;
    
          leaf description {
            type string {
              junos:posix-pattern "^.{1,255}$";
              junos:pattern-message "Must be a string of 255 characters or less";
            }
            description
              "Text description of bridge domain";
          }
    
          leaf domain-type {
            type enumeration {
              enum "bridge" {
                value 0;
                description
                  "Forwarding instance";
              }
            }
            description "Type of bridge domain";
          }
    
          choice vlan_choice {
            leaf vlan-id {
              type string;
              description
                "IEEE 802.1q VLAN identifier for bridging domain";
            }
            container vlan-tags {
              presence "enable vlan-tags";
              description
                "IEEE 802.1q VLAN tags for bridging domain";
              leaf outer {
                type string {
                  junos:posix-pattern "^(0[Xx][0-9A-Fa-f]{4}.([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4]))$|^([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4])$";
                  junos:pattern-message "vlan-id in vlan-tag (0xNNNN.vlan-id) must be 0 to 4094";
                }
                description
                  "[tpid.]vlan-id, tpid format is 0xNNNN and is optional";
              }
    
              leaf inner {
                type string {
                  junos:posix-pattern "^(0[Xx][0-9A-Fa-f]{4}.([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4]))$|^([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4])$";
                  junos:pattern-message "vlan-id in vlan-tag (0xNNNN.vlan-id) must be 0 to 4094";
                }
                description
                  "[tpid.]vlan-id, tpid format is 0xNNNN and is optional";
              }
            }  // container vlan-tags
            leaf-list vlan-id-list {
              junos:must "(!(" .. .. .. pbb-options"))";
              junos:must-message "vlan-id-list is not supported for i-comp routing-instance";
              junos:must "((!(".. isolated-vlan") && !(".. community-vlans")))";
              junos:must-message "PVLAN related configuration cannot be specified with vlan-id-list";
              junos:must "(!(" .. vxlan"))";
              junos:must-message "vxlan can not be specified under vlan-id-list";
              junos:must "(!(" .. multicast-snooping-options"))";
              junos:must-message "multicast-snooping-options can not be specified under vlan-id-list";
              junos:must "(!(" .. protocols"))";
              junos:must-message "protocols can not be specified under vlan-id-list";
              junos:must "(!(" .. no-local-switching"))";
              junos:must-message "no-local-switching can not be specified under vlan-id-list";
              junos:must "(!(" .. domain-type"))";
              junos:must-message "domain-type can not be specified  under vlan-id-list";
              junos:must "(!(".. interface"))";
              junos:must-message "interface can not be specified under vlan-id-list";
              junos:must "(!(any ".. bridge-options interface <*> static-mac"))";
              junos:must-message "static mac can not be specified under vlan-id-list";
              type jt:vlan-range;
              description
                "Create bridge-domain for each of the vlan-id specified in the vlan-id-list";
            }
          }  // choice vlan_choice
    
          leaf-list isid-list {
            junos:must "(".. vlan-id")";
            junos:must-message "isid-list can be configured only under container with 'vlan-id'";
            junos:must "(!(" .. .. .. pbb-options"))";
            junos:must-message "isid-list and pbb-options can not co-exist for same routing-instance";
            junos:must "(!(" .. vxlan"))";
            junos:must-message "vxlan can not be specified under isid-list";
            junos:must "(!(".. vlan-id inner-all"))";
            junos:must-message "vlan-id inner-all can not be specified with isid-list";
            junos:must "(!(" .. vlan-id none"))";
            junos:must-message "vlan-id none  can not be specified with isid-list";
            junos:must "(!(" .. vlan-id all"))";
            junos:must-message "vlan-id all  can not be specified with isid-list";
            type string;
            ordered-by user;
            description
              "Create bridge-domain for isid (Valid isid:256..16777214)";
          }
    
          leaf vlan-id-scope-local {
            junos:must "(".. .. .. protocols evpn")";
            junos:must-message "scope-local can be configured only when routing-instance protocol type is evpn";
            junos:must "(".. isid-list")";
            junos:must-message "scope-local can be configured only when bridge-domain has isid-list configured";
            junos:must "(".. vlan-id")";
            junos:must-message "scope-local can be configured only under container with 'vlan-id'";
            type empty;
            description
              "Enable the scope of vlan-id local to avoid transmitting vlan tagged packets";
          }
    
          list interface {
            junos:must "(!("interfaces $$-IFL output-vlan-map push"))";
            junos:must-message "interface with output-vlan-map is not supported with push";
            junos:must "((!("interfaces $$-IFL vlan-id-list") || !(("interfaces $$-IFL input-vlan-map swap" || "interfaces $$-IFL input-vlan-map pop"))))";
            junos:must-message "interface with vlan-id-list and input-vlan-map swap/pop is not supported";
            junos:must "((!("interfaces $$-IFL vlan-id-list") || "interfaces $$-IFL input-vlan-map"))";
            junos:must-message "interface with vlan-id-list is supported only with input-vlan-map push";
            junos:must "((!("interfaces $$-IFL vlan-id") || !((".. .. vlan-tags" || ".. .. vlan-id-list"))))";
            junos:must-message "interface with vlan-id cannot be added to vlan with vlan-tags/vlan-id-list configured";
            junos:must "((!("interfaces $$-IFL vlan-id-list") || !((".. .. vlan-id" || (".. .. vlan-tags" || ".. .. vlan-id-list")))))";
            junos:must-message "interface with vlan-id-list cannot be added to a vlan with a vlan-id/vlan-tags/vlan-id-list configured";
            junos:must "(!("interfaces $$-IFL family ethernet-switching interface-mode"))";
            junos:must-message "Interface with 'interface-mode' config is not allowed under vlans";
            junos:must "(!(".. .. .. interfaces $$"))";
            junos:must-message "This interface is already defined at the routing-instance level";
            junos:must "(!("interfaces $$-IFL family ethernet-switching"))";
            junos:must-message "This inteface with family ethernet switching is not allowed under vlans";
            key "name";
            ordered-by user;
            description
              "Interface name for this bridge domain";
            leaf name {
              junos:must "(!("interfaces $$-IFL encapsulation ethernet"))";
              junos:must-message "encapsulation ethernet is not allowed on l2 interface";
              junos:must "((!("interfaces $$-IFL etree-ac-role") || "routing-instances ${instance} protocols evpn evpn-etree"))";
              junos:must-message "etree must be enabled under routing-instance";
              junos:must "((!("interfaces $$-IFL family") || "interfaces $$-IFL family bridge"))";
              junos:must-message "only family bridge can be configured on this interface";
              junos:must "((!(("interfaces $$-IFL vlan-id-list" || "interfaces $$-IFL vlan-tags inner-list")) || !((".. .. vlan-id" || ".. .. vlan-tags"))))";
              junos:must-message "interface with vlan-id-list/inner-list cannot be added to bridge-domain with a vlan-id/vlan-tags configured";
              junos:must "(!("irb"))";
              junos:must-message "IRB interface is not supported as interface in bridge-domain";
              junos:must "(!("interfaces $$-IFL family bridge interface-mode"))";
              junos:must-message "Interface with 'interface-mode' is not allowed in a bridge-domain";
              junos:must "(!(".. .. .. interfaces $$"))";
              junos:must-message "This interface is already defined at the routing-instance level";
              junos:must "(((!("interfaces $$-IFL vlan-id-range") || ".. .. vlan-id all") || (".. .. no-normalization" || ".. .. bridge-options no-normalization")))";
              junos:must-message "vlan-id-range is specified for this logical interface; 'vlan-id all' should also be enabled";
              junos:must "(((".. .. vlan-id all" && "interfaces $$-IFL input-vlan-map pop") || (".. .. vlan-id inner-all" || (!((".. .. vlan-id" || ".. .. vlan-tags")) || (!(("interfaces $$-IFL input-vlan-map" || "interfaces $$-IFL output-vlan-map")) || (".. .. no-normalization" || ".. .. bridge-options no-normalization"))))))";
              junos:must-message "interface with input/output vlan-maps cannot be added to a routing-instance with a vlan-id/vlan-tags configured";
              junos:must "((!("interfaces $$-IFL vlan-tags inner-range") || ((".. .. vlan-id all" || ".. .. vlan-id inner-all") || (".. .. no-normalization" || ".. .. bridge-options no-normalization"))))";
              junos:must-message "vlan-tags inner-range is specified for this logical interface; 'vlan-id all' or 'vlan-id inner-all' should also be enabled";
              type string;
            }
    
            uses apply-advanced;
    
            leaf protect-interface {
              junos:must "("interfaces $$")";
              junos:must-message "Interface must be part of this routing instance";
              junos:must "(!("interfaces ${inter_name} esi"))";
              junos:must-message "ESI can not be configured for protect interface";
              junos:must "("routing-instances ${instance} protocols evpn")";
              junos:must-message "Protocol EVPN must be configured in the evpn instance";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Name of protect interface";
            }
          }  // list interface
    
          leaf routing-interface {
            junos:must "(!((".. .. .. protocols evpn mclag" && !(".. no-arp-suppression"))))";
            junos:must-message "no-arp-suppression needs to be configured, when evpn is configured with mclag.";
            junos:must "(!((".. mcae-mac-synchronize" && "interfaces $$-IFL mac")))";
            junos:must-message "irb-ifl mac and bridge mcae-mac-synchronize cannot coexist";
            junos:must "((!("interfaces $$-IFL virtual-gateway-esi") || "routing-instances ${instance} protocols evpn encapsulation vxlan"))";
            junos:must-message "irb-ifl with virtual-gateway-esi only for instance with encapsulation type vxlan";
            junos:must "(!(any ".. interface <ps*>"))";
            junos:must-message "IRB cannot be added to bridge-domain with PS interface";
            junos:must "((!("interfaces $$-IFL family mpls") || !(("routing-instances ${instance} instance-type virtual-switch" && ("routing-instances ${instance} protocols vpls" && "routing-instances ${instance} route-distinguisher")))))";
            junos:must-message "routing-interface with family mpls cannot be added to virtual-switch with protocol VPLS";
            junos:must "((!(".. vlan-tags") || !("interfaces $$-IFL family mpls")))";
            junos:must-message "routing-interface with family mpls cannot be added to bridge-domain with 'vlan-tags'";
            junos:must "(!("routing-instances ${instance} service-type vlan-bundle"))";
            junos:must-message "routing-interface not valid for vlan-bundle service type";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id inner-all")))";
            junos:must-message "routing-interface cannot be configured under bridge-domain with 'vlan-id all' or 'vlan-id inner-all'";
            junos:must "((".. vlan-id" || ".. vlan-tags"))";
            junos:must-message "routing-interface can be configured only under bridge-domain with 'vlan-id' or 'vlan-tags'";
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Routing interface name for this bridge-domain";
          }
    
          container forwarding-options {
            description
              "Forwarding options configuration";
            uses juniper-bridge-forwarding-options;
          }  // container forwarding-options
    
          container bridge-options {
            description
              "Bridge domain configuration";
            uses juniper-protocols-bd;
          }  // container bridge-options
    
          container protocols {
            presence "enable protocols";
            uses apply-advanced;
    
            container igmp-snooping {
              presence "enable igmp-snooping";
              description
                "IGMP snooping configuration";
              uses juniper-bd-protocols-igmp-snooping;
            }  // container igmp-snooping
    
            container mld-snooping {
              presence "enable mld-snooping";
              description
                "MLD snooping configuration";
              uses juniper-bd-protocols-mld-snooping;
            }  // container mld-snooping
          }  // container protocols
    
          container vxlan {
            junos:must "((". ovsdb-managed" || (". multicast-group" || (". multicast-v6-group" || ("routing-instances ${instance} protocols evpn encapsulation vxlan" || (". ingress-node-replication" || ".. .. .. switch-options ovsdb-managed"))))))";
            junos:must-message "multicast-group or ovsdb-managed or ingress-node-replication or protocols evpn encapsulation vxlan should be enabled";
            junos:must "((". ovsdb-managed" || (".. .. .. switch-options ovsdb-managed" || ("routing-instances ${instance} protocols evpn encapsulation vxlan" || (". multicast-group" || (". multicast-v6-group" || ("routing-instances ${instance} remote-vtep-list" || ("routing-instances ${instance} remote-vtep-v6-list" || (".. .. .. switch-options remote-vtep-v6-list" || ".. .. .. switch-options remote-vtep-list")))))))))";
            junos:must-message "One of multicast-group or ovsdb-managed or protocols evpn encapsulation vxlan or remote-vtep-list should be enabled. ingress-node-replication must be configured when remote-vtep-list is configured";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id inner-all")))";
            junos:must-message "vxlan does not support bridge domain with 'vlan-id all' or 'vlan-id inner-all'";
            junos:must "(("routing-instances ${instance} vtep-source-interface" || ".. .. .. switch-options vtep-source-interface"))";
            junos:must-message "vtep-source-interface is required for VXLAN configuration";
            description "VXLAN options";
            uses apply-advanced;
    
            leaf ovsdb-managed {
              junos:must "(!("routing-instances ${instance} protocols evpn encapsulation vxlan"))";
              junos:must-message "Not valid with protocols evpn encapsulation vxlan";
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || (".. .. .. .. switch-options remote-vtep-list" || ".. multicast-group"))))";
              junos:must-message "ovsdb-managed not valid with remote-vtep-list or multicast-group";
              type empty;
              description
                "Bridge-domain is managed remotely via VXLAN OVSDB Controller";
            }
    
            leaf vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 16777214";
                }
              }
              description "VXLAN identifier";
            }
    
            leaf translation-vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16777214";
                }
              }
              description
                "Translated VXLAN identifier";
            }
    
            leaf multicast-group {
              junos:must "(!("routing-instances ${instance} protocols evpn encapsulation vxlan"))";
              junos:must-message "Not valid with protocols evpn encapsulation vxlan";
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || (".. .. .. .. switch-options remote-vtep-list" || (".. ovsdb-managed" || (".. .. .. .. switch-options ovsdb-managed" || ("routing-instances ${instance} switch-options ovsdb-managed" || ".. multicast-v6-group")))))))";
              junos:must-message "multicast-group not valid with remote-vtep-list or ovsdb-managed";
              type jt:ipv4addr;
              description
                "Multicast group registered for VXLAN segment";
            }
    
            leaf encapsulate-inner-vlan {
              junos:must "(!(".. .. vlan-id none"))";
              junos:must-message "encapsulate inner vlan not valid with vlan-id none";
              type empty;
              description
                "Retain inner VLAN in the packet";
            }
    
            leaf decapsulate-accept-inner-vlan {
              junos:must "(!(".. .. vlan-id none"))";
              junos:must-message "accept inner vlan not valid with vlan-id none";
              type empty;
              description
                "Accept VXLAN packets with inner VLAN";
            }
    
            leaf unreachable-vtep-aging-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "300 .. 1800";
                }
              }
              units "seconds";
              description
                "Unreachable VXLAN tunnel endpoint removal timer";
            }
    
            leaf ingress-node-replication {
              junos:must "(!(".. .. .. .. protocols evpn assisted-replication"))";
              junos:must-message "ingress-node-replication cannot be configured with assisted-replication";
              junos:must "((".. ovsdb-managed" || (".. .. .. .. switch-options ovsdb-managed" || ("routing-instances ${instance} protocols evpn encapsulation vxlan" || ("routing-instances ${instance} remote-vtep-list" || ("routing-instances ${instance} remote-vtep-v6-list" || (".. .. .. .. switch-options remote-vtep-v6-list" || ".. .. .. .. switch-options remote-vtep-list")))))))";
              junos:must-message "Valid for ovsdb-managed instance or with remote-vtep-list or remote-vtep-v6-list or evpn vxlan";
              type empty;
              description
                "Enable ingress node replication";
            }
    
            leaf-list static-remote-vtep-list {
              type jt:ipaddr;
              max-elements 1024;
              description
                "Configure bridge domain specific static remote VXLAN tunnel endpoints";
            }
          }  // container vxlan
    
          leaf isolated-vlan {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 4094";
              }
            }
            description
              "Isolated VLAN ID for private vlan bridge domain";
          }
    
          leaf-list community-vlans {
            type jt:vlan-range;
            description
              "List of Community VLANs for private vlan bridge domain";
          }
    
          container multicast-snooping-options {
            description
              "Multicast snooping option configuration";
            uses juniper-multicast-snooping-options;
          }  // container multicast-snooping-options
        }  // grouping juniper-bridge-domains
    
        grouping juniper-bd-protocols-igmp-snooping {
          description "IGMP snooping options";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for IGMP Snooping";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all IGMP packets";
                  }
                  enum "query" {
                    value 1;
                    description
                      "Trace IGMP membership query messages";
                  }
                  enum "report" {
                    value 2;
                    description
                      "Trace membership report messages";
                  }
                  enum "leave" {
                    value 3;
                    description
                      "Trace leave group messages (IGMPv2 only)";
                  }
                  enum "group" {
                    value 4;
                    description
                      "Trace group operations";
                  }
                  enum "client-notification" {
                    value 5;
                    description
                      "Trace notifications";
                  }
                  enum "host-notification" {
                    value 6;
                    description
                      "Trace host notifications";
                  }
                  enum "route" {
                    value 7;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 8;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 9;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 10;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 11;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 12;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 13;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 14;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf query-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1024";
              }
            }
            units "seconds";
            default "125";
            description
              "When to send host query messages";
          }
    
          container l2-querier {
            description "Enable L2 querier mode";
            uses apply-advanced;
    
            leaf source-address {
              type jt:ipv4addr;
              description
                "Source IP address to use for L2 querier";
            }
          }  // container l2-querier
    
          leaf query-response-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "10";
            description
              "How long to wait for a host query response";
          }
    
          leaf query-last-member-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "1";
            description
              "When to send group query messages";
          }
    
          leaf robust-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "2 .. 10";
              }
            }
            default "2";
            description
              "Expected packet loss on a subnet";
          }
    
          leaf learn-pim-router {
            type empty;
            description
              "Learn PIM router interfaces from PIM hellos";
          }
    
          leaf immediate-leave {
            type empty;
            description
              "Enable immediate group leave on interfaces";
          }
    
          leaf evpn-ssm-reports-only {
            type empty;
            description
              "Accept and process only <s,g> reports of SSM groups";
          }
    
          container proxy {
            presence "enable proxy";
            description "Enable proxy mode";
            uses apply-advanced;
    
            leaf source-address {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "With qualified-learning source-address should be configured under Vlan options";
              type jt:ipv4addr;
              description
                "Source IP address to use for proxy";
            }
    
            leaf irb {
              type empty;
              description
                "Proxy IGMP reports to IRB";
            }
          }  // container proxy
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interface options for IGMP";
            leaf name {
              junos:must "(!("interfaces $$-IFL vlan-tags inner-range"))";
              junos:must-message "interface with vlan-tags inner-range should be specified in a learning-domain only";
              junos:must "(!("interfaces $$-IFL vlan-id-range"))";
              junos:must-message "interface with vlan-id-range should be specified in a learning-domain only";
              junos:must "(((".. .. .. .. interface $$" || ".. .. .. .. .. .. interface $$") || (!(".. .. .. .. .. .. .. .. routing-instances") && ("interfaces $$-IFL family bridge interface-mode" && !(any "routing-instances <*> interface $$")))))";
              junos:must-message "interface options can be specified for the interfaces in the routing-instance";
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, interface should be configured only under vlan";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            leaf host-only-interface {
              junos:must "(!(".. multicast-router-interface"))";
              junos:must-message "interface cannot be both host-only and multicast-router";
              type empty;
              description
                "Enable interfaces to be treated as host-side interfaces";
            }
    
            leaf group-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 65535";
                }
              }
              description
                "Maximum number of (source,group) per interface";
            }
    
            container static {
              description
                "Static group or source membership";
              uses apply-advanced;
    
              list group {
                key "name";
                ordered-by user;
                description
                  "IP multicast group address";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "IP multicast group address";
                }
    
                uses apply-advanced;
    
                list source {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast source address";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "Source address of IP multicast data";
                  }
    
                  uses apply-advanced;
                }  // list source
              }  // list group
            }  // container static
          }  // list interface
    
          list pseudowire-remote-address {
            junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
            junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
            key "name";
            ordered-by user;
            description
              "Pseudowire interface options for IGMP";
            leaf name {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, pseudowire-remote-address should be configured only under vlan";
              type jt:ipv4addr;
              description
                "Pseudowire endpoint address";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
          }  // list pseudowire-remote-address
    
          list vlan {
            key "name";
            ordered-by user;
            description "Vlan options";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description "VLAN name";
            }
    
            uses apply-advanced;
    
            leaf query-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1024";
                }
              }
              units "seconds";
              description
                "When to send host query messages";
            }
    
            leaf query-response-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "How long to wait for a host query response";
            }
    
            leaf query-last-member-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "When to send group query messages";
            }
    
            leaf robust-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10";
                }
              }
              description
                "Expected packet loss on a subnet";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            container proxy {
              presence "enable proxy";
              description "Enable proxy mode";
              uses apply-advanced;
    
              leaf source-address {
                junos:must "((!(".. .. .. .. .. vlans ${vlan} vlan-id all") && !(".. .. .. .. .. vlans ${vlan} vlan-id inner-all")))";
                junos:must-message "With qualified-learning source-address should be configured under Vlan options";
                type jt:ipv4addr;
                description
                  "Source IP address to use for proxy";
              }
            }  // container proxy
    
            leaf evpn-ssm-reports-only {
              type empty;
              description
                "Accept and process only <s,g> reports of SSM groups";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface options for IGMP";
              leaf name {
                junos:must "(!("interfaces $$-IFL vlan-tags inner-range"))";
                junos:must-message "interface with vlan-tags inner-range should be specified in a learning-domain only";
                junos:must "(!("interfaces $$-IFL vlan-id-range"))";
                junos:must-message "interface with vlan-id-range should be specified in a learning-domain only";
                junos:must "(!(".. .. .. .. .. vlans ${vlan} vlan-id all"))";
                junos:must-message "When 'vlan-id all' is configured, interface should be configured only under vlan";
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              leaf host-only-interface {
                junos:must "(!(".. multicast-router-interface"))";
                junos:must-message "interface cannot be both host-only and multicast-router";
                type empty;
                description
                  "Enable interfaces to be treated as host-side interfaces";
              }
    
              leaf group-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum number of (source,group) per interface";
              }
    
              container static {
                description
                  "Static group or source membership";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast group address";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "IP multicast group address";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast source address";
                    leaf name {
                      type jt:ipv4addr;
                      description
                        "Source address of IP multicast data";
                    }
    
                    uses apply-advanced;
                  }  // list source
                }  // list group
              }  // container static
            }  // list interface
    
            list pseudowire-remote-address {
              junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
              junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
              key "name";
              ordered-by user;
              description
                "Pseudowire interface options for IGMP";
              leaf name {
                type jt:ipv4addr;
                description
                  "Pseudowire endpoint address";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
            }  // list pseudowire-remote-address
    
            list qualified-vlan {
              key "name";
              ordered-by user;
              description
                "VLAN options for qualified-learning";
              leaf name {
                junos:must "(".. .. .. .. .. vlans ${vlan} vlan-id all")";
                junos:must-message "vlan specific configuration is allowed with qualified-learning only";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1023";
                  }
                }
                description
                  "VLAN ID of the learning-domain";
              }
    
              uses apply-advanced;
    
              leaf query-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1024";
                  }
                }
                units "seconds";
                description
                  "When to send host query messages";
              }
    
              leaf query-response-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "How long to wait for a host query response";
              }
    
              leaf query-last-member-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "When to send group query messages";
              }
    
              leaf robust-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 10";
                  }
                }
                description
                  "Expected packet loss on a subnet";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              container proxy {
                presence "enable proxy";
                description "Enable proxy mode";
                uses apply-advanced;
    
                leaf source-address {
                  type jt:ipv4addr;
                  description
                    "Source IP address to use for proxy";
                }
              }  // container proxy
    
              leaf evpn-ssm-reports-only {
                type empty;
                description
                  "Accept and process only <s,g> reports of SSM groups";
              }
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Interface options for IGMP";
                leaf name {
                  junos:must "(".. .. .. .. .. .. vlans ${vlan} interface $$")";
                  junos:must-message "interface options can be specified for the interfaces in the routing-instance";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
    
                leaf host-only-interface {
                  junos:must "(!(".. multicast-router-interface"))";
                  junos:must-message "interface cannot be both host-only and multicast-router";
                  type empty;
                  description
                    "Enable interfaces to be treated as host-side interfaces";
                }
    
                leaf group-limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Maximum number of (source,group) per interface";
                }
    
                container static {
                  description
                    "Static group or source membership";
                  uses apply-advanced;
    
                  list group {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast group address";
                    leaf name {
                      type jt:ipv4addr;
                      description
                        "IP multicast group address";
                    }
    
                    uses apply-advanced;
    
                    list source {
                      key "name";
                      ordered-by user;
                      description
                        "IP multicast source address";
                      leaf name {
                        type jt:ipv4addr;
                        description
                          "Source address of IP multicast data";
                      }
    
                      uses apply-advanced;
                    }  // list source
                  }  // list group
                }  // container static
              }  // list interface
    
              list pseudowire-remote-address {
                junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
                junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
                key "name";
                ordered-by user;
                description
                  "Pseudowire interface options for IGMP";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Pseudowire endpoint address";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
              }  // list pseudowire-remote-address
            }  // list qualified-vlan
          }  // list vlan
        }  // grouping juniper-bd-protocols-igmp-snooping
    
        grouping juniper-bd-protocols-mld-snooping {
          description "MLD snooping options";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for MLD Snooping";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all MLD packets";
                  }
                  enum "query" {
                    value 1;
                    description
                      "Trace MLD membership query messages";
                  }
                  enum "report" {
                    value 2;
                    description
                      "Trace membership report messages";
                  }
                  enum "leave" {
                    value 3;
                    description
                      "Trace leave group messages (MLDv2 only)";
                  }
                  enum "group" {
                    value 4;
                    description
                      "Trace group operations";
                  }
                  enum "client-notification" {
                    value 5;
                    description
                      "Trace notifications";
                  }
                  enum "host-notification" {
                    value 6;
                    description
                      "Trace host notifications";
                  }
                  enum "route" {
                    value 7;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 8;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 9;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 10;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 11;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 12;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 13;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 14;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf query-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1024";
              }
            }
            units "seconds";
            default "125";
            description
              "When to send host query messages";
          }
    
          container l2-querier {
            description "Enable L2 querier mode";
            uses apply-advanced;
    
            leaf source-address {
              type jt:ipv6addr;
              description
                "Source IP address to use for L2 querier";
            }
          }  // container l2-querier
    
          leaf query-response-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "10";
            description
              "How long to wait for a host query response";
          }
    
          leaf query-last-member-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "1";
            description
              "When to send group query messages";
          }
    
          leaf robust-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "2 .. 10";
              }
            }
            default "2";
            description
              "Expected packet loss on a subnet";
          }
    
          leaf immediate-leave {
            type empty;
            description
              "Enable immediate group leave on interfaces";
          }
    
          leaf evpn-ssm-reports-only {
            type empty;
            description
              "Accept and process only <s,g> reports of SSM groups";
          }
    
          container proxy {
            presence "enable proxy";
            description "Enable proxy mode";
            uses apply-advanced;
    
            leaf source-address {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "With qualified-learning source-address should be configured under Vlan options";
              type jt:ipv6addr;
              description
                "Source IP address to use for proxy";
            }
    
            leaf irb {
              type empty;
              description
                "Proxy IGMP reports to IRB";
            }
          }  // container proxy
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interface options for MLD";
            leaf name {
              junos:must "(!("interfaces $$-IFL vlan-tags inner-range"))";
              junos:must-message "interface with vlan-tags inner-range should be specified in a learning-domain only";
              junos:must "(!("interfaces $$-IFL vlan-id-range"))";
              junos:must-message "interface with vlan-id-range should be specified in a learning-domain only";
              junos:must "(((".. .. .. .. interface $$" || ".. .. .. .. .. .. interface $$") || (!(".. .. .. .. .. .. .. .. routing-instances") && ("interfaces $$-IFL family bridge interface-mode" && !(any "routing-instances <*> interface $$")))))";
              junos:must-message "interface options can be specified for the interfaces in the routing-instance";
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, interface should be configured only under vlan";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            leaf host-only-interface {
              junos:must "(!(".. multicast-router-interface"))";
              junos:must-message "interface cannot be both host-only and multicast-router";
              type empty;
              description
                "Enable interfaces to be treated as host-side interfaces";
            }
    
            leaf group-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 65535";
                }
              }
              description
                "Maximum number of (source,group) per interface";
            }
    
            container static {
              description
                "Static group or source membership";
              uses apply-advanced;
    
              list group {
                key "name";
                ordered-by user;
                description
                  "IP multicast group address";
                leaf name {
                  type jt:ipv6addr;
                  description
                    "IP multicast group address";
                }
    
                uses apply-advanced;
    
                list source {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast source address";
                  leaf name {
                    type jt:ipv6addr;
                    description
                      "Source address of IP multicast data";
                  }
    
                  uses apply-advanced;
                }  // list source
              }  // list group
            }  // container static
          }  // list interface
    
          list pseudowire-remote-address {
            junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
            junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
            key "name";
            ordered-by user;
            description
              "Pseudowire interface options for MLD";
            leaf name {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, pseudowire-remote-address should be configured only under vlan";
              type jt:ipv4addr;
              description
                "Pseudowire endpoint address";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
          }  // list pseudowire-remote-address
    
          list vlan {
            key "name";
            ordered-by user;
            description "Vlan options";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description
                "Vlan of the bridge-domain";
            }
    
            uses apply-advanced;
    
            leaf query-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1024";
                }
              }
              units "seconds";
              description
                "When to send host query messages";
            }
    
            leaf query-response-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "How long to wait for a host query response";
            }
    
            leaf query-last-member-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "When to send group query messages";
            }
    
            leaf robust-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10";
                }
              }
              description
                "Expected packet loss on a subnet";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            container proxy {
              presence "enable proxy";
              description "Enable proxy mode";
              uses apply-advanced;
    
              leaf source-address {
                junos:must "((!(".. .. .. .. .. vlans ${vlan} vlan-id all") && !(".. .. .. .. .. vlans ${vlan} vlan-id inner-all")))";
                junos:must-message "With qualified-learning source-address should be configured under Vlan options";
                type jt:ipv6addr;
                description
                  "Source IP address to use for proxy";
              }
            }  // container proxy
    
            leaf evpn-ssm-reports-only {
              type empty;
              description
                "Accept and process only <s,g> reports of SSM groups";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface options for MLD";
              leaf name {
                junos:must "(!("interfaces $$-IFL vlan-tags inner-range"))";
                junos:must-message "interface with vlan-tags inner-range should be specified in a learning-domain only";
                junos:must "(!("interfaces $$-IFL vlan-id-range"))";
                junos:must-message "interface with vlan-id-range should be specified in a learning-domain only";
                junos:must "(!(".. .. .. .. .. vlans ${vlan} vlan-id all"))";
                junos:must-message "When 'vlan-id all' is configured, interface should be configured only under vlan";
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              leaf host-only-interface {
                junos:must "(!(".. multicast-router-interface"))";
                junos:must-message "interface cannot be both host-only and multicast-router";
                type empty;
                description
                  "Enable interfaces to be treated as host-side interfaces";
              }
    
              leaf group-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum number of (source,group) per interface";
              }
    
              container static {
                description
                  "Static group or source membership";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast group address";
                  leaf name {
                    type jt:ipv6addr;
                    description
                      "IP multicast group address";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast source address";
                    leaf name {
                      type jt:ipv6addr;
                      description
                        "Source address of IP multicast data";
                    }
    
                    uses apply-advanced;
                  }  // list source
                }  // list group
              }  // container static
            }  // list interface
    
            list pseudowire-remote-address {
              junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
              junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
              key "name";
              ordered-by user;
              description
                "Pseudowire interface options for MLD";
              leaf name {
                type jt:ipv4addr;
                description
                  "Pseudowire endpoint address";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
            }  // list pseudowire-remote-address
    
            list qualified-vlan {
              key "name";
              ordered-by user;
              description
                "VLAN options for qualified-learning";
              leaf name {
                junos:must "(".. .. .. .. .. vlans ${vlan} vlan-id all")";
                junos:must-message "vlan specific configuration is allowed with qualified-learning only";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1023";
                  }
                }
                description
                  "VLAN ID of the learning-domain";
              }
    
              uses apply-advanced;
    
              leaf query-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1024";
                  }
                }
                units "seconds";
                description
                  "When to send host query messages";
              }
    
              leaf query-response-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "How long to wait for a host query response";
              }
    
              leaf query-last-member-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "When to send group query messages";
              }
    
              leaf robust-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 10";
                  }
                }
                description
                  "Expected packet loss on a subnet";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              container proxy {
                presence "enable proxy";
                description "Enable proxy mode";
                uses apply-advanced;
    
                leaf source-address {
                  type jt:ipv6addr;
                  description
                    "Source IP address to use for proxy";
                }
              }  // container proxy
    
              leaf evpn-ssm-reports-only {
                type empty;
                description
                  "Accept and process only <s,g> reports of SSM groups";
              }
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Interface options for MLD";
                leaf name {
                  junos:must "(".. .. .. .. .. .. vlans ${vlan} interface $$")";
                  junos:must-message "interface options can be specified for the interfaces in the routing-instance";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
    
                leaf host-only-interface {
                  junos:must "(!(".. multicast-router-interface"))";
                  junos:must-message "interface cannot be both host-only and multicast-router";
                  type empty;
                  description
                    "Enable interfaces to be treated as host-side interfaces";
                }
    
                leaf group-limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Maximum number of (source,group) per interface";
                }
    
                container static {
                  description
                    "Static group or source membership";
                  uses apply-advanced;
    
                  list group {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast group address";
                    leaf name {
                      type jt:ipv6addr;
                      description
                        "IP multicast group address";
                    }
    
                    uses apply-advanced;
    
                    list source {
                      key "name";
                      ordered-by user;
                      description
                        "IP multicast source address";
                      leaf name {
                        type jt:ipv6addr;
                        description
                          "Source address of IP multicast data";
                      }
    
                      uses apply-advanced;
                    }  // list source
                  }  // list group
                }  // container static
              }  // list interface
    
              list pseudowire-remote-address {
                junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
                junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
                key "name";
                ordered-by user;
                description
                  "Pseudowire interface options for MLD";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Pseudowire endpoint address";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
              }  // list pseudowire-remote-address
            }  // list qualified-vlan
          }  // list vlan
        }  // grouping juniper-bd-protocols-mld-snooping
    
        grouping juniper-bridge-forwarding-options {
          uses apply-advanced;
    
          container filter {
            description
              "Filtering for bridge forwarding table";
            uses apply-advanced;
    
            leaf input {
              type string;
              description
                "Name of input filter to apply for forwarded packets";
            }
    
            leaf output {
              type string;
              description
                "Name of output filter to apply for forwarded packets";
            }
          }  // container filter
    
          container flood {
            description
              "Filtering for bridge flood table";
            uses apply-advanced;
    
            leaf input {
              type string;
              description
                "Name of input filter to apply for bridge flood packets";
            }
          }  // container flood
    
          container dhcp-relay {
            status deprecated;
            description
              "Dynamic Host Configuration Protocol relay configuration";
            uses jdhcp-relay-type;
          }  // container dhcp-relay
    
          container dhcp-security {
            presence "enable dhcp-security";
            description
              "Dynamic ARP Inspection configuration";
            uses jdhcp-security-type;
          }  // container dhcp-security
        }  // grouping juniper-bridge-forwarding-options
    
        grouping jdhcp-relay-type {
          description
            "Dynamic Host Configuration Protocol relay configuration";
          uses apply-advanced;
    
          container traceoptions {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "Incompatible with 'forwarding-options helpers bootp'";
            junos:must "(!("system services dhcp"))";
            junos:must-message "Incompatible with 'set system services dhcp'";
            status deprecated;
            description
              "DHCP relay trace options";
            uses jdhcp-traceoptions-type;
          }  // container traceoptions
    
          container persistent-storage {
            description
              "Trigger to enable flat file storage";
            leaf automatic {
              type empty;
              description
                "Trigger automatically";
            }
          }  // container persistent-storage
    
          leaf duplicate-clients-on-interface {
            type empty;
            status deprecated;
            description
              "Allow duplicate clients on different interfaces in a subnet";
          }
    
          container duplicate-clients-in-subnet {
            junos:must "(!(".. duplicate-clients-on-interface"))";
            junos:must-message "Cannot specify duplicate-clients-in-subnet with duplicate-clients-on-interface";
            description
              "Allow duplicate clients in a subnet";
            uses jdhcp-duplicate-clients-in-subnet-type;
          }  // container duplicate-clients-in-subnet
    
          container interface-traceoptions {
            status deprecated;
            description
              "DHCP relay interface trace options";
            uses jdhcp-interface-traceoptions-type;
          }  // container interface-traceoptions
    
          container dhcpv6 {
            description "DHCPv6 configuration";
            uses dhcpv6-relay-type;
          }  // container dhcpv6
    
          leaf arp-inspection {
            type empty;
            description
              "Enable Dynamic ARP Inspection";
          }
    
          container forward-snooped-clients {
            junos:must "((!(".. forward-only") && (!(".. forward-only-replies") && !(any ".. group <*> forward-only"))))";
            junos:must-message "forward-only and forward-only-replies cannot be configured when forward-snooped-clients is configured";
            description
              "Forward snooped (unicast) packets";
            choice interface-type {
              leaf configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured interfaces";
              }
              leaf non-configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on non-configured interfaces";
              }
              leaf all-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured and non-configured interfaces";
              }
            }  // choice interface-type
          }  // container forward-snooped-clients
    
          container authentication {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'authentication' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description "DHCP authentication";
            uses authentication-type;
          }  // container authentication
    
          container liveness-detection {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'liveness-detection' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description
              "DHCP client liveness detection processing";
            uses dhcp-liveness-detection-type;
          }  // container liveness-detection
    
          container dynamic-profile {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'dynamic-profile' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'access-profile' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container overrides {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'overrides' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            presence "enable overrides";
            description
              "DHCP override processing";
            uses override-type;
          }  // container overrides
    
          container relay-option {
            junos:must "((!(".. relay-option-60") && !(any ".. group <*> relay-option-60")))";
            junos:must-message "Cannot specify relay-option-60 with relay-option";
            presence "enable relay-option";
            description "DHCP option processing";
            uses dhcp-generic-v4-option;
          }  // container relay-option
    
          container server-match {
            description
              "Server match processing";
            uses apply-advanced;
    
            container default-action {
              presence "enable default-action";
              description
                "Server match default action";
              uses server-match-action-choice;
            }  // container default-action
    
            list address {
              key "name";
              ordered-by user;
              description "Server address";
              leaf name {
                type jt:ipv4prefix;
                description
                  "Server address for matching";
              }
    
              uses apply-advanced;
    
              choice server-match-action-choice {
                leaf forward-only {
                  type empty;
                  description
                    "Forward without subscriber services when a match is made";
                }
                leaf create-relay-entry {
                  type empty;
                  description
                    "Create relay entry and allow subscriber services";
                }
              }  // choice server-match-action-choice
            }  // list address
          }  // container server-match
    
          container relay-option-60 {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'relay-option-60' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            junos:must "((!(".. relay-option") && !(any ".. group <*> relay-option")))";
            junos:must-message "Cannot specify relay-option with relay-option-60 ";
            presence "enable relay-option-60";
            status deprecated;
            description
              "DHCP option-60 processing";
            uses relay-option-60-type-top;
          }  // container relay-option-60
    
          container relay-option-82 {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'relay-option-82' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            presence "enable relay-option-82";
            description
              "DHCP option-82 processing";
            uses relay-option-82-type;
          }  // container relay-option-82
    
          container forward-only {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'forward-only' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            presence "enable forward-only";
            description
              "Forward DHCP packets without creating binding";
            uses forward-only-to-rc-type;
          }  // container forward-only
    
          leaf description {
            type string;
            description
              "Text description of servers";
          }
    
          leaf maximum-hop-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 16";
              }
            }
            description
              "Maximum number of hops per packet";
          }
    
          leaf minimum-wait-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 30000";
              }
            }
            description
              "Minimum number of seconds before requests are forwarded";
          }
    
          leaf client-response-ttl {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 255";
              }
            }
            description
              "IP time-to-live value to set in responses to client";
          }
    
          leaf source-ip-change {
            type empty;
            description
              "Use address of egress interface as source ip";
          }
    
          leaf forward-only-replies {
            type empty;
            description
              "Forward-only replies from server to appropriate logical-system:routing-instance based on options";
          }
    
          container server-group {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'server-group' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description
              "Define a DHCP server group";
            uses server-group-type;
          }  // container server-group
    
          container active-server-group {
            description
              "Name of DHCP server group";
            uses dhcpv4-gbl-active-sg-type;
          }  // container active-server-group
    
          container route-suppression {
            junos:must "(!(".. liveness-detection method layer2-liveness-detection"))";
            junos:must-message "Cannot specify route-suppression with liveness-detection method layer2-liveness-detection";
            junos:must "(!(".. overrides no-arp"))";
            junos:must-message "Cannot specify route-suppression with overrides no-arp";
            description
              "Suppress access-internal and/or destination route addition";
            uses dhcp-route-suppression-type;
          }  // container route-suppression
    
          list group {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'group' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            key "name";
            ordered-by user;
            description "Define a DHCP group";
            uses dhcp-group;
          }  // list group
    
          list dual-stack-group {
            key "name";
            description
              "Define a DHCP dual stack group";
            uses dhcp-dual-stack-group;
          }  // list dual-stack-group
    
          leaf no-snoop {
            junos:must "(!("legacy-snooping"))";
            junos:must-message "'no-snoop' statement cannot be included along with 'legacy-snooping' statement";
            type empty;
            description
              "Do not snoop DHCP packets";
          }
    
          leaf server-response-time {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            default "0";
            description
              "Number of seconds in a period of activity between the last server response and an unaswered request";
          }
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation in seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              leaf drop {
                type empty;
                description
                  "Drop dhcpv4 offer and ack packets";
              }
            }  // container violation-action
          }  // container lease-time-validation
    
          container leasequery {
            junos:must "(".. overrides always-write-option-82")";
            junos:must-message "Must configure [overrides always-write-option-82] to overwrite circuit-id";
            junos:must "((".. relay-option-82 circuit-id" && (!(".. relay-option-82 circuit-id use-interface-description") && !(".. relay-option-82 circuit-id require-interface-description"))))";
            junos:must-message "Must configure [relay-option-82 circuit-id] without description to insert circuit-id";
            presence "enable leasequery";
            description
              "DHCP leasequery configuration";
            uses relay-leasequery-type;
          }  // container leasequery
    
          container bulk-leasequery {
            presence "enable bulk-leasequery";
            description
              "DHCP bulk leasequery configuration";
            uses relay-bulk-leasequery-v4-type;
          }  // container bulk-leasequery
    
          container active-leasequery {
            junos:must "(".. bulk-leasequery")";
            junos:must-message "Must configure bulk-leasequery";
            presence "enable active-leasequery";
            description
              "DHCPv4 active leasequery configuration";
            uses relay-active-leasequery-v4-type;
          }  // container active-leasequery
    
          container remote-id-mismatch {
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
        }  // grouping jdhcp-relay-type
    
        grouping dhcp-dual-stack-group {
          description "DHCP dual stack groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Dual stack group name";
          }
    
          uses apply-advanced;
    
          container authentication {
            description "DHCP authentication";
            uses dual-stack-authentication-type;
          }  // container authentication
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to be used for jdhcpd";
          }
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          container liveness-detection {
            description
              "DHCP client liveness detection processing";
            uses dhcp-liveness-detection-dualstack-type;
          }  // container liveness-detection
    
          container relay-agent-interface-id {
            presence
              "enable relay-agent-interface-id";
            description
              "Interface-id option processing";
            uses v6-relay-option-interface-id-type;
          }  // container relay-agent-interface-id
    
          container relay-agent-remote-id {
            presence
              "enable relay-agent-remote-id";
            description
              "Remote-id option processing";
            uses v6-relay-option-remote-id-type;
          }  // container relay-agent-remote-id
    
          container classification-key {
            junos:must "(".. dynamic-profile")";
            junos:must-message "dynamic profile configuration in dual-stack-group is must for configuring classification-type";
            description
              "Classification key for identifying dual stack household";
            uses classification-types;
          }  // container classification-key
    
          leaf dual-stack-interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of client allowed on an interface";
          }
    
          container protocol-master {
            description
              "Select family as protocol master";
            uses jdhcp-dual-stack-protocol-mstr-type;
          }  // container protocol-master
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
        }  // grouping dhcp-dual-stack-group
    
        grouping dhcp-generic-v4-option {
          description
            "Generic DHCP options processing";
          uses apply-advanced;
    
          leaf option-number {
            type enumeration {
              enum "60" {
                value 0;
                status deprecated;
                description "Option 60";
              }
              enum "77" {
                value 1;
                status deprecated;
                description "Option 77";
              }
            }
            status deprecated;
            description "Option number";
          }
    
          container equals {
            status deprecated;
            description "Generic option equals";
            uses relay-v4-option-ascii-hex;
          }  // container equals
    
          container default-action {
            status deprecated;
            description
              "Generic option default action";
            uses dhcp-v4-option-default-action;
          }  // container default-action
    
          container starts-with {
            status deprecated;
            description
              "Generic option starts with";
            uses relay-v4-option-ascii-hex;
          }  // container starts-with
    
          container option-60 {
            junos:must "(!("option-number"))";
            junos:must-message "Cannot specify option-60  with option-number";
            presence "enable option-60";
            description
              "Add option 60 processing";
            uses dhcp-generic-v4-option-type;
          }  // container option-60
    
          container option-77 {
            junos:must "(!("option-number"))";
            junos:must-message "Cannot specify option-77  with option-number";
            presence "enable option-77";
            description
              "Add option 77 processing";
            uses dhcp-generic-v4-option-type;
          }  // container option-77
    
          list option-order {
            junos:must "(!("option-number"))";
            junos:must-message "Cannot specify option-order  with option-number";
            key "name";
            ordered-by user;
            description
              "Options precedence order";
            leaf name {
              type enumeration {
                enum "60" {
                  value 0;
                  description "Option 60";
                }
                enum "77" {
                  value 1;
                  description "Option 77";
                }
              }
              description "Option number";
            }
    
            uses apply-advanced;
          }  // list option-order
        }  // grouping dhcp-generic-v4-option
    
        grouping dhcp-generic-v4-option-type {
          uses apply-advanced;
    
          container equals {
            description "Generic option equals";
            uses relay-v4-option-ascii-hex;
          }  // container equals
    
          container default-action {
            description
              "Generic option default action";
            uses dhcp-v4-option-default-action;
          }  // container default-action
    
          container starts-with {
            description
              "Generic option starts with";
            uses relay-v4-option-ascii-hex;
          }  // container starts-with
        }  // grouping dhcp-generic-v4-option-type
    
        grouping dhcp-group {
          description "DHCP groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          container active-server-group {
            description
              "Name of DHCP server group";
            uses dhcpv4-gp-active-sg-type;
          }  // container active-server-group
    
          container authentication {
            description "DHCP authentication";
            uses authentication-type;
          }  // container authentication
    
          container liveness-detection {
            description
              "DHCP client liveness detection processing";
            uses dhcp-liveness-detection-type;
          }  // container liveness-detection
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container overrides {
            presence "enable overrides";
            description
              "DHCP override processing";
            uses override-type;
          }  // container overrides
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container server-match {
            description
              "Server match processing";
            uses apply-advanced;
    
            container default-action {
              presence "enable default-action";
              description
                "Server match default action";
              uses server-match-action-choice;
            }  // container default-action
    
            list address {
              key "name";
              ordered-by user;
              description "Server address";
              leaf name {
                type jt:ipv4prefix;
                description
                  "Server address for matching";
              }
    
              uses apply-advanced;
    
              choice server-match-action-choice {
                leaf forward-only {
                  type empty;
                  description
                    "Forward without subscriber services when a match is made";
                }
                leaf create-relay-entry {
                  type empty;
                  description
                    "Create relay entry and allow subscriber services";
                }
              }  // choice server-match-action-choice
            }  // list address
          }  // container server-match
    
          container relay-option {
            junos:must "((!(".. relay-option-60") && !(".. .. relay-option-60")))";
            junos:must-message "Cannot specify relay-option-60 with relay-option";
            presence "enable relay-option";
            description "DHCP option processing";
            uses dhcp-generic-v4-option;
          }  // container relay-option
    
          container relay-option-60 {
            junos:must "((!(".. relay-option") && !(".. .. relay-option")))";
            junos:must-message "Cannot specify relay-option with relay-option-60";
            presence "enable relay-option-60";
            status deprecated;
            description
              "DHCP option-60 processing";
            uses relay-option-60-type-group;
          }  // container relay-option-60
    
          container relay-option-82 {
            presence "enable relay-option-82";
            description
              "DHCP option-82 processing";
            uses relay-option-82-type;
          }  // container relay-option-82
    
          container forward-only {
            presence "enable forward-only";
            description
              "Forward DHCP packets without creating binding";
            uses forward-only-to-rc-type;
          }  // container forward-only
    
          container route-suppression {
            junos:must "(!(".. liveness-detection method layer2-liveness-detection"))";
            junos:must-message "Cannot specify route-suppression with liveness-detection method layer2-liveness-detection";
            junos:must "((!(".. overrides no-arp") && !(".. .. overrides no-arp")))";
            junos:must-message "Cannot specify route-suppression with overrides no-arp";
            description
              "Suppress access-internal and/or destination route addition";
            uses dhcp-route-suppression-type;
          }  // container route-suppression
    
          leaf description {
            type string;
            description
              "Text description of servers";
          }
    
          leaf maximum-hop-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 16";
              }
            }
            description
              "Maximum number of hops per packet";
          }
    
          leaf minimum-wait-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 30000";
              }
            }
            description
              "Minimum number of seconds before requests are forwarded";
          }
    
          leaf client-response-ttl {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 255";
              }
            }
            description
              "IP time-to-live value to set in responses to client";
          }
    
          leaf source-ip-change {
            type empty;
            description
              "Use address of egress interface as source ip";
          }
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf upto {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface up to";
            }
    
            leaf exclude {
              type empty;
              description
                "Exclude this interface range";
            }
    
            leaf trace {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify tracing with exclude";
              type empty;
              description
                "Enable tracing for this interface";
            }
    
            container overrides {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "DHCP override processing";
              uses override-type;
            }  // container overrides
    
            container dynamic-profile {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "Dynamic profile to use";
              uses dynamic-profile-type;
            }  // container dynamic-profile
    
            leaf service-profile {
              type string {
                length "1 .. 128";
              }
              description
                "Dynamic profile to use for default service activation";
            }
    
            leaf access-profile {
              junos:must "("access profile $$")";
              junos:must-message "Matching access profile must be defined";
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              type string {
                length "1 .. 128";
              }
              description
                "Access profile to use for AAA services";
            }
    
            container short-cycle-protection {
              description
                "Short cycle lockout configuration";
              leaf lockout-min-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
    
              leaf lockout-max-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
            }  // container short-cycle-protection
          }  // list interface
    
          container remote-id-mismatch {
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation in seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              leaf drop {
                type empty;
                description
                  "Drop dhcpv4 offer and ack packets";
              }
            }  // container violation-action
          }  // container lease-time-validation
        }  // grouping dhcp-group
    
        grouping dhcp-v4-option-default-action {
          description "Default action";
          uses apply-advanced;
    
          choice server-group-choice {
            leaf relay-server-group {
              junos:must "((".. .. .. .. .. .. server-group $$" || (".. .. .. .. .. server-group $$" || (".. .. .. .. server-group $$" || ".. .. .. server-group $$"))))";
              junos:must-message "Referenced group must be defined under [edit forwarding dhcp-relay server-group]";
              type string {
                length "1 .. 64";
              }
              description
                "Name of DHCP relay server group when match is made";
            }
            leaf local-server-group {
              junos:must "((".. .. .. .. .. .. .. .. system services dhcp-local-server group $$" || (".. .. .. .. .. .. .. system services dhcp-local-server group $$" || (".. .. .. .. .. .. system services dhcp-local-server group $$" || ".. .. .. .. .. system services dhcp-local-server group $$"))))";
              junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
              type string {
                length "1 .. 64";
              }
              description
                "Name of DHCP local server group when match is made";
            }
            leaf drop {
              type empty;
              description
                "Discard when a match is made";
            }
            leaf forward-only {
              type empty;
              description
                "Forward without subscriber services when a match is made";
            }
          }  // choice server-group-choice
        }  // grouping dhcp-v4-option-default-action
    
        grouping dhcpv4-gbl-active-sg-type {
          leaf active-server-group {
            junos:must "(".. .. server-group $$")";
            junos:must-message "Referenced group must be defined under [edit forwarding-options dhcp-relay server-group]";
            type string {
              length "1 .. 64";
            }
            description
              "Name of DHCP server group";
          }
    
          leaf allow-server-change {
            type empty;
            description
              "Accept DHCP-ACK from any server in this group";
          }
        }  // grouping dhcpv4-gbl-active-sg-type
    
        grouping dhcpv4-gp-active-sg-type {
          leaf active-server-group {
            junos:must "(".. .. .. server-group $$")";
            junos:must-message "Referenced group must be defined under [edit forwarding-options dhcp-relay server-group]";
            type string {
              length "1 .. 64";
            }
            description
              "Name of DHCP server group";
          }
    
          leaf allow-server-change {
            type empty;
            description
              "Accept DHCP-ACK from any server in this group";
          }
        }  // grouping dhcpv4-gp-active-sg-type
    
        grouping dhcpv6-relay-type {
          description
            "DHCPv6 relay configuration";
          uses apply-advanced;
    
          container authentication {
            description "DHCPv6 authentication";
            uses dhcpv6-authentication-type;
          }  // container authentication
    
          container persistent-storage {
            description
              "Trigger to enable flat file storage";
            leaf automatic {
              type empty;
              description
                "Trigger automatically";
            }
          }  // container persistent-storage
    
          container liveness-detection {
            description
              "DHCPv6 client liveness detection processing";
            uses dhcpv6-liveness-detection-type;
          }  // container liveness-detection
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container overrides {
            presence "enable overrides";
            description
              "DHCPv6 override processing";
            uses dhcpv6-override-relay-type;
          }  // container overrides
    
          container relay-option {
            presence "enable relay-option";
            description
              "DHCPv6 option processing";
            uses dhcp-generic-v6-option;
          }  // container relay-option
    
          leaf exclude-relay-agent-identifier {
            type empty;
            description
              "Exclude relay agent identifier from packets to server";
          }
    
          container server-match {
            description
              "Server match processing";
            uses apply-advanced;
    
            container default-action {
              description
                "Server match default action";
              uses server-match-action-choice;
            }  // container default-action
    
            container duid {
              description
                "Match duid processing";
              uses apply-advanced;
    
              container equals {
                description "Duid equals";
                uses server-match-v6-ascii-hex;
              }  // container equals
    
              container starts-with {
                description "Duid starts with";
                uses server-match-v6-ascii-hex;
              }  // container starts-with
            }  // container duid
    
            list address {
              key "name";
              ordered-by user;
              description "Server ipv6 address";
              leaf name {
                type jt:ipv6prefix;
                description
                  "Server ipv6 address for matching";
              }
    
              uses apply-advanced;
    
              choice server-match-action-choice {
                leaf forward-only {
                  type empty;
                  description
                    "Forward without subscriber services when a match is made";
                }
                leaf create-relay-entry {
                  type empty;
                  description
                    "Create relay entry and allow subscriber services";
                }
              }  // choice server-match-action-choice
            }  // list address
          }  // container server-match
    
          leaf relay-agent-option-79 {
            type empty;
            description
              "Add the client MAC address to the Relay Forward header.";
          }
    
          container vendor-specific-information {
            description
              "DHCPv6 option 17 vendor-specific processing";
            uses jdhcp-vendor-specific-type;
          }  // container vendor-specific-information
    
          container forward-only {
            presence "enable forward-only";
            description
              "Forward DHCPv6 packets without creating binding";
            uses forward-only-to-rc-type;
          }  // container forward-only
    
          leaf forward-only-replies {
            type empty;
            description
              "Forward-only replies from server to appropriate logical-system:routing-instance based on options";
          }
    
          container forward-snooped-clients {
            junos:must "((!(".. forward-only") && (!(".. forward-only-replies") && !(any ".. group <*> forward-only"))))";
            junos:must-message "forward-only and forward-only-replies cannot be configured when forward-snooped-clients is configured";
            description
              "Forward snooped (unicast) packets";
            choice interface-type {
              leaf configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured interfaces";
              }
              leaf non-configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on non-configured interfaces";
              }
              leaf all-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured and non-configured interfaces";
              }
            }  // choice interface-type
          }  // container forward-snooped-clients
    
          container route-suppression {
            description
              "Suppress access-internal and/or access route addition";
            uses dhcpv6-route-suppression-type;
          }  // container route-suppression
    
          list group {
            key "name";
            ordered-by user;
            description
              "Define a DHCPv6 relay group";
            uses dhcpv6-relay-group;
          }  // list group
    
          container relay-agent-interface-id {
            presence
              "enable relay-agent-interface-id";
            description
              "DHCPv6 interface-id option processing";
            uses v6-relay-option-interface-id-type;
          }  // container relay-agent-interface-id
    
          container relay-agent-remote-id {
            presence
              "enable relay-agent-remote-id";
            description
              "DHCPv6 remote-id option processing";
            uses v6-relay-option-remote-id-type;
          }  // container relay-agent-remote-id
    
          container server-group {
            description
              "Define a DHCPv6 server group";
            uses v6-server-group-type;
          }  // container server-group
    
          container active-server-group {
            description
              "Name of DHCPv6 server group";
            uses dhcpv6-gbl-active-sg-type;
          }  // container active-server-group
    
          leaf server-response-time {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            default "0";
            description
              "Number of seconds in a period of activity between the last server response and an unaswered request";
          }
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation in seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              leaf drop {
                type empty;
                description
                  "Drop dhcpv6 advertise and reply packets";
              }
            }  // container violation-action
          }  // container lease-time-validation
    
          leaf no-snoop {
            junos:must "(!("legacy-snooping"))";
            junos:must-message "'no-snoop' statement cannot be included along with 'legacy-snooping' statement";
            type empty;
            description
              "Do not snoop DHCPV6 packets";
          }
    
          container leasequery {
            junos:must "(".. relay-agent-interface-id")";
            junos:must-message "Must configure [relay-agent-interface-id] to insert interface-id";
            presence "enable leasequery";
            description
              "DHCPv6 leasequery configuration";
            uses relay-leasequery-type;
          }  // container leasequery
    
          container bulk-leasequery {
            junos:must "(".. relay-agent-interface-id")";
            junos:must-message "Must configure [relay-agent-interface-id] to insert interface-id";
            presence "enable bulk-leasequery";
            description
              "DHCPv6 bulk leasequery configuration";
            uses relay-bulk-leasequery-v6-type;
          }  // container bulk-leasequery
    
          container active-leasequery {
            junos:must "(".. bulk-leasequery")";
            junos:must-message "Must configure bulk-leasequery";
            presence "enable active-leasequery";
            description
              "DHCPv6 active leasequery configuration";
            uses relay-active-leasequery-v6-type;
          }  // container active-leasequery
    
          container remote-id-mismatch {
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container duplicate-clients {
            description
              "Allow duplicate clients";
            uses dhcpv6-duplicate-clients-type;
          }  // container duplicate-clients
        }  // grouping dhcpv6-relay-type
    
        grouping dhcp-generic-v6-option {
          description
            "Generic DHCPv6 options processing";
          uses apply-advanced;
    
          leaf option-number {
            type enumeration {
              enum "15" {
                value 0;
                status deprecated;
                description "Option 15";
              }
              enum "16" {
                value 1;
                status deprecated;
                description "Option 16";
              }
            }
            status deprecated;
            description "Option number";
          }
    
          container equals {
            status deprecated;
            description "Generic option equals";
            uses relay-v6-option-ascii-hex;
          }  // container equals
    
          container default-action {
            status deprecated;
            description
              "Generic option default action";
            uses dhcp-v6-option-default-action;
          }  // container default-action
    
          container starts-with {
            status deprecated;
            description
              "Generic option starts with";
            uses relay-v6-option-ascii-hex;
          }  // container starts-with
    
          container option-15 {
            junos:must "(!("option-number"))";
            junos:must-message "Cannot specify option-15  with option-number";
            presence "enable option-15";
            description
              "Add option 15 processing";
            uses dhcp-generic-v6-option-type;
          }  // container option-15
    
          container option-16 {
            junos:must "(!("option-number"))";
            junos:must-message "Cannot specify option-16  with option-number";
            presence "enable option-16";
            description
              "Add option 16 processing";
            uses dhcp-generic-v6-option-type;
          }  // container option-16
    
          list option-order {
            junos:must "(!("option-number"))";
            junos:must-message "Cannot specify option-order  with option-number";
            key "name";
            ordered-by user;
            description
              "Options precedence order";
            leaf name {
              type enumeration {
                enum "15" {
                  value 0;
                  description "Option 15";
                }
                enum "16" {
                  value 1;
                  description "Option 16";
                }
              }
              description "Option number";
            }
    
            uses apply-advanced;
          }  // list option-order
        }  // grouping dhcp-generic-v6-option
    
        grouping dhcp-generic-v6-option-type {
          uses apply-advanced;
    
          container equals {
            description "Generic option equals";
            uses relay-v6-option-ascii-hex;
          }  // container equals
    
          container default-action {
            description
              "Generic option default action";
            uses dhcp-v6-option-default-action;
          }  // container default-action
    
          container starts-with {
            description
              "Generic option starts with";
            uses relay-v6-option-ascii-hex;
          }  // container starts-with
        }  // grouping dhcp-generic-v6-option-type
    
        grouping dhcp-v6-option-default-action {
          description "Default action";
          uses apply-advanced;
    
          choice server-group-choice {
            leaf relay-server-group {
              junos:must "((".. .. .. .. .. .. server-group $$" || (".. .. .. .. .. server-group $$" || (".. .. .. .. server-group $$" || ".. .. .. server-group $$"))))";
              junos:must-message "Referenced group must be defined under [edit forwarding options dhcp-relay dhcpv6 server-group]";
              type string {
                length "1 .. 64";
              }
              description
                "Name of DHCP relay server group when match is made";
            }
            leaf drop {
              type empty;
              description
                "Discard when a match is made";
            }
            leaf forward-only {
              type empty;
              description
                "Forward without subscriber services when a match is made";
            }
          }  // choice server-group-choice
        }  // grouping dhcp-v6-option-default-action
    
        grouping dhcpv6-gbl-active-sg-type {
          uses apply-advanced;
    
          leaf active-server-group {
            junos:must "(".. .. server-group $$")";
            junos:must-message "Referenced group must be defined under [edit forwarding-options dhcp-relay dhcpv6 server-group]";
            type string {
              length "1 .. 64";
            }
            description
              "Name of DHCPv6 server group";
          }
        }  // grouping dhcpv6-gbl-active-sg-type
    
        grouping dhcpv6-override-relay-type {
          description
            "DHCPv6 relay override processing";
          uses apply-advanced;
    
          choice allow-snooped-clients-choice {
            leaf allow-snooped-clients {
              type empty;
              description
                "Allow client creation from snooped PDUs";
            }
            leaf no-allow-snooped-clients {
              type empty;
              description
                "Don't allow client creation from snooped PDUs";
            }
          }  // choice allow-snooped-clients-choice
    
          leaf delay-authentication {
            type empty;
            description
              "Delay subscriber authentication in DHCP protocol processing until request packet";
          }
    
          leaf interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of clients allowed on an interface";
          }
    
          leaf dual-stack {
            type string {
              length "1 .. 64";
            }
            description
              "Dual stack group to use.";
          }
    
          leaf no-bind-on-request {
            type empty;
            description
              "Do not bind if stray DHCPv6 RENEW, REBIND is received";
          }
    
          container client-negotiation-match {
            description
              "Use secondary match criteria for SOLICIT PDU";
            choice match-with {
              leaf incoming-interface {
                type empty;
                description
                  "Use incoming interface";
              }
            }  // choice match-with
          }  // container client-negotiation-match
    
          leaf send-release-on-delete {
            type empty;
            description
              "Always send RELEASE to the server when a binding is deleted";
          }
    
          leaf always-process-option-request-option {
            type empty;
            description
              "Always process option even after address allocation failure";
          }
    
          leaf relay-source {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface for relay source";
          }
    
          leaf delete-binding-on-renegotiation {
            type empty;
            description
              "Delete binding on renegotiation";
          }
    
          leaf asymmetric-lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "600 .. 86400";
              }
            }
            units "seconds";
            description
              "Use a reduced lease time for the client. In seconds";
          }
    
          leaf asymmetric-prefix-lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "600 .. 86400";
              }
            }
            units "seconds";
            description
              "Use a reduced prefix lease time for the client. In seconds";
          }
        }  // grouping dhcpv6-override-relay-type
    
        grouping dhcpv6-relay-group {
          description "DHCPv6 groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          container active-server-group {
            description
              "Name of DHCPv6 server group";
            uses dhcpv6-gp-active-sg-type;
          }  // container active-server-group
    
          list dual-stack-group {
            key "name";
            description
              "Define a DHCP dual stack group";
            uses dhcp-dual-stack-group;
          }  // list dual-stack-group
    
          container authentication {
            description "DHCPv6 authentication";
            uses dhcpv6-authentication-type;
          }  // container authentication
    
          container liveness-detection {
            description
              "DHCPv6 client liveness detection processing";
            uses dhcpv6-liveness-detection-type;
          }  // container liveness-detection
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container overrides {
            presence "enable overrides";
            description
              "DHCPv6 override processing";
            uses dhcpv6-override-relay-type;
          }  // container overrides
    
          container relay-option {
            presence "enable relay-option";
            description
              "DHCPv6 option processing";
            uses dhcp-generic-v6-option;
          }  // container relay-option
    
          container vendor-specific-information {
            description
              "DHCPv6 option 17 vendor-specific processing";
            uses jdhcp-vendor-specific-type;
          }  // container vendor-specific-information
    
          container forward-only {
            presence "enable forward-only";
            description
              "Forward DHCPv6 packets without creating binding";
            uses forward-only-to-rc-type;
          }  // container forward-only
    
          container relay-agent-interface-id {
            presence
              "enable relay-agent-interface-id";
            description
              "DHCPv6 interface-id option processing";
            uses v6-relay-option-interface-id-type;
          }  // container relay-agent-interface-id
    
          container relay-agent-remote-id {
            presence
              "enable relay-agent-remote-id";
            description
              "DHCPv6 remote-id option processing";
            uses v6-relay-option-remote-id-type;
          }  // container relay-agent-remote-id
    
          container route-suppression {
            description
              "Suppress access-internal and/or access route addition";
            uses dhcpv6-route-suppression-type;
          }  // container route-suppression
    
          leaf relay-agent-option-79 {
            type empty;
            description
              "Add the client MAC address to the Relay Forward header.";
          }
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              junos:must "((unique "forwarding-options dhcp-relay dhcpv6 group <*> interface $$" && !(any "system services dhcp-local-server dhcpv6 group <*> interface $$")))";
              junos:must-message "Interface used in other relay or server group";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf upto {
              junos:must "(!(".. .. interface $$"))";
              junos:must-message "Range end point must not equal start";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface up to";
            }
    
            leaf exclude {
              type empty;
              description
                "Exclude this interface range";
            }
    
            leaf trace {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify tracing with exclude";
              type empty;
              description
                "Enable tracing for this interface";
            }
    
            container overrides {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "DHCPv6 override processing";
              uses dhcpv6-override-relay-type;
            }  // container overrides
    
            container dynamic-profile {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify dynamic-profile with exclude";
              description
                "Dynamic profile to use";
              uses dynamic-profile-type;
            }  // container dynamic-profile
    
            leaf service-profile {
              type string {
                length "1 .. 128";
              }
              description
                "Dynamic profile to use for default service activation";
            }
    
            leaf access-profile {
              junos:must "("access profile $$")";
              junos:must-message "Matching access profile must be defined";
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              type string {
                length "1 .. 128";
              }
              description
                "Access profile to use for AAA services";
            }
    
            container short-cycle-protection {
              description
                "Short cycle lockout configuration";
              leaf lockout-min-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
    
              leaf lockout-max-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
            }  // container short-cycle-protection
          }  // list interface
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation in seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              leaf drop {
                type empty;
                description
                  "Drop dhcpv6 advertise and reply packets";
              }
            }  // container violation-action
          }  // container lease-time-validation
    
          container remote-id-mismatch {
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container server-match {
            description
              "Server match processing";
            uses apply-advanced;
    
            container default-action {
              description
                "Server match default action";
              uses server-match-action-choice;
            }  // container default-action
    
            container duid {
              description
                "Match duid processing";
              uses apply-advanced;
    
              container equals {
                description "Duid equals";
                uses server-match-v6-ascii-hex;
              }  // container equals
    
              container starts-with {
                description "Duid starts with";
                uses server-match-v6-ascii-hex;
              }  // container starts-with
            }  // container duid
    
            list address {
              key "name";
              ordered-by user;
              description "Server ipv6 address";
              leaf name {
                type jt:ipv6prefix;
                description
                  "Server ipv6 address for matching";
              }
    
              uses apply-advanced;
    
              choice server-match-action-choice {
                leaf forward-only {
                  type empty;
                  description
                    "Forward without subscriber services when a match is made";
                }
                leaf create-relay-entry {
                  type empty;
                  description
                    "Create relay entry and allow subscriber services";
                }
              }  // choice server-match-action-choice
            }  // list address
          }  // container server-match
        }  // grouping dhcpv6-relay-group
    
        grouping dhcpv6-gp-active-sg-type {
          uses apply-advanced;
    
          leaf active-server-group {
            junos:must "(".. .. .. server-group $$")";
            junos:must-message "Referenced group must be defined under [edit forwarding-options dhcp-relay dhcpv6 server-group]";
            type string {
              length "1 .. 64";
            }
            description
              "Name of DHCPv6 server group";
          }
        }  // grouping dhcpv6-gp-active-sg-type
    
        grouping forward-only-to-rc-type {
          description
            "Forward DHCP packets without creating binding";
          uses apply-advanced;
    
          leaf logical-system {
            type string;
            default "current";
          }
    
          leaf routing-instance {
            type string;
            default "current";
          }
        }  // grouping forward-only-to-rc-type
    
        grouping jdhcp-security-type {
          description
            "DHCP access security configuration";
          uses apply-advanced;
    
          leaf no-dhcp-snooping {
            junos:must "(!("switch-options no-arp-trap "))";
            junos:must-message "Cannot enable ARP inspection with no-arp-trap";
            type empty;
            description "Disable dhcp snooping";
          }
    
          leaf arp-inspection {
            type empty;
            description
              "Enable dynamic ARP inspection";
          }
    
          leaf ip-source-guard {
            junos:must "(!(any ".. group <*> overrides untrusted"))";
            junos:must-message "Ip-source-guard and dhcp-security overrides untrusted cannot be configured together";
            type empty;
            description "Enable IP source guard";
          }
    
          leaf no-dhcpv6-snooping {
            type empty;
            description
              "Disable DHCPv6 snooping";
          }
    
          leaf neighbor-discovery-inspection {
            type empty;
            description
              "Enable neighbor discovery inspection";
          }
    
          leaf ipv6-source-guard {
            junos:must "(!(any ".. group <*> overrides untrusted"))";
            junos:must-message "Ipv6-source-guard and dhcp-security overrides untrusted cannot be configured together";
            type empty;
            description
              "Enable IPv6 source guard";
          }
    
          leaf light-weight-dhcpv6-relay {
            type empty;
            description
              "Enable light weight dhcpv6 relay";
          }
    
          list group {
            key "name";
            ordered-by user;
            description
              "Define a DHCP security group for overriding defaults";
            uses ds-group;
          }  // list group
    
          container option-82 {
            presence "enable option-82";
            description
              "DHCP option-82 processing for snooped packets";
            uses security-option-82-type;
          }  // container option-82
    
          container dhcpv6-options {
            presence "enable dhcpv6-options";
            description
              "DHCPv6 option processing for snooped packets";
            uses security-dhcpv6-options-type;
          }  // container dhcpv6-options
        }  // grouping jdhcp-security-type
    
        grouping ds-group {
          description "DHCP security groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          container overrides {
            presence "enable overrides";
            description
              "DHCP override processing";
            uses ds-override-type;
          }  // container overrides
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            list static-ip {
              key "name";
              ordered-by user;
              description
                "Static IP address configuration";
              uses ip-mac-static;
            }  // list static-ip
    
            list static-ipv6 {
              key "name";
              ordered-by user;
              description
                "Static IPv6 address configuration";
              uses ipv6-mac-static;
            }  // list static-ipv6
          }  // list interface
        }  // grouping ds-group
    
        grouping ds-override-type {
          description
            "Dynamic ARP Inspection override processing";
          uses apply-advanced;
    
          leaf trusted {
            junos:must "(!(".. untrusted"))";
            junos:must-message "Trusted and untrusted cannot be configured together";
            type empty;
            description
              "Make this trusted group of interfaces";
          }
    
          leaf untrusted {
            junos:must "(!(".. trusted"))";
            junos:must-message "Trusted and untrusted cannot be configured together";
            type empty;
            description
              "Make this untrusted group of interfaces";
          }
    
          leaf no-option82 {
            type empty;
            description
              "Make this group of interfaces not to add option82";
          }
    
          leaf no-option37 {
            type empty;
            description
              "Make this group of interfaces not to add option37";
          }
    
          leaf no-option18 {
            type empty;
            description
              "Make this group of interfaces not to add option18";
          }
    
          leaf no-option16 {
            type empty;
            description
              "Make this group of interfaces not to add option16";
          }
    
          leaf no-option79 {
            type empty;
            description
              "Make this group of interfaces not to add option79";
          }
    
          leaf no-dhcpv6-options {
            type empty;
            description
              "Make this group of interfaces not to add any DHCPv6 options";
          }
        }  // grouping ds-override-type
    
        grouping ip-mac-static {
          leaf name {
            type jt:ipaddr;
            description "IP address";
          }
    
          leaf mac {
            type jt:mac-addr;
            description "MAC address";
          }
        }  // grouping ip-mac-static
    
        grouping ipv6-mac-static {
          leaf name {
            type jt:ipv6addr;
            description "IP address";
          }
    
          leaf mac {
            type jt:mac-addr;
            description "MAC address";
          }
        }  // grouping ipv6-mac-static
    
        grouping jdhcp-vendor-specific-type {
          description
            "Add vendor-specific option processing";
          uses apply-advanced;
    
          leaf host-name {
            type empty;
            description "Add router host name";
          }
    
          leaf location {
            type empty;
            description
              "Add location information expressed as interface name format";
          }
        }  // grouping jdhcp-vendor-specific-type
    
        grouping juniper-forwarding-options {
          uses apply-advanced;
    
          list storm-control-profiles {
            key "name";
            description
              "Storm control profile for this instance";
            leaf name {
              junos:must "("forwarding-options storm-control-profiles $$ all")";
              junos:must-message "Only aggregate profiles supported";
              type string {
                length "1 .. 127";
              }
              description
                "Storm control profile name";
            }
    
            uses apply-advanced;
    
            container all {
              presence "enable all";
              description "For all BUM traffic";
              uses apply-advanced;
    
              choice bandwidth {
                leaf bandwidth-percentage {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of link bandwidth";
                }
                leaf bandwidth-level {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32;
                  }
                  units "kbps";
                  description "Link bandwidth";
                }
              }  // choice bandwidth
    
              leaf burst-size {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                units "bytes";
                description "Burst size";
              }
    
              leaf no-broadcast {
                type empty;
                description
                  "Disable broadcast storm control";
              }
    
              leaf no-unknown-unicast {
                type empty;
                description
                  "Disable unknown unicast storm control";
              }
    
              choice no-multicast-choices {
                leaf no-multicast {
                  type empty;
                  description
                    "Disable multicast storm control";
                }
                leaf no-registered-multicast {
                  type empty;
                  description
                    "Disable registered multicast storm control";
                }
                leaf no-unregistered-multicast {
                  type empty;
                  description
                    "Disable unregistered multicast storm control";
                }
              }  // choice no-multicast-choices
            }  // container all
    
            leaf action-shutdown {
              type empty;
              description
                "Disable port for excessive storm control errors";
            }
          }  // list storm-control-profiles
    
          choice sampling-or-packet-capture {
            container sampling {
              description
                "Statistical traffic sampling options";
              uses juniper-sampling-options;
            }  // container sampling
    
            case case_2 {
            }  // case case_2
          }  // choice sampling-or-packet-capture
    
          list accounting {
            key "name";
            description
              "Configure accounting of traffic";
            uses juniper-packet-accounting-options;
          }  // list accounting
    
          list analyzer {
            key "name";
            description "Analyzer options";
            uses smpl-analyzer-type;
          }  // list analyzer
    
          container port-mirroring {
            description
              "Configure port mirroring of traffic";
            uses juniper-port-mirror-options;
          }  // container port-mirroring
    
          container evpn-vxlan {
            description
              "EVPN VXLAN configurations";
            uses apply-advanced;
    
            leaf shared-tunnels {
              type empty;
              description
                "Create VTEP tunnels to EVPN PE";
            }
    
            container reroute-address {
              description
                "Reroute IP address for vxlan encapsulation";
              choice family {
                container inet {
                  presence "enable inet";
                  description
                    "IPv4 address family";
                  uses apply-advanced;
    
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Reroute address for IPV4 FRR";
                  }
                }  // container inet
                container inet6 {
                  presence "enable inet6";
                  description
                    "IPv6 address family";
                  uses apply-advanced;
    
                  leaf address {
                    type jt:ipv6addr;
                    description
                      "Reroute address for IPV6 FRR";
                  }
                }  // container inet6
              }  // choice family
            }  // container reroute-address
          }  // container evpn-vxlan
    
          container multicast-replication {
            description
              "Set mode of multicast replication";
            uses apply-advanced;
    
            container evpn {
              description
                "EVPN IRB multicast related options";
              uses apply-advanced;
    
              leaf irb {
                type enumeration {
                  enum "local-only" {
                    value 0;
                    description
                      "Multicast forward in local-only mode";
                  }
                  enum "local-remote" {
                    value 1;
                    description
                      "Multicast forward in local-remote mode";
                  }
                  enum "oism" {
                    value 2;
                    description
                      "Optimized inter subnet multicast mode";
                  }
                }
              }
    
              leaf smet-nexthop-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10000 .. 40000";
                  }
                }
                description
                  "Flood traffic to all egress when count goes above limit";
              }
            }  // container evpn
          }  // container multicast-replication
    
          container load-balance {
            description
              "Configure load-balancing attributes on the forwarding path";
            uses apply-advanced;
    
            container indexed-load-balance {
              presence
                "enable indexed-load-balance";
              description
                "Use indexed permuted next hop lists for unilist and aggregate next hops";
              uses apply-advanced;
            }  // container indexed-load-balance
    
            container per-flow {
              uses apply-advanced;
            }  // container per-flow
    
            container per-prefix {
              presence "enable per-prefix";
              uses apply-advanced;
    
              leaf hash-seed {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "0 .. 65534";
                  }
                }
                default "0";
                description
                  "Specifies per-router input value for per-prefix load-balancing hash function";
              }
            }  // container per-prefix
          }  // container load-balance
    
          container hash-key {
            description
              "Select data used in the hash key";
            uses junos_hash_key;
          }  // container hash-key
    
          container local-bias {
            presence "enable local-bias";
            description
              "Turn on local bias functionality";
            uses apply-advanced;
    
            leaf disable {
              type empty;
              description "Disable local-bias";
            }
          }  // container local-bias
    
          container enhanced-hash-key {
            description
              "Select data used in the hash key for Enhanced IP Forwarding Engines";
            uses apply-advanced;
    
            leaf use-trunk-max-links {
              type empty;
              description
                "Use 8 links in trunk programming instead of actual links";
            }
    
            container lag-dlb {
              presence "enable lag-dlb";
              description
                "Setting dynamic load balancing options for LAG";
              uses apply-advanced;
    
              container ether-type {
                presence "enable ether-type";
                description
                  "Setting ether type for LAG DLB";
                uses apply-advanced;
    
                leaf ipv4 {
                  type empty;
                  description
                    "Ether type is ipv4";
                }
    
                leaf ipv6 {
                  type empty;
                  description
                    "Ether type is ipv6";
                }
    
                leaf mpls {
                  type empty;
                  description
                    "Ether type is mpls";
                }
              }  // container ether-type
            }  // container lag-dlb
    
            container ecmp-dlb {
              junos:must "(!(".. ecmp-resilient-hash"))";
              junos:must-message "RH and DLB cannot be configured together";
              description
                "Set load balancing options for VC-Fabric forwarding";
              uses apply-advanced;
    
              choice mode {
                leaf assigned-flow {
                  type empty;
                  description
                    "Flow-based fixed link assignment";
                }
                container flowlet {
                  presence "enable flowlet";
                  description
                    "Inactivity-based flowlet link assignment (default)";
                  uses apply-advanced;
    
                  leaf inactivity-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32;
                    }
                    default "256";
                    description
                      "Minimum inactivity interval in micro-seconds for flowlet detection";
                  }
                }  // container flowlet
                leaf per-packet {
                  type empty;
                  description
                    "Per-packet optimal spraying";
                }
              }  // choice mode
    
              container ether-type {
                presence "enable ether-type";
                description "Ether type";
                uses apply-advanced;
    
                leaf ipv4 {
                  type empty;
                  description "Set DLB for ipv4";
                }
    
                leaf ipv6 {
                  type empty;
                  description "Set DLB for ipv6";
                }
    
                leaf mpls {
                  type empty;
                  description "Set DLB for mpls";
                }
              }  // container ether-type
            }  // container ecmp-dlb
    
            container hash-seed {
              presence "enable hash-seed";
              description "Hash seed";
              uses apply-advanced;
            }  // container hash-seed
    
            container mpls {
              description
                "Configure mpls fields";
              uses apply-advanced;
    
              leaf no-incoming-port {
                type empty;
                description
                  "Exclude incoming port from the hash key";
              }
    
              leaf no-incoming-device {
                type empty;
                description
                  "Exclude incoming device from the hash key";
              }
            }  // container mpls
    
            container layer2 {
              description
                "Configure layer2 fields";
              uses apply-advanced;
    
              leaf no-incoming-port {
                type empty;
                description
                  "Exclude incoming port from the hash key";
              }
    
              leaf no-incoming-device {
                type empty;
                description
                  "Exclude incoming device from the hash key";
              }
    
              leaf no-source-mac-address {
                type empty;
                description
                  "Exclude source MAC address from the hash key";
              }
    
              leaf no-destination-mac-address {
                type empty;
                description
                  "Exclude destination MAC address from the hash key";
              }
    
              leaf no-ether-type {
                type empty;
                description
                  "Exclude ether type from the hash key";
              }
    
              leaf vlan-id {
                type empty;
                description
                  "Include incoming vlan-id in hash key";
              }
            }  // container layer2
    
            container inet {
              description
                "Configure inet4 fields";
              uses apply-advanced;
    
              leaf no-incoming-port {
                type empty;
                description
                  "Exclude incoming port from the hash key";
              }
    
              leaf no-incoming-device {
                type empty;
                description
                  "Exclude incoming device from the hash key";
              }
    
              leaf no-l4-source-port {
                type empty;
                description
                  "Exclude l4 source port from the hash key";
              }
    
              leaf no-l4-destination-port {
                type empty;
                description
                  "Exclude l4 dest port from the hash key";
              }
    
              leaf no-protocol {
                type empty;
                description
                  "Exclude protocol from the hash key";
              }
    
              leaf no-ipv4-source-address {
                type empty;
                description
                  "Exclude IPv4 source address";
              }
    
              leaf no-ipv4-destination-address {
                type empty;
                description
                  "Exclude IPv4 destination address";
              }
    
              leaf vlan-id {
                type empty;
                description
                  "Include incoming vlan-id in hash key";
              }
            }  // container inet
    
            container inet6 {
              description
                "Configure inet6 fields";
              uses apply-advanced;
    
              leaf no-incoming-port {
                type empty;
                description
                  "Exclude incoming port from the hash key";
              }
    
              leaf no-incoming-device {
                type empty;
                description
                  "Exclude incoming device from the hash key";
              }
    
              leaf no-l4-source-port {
                type empty;
                description
                  "Exclude l4 source port from the hash key";
              }
    
              leaf no-l4-destination-port {
                type empty;
                description
                  "Exclude l4 dest port from the hash key";
              }
    
              leaf no-next-header {
                type empty;
                description
                  "Exclude next header from the hash key";
              }
    
              leaf no-ipv6-source-address {
                type empty;
                description
                  "Exclude IPv6 source address";
              }
    
              leaf no-ipv6-destination-address {
                type empty;
                description
                  "Exclude IPv6 destination address";
              }
    
              leaf vlan-id {
                type empty;
                description
                  "Include vlan-id in hash key";
              }
            }  // container inet6
    
            leaf no-mpls {
              type empty;
              description
                "Disable mpls in hash key";
            }
    
            container gre {
              description "Configure for GRE ";
              uses apply-advanced;
    
              leaf key {
                type empty;
                description
                  "Include key in hash key";
              }
    
              leaf protocol {
                type empty;
                description
                  "Include protocol in hash key";
              }
            }  // container gre
    
            container services-loadbalancing {
              description
                "Select key to load balance across service PICs";
              uses apply-advanced;
    
              container family {
                description "Protocol family";
                container inet {
                  description
                    "IPv4 protocol family";
                  uses apply-advanced;
    
                  container layer-3-services {
                    description
                      "Include Layer 3 (IP) data in the hash key";
                    uses apply-advanced;
    
                    leaf source-address {
                      type empty;
                      description
                        "Include IP source address in the hash key";
                    }
    
                    leaf destination-address {
                      type empty;
                      description
                        "Include IP destination address in the hash key";
                    }
    
                    leaf incoming-interface-index {
                      type empty;
                      description
                        "Include incoming interface index in the hash key";
                    }
                  }  // container layer-3-services
                }  // container inet
    
                container inet6 {
                  description
                    "IPv6 protocol family";
                  uses apply-advanced;
    
                  container layer-3-services {
                    description
                      "Include Layer 3 (IP) data in the hash key";
                    uses apply-advanced;
    
                    leaf source-address {
                      type empty;
                      description
                        "Include IP source address in the hash key";
                    }
    
                    leaf destination-address {
                      type empty;
                      description
                        "Include IP destination address in the hash key";
                    }
    
                    leaf incoming-interface-index {
                      type empty;
                      description
                        "Include incoming interface index in the hash key";
                    }
    
                    leaf src-prefix-len {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "56 .. 127";
                        }
                      }
                      units "bits";
                      default "127";
                      description
                        "Enhanced hash key inet6 source prefix length";
                    }
                  }  // container layer-3-services
                }  // container inet6
              }  // container family
            }  // container services-loadbalancing
    
            container family {
              description "Protocol family";
              container inet {
                description
                  "IPv4 protocol family";
                uses apply-advanced;
    
                leaf incoming-interface-index {
                  type empty;
                  description
                    "Include incoming interface index in the hash key";
                }
    
                leaf no-destination-port {
                  type empty;
                  description
                    "Omit IP destination port in the hash key";
                }
    
                leaf no-source-port {
                  type empty;
                  description
                    "Omit IP source port in the hash key";
                }
    
                leaf type-of-service {
                  type empty;
                  description
                    "Include TOS byte in the hash key";
                }
    
                leaf gtp-tunnel-endpoint-identifier {
                  type empty;
                  description
                    "Include TEID in the hash key for GTP-U packets";
                }
    
                leaf l2tp-tunnel-session-identifier {
                  type empty;
                  description
                    "Include TID SID in the hash key for L2TP packets";
                }
    
                leaf session-id {
                  type empty;
                  description
                    "Include session ID in the enhanced hash key";
                }
              }  // container inet
    
              container inet6 {
                description
                  "IPv6 protocol family";
                uses apply-advanced;
    
                leaf incoming-interface-index {
                  type empty;
                  description
                    "Include incoming interface index in the hash key";
                }
    
                leaf traffic-class {
                  type empty;
                  description
                    "Include Traffic Class byte in the hash key";
                }
    
                leaf no-destination-port {
                  type empty;
                  description
                    "Omit IP destination port in the hash key";
                }
    
                leaf no-source-port {
                  type empty;
                  description
                    "Omit IP source port in the hash key";
                }
    
                leaf gtp-tunnel-endpoint-identifier {
                  type empty;
                  description
                    "Include TEID in the hash key for GTP-U packets";
                }
    
                leaf session-id {
                  type empty;
                  description
                    "Include session ID in the enhanced hash key";
                }
    
                leaf no-flow-label {
                  type empty;
                  description
                    "Omit Flow label in the hash key";
                }
    
                leaf type-of-service {
                  type empty;
                  description
                    "Include TOS byte in the hash key";
                }
              }  // container inet6
    
              container mpls {
                description
                  "MPLS protocol family";
                uses apply-advanced;
    
                leaf label-1-exp {
                  type empty;
                  description
                    "Include EXP of first MPLS label from the hash key";
                }
    
                leaf incoming-interface-index {
                  type empty;
                  description
                    "Include incoming interface index in the hash key";
                }
    
                choice pseudowire_option {
                  leaf no-ether-pseudowire {
                    type empty;
                    description
                      "Omit IP payload over ethernet PW from the hash-key";
                  }
                  container ether-pseudowire {
                    description
                      "Load-balance IP over ethernet PW";
                    leaf zero-control-word {
                      type empty;
                      description
                        "Parse zero control word in packet header";
                    }
                  }  // container ether-pseudowire
                }  // choice pseudowire_option
    
                leaf no-payload {
                  type empty;
                  description
                    "Omit MPLS payload data from the hash key";
                }
              }  // container mpls
    
              container multiservice {
                description
                  "Multiservice protocol (bridged/CCC/VPLS) family";
                uses apply-advanced;
    
                leaf incoming-interface-index {
                  type empty;
                  description
                    "Include incoming interface index in hash key";
                }
    
                leaf outer-priority {
                  type empty;
                  description
                    "Include Outer 802.1 Priority bits in the hash key";
                }
    
                leaf no-payload {
                  type empty;
                  description
                    "Omit payload data from the hash key";
                }
    
                leaf no-mac-addresses {
                  type empty;
                  description
                    "Omit source and destination MAC addresses from the hash key";
                }
              }  // container multiservice
            }  // container family
    
            container hash-function {
              description
                "Configure hash functions";
              uses apply-advanced;
    
              choice instance {
                case case_1 {
                }  // case case_1
    
                case case_2 {
                }  // case case_2
    
                case case_3 {
                }  // case case_3
    
                case case_4 {
                }  // case case_4
    
                case case_5 {
                }  // case case_5
    
                case case_6 {
                }  // case case_6
    
                case case_7 {
                }  // case case_7
    
                case case_8 {
                }  // case case_8
                container xor {
                  presence "enable xor";
                  description
                    "XOR based hashing";
                  uses apply-advanced;
    
                  leaf no-L3-L4-headers {
                    type empty;
                    description
                      "Exclude source IP, dest IP, source L4 port, dest L4 port addresses from hashing";
                  }
    
                  leaf no-L4-ports {
                    type empty;
                    description
                      "Exclude source L4 port and dest L4 port addresses from hashing";
                  }
    
                  leaf mac-addresses {
                    type empty;
                    description
                      "Include source and destination MAC addresses in IPv4/IPv6 packet hashing";
                  }
    
                  leaf no-mpls-hash {
                    type empty;
                    description
                      "Exclude MPLS information from hashing";
                  }
    
                  leaf no-ipv4-source-address {
                    type empty;
                    description
                      "Exclude source IPv4 address from hashing";
                  }
    
                  leaf no-ipv4-destination-address {
                    type empty;
                    description
                      "Exclude dest IPv4 address from hashing";
                  }
    
                  leaf no-ipv6-source-address {
                    type empty;
                    description
                      "Exclude source IPv6 address from hashing";
                  }
    
                  leaf no-ipv6-destination-address {
                    type empty;
                    description
                      "Exclude dest IPv6 address from hashing";
                  }
    
                  leaf no-ip6-flow-label {
                    type empty;
                    description
                      "Exclude IPv6 flow label from hashing";
                  }
    
                  leaf en-ip-over-mpls {
                    type empty;
                    description
                      "Enable parsing of IP in MPLS packets";
                  }
    
                  leaf no-mpls-label0 {
                    type empty;
                    description
                      "Exclude MPLS Label 0 from hashing";
                  }
    
                  leaf no-mpls-label1 {
                    type empty;
                    description
                      "Exclude MPLS Label 1 from hashing";
                  }
    
                  leaf no-source-mac-address {
                    type empty;
                    description
                      "Exclude source MAC address from hashing";
                  }
    
                  leaf no-destination-mac-address {
                    type empty;
                    description
                      "Exclude dest MAC address from hashing";
                  }
    
                  leaf no-l4-source-port {
                    type empty;
                    description
                      "Exclude l4 source port from the hash key";
                  }
    
                  leaf no-l4-destination-port {
                    type empty;
                    description
                      "Exclude l4 dest port from the hash key";
                  }
                }  // container xor
                leaf ingress-port {
                  type empty;
                  description
                    "Ingress port based hashing";
                }
                container crc6 {
                  presence "enable crc6";
                  description
                    "CRC6 based hashing";
                  uses apply-advanced;
    
                  leaf crc6-seed {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 63";
                      }
                    }
                    description
                      "CRC6 seed value";
                  }
    
                  leaf en-ip-over-mpls {
                    type empty;
                    description
                      "Enable parsing of IP in MPLS packets";
                  }
    
                  leaf no-source-mac-address {
                    type empty;
                    description
                      "Exclude source MAC address from hashing";
                  }
    
                  leaf no-destination-mac-address {
                    type empty;
                    description
                      "Exclude dest MAC address from hashing";
                  }
    
                  leaf no-mpls-label0 {
                    type empty;
                    description
                      "Exclude MPLS Label 0 from hashing";
                  }
    
                  leaf no-mpls-label1 {
                    type empty;
                    description
                      "Exclude MPLS Label 1 from hashing";
                  }
    
                  leaf no-l4-source-port {
                    type empty;
                    description
                      "Exclude l4 source port from the hash key";
                  }
    
                  leaf no-l4-destination-port {
                    type empty;
                    description
                      "Exclude l4 dest port from the hash key";
                  }
    
                  leaf no-ip-source-address {
                    type empty;
                    description
                      "Exclude source IPv4/IPv6 address from hashing";
                  }
    
                  leaf no-ip-destination-address {
                    type empty;
                    description
                      "Exclude dest IPv4/IPv6 address from hashing";
                  }
    
                  leaf no-ip6-flow-label {
                    type empty;
                    description
                      "Exclude IPv6 flow label from hashing";
                  }
                }  // container crc6
                container crc16 {
                  presence "enable crc16";
                  description
                    "CRC16 based hashing";
                  uses apply-advanced;
    
                  leaf crc16-seed {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 65535";
                      }
                    }
                    description
                      "CRC16 seed value";
                  }
    
                  leaf en-ip-over-mpls {
                    type empty;
                    description
                      "Enable parsing of IP in MPLS packets";
                  }
    
                  leaf no-source-mac-address {
                    type empty;
                    description
                      "Exclude source MAC address from hashing";
                  }
    
                  leaf no-destination-mac-address {
                    type empty;
                    description
                      "Exclude dest MAC address from hashing";
                  }
    
                  leaf no-mpls-label0 {
                    type empty;
                    description
                      "Exclude MPLS Label 0 from hashing";
                  }
    
                  leaf no-mpls-label1 {
                    type empty;
                    description
                      "Exclude MPLS Label 1 from hashing";
                  }
    
                  leaf no-l4-source-port {
                    type empty;
                    description
                      "Exclude l4 source port from the hash key";
                  }
    
                  leaf no-l4-destination-port {
                    type empty;
                    description
                      "Exclude l4 dest port from the hash key";
                  }
    
                  leaf no-ip-source-address {
                    type empty;
                    description
                      "Exclude source IPv4/IPv6 address from hashing";
                  }
    
                  leaf no-ip-destination-address {
                    type empty;
                    description
                      "Exclude dest IPv4/IPv6 address from hashing";
                  }
    
                  leaf no-ip6-flow-label {
                    type empty;
                    description
                      "Exclude IPv6 flow label from hashing";
                  }
                }  // container crc16
              }  // choice instance
            }  // container hash-function
    
            container vxlan {
              description "Vxlan traffic";
              uses apply-advanced;
    
              leaf no-inner-payload {
                type empty;
                description
                  "To enable load-balancing on Vxlan traffic based on outer IP/UDP header";
              }
            }  // container vxlan
    
            list conditional-match {
              key "name";
              ordered-by user;
              description
                "Configures a conditional match";
              leaf name {
                type string;
                description "Name identifier";
              }
    
              uses apply-advanced;
    
              container offset1 {
                presence "enable offset1";
                description "Configure offset 1";
                uses apply-advanced;
    
                leaf base-offset1 {
                  type enumeration {
                    enum "start-of-L2Header" {
                      value 0;
                      description
                        "Offset will be extracted from start of L2 header";
                    }
                    enum
                      "start-of-L3-OuterHeader" {
                      value 1;
                      description
                        "Offset will be extracted from start of outer L3 header";
                    }
                    enum
                      "start-of-L3-InnerHeader" {
                      value 2;
                      description
                        "Offset will be extracted from start of inner L3 header";
                    }
                    enum "start-of-L4-Header" {
                      value 3;
                      description
                        "Offset will be extracted from start of L4 header";
                    }
                  }
                  description
                    "Configure base-offset";
                }
    
                leaf offset1-value {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "0 .. 126";
                    }
                  }
                  description
                    "Offset of the data to be extracted from the base offset. Only even number";
                }
    
                leaf matchdata1 {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description
                    "Data to be matched";
                }
    
                leaf matchdata1-mask {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description "Matchdata mask";
                }
              }  // container offset1
    
              container offset2 {
                presence "enable offset2";
                description "Configure offset 2";
                uses apply-advanced;
    
                leaf base-offset2 {
                  type enumeration {
                    enum "start-of-L2Header" {
                      value 0;
                      description
                        "Offset will be extracted from start of L2 header";
                    }
                    enum
                      "start-of-L3-OuterHeader" {
                      value 1;
                      description
                        "Offset will be extracted from start of outer L3 header";
                    }
                    enum
                      "start-of-L3-InnerHeader" {
                      value 2;
                      description
                        "Offset will be extracted from start of inner L3 header";
                    }
                    enum "start-of-L4-Header" {
                      value 3;
                      description
                        "Offset will be extracted from start of L4 header";
                    }
                  }
                  description
                    "Configure base-offset";
                }
    
                leaf offset2-value {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "0 .. 126";
                    }
                  }
                  description
                    "Offset of the data to be extracted from the base offset. Only even number";
                }
    
                leaf matchdata2 {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description
                    "Data to be matched";
                }
    
                leaf matchdata2-mask {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description "Matchdata mask";
                }
              }  // container offset2
    
              container offset3 {
                presence "enable offset3";
                description "Configure offset 3";
                uses apply-advanced;
    
                leaf base-offset3 {
                  type enumeration {
                    enum "start-of-L2Header" {
                      value 0;
                      description
                        "Offset will be extracted from start of L2 header";
                    }
                    enum
                      "start-of-L3-OuterHeader" {
                      value 1;
                      description
                        "Offset will be extracted from start of outer L3 header";
                    }
                    enum
                      "start-of-L3-InnerHeader" {
                      value 2;
                      description
                        "Offset will be extracted from start of inner L3 header";
                    }
                    enum "start-of-L4-Header" {
                      value 3;
                      description
                        "Offset will be extracted from start of L4 header";
                    }
                  }
                  description
                    "Configure base-offset";
                }
    
                leaf offset3-value {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "0 .. 126";
                    }
                  }
                  description
                    "Offset of the data to be extracted from the base offset. Only even number";
                }
    
                leaf matchdata3 {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description
                    "Data to be matched";
                }
    
                leaf matchdata3-mask {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description "Matchdata mask";
                }
              }  // container offset3
    
              container offset4 {
                presence "enable offset4";
                description "Configure offset 4";
                uses apply-advanced;
    
                leaf base-offset4 {
                  type enumeration {
                    enum "start-of-L2Header" {
                      value 0;
                      description
                        "Offset will be extracted from start of L2 header";
                    }
                    enum
                      "start-of-L3-OuterHeader" {
                      value 1;
                      description
                        "Offset will be extracted from start of outer L3 header";
                    }
                    enum
                      "start-of-L3-InnerHeader" {
                      value 2;
                      description
                        "Offset will be extracted from start of inner L3 header";
                    }
                    enum "start-of-L4-Header" {
                      value 3;
                      description
                        "Offset will be extracted from start of L4 header";
                    }
                  }
                  description
                    "Configure base-offset";
                }
    
                leaf offset4-value {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "0 .. 126";
                    }
                  }
                  description
                    "Offset of the data to be extracted from the base offset. Only even number";
                }
    
                leaf matchdata4 {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description
                    "Data to be matched";
                }
    
                leaf matchdata4-mask {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description "Matchdata mask";
                }
              }  // container offset4
            }  // list conditional-match
    
            list flex-hashing {
              key "name";
              ordered-by user;
              description "Set flex hashing";
              leaf name {
                type string;
                description "Name identifier";
              }
    
              uses apply-advanced;
    
              container ethtype {
                presence "enable ethtype";
                description
                  "Configure ether-type of packet";
                uses apply-advanced;
    
                container inet {
                  description
                    "Enable flex-hashing on ipv4";
                  uses apply-advanced;
    
                  leaf interface {
                    type union {
                      type jt:interface-name;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Incoming interface name. This is optional parameter";
                  }
    
                  leaf conditional-match {
                    type string;
                    description
                      "Conditional match to be matched in the packet";
                  }
    
                  container hash-offset {
                    description
                      "Configure the offsets for hashing";
                    uses apply-advanced;
    
                    container offset1 {
                      presence "enable offset1";
                      description
                        "Configure offset 1 value";
                      uses apply-advanced;
    
                      leaf base-offset1 {
                        type enumeration {
                          enum
                            "start-of-L2Header" {
                            value 0;
                            description
                              "Offset will be extracted from start of L2 header";
                          }
                          enum
                            "start-of-L3-OuterHeader" {
                            value 1;
                            description
                              "Offset will be extracted from start of outer L3 header";
                          }
                          enum
                            "start-of-L3-InnerHeader" {
                            value 2;
                            description
                              "Offset will be extracted from start of inner L3 header";
                          }
                          enum
                            "start-of-L4-Header" {
                            value 3;
                            description
                              "Offset will be extracted from start of L4 header";
                          }
                        }
                        description
                          "Configure base-offset";
                      }
    
                      leaf offset1-value {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint8 {
                            range "0 .. 126";
                          }
                        }
                        description
                          "Offset of the data to be extracted from the base offset. Only even number";
                      }
    
                      leaf offset1-mask {
                        type string {
                          junos:posix-pattern "^[[:xdigit:]]+$";
                          junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                          length "4";
                        }
                        description
                          "Mask for the hash data extracted. 2 byte mask";
                      }
    
                      container offset2 {
                        presence
                          "enable offset2";
                        description
                          "Configure offset 2 value";
                        uses apply-advanced;
    
                        leaf base-offset2 {
                          type enumeration {
                            enum
                              "start-of-L2Header" {
                              value 0;
                              description
                                "Offset will be extracted from start of L2 header";
                            }
                            enum
                              "start-of-L3-OuterHeader" {
                              value 1;
                              description
                                "Offset will be extracted from start of outer L3 header";
                            }
                            enum
                              "start-of-L3-InnerHeader" {
                              value 2;
                              description
                                "Offset will be extracted from start of inner L3 header";
                            }
                            enum
                              "start-of-L4-Header" {
                              value 3;
                              description
                                "Offset will be extracted from start of L4 header";
                            }
                          }
                          description
                            "Configure base-offset";
                        }
    
                        leaf offset2-value {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint8 {
                              range "0 .. 126";
                            }
                          }
                          description
                            "Offset of the data to be extracted from the base offset. Only even number";
                        }
    
                        leaf offset2-mask {
                          type string {
                            junos:posix-pattern "^[[:xdigit:]]+$";
                            junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                            length "4";
                          }
                          description
                            "Mask for the hash data extracted. 2 byte mask";
                        }
                      }  // container offset2
                    }  // container offset1
                  }  // container hash-offset
                }  // container inet
    
                container inet6 {
                  description
                    "Enable flex-hashing on ipv6";
                  uses apply-advanced;
    
                  leaf interface {
                    type union {
                      type jt:interface-name;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Incoming interface name. This is optional parameter";
                  }
    
                  leaf conditional-match {
                    type string;
                    description
                      "Conditional match to be matched in the packet";
                  }
    
                  container hash-offset {
                    description
                      "Configure the offsets for hashing";
                    uses apply-advanced;
    
                    container offset1 {
                      presence "enable offset1";
                      description
                        "Configure offset 1 value";
                      uses apply-advanced;
    
                      leaf base-offset1 {
                        type enumeration {
                          enum
                            "start-of-L2Header" {
                            value 0;
                            description
                              "Offset will be extracted from start of L2 header";
                          }
                          enum
                            "start-of-L3-OuterHeader" {
                            value 1;
                            description
                              "Offset will be extracted from start of outer L3 header";
                          }
                          enum
                            "start-of-L3-InnerHeader" {
                            value 2;
                            description
                              "Offset will be extracted from start of inner L3 header";
                          }
                          enum
                            "start-of-L4-Header" {
                            value 3;
                            description
                              "Offset will be extracted from start of L4 header";
                          }
                        }
                        description
                          "Configure base-offset";
                      }
    
                      leaf offset1-value {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint8 {
                            range "0 .. 126";
                          }
                        }
                        description
                          "Offset of the data to be extracted from the base offset. Only even number";
                      }
    
                      leaf offset1-mask {
                        type string {
                          junos:posix-pattern "^[[:xdigit:]]+$";
                          junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                          length "4";
                        }
                        description
                          "Mask for the hash data extracted. 2 byte mask";
                      }
    
                      container offset2 {
                        presence
                          "enable offset2";
                        description
                          "Configure offset 2 value";
                        uses apply-advanced;
    
                        leaf base-offset2 {
                          type enumeration {
                            enum
                              "start-of-L2Header" {
                              value 0;
                              description
                                "Offset will be extracted from start of L2 header";
                            }
                            enum
                              "start-of-L3-OuterHeader" {
                              value 1;
                              description
                                "Offset will be extracted from start of outer L3 header";
                            }
                            enum
                              "start-of-L3-InnerHeader" {
                              value 2;
                              description
                                "Offset will be extracted from start of inner L3 header";
                            }
                            enum
                              "start-of-L4-Header" {
                              value 3;
                              description
                                "Offset will be extracted from start of L4 header";
                            }
                          }
                          description
                            "Configure base-offset";
                        }
    
                        leaf offset2-value {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint8 {
                              range "0 .. 126";
                            }
                          }
                          description
                            "Offset of the data to be extracted from the base offset. Only even number";
                        }
    
                        leaf offset2-mask {
                          type string {
                            junos:posix-pattern "^[[:xdigit:]]+$";
                            junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                            length "4";
                          }
                          description
                            "Mask for the hash data extracted. 2 byte mask";
                        }
                      }  // container offset2
                    }  // container offset1
                  }  // container hash-offset
                }  // container inet6
    
                container mpls {
                  description
                    "Configure number of MPLS labels";
                  uses apply-advanced;
    
                  leaf num-labels {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint8 {
                        range "1 .. 5";
                      }
                    }
                    description
                      "Configure number of MPLS labels";
                  }
    
                  leaf interface {
                    type union {
                      type jt:interface-name;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Incoming interface name. This is optional parameter";
                  }
    
                  leaf conditional-match {
                    type string;
                    description
                      "Conditional match to be matched in the packet";
                  }
    
                  container hash-offset {
                    description
                      "Configure the offsets for hashing";
                    uses apply-advanced;
    
                    container offset1 {
                      presence "enable offset1";
                      description
                        "Configure offset 1 value";
                      uses apply-advanced;
    
                      leaf base-offset1 {
                        type enumeration {
                          enum
                            "start-of-L2Header" {
                            value 0;
                            description
                              "Offset will be extracted from start of L2 header";
                          }
                          enum
                            "start-of-L3-OuterHeader" {
                            value 1;
                            description
                              "Offset will be extracted from start of outer L3 header";
                          }
                          enum
                            "start-of-L3-InnerHeader" {
                            value 2;
                            description
                              "Offset will be extracted from start of inner L3 header";
                          }
                          enum
                            "start-of-L4-Header" {
                            value 3;
                            description
                              "Offset will be extracted from start of L4 header";
                          }
                        }
                        description
                          "Configure base-offset";
                      }
    
                      leaf offset1-value {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint8 {
                            range "0 .. 126";
                          }
                        }
                        description
                          "Offset of the data to be extracted from the base offset. Only even number";
                      }
    
                      leaf offset1-mask {
                        type string {
                          junos:posix-pattern "^[[:xdigit:]]+$";
                          junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                          length "4";
                        }
                        description
                          "Mask for the hash data extracted. 2 byte mask";
                      }
    
                      container offset2 {
                        presence
                          "enable offset2";
                        description
                          "Configure offset 2 value";
                        uses apply-advanced;
    
                        leaf base-offset2 {
                          type enumeration {
                            enum
                              "start-of-L2Header" {
                              value 0;
                              description
                                "Offset will be extracted from start of L2 header";
                            }
                            enum
                              "start-of-L3-OuterHeader" {
                              value 1;
                              description
                                "Offset will be extracted from start of outer L3 header";
                            }
                            enum
                              "start-of-L3-InnerHeader" {
                              value 2;
                              description
                                "Offset will be extracted from start of inner L3 header";
                            }
                            enum
                              "start-of-L4-Header" {
                              value 3;
                              description
                                "Offset will be extracted from start of L4 header";
                            }
                          }
                          description
                            "Configure base-offset";
                        }
    
                        leaf offset2-value {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint8 {
                              range "0 .. 126";
                            }
                          }
                          description
                            "Offset of the data to be extracted from the base offset. Only even number";
                        }
    
                        leaf offset2-mask {
                          type string {
                            junos:posix-pattern "^[[:xdigit:]]+$";
                            junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                            length "4";
                          }
                          description
                            "Mask for the hash data extracted. 2 byte mask";
                        }
                      }  // container offset2
                    }  // container offset1
                  }  // container hash-offset
                }  // container mpls
              }  // container ethtype
            }  // list flex-hashing
          }  // container enhanced-hash-key
    
          container next-hop {
            description "Next hop throttle";
            uses apply-advanced;
          }  // container next-hop
    
          container sflow {
            description "Sflow related";
            uses apply-advanced;
    
            container egress-multicast {
              description
                "Sflow for egress multicast";
              uses apply-advanced;
    
              leaf max-replication-rate {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 2000";
                  }
                }
                description
                  "To configure max replication rate (0 to 2K pps)";
              }
            }  // container egress-multicast
          }  // container sflow
    
          container multicast {
            description
              "Multicast resolve and mismatch rate";
            uses apply-advanced;
    
            leaf resolve-rate {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "100 .. 1000";
                }
              }
              units "per second";
              description
                "Multicast resolve rate";
            }
    
            leaf mismatch-rate {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "50 .. 1000";
                }
              }
              units "per second";
              description
                "Multicast interface mismatch rate";
            }
          }  // container multicast
    
          container packet-capture-telemetry {
            description
              "Packet capture telemetry options";
            uses apply-advanced;
    
            container egress {
              description "Egress options";
              uses packet-capture-egress-intf-type;
            }  // container egress
          }  // container packet-capture-telemetry
    
          container explicit-null-cos {
            presence "enable explicit-null-cos";
            description
              "Configure to use MPLS explicit null exp for COS classification";
            uses apply-advanced;
    
            leaf inet {
              type empty;
              description "Include family inet";
            }
    
            leaf inet6 {
              type empty;
              description "Include family inet6";
            }
          }  // container explicit-null-cos
    
          container helpers {
            description
              "Port forwarding configuration";
            uses apply-advanced;
    
            container traceoptions {
              description
                "Trace options for helper";
              uses apply-advanced;
    
              leaf no-remote-trace {
                junos:must "("system tracing")";
                junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
                type empty;
                description
                  "Disable remote tracing";
              }
    
              container file {
                description
                  "Trace file information";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "3";
                  description
                    "Maximum number of trace files";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
    
                leaf match {
                  type jt:regular-expression;
                  description
                    "Regular expression for lines to be logged";
                }
              }  // container file
    
              leaf level {
                type enumeration {
                  enum "error" {
                    value 0;
                    description
                      "Match error conditions";
                  }
                  enum "warning" {
                    value 1;
                    description
                      "Match warning messages";
                  }
                  enum "notice" {
                    value 2;
                    description
                      "Match conditions that should be handled specially";
                  }
                  enum "info" {
                    value 3;
                    description
                      "Match informational messages";
                  }
                  enum "verbose" {
                    value 4;
                    description
                      "Match verbose messages";
                  }
                  enum "all" {
                    value 5;
                    description
                      "Match all levels";
                  }
                }
                default "error";
                description
                  "Level of debugging output";
              }
    
              list flag {
                key "name";
                ordered-by user;
                description
                  "Area of UDP forwarding helper process on which to enable debugging output";
                leaf name {
                  type enumeration {
                    enum "trace" {
                      value 0;
                      description
                        "Trace tracing code";
                    }
                    enum "address" {
                      value 1;
                      description
                        "Trace address management code";
                    }
                    enum "main" {
                      value 2;
                      description
                        "Trace main loop code";
                    }
                    enum "config" {
                      value 3;
                      description
                        "Trace configuration code";
                    }
                    enum "ifdb" {
                      value 4;
                      description
                        "Trace interface database code";
                    }
                    enum "io" {
                      value 5;
                      description
                        "Trace I/O code";
                    }
                    enum "rtsock" {
                      value 6;
                      description
                        "Trace routing socket code";
                    }
                    enum "ui" {
                      value 7;
                      description
                        "Trace user interface code";
                    }
                    enum "util" {
                      value 8;
                      description
                        "Trace miscellaneous utility code";
                    }
                    enum "gencfg" {
                      value 9;
                      description
                        "Trace fud gencfg message";
                    }
                    enum "domain" {
                      value 10;
                      description
                        "Trace DNS service-specific code";
                    }
                    enum "tftp" {
                      value 11;
                      description
                        "Trace TFTP service-specific code";
                    }
                    enum "bootp" {
                      value 12;
                      description
                        "Trace BOOTP/DHCP service-specific code";
                    }
                    enum "port" {
                      value 13;
                      description
                        "Trace arbitrary protocol code";
                    }
                    enum "if-rtsdb" {
                      value 14;
                      description
                        "Trace interface hierarchy rtsdb";
                    }
                    enum "all" {
                      value 15;
                      description
                        "Trace all areas of code";
                    }
                  }
                }
              }  // list flag
            }  // container traceoptions
    
            container rtsdb-client-traceoptions {
              presence
                "enable rtsdb-client-traceoptions";
              status deprecated;
              description
                "SHM rtsock database client library trace options";
              uses apply-advanced;
    
              container if-rtsdb {
                presence "enable if-rtsdb";
                description
                  "Trace interface hierarchy rtsdb";
                uses apply-advanced;
    
                list flag {
                  key "name";
                  ordered-by user;
                  description
                    "Tracing parameters";
                  leaf name {
                    type enumeration {
                      enum "init" {
                        value 0;
                        description
                          "Trace initialization";
                      }
                      enum "routing-socket" {
                        value 1;
                        description
                          "Trace routing socket messages";
                      }
                      enum "map" {
                        value 2;
                        description
                          "Trace shared memory mapping";
                      }
                      enum "all" {
                        value 3;
                        description "Trace all";
                      }
                    }
                  }
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this trace flag";
                  }
                }  // list flag
              }  // container if-rtsdb
            }  // container rtsdb-client-traceoptions
    
            container domain {
              description
                "Incoming DNS request forwarding configuration";
              uses apply-advanced;
    
              leaf description {
                type string;
                description
                  "Text description of server";
              }
    
              container server {
                description "Server information";
                leaf address {
                  type jt:ipv4addr;
                  description
                    "Name or address of server to which to forward";
                }
    
                choice instance {
                  container logical-system {
                    description
                      "Logical system of server to which to forward";
                    leaf logical-system-name {
                      junos:must "("logical-systems $$")";
                      junos:must-message "referenced logical system must be defined";
                      type string {
                        junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                        junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                      }
                      description
                        "Name of logical system";
                    }
    
                    leaf routing-instance {
                      type union {
                        type string {
                          pattern "default";
                        }
                        type string {
                          junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                          junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                        }
                      }
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // container logical-system
                  leaf routing-instance {
                    junos:must "("routing-instances $$")";
                    junos:must-message "referenced routing instance must be defined";
                    type union {
                      type string {
                        pattern "default";
                      }
                      type string {
                        junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                        junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                      }
                    }
                    description
                      "Routing instance of server to which to forward";
                  }
                }  // choice instance
              }  // container server
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Incoming DNS request forwarding interface configuration";
                leaf name {
                  type union {
                    type jt:interface-wildcard;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Name of interface or group of interfaces";
                }
    
                uses apply-advanced;
    
                leaf no-listen {
                  type empty;
                  description
                    "Do not listen on this interface";
                }
    
                leaf broadcast {
                  type empty;
                  description
                    "If the layer 2 interface is unknown then broadcast";
                }
    
                leaf description {
                  type string;
                  description
                    "Text description of server";
                }
    
                container server {
                  description
                    "Server information";
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Name or address of server to which to forward";
                  }
    
                  choice instance {
                    container logical-system {
                      description
                        "Logical system of server to which to forward";
                      leaf logical-system-name {
                        junos:must "("logical-systems $$")";
                        junos:must-message "referenced logical system must be defined";
                        type string {
                          junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                          junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                        }
                        description
                          "Name of logical system";
                      }
    
                      leaf routing-instance {
                        type union {
                          type string {
                            pattern "default";
                          }
                          type string {
                            junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                            junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                          }
                        }
                        description
                          "Routing instance of server to which to forward";
                      }
                    }  // container logical-system
                    leaf routing-instance {
                      junos:must "("routing-instances $$")";
                      junos:must-message "referenced routing instance must be defined";
                      type union {
                        type string {
                          pattern "default";
                        }
                        type string {
                          junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                          junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                        }
                      }
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // choice instance
                }  // container server
              }  // list interface
            }  // container domain
    
            container tftp {
              description
                "Incoming TFTP request forwarding configuration";
              uses apply-advanced;
    
              leaf description {
                type string;
                description
                  "Text description of server";
              }
    
              container server {
                description "Server information";
                leaf address {
                  type jt:ipv4addr;
                  description
                    "Name or address of server to which to forward";
                }
    
                choice instance {
                  container logical-system {
                    description
                      "Logical system of server to which to forward";
                    leaf logical-system-name {
                      junos:must "("logical-systems $$")";
                      junos:must-message "referenced logical system must be defined";
                      type string {
                        junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                        junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                      }
                      description
                        "Name of logical system";
                    }
    
                    leaf routing-instance {
                      type union {
                        type string {
                          pattern "default";
                        }
                        type string {
                          junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                          junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                        }
                      }
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // container logical-system
                  leaf routing-instance {
                    junos:must "("routing-instances $$")";
                    junos:must-message "referenced routing instance must be defined";
                    type union {
                      type string {
                        pattern "default";
                      }
                      type string {
                        junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                        junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                      }
                    }
                    description
                      "Routing instance of server to which to forward";
                  }
                }  // choice instance
              }  // container server
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Incoming TFTP request forwarding interface configuration";
                leaf name {
                  type union {
                    type jt:interface-wildcard;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Name of interface or group of interfaces";
                }
    
                uses apply-advanced;
    
                leaf no-listen {
                  type empty;
                  description
                    "Do not listen on this interface";
                }
    
                leaf broadcast {
                  type empty;
                  description
                    "If the layer 2 interface is unknown then broadcast";
                }
    
                leaf description {
                  type string;
                  description
                    "Text description of server";
                }
    
                container server {
                  description
                    "Server information";
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Name or address of server to which to forward";
                  }
    
                  choice instance {
                    container logical-system {
                      description
                        "Logical system of server to which to forward";
                      leaf logical-system-name {
                        junos:must "("logical-systems $$")";
                        junos:must-message "referenced logical system must be defined";
                        type string {
                          junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                          junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                        }
                        description
                          "Name of logical system";
                      }
    
                      leaf routing-instance {
                        type union {
                          type string {
                            pattern "default";
                          }
                          type string {
                            junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                            junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                          }
                        }
                        description
                          "Routing instance of server to which to forward";
                      }
                    }  // container logical-system
                    leaf routing-instance {
                      junos:must "("routing-instances $$")";
                      junos:must-message "referenced routing instance must be defined";
                      type union {
                        type string {
                          pattern "default";
                        }
                        type string {
                          junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                          junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                        }
                      }
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // choice instance
                }  // container server
              }  // list interface
            }  // container tftp
    
            container bootp {
              junos:must "(!("system autoinstallation"))";
              junos:must-message "incompatible with 'system autoinstallation'";
              description
                "Incoming BOOTP/DHCP request forwarding configuration";
              uses apply-advanced;
    
              leaf relay-agent-option {
                type empty;
                description
                  "Use DHCP Relay Agent option in relayed BOOTP/DHCP messages";
              }
    
              container dhcp-option82 {
                junos:must "(!("forwarding-options helpers bootp relay-agent-option"))";
                junos:must-message "incompatible with relay-agent-option";
                presence "enable dhcp-option82";
                description
                  "Configure DHCP option 82";
                uses dhcp-option82-type;
              }  // container dhcp-option82
    
              leaf description {
                type string;
                description
                  "Text description of servers";
              }
    
              list server {
                key "name";
                ordered-by user;
                description "Server information";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Name or address of servers to which to forward";
                }
    
                uses apply-advanced;
    
                list logical-system {
                  key "name";
                  ordered-by user;
                  description
                    "Logical system of server to which to forward";
                  leaf name {
                    junos:must "("logical-systems $$")";
                    junos:must-message "referenced logical system must be defined";
                    type string {
                      junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                      junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                    }
                    description
                      "Name of logical system";
                  }
    
                  leaf-list routing-instance {
                    type string;
                    ordered-by user;
                    description
                      "Routing instance of server to which to forward";
                  }
                }  // list logical-system
    
                leaf-list routing-instance {
                  type string;
                  ordered-by user;
                  description
                    "Routing instance of server to which to forward";
                }
              }  // list server
    
              leaf maximum-hop-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16";
                  }
                }
                default "4";
                description
                  "Maximum number of hops per packet";
              }
    
              leaf minimum-wait-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 30000";
                  }
                }
                default "0";
                description
                  "Minimum number of seconds before requests are forwarded";
              }
    
              leaf client-response-ttl {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "IP time-to-live value to set in responses to client";
              }
    
              leaf source-address-giaddr {
                type empty;
                description
                  "Use GIADDR as the source IP address for relayed packets";
              }
    
              leaf apply-secondary-as-giaddr {
                type empty;
                description
                  "Enable DHCP relay to use secondary gateway ip on all interfaces";
              }
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Incoming BOOTP/DHCP request forwarding interface configuration";
                leaf name {
                  type union {
                    type jt:interface-wildcard;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Name of interface or group of interfaces";
                }
    
                uses apply-advanced;
    
                leaf no-listen {
                  type empty;
                  description
                    "Do not listen on this interface";
                }
    
                leaf broadcast {
                  type empty;
                  description
                    "If the layer 2 interface is unknown then broadcast";
                }
    
                leaf description {
                  type string;
                  description
                    "Text description of servers";
                }
    
                list server {
                  key "name";
                  ordered-by user;
                  description
                    "Server information";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "Name or address of servers to which to forward";
                  }
    
                  uses apply-advanced;
    
                  list logical-system {
                    key "name";
                    ordered-by user;
                    description
                      "Logical system of server to which to forward";
                    leaf name {
                      junos:must "("logical-systems $$")";
                      junos:must-message "referenced logical system must be defined";
                      type string {
                        junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                        junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                      }
                      description
                        "Name of logical system";
                    }
    
                    leaf-list routing-instance {
                      type string;
                      ordered-by user;
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // list logical-system
    
                  leaf-list routing-instance {
                    type string;
                    ordered-by user;
                    description
                      "Routing instance of server to which to forward";
                  }
                }  // list server
    
                leaf maximum-hop-count {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16";
                    }
                  }
                  default "4";
                  description
                    "Maximum number of hops per packet";
                }
    
                leaf minimum-wait-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 30000";
                    }
                  }
                  default "0";
                  description
                    "Minimum number of seconds before requests are forwarded";
                }
    
                leaf client-response-ttl {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "IP time-to-live value to set in responses to client";
                }
    
                leaf source-address-giaddr {
                  type empty;
                  description
                    "Use GIADDR as the source IP address for relayed packets";
                }
    
                container dhcp-option82 {
                  presence
                    "enable dhcp-option82";
                  description
                    "Configure DHCP option 82";
                  uses dhcp-option82-type;
                }  // container dhcp-option82
    
                leaf apply-secondary-as-giaddr {
                  type empty;
                  description
                    "Enable DHCP relay to use secondary gateway ip on this interface";
                }
              }  // list interface
            }  // container bootp
    
            list port {
              key "name";
              ordered-by user;
              description
                "Incoming arbitrary protocol request forwarding configuration";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Port number of the protocol to listen";
              }
    
              uses apply-advanced;
    
              leaf description {
                type string;
                description
                  "Text description of server";
              }
    
              list server {
                key "name";
                ordered-by user;
                description "Server information";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Name or address of server to which to forward";
                }
    
                uses apply-advanced;
    
                choice instance {
                  container logical-system {
                    description
                      "Logical system of server to which to forward";
                    leaf logical-system-name {
                      junos:must "("logical-systems $$")";
                      junos:must-message "referenced logical system must be defined";
                      type string {
                        junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                        junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                      }
                      description
                        "Name of logical system";
                    }
    
                    leaf routing-instance {
                      type union {
                        type string {
                          pattern "default";
                        }
                        type string {
                          junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                          junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                        }
                      }
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // container logical-system
                  leaf routing-instance {
                    junos:must "("routing-instances $$")";
                    junos:must-message "referenced routing instance must be defined";
                    type union {
                      type string {
                        pattern "default";
                      }
                      type string {
                        junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                        junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                      }
                    }
                    description
                      "Routing instance of server to which to forward";
                  }
                }  // choice instance
              }  // list server
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Incoming request forwarding interface configuration";
                leaf name {
                  type union {
                    type jt:interface-wildcard;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Name of interface or group of interfaces";
                }
    
                uses apply-advanced;
    
                leaf no-listen {
                  type empty;
                  description
                    "Do not listen on this interface";
                }
    
                leaf broadcast {
                  type empty;
                  description
                    "If the layer 2 interface is unknown then broadcast";
                }
    
                leaf description {
                  type string;
                  description
                    "Text description of server";
                }
    
                list server {
                  key "name";
                  ordered-by user;
                  description
                    "Server information";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "Name or address of server to which to forward";
                  }
    
                  uses apply-advanced;
    
                  choice instance {
                    container logical-system {
                      description
                        "Logical system of server to which to forward";
                      leaf logical-system-name {
                        junos:must "("logical-systems $$")";
                        junos:must-message "referenced logical system must be defined";
                        type string {
                          junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                          junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                        }
                        description
                          "Name of logical system";
                      }
    
                      leaf routing-instance {
                        type union {
                          type string {
                            pattern "default";
                          }
                          type string {
                            junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                            junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                          }
                        }
                        description
                          "Routing instance of server to which to forward";
                      }
                    }  // container logical-system
                    leaf routing-instance {
                      junos:must "("routing-instances $$")";
                      junos:must-message "referenced routing instance must be defined";
                      type union {
                        type string {
                          pattern "default";
                        }
                        type string {
                          junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                          junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                        }
                      }
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // choice instance
                }  // list server
              }  // list interface
            }  // list port
          }  // container helpers
    
          container family {
            description "Protocol family";
            container inet {
              description "IPv4 parameters";
              uses apply-advanced;
    
              container filter {
                description
                  "Filtering for forwarding table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for forwarded packets";
                }
    
                leaf output {
                  type string;
                  description
                    "Name of output filter to apply for forwarded packets";
                }
              }  // container filter
            }  // container inet
    
            container inet6 {
              description "IPv6 parameters";
              uses apply-advanced;
    
              container filter {
                description
                  "Filtering for forwarding table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for forwarded packets";
                }
    
                leaf output {
                  type string;
                  description
                    "Name of output filter to apply for forwarded packets";
                }
              }  // container filter
    
              leaf route-accounting {
                type empty;
                description
                  "Enable IPv6 route accounting";
              }
    
              leaf source-checking {
                type empty;
                description
                  "Discard IPv6 packet when source address type is unspecified, loopback, multicast or link-local ";
              }
            }  // container inet6
    
            container mpls {
              description "MPLS parameters";
              uses apply-advanced;
    
              container filter {
                description
                  "Filtering for forwarding table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for forwarded packets";
                }
    
                leaf output {
                  type string;
                  description
                    "Name of output filter to apply for forwarded packets";
                }
              }  // container filter
            }  // container mpls
    
            container vpls {
              description "VPLS parameters";
              uses apply-advanced;
    
              container filter {
                description
                  "Filtering for VPLS DMAC forwarding table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for forwarded packets";
                }
              }  // container filter
    
              container flood {
                description
                  "Filtering for VPLS flood table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for VPLS flood packets";
                }
              }  // container flood
            }  // container vpls
    
            container evpn {
              description "EVPN parameters";
              uses apply-advanced;
    
              container filter {
                description
                  "Filtering for EVPN DMAC forwarding table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for forwarded packets";
                }
              }  // container filter
    
              container flood {
                description
                  "Filtering for EVPN flood table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for EVPN flood packets";
                }
              }  // container flood
            }  // container evpn
          }  // container family
    
          list next-hop-group {
            key "name";
            description
              "Next hop group forwarding option";
            uses juniper-next-hop-group-options;
          }  // list next-hop-group
    
          container dhcp-relay {
            junos:must "(!("system services dhcp"))";
            junos:must-message "Incompatible with 'set system services dhcp'";
            junos:must "(!(".. .. instance-type virtual-switch"))";
            junos:must-message "forwarding-options dhcp-relay incompatible with routing-instances instance-type virtual-switch'";
            description
              "Dynamic Host Configuration Protocol relay configuration";
            uses jdhcp-relay-type;
          }  // container dhcp-relay
    
          choice load-balance-label-capability-choice {
            leaf load-balance-label-capability {
              type empty;
              description
                "Load balance label capability";
            }
            leaf no-load-balance-label-capability {
              type empty;
              description
                "Don't load balance label capability";
            }
          }  // choice load-balance-label-capability-choice
    
          list ip-options-protocol-queue {
            key "name";
            ordered-by user;
            description
              "IP Options protocol logical queue parameters";
            leaf name {
              type string;
              description "Protocol name";
            }
    
            uses apply-advanced;
    
            leaf protocol-id {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 254";
                }
              }
              description "Protocol Identifier";
            }
    
            leaf queue-depth {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 807";
                }
              }
              description
                "Size of the protocol logical options queue";
            }
          }  // list ip-options-protocol-queue
    
          container access-security {
            description
              "Access security configuration";
            uses jdhcp-access-security-type;
          }  // container access-security
    
          container vxlan-routing {
            description
              "VXLAN Routing forwarding options";
            uses apply-advanced;
    
            leaf next-hop {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Next-hop. Must be multiple of 4096. This will restart PFE";
            }
    
            leaf interface-num {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Interface. Must be multiple of 2048. This will restart PFE";
            }
    
            leaf overlay-ecmp {
              type empty;
              description
                "Enable overlay ecmp for vxlan L3. This will restart PFE";
            }
    
            leaf loopback-port {
              junos:must "(all "interfaces $$ unit <*> family ethernet-switching interface-mode trunk")";
              junos:must-message "Interface-mode trunk needs to be enabled for loopback AE";
              junos:must "("chassis aggregated-devices ethernet device-count")";
              junos:must-message "Ethernet device-count needs to be configured for loopback AE";
              junos:must "("interfaces $$ aggregated-ether-options loopback")";
              junos:must-message "Loopback needs to be enabled on the AE interface";
              type string;
              description
                "AE loopback interface used for VXLAN routing. This will restart PFE";
            }
          }  // container vxlan-routing
        }  // grouping juniper-forwarding-options
    
        grouping dhcp-option82-type {
          uses apply-advanced;
    
          leaf disable {
            type empty;
            description
              "Disable DHCP option 82 on this VLAN";
          }
    
          container circuit-id {
            presence "enable circuit-id";
            description
              "Configure DHCP option 82 circuit id";
            uses apply-advanced;
    
            leaf prefix {
              type enumeration {
                enum "hostname" {
                  value 0;
                  description
                    "Set hostname as the prefix";
                }
              }
              description
                "Configure DHCP option 82 circuit id prefix";
            }
    
            leaf use-interface-description {
              type empty;
              description
                "Use interface description instead of name";
            }
    
            leaf use-vlan-id {
              type empty;
              description
                "Use VLAN id instead of name";
            }
          }  // container circuit-id
    
          container remote-id {
            presence "enable remote-id";
            description
              "Configure DHCP option 82 remote id";
            uses apply-advanced;
    
            leaf prefix {
              type enumeration {
                enum "none" {
                  value 0;
                  description "Set no prefix";
                }
                enum "hostname" {
                  value 1;
                  description
                    "Set hostname as the prefix";
                }
                enum "mac" {
                  value 2;
                  description
                    "Set chassis MAC as the prefix";
                }
              }
              description
                "Configure DHCP option 82 remote id prefix";
            }
    
            leaf use-interface-description {
              type empty;
              description
                "Use interface description instead of name";
            }
    
            leaf use-string {
              junos:must "(!(".. use-interface-description"))";
              junos:must-message "use-string and use-interface-description cannot be configured together";
              type string;
              description
                "Use raw string instead of the default remote id";
            }
          }  // container remote-id
    
          container vendor-id {
            presence "enable vendor-id";
            description
              "Configure DHCP option 82 vendor id";
            uses apply-advanced;
    
            leaf use-string {
              type string;
              description
                "Use raw string instead of the default vendor id";
            }
          }  // container vendor-id
        }  // grouping dhcp-option82-type
    
        grouping jdhcp-access-security-type {
          description
            "Access security configuration";
          uses apply-advanced;
    
          container router-advertisement-guard {
            presence
              "enable router-advertisement-guard";
            description
              "Router Advertisement Guard Configuration";
            uses apply-advanced;
    
            list policy {
              key "name";
              ordered-by user;
              description
                "Router Advertisement Guard policy";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description
                  "Router Advertisement Guard policy name";
              }
    
              uses apply-advanced;
    
              container discard {
                description "Discard parameters";
                uses apply-advanced;
    
                leaf source-ip-address-list {
                  type string;
                  description
                    "IPv6 Source address list name";
                }
    
                leaf source-mac-address-list {
                  type string;
                  description
                    "Source mac address list name";
                }
    
                leaf prefix-list-name {
                  type string;
                  description "Prefix-list Name";
                }
              }  // container discard
    
              container accept {
                description "Accept parameters";
                uses apply-advanced;
    
                container match-list {
                  description
                    "List of parameters to check";
                  uses apply-advanced;
    
                  leaf source-ip-address-list {
                    type string;
                    description
                      "IPv6 Source address list name";
                  }
    
                  leaf source-mac-address-list {
                    type string;
                    description
                      "Source mac address list name";
                  }
    
                  leaf prefix-list-name {
                    type string;
                    description
                      "Prefix-list Name";
                  }
    
                  leaf match-criteria {
                    type enumeration {
                      enum "match-all" {
                        value 0;
                        description
                          "A match from every list";
                      }
                      enum "match-any" {
                        value 1;
                        description
                          "A match from any list";
                      }
                    }
                    description "Match Criteria";
                  }
                }  // container match-list
    
                container match-options {
                  presence
                    "enable match-options";
                  description
                    "List of Options to check";
                  uses apply-advanced;
    
                  container hop-limit {
                    description "Hop limit";
                    uses apply-advanced;
    
                    leaf maximum {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255";
                        }
                      }
                      description
                        "Maximum hop limit";
                    }
    
                    leaf minimum {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255";
                        }
                      }
                      description
                        "Minimum hop limit";
                    }
                  }  // container hop-limit
    
                  container route-preference {
                    description
                      "Accept route preference";
                    uses apply-advanced;
    
                    leaf maximum {
                      type enumeration {
                        enum "low" {
                          value 0;
                          description
                            "Route preference low";
                        }
                        enum "medium" {
                          value 1;
                          description
                            "Route preference medium";
                        }
                        enum "high" {
                          value 2;
                          description
                            "Route preference high";
                        }
                      }
                      description
                        "Maximum route preference";
                    }
                  }  // container route-preference
    
                  leaf managed-config-flag {
                    type empty;
                    description
                      "Check Managed config flag";
                  }
    
                  leaf other-config-flag {
                    type empty;
                    description
                      "Check Other config flag";
                  }
                }  // container match-options
              }  // container accept
            }  // list policy
    
            container interface {
              description
                "RA Guard config on Interface";
              uses apply-advanced;
    
              list intf-config {
                key "name";
                description
                  "Interface Configuration";
                uses interface-policy;
              }  // list intf-config
            }  // container interface
    
            container vlans {
              description
                "RA Guard config on Vlan";
              uses apply-advanced;
    
              list vlan-config {
                key "name";
                description
                  "Virtual LAN Configuration";
                uses vlan-policy;
              }  // list vlan-config
            }  // container vlans
          }  // container router-advertisement-guard
        }  // grouping jdhcp-access-security-type
    
        grouping interface-policy {
          description "Interface Name";
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Interface Name";
          }
    
          uses apply-advanced;
    
          container policy {
            description "Attach policy";
            uses apply-advanced;
    
            leaf policy-name {
              type string;
              description
                "Router Advertisement Guard policy name";
            }
    
            choice policy-type {
              leaf stateful {
                type empty;
                description
                  "Stateful router advertisement guard";
              }
              leaf stateless {
                type empty;
                description
                  "Stateless router advertisement guard";
              }
            }  // choice policy-type
          }  // container policy
    
          container mark-interface {
            description "Mark interface";
            uses apply-advanced;
    
            choice mark-intf-type {
              leaf trusted {
                junos:must "(!(".. .. policy"))";
                junos:must-message "Trusted interfaces cannot have policy attached";
                type empty;
                description
                  "Mark interface trusted";
              }
              leaf block {
                junos:must "(!(".. .. policy"))";
                junos:must-message "Blocked interfaces cannot have policy attached";
                type empty;
                description
                  "Block router-advertisement";
              }
            }  // choice mark-intf-type
          }  // container mark-interface
        }  // grouping interface-policy
    
        grouping juniper-mld-snooping-options {
          uses apply-advanced;
    
          leaf use-p2mp-lsp {
            junos:must "(".. .. instance-type vpls")";
            junos:must-message "use-p2mp-lsp supported only on instance type vpls";
            type empty;
            description
              "P2MP will be used to forward traffic instead of PW";
          }
    
          container snoop-pseudowires {
            junos:must "(".. .. instance-type vpls")";
            junos:must-message "snoop-pseudowires supported only on instance type vpls";
            junos:must "(!(" .. use-p2mp-lsp"))";
            junos:must-message "snoop-pseudowires and use-p2mp-lsp cannot be configured together";
            presence "enable snoop-pseudowires";
            description
              "VPLS PE would send traffic selectively to PE's having interest";
            uses apply-advanced;
          }  // container snoop-pseudowires
        }  // grouping juniper-mld-snooping-options
    
        grouping juniper-multicast-snooping-options {
          uses apply-advanced;
    
          container options {
            description "Miscellaneous options";
            uses apply-advanced;
    
            container syslog {
              description
                "Set system logging level";
              uses apply-advanced;
    
              container level {
                description "Logging level";
                leaf emergency {
                  type empty;
                  description "Emergency level";
                }
    
                leaf alert {
                  type empty;
                  description "Alert level";
                }
    
                leaf critical {
                  type empty;
                  description "Critical level";
                }
    
                leaf error {
                  type empty;
                  description "Error level";
                }
    
                leaf warning {
                  type empty;
                  description "Warning level";
                }
    
                leaf notice {
                  type empty;
                  description "Notice level";
                }
    
                leaf info {
                  type empty;
                  description
                    "Informational level";
                }
    
                leaf debug {
                  type empty;
                  description "Debugging level";
                }
              }  // container level
    
              leaf upto {
                type enumeration {
                  enum "emergency" {
                    value 0;
                    description
                      "Emergency level";
                  }
                  enum "alert" {
                    value 1;
                    description "Alert level";
                  }
                  enum "critical" {
                    value 2;
                    description "Critical level";
                  }
                  enum "error" {
                    value 3;
                    description "Error level";
                  }
                  enum "warning" {
                    value 4;
                    description "Warning level";
                  }
                  enum "notice" {
                    value 5;
                    description "Notice level";
                  }
                  enum "info" {
                    value 6;
                    description
                      "Informational level";
                  }
                  enum "debug" {
                    value 7;
                    description
                      "Debugging level";
                  }
                }
                description
                  "Log up to a particular logging level";
              }
    
              leaf mark {
                type union {
                  type int32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "seconds";
                description
                  "Periodically mark the trace file";
              }
            }  // container syslog
          }  // container options
    
          container traceoptions {
            description
              "Multicast snooping trace options";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "parse" {
                    value 0;
                    description
                      "Trace configuration parsing";
                  }
                  enum "config-internal" {
                    value 1;
                    description
                      "Trace configuration internals";
                  }
                  enum "route" {
                    value 2;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 3;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 4;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 5;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 6;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 7;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 8;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 9;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          container forwarding-cache {
            description
              "Multicast forwarding cache";
            uses apply-advanced;
    
            container threshold {
              description "Threshold";
              uses apply-advanced;
    
              leaf suppress {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 200000";
                  }
                }
                description "Suppress threshold";
              }
    
              leaf reuse {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 200000";
                  }
                }
                description "Reuse threshold";
              }
            }  // container threshold
          }  // container forwarding-cache
    
          leaf-list flood-groups {
            type jt:ipaddr;
            ordered-by user;
            description
              "Groups for which the traffic will be flooded";
          }
    
          container graceful-restart {
            description
              "Configure graceful restart attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 300";
                }
              }
              units "seconds";
              default "180";
              description
                "Maximum time for graceful restart to finish";
            }
          }  // container graceful-restart
    
          container multichassis-lag-replicate-state {
            presence
              "enable multichassis-lag-replicate-state";
            description
              "Enable multichassis lag replication";
            uses apply-advanced;
    
            leaf suppress-report {
              type empty;
              description
                "Enable mclag report suppression";
            }
          }  // container multichassis-lag-replicate-state
    
          container oism {
            description
              "Optimized inter subnet multicast options";
            uses apply-advanced;
    
            leaf install-star-g-routes {
              type empty;
              description
                "Install (*,G) multicast routes in data plane";
            }
          }  // container oism
    
          leaf nexthop-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1000";
              }
            }
            units "milliseconds";
            description
              "Nexthop hold time in milliseconds";
          }
        }  // grouping juniper-multicast-snooping-options
    
        grouping juniper-next-hop-group-options {
          leaf name {
            type string;
            description "Next hop group name";
          }
    
          uses apply-advanced;
    
          leaf group-type {
            type enumeration {
              enum "inet" {
                value 0;
                description
                  "Group of family inet next-hops";
              }
              enum "layer-2" {
                value 1;
                description
                  "Layer-2 next-hop group";
              }
              enum "inet6" {
                value 2;
                description
                  "Group of family inet6 next-hops";
              }
            }
            default "inet";
            description "Next hop group type";
          }
    
          list interface {
            key "name";
            description
              "Interfaces through which to send sampled traffic";
            uses next_hop_group_intf_type;
          }  // list interface
    
          list next-hop-subgroup {
            key "name";
            description
              "Group of interfaces through which to send sampled traffic";
            uses juniper-next-hop-subgroup-options;
          }  // list next-hop-subgroup
        }  // grouping juniper-next-hop-group-options
    
        grouping juniper-next-hop-subgroup-options {
          leaf name {
            junos:must "(".. interface")";
            junos:must-message "At least two interfaces are required for next-hop-subgroup configuration";
            type string;
            description
              "Next-hop sub-group name";
          }
    
          uses apply-advanced;
    
          list interface {
            key "name";
            max-elements 16;
            description
              "Interface through which to send the sampled traffic";
            uses next_hop_subgroup_intf_type;
          }  // list interface
        }  // grouping juniper-next-hop-subgroup-options
    
        grouping juniper-packet-accounting-options {
          leaf name {
            type string;
            description
              "Name for accounting group";
          }
    
          uses apply-advanced;
    
          container output {
            description
              "Accounting data disposition";
            uses packet_accounting_output_type;
          }  // container output
        }  // grouping juniper-packet-accounting-options
    
        grouping juniper-port-mirror-options {
          uses apply-advanced;
    
          container traceoptions {
            description
              "Port-mirroring trace options";
            uses sampling_traceoptions_type;
          }  // container traceoptions
    
          leaf disable {
            type empty;
            description
              "Disable the global port-mirroring instance";
          }
    
          leaf disable-all-instances {
            type empty;
            description
              "Disable the all port-mirroring instances";
          }
    
          container input {
            description
              "Settings for sampling of input packets";
            uses pm_family_input_type;
          }  // container input
    
          container family {
            description
              "Address family of packets to mirror";
            container inet {
              description "Mirror IPv4 packets";
              uses apply-advanced;
    
              container input {
                junos:must "(!(".. .. .. input"))";
                junos:must-message "input parameters under family and outside family are mutually exclusive";
                status deprecated;
                description
                  "Settings for sampling of input packets";
                uses pm_family_input_type;
              }  // container input
    
              container output {
                description
                  "One or more next hops for port-mirrored packets";
                uses inet_pm_family_output_type;
              }  // container output
            }  // container inet
    
            container inet6 {
              description "Mirror IPv6 packets";
              uses apply-advanced;
    
              container input {
                junos:must "(!(".. .. .. input"))";
                junos:must-message "input parameters under family and outside family are mutually exclusive";
                status deprecated;
                description
                  "Settings for sampling of input packets";
                uses pm_family_input_type;
              }  // container input
    
              container output {
                description
                  "One or more next hops for port-mirrored packets";
                uses inet6_pm_family_output_type;
              }  // container output
            }  // container inet6
    
            container mpls {
              description "Mirror MPLS packets";
              uses apply-advanced;
    
              container input {
                junos:must "(!(".. .. .. input"))";
                junos:must-message "input parameters under family and outside family are mutually exclusive";
                status deprecated;
                description
                  "Settings for sampling of input packets";
                uses pm_family_input_type;
              }  // container input
    
              container output {
                description
                  "One or more next hops for port-mirrored packets";
                uses mpls_pm_family_output_type;
              }  // container output
            }  // container mpls
    
            container vpls {
              description
                "Mirror Layer-2 bridged/vpls packets";
              uses apply-advanced;
    
              container input {
                junos:must "(!(".. .. ..  input"))";
                junos:must-message "input parameters under family and outside family are mutually exclusive";
                status deprecated;
                description
                  "Settings for sampling of input packets";
                uses pm_family_input_type;
              }  // container input
    
              container output {
                description
                  "Destination for port-mirrored packets";
                uses layer2_pm_family_output_type;
              }  // container output
            }  // container vpls
    
            container ethernet-switching {
              description
                "Mirror Layer-2 ethernet-switched packets";
              uses apply-advanced;
    
              container output {
                description
                  "Destination for port-mirrored packets";
                uses layer2_pm_family_output_type;
              }  // container output
            }  // container ethernet-switching
    
            container ccc {
              description
                "Mirror layer-2 ccc packets";
              uses apply-advanced;
    
              container input {
                junos:must "(!(".. .. ..  input"))";
                junos:must-message "input parameters under family and outside family are mutually exclusive";
                status deprecated;
                description
                  "Settings for sampling of input packets";
                uses pm_family_input_type;
              }  // container input
    
              container output {
                description
                  "Destination for port-mirrored packets";
                uses layer2_pm_family_output_type;
              }  // container output
            }  // container ccc
          }  // container family
    
          list instance {
            key "name";
            ordered-by user;
            description
              "Instance of port-mirroring parameters";
            leaf name {
              type string {
                junos:posix-pattern "!^((__.*)|(.{65,}))$";
                junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                length "1 .. 63";
              }
              description
                "Name for port-mirroring instance";
            }
    
            uses apply-advanced;
    
            leaf disable {
              type empty;
              description
                "Disable the this port-mirroring instance";
            }
    
            choice input_params_or_instance {
              container input {
                description
                  "Settings for sampling of input packets";
                uses pm_family_input_type;
              }  // container input
              leaf input-parameters-instance {
                junos:must "("forwarding-options port-mirroring instance $$")";
                junos:must-message "Referenced port-mirroring instance does not exist";
                type string;
                description
                  "Name of port-mirroring instance to use for input parameters";
              }
            }  // choice input_params_or_instance
    
            container output {
              description
                "One or more next hops for port-mirrored packets";
              uses inet_pm_output_type;
            }  // container output
    
            container family {
              description
                "Address family of packets to mirror";
              container inet {
                description
                  "Mirror IPv4 packets";
                uses apply-advanced;
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "input parameters under family and outside family are mutually exclusive";
                  status deprecated;
                  description
                    "Settings for sampling of input packets";
                  uses pm_family_input_type;
                }  // container input
    
                container output {
                  description
                    "One or more next hops for port-mirrored packets";
                  uses inet_pm_family_output_type;
                }  // container output
              }  // container inet
    
              container inet6 {
                description
                  "Mirror IPv6 packets";
                uses apply-advanced;
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "input parameters under family and outside family are mutually exclusive";
                  status deprecated;
                  description
                    "Settings for sampling of input packets";
                  uses pm_family_input_type;
                }  // container input
    
                container output {
                  description
                    "One or more next hops for port-mirrored packets";
                  uses inet6_pm_family_output_type;
                }  // container output
              }  // container inet6
    
              container mpls {
                description
                  "Mirror MPLS packets";
                uses apply-advanced;
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "input parameters under family and outside family are mutually exclusive";
                  status deprecated;
                  description
                    "Settings for sampling of input packets";
                  uses pm_family_input_type;
                }  // container input
    
                container output {
                  description
                    "One or more next hops for port-mirrored packets";
                  uses mpls_pm_family_output_type;
                }  // container output
              }  // container mpls
    
              container vpls {
                description
                  "Mirror Layer-2 bridged/vpls packets";
                uses apply-advanced;
    
                container input {
                  junos:must "(!(".. .. ..  input"))";
                  junos:must-message "input parameters under family and outside family are mutually exclusive";
                  status deprecated;
                  description
                    "Settings for sampling of input packets";
                  uses pm_family_input_type;
                }  // container input
    
                container output {
                  description
                    "Destination for port-mirrored packets";
                  uses layer2_pm_family_output_type;
                }  // container output
              }  // container vpls
    
              container ethernet-switching {
                description
                  "Mirror Layer-2 ethernet-switched packets";
                uses apply-advanced;
    
                container output {
                  description
                    "Destination for port-mirrored packets";
                  uses layer2_pm_family_output_type;
                }  // container output
              }  // container ethernet-switching
    
              container ccc {
                description
                  "Mirror layer-2 ccc packets";
                uses apply-advanced;
    
                container input {
                  junos:must "(!(".. .. ..  input"))";
                  junos:must-message "input parameters under family and outside family are mutually exclusive";
                  status deprecated;
                  description
                    "Settings for sampling of input packets";
                  uses pm_family_input_type;
                }  // container input
    
                container output {
                  description
                    "Destination for port-mirrored packets";
                  uses layer2_pm_family_output_type;
                }  // container output
              }  // container ccc
            }  // container family
          }  // list instance
        }  // grouping juniper-port-mirror-options
    
        grouping inet6_pm_family_output_type {
          uses apply-advanced;
    
          choice interface-or-next-hop-index {
            list interface {
              key "name";
              description
                "Interfaces through which to send sampled traffic";
              uses inet6_pm_intf_type;
            }  // list interface
    
            case case_2 {
            }  // case case_2
          }  // choice interface-or-next-hop-index
    
          leaf no-filter-check {
            type empty;
            description
              "Do not check for filters on port-mirroring interface";
          }
    
          leaf ipv6-address {
            type jt:ipv6addr;
            description
              "ERSPAN Destination IPv6 Address";
          }
        }  // grouping inet6_pm_family_output_type
    
        grouping inet6_pm_intf_type {
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface through which to send sampled traffic";
          }
    
          uses apply-advanced;
    
          list next-hop {
            key "name";
            ordered-by user;
            description
              "Address of next hop through which to send sampled traffic";
            uses inet6_next_hop_type;
          }  // list next-hop
        }  // grouping inet6_pm_intf_type
    
        grouping inet6_next_hop_type {
          description
            "Address of next hop through which to send sampled traffic";
          leaf name {
            type jt:ipv6addr;
          }
    
          uses apply-advanced;
        }  // grouping inet6_next_hop_type
    
        grouping inet_pm_family_output_type {
          uses apply-advanced;
    
          choice interface-or-next-hop-index {
            list interface {
              key "name";
              description
                "Interfaces through which to send sampled traffic";
              uses inet_pm_intf_type;
            }  // list interface
    
            case case_2 {
            }  // case case_2
          }  // choice interface-or-next-hop-index
    
          leaf no-filter-check {
            type empty;
            description
              "Do not check for filters on port-mirroring interface";
          }
    
          leaf ip-address {
            type jt:ipv4addr;
            description
              "ERSPAN Destination IP Address";
          }
    
          list routing-instance {
            key "name";
            max-elements 1;
            description "Routing instances";
            uses inet_pm_output-routing-instance-type;
          }  // list routing-instance
        }  // grouping inet_pm_family_output_type
    
        grouping inet_pm_intf_type {
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface through which to send sampled traffic";
          }
    
          uses apply-advanced;
    
          list next-hop {
            key "name";
            ordered-by user;
            description
              "Address of next hop through which to send sampled traffic";
            uses inet_next_hop_type;
          }  // list next-hop
        }  // grouping inet_pm_intf_type
    
        grouping inet_next_hop_type {
          description
            "Address of next hop through which to send sampled traffic";
          leaf name {
            type jt:ipv4addr;
          }
    
          uses apply-advanced;
        }  // grouping inet_next_hop_type
    
        grouping inet_pm_output-routing-instance-type {
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description "Routing instance name";
          }
    
          uses apply-advanced;
    
          leaf ip-address {
            type jt:ipv4addr;
            description
              "ERSPAN Destination IP Address";
          }
        }  // grouping inet_pm_output-routing-instance-type
    
        grouping inet_pm_output_type {
          uses apply-advanced;
        }  // grouping inet_pm_output_type
    
        grouping juniper-protocols-amt {
          uses apply-advanced;
    
          container traceoptions {
            description "Trace options for AMT";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all AMT packets";
                  }
                  enum "errors" {
                    value 1;
                    description
                      "Trace all error messages";
                  }
                  enum "tunnels" {
                    value 2;
                    description
                      "Trace all AMT tunnel messages";
                  }
                  enum "route" {
                    value 3;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 4;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 5;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 6;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 7;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 8;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 9;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 10;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          container relay {
            presence "enable relay";
            description "AMT relay";
            uses juniper-protocols-amt-relay;
          }  // container relay
        }  // grouping juniper-protocols-amt
    
        grouping juniper-protocols-amt-relay {
          uses apply-advanced;
    
          container family {
            presence "enable family";
            description "Protocol family";
            uses apply-advanced;
    
            container inet {
              presence "enable inet";
              uses apply-advanced;
    
              leaf anycast-prefix {
                type jt:ipv4prefix;
                description
                  "IPv4 anycast prefix";
              }
    
              leaf local-address {
                type jt:ipv4addr;
                description "IPv4 local address";
              }
            }  // container inet
          }  // container family
    
          leaf secret-key-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "5 .. 1440";
              }
            }
            units "minutes";
            description
              "Time interval for the secret key to expire";
          }
    
          leaf tunnel-limit {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Number of AMT tunnels";
          }
    
          leaf unicast-stream-limit {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Maximum number of AMT unicast streams(s,g,intf)";
          }
    
          leaf accounting {
            type empty;
            description "Enable AMT accounting";
          }
    
          leaf-list tunnel-devices {
            type union {
              type jt:interface-device;
              type string {
                pattern "<.*>|$.*";
              }
            }
            ordered-by user;
            description
              "Tunnel devices to be used for creating ud interfaces";
          }
        }  // grouping juniper-protocols-amt-relay
    
        grouping juniper-protocols-bd {
          description "Bridging configuration";
          uses apply-advanced;
    
          container mac-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC address forwarding table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container mac-table-size
    
          container mac-ip-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-ip-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC+IP bindings table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings";
            }
          }  // container mac-ip-table-size
    
          container interface-mac-limit {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC address learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses per interface";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
                enum "log" {
                  value 2;
                  description
                    "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                }
                enum "shutdown" {
                  value 3;
                  description
                    "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                }
                enum "drop-and-log" {
                  value 4;
                  description
                    "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container interface-mac-limit
    
          container interface-mac-ip-limit {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-ip-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC+IP bindings learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings per interface";
            }
          }  // container interface-mac-ip-limit
    
          container mac-notification {
            presence "enable mac-notification";
            description
              "MAC notification options";
            uses apply-advanced;
    
            leaf notification-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 60";
                }
              }
              units "seconds";
              default "30";
              description
                "Interval for sending MAC notifications";
            }
          }  // container mac-notification
    
          leaf mac-table-aging-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            units "seconds";
            description
              "Delay for discarding MAC address if no updates are received";
          }
    
          leaf no-mac-learning {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "no-mac-learning needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Disable dynamic MAC address learning";
          }
    
          leaf no-normalization {
            type empty;
            description
              "Disable vlan id normalization for interfaces";
          }
    
          leaf mac-statistics {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-statistics needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Enable MAC address statistics";
          }
    
          container mib {
            presence "enable mib";
            description "Snmp mib options";
            uses apply-advanced;
    
            container dot1q-mib {
              presence "enable dot1q-mib";
              description
                "Dot1q MIB configuration options";
              uses apply-advanced;
    
              leaf port-list {
                type enumeration {
                  enum "bit-map" {
                    value 0;
                    description
                      "Port list is represented in bit-map format";
                  }
                  enum "string" {
                    value 1;
                    description
                      "Port list is represented in string format";
                  }
                }
                description
                  "Port list for staticegressports and staticuntaggedports MIB";
              }
            }  // container dot1q-mib
          }  // container mib
    
          container static-rvtep-mac {
            description
              "Configure Static MAC and remote VxLAN tunnel endpoint entries";
            uses apply-advanced;
    
            list mac {
              key "mac_addr remote-vtep";
              description "Unicast MAC address";
              leaf mac_addr {
                type jt:mac-unicast;
              }
    
              leaf remote-vtep {
                type jt:ipaddr;
                description
                  "Configure static remote VXLAN tunnel endpoints";
              }
            }  // list mac
          }  // container static-rvtep-mac
    
          list interface {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface needs to be specified under switch-options for a virtual-switch instance";
            key "name";
            ordered-by user;
            description
              "Interface that connect this site to the VPN";
            leaf name {
              junos:must "(((".. .. .. interface $$" || (".. .. .. .. .. interface $$" || "interfaces $$-IFL family ethernet-switching vlan")) || (!(".. .. .. .. .. .. .. routing-instances") && ("interfaces $$-IFL family bridge interface-mode" && !(any "routing-instances <*> interface $$")))))";
              junos:must-message "Interface must be part of this routing instance";
              junos:must "((".. .. .. interface $$" || (".. .. .. .. .. interface $$" || "interfaces $$-IFL family ethernet-switching")))";
              junos:must-message "Interface must be part of this routing instance";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container interface-mac-limit {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              description
                "Maximum number of MAC addresses learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC addresses per interface";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable interface for interface-mac-limit";
              }
    
              leaf packet-action {
                type enumeration {
                  enum "none" {
                    value 0;
                    description
                      "Forward the packet";
                  }
                  enum "drop" {
                    value 1;
                    description
                      "Drop packets and do not learn. Default is forward";
                  }
                  enum "log" {
                    value 2;
                    description
                      "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "shutdown" {
                    value 3;
                    description
                      "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "drop-and-log" {
                    value 4;
                    description
                      "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                  }
                }
                description
                  "Action when MAC limit is reached";
              }
            }  // container interface-mac-limit
    
            leaf action-priority {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 8";
                }
              }
              description
                "Blocking priority of this interface on mac move detection";
            }
    
            list static-mac {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              key "name";
              ordered-by user;
              description
                "Static MAC addresses assigned to this interface";
              leaf name {
                junos:must "((!(".. .. .. .. vlan-id all") || all ".. vlan-id <*>"))";
                junos:must-message " Specify vlan-id for qualified learning ";
                type jt:mac-addr;
                description "MAC address";
              }
    
              uses apply-advanced;
    
              list vlan-id {
                junos:must "(".. .. .. .. vlan-id all")";
                junos:must-message "'vlan-id all' has to be configured for the bridging domain";
                key "name";
                ordered-by user;
                description
                  "VLAN ID of learning VLAN";
                leaf name {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4094";
                    }
                  }
                  description "Learning VLAN";
                }
    
                uses apply-advanced;
              }  // list vlan-id
            }  // list static-mac
    
            container interface-mac-ip-limit {
              description
                "Maximum number of MAC+IP bindings learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC+IP bindings per interface";
              }
            }  // container interface-mac-ip-limit
    
            leaf no-mac-learning {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              type empty;
              description
                "Disable dynamic MAC address learning";
            }
    
            leaf mac-pinning {
              type empty;
              description "Enable MAC pinning";
            }
    
            leaf persistent-learning {
              junos:must "(!("switch-options mac-table-aging-time "))";
              junos:must-message "Persistent learning can not co-exist with mac-table-aging-time";
              type empty;
              description
                "Enable persistent MAC learning on this interface";
            }
          }  // list interface
        }  // grouping juniper-protocols-bd
    
        grouping juniper-protocols-bgp {
          uses apply-advanced;
    
          container path-selection {
            description
              "Configure path selection strategy";
            uses apply-advanced;
    
            leaf l2vpn-use-bgp-rules {
              type empty;
              description
                "Use standard BGP rules during L2VPN path selection";
            }
    
            leaf cisco-non-deterministic {
              type empty;
              description
                "Use Cisco IOS nondeterministic path selection algorithm";
            }
    
            leaf always-compare-med {
              type empty;
              description
                "Always compare MED values, regardless of neighbor AS";
            }
    
            container med-plus-igp {
              presence "enable med-plus-igp";
              description
                "Add IGP cost to next-hop to MED before comparing MED values";
              uses apply-advanced;
    
              leaf med-multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 1000";
                  }
                }
                default "1";
                description "Multiplier for MED";
              }
    
              leaf igp-multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 1000";
                  }
                }
                default "1";
                description
                  "Multiplier for IGP cost to next-hop";
              }
            }  // container med-plus-igp
    
            leaf external-router-id {
              type empty;
              description
                "Compare router ID on BGP externals";
            }
    
            leaf as-path-ignore {
              junos:must "(!(".. .. .. .. routing-options multipath as-path-compare"))";
              junos:must-message "Configuring 'as-path-ignore' is not allowed when 'as-path-compare' is enabled for this routing instance";
              type empty;
              description
                "Ignore AS path comparison during path selection";
            }
          }  // container path-selection
    
          container accept-prpd-connection {
            presence
              "enable accept-prpd-connection";
            description
              "Enable BGP to accept PRPD connections";
          }  // container accept-prpd-connection
    
          leaf advertise-from-main-vpn-tables {
            type empty;
            description
              "Advertise VPN routes from bgp.Xvpn.0 tables in master instance";
          }
    
          leaf stale-labels-holddown-period {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "1 .. 600";
              }
            }
            description
              "Duration (sec) MPLS labels allocated by BGP are kept after they go stale";
          }
    
          leaf holddown-all-stale-labels {
            type empty;
            description
              "Hold all BGP stale-labels, facilating make-before-break for new label advertisements";
          }
    
          container egress-te-backup-paths {
            description
              "Backup-path for Egress-TE peer interface failure";
            uses apply-advanced;
    
            list template {
              key "name";
              description "Backup-path template";
              leaf name {
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of 64 characters or less";
                }
                description
                  "Name of Egress-TE backup path";
              }
    
              uses apply-advanced;
    
              list peer {
                key "name";
                ordered-by user;
                description
                  "Egress peer TE backup exit path";
                leaf name {
                  type jt:ipaddr;
                  description
                    "Address of BGP peer to use as backup next-hop";
                }
    
                uses apply-advanced;
              }  // list peer
    
              container remote-nexthop {
                description
                  "Resolve and use tunnel to this next-hop as backup path";
                uses apply-advanced;
    
                leaf remote-nh-addr {
                  type jt:ipaddr;
                  description
                    "Address of remote-nexthop to use as backup path";
                }
              }  // container remote-nexthop
    
              container ip-forward {
                junos:must "(!(".. remote-nexthop"))";
                junos:must-message "'ip-forward' will not take effect as backup when 'remote-nexthop' is in use";
                presence "enable ip-forward";
                description
                  "Use IP-forward backup path for Egress TE";
                uses apply-advanced;
    
                leaf rti-name {
                  type string {
                    junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                    junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                  }
                  description
                    "Routing-instance to use as IP forward backup-path";
                }
              }  // container ip-forward
            }  // list template
          }  // container egress-te-backup-paths
    
          leaf sr-preference-override {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Replace received segment routing traffic engineering preference value with override value";
          }
    
          leaf vpn-apply-export {
            type empty;
            description
              "Apply BGP export policy when exporting VPN routes";
          }
    
          container family {
            description
              "Protocol family for NLRIs in updates";
            uses apply-advanced;
    
            container inet {
              description "IPv4 NLRI parameters";
              uses apply-advanced;
    
              container labeled-unicast {
                presence
                  "enable labeled-unicast";
                description
                  "Include labeled unicast NLRI";
                uses bgp-afi-labeled;
              }  // container labeled-unicast
    
              container segment-routing-te {
                presence
                  "enable segment-routing-te";
                description
                  "Include segment-routing TE policy";
                uses bgp-afi-srte;
              }  // container segment-routing-te
    
              container transport {
                presence "enable transport";
                description
                  "Include Classful Transport NLRI";
                uses bgp-afi-inet-transport;
              }  // container transport
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-topo;
              }  // container unicast
    
              container multicast {
                presence "enable multicast";
                description
                  "Include multicast NLRI";
                uses bgp-afi-default;
              }  // container multicast
    
              container flow {
                presence "enable flow";
                description "Include flow NLRI";
                uses bgp-afi-flow-with-redirect-ip-action;
              }  // container flow
    
              container any {
                presence "enable any";
                description
                  "Include unicast or multicast NLRI";
                uses bgp-afi-default;
              }  // container any
            }  // container inet
    
            container inet-vpn {
              description
                "IPv4 Layer 3 VPN NLRI parameters";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-l3vpn;
              }  // container unicast
    
              container multicast {
                presence "enable multicast";
                description
                  "Include multicast NLRI";
                uses bgp-afi-vpn;
              }  // container multicast
    
              container flow {
                presence "enable flow";
                description
                  "Include flow VPN NLRI";
                uses bgp-afi-flow-with-redirect-ip-action;
              }  // container flow
    
              container any {
                presence "enable any";
                description
                  "Include unicast or multicast NLRI";
                uses bgp-afi-vpn;
              }  // container any
            }  // container inet-vpn
    
            container inet6 {
              description "IPv6 NLRI parameters";
              uses apply-advanced;
    
              container labeled-unicast {
                presence
                  "enable labeled-unicast";
                description
                  "Include labeled unicast NLRI";
                uses bgp-afi-inet6-labeled;
              }  // container labeled-unicast
    
              container segment-routing-te {
                presence
                  "enable segment-routing-te";
                description
                  "Include segment-routing TE policy";
                uses bgp-afi-srte;
              }  // container segment-routing-te
    
              container transport {
                presence "enable transport";
                description
                  "Include Classful Transport NLRI";
                uses bgp-afi-inet6-transport;
              }  // container transport
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-topo;
              }  // container unicast
    
              container multicast {
                presence "enable multicast";
                description
                  "Include multicast NLRI";
                uses bgp-afi-default;
              }  // container multicast
    
              container flow {
                presence "enable flow";
                description "Include flow NLRI";
                uses bgp-afi-flow;
              }  // container flow
    
              container any {
                presence "enable any";
                description
                  "Include unicast or multicast NLRI";
                uses bgp-afi-default;
              }  // container any
            }  // container inet6
    
            container inet6-vpn {
              description
                "IPv6 Layer 3 VPN NLRI parameters";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-l3vpn;
              }  // container unicast
    
              container multicast {
                presence "enable multicast";
                description
                  "Include multicast NLRI";
                uses bgp-afi-vpn;
              }  // container multicast
    
              container flow {
                presence "enable flow";
                description
                  "Include flow VPN NLRI";
                uses bgp-afi-flow;
              }  // container flow
    
              container any {
                presence "enable any";
                description
                  "Include unicast or multicast NLRI";
                uses bgp-afi-vpn;
              }  // container any
            }  // container inet6-vpn
    
            container iso-vpn {
              description
                "ISO Layer 3 VPN NLRI parameters";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-vpn-protection;
              }  // container unicast
            }  // container iso-vpn
    
            container l2vpn {
              description
                "MPLS-based Layer 2 VPN and VPLS NLRI parameters";
              uses apply-advanced;
    
              container auto-discovery-only {
                presence
                  "enable auto-discovery-only";
                description
                  "Include auto-discovery NLRI for LDP Layer 2 VPN and VPLS";
                uses bgp-afi-default;
              }  // container auto-discovery-only
    
              container auto-discovery-mspw {
                presence
                  "enable auto-discovery-mspw";
                description
                  "Include auto-discovery NLRI for LDP Signalled MultiSegment PW";
                uses bgp-afi-default;
              }  // container auto-discovery-mspw
    
              container signaling {
                presence "enable signaling";
                description
                  "Include Layer 2 VPN and VPLS signaling NLRI";
                uses bgp-afi-l2vpn;
              }  // container signaling
            }  // container l2vpn
    
            container evpn {
              description "EVPN NLRI parameters";
              uses apply-advanced;
    
              container signaling {
                presence "enable signaling";
                description
                  "Include EVPN signaling NLRI";
                uses bgp-afi-default;
              }  // container signaling
            }  // container evpn
    
            container inet-mvpn {
              description
                "IPv4 MVPN NLRI parameters";
              uses apply-advanced;
    
              container signaling {
                presence "enable signaling";
                description
                  "Include IPv4 multicast VPN signaling NLRI";
                uses bgp-afi-default;
              }  // container signaling
            }  // container inet-mvpn
    
            container inet6-mvpn {
              description
                "IPv6 MVPN NLRI parameters";
              uses apply-advanced;
    
              container signaling {
                presence "enable signaling";
                description
                  "Include IPv6 multicast VPN signaling NLRI";
                uses bgp-afi-default;
              }  // container signaling
            }  // container inet6-mvpn
    
            container inet-mdt {
              description
                "IPv4 Multicast Distribution Tree (MDT) NLRI parameters";
              uses apply-advanced;
    
              container signaling {
                presence "enable signaling";
                description
                  "Include IPv4 multicast VPN auto-discovery NLRI";
                uses bgp-afi-default;
              }  // container signaling
            }  // container inet-mdt
    
            container traffic-engineering {
              description
                "Traffic Engineering (BGP-TE) NLRI parameters";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Include BGP-TE NLRI";
                uses bgp-afi-default;
              }  // container unicast
            }  // container traffic-engineering
    
            container route-target {
              presence "enable route-target";
              description
                "Route target NLRI used for VPN route filtering";
              uses apply-advanced;
    
              container prefix-limit {
                description
                  "Limit maximum number of prefixes from a peer";
                uses bgpaf-prefix-limit;
              }  // container prefix-limit
    
              container accepted-prefix-limit {
                description
                  "Limit maximum number of prefixes accepted from a peer";
                uses bgpaf-accepted-prefix-limit;
              }  // container accepted-prefix-limit
    
              container proxy-generate {
                presence "enable proxy-generate";
                description
                  "Generate route target NLRI for peers that don't support it";
                uses apply-advanced;
    
                leaf-list route-target-policy {
                  type jt:policy-algebra;
                  ordered-by user;
                  description
                    "Limit VPN routes that are used to generate proxy route-target filters";
                }
              }  // container proxy-generate
    
              leaf external-paths {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 256";
                  }
                }
                description
                  "Number of external paths accepted for route filtering";
              }
    
              leaf advertise-default {
                type empty;
                description
                  "Advertise default and suppress more specific routes";
              }
    
              leaf damping {
                type empty;
                description
                  "Enable route flap damping";
              }
    
              container graceful-restart {
                description
                  "BGP graceful restart options";
                uses bgp-af-gr;
              }  // container graceful-restart
    
              leaf local-ipv4-address {
                type jt:ipv4addr;
                description "Local IPv4 address";
              }
    
              container output-queue-priority {
                description
                  "Default output-queue to assign updates to";
                uses bgp-output-queue-priority-class;
              }  // container output-queue-priority
    
              container route-refresh-priority {
                description
                  "Default output-queue to assign route refreshes to";
                uses bgp-output-queue-priority-class;
              }  // container route-refresh-priority
    
              container withdraw-priority {
                description
                  "Default output-queue to assign withdrawn routes to";
                uses bgp-output-queue-priority-class;
              }  // container withdraw-priority
            }  // container route-target
    
            container inet-bgpmcast {
              description
                "IPv4 BGPMCAST NLRI parameters";
              uses apply-advanced;
    
              container signaling {
                presence "enable signaling";
                description
                  "Include IPv4 BGP multicast signaling NLRI";
                uses bgp-afi-default;
              }  // container signaling
            }  // container inet-bgpmcast
    
            container inet6-bgpmcast {
              description
                "IPv6 BGPMCAST NLRI parameters";
              uses apply-advanced;
    
              container signaling {
                presence "enable signaling";
                description
                  "Include IPv6 BGP multicast signaling NLRI";
                uses bgp-afi-default;
              }  // container signaling
            }  // container inet6-bgpmcast
          }  // container family
    
          container egress-te {
            presence "enable egress-te";
            description
              "Use Egress Peering traffic engineering";
            uses apply-advanced;
    
            leaf install-address {
              type jt:ipaddr;
              description
                "Address to use in egress-te created inet route";
            }
    
            container rib {
              description
                "Select primary table for Egress-TE routes";
              uses apply-advanced;
    
              leaf inet.0 {
                type empty;
                description
                  "Install Egress-TE routes in inet.0";
              }
    
              leaf inet6.0 {
                type empty;
                description
                  "Install Egress-TE routes in inet6.0";
              }
            }  // container rib
    
            leaf no-install {
              type empty;
              description
                "Avoid installation to FIB or resolving over";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy to set attributes";
            }
    
            leaf backup-path {
              junos:must "("protocols bgp egress-te-backup-paths template $$")";
              junos:must-message "bgp egress-te-backup-paths template not configured";
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "The 'egress-te-backup-paths template' to use for this peer";
            }
          }  // container egress-te
    
          leaf advertise-prefix-sid {
            type empty;
            description
              "Advertise prefix sid to E-BGP peers";
          }
    
          leaf accept-prefix-sid {
            type empty;
            description
              "Accept prefix sid from E-BGP peers";
          }
    
          leaf advertise-srgb {
            type empty;
            description "Advertise SRGB TLV";
          }
    
          leaf egress-te-sid-stats {
            type empty;
            description
              "Create BGP-Peer-SID sensor";
          }
    
          list egress-te-set-segment {
            key "name";
            ordered-by user;
            description
              "Configure BGP-Peer-Set segment";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "The BGP-Peer-Set segment name";
            }
    
            uses apply-advanced;
    
            container label {
              description
                "BGP-Peer-Set SID label from static label pool";
              uses apply-advanced;
    
              leaf label-value {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description
                  "BGP-Peer-Set SID label value from static label pool";
              }
            }  // container label
    
            container egress-te-backup-segment {
              description
                "Backup segment for FRR";
              uses apply-advanced;
    
              container label {
                description
                  "Backup segment label from static label pool";
                uses apply-advanced;
    
                leaf label-value {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "16 .. 1048575";
                    }
                  }
                  description
                    "Backup segment label value from static label pool";
                }
              }  // container label
            }  // container egress-te-backup-segment
    
            container egress-te-backup-ip-forward {
              presence
                "enable egress-te-backup-ip-forward";
              description
                "Use IP-forward backup path for Egress TE";
              uses apply-advanced;
    
              leaf instance-name {
                type string {
                  junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                  junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                }
                description
                  "Routing-instance to use as IP forward backup-path";
              }
            }  // container egress-te-backup-ip-forward
          }  // list egress-te-set-segment
    
          list group {
            key "name";
            ordered-by user;
            description "Define a peer group";
            leaf name {
              type string;
              description "Group name";
            }
    
            uses apply-advanced;
    
            leaf type {
              type enumeration {
                enum "internal" {
                  value 0;
                  description "IBGP group";
                }
                enum "external" {
                  value 1;
                  description "EBGP group";
                }
              }
              description "Type of peer group";
            }
    
            leaf protocol {
              type enumeration {
                enum "rip" {
                  value 0;
                  status deprecated;
                  description
                    "Use RIP to resolve the BGP next hop";
                }
                enum "ospf" {
                  value 1;
                  status deprecated;
                  description
                    "Use OSPF to resolve the BGP next hop";
                }
                enum "isis" {
                  value 2;
                  status deprecated;
                  description
                    "Use IS-IS to resolve the BGP next hop";
                }
              }
              status deprecated;
              description
                "IGP to use to resolve the next hop";
            }
    
            container traceoptions {
              description
                "Trace options for BGP";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "damping" {
                      value 0;
                      description
                        "Trace BGP damping information";
                    }
                    enum "packets" {
                      value 1;
                      description
                        "Trace all BGP protocol packets";
                    }
                    enum "open" {
                      value 2;
                      description
                        "Trace BGP open packets";
                    }
                    enum "update" {
                      value 3;
                      description
                        "Trace BGP update packets";
                    }
                    enum "keepalive" {
                      value 4;
                      description
                        "Trace BGP keepalive packets";
                    }
                    enum "refresh" {
                      value 5;
                      description
                        "Trace BGP refresh packets";
                    }
                    enum "nsr-synchronization" {
                      value 6;
                      description
                        "Trace NSR synchronization events";
                    }
                    enum "bfd" {
                      value 7;
                      description
                        "Trace BFD events";
                    }
                    enum "4byte-as" {
                      value 8;
                      description
                        "Trace 4 byte AS events";
                    }
                    enum "add-path" {
                      value 9;
                      description
                        "Trace add-path events";
                    }
                    enum "graceful-restart" {
                      value 10;
                      description
                        "Trace Graceful Restart events";
                    }
                    enum "egress-te" {
                      value 11;
                      description
                        "Egress Peering Traffic-Engineering events";
                    }
                    enum "thread-io" {
                      value 12;
                      description
                        "Trace threaded I/O processing";
                    }
                    enum "sharding" {
                      value 13;
                      description
                        "Trace BGP rib sharding";
                    }
                    enum "thread-update-io" {
                      value 14;
                      description
                        "Trace threaded update I/O processing";
                    }
                    enum "route-validation" {
                      value 15;
                      description
                        "Trace route validation";
                    }
                    enum "ipsec" {
                      value 16;
                      description "Trace ipsec";
                    }
                    enum "route" {
                      value 17;
                      description
                        "Trace routing information";
                    }
                    enum "normal" {
                      value 18;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 19;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 20;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 21;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 22;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 23;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 24;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
    
                container filter {
                  presence "enable filter";
                  description
                    "Filter to apply to this flag";
                  uses bgp_filter_obj;
                }  // container filter
              }  // list flag
            }  // container traceoptions
    
            leaf description {
              type string {
                length "1 .. 255";
              }
              description "Text description";
            }
    
            container metric-out {
              description
                "Route metric sent in MED";
              choice metric_param {
                leaf metric-value {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4294967295";
                    }
                  }
                  description "Metric value";
                }
                container minimum-igp {
                  presence "enable minimum-igp";
                  description
                    "Track the minimum IGP metric";
                  leaf metric-offset {
                    type union {
                      type int32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Metric offset for MED";
                  }
                }  // container minimum-igp
                container igp {
                  presence "enable igp";
                  description
                    "Track the IGP metric";
                  leaf metric-offset {
                    type union {
                      type int32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Metric offset for MED";
                  }
    
                  leaf delay-med-update {
                    type empty;
                    description
                      "Delay updating MED when IGP metric increases";
                  }
                }  // container igp
                container effective-aigp {
                  presence
                    "enable effective-aigp";
                  description
                    "Track the effective AIGP metric";
                  leaf metric-offset {
                    type union {
                      type int32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Metric offset for MED";
                  }
                }  // container effective-aigp
                container minimum-effective-aigp {
                  presence
                    "enable minimum-effective-aigp";
                  description
                    "Track the minimum effective AIGP metric";
                  leaf metric-offset {
                    type union {
                      type int32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Metric offset for MED";
                  }
                }  // container minimum-effective-aigp
              }  // choice metric_param
            }  // container metric-out
    
            container multihop {
              presence "enable multihop";
              description
                "Configure an EBGP multihop session";
              uses apply-advanced;
    
              leaf ttl {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "1 .. 255";
                  }
                }
                description
                  "TTL value for the session";
              }
    
              leaf no-nexthop-change {
                type empty;
                description
                  "Do not change next hop to self in advertisements";
              }
            }  // container multihop
    
            leaf route-server-client {
              type empty;
              description
                "Enable route server client behavior";
            }
    
            leaf accept-remote-nexthop {
              type empty;
              description
                "Allow import policy to specify a non-directly connected next-hop";
            }
    
            leaf preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Preference value";
            }
    
            leaf local-preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Value of LOCAL_PREF path attribute";
            }
    
            leaf local-address {
              type jt:ipaddr;
              description
                "Address of local end of BGP session";
            }
    
            leaf local-interface {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Local interface for IPv6 link local EBGP peering";
            }
    
            leaf forwarding-context {
              type string {
                junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
              }
              description
                "Routing-instance used for data-forwarding and transport-session";
            }
    
            leaf hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 65535";
                }
              }
              description
                "Hold time used when negotiating with a peer";
            }
    
            leaf minimum-hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "3 .. 65535";
                }
              }
              description
                "Minimum hold time accepted from the peer";
            }
    
            leaf passive {
              type empty;
              description
                "Do not send open messages to a peer";
            }
    
            leaf advertise-inactive {
              type empty;
              description
                "Advertise inactive routes";
            }
    
            choice advertise-peer-as-choice {
              leaf advertise-peer-as {
                type empty;
                description
                  "Advertise routes received from the same autonomous system";
              }
              leaf no-advertise-peer-as {
                type empty;
                description
                  "Don't advertise routes received from the same autonomous system";
              }
            }  // choice advertise-peer-as-choice
    
            container advertise-external {
              presence
                "enable advertise-external";
              description
                "Advertise best external routes";
              leaf conditional {
                type empty;
                description
                  "Route matches active route upto med-comparison rule";
              }
            }  // container advertise-external
    
            leaf keep {
              type enumeration {
                enum "all" {
                  value 0;
                  description
                    "Retain all routes";
                }
                enum "none" {
                  value 1;
                  description "Retain no routes";
                }
              }
              description
                "How to retain routes in the routing table";
            }
    
            leaf rfc6514-compliant-safi129 {
              type empty;
              description
                "Compliant with RFC6514 SAFI129 format";
            }
    
            leaf no-aggregator-id {
              type empty;
              description
                "Set router ID in aggregator path attribute to 0";
            }
    
            leaf mtu-discovery {
              type empty;
              description
                "Enable TCP path MTU discovery";
            }
    
            leaf enforce-first-as {
              type empty;
              description
                "Enforce first AS in AS-path is the neighbor's AS";
            }
    
            leaf out-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 65535";
                }
              }
              description
                "How long before exporting routes from routing table";
            }
    
            leaf ttl {
              junos:must "((!(".. .. type internal") && !(".. multihop")))";
              junos:must-message "This option is valid only for single-hop EBGP neighbor";
              type enumeration {
                enum "1" {
                  value 0;
                }
                enum "255" {
                  value 1;
                }
              }
              description
                "TTL value for the single-hop peer";
            }
    
            leaf log-updown {
              type empty;
              description
                "Log a message for peer state transitions";
            }
    
            leaf damping {
              type empty;
              description
                "Enable route flap damping";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
    
            leaf-list nlri {
              type enumeration {
                enum "unicast" {
                  value 0;
                  status deprecated;
                  description
                    "Include unicast NLRI";
                }
                enum "multicast" {
                  value 1;
                  status deprecated;
                  description
                    "Include multicast NLRI";
                }
                enum "any" {
                  value 2;
                  status deprecated;
                  description
                    "Include any kind of NLRI";
                }
              }
              ordered-by user;
              status deprecated;
              description
                "NLRI type to include in updates";
            }
    
            container bgp-error-tolerance {
              presence
                "enable bgp-error-tolerance";
              description
                "Handle BGP malformed updates softly";
              uses apply-advanced;
    
              leaf malformed-update-log-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10 .. 65535";
                  }
                }
                units "seconds";
                default "300";
                description
                  "Time used when logging malformed update";
              }
    
              choice malformed-routes-limit-choice {
                leaf malformed-route-limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4294967295";
                    }
                  }
                  default "1000";
                  description
                    "Maximum number of malformed routes from a peer";
                }
                leaf no-malformed-route-limit {
                  type empty;
                  description
                    "No malformed route limit";
                }
              }  // choice malformed-routes-limit-choice
            }  // container bgp-error-tolerance
    
            container family {
              description
                "Protocol family for NLRIs in updates";
              uses apply-advanced;
    
              container inet {
                description
                  "IPv4 NLRI parameters";
                uses apply-advanced;
    
                container labeled-unicast {
                  presence
                    "enable labeled-unicast";
                  description
                    "Include labeled unicast NLRI";
                  uses bgp-afi-labeled;
                }  // container labeled-unicast
    
                container segment-routing-te {
                  presence
                    "enable segment-routing-te";
                  description
                    "Include segment-routing TE policy";
                  uses bgp-afi-srte;
                }  // container segment-routing-te
    
                container transport {
                  presence "enable transport";
                  description
                    "Include Classful Transport NLRI";
                  uses bgp-afi-inet-transport;
                }  // container transport
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-topo;
                }  // container unicast
    
                container multicast {
                  presence "enable multicast";
                  description
                    "Include multicast NLRI";
                  uses bgp-afi-default;
                }  // container multicast
    
                container flow {
                  presence "enable flow";
                  description
                    "Include flow NLRI";
                  uses bgp-afi-flow-with-redirect-ip-action;
                }  // container flow
    
                container any {
                  presence "enable any";
                  description
                    "Include unicast or multicast NLRI";
                  uses bgp-afi-default;
                }  // container any
              }  // container inet
    
              container inet-vpn {
                description
                  "IPv4 Layer 3 VPN NLRI parameters";
                uses apply-advanced;
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-l3vpn;
                }  // container unicast
    
                container multicast {
                  presence "enable multicast";
                  description
                    "Include multicast NLRI";
                  uses bgp-afi-vpn;
                }  // container multicast
    
                container flow {
                  presence "enable flow";
                  description
                    "Include flow VPN NLRI";
                  uses bgp-afi-flow-with-redirect-ip-action;
                }  // container flow
    
                container any {
                  presence "enable any";
                  description
                    "Include unicast or multicast NLRI";
                  uses bgp-afi-vpn;
                }  // container any
              }  // container inet-vpn
    
              container inet6 {
                description
                  "IPv6 NLRI parameters";
                uses apply-advanced;
    
                container labeled-unicast {
                  presence
                    "enable labeled-unicast";
                  description
                    "Include labeled unicast NLRI";
                  uses bgp-afi-inet6-labeled;
                }  // container labeled-unicast
    
                container segment-routing-te {
                  presence
                    "enable segment-routing-te";
                  description
                    "Include segment-routing TE policy";
                  uses bgp-afi-srte;
                }  // container segment-routing-te
    
                container transport {
                  presence "enable transport";
                  description
                    "Include Classful Transport NLRI";
                  uses bgp-afi-inet6-transport;
                }  // container transport
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-topo;
                }  // container unicast
    
                container multicast {
                  presence "enable multicast";
                  description
                    "Include multicast NLRI";
                  uses bgp-afi-default;
                }  // container multicast
    
                container flow {
                  presence "enable flow";
                  description
                    "Include flow NLRI";
                  uses bgp-afi-flow;
                }  // container flow
    
                container any {
                  presence "enable any";
                  description
                    "Include unicast or multicast NLRI";
                  uses bgp-afi-default;
                }  // container any
              }  // container inet6
    
              container inet6-vpn {
                description
                  "IPv6 Layer 3 VPN NLRI parameters";
                uses apply-advanced;
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-l3vpn;
                }  // container unicast
    
                container multicast {
                  presence "enable multicast";
                  description
                    "Include multicast NLRI";
                  uses bgp-afi-vpn;
                }  // container multicast
    
                container flow {
                  presence "enable flow";
                  description
                    "Include flow VPN NLRI";
                  uses bgp-afi-flow;
                }  // container flow
    
                container any {
                  presence "enable any";
                  description
                    "Include unicast or multicast NLRI";
                  uses bgp-afi-vpn;
                }  // container any
              }  // container inet6-vpn
    
              container iso-vpn {
                description
                  "ISO Layer 3 VPN NLRI parameters";
                uses apply-advanced;
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-vpn-protection;
                }  // container unicast
              }  // container iso-vpn
    
              container l2vpn {
                description
                  "MPLS-based Layer 2 VPN and VPLS NLRI parameters";
                uses apply-advanced;
    
                container auto-discovery-only {
                  presence
                    "enable auto-discovery-only";
                  description
                    "Include auto-discovery NLRI for LDP Layer 2 VPN and VPLS";
                  uses bgp-afi-default;
                }  // container auto-discovery-only
    
                container auto-discovery-mspw {
                  presence
                    "enable auto-discovery-mspw";
                  description
                    "Include auto-discovery NLRI for LDP Signalled MultiSegment PW";
                  uses bgp-afi-default;
                }  // container auto-discovery-mspw
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include Layer 2 VPN and VPLS signaling NLRI";
                  uses bgp-afi-l2vpn;
                }  // container signaling
              }  // container l2vpn
    
              container evpn {
                description
                  "EVPN NLRI parameters";
                uses apply-advanced;
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include EVPN signaling NLRI";
                  uses bgp-afi-default;
                }  // container signaling
              }  // container evpn
    
              container inet-mvpn {
                description
                  "IPv4 MVPN NLRI parameters";
                uses apply-advanced;
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include IPv4 multicast VPN signaling NLRI";
                  uses bgp-afi-default;
                }  // container signaling
              }  // container inet-mvpn
    
              container inet6-mvpn {
                description
                  "IPv6 MVPN NLRI parameters";
                uses apply-advanced;
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include IPv6 multicast VPN signaling NLRI";
                  uses bgp-afi-default;
                }  // container signaling
              }  // container inet6-mvpn
    
              container inet-mdt {
                description
                  "IPv4 Multicast Distribution Tree (MDT) NLRI parameters";
                uses apply-advanced;
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include IPv4 multicast VPN auto-discovery NLRI";
                  uses bgp-afi-default;
                }  // container signaling
              }  // container inet-mdt
    
              container traffic-engineering {
                description
                  "Traffic Engineering (BGP-TE) NLRI parameters";
                uses apply-advanced;
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include BGP-TE NLRI";
                  uses bgp-afi-default;
                }  // container unicast
              }  // container traffic-engineering
    
              container route-target {
                presence "enable route-target";
                description
                  "Route target NLRI used for VPN route filtering";
                uses apply-advanced;
    
                container prefix-limit {
                  description
                    "Limit maximum number of prefixes from a peer";
                  uses bgpaf-prefix-limit;
                }  // container prefix-limit
    
                container accepted-prefix-limit {
                  description
                    "Limit maximum number of prefixes accepted from a peer";
                  uses bgpaf-accepted-prefix-limit;
                }  // container accepted-prefix-limit
    
                container proxy-generate {
                  presence
                    "enable proxy-generate";
                  description
                    "Generate route target NLRI for peers that don't support it";
                  uses apply-advanced;
    
                  leaf-list route-target-policy {
                    type jt:policy-algebra;
                    ordered-by user;
                    description
                      "Limit VPN routes that are used to generate proxy route-target filters";
                  }
                }  // container proxy-generate
    
                leaf external-paths {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 256";
                    }
                  }
                  description
                    "Number of external paths accepted for route filtering";
                }
    
                leaf advertise-default {
                  type empty;
                  description
                    "Advertise default and suppress more specific routes";
                }
    
                leaf damping {
                  type empty;
                  description
                    "Enable route flap damping";
                }
    
                container graceful-restart {
                  description
                    "BGP graceful restart options";
                  uses bgp-af-gr;
                }  // container graceful-restart
    
                leaf local-ipv4-address {
                  type jt:ipv4addr;
                  description
                    "Local IPv4 address";
                }
    
                container output-queue-priority {
                  description
                    "Default output-queue to assign updates to";
                  uses bgp-output-queue-priority-class;
                }  // container output-queue-priority
    
                container route-refresh-priority {
                  description
                    "Default output-queue to assign route refreshes to";
                  uses bgp-output-queue-priority-class;
                }  // container route-refresh-priority
    
                container withdraw-priority {
                  description
                    "Default output-queue to assign withdrawn routes to";
                  uses bgp-output-queue-priority-class;
                }  // container withdraw-priority
              }  // container route-target
    
              container inet-bgpmcast {
                description
                  "IPv4 BGPMCAST NLRI parameters";
                uses apply-advanced;
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include IPv4 BGP multicast signaling NLRI";
                  uses bgp-afi-default;
                }  // container signaling
              }  // container inet-bgpmcast
    
              container inet6-bgpmcast {
                description
                  "IPv6 BGPMCAST NLRI parameters";
                uses apply-advanced;
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include IPv6 BGP multicast signaling NLRI";
                  uses bgp-afi-default;
                }  // container signaling
              }  // container inet6-bgpmcast
            }  // container family
    
            leaf authentication-key {
              type string {
                length "1 .. 126";
              }
              description
                "MD5 authentication key";
            }
    
            leaf authentication-algorithm {
              junos:must "(".. authentication-key-chain")";
              junos:must-message "May not be configured without authentication-key-chain";
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "md5" {
                  value 0;
                  description "Message Digest 5";
                }
                enum "hmac-sha-1-96" {
                  value 1;
                  description
                    "Hash-based Message Authentication Code (SHA1) (96 bits)";
                }
                enum "aes-128-cmac-96" {
                  value 2;
                  description
                    "Cipher-based Message Authentication Code (AES128) (96 bits)";
                }
                enum "ao" {
                  value 3;
                  description
                    "TCP Authentication Option";
                }
              }
              description
                "Authentication algorithm name";
            }
    
            leaf tcpao-handling-with-digest-mismatch {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "drop-if-no-tcpao" {
                  value 0;
                  description
                    "Drop the connection if Digest mismatched";
                }
                enum "allow-without-tcpao" {
                  value 1;
                  description
                    "Allow the connection establishment without TCP-AO";
                }
              }
              description
                "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
            }
    
            leaf authentication-key-chain {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              junos:must "("security authentication-key-chains key-chain $$")";
              junos:must-message "Referenced key-chain must be defined";
              type string {
                length "1 .. 128";
              }
              description "Key chain name";
            }
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
    
            container remove-private {
              presence "enable remove-private";
              description
                "Remove well-known private AS numbers";
              uses apply-advanced;
    
              container all {
                presence "enable all";
                description
                  "Remove all private AS numbers and do not stop at the first public AS number";
                container replace {
                  presence "enable replace";
                  description
                    "Replace private AS numbers with the BGP Group's local AS number";
                  leaf nearest {
                    type empty;
                    description
                      "Use closest public AS number to replace a private AS number";
                  }
                }  // container replace
              }  // container all
    
              leaf no-peer-loop-check {
                type empty;
                description
                  "Remove peer loop-check";
              }
            }  // container remove-private
    
            leaf cluster {
              type jt:areaid;
              description "Cluster identifier";
            }
    
            leaf no-client-reflect {
              type empty;
              description
                "Disable intracluster route redistribution";
            }
    
            leaf peer-as {
              type string {
                junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
              }
              description
                " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
            }
    
            container local-as {
              description
                "Local autonomous system number";
              leaf as-number {
                type string {
                  junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                  junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                }
                description
                  " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
              }
    
              leaf loops {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "1 .. 10";
                  }
                }
                description
                  "Maximum number of times this AS can be in an AS path";
              }
    
              leaf private {
                type empty;
                description
                  "Hide this local AS in paths learned from this peering";
              }
    
              leaf alias {
                type empty;
                description
                  "Treat this AS as an alias to the system AS";
              }
    
              leaf no-prepend-global-as {
                type empty;
                description
                  "Do not prepend global autonomous-system number in advertised paths";
              }
            }  // container local-as
    
            leaf ipsec-sa {
              junos:must "("security ipsec security-association $$")";
              junos:must-message "Referenced IPSec Security Association must be defined";
              type string {
                length "1 .. 32";
              }
              description "IPSec SA name";
            }
    
            container graceful-shutdown {
              description
                "BGP peer graceful shutdown option";
              uses apply-advanced;
    
              container receiver {
                presence "enable receiver";
                description
                  "BGP peer graceful-shutdown receiver";
                uses apply-advanced;
    
                leaf disable {
                  junos:must "(!(".. .. sender"))";
                  junos:must-message "Receiver cannot be disabled on Sender";
                  type empty;
                  description
                    "Disable graceful-shutdown receiver";
                }
    
                leaf local-preference {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Value of receiver LOCAL_PREF path attribute";
                }
              }  // container receiver
    
              container sender {
                presence "enable sender";
                description
                  "BGP peer graceful-shutdown sender";
                uses apply-advanced;
    
                leaf local-preference {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Value of sender LOCAL_PREF path attribute";
                }
              }  // container sender
            }  // container graceful-shutdown
    
            container shutdown {
              presence "enable shutdown";
              description "Shutdown";
              uses apply-advanced;
    
              leaf notify-message {
                type string;
                description
                  "Notification message";
              }
            }  // container shutdown
    
            leaf unconfigured-peer-graceful-restart {
              junos:must "(".. graceful-restart")";
              junos:must-message "unconfigured-peer-graceful-restart is only valid with 'graceful-restart'";
              type empty;
              description
                "BGP unconfigured peer graceful restart options";
            }
    
            container graceful-restart {
              presence "enable graceful-restart";
              description
                "BGP graceful restart options";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable graceful restart";
                }
              }  // choice enable-disable
    
              leaf restart-time {
                junos:must "(("routing-options graceful-restart" || "fabric routing-options graceful-restart"))";
                junos:must-message "restart-time is only valid with 'routing-options graceful-restart'";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1800";
                  }
                }
                description
                  "Restart time used when negotiating with a peer";
              }
    
              leaf stale-routes-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1800";
                  }
                }
                description
                  "Maximum time for which stale routes are kept";
              }
    
              container long-lived {
                description
                  "Long-lived graceful restart options";
                uses apply-advanced;
    
                container receiver {
                  description
                    "Long-lived graceful restart receiver (helper) options";
                  uses apply-advanced;
    
                  choice enable-disable {
                    leaf disable {
                      type empty;
                      description
                        "Disable receiver (helper) functionality";
                    }
                  }  // choice enable-disable
                }  // container receiver
    
                container advertise-to-non-llgr-neighbor {
                  presence
                    "enable advertise-to-non-llgr-neighbor";
                  description
                    "Advertise stale routes to non-LLGR neighbors";
                  uses apply-advanced;
    
                  leaf omit-no-export {
                    type empty;
                    description
                      "Do not attach no-export community to stale routes";
                  }
                }  // container advertise-to-non-llgr-neighbor
              }  // container long-lived
    
              leaf disable-notification-extensions {
                type empty;
                description
                  "Disable notification extensions";
              }
    
              leaf forwarding-state-bit {
                type enumeration {
                  enum "as-rr-client" {
                    value 0;
                    description
                      "As for a route reflector client";
                  }
                  enum "from-fib" {
                    value 1;
                    description
                      "Always use state of associated FIB(s)";
                  }
                }
                description
                  "Control forwarding-state flag negotiation";
              }
    
              leaf dont-help-shared-fate-bfd-down {
                type empty;
                description
                  "Honor BFD-Down(C=0) if GR-restart not in progress";
              }
            }  // container graceful-restart
    
            leaf include-mp-next-hop {
              type empty;
              description
                "Include NEXT-HOP attribute in multiprotocol updates";
            }
    
            leaf disable-4byte-as {
              type empty;
              description
                "Disable 4 byte AS capability advertisement";
            }
    
            container idle-after-switch-over {
              description
                "Stop peer session from coming up after nonstop-routing switch-over";
              choice idle-interval {
                leaf forever {
                  type empty;
                  description
                    "Idle the peer until the user intervenes";
                }
                leaf timeout {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  description
                    "Timeout value, in seconds, for starting peer after switch over";
                }
              }  // choice idle-interval
            }  // container idle-after-switch-over
    
            container outbound-route-filter {
              junos:must "(!("system processes routing bgp update-threading"))";
              junos:must-message "Can't be configured together with update-threading";
              description
                "Dynamically negotiated cooperative route filtering";
              uses apply-advanced;
    
              leaf bgp-orf-cisco-mode {
                type empty;
                description
                  "Using BGP ORF capability code 130 and Prefix ORF type 128";
              }
    
              container extended-community {
                status deprecated;
                description
                  "Extended community filtering";
                uses apply-advanced;
    
                choice accept-choice {
                  leaf accept {
                    type empty;
                    description
                      "Honor remote requests for extended community ORF";
                  }
                  leaf no-accept {
                    type empty;
                    description
                      "Don't honor remote requests for extended community ORF";
                  }
                }  // choice accept-choice
    
                leaf vrf-filter {
                  type empty;
                  description
                    "Request remote filtering using locally configured VRF import targets";
                }
              }  // container extended-community
    
              container prefix-based {
                presence "enable prefix-based";
                description
                  "Prefix-based outbound route filtering";
                uses apply-advanced;
    
                container accept {
                  presence "enable accept";
                  description
                    "Honor Prefix-based ORFs from remote peers";
                  uses apply-advanced;
    
                  leaf inet {
                    type empty;
                    description
                      "Honor IPv4 prefix filters";
                  }
    
                  leaf inet6 {
                    type empty;
                    description
                      "Honor IPv6 prefix filters";
                  }
                }  // container accept
              }  // container prefix-based
            }  // container outbound-route-filter
    
            container message-batching {
              status deprecated;
              description
                "DEPRECATED - Batching of outgoing messages";
              uses apply-advanced;
    
              choice enable-disable {
                leaf enable {
                  type empty;
                  description "Enable parameter";
                }
                leaf disable {
                  type empty;
                  description
                    "Disable parameter";
                }
              }  // choice enable-disable
    
              leaf interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "100 .. 1000";
                  }
                }
                units "milliseconds";
                default "250";
                description
                  "DEPRECATED - Interval over which to batch messages";
              }
            }  // container message-batching
    
            container multipath {
              presence "enable multipath";
              description
                "Allow load sharing among multiple BGP paths";
              uses apply-advanced;
    
              leaf disable {
                type empty;
                description "Disable Multipath";
              }
    
              leaf multiple-as {
                type empty;
                description
                  "Use paths received from different ASs";
              }
    
              leaf allow-protection {
                type empty;
                description
                  "Allow protection for multipath legs";
              }
    
              leaf pause-computation-during-churn {
                type empty;
                description
                  "Pause multipath job to absorb churn";
              }
    
              leaf list-nexthop {
                type empty;
                description
                  "Use List-NH for homogenous nexthop-set also";
              }
            }  // container multipath
    
            leaf tcp-mss {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 4096";
                }
              }
              description
                "Maximum TCP segment size";
            }
    
            leaf bgp-identifier {
              type jt:ipv4addr;
              description "BGP Identifier";
            }
    
            leaf tcp-aggressive-transmission {
              type empty;
              description
                "Enable aggressive transmission of pure TCP ACKs and retransmissions";
            }
    
            container bmp {
              description
                "Specific settings to override the routing-options settings";
              uses apply-advanced;
    
              leaf monitor {
                type enumeration {
                  enum "enable" {
                    value 0;
                    description
                      "Enable monitoring of BGP peer(s)";
                  }
                  enum "disable" {
                    value 1;
                    description
                      "Disable monitoring of BGP peer(s)";
                  }
                }
                description
                  "Enable/Disable monitoring";
              }
    
              container route-monitoring {
                description
                  "Control route monitoring settings";
                uses apply-advanced;
    
                leaf none {
                  junos:must "((!(".. pre-policy") && (!(".. post-policy") && !(".. rib-out"))))";
                  junos:must-message "May not be configured with pre-policy or post-policy or rib-out";
                  type empty;
                  description
                    "Do not send route monitoring messages";
                }
    
                container pre-policy {
                  presence "enable pre-policy";
                  description
                    "Send pre-policy route monitoring messages";
                  leaf exclude-non-feasible {
                    type empty;
                    description
                      "Exclude looped routes, etc";
                  }
                }  // container pre-policy
    
                container post-policy {
                  presence "enable post-policy";
                  description
                    "Send post-policy route monitoring messages";
                  leaf exclude-non-eligible {
                    type empty;
                    description
                      "Exclude unresolved routes, etc.";
                  }
                }  // container post-policy
    
                container rib-out {
                  junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                  junos:must-message "Update threading can't be configured together with bmp rib-out monitoring";
                  presence "enable rib-out";
                  description
                    "Send adj-ribs-out route monitoring messages";
                  leaf pre-policy {
                    type empty;
                    description
                      "Send pre-policy adj-ribs-out route monitoring messages";
                  }
    
                  leaf post-policy {
                    type empty;
                    description
                      "Send post-policy adj-ribs-out route monitoring messages";
                  }
                }  // container rib-out
              }  // container route-monitoring
            }  // container bmp
    
            container advertise-bgp-static {
              presence
                "enable advertise-bgp-static";
              description
                "Advertise bgp-static routes";
              uses apply-advanced;
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Static route advertisement policy";
              }
            }  // container advertise-bgp-static
    
            leaf add-path-display-ipv4-address {
              type empty;
              description
                "Display add-path path-id in IPv4 address format";
            }
    
            container bfd-liveness-detection {
              description
                "Bidirectional Forwarding Detection (BFD) options";
              uses apply-advanced;
    
              leaf version {
                type enumeration {
                  enum "0" {
                    value 0;
                    description
                      "BFD version 0 (deprecated)";
                  }
                  enum "1" {
                    value 1;
                    description "BFD version 1";
                  }
                  enum "automatic" {
                    value 2;
                    description
                      "Choose BFD version automatically";
                  }
                }
                default "automatic";
                description
                  "BFD protocol version number";
              }
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit and receive interval";
              }
    
              leaf minimum-transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                status deprecated;
                description
                  "Minimum transmit interval";
              }
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval";
              }
    
              leaf multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                default "3";
                description
                  "Detection time multiplier";
              }
    
              choice adaptation-choice {
                leaf no-adaptation {
                  type empty;
                  description
                    "Disable adaptation";
                }
              }  // choice adaptation-choice
    
              container transmit-interval {
                description
                  "Transmit-interval options";
                uses apply-advanced;
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit interval";
                }
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High transmit interval triggering a trap";
                }
              }  // container transmit-interval
    
              container detection-time {
                description
                  "Detection-time options";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High detection-time triggering a trap";
                }
              }  // container detection-time
    
              container authentication {
                description
                  "Authentication options";
                uses apply-advanced;
    
                leaf key-chain {
                  junos:must "(".. algorithm")";
                  junos:must-message "May not be configured without algorithm";
                  junos:must "("security authentication-key-chains key-chain $$")";
                  junos:must-message "Referenced key-chain must be defined";
                  type string;
                  description "Key chain name";
                }
    
                leaf algorithm {
                  junos:must "(".. key-chain")";
                  junos:must-message "May not be configured without key-chain";
                  type enumeration {
                    enum "simple-password" {
                      value 0;
                      description
                        "Simple password";
                    }
                    enum "keyed-md5" {
                      value 1;
                      description
                        "Keyed message Digest 5";
                    }
                    enum "meticulous-keyed-md5" {
                      value 2;
                      description
                        "Meticulous keyed message Digest 5";
                    }
                    enum "keyed-sha-1" {
                      value 3;
                      description
                        "Keyed secure hash algorithm (SHA1) ";
                    }
                    enum
                      "meticulous-keyed-sha-1" {
                      value 4;
                      description
                        "Meticulous keyed secure hash algorithm (SHA1) ";
                    }
                  }
                  description "Algorithm name";
                }
    
                leaf loose-check {
                  type empty;
                  description
                    "Verify authentication only if authentication is negotiated";
                }
              }  // container authentication
    
              leaf session-mode {
                type enumeration {
                  enum "automatic" {
                    value 0;
                    description
                      "Choose session-mode automatically";
                  }
                  enum "single-hop" {
                    value 1;
                    description "Use single-hop";
                  }
                  enum "multihop" {
                    value 2;
                    description "Use multihop";
                  }
                }
                default "automatic";
                description
                  "BFD single-hop or multihop session-mode";
              }
    
              leaf holddown-interval {
                junos:must "(!(".. .. type internal"))";
                junos:must-message "bfd holddown-interval is only valid for EBGP.";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Time to hold the session-UP notification to the client";
              }
            }  // container bfd-liveness-detection
    
            leaf as-override {
              type empty;
              description
                "Replace neighbor AS number with our AS number";
            }
    
            leaf-list allow {
              type jt:ipprefix;
              ordered-by user;
              description
                "Configure peer connections for specific networks";
            }
    
            list dynamic-neighbor {
              key "name";
              ordered-by user;
              description
                "Configure peer options for specific networks";
              leaf name {
                junos:must "((".. allow" || ".. peer-auto-discovery"))";
                junos:must-message "dynamic-neighbor must enable allow or peer-auto-discovery";
                type string;
                description "Template name";
              }
    
              uses apply-advanced;
    
              leaf-list allow {
                type jt:ipprefix;
                ordered-by user;
                description
                  "Configure peer connections for specific networks";
              }
    
              leaf authentication-key {
                type string {
                  length "1 .. 126";
                }
                description
                  "MD5 authentication key";
              }
    
              leaf authentication-algorithm {
                junos:must "(".. authentication-key-chain")";
                junos:must-message "May not be configured without authentication-key-chain";
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "md5" {
                    value 0;
                    description
                      "Message Digest 5";
                  }
                  enum "hmac-sha-1-96" {
                    value 1;
                    description
                      "Hash-based Message Authentication Code (SHA1) (96 bits)";
                  }
                  enum "aes-128-cmac-96" {
                    value 2;
                    description
                      "Cipher-based Message Authentication Code (AES128) (96 bits)";
                  }
                  enum "ao" {
                    value 3;
                    description
                      "TCP Authentication Option";
                  }
                }
                description
                  "Authentication algorithm name";
              }
    
              leaf tcpao-handling-with-digest-mismatch {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "drop-if-no-tcpao" {
                    value 0;
                    description
                      "Drop the connection if Digest mismatched";
                  }
                  enum "allow-without-tcpao" {
                    value 1;
                    description
                      "Allow the connection establishment without TCP-AO";
                  }
                }
                description
                  "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
              }
    
              leaf authentication-key-chain {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string {
                  length "1 .. 128";
                }
                description "Key chain name";
              }
    
              container peer-auto-discovery {
                junos:must "((!(".. authentication-algorithm") && (!(".. .. authentication-algorithm") && !(".. .. .. authentication-algorithm"))))";
                junos:must-message "Can't be configured along with authentication-algorithm";
                junos:must "((!(".. authentication-key") && (!(".. .. authentication-key") && !(".. .. .. authentication-key"))))";
                junos:must-message "Can't be configured along with authentication-key";
                junos:must "(!(".. allow"))";
                junos:must-message "peer-auto-discovery and allow cannot be configured in the same dynamic-neighbor";
                junos:must "((!(".. .. type internal") && !(".. .. multihop")))";
                junos:must-message "peer-auto-discovery is valid only for single-hop EBGP neighbor";
                description
                  "Configure auto-discovery options for BGP neighbors";
                uses apply-advanced;
    
                container family {
                  description
                    "Address family based neighbor auto-discovery parameters";
                  container inet6 {
                    uses apply-advanced;
    
                    choice auto-discovery-type {
                      container ipv6-nd {
                        presence
                          "enable ipv6-nd";
                        description
                          "Use ipv6 neighbor discovery to learn neighbor address";
                      }  // container ipv6-nd
                    }  // choice auto-discovery-type
                  }  // container inet6
                }  // container family
    
                list interface {
                  key "name";
                  leaf name {
                    type union {
                      type jt:interface-name;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Configure interfaces over which to discover bgp neighbors";
                  }
    
                  uses apply-advanced;
    
                  choice enable-disable {
                    leaf disable {
                      type empty;
                      description
                        "Disable peer discovery on interface";
                    }
                  }  // choice enable-disable
                }  // list interface
              }  // container peer-auto-discovery
            }  // list dynamic-neighbor
    
            container optimal-route-reflection {
              junos:must "(".. type internal")";
              junos:must-message "Must be configured with type internal";
              description
                "Enable optimal route reflection for this client group";
              uses apply-advanced;
    
              leaf igp-primary {
                type jt:ipv4addr;
                description
                  "Primary node identifier for this client group";
              }
    
              leaf igp-backup {
                type jt:ipv4addr;
                description
                  "Backup node identifier for this client group";
              }
            }  // container optimal-route-reflection
    
            leaf peer-as-list {
              junos:must "((".. allow" || ".. dynamic-neighbor"))";
              junos:must-message "May be configured only with allow or dynamic-neighbor";
              type string;
              description
                "Configure list of peer autonomous systems for unconfigured neighbors";
            }
    
            leaf mvpn-iana-rt-import {
              type empty;
              status deprecated;
              description
                "Use IANA assigned rt-import type value for MVPN";
            }
    
            list neighbor {
              key "name";
              ordered-by user;
              description "Configure a neighbor";
              leaf name {
                type jt:ipaddr-scoped;
              }
    
              uses apply-advanced;
    
              container traceoptions {
                description
                  "Trace options for BGP";
                uses apply-advanced;
    
                container file {
                  description
                    "Trace file options";
                  leaf filename {
                    type string {
                      junos:posix-pattern "![/ %]";
                      junos:pattern-message "Must not contain '/', % or a space";
                      length "1 .. 1024";
                    }
                    description
                      "Name of file in which to write trace information";
                  }
    
                  leaf replace {
                    type empty;
                    status deprecated;
                    description
                      "Replace trace file rather than appending to it";
                  }
    
                  leaf size {
                    type string;
                    description
                      "Maximum trace file size";
                  }
    
                  leaf files {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "2 .. 1000";
                      }
                    }
                    default "10";
                    description
                      "Maximum number of trace files";
                  }
    
                  leaf no-stamp {
                    type empty;
                    status deprecated;
                    description
                      "Do not timestamp trace file";
                  }
    
                  choice world-readable-choice {
                    leaf world-readable {
                      type empty;
                      description
                        "Allow any user to read the log file";
                    }
                    leaf no-world-readable {
                      type empty;
                      description
                        "Don't allow any user to read the log file";
                    }
                  }  // choice world-readable-choice
                }  // container file
    
                list flag {
                  key "name";
                  ordered-by user;
                  description
                    "Tracing parameters";
                  leaf name {
                    type enumeration {
                      enum "damping" {
                        value 0;
                        description
                          "Trace BGP damping information";
                      }
                      enum "packets" {
                        value 1;
                        description
                          "Trace all BGP protocol packets";
                      }
                      enum "open" {
                        value 2;
                        description
                          "Trace BGP open packets";
                      }
                      enum "update" {
                        value 3;
                        description
                          "Trace BGP update packets";
                      }
                      enum "keepalive" {
                        value 4;
                        description
                          "Trace BGP keepalive packets";
                      }
                      enum "refresh" {
                        value 5;
                        description
                          "Trace BGP refresh packets";
                      }
                      enum "nsr-synchronization" {
                        value 6;
                        description
                          "Trace NSR synchronization events";
                      }
                      enum "bfd" {
                        value 7;
                        description
                          "Trace BFD events";
                      }
                      enum "4byte-as" {
                        value 8;
                        description
                          "Trace 4 byte AS events";
                      }
                      enum "add-path" {
                        value 9;
                        description
                          "Trace add-path events";
                      }
                      enum "graceful-restart" {
                        value 10;
                        description
                          "Trace Graceful Restart events";
                      }
                      enum "egress-te" {
                        value 11;
                        description
                          "Egress Peering Traffic-Engineering events";
                      }
                      enum "thread-io" {
                        value 12;
                        description
                          "Trace threaded I/O processing";
                      }
                      enum "sharding" {
                        value 13;
                        description
                          "Trace BGP rib sharding";
                      }
                      enum "thread-update-io" {
                        value 14;
                        description
                          "Trace threaded update I/O processing";
                      }
                      enum "route-validation" {
                        value 15;
                        description
                          "Trace route validation";
                      }
                      enum "ipsec" {
                        value 16;
                        description
                          "Trace ipsec";
                      }
                      enum "route" {
                        value 17;
                        description
                          "Trace routing information";
                      }
                      enum "normal" {
                        value 18;
                        description
                          "Trace normal events";
                      }
                      enum "general" {
                        value 19;
                        description
                          "Trace general events";
                      }
                      enum "state" {
                        value 20;
                        description
                          "Trace state transitions";
                      }
                      enum "policy" {
                        value 21;
                        description
                          "Trace policy processing";
                      }
                      enum "task" {
                        value 22;
                        description
                          "Trace routing protocol task processing";
                      }
                      enum "timer" {
                        value 23;
                        description
                          "Trace routing protocol timer processing";
                      }
                      enum "all" {
                        value 24;
                        description
                          "Trace everything";
                      }
                    }
                  }
    
                  leaf send {
                    type empty;
                    description
                      "Trace transmitted packets";
                  }
    
                  leaf receive {
                    type empty;
                    description
                      "Trace received packets";
                  }
    
                  leaf detail {
                    type empty;
                    description
                      "Trace detailed information";
                  }
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this trace flag";
                  }
    
                  container filter {
                    presence "enable filter";
                    description
                      "Filter to apply to this flag";
                    uses bgp_filter_obj;
                  }  // container filter
                }  // list flag
              }  // container traceoptions
    
              leaf description {
                type string {
                  length "1 .. 255";
                }
                description "Text description";
              }
    
              container metric-out {
                description
                  "Route metric sent in MED";
                choice metric_param {
                  leaf metric-value {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 4294967295";
                      }
                    }
                    description "Metric value";
                  }
                  container minimum-igp {
                    presence
                      "enable minimum-igp";
                    description
                      "Track the minimum IGP metric";
                    leaf metric-offset {
                      type union {
                        type int32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Metric offset for MED";
                    }
                  }  // container minimum-igp
                  container igp {
                    presence "enable igp";
                    description
                      "Track the IGP metric";
                    leaf metric-offset {
                      type union {
                        type int32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Metric offset for MED";
                    }
    
                    leaf delay-med-update {
                      type empty;
                      description
                        "Delay updating MED when IGP metric increases";
                    }
                  }  // container igp
                  container effective-aigp {
                    presence
                      "enable effective-aigp";
                    description
                      "Track the effective AIGP metric";
                    leaf metric-offset {
                      type union {
                        type int32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Metric offset for MED";
                    }
                  }  // container effective-aigp
                  container minimum-effective-aigp {
                    presence
                      "enable minimum-effective-aigp";
                    description
                      "Track the minimum effective AIGP metric";
                    leaf metric-offset {
                      type union {
                        type int32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Metric offset for MED";
                    }
                  }  // container minimum-effective-aigp
                }  // choice metric_param
              }  // container metric-out
    
              container multihop {
                presence "enable multihop";
                description
                  "Configure an EBGP multihop session";
                uses apply-advanced;
    
                leaf ttl {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "TTL value for the session";
                }
    
                leaf no-nexthop-change {
                  type empty;
                  description
                    "Do not change next hop to self in advertisements";
                }
              }  // container multihop
    
              leaf route-server-client {
                type empty;
                description
                  "Enable route server client behavior";
              }
    
              leaf accept-remote-nexthop {
                type empty;
                description
                  "Allow import policy to specify a non-directly connected next-hop";
              }
    
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value";
              }
    
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Value of LOCAL_PREF path attribute";
              }
    
              leaf local-address {
                type jt:ipaddr;
                description
                  "Address of local end of BGP session";
              }
    
              leaf local-interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Local interface for IPv6 link local EBGP peering";
              }
    
              leaf forwarding-context {
                type string {
                  junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                  junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                }
                description
                  "Routing-instance used for data-forwarding and transport-session";
              }
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 65535";
                  }
                }
                description
                  "Hold time used when negotiating with a peer";
              }
    
              leaf minimum-hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "3 .. 65535";
                  }
                }
                description
                  "Minimum hold time accepted from the peer";
              }
    
              leaf passive {
                type empty;
                description
                  "Do not send open messages to a peer";
              }
    
              leaf advertise-inactive {
                type empty;
                description
                  "Advertise inactive routes";
              }
    
              choice advertise-peer-as-choice {
                leaf advertise-peer-as {
                  type empty;
                  description
                    "Advertise routes received from the same autonomous system";
                }
                leaf no-advertise-peer-as {
                  type empty;
                  description
                    "Don't advertise routes received from the same autonomous system";
                }
              }  // choice advertise-peer-as-choice
    
              container advertise-external {
                presence
                  "enable advertise-external";
                description
                  "Advertise best external routes";
                leaf conditional {
                  type empty;
                  description
                    "Route matches active route upto med-comparison rule";
                }
              }  // container advertise-external
    
              leaf keep {
                type enumeration {
                  enum "all" {
                    value 0;
                    description
                      "Retain all routes";
                  }
                  enum "none" {
                    value 1;
                    description
                      "Retain no routes";
                  }
                }
                description
                  "How to retain routes in the routing table";
              }
    
              leaf rfc6514-compliant-safi129 {
                type empty;
                description
                  "Compliant with RFC6514 SAFI129 format";
              }
    
              leaf no-aggregator-id {
                type empty;
                description
                  "Set router ID in aggregator path attribute to 0";
              }
    
              leaf mtu-discovery {
                type empty;
                description
                  "Enable TCP path MTU discovery";
              }
    
              leaf enforce-first-as {
                type empty;
                description
                  "Enforce first AS in AS-path is the neighbor's AS";
              }
    
              leaf out-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 65535";
                  }
                }
                description
                  "How long before exporting routes from routing table";
              }
    
              leaf ttl {
                junos:must "((!(".. .. type internal") && !(".. multihop")))";
                junos:must-message "This option is valid only for single-hop EBGP neighbor";
                type enumeration {
                  enum "1" {
                    value 0;
                  }
                  enum "255" {
                    value 1;
                  }
                }
                description
                  "TTL value for the single-hop peer";
              }
    
              leaf log-updown {
                type empty;
                description
                  "Log a message for peer state transitions";
              }
    
              leaf damping {
                type empty;
                description
                  "Enable route flap damping";
              }
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description "Import policy";
              }
    
              leaf-list nlri {
                type enumeration {
                  enum "unicast" {
                    value 0;
                    status deprecated;
                    description
                      "Include unicast NLRI";
                  }
                  enum "multicast" {
                    value 1;
                    status deprecated;
                    description
                      "Include multicast NLRI";
                  }
                  enum "any" {
                    value 2;
                    status deprecated;
                    description
                      "Include any kind of NLRI";
                  }
                }
                ordered-by user;
                status deprecated;
                description
                  "NLRI type to include in updates";
              }
    
              container bgp-error-tolerance {
                presence
                  "enable bgp-error-tolerance";
                description
                  "Handle BGP malformed updates softly";
                uses apply-advanced;
    
                leaf malformed-update-log-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "10 .. 65535";
                    }
                  }
                  units "seconds";
                  default "300";
                  description
                    "Time used when logging malformed update";
                }
    
                choice malformed-routes-limit-choice {
                  leaf malformed-route-limit {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 4294967295";
                      }
                    }
                    default "1000";
                    description
                      "Maximum number of malformed routes from a peer";
                  }
                  leaf no-malformed-route-limit {
                    type empty;
                    description
                      "No malformed route limit";
                  }
                }  // choice malformed-routes-limit-choice
              }  // container bgp-error-tolerance
    
              container family {
                description
                  "Protocol family for NLRIs in updates";
                uses apply-advanced;
    
                container inet {
                  description
                    "IPv4 NLRI parameters";
                  uses apply-advanced;
    
                  container labeled-unicast {
                    presence
                      "enable labeled-unicast";
                    description
                      "Include labeled unicast NLRI";
                    uses bgp-afi-labeled;
                  }  // container labeled-unicast
    
                  container segment-routing-te {
                    presence
                      "enable segment-routing-te";
                    description
                      "Include segment-routing TE policy";
                    uses bgp-afi-srte;
                  }  // container segment-routing-te
    
                  container transport {
                    presence "enable transport";
                    description
                      "Include Classful Transport NLRI";
                    uses bgp-afi-inet-transport;
                  }  // container transport
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-topo;
                  }  // container unicast
    
                  container multicast {
                    presence "enable multicast";
                    description
                      "Include multicast NLRI";
                    uses bgp-afi-default;
                  }  // container multicast
    
                  container flow {
                    presence "enable flow";
                    description
                      "Include flow NLRI";
                    uses bgp-afi-flow-with-redirect-ip-action;
                  }  // container flow
    
                  container any {
                    presence "enable any";
                    description
                      "Include unicast or multicast NLRI";
                    uses bgp-afi-default;
                  }  // container any
                }  // container inet
    
                container inet-vpn {
                  description
                    "IPv4 Layer 3 VPN NLRI parameters";
                  uses apply-advanced;
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-l3vpn;
                  }  // container unicast
    
                  container multicast {
                    presence "enable multicast";
                    description
                      "Include multicast NLRI";
                    uses bgp-afi-vpn;
                  }  // container multicast
    
                  container flow {
                    presence "enable flow";
                    description
                      "Include flow VPN NLRI";
                    uses bgp-afi-flow-with-redirect-ip-action;
                  }  // container flow
    
                  container any {
                    presence "enable any";
                    description
                      "Include unicast or multicast NLRI";
                    uses bgp-afi-vpn;
                  }  // container any
                }  // container inet-vpn
    
                container inet6 {
                  description
                    "IPv6 NLRI parameters";
                  uses apply-advanced;
    
                  container labeled-unicast {
                    presence
                      "enable labeled-unicast";
                    description
                      "Include labeled unicast NLRI";
                    uses bgp-afi-inet6-labeled;
                  }  // container labeled-unicast
    
                  container segment-routing-te {
                    presence
                      "enable segment-routing-te";
                    description
                      "Include segment-routing TE policy";
                    uses bgp-afi-srte;
                  }  // container segment-routing-te
    
                  container transport {
                    presence "enable transport";
                    description
                      "Include Classful Transport NLRI";
                    uses bgp-afi-inet6-transport;
                  }  // container transport
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-topo;
                  }  // container unicast
    
                  container multicast {
                    presence "enable multicast";
                    description
                      "Include multicast NLRI";
                    uses bgp-afi-default;
                  }  // container multicast
    
                  container flow {
                    presence "enable flow";
                    description
                      "Include flow NLRI";
                    uses bgp-afi-flow;
                  }  // container flow
    
                  container any {
                    presence "enable any";
                    description
                      "Include unicast or multicast NLRI";
                    uses bgp-afi-default;
                  }  // container any
                }  // container inet6
    
                container inet6-vpn {
                  description
                    "IPv6 Layer 3 VPN NLRI parameters";
                  uses apply-advanced;
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-l3vpn;
                  }  // container unicast
    
                  container multicast {
                    presence "enable multicast";
                    description
                      "Include multicast NLRI";
                    uses bgp-afi-vpn;
                  }  // container multicast
    
                  container flow {
                    presence "enable flow";
                    description
                      "Include flow VPN NLRI";
                    uses bgp-afi-flow;
                  }  // container flow
    
                  container any {
                    presence "enable any";
                    description
                      "Include unicast or multicast NLRI";
                    uses bgp-afi-vpn;
                  }  // container any
                }  // container inet6-vpn
    
                container iso-vpn {
                  description
                    "ISO Layer 3 VPN NLRI parameters";
                  uses apply-advanced;
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-vpn-protection;
                  }  // container unicast
                }  // container iso-vpn
    
                container l2vpn {
                  description
                    "MPLS-based Layer 2 VPN and VPLS NLRI parameters";
                  uses apply-advanced;
    
                  container auto-discovery-only {
                    presence
                      "enable auto-discovery-only";
                    description
                      "Include auto-discovery NLRI for LDP Layer 2 VPN and VPLS";
                    uses bgp-afi-default;
                  }  // container auto-discovery-only
    
                  container auto-discovery-mspw {
                    presence
                      "enable auto-discovery-mspw";
                    description
                      "Include auto-discovery NLRI for LDP Signalled MultiSegment PW";
                    uses bgp-afi-default;
                  }  // container auto-discovery-mspw
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include Layer 2 VPN and VPLS signaling NLRI";
                    uses bgp-afi-l2vpn;
                  }  // container signaling
                }  // container l2vpn
    
                container evpn {
                  description
                    "EVPN NLRI parameters";
                  uses apply-advanced;
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include EVPN signaling NLRI";
                    uses bgp-afi-default;
                  }  // container signaling
                }  // container evpn
    
                container inet-mvpn {
                  description
                    "IPv4 MVPN NLRI parameters";
                  uses apply-advanced;
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include IPv4 multicast VPN signaling NLRI";
                    uses bgp-afi-default;
                  }  // container signaling
                }  // container inet-mvpn
    
                container inet6-mvpn {
                  description
                    "IPv6 MVPN NLRI parameters";
                  uses apply-advanced;
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include IPv6 multicast VPN signaling NLRI";
                    uses bgp-afi-default;
                  }  // container signaling
                }  // container inet6-mvpn
    
                container inet-mdt {
                  description
                    "IPv4 Multicast Distribution Tree (MDT) NLRI parameters";
                  uses apply-advanced;
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include IPv4 multicast VPN auto-discovery NLRI";
                    uses bgp-afi-default;
                  }  // container signaling
                }  // container inet-mdt
    
                container traffic-engineering {
                  description
                    "Traffic Engineering (BGP-TE) NLRI parameters";
                  uses apply-advanced;
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include BGP-TE NLRI";
                    uses bgp-afi-default;
                  }  // container unicast
                }  // container traffic-engineering
    
                container route-target {
                  presence "enable route-target";
                  description
                    "Route target NLRI used for VPN route filtering";
                  uses apply-advanced;
    
                  container prefix-limit {
                    description
                      "Limit maximum number of prefixes from a peer";
                    uses bgpaf-prefix-limit;
                  }  // container prefix-limit
    
                  container accepted-prefix-limit {
                    description
                      "Limit maximum number of prefixes accepted from a peer";
                    uses bgpaf-accepted-prefix-limit;
                  }  // container accepted-prefix-limit
    
                  container proxy-generate {
                    presence
                      "enable proxy-generate";
                    description
                      "Generate route target NLRI for peers that don't support it";
                    uses apply-advanced;
    
                    leaf-list route-target-policy {
                      type jt:policy-algebra;
                      ordered-by user;
                      description
                        "Limit VPN routes that are used to generate proxy route-target filters";
                    }
                  }  // container proxy-generate
    
                  leaf external-paths {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 256";
                      }
                    }
                    description
                      "Number of external paths accepted for route filtering";
                  }
    
                  leaf advertise-default {
                    type empty;
                    description
                      "Advertise default and suppress more specific routes";
                  }
    
                  leaf damping {
                    type empty;
                    description
                      "Enable route flap damping";
                  }
    
                  container graceful-restart {
                    description
                      "BGP graceful restart options";
                    uses bgp-af-gr;
                  }  // container graceful-restart
    
                  leaf local-ipv4-address {
                    type jt:ipv4addr;
                    description
                      "Local IPv4 address";
                  }
    
                  container output-queue-priority {
                    description
                      "Default output-queue to assign updates to";
                    uses bgp-output-queue-priority-class;
                  }  // container output-queue-priority
    
                  container route-refresh-priority {
                    description
                      "Default output-queue to assign route refreshes to";
                    uses bgp-output-queue-priority-class;
                  }  // container route-refresh-priority
    
                  container withdraw-priority {
                    description
                      "Default output-queue to assign withdrawn routes to";
                    uses bgp-output-queue-priority-class;
                  }  // container withdraw-priority
                }  // container route-target
    
                container inet-bgpmcast {
                  description
                    "IPv4 BGPMCAST NLRI parameters";
                  uses apply-advanced;
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include IPv4 BGP multicast signaling NLRI";
                    uses bgp-afi-default;
                  }  // container signaling
                }  // container inet-bgpmcast
    
                container inet6-bgpmcast {
                  description
                    "IPv6 BGPMCAST NLRI parameters";
                  uses apply-advanced;
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include IPv6 BGP multicast signaling NLRI";
                    uses bgp-afi-default;
                  }  // container signaling
                }  // container inet6-bgpmcast
              }  // container family
    
              leaf authentication-key {
                type string {
                  length "1 .. 126";
                }
                description
                  "MD5 authentication key";
              }
    
              leaf authentication-algorithm {
                junos:must "(".. authentication-key-chain")";
                junos:must-message "May not be configured without authentication-key-chain";
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "md5" {
                    value 0;
                    description
                      "Message Digest 5";
                  }
                  enum "hmac-sha-1-96" {
                    value 1;
                    description
                      "Hash-based Message Authentication Code (SHA1) (96 bits)";
                  }
                  enum "aes-128-cmac-96" {
                    value 2;
                    description
                      "Cipher-based Message Authentication Code (AES128) (96 bits)";
                  }
                  enum "ao" {
                    value 3;
                    description
                      "TCP Authentication Option";
                  }
                }
                description
                  "Authentication algorithm name";
              }
    
              leaf tcpao-handling-with-digest-mismatch {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "drop-if-no-tcpao" {
                    value 0;
                    description
                      "Drop the connection if Digest mismatched";
                  }
                  enum "allow-without-tcpao" {
                    value 1;
                    description
                      "Allow the connection establishment without TCP-AO";
                  }
                }
                description
                  "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
              }
    
              leaf authentication-key-chain {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string {
                  length "1 .. 128";
                }
                description "Key chain name";
              }
    
              leaf-list export {
                type jt:policy-algebra;
                ordered-by user;
                description "Export policy";
              }
    
              container remove-private {
                presence "enable remove-private";
                description
                  "Remove well-known private AS numbers";
                uses apply-advanced;
    
                container all {
                  presence "enable all";
                  description
                    "Remove all private AS numbers and do not stop at the first public AS number";
                  container replace {
                    presence "enable replace";
                    description
                      "Replace private AS numbers with the BGP Group's local AS number";
                    leaf nearest {
                      type empty;
                      description
                        "Use closest public AS number to replace a private AS number";
                    }
                  }  // container replace
                }  // container all
    
                leaf no-peer-loop-check {
                  type empty;
                  description
                    "Remove peer loop-check";
                }
              }  // container remove-private
    
              leaf cluster {
                type jt:areaid;
                description "Cluster identifier";
              }
    
              leaf no-client-reflect {
                type empty;
                description
                  "Disable intracluster route redistribution";
              }
    
              leaf peer-as {
                type string {
                  junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                  junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                }
                description
                  " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
              }
    
              container local-as {
                description
                  "Local autonomous system number";
                leaf as-number {
                  type string {
                    junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                    junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                  }
                  description
                    " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                }
    
                leaf loops {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type int32 {
                      range "1 .. 10";
                    }
                  }
                  description
                    "Maximum number of times this AS can be in an AS path";
                }
    
                leaf private {
                  type empty;
                  description
                    "Hide this local AS in paths learned from this peering";
                }
    
                leaf alias {
                  type empty;
                  description
                    "Treat this AS as an alias to the system AS";
                }
    
                leaf no-prepend-global-as {
                  type empty;
                  description
                    "Do not prepend global autonomous-system number in advertised paths";
                }
              }  // container local-as
    
              leaf ipsec-sa {
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec Security Association must be defined";
                type string {
                  length "1 .. 32";
                }
                description "IPSec SA name";
              }
    
              container graceful-shutdown {
                description
                  "BGP peer graceful shutdown option";
                uses apply-advanced;
    
                container receiver {
                  presence "enable receiver";
                  description
                    "BGP peer graceful-shutdown receiver";
                  uses apply-advanced;
    
                  leaf disable {
                    junos:must "(!(".. .. sender"))";
                    junos:must-message "Receiver cannot be disabled on Sender";
                    type empty;
                    description
                      "Disable graceful-shutdown receiver";
                  }
    
                  leaf local-preference {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Value of receiver LOCAL_PREF path attribute";
                  }
                }  // container receiver
    
                container sender {
                  presence "enable sender";
                  description
                    "BGP peer graceful-shutdown sender";
                  uses apply-advanced;
    
                  leaf local-preference {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Value of sender LOCAL_PREF path attribute";
                  }
                }  // container sender
              }  // container graceful-shutdown
    
              container shutdown {
                presence "enable shutdown";
                description "Shutdown";
                uses apply-advanced;
    
                leaf notify-message {
                  type string;
                  description
                    "Notification message";
                }
              }  // container shutdown
    
              leaf unconfigured-peer-graceful-restart {
                junos:must "(".. graceful-restart")";
                junos:must-message "unconfigured-peer-graceful-restart is only valid with 'graceful-restart'";
                type empty;
                description
                  "BGP unconfigured peer graceful restart options";
              }
    
              container graceful-restart {
                presence
                  "enable graceful-restart";
                description
                  "BGP graceful restart options";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable graceful restart";
                  }
                }  // choice enable-disable
    
                leaf restart-time {
                  junos:must "(("routing-options graceful-restart" || "fabric routing-options graceful-restart"))";
                  junos:must-message "restart-time is only valid with 'routing-options graceful-restart'";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1800";
                    }
                  }
                  description
                    "Restart time used when negotiating with a peer";
                }
    
                leaf stale-routes-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1800";
                    }
                  }
                  description
                    "Maximum time for which stale routes are kept";
                }
    
                container long-lived {
                  description
                    "Long-lived graceful restart options";
                  uses apply-advanced;
    
                  container receiver {
                    description
                      "Long-lived graceful restart receiver (helper) options";
                    uses apply-advanced;
    
                    choice enable-disable {
                      leaf disable {
                        type empty;
                        description
                          "Disable receiver (helper) functionality";
                      }
                    }  // choice enable-disable
                  }  // container receiver
    
                  container advertise-to-non-llgr-neighbor {
                    presence
                      "enable advertise-to-non-llgr-neighbor";
                    description
                      "Advertise stale routes to non-LLGR neighbors";
                    uses apply-advanced;
    
                    leaf omit-no-export {
                      type empty;
                      description
                        "Do not attach no-export community to stale routes";
                    }
                  }  // container advertise-to-non-llgr-neighbor
                }  // container long-lived
    
                leaf disable-notification-extensions {
                  type empty;
                  description
                    "Disable notification extensions";
                }
    
                leaf forwarding-state-bit {
                  type enumeration {
                    enum "as-rr-client" {
                      value 0;
                      description
                        "As for a route reflector client";
                    }
                    enum "from-fib" {
                      value 1;
                      description
                        "Always use state of associated FIB(s)";
                    }
                  }
                  description
                    "Control forwarding-state flag negotiation";
                }
    
                leaf dont-help-shared-fate-bfd-down {
                  type empty;
                  description
                    "Honor BFD-Down(C=0) if GR-restart not in progress";
                }
              }  // container graceful-restart
    
              leaf include-mp-next-hop {
                type empty;
                description
                  "Include NEXT-HOP attribute in multiprotocol updates";
              }
    
              leaf disable-4byte-as {
                type empty;
                description
                  "Disable 4 byte AS capability advertisement";
              }
    
              container idle-after-switch-over {
                description
                  "Stop peer session from coming up after nonstop-routing switch-over";
                choice idle-interval {
                  leaf forever {
                    type empty;
                    description
                      "Idle the peer until the user intervenes";
                  }
                  leaf timeout {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    description
                      "Timeout value, in seconds, for starting peer after switch over";
                  }
                }  // choice idle-interval
              }  // container idle-after-switch-over
    
              container outbound-route-filter {
                junos:must "(!("system processes routing bgp update-threading"))";
                junos:must-message "Can't be configured together with update-threading";
                description
                  "Dynamically negotiated cooperative route filtering";
                uses apply-advanced;
    
                leaf bgp-orf-cisco-mode {
                  type empty;
                  description
                    "Using BGP ORF capability code 130 and Prefix ORF type 128";
                }
    
                container extended-community {
                  status deprecated;
                  description
                    "Extended community filtering";
                  uses apply-advanced;
    
                  choice accept-choice {
                    leaf accept {
                      type empty;
                      description
                        "Honor remote requests for extended community ORF";
                    }
                    leaf no-accept {
                      type empty;
                      description
                        "Don't honor remote requests for extended community ORF";
                    }
                  }  // choice accept-choice
    
                  leaf vrf-filter {
                    type empty;
                    description
                      "Request remote filtering using locally configured VRF import targets";
                  }
                }  // container extended-community
    
                container prefix-based {
                  presence "enable prefix-based";
                  description
                    "Prefix-based outbound route filtering";
                  uses apply-advanced;
    
                  container accept {
                    presence "enable accept";
                    description
                      "Honor Prefix-based ORFs from remote peers";
                    uses apply-advanced;
    
                    leaf inet {
                      type empty;
                      description
                        "Honor IPv4 prefix filters";
                    }
    
                    leaf inet6 {
                      type empty;
                      description
                        "Honor IPv6 prefix filters";
                    }
                  }  // container accept
                }  // container prefix-based
              }  // container outbound-route-filter
    
              container message-batching {
                status deprecated;
                description
                  "DEPRECATED - Batching of outgoing messages";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf enable {
                    type empty;
                    description
                      "Enable parameter";
                  }
                  leaf disable {
                    type empty;
                    description
                      "Disable parameter";
                  }
                }  // choice enable-disable
    
                leaf interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "100 .. 1000";
                    }
                  }
                  units "milliseconds";
                  default "250";
                  description
                    "DEPRECATED - Interval over which to batch messages";
                }
              }  // container message-batching
    
              container multipath {
                presence "enable multipath";
                description
                  "Allow load sharing among multiple BGP paths";
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable Multipath";
                }
    
                leaf multiple-as {
                  type empty;
                  description
                    "Use paths received from different ASs";
                }
    
                leaf allow-protection {
                  type empty;
                  description
                    "Allow protection for multipath legs";
                }
    
                leaf pause-computation-during-churn {
                  type empty;
                  description
                    "Pause multipath job to absorb churn";
                }
    
                leaf list-nexthop {
                  type empty;
                  description
                    "Use List-NH for homogenous nexthop-set also";
                }
              }  // container multipath
    
              leaf tcp-mss {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4096";
                  }
                }
                description
                  "Maximum TCP segment size";
              }
    
              leaf bgp-identifier {
                type jt:ipv4addr;
                description "BGP Identifier";
              }
    
              leaf tcp-aggressive-transmission {
                type empty;
                description
                  "Enable aggressive transmission of pure TCP ACKs and retransmissions";
              }
    
              container bmp {
                description
                  "Specific settings to override the routing-options settings";
                uses apply-advanced;
    
                leaf monitor {
                  type enumeration {
                    enum "enable" {
                      value 0;
                      description
                        "Enable monitoring of BGP peer(s)";
                    }
                    enum "disable" {
                      value 1;
                      description
                        "Disable monitoring of BGP peer(s)";
                    }
                  }
                  description
                    "Enable/Disable monitoring";
                }
    
                container route-monitoring {
                  description
                    "Control route monitoring settings";
                  uses apply-advanced;
    
                  leaf none {
                    junos:must "((!(".. pre-policy") && (!(".. post-policy") && !(".. rib-out"))))";
                    junos:must-message "May not be configured with pre-policy or post-policy or rib-out";
                    type empty;
                    description
                      "Do not send route monitoring messages";
                  }
    
                  container pre-policy {
                    presence "enable pre-policy";
                    description
                      "Send pre-policy route monitoring messages";
                    leaf exclude-non-feasible {
                      type empty;
                      description
                        "Exclude looped routes, etc";
                    }
                  }  // container pre-policy
    
                  container post-policy {
                    presence
                      "enable post-policy";
                    description
                      "Send post-policy route monitoring messages";
                    leaf exclude-non-eligible {
                      type empty;
                      description
                        "Exclude unresolved routes, etc.";
                    }
                  }  // container post-policy
    
                  container rib-out {
                    junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                    junos:must-message "Update threading can't be configured together with bmp rib-out monitoring";
                    presence "enable rib-out";
                    description
                      "Send adj-ribs-out route monitoring messages";
                    leaf pre-policy {
                      type empty;
                      description
                        "Send pre-policy adj-ribs-out route monitoring messages";
                    }
    
                    leaf post-policy {
                      type empty;
                      description
                        "Send post-policy adj-ribs-out route monitoring messages";
                    }
                  }  // container rib-out
                }  // container route-monitoring
              }  // container bmp
    
              container advertise-bgp-static {
                presence
                  "enable advertise-bgp-static";
                description
                  "Advertise bgp-static routes";
                uses apply-advanced;
    
                leaf-list policy {
                  type jt:policy-algebra;
                  ordered-by user;
                  description
                    "Static route advertisement policy";
                }
              }  // container advertise-bgp-static
    
              leaf add-path-display-ipv4-address {
                type empty;
                description
                  "Display add-path path-id in IPv4 address format";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
    
                leaf session-mode {
                  type enumeration {
                    enum "automatic" {
                      value 0;
                      description
                        "Choose session-mode automatically";
                    }
                    enum "single-hop" {
                      value 1;
                      description
                        "Use single-hop";
                    }
                    enum "multihop" {
                      value 2;
                      description "Use multihop";
                    }
                  }
                  default "automatic";
                  description
                    "BFD single-hop or multihop session-mode";
                }
    
                leaf holddown-interval {
                  junos:must "(!(".. .. .. type internal"))";
                  junos:must-message "bfd holddown-interval is only valid for EBGP.";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to hold the session-UP notification to the client";
                }
              }  // container bfd-liveness-detection
    
              leaf as-override {
                type empty;
                description
                  "Replace neighbor AS number with our AS number";
              }
    
              container egress-te-node-segment {
                description
                  "Configure BGP-Peer-Node segment";
                uses apply-advanced;
    
                container label {
                  description
                    "BGP-Peer-Node SID label from static label pool";
                  uses apply-advanced;
    
                  leaf label-value {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "16 .. 1048575";
                      }
                    }
                    description
                      "BGP-Peer-Node SID label value from static label pool";
                  }
                }  // container label
    
                container egress-te-set {
                  description
                    "Configure as a member of a SET segment";
                  uses apply-advanced;
    
                  leaf set-name {
                    junos:must "("protocols bgp egress-te-set-segment $$")";
                    junos:must-message "protocols bgp egress-te-set-segment not configured";
                    type string {
                      junos:posix-pattern "^.{1,64}$";
                      junos:pattern-message "Must be a string of 64 characters or less";
                    }
                    description "Set name";
                  }
    
                  leaf weight {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    description
                      "Weight for set segment";
                  }
                }  // container egress-te-set
    
                container egress-te-backup-segment {
                  description
                    "Backup segment for FRR";
                  uses apply-advanced;
    
                  container label {
                    description
                      "Backup segment label from static label pool";
                    uses apply-advanced;
    
                    leaf label-value {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Backup segment label value from static label pool";
                    }
                  }  // container label
                }  // container egress-te-backup-segment
    
                container egress-te-backup-ip-forward {
                  presence
                    "enable egress-te-backup-ip-forward";
                  description
                    "Use IP-forward backup path for Egress TE";
                  uses apply-advanced;
    
                  leaf instance-name {
                    type string {
                      junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                      junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                    }
                    description
                      "Routing-instance to use as IP forward backup-path";
                  }
                }  // container egress-te-backup-ip-forward
              }  // container egress-te-node-segment
    
              list egress-te-adj-segment {
                key "name";
                description
                  "Configure BGP-Peer-Adj segment";
                leaf name {
                  type string {
                    junos:posix-pattern "^.{1,64}$";
                    junos:pattern-message "Must be a string of 64 characters or less";
                  }
                  description
                    "The BGP-Adj-Set segment name";
                }
    
                uses apply-advanced;
    
                container label {
                  junos:must "(".. next-hop")";
                  junos:must-message "The 'egress-te-adj-segment next-hop' must be configured";
                  description
                    "BGP-Peer-Adj SID label from static label pool";
                  uses apply-advanced;
    
                  leaf label-value {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "16 .. 1048575";
                      }
                    }
                    description
                      "BGP-Peer-Adj SID label value from static label pool";
                  }
                }  // container label
    
                container next-hop {
                  junos:must "(".. label")";
                  junos:must-message "The 'egress-te-adj-segment label' must be configured";
                  description
                    "Address of directly connected next-hop to use";
                  uses apply-advanced;
    
                  leaf next-hop-addr {
                    type jt:ipaddr;
                    description
                      "Address of directly connected next-hop";
                  }
                }  // container next-hop
    
                container egress-te-set {
                  description
                    "Configure as a member of a SET segment";
                  uses apply-advanced;
    
                  leaf set-name {
                    junos:must "("protocols bgp egress-te-set-segment $$")";
                    junos:must-message "protocols bgp egress-te-set-segment not configured";
                    type string {
                      junos:posix-pattern "^.{1,64}$";
                      junos:pattern-message "Must be a string of 64 characters or less";
                    }
                    description "Set name";
                  }
    
                  leaf weight {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    description
                      "Weight for set segment";
                  }
                }  // container egress-te-set
    
                container egress-te-backup-segment {
                  description
                    "Backup segment for FRR";
                  uses apply-advanced;
    
                  container label {
                    description
                      "Backup segment label from static label pool";
                    uses apply-advanced;
    
                    leaf label-value {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Backup segment label value from static label pool";
                    }
                  }  // container label
                }  // container egress-te-backup-segment
    
                container egress-te-backup-ip-forward {
                  presence
                    "enable egress-te-backup-ip-forward";
                  description
                    "Use IP-forward backup path for Egress TE";
                  uses apply-advanced;
    
                  leaf instance-name {
                    type string {
                      junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                      junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                    }
                    description
                      "Routing-instance to use as IP forward backup-path";
                  }
                }  // container egress-te-backup-ip-forward
    
                container te-link-attribute {
                  presence
                    "enable te-link-attribute";
                  description "Link attribute";
                  uses apply-advanced;
    
                  leaf te-metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    default "1";
                    description
                      "TE Metric value";
                  }
    
                  leaf igp-metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 16777215";
                      }
                    }
                    default "1";
                    description
                      "IGP Metric value";
                  }
    
                  leaf-list admin-group {
                    type string;
                    max-elements 16;
                    ordered-by user;
                    description
                      "Administrative groups";
                  }
                }  // container te-link-attribute
              }  // list egress-te-adj-segment
    
              leaf vpn-apply-export {
                type empty;
                description
                  "Apply BGP export policy when exporting VPN routes";
              }
    
              container egress-te {
                presence "enable egress-te";
                description
                  "Use Egress Peering traffic engineering";
                uses apply-advanced;
    
                leaf install-address {
                  type jt:ipaddr;
                  description
                    "Address to use in egress-te created inet route";
                }
    
                container rib {
                  description
                    "Select primary table for Egress-TE routes";
                  uses apply-advanced;
    
                  leaf inet.0 {
                    type empty;
                    description
                      "Install Egress-TE routes in inet.0";
                  }
    
                  leaf inet6.0 {
                    type empty;
                    description
                      "Install Egress-TE routes in inet6.0";
                  }
                }  // container rib
    
                leaf no-install {
                  type empty;
                  description
                    "Avoid installation to FIB or resolving over";
                }
    
                leaf-list import {
                  type jt:policy-algebra;
                  ordered-by user;
                  description
                    "Import policy to set attributes";
                }
    
                leaf backup-path {
                  junos:must "("protocols bgp egress-te-backup-paths template $$")";
                  junos:must-message "bgp egress-te-backup-paths template not configured";
                  type string {
                    junos:posix-pattern "^.{1,64}$";
                    junos:pattern-message "Must be a string of 64 characters or less";
                  }
                  description
                    "The 'egress-te-backup-paths template' to use for this peer";
                }
              }  // container egress-te
    
              leaf advertise-prefix-sid {
                type empty;
                description
                  "Advertise prefix sid to E-BGP peers";
              }
    
              leaf accept-prefix-sid {
                type empty;
                description
                  "Accept prefix sid from E-BGP peers";
              }
    
              leaf advertise-srgb {
                type empty;
                description "Advertise SRGB TLV";
              }
            }  // list neighbor
    
            leaf vpn-apply-export {
              type empty;
              description
                "Apply BGP export policy when exporting VPN routes";
            }
    
            container egress-te {
              presence "enable egress-te";
              description
                "Use Egress Peering traffic engineering";
              uses apply-advanced;
    
              leaf install-address {
                type jt:ipaddr;
                description
                  "Address to use in egress-te created inet route";
              }
    
              container rib {
                description
                  "Select primary table for Egress-TE routes";
                uses apply-advanced;
    
                leaf inet.0 {
                  type empty;
                  description
                    "Install Egress-TE routes in inet.0";
                }
    
                leaf inet6.0 {
                  type empty;
                  description
                    "Install Egress-TE routes in inet6.0";
                }
              }  // container rib
    
              leaf no-install {
                type empty;
                description
                  "Avoid installation to FIB or resolving over";
              }
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy to set attributes";
              }
    
              leaf backup-path {
                junos:must "("protocols bgp egress-te-backup-paths template $$")";
                junos:must-message "bgp egress-te-backup-paths template not configured";
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of 64 characters or less";
                }
                description
                  "The 'egress-te-backup-paths template' to use for this peer";
              }
            }  // container egress-te
    
            leaf advertise-prefix-sid {
              type empty;
              description
                "Advertise prefix sid to E-BGP peers";
            }
    
            leaf accept-prefix-sid {
              type empty;
              description
                "Accept prefix sid from E-BGP peers";
            }
    
            leaf advertise-srgb {
              type empty;
              description "Advertise SRGB TLV";
            }
          }  // list group
    
          container traffic-statistics-labeled-path {
            presence
              "enable traffic-statistics-labeled-path";
            description
              "Collect periodic ingress labeled statistics for BGP label-switched paths ";
            uses apply-advanced;
    
            container file {
              description
                "Statistics file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            leaf interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "60 .. 65535";
                }
              }
              units "seconds";
              description
                "Time interval to collect statistics";
            }
          }  // container traffic-statistics-labeled-path
    
          container source-packet-routing {
            description
              "Enable Source Packet Routing (SPRING)";
            uses apply-advanced;
    
            container srgb {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              junos:must "(".. .. .. .. protocols mpls ")";
              junos:must-message "SPRING configuration is not allowed without 'protocols mpls'";
              description
                "Set the SRGB global block in SPRING";
              leaf start-label {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Start range for SRGB label block";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Index to the SRGB start label block";
              }
            }  // container srgb
    
            container srv6 {
              description
                "Enable IPv6 Segment Routing (SRv6)";
              uses apply-advanced;
    
              list locator {
                key "name";
                ordered-by user;
                description "SRv6 Locator";
                leaf name {
                  junos:must "("routing-options source-packet-routing srv6 locator $$")";
                  junos:must-message "Referenced srv6 locator must be defined";
                  type string;
                  description "Locator name";
                }
    
                uses apply-advanced;
    
                leaf end-dt4-sid {
                  type jt:ipv6addr;
                  description
                    "End dt4 sid with 128 bit address";
                }
    
                leaf end-dt6-sid {
                  type jt:ipv6addr;
                  description
                    "End dt6 sid with 128 bit address";
                }
              }  // list locator
            }  // container srv6
          }  // container source-packet-routing
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable BGP";
            }
          }  // choice enable-disable
    
          choice precision-timers-choice {
            leaf precision-timers {
              type empty;
              description
                "Use precision timers for scheduling keepalives";
            }
            leaf no-precision-timers {
              type empty;
              description
                "Don't use precision timers for scheduling keepalives";
            }
          }  // choice precision-timers-choice
    
          container snmp-options {
            description
              "Customize SNMP behaviors specifically for BGP MIBs";
            uses apply-advanced;
    
            leaf backward-traps-only-from-established {
              type empty;
              description
                "Limit traps for backward transitions to only those moving from Established state.";
            }
    
            leaf emit-inet-address-length-in-oid {
              type empty;
              description
                "Emit Length in OID for InetAddress MIB type.";
            }
          }  // container snmp-options
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          leaf prioritize-route-queueing {
            type empty;
            description
              "Let route-queue building happen without getting throttled";
          }
    
          container traceoptions {
            description "Trace options for BGP";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "damping" {
                    value 0;
                    description
                      "Trace BGP damping information";
                  }
                  enum "packets" {
                    value 1;
                    description
                      "Trace all BGP protocol packets";
                  }
                  enum "open" {
                    value 2;
                    description
                      "Trace BGP open packets";
                  }
                  enum "update" {
                    value 3;
                    description
                      "Trace BGP update packets";
                  }
                  enum "keepalive" {
                    value 4;
                    description
                      "Trace BGP keepalive packets";
                  }
                  enum "refresh" {
                    value 5;
                    description
                      "Trace BGP refresh packets";
                  }
                  enum "nsr-synchronization" {
                    value 6;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "bfd" {
                    value 7;
                    description
                      "Trace BFD events";
                  }
                  enum "4byte-as" {
                    value 8;
                    description
                      "Trace 4 byte AS events";
                  }
                  enum "add-path" {
                    value 9;
                    description
                      "Trace add-path events";
                  }
                  enum "graceful-restart" {
                    value 10;
                    description
                      "Trace Graceful Restart events";
                  }
                  enum "egress-te" {
                    value 11;
                    description
                      "Egress Peering Traffic-Engineering events";
                  }
                  enum "thread-io" {
                    value 12;
                    description
                      "Trace threaded I/O processing";
                  }
                  enum "sharding" {
                    value 13;
                    description
                      "Trace BGP rib sharding";
                  }
                  enum "thread-update-io" {
                    value 14;
                    description
                      "Trace threaded update I/O processing";
                  }
                  enum "route-validation" {
                    value 15;
                    description
                      "Trace route validation";
                  }
                  enum "ipsec" {
                    value 16;
                    description "Trace ipsec";
                  }
                  enum "route" {
                    value 17;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 18;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 19;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 20;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 21;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 22;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 23;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 24;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
    
              container filter {
                presence "enable filter";
                description
                  "Filter to apply to this flag";
                uses bgp_filter_obj;
              }  // container filter
            }  // list flag
          }  // container traceoptions
    
          leaf description {
            type string {
              length "1 .. 255";
            }
            description "Text description";
          }
    
          container metric-out {
            description
              "Route metric sent in MED";
            choice metric_param {
              leaf metric-value {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 4294967295";
                  }
                }
                description "Metric value";
              }
              container minimum-igp {
                presence "enable minimum-igp";
                description
                  "Track the minimum IGP metric";
                leaf metric-offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-igp
              container igp {
                presence "enable igp";
                description
                  "Track the IGP metric";
                leaf metric-offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
    
                leaf delay-med-update {
                  type empty;
                  description
                    "Delay updating MED when IGP metric increases";
                }
              }  // container igp
              container effective-aigp {
                presence "enable effective-aigp";
                description
                  "Track the effective AIGP metric";
                leaf metric-offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container effective-aigp
              container minimum-effective-aigp {
                presence
                  "enable minimum-effective-aigp";
                description
                  "Track the minimum effective AIGP metric";
                leaf metric-offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-effective-aigp
            }  // choice metric_param
          }  // container metric-out
    
          container multihop {
            presence "enable multihop";
            description
              "Configure an EBGP multihop session";
            uses apply-advanced;
    
            leaf ttl {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 255";
                }
              }
              description
                "TTL value for the session";
            }
    
            leaf no-nexthop-change {
              type empty;
              description
                "Do not change next hop to self in advertisements";
            }
          }  // container multihop
    
          leaf route-server-client {
            type empty;
            description
              "Enable route server client behavior";
          }
    
          leaf accept-remote-nexthop {
            type empty;
            description
              "Allow import policy to specify a non-directly connected next-hop";
          }
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Preference value";
          }
    
          leaf local-preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Value of LOCAL_PREF path attribute";
          }
    
          leaf local-address {
            type jt:ipaddr;
            description
              "Address of local end of BGP session";
          }
    
          leaf local-interface {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Local interface for IPv6 link local EBGP peering";
          }
    
          leaf forwarding-context {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description
              "Routing-instance used for data-forwarding and transport-session";
          }
    
          leaf hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 65535";
              }
            }
            description
              "Hold time used when negotiating with a peer";
          }
    
          leaf minimum-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "3 .. 65535";
              }
            }
            description
              "Minimum hold time accepted from the peer";
          }
    
          leaf passive {
            type empty;
            description
              "Do not send open messages to a peer";
          }
    
          leaf advertise-inactive {
            type empty;
            description
              "Advertise inactive routes";
          }
    
          choice advertise-peer-as-choice {
            leaf advertise-peer-as {
              type empty;
              description
                "Advertise routes received from the same autonomous system";
            }
            leaf no-advertise-peer-as {
              type empty;
              description
                "Don't advertise routes received from the same autonomous system";
            }
          }  // choice advertise-peer-as-choice
    
          container advertise-external {
            presence "enable advertise-external";
            description
              "Advertise best external routes";
            leaf conditional {
              type empty;
              description
                "Route matches active route upto med-comparison rule";
            }
          }  // container advertise-external
    
          leaf keep {
            type enumeration {
              enum "all" {
                value 0;
                description "Retain all routes";
              }
              enum "none" {
                value 1;
                description "Retain no routes";
              }
            }
            description
              "How to retain routes in the routing table";
          }
    
          leaf rfc6514-compliant-safi129 {
            type empty;
            description
              "Compliant with RFC6514 SAFI129 format";
          }
    
          leaf no-aggregator-id {
            type empty;
            description
              "Set router ID in aggregator path attribute to 0";
          }
    
          leaf mtu-discovery {
            type empty;
            description
              "Enable TCP path MTU discovery";
          }
    
          leaf enforce-first-as {
            type empty;
            description
              "Enforce first AS in AS-path is the neighbor's AS";
          }
    
          leaf out-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 65535";
              }
            }
            description
              "How long before exporting routes from routing table";
          }
    
          leaf ttl {
            junos:must "((!(".. .. type internal") && !(".. multihop")))";
            junos:must-message "This option is valid only for single-hop EBGP neighbor";
            type enumeration {
              enum "1" {
                value 0;
              }
              enum "255" {
                value 1;
              }
            }
            description
              "TTL value for the single-hop peer";
          }
    
          leaf log-updown {
            type empty;
            description
              "Log a message for peer state transitions";
          }
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
    
          leaf-list nlri {
            type enumeration {
              enum "unicast" {
                value 0;
                status deprecated;
                description
                  "Include unicast NLRI";
              }
              enum "multicast" {
                value 1;
                status deprecated;
                description
                  "Include multicast NLRI";
              }
              enum "any" {
                value 2;
                status deprecated;
                description
                  "Include any kind of NLRI";
              }
            }
            ordered-by user;
            status deprecated;
            description
              "NLRI type to include in updates";
          }
    
          container bgp-error-tolerance {
            presence
              "enable bgp-error-tolerance";
            description
              "Handle BGP malformed updates softly";
            uses apply-advanced;
    
            leaf malformed-update-log-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "10 .. 65535";
                }
              }
              units "seconds";
              default "300";
              description
                "Time used when logging malformed update";
            }
    
            choice malformed-routes-limit-choice {
              leaf malformed-route-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 4294967295";
                  }
                }
                default "1000";
                description
                  "Maximum number of malformed routes from a peer";
              }
              leaf no-malformed-route-limit {
                type empty;
                description
                  "No malformed route limit";
              }
            }  // choice malformed-routes-limit-choice
          }  // container bgp-error-tolerance
    
          leaf authentication-key {
            type string {
              length "1 .. 126";
            }
            description "MD5 authentication key";
          }
    
          leaf authentication-algorithm {
            junos:must "(".. authentication-key-chain")";
            junos:must-message "May not be configured without authentication-key-chain";
            junos:must "(!(".. authentication-key"))";
            junos:must-message "May not be configured with authentication-key";
            type enumeration {
              enum "md5" {
                value 0;
                description "Message Digest 5";
              }
              enum "hmac-sha-1-96" {
                value 1;
                description
                  "Hash-based Message Authentication Code (SHA1) (96 bits)";
              }
              enum "aes-128-cmac-96" {
                value 2;
                description
                  "Cipher-based Message Authentication Code (AES128) (96 bits)";
              }
              enum "ao" {
                value 3;
                description
                  "TCP Authentication Option";
              }
            }
            default "hmac-sha-1-96";
            description
              "Authentication algorithm name";
          }
    
          leaf tcpao-handling-with-digest-mismatch {
            junos:must "(!(".. authentication-key"))";
            junos:must-message "May not be configured with authentication-key";
            type enumeration {
              enum "drop-if-no-tcpao" {
                value 0;
                description
                  "Drop the connection if Digest mismatched";
              }
              enum "allow-without-tcpao" {
                value 1;
                description
                  "Allow the connection establishment without TCP-AO";
              }
            }
            description
              "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
          }
    
          leaf authentication-key-chain {
            junos:must "(!(".. authentication-key"))";
            junos:must-message "May not be configured with authentication-key";
            junos:must "("security authentication-key-chains key-chain $$")";
            junos:must-message "Referenced key-chain must be defined";
            type string {
              length "1 .. 128";
            }
            description "Key chain name";
          }
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          container remove-private {
            presence "enable remove-private";
            description
              "Remove well-known private AS numbers";
            uses apply-advanced;
    
            container all {
              presence "enable all";
              description
                "Remove all private AS numbers and do not stop at the first public AS number";
              container replace {
                presence "enable replace";
                description
                  "Replace private AS numbers with the BGP Group's local AS number";
                leaf nearest {
                  type empty;
                  description
                    "Use closest public AS number to replace a private AS number";
                }
              }  // container replace
            }  // container all
    
            leaf no-peer-loop-check {
              type empty;
              description
                "Remove peer loop-check";
            }
          }  // container remove-private
    
          leaf cluster {
            type jt:areaid;
            description "Cluster identifier";
          }
    
          leaf no-client-reflect {
            type empty;
            description
              "Disable intracluster route redistribution";
          }
    
          leaf peer-as {
            type string {
              junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
              junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
            }
            description
              " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
          }
    
          container local-as {
            description
              "Local autonomous system number";
            leaf as-number {
              type string {
                junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
              }
              description
                " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
            }
    
            leaf loops {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 10";
                }
              }
              description
                "Maximum number of times this AS can be in an AS path";
            }
    
            leaf private {
              type empty;
              description
                "Hide this local AS in paths learned from this peering";
            }
    
            leaf alias {
              type empty;
              description
                "Treat this AS as an alias to the system AS";
            }
    
            leaf no-prepend-global-as {
              type empty;
              description
                "Do not prepend global autonomous-system number in advertised paths";
            }
          }  // container local-as
    
          leaf ipsec-sa {
            junos:must "("security ipsec security-association $$")";
            junos:must-message "Referenced IPSec Security Association must be defined";
            type string {
              length "1 .. 32";
            }
            description "IPSec SA name";
          }
    
          container graceful-shutdown {
            description
              "BGP peer graceful shutdown option";
            uses apply-advanced;
    
            container receiver {
              presence "enable receiver";
              description
                "BGP peer graceful-shutdown receiver";
              uses apply-advanced;
    
              leaf disable {
                junos:must "(!(".. .. sender"))";
                junos:must-message "Receiver cannot be disabled on Sender";
                type empty;
                description
                  "Disable graceful-shutdown receiver";
              }
    
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Value of receiver LOCAL_PREF path attribute";
              }
            }  // container receiver
    
            container sender {
              presence "enable sender";
              description
                "BGP peer graceful-shutdown sender";
              uses apply-advanced;
    
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Value of sender LOCAL_PREF path attribute";
              }
            }  // container sender
          }  // container graceful-shutdown
    
          container shutdown {
            presence "enable shutdown";
            description "Shutdown";
            uses apply-advanced;
    
            leaf notify-message {
              type string;
              description "Notification message";
            }
          }  // container shutdown
    
          leaf unconfigured-peer-graceful-restart {
            junos:must "(".. graceful-restart")";
            junos:must-message "unconfigured-peer-graceful-restart is only valid with 'graceful-restart'";
            type empty;
            description
              "BGP unconfigured peer graceful restart options";
          }
    
          container graceful-restart {
            presence "enable graceful-restart";
            description
              "BGP graceful restart options";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf restart-time {
              junos:must "(("routing-options graceful-restart" || "fabric routing-options graceful-restart"))";
              junos:must-message "restart-time is only valid with 'routing-options graceful-restart'";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1800";
                }
              }
              description
                "Restart time used when negotiating with a peer";
            }
    
            leaf stale-routes-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1800";
                }
              }
              description
                "Maximum time for which stale routes are kept";
            }
    
            container long-lived {
              description
                "Long-lived graceful restart options";
              uses apply-advanced;
    
              container receiver {
                description
                  "Long-lived graceful restart receiver (helper) options";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable receiver (helper) functionality";
                  }
                }  // choice enable-disable
              }  // container receiver
    
              container advertise-to-non-llgr-neighbor {
                presence
                  "enable advertise-to-non-llgr-neighbor";
                description
                  "Advertise stale routes to non-LLGR neighbors";
                uses apply-advanced;
    
                leaf omit-no-export {
                  type empty;
                  description
                    "Do not attach no-export community to stale routes";
                }
              }  // container advertise-to-non-llgr-neighbor
            }  // container long-lived
    
            leaf disable-notification-extensions {
              type empty;
              description
                "Disable notification extensions";
            }
    
            leaf forwarding-state-bit {
              type enumeration {
                enum "as-rr-client" {
                  value 0;
                  description
                    "As for a route reflector client";
                }
                enum "from-fib" {
                  value 1;
                  description
                    "Always use state of associated FIB(s)";
                }
              }
              description
                "Control forwarding-state flag negotiation";
            }
    
            leaf dont-help-shared-fate-bfd-down {
              type empty;
              description
                "Honor BFD-Down(C=0) if GR-restart not in progress";
            }
          }  // container graceful-restart
    
          leaf include-mp-next-hop {
            type empty;
            description
              "Include NEXT-HOP attribute in multiprotocol updates";
          }
    
          leaf disable-4byte-as {
            type empty;
            description
              "Disable 4 byte AS capability advertisement";
          }
    
          container idle-after-switch-over {
            description
              "Stop peer session from coming up after nonstop-routing switch-over";
            choice idle-interval {
              leaf forever {
                type empty;
                description
                  "Idle the peer until the user intervenes";
              }
              leaf timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Timeout value, in seconds, for starting peer after switch over";
              }
            }  // choice idle-interval
          }  // container idle-after-switch-over
    
          container outbound-route-filter {
            junos:must "(!("system processes routing bgp update-threading"))";
            junos:must-message "Can't be configured together with update-threading";
            description
              "Dynamically negotiated cooperative route filtering";
            uses apply-advanced;
    
            leaf bgp-orf-cisco-mode {
              type empty;
              description
                "Using BGP ORF capability code 130 and Prefix ORF type 128";
            }
    
            container extended-community {
              status deprecated;
              description
                "Extended community filtering";
              uses apply-advanced;
    
              choice accept-choice {
                leaf accept {
                  type empty;
                  description
                    "Honor remote requests for extended community ORF";
                }
                leaf no-accept {
                  type empty;
                  description
                    "Don't honor remote requests for extended community ORF";
                }
              }  // choice accept-choice
    
              leaf vrf-filter {
                type empty;
                description
                  "Request remote filtering using locally configured VRF import targets";
              }
            }  // container extended-community
    
            container prefix-based {
              presence "enable prefix-based";
              description
                "Prefix-based outbound route filtering";
              uses apply-advanced;
    
              container accept {
                presence "enable accept";
                description
                  "Honor Prefix-based ORFs from remote peers";
                uses apply-advanced;
    
                leaf inet {
                  type empty;
                  description
                    "Honor IPv4 prefix filters";
                }
    
                leaf inet6 {
                  type empty;
                  description
                    "Honor IPv6 prefix filters";
                }
              }  // container accept
            }  // container prefix-based
          }  // container outbound-route-filter
    
          container message-batching {
            status deprecated;
            description
              "DEPRECATED - Batching of outgoing messages";
            uses apply-advanced;
    
            choice enable-disable {
              leaf enable {
                type empty;
                description "Enable parameter";
              }
              leaf disable {
                type empty;
                description "Disable parameter";
              }
            }  // choice enable-disable
    
            leaf interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "100 .. 1000";
                }
              }
              units "milliseconds";
              default "250";
              description
                "DEPRECATED - Interval over which to batch messages";
            }
          }  // container message-batching
    
          container multipath {
            presence "enable multipath";
            description
              "Allow load sharing among multiple BGP paths";
            uses apply-advanced;
    
            leaf disable {
              type empty;
              description "Disable Multipath";
            }
    
            leaf multiple-as {
              type empty;
              description
                "Use paths received from different ASs";
            }
    
            leaf allow-protection {
              type empty;
              description
                "Allow protection for multipath legs";
            }
    
            leaf pause-computation-during-churn {
              type empty;
              description
                "Pause multipath job to absorb churn";
            }
    
            leaf list-nexthop {
              type empty;
              description
                "Use List-NH for homogenous nexthop-set also";
            }
          }  // container multipath
    
          leaf tcp-mss {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 4096";
              }
            }
            description
              "Maximum TCP segment size";
          }
    
          leaf bgp-identifier {
            type jt:ipv4addr;
            description "BGP Identifier";
          }
    
          leaf tcp-aggressive-transmission {
            type empty;
            description
              "Enable aggressive transmission of pure TCP ACKs and retransmissions";
          }
    
          container bmp {
            description
              "Specific settings to override the routing-options settings";
            uses apply-advanced;
    
            leaf monitor {
              type enumeration {
                enum "enable" {
                  value 0;
                  description
                    "Enable monitoring of BGP peer(s)";
                }
                enum "disable" {
                  value 1;
                  description
                    "Disable monitoring of BGP peer(s)";
                }
              }
              description
                "Enable/Disable monitoring";
            }
    
            container route-monitoring {
              description
                "Control route monitoring settings";
              uses apply-advanced;
    
              leaf none {
                junos:must "((!(".. pre-policy") && (!(".. post-policy") && !(".. rib-out"))))";
                junos:must-message "May not be configured with pre-policy or post-policy or rib-out";
                type empty;
                description
                  "Do not send route monitoring messages";
              }
    
              container pre-policy {
                presence "enable pre-policy";
                description
                  "Send pre-policy route monitoring messages";
                leaf exclude-non-feasible {
                  type empty;
                  description
                    "Exclude looped routes, etc";
                }
              }  // container pre-policy
    
              container post-policy {
                presence "enable post-policy";
                description
                  "Send post-policy route monitoring messages";
                leaf exclude-non-eligible {
                  type empty;
                  description
                    "Exclude unresolved routes, etc.";
                }
              }  // container post-policy
    
              container rib-out {
                junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                junos:must-message "Update threading can't be configured together with bmp rib-out monitoring";
                presence "enable rib-out";
                description
                  "Send adj-ribs-out route monitoring messages";
                leaf pre-policy {
                  type empty;
                  description
                    "Send pre-policy adj-ribs-out route monitoring messages";
                }
    
                leaf post-policy {
                  type empty;
                  description
                    "Send post-policy adj-ribs-out route monitoring messages";
                }
              }  // container rib-out
            }  // container route-monitoring
          }  // container bmp
    
          container advertise-bgp-static {
            presence
              "enable advertise-bgp-static";
            description
              "Advertise bgp-static routes";
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Static route advertisement policy";
            }
          }  // container advertise-bgp-static
    
          leaf add-path-display-ipv4-address {
            type empty;
            description
              "Display add-path path-id in IPv4 address format";
          }
    
          container bfd-liveness-detection {
            description
              "Bidirectional Forwarding Detection (BFD) options";
            uses apply-advanced;
    
            leaf version {
              type enumeration {
                enum "0" {
                  value 0;
                  description
                    "BFD version 0 (deprecated)";
                }
                enum "1" {
                  value 1;
                  description "BFD version 1";
                }
                enum "automatic" {
                  value 2;
                  description
                    "Choose BFD version automatically";
                }
              }
              default "automatic";
              description
                "BFD protocol version number";
            }
    
            leaf minimum-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum transmit and receive interval";
            }
    
            leaf minimum-transmit-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              status deprecated;
              description
                "Minimum transmit interval";
            }
    
            leaf minimum-receive-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum receive interval";
            }
    
            leaf multiplier {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255";
                }
              }
              default "3";
              description
                "Detection time multiplier";
            }
    
            choice adaptation-choice {
              leaf no-adaptation {
                type empty;
                description "Disable adaptation";
              }
            }  // choice adaptation-choice
    
            container transmit-interval {
              description
                "Transmit-interval options";
              uses apply-advanced;
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit interval";
              }
    
              leaf threshold {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "milliseconds";
                description
                  "High transmit interval triggering a trap";
              }
            }  // container transmit-interval
    
            container detection-time {
              description
                "Detection-time options";
              uses apply-advanced;
    
              leaf threshold {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "milliseconds";
                description
                  "High detection-time triggering a trap";
              }
            }  // container detection-time
    
            container authentication {
              description
                "Authentication options";
              uses apply-advanced;
    
              leaf key-chain {
                junos:must "(".. algorithm")";
                junos:must-message "May not be configured without algorithm";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string;
                description "Key chain name";
              }
    
              leaf algorithm {
                junos:must "(".. key-chain")";
                junos:must-message "May not be configured without key-chain";
                type enumeration {
                  enum "simple-password" {
                    value 0;
                    description
                      "Simple password";
                  }
                  enum "keyed-md5" {
                    value 1;
                    description
                      "Keyed message Digest 5";
                  }
                  enum "meticulous-keyed-md5" {
                    value 2;
                    description
                      "Meticulous keyed message Digest 5";
                  }
                  enum "keyed-sha-1" {
                    value 3;
                    description
                      "Keyed secure hash algorithm (SHA1) ";
                  }
                  enum "meticulous-keyed-sha-1" {
                    value 4;
                    description
                      "Meticulous keyed secure hash algorithm (SHA1) ";
                  }
                }
                description "Algorithm name";
              }
    
              leaf loose-check {
                type empty;
                description
                  "Verify authentication only if authentication is negotiated";
              }
            }  // container authentication
    
            leaf session-mode {
              type enumeration {
                enum "automatic" {
                  value 0;
                  description
                    "Choose session-mode automatically";
                }
                enum "single-hop" {
                  value 1;
                  description "Use single-hop";
                }
                enum "multihop" {
                  value 2;
                  description "Use multihop";
                }
              }
              default "automatic";
              description
                "BFD single-hop or multihop session-mode";
            }
    
            leaf holddown-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Time to hold the session-UP notification to the client";
            }
          }  // container bfd-liveness-detection
    
          container output-queue-priority {
            description
              "BGP output queue priority scheduler for updates";
            uses apply-advanced;
    
            container expedited {
              presence "enable expedited";
              description
                "Expedited queue; highest priority";
              leaf update-tokens {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                description "Number of tokens";
              }
            }  // container expedited
    
            list priority {
              key "name";
              description
                "Output queue priority 1..16; higher is better";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16";
                  }
                }
                description
                  "Output queue priority; higher is better";
              }
    
              leaf update-tokens {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                description "Number of tokens";
              }
            }  // list priority
    
            container defaults {
              description
                "Map policy's priority class and BGP output-queue";
              uses apply-advanced;
    
              container low {
                description
                  "Assign the 'low' priority class to this output-queue";
                uses bgp-output-queue-priority-class;
              }  // container low
    
              container medium {
                description
                  "Assign the 'medium' priority class to this output-queue";
                uses bgp-output-queue-priority-class;
              }  // container medium
    
              container high {
                description
                  "Assign the 'high' priority class to this output-queue";
                uses bgp-output-queue-priority-class;
              }  // container high
            }  // container defaults
          }  // container output-queue-priority
    
          container multipath-build-priority {
            description
              "Configure the multipath build priority";
            uses apply-advanced;
    
            choice multipath-priority {
              leaf low {
                type empty;
                description
                  "Do multipath build with low priority";
              }
              leaf medium {
                type empty;
                description
                  "Do multipath build with medium priority";
              }
            }  // choice multipath-priority
          }  // container multipath-build-priority
    
          leaf send-addpath-optimization {
            type empty;
            description
              "Enable BGP addpath advertisement optimization";
          }
    
          container defaults {
            uses apply-advanced;
    
            container ebgp {
              description
                "Options impacting external BGP default behaviors";
              uses apply-advanced;
    
              container no-policy {
                description
                  "Default ebgp behaviors in the absence of configured policy";
                uses apply-advanced;
    
                leaf receive {
                  type enumeration {
                    enum "accept" {
                      value 0;
                      description
                        "By default, accept routes from all address families";
                    }
                    enum "reject" {
                      value 1;
                      description
                        "By default, reject routes from IPv4/IPv6 unicast address families";
                    }
                    enum "reject-always" {
                      value 2;
                      description
                        "By default, reject routes from all address families";
                    }
                  }
                  description
                    "Default ebgp receive behavior";
                }
    
                leaf advertise {
                  type enumeration {
                    enum "accept" {
                      value 0;
                      description
                        "By default, advertise routes for all address families";
                    }
                    enum "reject" {
                      value 1;
                      description
                        "By default, do not advertise routes from IPv4/IPv6 unicast address families";
                    }
                    enum "reject-always" {
                      value 2;
                      description
                        "By default, do not advertise routes from any address families";
                    }
                  }
                  description
                    "Default ebgp advertise behavior";
                }
              }  // container no-policy
            }  // container ebgp
          }  // container defaults
        }  // grouping juniper-protocols-bgp
    
        grouping bgp-af-gr {
          uses apply-advanced;
    
          container long-lived {
            description
              "Long-lived graceful restart options";
            uses apply-advanced;
    
            container restarter {
              description
                "Long-lived graceful restart restarter options";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable restarter functionality";
                }
              }  // choice enable-disable
    
              leaf stale-time {
                type string;
                description
                  "Stale time in seconds or dhms notation (1..16777215)";
              }
            }  // container restarter
          }  // container long-lived
    
          leaf forwarding-state-bit {
            type enumeration {
              enum "set" {
                value 0;
                description "Always set";
              }
              enum "from-fib" {
                value 1;
                description
                  "Use state of associated FIB(s)";
              }
            }
            description
              "Control forwarding-state flag negotiation";
          }
        }  // grouping bgp-af-gr
    
        grouping bgp-afi-default {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
        }  // grouping bgp-afi-default
    
        grouping apath-options {
          description
            "Number of paths to advertise";
          uses apply-advanced;
    
          leaf receive {
            type empty;
            description
              "Receive multiple paths from peer";
          }
    
          container send {
            presence "enable send";
            description
              "Send multiple paths to peer";
            uses apply-advanced;
    
            container path-selection-mode {
              junos:must "(!(".. multipath"))";
              junos:must-message "Multipath must be disabled";
              description
                "Configure how to select add-path routes";
              uses apply-advanced;
    
              choice mode {
                leaf all-paths {
                  type empty;
                  description
                    "Advertise all paths allowed by path count";
                }
                leaf equal-cost-paths {
                  type empty;
                  description
                    "Advertise equal cost paths";
                }
              }  // choice mode
            }  // container path-selection-mode
    
            leaf-list prefix-policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Perform add-path only for prefixes that match policy";
            }
    
            leaf path-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "2 .. 64";
                }
              }
              description
                "Number of paths to advertise";
            }
    
            leaf include-backup-path {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 2";
                }
              }
              description
                "Number of backup paths to advertise";
            }
    
            leaf multipath {
              type empty;
              description
                "Include only multipath contributor routes";
            }
          }  // container send
        }  // grouping apath-options
    
        grouping bgp-afi-flow {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          leaf-list no-validate {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Bypass validation procedure for routes that match policy";
          }
    
          leaf strip-nexthop {
            type empty;
            description
              "Strip the next-hop from the outgoing flow update";
          }
    
          leaf allow-policy-add-nexthop {
            type empty;
            status deprecated;
            description
              "Allow policy to add nexthop to a route without nexthop";
          }
        }  // grouping bgp-afi-flow
    
        grouping bgp-afi-flow-with-redirect-ip-action {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          leaf-list no-validate {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Bypass validation procedure for routes that match policy";
          }
    
          leaf strip-nexthop {
            type empty;
            description
              "Strip the next-hop from the outgoing flow update";
          }
    
          container legacy-redirect-ip-action {
            presence
              "enable legacy-redirect-ip-action";
            description
              "Configure legacy redirect to IP support";
            uses apply-advanced;
    
            leaf receive {
              type empty;
              description
                "Accept legacy encoded redirect-to-ip action attribute";
            }
    
            leaf send {
              type empty;
              description
                "Advertise Redirect action as legacy redirect attribute";
            }
          }  // container legacy-redirect-ip-action
    
          leaf secondary-independent-resolution {
            type empty;
            description
              "Resolve FLOW routes in VRF table independent of VPN FLOW route";
          }
        }  // grouping bgp-afi-flow-with-redirect-ip-action
    
        grouping bgp-afi-inet-transport {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
    
          leaf per-prefix-label {
            type empty;
            description
              "Allocate a unique label to each advertised prefix";
          }
    
          leaf per-group-label {
            type empty;
            description
              "Advertise prefixes with unique labels per group";
          }
    
          container traffic-statistics {
            presence "enable traffic-statistics";
            description
              "Collect statistics for BGP label-switched paths";
            uses bgpaf-traffic-statistics;
          }  // container traffic-statistics
    
          container protection {
            presence "enable protection";
            description
              "Compute backup path for active nexthop failure";
          }  // container protection
        }  // grouping bgp-afi-inet-transport
    
        grouping bgp-afi-inet6-labeled {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
    
          leaf per-group-label {
            type empty;
            description
              "Advertise prefixes with unique labels per group";
          }
    
          container traffic-statistics {
            presence "enable traffic-statistics";
            description
              "Collect statistics for BGP label-switched paths";
            uses bgpaf-traffic-statistics;
          }  // container traffic-statistics
    
          container rib {
            description
              "Select table used by labeled unicast routes";
            uses apply-advanced;
    
            leaf inet6.3 {
              type empty;
              description
                "Use inet6.3 to exchange labeled unicast routes";
            }
          }  // container rib
    
          container explicit-null {
            presence "enable explicit-null";
            description
              "Advertise explicit null";
            leaf connected-only {
              type empty;
              description
                "Advertise explicit null only for connected routes";
            }
          }  // container explicit-null
    
          container protection {
            junos:must "((!(".. .. .. .. type internal") && !(".. .. .. .. .. type internal")))";
            junos:must-message "Protection for labeled-bgp valid only for EBGP";
            presence "enable protection";
            description
              "Compute backup path for active nexthop failure";
          }  // container protection
    
          list topology {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            junos:must "(!("routing-options no-multi-topology-routing"))";
            junos:must-message "Multi topology routing is disabled";
            key "name";
            ordered-by user;
            description
              "Multi topology routing tables";
            leaf name {
              type string {
                junos:posix-pattern "!^((.*:.*)|(.{129,}))$";
                junos:pattern-message "Must be a non-reserved string of 128 characters or less";
              }
              description "Topology name";
            }
    
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify multi topology routes";
            }
          }  // list topology
        }  // grouping bgp-afi-inet6-labeled
    
        grouping bgp-afi-inet6-transport {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
    
          leaf per-prefix-label {
            type empty;
            description
              "Allocate a unique label to each advertised prefix";
          }
    
          leaf per-group-label {
            type empty;
            description
              "Advertise prefixes with unique labels per group";
          }
    
          container traffic-statistics {
            presence "enable traffic-statistics";
            description
              "Collect statistics for BGP label-switched paths";
            uses bgpaf-traffic-statistics;
          }  // container traffic-statistics
    
          container lu-export {
            presence "enable lu-export";
            description
              "Install Classful Transport routes in inet6.3";
            uses apply-advanced;
          }  // container lu-export
    
          container protection {
            presence "enable protection";
            description
              "Compute backup path for active nexthop failure";
          }  // container protection
        }  // grouping bgp-afi-inet6-transport
    
        grouping bgp-afi-l2vpn {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container egress-protection {
            junos:must "(!(".. .. .. .. type external"))";
            junos:must-message "Egress-protection is valid only for IBGP";
            presence "enable egress-protection";
            description
              "Egress router protection";
            uses apply-advanced;
    
            container context-identifier {
              description "Context identifier";
              uses apply-advanced;
    
              leaf context-id {
                junos:must "("protocols mpls egress-protection context-identifier $$ primary")";
                junos:must-message "context-identifier must be type primary";
                junos:must "("protocols mpls egress-protection context-identifier $$")";
                junos:must-message "same context-identifier must be defined in protocols mpls egress-protection";
                type jt:ipv4addr;
                description "IP address";
              }
            }  // container context-identifier
    
            leaf-list keep-import {
              junos:must "("policy-options policy-statement ")";
              junos:must-message "policy-options policy-statement";
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
          }  // container egress-protection
        }  // grouping bgp-afi-l2vpn
    
        grouping bgp-afi-l3vpn {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
    
          container egress-protection {
            junos:must "(!(".. .. .. .. type external"))";
            junos:must-message "Egress-protection is valid only for IBGP";
            presence "enable egress-protection";
            description
              "Egress router protection";
            uses apply-advanced;
    
            container context-identifier {
              description "Context identifier";
              uses apply-advanced;
    
              leaf context-id {
                junos:must "("protocols mpls egress-protection context-identifier $$ primary")";
                junos:must-message "context-identifier must be type primary";
                junos:must "("protocols mpls egress-protection context-identifier $$")";
                junos:must-message "same context-identifier must be defined in protocols mpls egress-protection";
                type jt:ipv4addr;
                description "IP address";
              }
            }  // container context-identifier
    
            leaf-list keep-import {
              junos:must "("policy-options policy-statement ")";
              junos:must-message "policy-options policy-statement";
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
          }  // container egress-protection
    
          leaf accept-local-nexthop {
            type empty;
            description
              "Enable processing of routes with own nexthop";
          }
        }  // grouping bgp-afi-l3vpn
    
        grouping bgp-afi-labeled {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
    
          leaf per-prefix-label {
            type empty;
            description
              "Allocate a unique label to each advertised prefix";
          }
    
          leaf per-group-label {
            type empty;
            description
              "Advertise prefixes with unique labels per group";
          }
    
          container traffic-statistics {
            presence "enable traffic-statistics";
            description
              "Collect statistics for BGP label-switched paths";
            uses bgpaf-traffic-statistics;
          }  // container traffic-statistics
    
          list topology {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            junos:must "(!("routing-options no-multi-topology-routing"))";
            junos:must-message "Multi topology routing is disabled";
            key "name";
            ordered-by user;
            description
              "Multi topology routing tables";
            leaf name {
              type string {
                junos:posix-pattern "!^((.*:.*)|(.{129,}))$";
                junos:pattern-message "Must be a non-reserved string of 128 characters or less";
              }
              description "Topology name";
            }
    
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify multi topology routes";
            }
          }  // list topology
    
          container rib {
            description
              "Select table used by labeled unicast routes";
            uses rib-inet3;
          }  // container rib
    
          container explicit-null {
            presence "enable explicit-null";
            description
              "Advertise explicit null";
            leaf connected-only {
              type empty;
              description
                "Advertise explicit null only for connected routes";
            }
          }  // container explicit-null
    
          container protection {
            junos:must "((!(".. .. .. .. type internal") && !(".. .. .. .. .. type internal")))";
            junos:must-message "Protection for labeled-bgp valid only for EBGP";
            presence "enable protection";
            description
              "Compute backup path for active nexthop failure";
            uses apply-advanced;
          }  // container protection
    
          container egress-protection {
            junos:must "(!(".. .. .. .. type external"))";
            junos:must-message "Egress-protection is valid only for IBGP";
            presence "enable egress-protection";
            description
              "Egress router protection";
            uses apply-advanced;
    
            container context-identifier {
              description "Context identifier";
              uses apply-advanced;
    
              leaf context-id {
                junos:must "("protocols mpls egress-protection context-identifier $$ primary")";
                junos:must-message "context-identifier must be type primary";
                junos:must "("protocols mpls egress-protection context-identifier $$")";
                junos:must-message "same context-identifier must be defined in protocols mpls egress-protection";
                type jt:ipv4addr;
                description "IP address";
              }
            }  // container context-identifier
    
            leaf-list keep-import {
              junos:must "("policy-options policy-statement ")";
              junos:must-message "policy-options policy-statement";
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
          }  // container egress-protection
    
          leaf resolve-vpn {
            type empty;
            description
              "Install received NLRI in inet.3 also";
          }
    
          container entropy-label {
            presence "enable entropy-label";
            description
              "Use entropy label for entropy label capable BGP LSPs";
            uses apply-advanced;
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Policy to select BGP LSPs to use entropy label";
            }
    
            leaf no-next-hop-validation {
              type empty;
              description
                "Don't validate next hop field against route next hop";
            }
          }  // container entropy-label
        }  // grouping bgp-afi-labeled
    
        grouping bgp-afi-srte {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
        }  // grouping bgp-afi-srte
    
        grouping bgp-afi-topo {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container protection {
            junos:must "((!(".. .. .. .. type internal") && !(".. .. .. .. .. type internal")))";
            junos:must-message "Protection is valid only for EBGP";
            presence "enable protection";
            description
              "Compute backup path for active nexthop failure";
          }  // container protection
    
          list topology {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            junos:must "(!("routing-options no-multi-topology-routing"))";
            junos:must-message "Multi topology routing is disabled";
            key "name";
            ordered-by user;
            description
              "Multi topology routing tables";
            leaf name {
              type string {
                junos:posix-pattern "!^((.*:.*)|(.{129,}))$";
                junos:pattern-message "Must be a non-reserved string of 128 characters or less";
              }
              description "Topology name";
            }
    
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify multi topology routes";
            }
          }  // list topology
        }  // grouping bgp-afi-topo
    
        grouping bgp-afi-vpn {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
        }  // grouping bgp-afi-vpn
    
        grouping bgp-afi-vpn-protection {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
    
          container egress-protection {
            junos:must "(!(".. .. .. .. type external"))";
            junos:must-message "Egress-protection is valid only for IBGP";
            presence "enable egress-protection";
            description
              "Egress router protection";
            uses apply-advanced;
    
            container context-identifier {
              description "Context identifier";
              uses apply-advanced;
    
              leaf context-id {
                junos:must "("protocols mpls egress-protection context-identifier $$ primary")";
                junos:must-message "context-identifier must be type primary";
                junos:must "("protocols mpls egress-protection context-identifier $$")";
                junos:must-message "same context-identifier must be defined in protocols mpls egress-protection";
                type jt:ipv4addr;
                description "IP address";
              }
            }  // container context-identifier
    
            leaf-list keep-import {
              junos:must "("policy-options policy-statement ")";
              junos:must-message "policy-options policy-statement";
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
          }  // container egress-protection
        }  // grouping bgp-afi-vpn-protection
    
        grouping bgp-output-queue-priority-class {
          choice class {
            leaf priority {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16";
                }
              }
              description
                "Output queue priority; higher is better";
            }
            leaf expedited {
              type empty;
              description
                "Expedited queue; highest priority";
            }
          }  // choice class
        }  // grouping bgp-output-queue-priority-class
    
        grouping bgp_filter_obj {
          description
            "Filter to apply to tracing";
          leaf match-on {
            type enumeration {
              enum "prefix" {
                value 0;
                description
                  "Filter based on prefix";
              }
            }
            description
              "Argument on which to match";
          }
    
          leaf-list policy {
            type jt:policy-algebra;
            ordered-by user;
            description "Filter policy";
          }
        }  // grouping bgp_filter_obj
    
        grouping bgpaf-accepted-prefix-limit {
          uses apply-advanced;
    
          leaf maximum {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 4294967295";
              }
            }
            description
              "Maximum number of prefixes accepted from a peer";
          }
    
          container teardown {
            junos:must "(!(".. hide-excess"))";
            junos:must-message "Can't be configured together with hide-excess";
            junos:must "(!(".. drop-excess"))";
            junos:must-message "Can't be configured together with drop-excess";
            presence "enable teardown";
            description
              "Clear peer connection on reaching limit";
            uses apply-advanced;
    
            leaf limit-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of prefix-limit to start warnings";
            }
    
            container idle-timeout {
              presence "enable idle-timeout";
              description
                "Timeout before attempting to restart peer";
              choice idle-parm {
                leaf forever {
                  type empty;
                  description
                    "Idle the peer until the user intervenes";
                }
                leaf timeout {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 2400";
                    }
                  }
                  description
                    "Timeout value, in minutes, for restarting peer";
                }
              }  // choice idle-parm
            }  // container idle-timeout
          }  // container teardown
    
          container drop-excess {
            junos:must "(!(".. hide-excess"))";
            junos:must-message "Can't be configured together with hide-excess";
            junos:must "(!(".. teardown"))";
            junos:must-message "Can't be configured together with teardown";
            presence "enable drop-excess";
            description
              "Drop routes from peer on reaching limit";
            uses apply-advanced;
    
            leaf limit-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of prefix-limit to start warnings";
            }
          }  // container drop-excess
    
          container hide-excess {
            junos:must "(!(".. teardown"))";
            junos:must-message "Can't be configured together with teardown";
            junos:must "(!(".. drop-excess"))";
            junos:must-message "Can't be configured together with drop-excess";
            presence "enable hide-excess";
            description
              "Hide routes from peer on reaching limit";
            uses apply-advanced;
    
            leaf limit-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of prefix-limit to start warnings";
            }
          }  // container hide-excess
        }  // grouping bgpaf-accepted-prefix-limit
    
        grouping bgpaf-aigp-options {
          uses apply-advanced;
    
          leaf disable {
            type empty;
            description
              "Disable sending and receiving of AIGP attribute";
          }
        }  // grouping bgpaf-aigp-options
    
        grouping bgpaf-loops {
          uses apply-advanced;
    
          leaf loops {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "1 .. 10";
              }
            }
            description "AS-Path loop count";
          }
        }  // grouping bgpaf-loops
    
        grouping bgpaf-prefix-limit {
          uses apply-advanced;
    
          leaf maximum {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 4294967295";
              }
            }
            description
              "Maximum number of prefixes from a peer";
          }
    
          container teardown {
            junos:must "(!(".. hide-excess"))";
            junos:must-message "Can't be configured together with hide-excess";
            junos:must "(!(".. drop-excess"))";
            junos:must-message "Can't be configured together with drop-excess";
            presence "enable teardown";
            description
              "Clear peer connection on reaching limit";
            uses apply-advanced;
    
            leaf limit-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of prefix-limit to start warnings";
            }
    
            container idle-timeout {
              presence "enable idle-timeout";
              description
                "Timeout before attempting to restart peer";
              choice idle-parm {
                leaf forever {
                  type empty;
                  description
                    "Idle the peer until the user intervenes";
                }
                leaf timeout {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 2400";
                    }
                  }
                  description
                    "Timeout value, in minutes, for restarting peer";
                }
              }  // choice idle-parm
            }  // container idle-timeout
          }  // container teardown
    
          container drop-excess {
            junos:must "(!(".. hide-excess"))";
            junos:must-message "Can't be configured together with hide-excess";
            junos:must "(!(".. teardown"))";
            junos:must-message "Can't be configured together with teardown";
            presence "enable drop-excess";
            description
              "Drop routes from peer on reaching limit";
            uses apply-advanced;
    
            leaf limit-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of prefix-limit to start warnings";
            }
          }  // container drop-excess
    
          container hide-excess {
            junos:must "(!(".. teardown"))";
            junos:must-message "Can't be configured together with teardown";
            junos:must "(!(".. drop-excess"))";
            junos:must-message "Can't be configured together with drop-excess";
            presence "enable hide-excess";
            description
              "Hide routes from peer on reaching limit";
            uses apply-advanced;
    
            leaf limit-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of prefix-limit to start warnings";
            }
          }  // container hide-excess
        }  // grouping bgpaf-prefix-limit
    
        grouping bgpaf-traffic-statistics {
          uses apply-advanced;
    
          leaf labeled-path {
            type empty;
            description
              "Ingress labeled path statistics";
          }
    
          container file {
            description
              "Statistics file options";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf replace {
              type empty;
              status deprecated;
              description
                "Replace trace file rather than appending to it";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "10";
              description
                "Maximum number of trace files";
            }
    
            leaf no-stamp {
              type empty;
              status deprecated;
              description
                "Do not timestamp trace file";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
          }  // container file
    
          leaf interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "60 .. 65535";
              }
            }
            description
              "Time to collect statistics (seconds)";
          }
        }  // grouping bgpaf-traffic-statistics
    
        grouping juniper-protocols-isis {
          uses apply-advanced;
    
          list interface {
            key "name";
            description
              "Interface configuration";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container ldp-synchronization {
              presence
                "enable ldp-synchronization";
              description
                "Advertise maximum metric until LDP is operational";
              uses ldp-sync-obj;
            }  // container ldp-synchronization
    
            list level {
              key "name";
              ordered-by user;
              description
                "Configure levels on this interface";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 2";
                  }
                }
                description "IS-IS level number";
              }
    
              uses apply-advanced;
    
              leaf te-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 16777215";
                  }
                }
                description
                  "Traffic engineering metric";
              }
    
              leaf no-advertise-adjacency-segment {
                type empty;
                description
                  "Do not advertise an adjacency segment for this level";
              }
    
              container ipv4-adjacency-segment {
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the level";
                junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                description
                  "Configure ipv4 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  description
                    "Adjacency SID is eligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container protected
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container unprotected
              }  // container ipv4-adjacency-segment
    
              container ipv6-adjacency-segment {
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "ipv6-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same level";
                junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                junos:must-message "ipv6-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                description
                  "Configure ipv6 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  description
                    "Adjacency SID is eligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container protected
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container unprotected
              }  // container ipv6-adjacency-segment
    
              container srm6-adjacency-segment {
                description
                  "Configure srm6 adjacency segment";
                uses apply-advanced;
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  leaf sid {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Set Adjacency SID Value";
                  }
                }  // container unprotected
              }  // container srm6-adjacency-segment
    
              container srv6-adjacency-segment {
                description
                  "Configure srv6 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  presence "enable protected";
                  description
                    "SRv6 Adjacency segment is eligible for protection";
                  uses apply-advanced;
    
                  list locator {
                    key "name";
                    ordered-by user;
                    description
                      "Locator to bind SRv6 adjacency segment";
                    leaf name {
                      junos:must "("routing-options source-packet-routing srv6 locator $$")";
                      junos:must-message "Referenced source-packet-routing srv6 must be defined";
                      type string;
                      description "Locator name";
                    }
    
                    uses apply-advanced;
    
                    list end-x-sid {
                      key "name";
                      ordered-by user;
                      description
                        "Endpoint 128 bit address";
                      leaf name {
                        type jt:ipv6addr;
                      }
    
                      uses apply-advanced;
    
                      container flavor {
                        presence "enable flavor";
                        uses apply-advanced;
    
                        leaf psp {
                          type empty;
                          description
                            "Penultimate segment pop of the SRH";
                        }
    
                        leaf usp {
                          type empty;
                          description
                            "Ultimate segment pop of the SRH";
                        }
    
                        leaf usd {
                          type empty;
                          description
                            "Ultimate segment decapsulation";
                        }
                      }  // container flavor
                    }  // list end-x-sid
                  }  // list locator
                }  // container protected
    
                container unprotected {
                  presence "enable unprotected";
                  description
                    "SRv6 Adjacency segment is uneligible for protection";
                  uses apply-advanced;
    
                  list locator {
                    key "name";
                    ordered-by user;
                    description
                      "Locator to bind SRv6 adjacency segment";
                    leaf name {
                      junos:must "("routing-options source-packet-routing srv6 locator $$")";
                      junos:must-message "Referenced source-packet-routing srv6 must be defined";
                      type string;
                      description "Locator name";
                    }
    
                    uses apply-advanced;
    
                    list end-x-sid {
                      key "name";
                      ordered-by user;
                      description
                        "Endpoint 128 bit address";
                      leaf name {
                        type jt:ipv6addr;
                      }
    
                      uses apply-advanced;
    
                      container flavor {
                        presence "enable flavor";
                        uses apply-advanced;
    
                        leaf psp {
                          type empty;
                          description
                            "Penultimate segment pop of the SRH";
                        }
    
                        leaf usp {
                          type empty;
                          description
                            "Ultimate segment pop of the SRH";
                        }
    
                        leaf usd {
                          type empty;
                          description
                            "Ultimate segment decapsulation";
                        }
                      }  // container flavor
                    }  // list end-x-sid
                  }  // list locator
                }  // container unprotected
              }  // container srv6-adjacency-segment
    
              list lan-neighbor {
                junos:must "(!(".. ipv6-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if ipv6-adjacency-segment is configured in the same interface";
                junos:must "(!(".. ipv4-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if ipv4-adjacency-segment is configured in the same interface";
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if no-advertise-adjacency-segment is configured in the same level";
                junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if  no-advertise-adjacency-segment is configured in the same interface";
                junos:must "(!(".. .. point-to-point"))";
                junos:must-message "lan-neighbor can't be configured for point-to-point interfaces";
                key "name";
                ordered-by user;
                description
                  "Configuration specific to a LAN neighbor";
                leaf name {
                  type jt:sysid;
                  description "Neighbor's sysid";
                }
    
                uses apply-advanced;
    
                container ipv4-adjacency-segment {
                  junos:must "(!(".. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the level";
                  junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                  description
                    "Configure ipv4 adjacency segment";
                  uses apply-advanced;
    
                  container protected {
                    description
                      "Adjacency SID is eligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container protected
    
                  container unprotected {
                    description
                      "Adjacency SID uneligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container unprotected
                }  // container ipv4-adjacency-segment
    
                container ipv6-adjacency-segment {
                  junos:must "(!(".. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv6-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same level";
                  junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv6-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                  description
                    "Configure ipv6 adjacency segment";
                  uses apply-advanced;
    
                  container protected {
                    description
                      "Adjacency SID is eligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container protected
    
                  container unprotected {
                    description
                      "Adjacency SID uneligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container unprotected
                }  // container ipv6-adjacency-segment
    
                container srm6-adjacency-segment {
                  description
                    "Configure srm6 adjacency segment";
                  uses apply-advanced;
    
                  container unprotected {
                    description
                      "Adjacency SID uneligible for protection";
                    leaf sid {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Set Adjacency SID Value";
                    }
                  }  // container unprotected
                }  // container srm6-adjacency-segment
    
                container srv6-adjacency-segment {
                  description
                    "Configure srv6 adjacency segment";
                  uses apply-advanced;
    
                  container protected {
                    presence "enable protected";
                    description
                      "SRv6 Adjacency segment is eligible for protection";
                    uses apply-advanced;
    
                    list locator {
                      key "name";
                      ordered-by user;
                      description
                        "Locator to bind SRv6 adjacency segment";
                      leaf name {
                        junos:must "("routing-options source-packet-routing srv6 locator $$")";
                        junos:must-message "Referenced source-packet-routing srv6 must be defined";
                        type string;
                        description
                          "Locator name";
                      }
    
                      uses apply-advanced;
    
                      list end-x-sid {
                        key "name";
                        ordered-by user;
                        description
                          "Endpoint 128 bit address";
                        leaf name {
                          type jt:ipv6addr;
                        }
    
                        uses apply-advanced;
    
                        container flavor {
                          presence
                            "enable flavor";
                          uses apply-advanced;
    
                          leaf psp {
                            type empty;
                            description
                              "Penultimate segment pop of the SRH";
                          }
    
                          leaf usp {
                            type empty;
                            description
                              "Ultimate segment pop of the SRH";
                          }
    
                          leaf usd {
                            type empty;
                            description
                              "Ultimate segment decapsulation";
                          }
                        }  // container flavor
                      }  // list end-x-sid
                    }  // list locator
                  }  // container protected
    
                  container unprotected {
                    presence
                      "enable unprotected";
                    description
                      "SRv6 Adjacency segment is uneligible for protection";
                    uses apply-advanced;
    
                    list locator {
                      key "name";
                      ordered-by user;
                      description
                        "Locator to bind SRv6 adjacency segment";
                      leaf name {
                        junos:must "("routing-options source-packet-routing srv6 locator $$")";
                        junos:must-message "Referenced source-packet-routing srv6 must be defined";
                        type string;
                        description
                          "Locator name";
                      }
    
                      uses apply-advanced;
    
                      list end-x-sid {
                        key "name";
                        ordered-by user;
                        description
                          "Endpoint 128 bit address";
                        leaf name {
                          type jt:ipv6addr;
                        }
    
                        uses apply-advanced;
    
                        container flavor {
                          presence
                            "enable flavor";
                          uses apply-advanced;
    
                          leaf psp {
                            type empty;
                            description
                              "Penultimate segment pop of the SRH";
                          }
    
                          leaf usp {
                            type empty;
                            description
                              "Ultimate segment pop of the SRH";
                          }
    
                          leaf usd {
                            type empty;
                            description
                              "Ultimate segment decapsulation";
                          }
                        }  // container flavor
                      }  // list end-x-sid
                    }  // list locator
                  }  // container unprotected
                }  // container srv6-adjacency-segment
              }  // list lan-neighbor
    
              container post-convergence-lfa {
                junos:must "(".. .. .. backup-spf-options use-post-convergence-lfa")";
                junos:must-message "Not allowed without 'protocols isis backup-spf-options use-post-convergence-lfa'";
                presence
                  "enable post-convergence-lfa";
                description
                  "Configure backup along post convergence on this interface";
                uses apply-advanced;
    
                container node-protection {
                  presence
                    "enable node-protection";
                  description
                    "Enable node protection";
                  uses apply-advanced;
    
                  leaf cost {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 16777215";
                      }
                    }
                    description
                      "Cost for node protection";
                  }
                }  // container node-protection
    
                leaf srlg-protection {
                  type empty;
                  description
                    "Enable srlg protection";
                }
    
                leaf fate-sharing-protection {
                  type empty;
                  description
                    "Enable fate-sharing protection";
                }
              }  // container post-convergence-lfa
    
              container application-specific {
                description
                  "Advertise application-specific TE attributes";
                uses apply-advanced;
    
                list attribute-group {
                  key "name";
                  max-elements 1;
                  ordered-by user;
                  description
                    "Link attribute group name";
                  leaf name {
                    type string;
                    description
                      "Link attribute group name";
                  }
    
                  uses apply-advanced;
    
                  leaf te-metric {
                    junos:must "(".. application")";
                    junos:must-message "Atleast one application is must";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 16777215";
                      }
                    }
                    description
                      "Traffic engineering metric for this attribute group";
                  }
    
                  leaf-list admin-group {
                    type string;
                    max-elements 16;
                    ordered-by user;
                    description
                      "Administrative groups for this attribute-group";
                  }
    
                  container application {
                    junos:must "((".. delay-metric" || (".. admin-group" || (".. te-metric" || (".. admin-groups" || (".. legacy" || ".. advertise-delay-metric"))))))";
                    junos:must-message "Atleast one attribute must be configured";
                    description
                      "Standard Applications part of this attribute-group";
                    uses apply-advanced;
    
                    leaf flex-algorithm {
                      type empty;
                      description
                        "Set X flag in standard application bit mask";
                    }
                  }  // container application
                }  // list attribute-group
              }  // container application-specific
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable IS-IS for this level";
                }
              }  // choice enable-disable
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 16777215";
                  }
                }
                description
                  "Metric for this level";
              }
    
              leaf ipv4-multicast-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 16777215";
                  }
                }
                description
                  "IPv4 multicast metric for this level";
              }
    
              leaf ipv6-unicast-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 16777215";
                  }
                }
                description
                  "IPv6 unicast metric for this level";
              }
    
              leaf ipv6-multicast-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 16777215";
                  }
                }
                description
                  "IPv6 multicast metric for this level";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type enumeration {
                    enum "default" {
                      value 0;
                      description
                        "Default topology";
                    }
                    enum "ipv4-multicast" {
                      value 1;
                      description
                        "IPv4 multicast topology";
                    }
                    enum "ipv6-unicast" {
                      value 2;
                      description
                        "IPv6 unicast topology";
                    }
                    enum "ipv6-multicast" {
                      value 3;
                      description
                        "IPv6 multicast topology";
                    }
                  }
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 16777215";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 16777215";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
    
              leaf authentication-key {
                type jt:unreadable;
                status deprecated;
                description
                  "Authentication key (password)";
              }
    
              leaf authentication-type {
                type enumeration {
                  enum "md5" {
                    value 0;
                    status deprecated;
                    description
                      "MD5 authentication";
                  }
                  enum "simple" {
                    value 1;
                    status deprecated;
                    description
                      "Simple password authentication";
                  }
                }
                status deprecated;
                description
                  "Authentication type";
              }
    
              leaf hello-authentication-key {
                type jt:unreadable;
                description
                  "Authentication key (password) for hello packets";
              }
    
              leaf hello-authentication-type {
                type enumeration {
                  enum "md5" {
                    value 0;
                    description
                      "MD5 authentication";
                  }
                  enum "simple" {
                    value 1;
                    description
                      "Simple password authentication";
                  }
                }
                description
                  "Authentication type for hello packets";
              }
    
              leaf hello-authentication-key-chain {
                junos:must "(!(".. hello-authentication-type"))";
                junos:must-message "May not be configured with hello-authentication-type";
                junos:must "(!(".. hello-authentication-key"))";
                junos:must-message "May not be configured with hello-authentication-key";
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string {
                  junos:posix-pattern "[A-za-z]$";
                  junos:pattern-message "Keychain name must not end with number.";
                  length "1 .. 128";
                }
                description "Key chain name";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 21845";
                  }
                }
                units "seconds";
                description
                  "Interval between hello packet transmissions";
              }
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Time after which neighbors think the interface is down";
              }
    
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 127";
                  }
                }
                description
                  "Designated router election priority";
              }
    
              container flood-reflector {
                junos:must "(".. .. level 1 disable")";
                junos:must-message "flood-reflector cannot be enabled on level 1 interface";
                junos:must "(("protocols isis level 2 flood-reflector" && !(".. .. level 1 flood-reflector")))";
                junos:must-message "flood-reflector is only supported on level 2 interfaces";
                presence
                  "enable flood-reflector";
                description
                  "Configure interface as flood-reflector";
                uses apply-advanced;
    
                leaf cluster-id {
                  junos:must "("protocols isis level 2 flood-reflector client")";
                  junos:must-message "flood-reflector client is not configured at isis level";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  description "Cluster-ID";
                }
              }  // container flood-reflector
    
              container passive {
                presence "enable passive";
                description
                  "Do not run IS-IS at this level, but advertise it";
                uses apply-advanced;
    
                leaf remote-node-iso {
                  junos:must "(".. remote-node-id")";
                  junos:must-message "remote-node-id must be configured";
                  type jt:sysid;
                  description
                    "ISO System-ID of the remote node";
                }
    
                leaf remote-node-id {
                  junos:must "(".. remote-node-iso")";
                  junos:must-message "remote-node-iso must be configured";
                  type jt:ipv4addr;
                  description
                    "Remote address of the link";
                }
              }  // container passive
            }  // list level
    
            leaf delay-metric {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 16777215";
                }
              }
              units "microseconds";
              description "Delay metric";
            }
    
            container delay-measurement {
              presence
                "enable delay-measurement";
              description
                "Enable delay measurement";
              uses apply-advanced;
    
              leaf probe-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                units "seconds";
                description "Probe interval";
              }
    
              leaf probe-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 15";
                  }
                }
                units "seconds";
                description "Probe count";
              }
    
              container advertisement {
                description
                  "Delay advertisement";
                uses apply-advanced;
    
                container periodic {
                  description
                    "Periodic advertisement parameters";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 100";
                      }
                    }
                    units "percentage";
                    description "Threshold";
                  }
    
                  leaf interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "30 .. 3600";
                      }
                    }
                    units "seconds";
                    description "Interval";
                  }
                }  // container periodic
    
                container accelerated {
                  presence "enable accelerated";
                  description
                    "Accelerated advertisement parameters";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 100";
                      }
                    }
                    units "percentage";
                    description "Threshold";
                  }
                }  // container accelerated
              }  // container advertisement
            }  // container delay-measurement
    
            leaf no-advertise-adjacency-segment {
              type empty;
              description
                "Do not advertise an adjacency segment for this interface";
            }
    
            container auto-bandwidth {
              description
                "Auto bandwidth configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "("protocols isis source-packet-routing traffic-statistics statistics-granularity per-interface")";
                junos:must-message "Config protocols isis source-packet-routing traffic-statistics statistics-granularity per-interface is must";
                junos:must "("routing-options auto-bandwidth template $$")";
                junos:must-message "Referenced auto-bandwidth template must be defined";
                type string;
                description
                  "Auto bandwidth template name";
              }
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable Auto bandwidth on this interface";
                }
              }  // choice enable-disable
            }  // container auto-bandwidth
    
            choice protection-type {
              leaf link-protection {
                type empty;
                description
                  "Protect interface from link faults only";
              }
              leaf node-link-protection {
                type empty;
                description
                  "Protect interface from both link and node faults";
              }
            }  // choice protection-type
    
            leaf no-eligible-backup {
              type empty;
              description
                "Not eligible for backup traffic from protected interfaces";
            }
    
            leaf no-eligible-remote-backup {
              type empty;
              description
                "Not eligible for Remote-LFA backup traffic from protected interfaces";
            }
    
            container link-degradation-threshold {
              presence
                "enable link-degradation-threshold";
              description
                "Link up and down thresholds (in %) for proactive link protection";
              leaf link-down {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 100";
                  }
                }
                description
                  "Signal degradation threshold above which link marked down";
              }
    
              leaf link-up {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 100";
                  }
                }
                description
                  "Signal degradation threshold below which link is marked up.";
              }
            }  // container link-degradation-threshold
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable IS-IS on this interface";
              }
            }  // choice enable-disable
    
            leaf authentication-key {
              type jt:unreadable;
              status deprecated;
              description
                "Authentication key (password)";
            }
    
            leaf authentication-type {
              type enumeration {
                enum "md5" {
                  value 0;
                  status deprecated;
                  description
                    "MD5 authentication";
                }
                enum "simple" {
                  value 1;
                  status deprecated;
                  description
                    "Simple password authentication";
                }
              }
              status deprecated;
              description "Authentication type";
            }
    
            leaf flood-group {
              type string {
                junos:posix-pattern "^[[:xdigit:]]{2}.(([[:xdigit:]]){2}){1,2}((.(([[:xdigit:]]){2}){1,2}){0,1}){0,5}$";
                junos:pattern-message "At max 26 hexa decimal digits, standard ISO area ID format";
              }
              description
                "ISO Area that this interface should send LSPs to";
            }
    
            leaf hello-authentication-key {
              type jt:unreadable;
              status deprecated;
              description
                "Authentication key (password) for hello packets";
            }
    
            leaf hello-authentication-type {
              type enumeration {
                enum "md5" {
                  value 0;
                  status deprecated;
                  description
                    "MD5 authentication";
                }
                enum "simple" {
                  value 1;
                  status deprecated;
                  description
                    "Simple password authentication";
                }
              }
              status deprecated;
              description
                "Authentication type for hello packets";
            }
    
            leaf hello-padding-type {
              type enumeration {
                enum "strict" {
                  value 0;
                  description
                    "Padding for all adjacency states";
                }
                enum "adaptive" {
                  value 1;
                  description
                    "Padding until state of neighbor adjacency is 'up'";
                }
                enum "loose" {
                  value 2;
                  description
                    "Padding until state of adjacency is 'initializing'";
                }
                enum "disable" {
                  value 3;
                  description
                    "Do not add any padding for hello packets";
                }
              }
              default "loose";
              description
                "Type of padding for hello packets";
            }
    
            leaf interface-group-holddown-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 60";
                }
              }
              units "seconds";
              description
                "Time to wait before including in BBM calculation";
            }
    
            choice layer2-map-choice {
              leaf layer2-map {
                type empty;
                description
                  "Kernel ARP/ND creation for nexthops";
              }
              leaf no-layer2-map {
                type empty;
                description
                  "Don't kernel ARP/ND creation for nexthops";
              }
            }  // choice layer2-map-choice
    
            leaf max-hello-size {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "512 .. 16000";
                }
              }
              description
                "Maximum size allowed for ISIS Hello PDUs";
            }
    
            leaf lsp-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1000";
                }
              }
              units "milliseconds";
              default "100";
              description
                "Interval between LSP transmissions";
            }
    
            container csnp-interval {
              description
                "Rate of CSN packets (for LAN interfaces only)";
              choice csnp_interval_option {
                leaf csnp-interval-number {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  units "seconds";
                  description
                    "Interval between CSN packets";
                }
                leaf disable {
                  type empty;
                  description
                    "Do not send CSN packets on this interface";
                }
              }  // choice csnp_interval_option
            }  // container csnp-interval
    
            container strict-dual-isis {
              junos:must "(!(".. .. topologies"))";
              junos:must-message "strict-dual-isis is not allowed with multi-topologies";
              presence "enable strict-dual-isis";
              description
                "Ensure both ipv4 and ipv6 connectivity for adjacencies on this interface";
              uses apply-advanced;
    
              leaf holdown {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                default "12";
                description
                  "Set the holddown timer for strict spf computation";
              }
            }  // container strict-dual-isis
    
            container mesh-group {
              description
                "Add the interface to a mesh group";
              choice mesh_group_option {
                leaf mesh-group-number {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Mesh group number for this interface";
                }
                leaf blocked {
                  type empty;
                  description
                    "Do not flood new LSPs on this interface";
                }
              }  // choice mesh_group_option
            }  // container mesh-group
    
            leaf point-to-point {
              type empty;
              description
                "Treat interface as point to point";
            }
    
            container passive {
              presence "enable passive";
              description
                "Do not run IS-IS, but advertise it";
              uses apply-advanced;
    
              leaf remote-node-iso {
                junos:must "(".. remote-node-id")";
                junos:must-message "remote-node-id must be configured";
                type jt:sysid;
                description
                  "ISO System-ID of the remote node";
              }
    
              leaf remote-node-id {
                junos:must "(".. remote-node-iso")";
                junos:must-message "remote-node-iso must be configured";
                type jt:ipv4addr;
                description
                  "Remote address of the link";
              }
            }  // container passive
    
            leaf checksum {
              type empty;
              description
                "Enable checksum for packets on this interface";
            }
    
            leaf no-unicast-topology {
              type empty;
              description
                "Do not include this interface in the unicast topology";
            }
    
            leaf no-ipv4-multicast {
              type empty;
              description
                "Do not include this interface in the IPv4 multicast topology";
            }
    
            leaf no-ipv6-unicast {
              type empty;
              description
                "Do not include this interface in the IPv6 unicast topology";
            }
    
            leaf no-ipv6-multicast {
              type empty;
              description
                "Do not include this interface in the IPv6 multicast topology";
            }
    
            leaf no-adjacency-down-notification {
              type empty;
              description
                "Do not inform other protocols about adjacency down events";
            }
    
            container bfd-liveness-detection {
              junos:must "(!(".. family inet bfd-liveness-detection"))";
              junos:must-message "To configure bfd-liveness-detection, 'family inet bfd-liveness-detection' must not be configured";
              status deprecated;
              description
                "Bidirectional Forwarding Detection options";
              uses apply-advanced;
    
              leaf version {
                type enumeration {
                  enum "0" {
                    value 0;
                    description
                      "BFD version 0 (deprecated)";
                  }
                  enum "1" {
                    value 1;
                    description "BFD version 1";
                  }
                  enum "automatic" {
                    value 2;
                    description
                      "Choose BFD version automatically";
                  }
                }
                default "automatic";
                description
                  "BFD protocol version number";
              }
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit and receive interval";
              }
    
              leaf minimum-transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                status deprecated;
                description
                  "Minimum transmit interval";
              }
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval";
              }
    
              leaf multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                default "3";
                description
                  "Detection time multiplier";
              }
    
              choice adaptation-choice {
                leaf no-adaptation {
                  type empty;
                  description
                    "Disable adaptation";
                }
              }  // choice adaptation-choice
    
              container transmit-interval {
                description
                  "Transmit-interval options";
                uses apply-advanced;
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit interval";
                }
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High transmit interval triggering a trap";
                }
              }  // container transmit-interval
    
              container detection-time {
                description
                  "Detection-time options";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High detection-time triggering a trap";
                }
              }  // container detection-time
    
              container authentication {
                description
                  "Authentication options";
                uses apply-advanced;
    
                leaf key-chain {
                  junos:must "(".. algorithm")";
                  junos:must-message "May not be configured without algorithm";
                  junos:must "("security authentication-key-chains key-chain $$")";
                  junos:must-message "Referenced key-chain must be defined";
                  type string;
                  description "Key chain name";
                }
    
                leaf algorithm {
                  junos:must "(".. key-chain")";
                  junos:must-message "May not be configured without key-chain";
                  type enumeration {
                    enum "simple-password" {
                      value 0;
                      description
                        "Simple password";
                    }
                    enum "keyed-md5" {
                      value 1;
                      description
                        "Keyed message Digest 5";
                    }
                    enum "meticulous-keyed-md5" {
                      value 2;
                      description
                        "Meticulous keyed message Digest 5";
                    }
                    enum "keyed-sha-1" {
                      value 3;
                      description
                        "Keyed secure hash algorithm (SHA1) ";
                    }
                    enum
                      "meticulous-keyed-sha-1" {
                      value 4;
                      description
                        "Meticulous keyed secure hash algorithm (SHA1) ";
                    }
                  }
                  description "Algorithm name";
                }
    
                leaf loose-check {
                  type empty;
                  description
                    "Verify authentication only if authentication is negotiated";
                }
              }  // container authentication
            }  // container bfd-liveness-detection
    
            list family {
              key "name";
              ordered-by user;
              description
                "Address family specific interface attributes";
              leaf name {
                type enumeration {
                  enum "inet" {
                    value 0;
                    description "IPv4 family";
                  }
                  enum "inet6" {
                    value 1;
                    description "IPv6 family";
                  }
                }
              }
    
              uses apply-advanced;
    
              container bfd-liveness-detection {
                junos:must "(!((".. .. bfd-liveness-detection" && ".. .. family inet bfd-liveness-detection")))";
                junos:must-message "bfd-liveness-detection and 'family inet bfd-liveness-detection' cannot be configured at the same time";
                description
                  "Bidirectional Forwarding Detection options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
              }  // container bfd-liveness-detection
            }  // list family
          }  // list interface
    
          container source-packet-routing {
            junos:must "(!(".. srm6"))";
            junos:must-message "must not have 'protocols isis srm6' configured";
            presence
              "enable source-packet-routing";
            description
              "Enable Source Packet Routing (SPRING)";
            uses apply-advanced;
    
            container adjacency-segment {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              description
                "Configure attributes for Adjacency Segments in SPRING";
              uses apply-advanced;
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "180000 .. 900000";
                  }
                }
                description
                  "Duration(ms) for which adjacency segments will be retained after isolating from an interface";
              }
            }  // container adjacency-segment
    
            container udp-tunneling {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              description
                "Enable SR over UDP feature";
              uses apply-advanced;
    
              leaf encapsulation {
                type empty;
                description
                  "Enable UDP Tunnel Encapsulation";
              }
    
              leaf decapsulation {
                type empty;
                description
                  "Enable UDP Tunnel decapsulation";
              }
            }  // container udp-tunneling
    
            container srgb {
              junos:must "(!(".. node-segment index-range"))";
              junos:must-message "May not be confiugred with node-segment index-range";
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              description
                "Set the SRGB global block in SPRING";
              leaf start-label {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Start range for SRGB label block";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Index to the SRGB start label block";
              }
            }  // container srgb
    
            container node-segment {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              description
                "Enable support for Node segments in SPRING";
              uses apply-advanced;
    
              leaf ipv4-index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set IPv4 Node Segment index";
              }
    
              leaf ipv6-index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set IPv6 Node Segment index";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "32 .. 16385";
                  }
                }
                description
                  "Set Range of Node Segment indices allowed";
              }
            }  // container node-segment
    
            leaf-list flex-algorithm {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "128 .. 255";
                }
              }
              max-elements 16;
              description
                "Flex-algorithms we would like to participate in";
            }
    
            leaf use-flex-algorithm-metric-always {
              type empty;
              description
                "Use flex-algo prefix metric whenever available";
            }
    
            leaf strict-asla-based-flex-algorithm {
              type empty;
              description
                "Flex-Algorithm to ignore links not having ASLA sub-TLVs";
            }
    
            leaf new-capability-subtlv {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              type empty;
              description
                "Advertise all ranges in single spring capability subtlv";
            }
    
            leaf explicit-null {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              type empty;
              description
                "Set E and P bits in all Prefix SID advertisements";
            }
    
            leaf mapping-server {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              junos:must "("routing-options source-packet-routing mapping-server-entry $$")";
              junos:must-message "Referenced source-packet-routing mapping-server-entry must be defined";
              type string;
              description "Mapping server name";
            }
    
            leaf no-strict-spf {
              type empty;
              description
                " Disable strict spf algo 1 advertisement";
            }
    
            leaf ldp-stitching {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              type empty;
              description
                "Enable SR to LDP stitching";
            }
    
            container srv6 {
              presence "enable srv6";
              description
                "Enable IPv6 Segment Routing (SRv6)";
              uses apply-advanced;
    
              list locator {
                key "name";
                ordered-by user;
                description "SRv6 Locator";
                leaf name {
                  junos:must "("routing-options source-packet-routing srv6 locator $$")";
                  junos:must-message "Referenced source-packet-routing srv6 must be defined";
                  type string;
                  description "Locator name";
                }
    
                uses apply-advanced;
    
                list end-sid {
                  key "name";
                  ordered-by user;
                  leaf name {
                    type jt:ipv6addr;
                  }
    
                  uses apply-advanced;
    
                  container flavor {
                    presence "enable flavor";
                    uses apply-advanced;
    
                    leaf psp {
                      type empty;
                      description
                        "Penultimate segment pop of the SRH";
                    }
    
                    leaf usp {
                      type empty;
                      description
                        "Ultimate segment pop of the SRH";
                    }
    
                    leaf usd {
                      type empty;
                      description
                        "Ultimate segment decapsulation";
                    }
                  }  // container flavor
                }  // list end-sid
              }  // list locator
            }  // container srv6
    
            container sensor-based-stats {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              description
                "Configure sensor based stats in SPRING";
              uses apply-advanced;
    
              container per-interface-per-member-link {
                description
                  "Configure sensor based stats per nexthop";
                leaf ingress {
                  type empty;
                  description
                    "Enable sensor based stats on ingress interface";
                }
    
                leaf egress {
                  type empty;
                  description
                    "Enable sensor based stats on egress interface";
                }
              }  // container per-interface-per-member-link
    
              container per-sid {
                description
                  "Configure sensor based stats per spring route";
                leaf ingress {
                  type empty;
                  description
                    "Enable sensor based stats for per-sid ingress accounting";
                }
    
                leaf egress {
                  type empty;
                  description
                    "Enable sensor based stats for IP-MPLS egress accounting";
                }
              }  // container per-sid
            }  // container sensor-based-stats
    
            container traffic-statistics {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              description
                "Enable support for traffic statistics in SPRING";
              uses apply-advanced;
    
              container statistics-granularity {
                description
                  "Granularity for traffic statistics in SPRING";
                uses apply-advanced;
    
                leaf per-interface {
                  type empty;
                  description
                    "Interface Based traffic statistics in SPRING";
                }
              }  // container statistics-granularity
    
              leaf auto-bandwidth {
                junos:must "("protocols isis source-packet-routing traffic-statistics statistics-granularity per-interface")";
                junos:must-message "Config protocols isis source-packet-routing traffic-statistics statistics-granularity per-interface is must";
                junos:must "("routing-options auto-bandwidth template $$")";
                junos:must-message "Referenced auto-bandwidth template must be defined";
                type string;
                description
                  "Auto bandwidth name";
              }
            }  // container traffic-statistics
          }  // container source-packet-routing
    
          container srm6 {
            junos:must "(!(".. source-packet-routing"))";
            junos:must-message "must not have 'protocols isis source-packet-routing' configured";
            presence "enable srm6";
            description "Enable SRm6";
            uses apply-advanced;
    
            container sid {
              description
                "Configure attributes for SID in srm6";
              uses apply-advanced;
    
              leaf node-sid {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description "Set Node SID Value";
              }
    
              leaf address {
                type jt:ipv6addr;
                description
                  "IPv6 address corresponding to SID";
              }
            }  // container sid
          }  // container srm6
    
          list level {
            key "name";
            ordered-by user;
            description
              "Configure global level attributes";
            leaf name {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 2";
                }
              }
              description "IS-IS level number";
            }
    
            uses apply-advanced;
    
            leaf labeled-preference {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "labeled-preference cannot be specified without 'protocols isis source-packet-routing'";
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of labeled IS-IS routes";
            }
    
            leaf srv6-preference {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "srv6-preference cannot be specified without 'protocols isis source-packet-routing'";
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of SRV6 IS-IS routes";
            }
    
            leaf flex-algorithm-preference {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "flex-algorithm-preference cannot be specified without 'protocols isis source-packet-routing'";
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of flex-algorithm L-ISIS routes";
            }
    
            container source-packet-routing {
              presence
                "enable source-packet-routing";
              description
                "Enable Source Packet Routing (SPRING)";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable Source Packet Routing on this level";
                }
              }  // choice enable-disable
    
              leaf srms-preference {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Set SRMS preference value";
              }
            }  // container source-packet-routing
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable IS-IS on this level";
              }
            }  // choice enable-disable
    
            leaf authentication-key {
              type jt:unreadable;
              description
                "Authentication key (password)";
            }
    
            leaf authentication-type {
              type enumeration {
                enum "md5" {
                  value 0;
                  description
                    "MD5 authentication";
                }
                enum "simple" {
                  value 1;
                  description
                    "Simple password authentication";
                }
              }
              description "Authentication type";
            }
    
            leaf purge-originator {
              type enumeration {
                enum "self" {
                  value 0;
                  description
                    "Add POI only for self-originated purge LSPs";
                }
                enum "empty" {
                  value 1;
                  description
                    "Add POI for purge LSPs who do not have POI information";
                }
              }
              description
                "Add Purge Originator information";
            }
    
            leaf no-hello-authentication {
              type empty;
              description
                "Disable authentication for hello packets";
            }
    
            leaf no-csnp-authentication {
              type empty;
              description
                "Disable authentication for CSN packets";
            }
    
            leaf no-psnp-authentication {
              type empty;
              description
                "Disable authentication for PSN packets";
            }
    
            leaf authentication-key-chain {
              junos:must "(!(".. authentication-type"))";
              junos:must-message "May not be configured with authentication-type";
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              junos:must "("security authentication-key-chains key-chain $$")";
              junos:must-message "Referenced key-chain must be defined";
              type string {
                junos:posix-pattern "[A-za-z]$";
                junos:pattern-message "Keychain name must not end with number.";
                length "1 .. 128";
              }
              description "Key chain name";
            }
    
            leaf wide-metrics-only {
              junos:must "(!(".. .. clns-routing"))";
              junos:must-message "wide-metrics-only cannot be specified with clns-routing";
              type empty;
              description
                "Generate wide metrics only";
            }
    
            leaf preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of internal routes";
            }
    
            leaf external-preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of external routes";
            }
    
            leaf prefix-export-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Maximum number of external prefixes that can be exported";
            }
    
            container flood-reflector {
              junos:must "(!(".. .. level 1 flood-reflector"))";
              junos:must-message "Flood-reflector is supported only in level 2";
              description
                "Enable flood-reflector";
              uses apply-advanced;
    
              container reflector {
                junos:must "(!(".. client"))";
                junos:must-message "flood-reflector and client can't be configured together";
                description
                  "Configure this as a flood-reflector";
                uses apply-advanced;
    
                leaf cluster-id {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  description "Cluster-ID";
                }
              }  // container reflector
    
              leaf client {
                type empty;
                description
                  "Configure interface as flood-reflector client";
              }
            }  // container flood-reflector
          }  // list level
    
          list interface-group {
            key "name";
            description
              "Interface grouping configuration";
            leaf name {
              type string;
              description "Interface group name";
            }
    
            uses apply-advanced;
    
            list level {
              key "name";
              ordered-by user;
              description
                "Configure levels on this interface-group";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 2";
                  }
                }
                description "IS-IS level number";
              }
    
              uses apply-advanced;
    
              container ipv4-adjacency-segment {
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the level";
                junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                description
                  "Configure ipv4 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  description
                    "Adjacency SID is eligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container protected
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container unprotected
              }  // container ipv4-adjacency-segment
    
              container ipv6-adjacency-segment {
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "ipv6-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same level";
                junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                junos:must-message "ipv6-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                description
                  "Configure ipv6 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  description
                    "Adjacency SID is eligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container protected
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container unprotected
              }  // container ipv6-adjacency-segment
    
              container srm6-adjacency-segment {
                description
                  "Configure srm6 adjacency segment";
                uses apply-advanced;
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  leaf sid {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Set Adjacency SID Value";
                  }
                }  // container unprotected
              }  // container srm6-adjacency-segment
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type enumeration {
                    enum "default" {
                      value 0;
                      description
                        "Default topology";
                    }
                    enum "ipv4-multicast" {
                      value 1;
                      description
                        "IPv4 multicast topology";
                    }
                    enum "ipv6-unicast" {
                      value 2;
                      description
                        "IPv6 unicast topology";
                    }
                    enum "ipv6-multicast" {
                      value 3;
                      description
                        "IPv6 multicast topology";
                    }
                  }
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 16777215";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 16777215";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list level
    
            container link-group-protection {
              junos:must "(!(".. .. backup-spf-options"))";
              junos:must-message "Backup SPF options can't be configured";
              description
                "Configure link group protection";
              uses apply-advanced;
    
              leaf minimum-bandwidth {
                type string;
                description
                  "Minimum bandwidth to carry traffic";
              }
    
              leaf revert-bandwidth {
                type string;
                description
                  "Revert bandwidth to carry traffic";
              }
            }  // container link-group-protection
    
            list interface {
              key "name";
              description
                "List interfaces for this group";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf weight {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Interface weight for adjacency set";
              }
            }  // list interface
          }  // list interface-group
    
          container spf-options {
            description
              "Configure SPF attributes";
            uses apply-advanced;
    
            container microloop-avoidance {
              description
                "Configure microloop avoidance mechanisms";
              uses apply-advanced;
    
              container post-convergence-path {
                junos:must "(!(".. use-route-convergence-delay"))";
                junos:must-message "use-route-convergence-delay is not allowed with post-convergence-path";
                presence
                  "enable post-convergence-path";
                description
                  "Temporarily install post-convergence path for routes potentially affected by microloops";
                uses apply-advanced;
    
                leaf delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "500 .. 60000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time after which temporary post-convergence paths are removed";
                }
    
                leaf maximum-labels {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 8";
                    }
                  }
                  description
                    "Set maximum number of label supported for Micro-Loop-Avoidance calculations";
                }
    
                leaf maximum-srv6-sids {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 6";
                    }
                  }
                  description
                    "Set maximum number of SRV6 SIDs supported for Micro-Loop-Avoidance calculations";
                }
              }  // container post-convergence-path
            }  // container microloop-avoidance
    
            leaf delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "50 .. 1000";
                }
              }
              units "milliseconds";
              description
                "Time to wait before running an SPF";
            }
    
            leaf holddown {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2000 .. 10000";
                }
              }
              units "milliseconds";
              description
                "Time to hold down before running an SPF";
            }
    
            leaf rapid-runs {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 5";
                }
              }
              description
                "Number of rapid SPF runs before SPF holddown";
            }
    
            container multipath {
              description
                "Configure multipath options";
              uses apply-advanced;
    
              container weighted {
                description
                  "Weighted multipath options";
                uses apply-advanced;
    
                leaf one-hop {
                  type empty;
                  description
                    "Enable load balancing on onehop multipath based on interface bandwidth";
                }
              }  // container weighted
            }  // container multipath
          }  // container spf-options
    
          container traceoptions {
            description
              "Trace options for IS-IS";
            uses apply-advanced;
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "traffic-statistics" {
                    value 0;
                    description
                      "Trace traffic-statistics related events";
                  }
                  enum "post-convergence-lfa" {
                    value 1;
                    description
                      "Trace post-convergence-lfa related events";
                  }
                  enum "error" {
                    value 2;
                    description
                      "Trace errored packets";
                  }
                  enum "spf" {
                    value 3;
                    description
                      "Trace SPF events";
                  }
                  enum "packets" {
                    value 4;
                    description
                      "Trace IS-IS packets";
                  }
                  enum "hello" {
                    value 5;
                    description
                      "Trace hello packets";
                  }
                  enum "lsp" {
                    value 6;
                    description
                      "Trace link-state packets";
                  }
                  enum "psn" {
                    value 7;
                    description
                      "Trace partial sequence number (PSN) packets";
                  }
                  enum "csn" {
                    value 8;
                    description
                      "Trace complete sequence number (CSN) packets";
                  }
                  enum "layer2-map" {
                    value 9;
                    description
                      "Trace ARP/ND kernel state manipulation";
                  }
                  enum "lsp-generation" {
                    value 10;
                    description
                      "Trace LSP generation";
                  }
                  enum "graceful-restart" {
                    value 11;
                    description
                      "Trace graceful restart events";
                  }
                  enum "ldp-synchronization" {
                    value 12;
                    description
                      "Trace synchronization between IS-IS and LDP";
                  }
                  enum "nsr-synchronization" {
                    value 13;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "spring" {
                    value 14;
                    description
                      "Trace source packet routing";
                  }
                  enum "prefix-sid" {
                    value 15;
                    description
                      "Trace source packet routing, prefix-sids";
                  }
                  enum "flex-algorithm" {
                    value 16;
                    description
                      "Trace flex-algorithm related events";
                  }
                  enum "adj-sid" {
                    value 17;
                    description
                      "Trace adj-sid related events";
                  }
                  enum "route" {
                    value 18;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 19;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 20;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 21;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 22;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 23;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 24;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "srv6" {
                    value 25;
                    description
                      "Trace srv6 related events";
                  }
                  enum "rmopd" {
                    value 26;
                    description
                      "Trace rmopd interactions";
                  }
                  enum "all" {
                    value 27;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
          }  // container traceoptions
    
          container backup-spf-options {
            description
              "Configure backup SPF attributes";
            uses apply-advanced;
    
            container remote-backup-calculation {
              junos:must "(!(".. .. backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols isis backup-spf-options use-post-convergence-lfa'";
              presence
                "enable remote-backup-calculation";
              description
                "Calculate Remote LFA backup nexthops";
              uses apply-advanced;
            }  // container remote-backup-calculation
    
            container use-post-convergence-lfa {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "Configuration of 'protocols isis source-packet-routing' is must";
              presence
                "enable use-post-convergence-lfa";
              description
                "Calculate Post Convergence Backup Nexthops";
              uses apply-advanced;
    
              leaf maximum-labels {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 8";
                  }
                }
                description
                  "Set maximum number of label supported for post convergence path calculations";
              }
    
              leaf maximum-srv6-sids {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 6";
                  }
                }
                description
                  "Set maximum number of SRV6 SIDs for post convergence path calculations";
              }
    
              leaf maximum-backup-paths {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 8";
                  }
                }
                description
                  "Set maximum equal cost backup post convergence paths";
              }
            }  // container use-post-convergence-lfa
    
            container use-source-packet-routing {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "Use of SPRING paths as backup can't be configured without configuring 'protocols isis source-packet-routing'";
              presence
                "enable use-source-packet-routing";
              description
                "Use SPRING routed paths for protection";
              uses apply-advanced;
            }  // container use-source-packet-routing
    
            leaf per-prefix-calculation {
              type empty;
              description
                "Calculate backup nexthops for non-best prefix originators";
            }
    
            leaf node-link-degradation {
              junos:must "(!(".. .. backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols isis backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Degrade to link protection when nodelink protection not available";
            }
          }  // container backup-spf-options
    
          list context-identifier {
            key "name";
            ordered-by user;
            description
              "Configuration for advertisement of a context-identifier ";
            leaf name {
              type jt:ipprefix;
              description
                "Context identifier range";
            }
    
            uses apply-advanced;
    
            list level {
              key "name";
              ordered-by user;
              description
                "Configure global level attributes";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 2";
                  }
                }
                description "IS-IS level number";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable advertisements to this level";
                }
              }  // choice enable-disable
            }  // list level
          }  // list context-identifier
    
          container traffic-engineering {
            description
              "Configure traffic engineering attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable traffic engineering";
              }
            }  // choice enable-disable
    
            leaf l3-unicast-topology {
              type empty;
              description
                "Download IGP topology into TED";
            }
    
            leaf ipv6 {
              type empty;
              description "Enable TEDv6";
            }
    
            leaf credibility-protocol-preference {
              type empty;
              description
                "Follow IGP protocol preference for TED protocol credibility";
            }
    
            leaf ipv4-multicast-rpf-routes {
              junos:must "(!(".. .. topologies ipv4-multicast"))";
              junos:must-message "ipv4-multicast-rpf-routes cannot be used with the ipv4-multicast topology";
              junos:must "(!(".. .. multicast-topology"))";
              junos:must-message "ipv4-multicast-rpf-routes cannot be used with multicast-topology";
              junos:must "(".. shortcuts")";
              junos:must-message "ipv4-multicast-rpf-routes cannot be used without shortcuts";
              type empty;
              status deprecated;
              description
                "Install IPv4 routes for multicast RPF checks into inet.2";
            }
    
            leaf ignore-lsp-metrics {
              type empty;
              description
                "Ignore label-switched path metrics when doing shortcuts";
            }
    
            container tunnel-source-protocol {
              description
                "Protocols from which to pick label-switched paths";
              uses apply-advanced;
    
              container rsvp {
                presence "enable rsvp";
                description
                  "Pick label-switched paths from rsvp";
                uses apply-advanced;
    
                leaf preference {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Preference for label-switched paths from this protocol";
                }
              }  // container rsvp
    
              container spring-te {
                presence "enable spring-te";
                description
                  "Pick label-switched paths from spring-te";
                uses apply-advanced;
    
                leaf preference {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Preference for label-switched paths from this protocol";
                }
              }  // container spring-te
            }  // container tunnel-source-protocol
    
            list family {
              key "name";
              ordered-by user;
              description
                "Address family specific traffic-engineering attributes";
              leaf name {
                type enumeration {
                  enum "inet" {
                    value 0;
                    description "IPv4 family";
                  }
                  enum "inet6" {
                    value 1;
                    description "IPv6 family";
                  }
                  enum "inet-mpls" {
                    value 2;
                    description
                      "IPv4-MPLS family";
                  }
                  enum "inet6-mpls" {
                    value 3;
                    description
                      "IPv6-MPLS family";
                  }
                }
              }
    
              uses apply-advanced;
    
              container shortcuts {
                junos:must "(!(".. .. no-ldp-shortcuts"))";
                junos:must-message "Shortcuts configuration cannot be used with no-ldp-shortcuts";
                junos:must "(!(".. .. shortcuts"))";
                junos:must-message "per-family shortcuts configuration cannot be used with global shortcuts enabled";
                junos:must "(!(".. .. disable"))";
                junos:must-message "shortcuts cannot be used without traffic-engineering enabled";
                presence "enable shortcuts";
                description
                  "Use label-switched paths as next hops, if possible";
                uses apply-advanced;
    
                leaf multicast-rpf-routes {
                  junos:must "(!(".. .. .. .. multicast-topology"))";
                  junos:must-message "ipv4 multicast-rpf-routes cannot be used with the multicast-topology";
                  junos:must "(!(".. .. .. .. topologies ipv4-multicast"))";
                  junos:must-message "ipv4 multicast-rpf-routes cannot be used with the ipv4-multicast topology";
                  type empty;
                  description
                    "Install routes for multicast RPF checks into multicast RIB";
                }
    
                leaf-list import {
                  type jt:policy-algebra;
                  ordered-by user;
                  description
                    "Import policy for shortcut";
                }
              }  // container shortcuts
            }  // list family
    
            container shortcuts {
              presence "enable shortcuts";
              status deprecated;
              description
                "Use label-switched paths as next hops, if possible";
              uses apply-advanced;
    
              leaf ignore-lsp-metrics {
                type empty;
                status deprecated;
                description
                  "Ignore label-switched path metrics when doing shortcuts";
              }
            }  // container shortcuts
    
            container multipath {
              description
                "Configure label-switched-path multipath behavior";
              uses apply-advanced;
    
              leaf lsp-equal-cost {
                junos:must "((".. .. shortcuts" || (".. .. family $$={inet} shortcuts" || (".. .. family $$={inet6} shortcuts" || ".. .. family $$={iso} shortcuts"))))";
                junos:must-message "Traffic engineering shortcuts for inet, inet6 or iso family must be configured.";
                type empty;
                description
                  "Include equal cost label-switched-paths";
              }
            }  // container multipath
    
            container advertisement {
              description
                "Configure traffic engineering attribute advertisements";
              uses apply-advanced;
    
              leaf always {
                type empty;
                description
                  "Advertise applicable legacy TE attributes always";
              }
    
              container application-specific {
                description
                  "Advertise application-specific TE attributes";
                uses apply-advanced;
    
                container all-applications {
                  presence
                    "enable all-applications";
                  description
                    "Advertise common application-specific link attributes";
                  uses apply-advanced;
    
                  leaf legacy {
                    type empty;
                    description
                      "Use legacy TE attributes for this application";
                  }
                }  // container all-applications
              }  // container application-specific
            }  // container advertisement
          }  // container traffic-engineering
    
          list label-switched-path {
            junos:must "(!(".. traffic-engineering ipv4-multicast-rpf-routes"))";
            junos:must-message "cannot advertise LSPs when using ipv4-multicast-rpf-routes";
            key "name";
            ordered-by user;
            description
              "Configuration for advertisement of a label-switched path";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description
                "Name of label-switched path to be advertised";
            }
    
            uses apply-advanced;
    
            list level {
              key "name";
              ordered-by user;
              description
                "Configure global level attributes";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 2";
                  }
                }
                description "IS-IS level number";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable advertisements to this level";
                }
              }  // choice enable-disable
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 16777215";
                  }
                }
                description
                  "SPF metric for this level";
              }
            }  // list level
          }  // list label-switched-path
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable IS-IS";
            }
          }  // choice enable-disable
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
    
          leaf reference-bandwidth {
            type string;
            description
              "Bandwidth for calculating metric defaults";
          }
    
          choice layer2-map-choice {
            leaf layer2-map {
              type empty;
              description
                "Kernel ARP/ND creation for nexthops";
            }
            leaf no-layer2-map {
              type empty;
              description
                "Don't kernel ARP/ND creation for nexthops";
            }
          }  // choice layer2-map-choice
    
          leaf job-stats {
            type empty;
            description "Collect job statistics";
          }
    
          leaf lsp-lifetime {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "350 .. 65535";
              }
            }
            units "seconds";
            description "Lifetime of LSPs";
          }
    
          leaf max-lsp-size {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "512 .. 1492";
              }
            }
            default "1492";
            description
              "Maximum size allowed for LSPs";
          }
    
          leaf max-hello-size {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "512 .. 16000";
              }
            }
            default "1492";
            description
              "Maximum size allowed for ISIS Hello PDUs";
          }
    
          leaf max-snp-size {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "512 .. 1400";
              }
            }
            default "1400";
            description
              "Maximum size allowed for Sequence Number (Complete/Partial) PDUs";
          }
    
          leaf spf-delay {
            junos:must "(!(".. spf-options delay"))";
            junos:must-message "You can only configure either spf-delay or delay under spf-options";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "50 .. 120000";
              }
            }
            units "milliseconds";
            status deprecated;
            description
              "Time to wait before running an SPF";
          }
    
          leaf authentication-key {
            type jt:unreadable;
            status deprecated;
            description
              "Authentication key (password)";
          }
    
          leaf authentication-type {
            type enumeration {
              enum "md5" {
                value 0;
                status deprecated;
                description "MD5 authentication";
              }
              enum "simple" {
                value 1;
                status deprecated;
                description
                  "Simple password authentication";
              }
            }
            status deprecated;
            description "Authentication type";
          }
    
          leaf loose-authentication-check {
            type empty;
            description
              "Verify authentication only if PDU has authentication TLV";
          }
    
          leaf max-areas {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "3 .. 36";
              }
            }
            default "3";
            description
              "Maximum number of advertised Areas";
          }
    
          leaf no-authentication-check {
            type empty;
            description
              "Disable authentication checking";
          }
    
          leaf no-ipv4-routing {
            type empty;
            description "Disable IPv4 routing";
          }
    
          leaf no-ipv6-routing {
            type empty;
            description "Disable IPv6 routing";
          }
    
          leaf no-adjacency-holddown {
            type empty;
            description
              "Disable adjacency hold down";
          }
    
          leaf multicast-topology {
            type empty;
            status deprecated;
            description
              "Enable multicast topology";
          }
    
          leaf ignore-attached-bit {
            type empty;
            description
              "Ignore the attached bit in Level 1 LSPs";
          }
    
          container rib-group {
            description
              "Routing table group for importing IS-IS routes";
            uses rib_group_type;
          }  // container rib-group
    
          container strict-dual-isis {
            junos:must "(!(".. topologies"))";
            junos:must-message "strict-dual-isis is not allowed with multi-topologies";
            presence "enable strict-dual-isis";
            description
              "Ensure both ipv4 and ipv6 connectivity for all adjacencies";
            uses apply-advanced;
    
            leaf holdown {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              default "12";
              description
                "Set the holddown timer for strict spf computation";
            }
          }  // container strict-dual-isis
    
          container topologies {
            description "Enable topologies";
            uses apply-advanced;
    
            leaf ipv4-multicast {
              type empty;
              description
                "Enable IPv4-multicast topology";
            }
    
            leaf ipv6-unicast {
              type empty;
              description
                "Enable IPv6-unicast topology";
            }
    
            leaf ipv6-multicast {
              type empty;
              description
                "Enable IPv6-multicast topology";
            }
          }  // container topologies
    
          container overload {
            presence "enable overload";
            description
              "Set the overload bit (no transit traffic)";
            uses apply-advanced;
    
            leaf timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 3600";
                }
              }
              units "seconds";
              description
                "Time after which overload bit is reset";
            }
    
            leaf advertise-high-metrics {
              type empty;
              description
                "Advertise high metrics instead of setting the overload bit";
            }
    
            leaf allow-route-leaking {
              type empty;
              description
                "Allow routes to be leaked when overload is configured";
            }
    
            leaf internal-prefixes {
              type empty;
              description
                "Allow internal prefixes to be advertised with high metric";
            }
    
            leaf external-prefixes {
              type empty;
              description
                "Allow external prefixes to be advertised with high metric";
            }
          }  // container overload
    
          container graceful-restart {
            description
              "IS-IS graceful restart options";
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf helper-disable {
              type empty;
              description
                "Disable graceful restart helper capability";
            }
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 300";
                }
              }
              units "seconds";
              description
                "Maximum time for graceful restart to finish";
            }
          }  // container graceful-restart
        }  // grouping juniper-protocols-isis
    
        grouping juniper-protocols-l2vpn {
          description
            "Layer 2 VPN, VPLS or EVPN configuration";
          uses apply-advanced;
    
          leaf bum-hashing {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "Bum-hashing knob is only applicable for instance type vpls";
            type empty;
            description
              "Enable BUM hashing feature in the instance";
          }
    
          container mac-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC address forwarding table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container mac-table-size
    
          container mac-ip-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-ip-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC+IP bindings table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings";
            }
          }  // container mac-ip-table-size
    
          container interface-mac-limit {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC address learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses per interface";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
                enum "log" {
                  value 2;
                  description
                    "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                }
                enum "shutdown" {
                  value 3;
                  description
                    "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                }
                enum "drop-and-log" {
                  value 4;
                  description
                    "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container interface-mac-limit
    
          container interface-mac-ip-limit {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-ip-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC+IP bindings learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings per interface";
            }
          }  // container interface-mac-ip-limit
    
          container mac-notification {
            presence "enable mac-notification";
            description
              "MAC notification options";
            uses apply-advanced;
    
            leaf notification-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 60";
                }
              }
              units "seconds";
              default "30";
              description
                "Interval for sending MAC notifications";
            }
          }  // container mac-notification
    
          leaf mac-table-aging-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            units "seconds";
            description
              "Delay for discarding MAC address if no updates are received";
          }
    
          leaf no-mac-learning {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "no-mac-learning needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Disable dynamic MAC address learning";
          }
    
          leaf no-normalization {
            type empty;
            description
              "Disable vlan id normalization for interfaces";
          }
    
          leaf mac-statistics {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-statistics needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Enable MAC address statistics";
          }
    
          container mib {
            presence "enable mib";
            description "Snmp mib options";
            uses apply-advanced;
    
            container dot1q-mib {
              presence "enable dot1q-mib";
              description
                "Dot1q MIB configuration options";
              uses apply-advanced;
    
              leaf port-list {
                type enumeration {
                  enum "bit-map" {
                    value 0;
                    description
                      "Port list is represented in bit-map format";
                  }
                  enum "string" {
                    value 1;
                    description
                      "Port list is represented in string format";
                  }
                }
                description
                  "Port list for staticegressports and staticuntaggedports MIB";
              }
            }  // container dot1q-mib
          }  // container mib
    
          container static-rvtep-mac {
            description
              "Configure Static MAC and remote VxLAN tunnel endpoint entries";
            uses apply-advanced;
    
            list mac {
              key "mac_addr remote-vtep";
              description "Unicast MAC address";
              leaf mac_addr {
                type jt:mac-unicast;
              }
    
              leaf remote-vtep {
                type jt:ipaddr;
                description
                  "Configure static remote VXLAN tunnel endpoints";
              }
            }  // list mac
          }  // container static-rvtep-mac
    
          list interface {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface needs to be specified under switch-options for a virtual-switch instance";
            key "name";
            ordered-by user;
            description
              "Interface that connect this site to the VPN";
            leaf name {
              junos:must "(((".. .. .. .. protocols evpn flexible-cross-connect-vlan-aware" || ".. .. .. .. interface $$") || "FALSE"))";
              junos:must-message "Interface must be part of this routing instance";
              junos:must "((".. .. .. interface $$" || (".. .. .. .. .. interface $$" || "interfaces $$-IFL family ethernet-switching")))";
              junos:must-message "Interface must be part of this routing instance";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container interface-mac-limit {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              description
                "Maximum number of MAC addresses learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC addresses per interface";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable interface for interface-mac-limit";
              }
    
              leaf packet-action {
                type enumeration {
                  enum "none" {
                    value 0;
                    description
                      "Forward the packet";
                  }
                  enum "drop" {
                    value 1;
                    description
                      "Drop packets and do not learn. Default is forward";
                  }
                  enum "log" {
                    value 2;
                    description
                      "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "shutdown" {
                    value 3;
                    description
                      "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "drop-and-log" {
                    value 4;
                    description
                      "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                  }
                }
                description
                  "Action when MAC limit is reached";
              }
            }  // container interface-mac-limit
    
            leaf action-priority {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 8";
                }
              }
              description
                "Blocking priority of this interface on mac move detection";
            }
    
            list static-mac {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              key "name";
              ordered-by user;
              description
                "Static MAC addresses assigned to this interface";
              leaf name {
                junos:must "((!(".. .. .. .. .. vlan-id all") || all ".. vlan-id <*>"))";
                junos:must-message " Specify vlan-id for qualified learning ";
                type jt:mac-addr;
                description "MAC address";
              }
    
              uses apply-advanced;
    
              list vlan-id {
                junos:must "(".. .. .. .. .. vlan-id all")";
                junos:must-message "'vlan-id all' has to be configured for the bridging domain";
                key "name";
                ordered-by user;
                description
                  "VLAN ID of learning VLAN";
                leaf name {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4094";
                    }
                  }
                  description "Learning VLAN";
                }
    
                uses apply-advanced;
              }  // list vlan-id
            }  // list static-mac
    
            container interface-mac-ip-limit {
              description
                "Maximum number of MAC+IP bindings learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC+IP bindings per interface";
              }
            }  // container interface-mac-ip-limit
    
            leaf no-mac-learning {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              type empty;
              description
                "Disable dynamic MAC address learning";
            }
    
            leaf mac-pinning {
              type empty;
              description "Enable MAC pinning";
            }
    
            leaf persistent-learning {
              junos:must "(!("switch-options mac-table-aging-time "))";
              junos:must-message "Persistent learning can not co-exist with mac-table-aging-time";
              type empty;
              description
                "Enable persistent MAC learning on this interface";
            }
    
            leaf flow-label-transmit-static {
              junos:must "(".. .. .. .. instance-type evpn-vpws")";
              junos:must-message "Flow-Label static only supported for EVPN-VPWS";
              type empty;
              description
                "Push Flow Label on PW packets sent to remote PE";
            }
    
            leaf flow-label-receive-static {
              junos:must "(".. .. .. .. instance-type evpn-vpws")";
              junos:must-message "Flow-Label static only supported for EVPN-VPWS";
              type empty;
              description
                "Pop Flow Label from PW packets received from remote PE";
            }
    
            leaf protect-interface {
              junos:must "("interfaces $$")";
              junos:must-message "Interface must be part of this routing instance";
              junos:must "(!("interfaces ${inter_name} esi"))";
              junos:must-message "ESI can not be configured for protect interface";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Name of protect interface";
            }
    
            leaf remote-site-id {
              junos:must "(!(".. .. .. .. .. l2vpn-id"))";
              junos:must-message "Remote site identifier is not valid for FEC 129 VPWS instances";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65534";
                }
              }
              description
                "Site identifier associated with this interface";
            }
    
            leaf target-attachment-identifier {
              junos:must "(".. .. source-attachment-identifier")";
              junos:must-message "Source attachment identifier configuration required for the containing site";
              junos:must "(unique ".. .. interface <*> target-attachment-identifier $$")";
              junos:must-message "All interface target attachment identifiers must be unique within a site";
              type string {
                junos:posix-pattern "^([[:digit:].]){1,15}$|^([[:digit:]]){0,10}:([[:digit:].]){0,15}:([[:digit:]]){1,10}$";
                junos:pattern-message "
    Use fec129 AII type 1 format with just <AC-ID> or
    fec129 AII type 2 format <Global-ID>:<Prefix>:<AC-ID> where
    <Global-ID> is a value between 0..4294967295,
    <Prefix> is a value between 0..4294967295 or a valid IP address,
    <AC-ID> is a value between 1..4294967295 (or a valid IP address for AII type 1).
    e.g. 1, 0.0.0.1, 0:0:1, 1:2:3, 1:2.2.2.2:3, ::1, 1::2, :1:2";
              }
              description
                "FEC 129 VPWS target attachment identifier";
            }
    
            leaf flow-label-transmit {
              junos:must "(".. .. source-attachment-identifier")";
              junos:must-message "Source attachment identifier configuration required for the containing site";
              type empty;
              description
                "Advertise capability to push Flow Label in transmit direction to remote PE";
            }
    
            leaf flow-label-receive {
              junos:must "(".. .. source-attachment-identifier")";
              junos:must-message "Source attachment identifier configuration required for the containing site";
              type empty;
              description
                "Advertise capability to pop Flow Label in receive direction to remote PE";
            }
    
            leaf encapsulation-type {
              type enumeration {
                enum "atm-aal5" {
                  value 0;
                  description
                    "ATM AAL/5 encapsulation";
                }
                enum "atm-cell" {
                  value 1;
                  description
                    "ATM port promiscuous mode cell encapsulation";
                }
                enum "atm-cell-port-mode" {
                  value 2;
                  description
                    "ATM port promiscuous mode cell encapsulation";
                }
                enum "atm-cell-vp-mode" {
                  value 3;
                  description
                    "ATM VP promiscuous mode cell encapsulation";
                }
                enum "atm-cell-vc-mode" {
                  value 4;
                  description
                    "ATM non-promiscuous cell encapsulation";
                }
                enum "frame-relay" {
                  value 5;
                  description
                    "Frame Relay encapsulation";
                }
                enum "ppp" {
                  value 6;
                  description
                    "PPP encapsulation";
                }
                enum "cisco-hdlc" {
                  value 7;
                  description
                    "Cisco-compatible HDLC encapsulation";
                }
                enum "ethernet-vlan" {
                  value 8;
                  description
                    "Ethernet VLAN encapsulation";
                }
                enum "ethernet" {
                  value 9;
                  description
                    "Ethernet encapsulation";
                }
                enum "interworking" {
                  value 10;
                  description
                    "Layer 2.5 interworking VPN";
                }
                enum "frame-relay-port-mode" {
                  value 11;
                  description
                    "Frame Relay port mode encapsulation";
                }
                enum "satop-t1" {
                  value 12;
                  description
                    "SATOP-T1 based Layer 2 VPN";
                }
                enum "satop-e1" {
                  value 13;
                  description
                    "SATOP-E1 based Layer 2 VPN";
                }
                enum "satop-t3" {
                  value 14;
                  description
                    "SATOP-T3 based Layer 2 VPN";
                }
                enum "satop-e3" {
                  value 15;
                  description
                    "SATOP-E3 based Layer 2 VPN";
                }
                enum "cesop" {
                  value 16;
                  description
                    "CESOP based Layer 2 VPN";
                }
              }
              description
                "Encapsulation type for VPN";
            }
    
            leaf ignore-encapsulation-mismatch {
              type empty;
              description
                "Allow different encapsulation types on local and remote end";
            }
    
            leaf mtu {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "512 .. 65535";
                }
              }
              description
                "MTU to be advertised to the remote end";
            }
    
            leaf ignore-mtu-mismatch {
              type empty;
              description
                "Allow different MTU values on local and remote end";
            }
    
            choice cword {
              leaf control-word {
                type empty;
                description
                  "Adds control-word to the Layer 2 encapsulation";
              }
              leaf no-control-word {
                type empty;
                description
                  "Disables control-word to the Layer 2 encapsulation";
              }
            }  // choice cword
    
            leaf pseudowire-status-tlv {
              type empty;
              description
                "Send pseudowire status TLV";
            }
    
            container oam {
              description
                "OAM Configuration for VPN";
              uses apply-advanced;
    
              leaf ping-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "30 .. 3600";
                  }
                }
                units "seconds";
                default "60";
                description
                  "Time interval between ping messages";
              }
    
              leaf ping-multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "1 .. 5";
                  }
                }
                description
                  "Number of ping reply missed before declaring BFD down";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
              }  // container bfd-liveness-detection
            }  // container oam
    
            leaf community {
              type string;
              description
                "Community associated with this interface";
            }
    
            leaf description {
              type string;
              description "Text description";
            }
          }  // list interface
    
          list site {
            key "name";
            ordered-by user;
            description
              "Sites connected to this provider equipment";
            leaf name {
              type string;
              description
                "Name of Layer 2 VPN or VPLS site";
            }
    
            uses apply-advanced;
    
            list mesh-group {
              key "name";
              ordered-by user;
              description
                "Mesh-groups that are part of this site";
              leaf name {
                junos:must "(".. .. .. mesh-group $$")";
                junos:must-message "Mesh-group must be configured to associate with a site";
                type string;
                description "Mesh-group name";
              }
    
              uses apply-advanced;
            }  // list mesh-group
    
            list interface {
              junos:must "(!(!((".. .. .. .. protocols vpls" || ".. .. .. .. protocols l2vpn"))))";
              junos:must-message "interface needs to be specified under switch-options for a virtual-switch instance";
              key "name";
              ordered-by user;
              description
                "Interface that connect this site to the VPN";
              leaf name {
                junos:must "((".. .. .. .. .. interface $$" || any ".. .. .. .. .. bridge-domains <*> interface $$"))";
                junos:must-message "Interface must be part of this routing instance";
                junos:must "((".. .. .. interface $$" || (".. .. .. .. .. interface $$" || "interfaces $$-IFL family ethernet-switching")))";
                junos:must-message "Interface must be part of this routing instance";
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              container interface-mac-limit {
                junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
                junos:must "(!(".. .. .. private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
                description
                  "Maximum number of MAC addresses learned on the interface";
                uses apply-advanced;
    
                leaf limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32;
                  }
                  description
                    "Maximum number of MAC addresses per interface";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable interface for interface-mac-limit";
                }
    
                leaf packet-action {
                  type enumeration {
                    enum "none" {
                      value 0;
                      description
                        "Forward the packet";
                    }
                    enum "drop" {
                      value 1;
                      description
                        "Drop packets and do not learn. Default is forward";
                    }
                    enum "log" {
                      value 2;
                      description
                        "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                    }
                    enum "shutdown" {
                      value 3;
                      description
                        "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                    }
                    enum "drop-and-log" {
                      value 4;
                      description
                        "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                    }
                  }
                  description
                    "Action when MAC limit is reached";
                }
              }  // container interface-mac-limit
    
              leaf action-priority {
                junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
                junos:must "(!(".. .. .. private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 8";
                  }
                }
                description
                  "Blocking priority of this interface on mac move detection";
              }
    
              list static-mac {
                junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
                junos:must "(!(".. .. .. private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
                key "name";
                ordered-by user;
                description
                  "Static MAC addresses assigned to this interface";
                leaf name {
                  junos:must "((!(".. .. .. .. .. .. vlan-id all") || all ".. vlan-id <*>"))";
                  junos:must-message " Specify vlan-id for qualified learning ";
                  type jt:mac-addr;
                  description "MAC address";
                }
    
                uses apply-advanced;
    
                list vlan-id {
                  junos:must "(".. .. .. .. .. .. vlan-id all")";
                  junos:must-message "'vlan-id all' has to be configured for the bridging domain";
                  key "name";
                  ordered-by user;
                  description
                    "VLAN ID of learning VLAN";
                  leaf name {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 4094";
                      }
                    }
                    description "Learning VLAN";
                  }
    
                  uses apply-advanced;
                }  // list vlan-id
              }  // list static-mac
    
              container interface-mac-ip-limit {
                description
                  "Maximum number of MAC+IP bindings learned on the interface";
                uses apply-advanced;
    
                leaf limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32;
                  }
                  description
                    "Maximum number of MAC+IP bindings per interface";
                }
              }  // container interface-mac-ip-limit
    
              leaf no-mac-learning {
                junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
                junos:must "(!(".. .. .. private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
                type empty;
                description
                  "Disable dynamic MAC address learning";
              }
    
              leaf mac-pinning {
                type empty;
                description "Enable MAC pinning";
              }
    
              leaf persistent-learning {
                junos:must "(!("switch-options mac-table-aging-time "))";
                junos:must-message "Persistent learning can not co-exist with mac-table-aging-time";
                type empty;
                description
                  "Enable persistent MAC learning on this interface";
              }
    
              leaf remote-site-id {
                junos:must "(!(".. .. .. .. .. l2vpn-id"))";
                junos:must-message "Remote site identifier is not valid for FEC 129 VPWS instances";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65534";
                  }
                }
                description
                  "Site identifier associated with this interface";
              }
    
              leaf target-attachment-identifier {
                junos:must "(".. .. source-attachment-identifier")";
                junos:must-message "Source attachment identifier configuration required for the containing site";
                junos:must "(unique ".. .. interface <*> target-attachment-identifier $$")";
                junos:must-message "All interface target attachment identifiers must be unique within a site";
                type string {
                  junos:posix-pattern "^([[:digit:].]){1,15}$|^([[:digit:]]){0,10}:([[:digit:].]){0,15}:([[:digit:]]){1,10}$";
                  junos:pattern-message "
    Use fec129 AII type 1 format with just <AC-ID> or
    fec129 AII type 2 format <Global-ID>:<Prefix>:<AC-ID> where
    <Global-ID> is a value between 0..4294967295,
    <Prefix> is a value between 0..4294967295 or a valid IP address,
    <AC-ID> is a value between 1..4294967295 (or a valid IP address for AII type 1).
    e.g. 1, 0.0.0.1, 0:0:1, 1:2:3, 1:2.2.2.2:3, ::1, 1::2, :1:2";
                }
                description
                  "FEC 129 VPWS target attachment identifier";
              }
    
              leaf flow-label-transmit {
                junos:must "(".. .. source-attachment-identifier")";
                junos:must-message "Source attachment identifier configuration required for the containing site";
                type empty;
                description
                  "Advertise capability to push Flow Label in transmit direction to remote PE";
              }
    
              leaf flow-label-receive {
                junos:must "(".. .. source-attachment-identifier")";
                junos:must-message "Source attachment identifier configuration required for the containing site";
                type empty;
                description
                  "Advertise capability to pop Flow Label in receive direction to remote PE";
              }
    
              leaf encapsulation-type {
                type enumeration {
                  enum "atm-aal5" {
                    value 0;
                    description
                      "ATM AAL/5 encapsulation";
                  }
                  enum "atm-cell" {
                    value 1;
                    description
                      "ATM port promiscuous mode cell encapsulation";
                  }
                  enum "atm-cell-port-mode" {
                    value 2;
                    description
                      "ATM port promiscuous mode cell encapsulation";
                  }
                  enum "atm-cell-vp-mode" {
                    value 3;
                    description
                      "ATM VP promiscuous mode cell encapsulation";
                  }
                  enum "atm-cell-vc-mode" {
                    value 4;
                    description
                      "ATM non-promiscuous cell encapsulation";
                  }
                  enum "frame-relay" {
                    value 5;
                    description
                      "Frame Relay encapsulation";
                  }
                  enum "ppp" {
                    value 6;
                    description
                      "PPP encapsulation";
                  }
                  enum "cisco-hdlc" {
                    value 7;
                    description
                      "Cisco-compatible HDLC encapsulation";
                  }
                  enum "ethernet-vlan" {
                    value 8;
                    description
                      "Ethernet VLAN encapsulation";
                  }
                  enum "ethernet" {
                    value 9;
                    description
                      "Ethernet encapsulation";
                  }
                  enum "interworking" {
                    value 10;
                    description
                      "Layer 2.5 interworking VPN";
                  }
                  enum "frame-relay-port-mode" {
                    value 11;
                    description
                      "Frame Relay port mode encapsulation";
                  }
                  enum "satop-t1" {
                    value 12;
                    description
                      "SATOP-T1 based Layer 2 VPN";
                  }
                  enum "satop-e1" {
                    value 13;
                    description
                      "SATOP-E1 based Layer 2 VPN";
                  }
                  enum "satop-t3" {
                    value 14;
                    description
                      "SATOP-T3 based Layer 2 VPN";
                  }
                  enum "satop-e3" {
                    value 15;
                    description
                      "SATOP-E3 based Layer 2 VPN";
                  }
                  enum "cesop" {
                    value 16;
                    description
                      "CESOP based Layer 2 VPN";
                  }
                }
                description
                  "Encapsulation type for VPN";
              }
    
              leaf ignore-encapsulation-mismatch {
                type empty;
                description
                  "Allow different encapsulation types on local and remote end";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "512 .. 65535";
                  }
                }
                description
                  "MTU to be advertised to the remote end";
              }
    
              leaf ignore-mtu-mismatch {
                type empty;
                description
                  "Allow different MTU values on local and remote end";
              }
    
              choice cword {
                leaf control-word {
                  type empty;
                  description
                    "Adds control-word to the Layer 2 encapsulation";
                }
                leaf no-control-word {
                  type empty;
                  description
                    "Disables control-word to the Layer 2 encapsulation";
                }
              }  // choice cword
    
              leaf pseudowire-status-tlv {
                type empty;
                description
                  "Send pseudowire status TLV";
              }
    
              container oam {
                description
                  "OAM Configuration for VPN";
                uses apply-advanced;
    
                leaf ping-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "30 .. 3600";
                    }
                  }
                  units "seconds";
                  default "60";
                  description
                    "Time interval between ping messages";
                }
    
                leaf ping-multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "1 .. 5";
                    }
                  }
                  description
                    "Number of ping reply missed before declaring BFD down";
                }
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection (BFD) options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
                }  // container bfd-liveness-detection
              }  // container oam
    
              leaf community {
                type string;
                description
                  "Community associated with this interface";
              }
    
              leaf description {
                type string;
                description "Text description";
              }
            }  // list interface
    
            choice site-identifier-mode {
              leaf site-identifier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65534";
                  }
                }
                description
                  "Layer 2 VPN or VPLS site identifier (unique in the VPN)";
              }
              container automatic-site-id {
                junos:must "(!(".. .. .. .. protocols l2vpn"))";
                junos:must-message "Automatic site ID is supported only for VPLS service";
                junos:must "(!(any ".. .. mesh-group <*> peer-as"))";
                junos:must-message "Automatic site cannot be configured with BGP mesh group";
                presence
                  "enable automatic-site-id";
                description
                  "Enable automatic assignment of site identifier";
                uses apply-advanced;
    
                leaf startup-wait-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 3600";
                    }
                  }
                  units "seconds";
                  description
                    "Time to wait at startup before claming a site identifier (seconds)";
                }
    
                leaf new-site-wait-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 3600";
                    }
                  }
                  units "seconds";
                  description
                    "Time to wait before claiming a site identifier";
                }
    
                leaf collision-detect-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 3600";
                    }
                  }
                  units "seconds";
                  description
                    "Time to wait for detecting a collision";
                }
    
                container reclaim-wait-time {
                  presence
                    "enable reclaim-wait-time";
                  description
                    "Time to wait for reclaiming a site identifier";
                  leaf minimum {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum wait time";
                  }
    
                  leaf maximum {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "Maximum wait time";
                  }
                }  // container reclaim-wait-time
              }  // container automatic-site-id
            }  // choice site-identifier-mode
    
            leaf source-attachment-identifier {
              junos:must "(".. .. .. .. l2vpn-id")";
              junos:must-message "Source attachment identifier only supported for FEC 129 VPWS instances";
              junos:must "(unique ".. .. site <*> source-attachment-identifier $$")";
              junos:must-message "All site source attachment identifiers must be unique within an instance";
              type string {
                junos:posix-pattern "^([[:digit:].]){1,15}$|^([[:digit:]]){0,10}:([[:digit:].]){0,15}:([[:digit:]]){1,10}$";
                junos:pattern-message "
    Use fec129 AII type 1 format with just <AC-ID> or
    fec129 AII type 2 format <Global-ID>:<Prefix>:<AC-ID> where
    <Global-ID> is a value between 0..4294967295,
    <Prefix> is a value between 0..4294967295 or a valid IP address,
    <AC-ID> is a value between 1..4294967295 (or a valid IP address for AII type 1).
    e.g. 1, 0.0.0.1, 0:0:1, 1:2:3, 1:2.2.2.2:3, ::1, 1::2, :1:2";
              }
              description
                "FEC 129 VPWS source attachment identifier";
            }
    
            leaf flow-label-transmit {
              junos:must "(".. .. .. .. l2vpn-id")";
              junos:must-message "Per-site Flow Label Config is only supported for FEC129 VPWS";
              type empty;
              description
                "Advertise capability to push Flow Label in transmit direction to remote PE";
            }
    
            leaf flow-label-receive {
              junos:must "(".. .. .. .. l2vpn-id")";
              junos:must-message "Per-site Flow Label Config is only supported for FEC129 VPWS";
              type empty;
              description
                "Advertise capability to push Flow Label in receive direction to remote PE";
            }
    
            leaf encapsulation-type {
              type enumeration {
                enum "atm-aal5" {
                  value 0;
                  description
                    "ATM AAL/5 encapsulation";
                }
                enum "atm-cell" {
                  value 1;
                  description
                    "ATM port promiscuous mode cell encapsulation";
                }
                enum "atm-cell-port-mode" {
                  value 2;
                  description
                    "ATM port promiscuous mode cell encapsulation";
                }
                enum "atm-cell-vp-mode" {
                  value 3;
                  description
                    "ATM VP promiscuous mode cell encapsulation";
                }
                enum "atm-cell-vc-mode" {
                  value 4;
                  description
                    "ATM non-promiscuous cell encapsulation";
                }
                enum "frame-relay" {
                  value 5;
                  description
                    "Frame Relay encapsulation";
                }
                enum "ppp" {
                  value 6;
                  description
                    "PPP encapsulation";
                }
                enum "cisco-hdlc" {
                  value 7;
                  description
                    "Cisco-compatible HDLC encapsulation";
                }
                enum "ethernet-vlan" {
                  value 8;
                  description
                    "Ethernet VLAN encapsulation";
                }
                enum "ethernet" {
                  value 9;
                  description
                    "Ethernet encapsulation";
                }
                enum "interworking" {
                  value 10;
                  description
                    "Layer 2.5 interworking VPN";
                }
                enum "frame-relay-port-mode" {
                  value 11;
                  description
                    "Frame Relay port mode encapsulation";
                }
                enum "satop-t1" {
                  value 12;
                  description
                    "SATOP-T1 based Layer 2 VPN";
                }
                enum "satop-e1" {
                  value 13;
                  description
                    "SATOP-E1 based Layer 2 VPN";
                }
                enum "satop-t3" {
                  value 14;
                  description
                    "SATOP-T3 based Layer 2 VPN";
                }
                enum "satop-e3" {
                  value 15;
                  description
                    "SATOP-E3 based Layer 2 VPN";
                }
                enum "cesop" {
                  value 16;
                  description
                    "CESOP based Layer 2 VPN";
                }
              }
              description
                "Encapsulation type for VPN";
            }
    
            leaf ignore-encapsulation-mismatch {
              type empty;
              description
                "Allow different encapsulation types on local and remote end";
            }
    
            choice cword {
              leaf control-word {
                type empty;
                description
                  "Adds control-word to the Layer 2 encapsulation";
              }
              leaf no-control-word {
                type empty;
                description
                  "Disables control-word to the Layer 2 encapsulation";
              }
            }  // choice cword
    
            leaf pseudowire-status-tlv {
              type empty;
              description
                "Send pseudowire status TLV";
            }
    
            container oam {
              description
                "OAM Configuration for VPN";
              uses apply-advanced;
    
              leaf ping-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "30 .. 3600";
                  }
                }
                units "seconds";
                default "60";
                description
                  "Time interval between ping messages";
              }
    
              leaf ping-multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "1 .. 5";
                  }
                }
                description
                  "Number of ping reply missed before declaring BFD down";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
              }  // container bfd-liveness-detection
            }  // container oam
    
            leaf community {
              type string;
              description
                "Community associated with this site";
            }
    
            container multi-homing {
              junos:must "(!(".. automatic-site-id"))";
              junos:must-message "Multi-homing cannot be configured for automatic site";
              presence "enable multi-homing";
              description
                "Enable multi-homing functionality for this site";
              uses apply-advanced;
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 18000";
                  }
                }
                units "seconds";
                description
                  "Enable multi-homing non-designated forwarder hold time (seconds)";
              }
            }  // container multi-homing
    
            leaf site-preference {
              type string;
              description
                "Layer 2 VPN or VPLS site preference";
            }
    
            leaf hot-standby {
              junos:must "(!(".. site-preference primary"))";
              junos:must-message "primary site cannot be hot-standby";
              type empty;
              description
                "Keep backup pseudowire in continuous standby mode and ready for traffic forwarding";
            }
    
            leaf mtu {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "512 .. 65535";
                }
              }
              description
                "MTU to be advertised to the remote end";
            }
    
            leaf ignore-mtu-mismatch {
              type empty;
              description
                "Allow different MTU values on local and remote end";
            }
    
            container active-interface {
              description
                "Configure interface to designate as active";
              choice interface_name {
                leaf any {
                  type empty;
                  description
                    "One configured interface is designated active at random";
                }
                leaf primary {
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Interface to designate as active if it is operational";
                }
              }  // choice interface_name
            }  // container active-interface
    
            leaf best-site {
              junos:must "(!(".. .. .. l2vpn"))";
              junos:must-message "'best-site' feature not supported for VPWS/BGP-L2VPN instances";
              junos:must "(!(".. .. vpls-id"))";
              junos:must-message "'best-site' feature not supported for LDP based VPLS instances";
              junos:must "(!(".. interface"))";
              junos:must-message "'interface' must not be defined when 'best-site' knob is activated";
              type empty;
              description
                "Activates best-site functionality for this instance";
            }
          }  // list site
    
          list neighbor {
            junos:must "(".. vpls-id")";
            junos:must-message "'vpls-id' must be defined";
            key "name";
            ordered-by user;
            description
              "Neighbor for this VPLS instance";
            leaf name {
              type jt:ipv4addr;
              description "Neighbor ID";
            }
    
            uses apply-advanced;
    
            leaf mac-pinning {
              type empty;
              description "Enable MAC pinning";
            }
    
            container static {
              junos:must "((!(".. backup-neighbor") || all ".. backup-neighbor <*> static"))";
              junos:must-message "Backup neighbor should be static";
              presence "enable static";
              description
                "Configuration of static vpls";
              uses apply-advanced;
    
              leaf incoming-label {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "VPLS incoming static label [1000000 - 1048575] or [29696 - 41983]";
              }
    
              leaf outgoing-label {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description
                  "VPLS outgoing static label";
              }
    
              choice cword {
                leaf control-word {
                  type empty;
                  description
                    "Adds control-word to the Layer 2 encapsulation";
                }
                leaf no-control-word {
                  type empty;
                  description
                    "Disables control-word to the Layer 2 encapsulation";
                }
              }  // choice cword
            }  // container static
    
            container associate-profile {
              description
                "Associate profile options for dynamic IFL";
              uses apply-advanced;
    
              leaf profile-name {
                type string {
                  length "1 .. 81";
                }
                description
                  "Associated profile name";
              }
    
              leaf profile-variable-set {
                type string {
                  length "1 .. 81";
                }
                description
                  "Associate dynamic variable set with the profile";
              }
            }  // container associate-profile
    
            leaf psn-tunnel-endpoint {
              type jt:ipv4addr;
              description
                "Endpoint of the transport tunnel on the remote PE";
            }
    
            leaf community {
              type string;
              description
                "Community associated with this neighbor";
            }
    
            leaf encapsulation-type {
              type enumeration {
                enum "ethernet-vlan" {
                  junos:must "(!(".. static"))";
                  junos:must-message "not supported for static vpls";
                  value 0;
                  description
                    "Ethernet VLAN encapsulation";
                }
                enum "ethernet" {
                  junos:must "(!(".. static"))";
                  junos:must-message "not supported for static vpls";
                  value 1;
                  description
                    "Ethernet encapsulation";
                }
              }
              description
                "Encapsulation type for VPN";
            }
    
            leaf ignore-encapsulation-mismatch {
              junos:must "(!(".. static"))";
              junos:must-message "not supported for static vpls";
              type empty;
              description
                "Allow different encapsulation types on local and remote end";
            }
    
            container pseudowire-status-tlv {
              junos:must "(!(".. static"))";
              junos:must-message "not supported for static vpls";
              presence
                "enable pseudowire-status-tlv";
              description
                "Send pseudowire status TLV";
              uses apply-advanced;
    
              leaf hot-standby-vc-on {
                type empty;
                description
                  "Activate pseudowire upon arrival of 'hot-standby' status TLV message";
              }
            }  // container pseudowire-status-tlv
    
            leaf switchover-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 180000";
                }
              }
              units "milliseconds";
              default "10000";
              description
                "Pseudowire switchover delay ";
            }
    
            container revert-time {
              presence "enable revert-time";
              description
                "Enable pseudowire redundancy reversion (seconds)";
              leaf delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 600";
                  }
                }
                units "seconds";
                description
                  "Reversion timer (seconds)";
              }
    
              leaf maximum {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1200";
                  }
                }
                units "seconds";
                description
                  "Maximum reversion interval to add over revert-time delay";
              }
            }  // container revert-time
    
            leaf connection-protection {
              junos:must "((!(".. backup-neighbor") || all ".. backup-neighbor <*> standby"))";
              junos:must-message "For connection-protection services, backup neighbor must be standby";
              junos:must "(!(".. switchover-delay"))";
              junos:must-message "connection-protection cannot be configured with switchover-delay";
              junos:must "(!(".. revert-time"))";
              junos:must-message "connection-protection cannot be configured with revert-time";
              type empty;
              description
                "End-2-end protection via OAM failure detection";
            }
    
            list backup-neighbor {
              key "name";
              ordered-by user;
              description
                "Configuration of redundant l2circuit";
              leaf name {
                type jt:ipv4addr;
                description "Neighbor ID";
              }
    
              uses apply-advanced;
    
              container static {
                junos:must "(".. .. static")";
                junos:must-message "Primary Neighbor must be static";
                presence "enable static";
                description
                  "Configuration of static vpls";
                uses apply-advanced;
    
                leaf incoming-label {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "VPLS incoming static label [1000000 - 1048575] or [29696 - 41983]";
                }
    
                leaf outgoing-label {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "16 .. 1048575";
                    }
                  }
                  description
                    "VPLS outgoing static label";
                }
              }  // container static
    
              leaf community {
                junos:must "(!(".. .. connection-protection"))";
                junos:must-message "The backup neighbor cannot be configured with community alongwith connection-protection";
                type string;
                description
                  "Community associated with this Layer 2 circuit";
              }
    
              leaf psn-tunnel-endpoint {
                type jt:ipv4addr;
                description
                  "Endpoint of the transport tunnel on the remote PE";
              }
    
              leaf standby {
                type empty;
                description
                  "Keep backup pseudowire in continuous standby";
              }
    
              leaf hot-standby {
                junos:must "((!(".. .. .. control-word") && !(".. .. .. .. control-word")))";
                junos:must-message "Hot-standby cannot be configured while having control-word enabled";
                junos:must "(".. .. pseudowire-status-tlv")";
                junos:must-message "Pseudowire-status-tlv must be configured in order to have hot-standby enabled";
                junos:must "(!(".. .. connection-protection"))";
                junos:must-message "Hot-standby cannot be configured while having connection-protection enabled";
                junos:must "(!(".. standby"))";
                junos:must-message "The backup neighbor cannot be configured with standby and hot-standby features simultaneously";
                type empty;
                description
                  "Keep backup pseudowire in continuous standby mode and ready for traffic forwarding";
              }
            }  // list backup-neighbor
    
            container oam {
              description
                "OAM Configuration for VPN";
              uses apply-advanced;
    
              leaf ping-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "30 .. 3600";
                  }
                }
                units "seconds";
                default "60";
                description
                  "Time interval between ping messages";
              }
    
              leaf ping-multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "1 .. 5";
                  }
                }
                description
                  "Number of ping reply missed before declaring BFD down";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
              }  // container bfd-liveness-detection
            }  // container oam
          }  // list neighbor
    
          list mesh-group {
            key "name";
            description
              "Mesh-group under this VPLS instance";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,32}$";
                junos:pattern-message "The mesh-group name should be between 1 and 32 characters";
              }
              description "Mesh-group name";
            }
    
            uses apply-advanced;
    
            leaf local-switching {
              type empty;
              description
                "Allow local-switching within interfaces in this mesh-group";
            }
    
            list neighbor {
              junos:must "(!(".. peer-as"))";
              junos:must-message "'peer-as' and 'neighbor' must not be defined in the same mesh-group";
              junos:must "(!(".. interface"))";
              junos:must-message "'interface' and 'neighbor' must not be defined in the same mesh-group";
              junos:must "((".. vpls-id" || ".. .. vpls-id"))";
              junos:must-message "'vpls-id' must be defined";
              key "name";
              ordered-by user;
              description
                "Neighbor belonging to this mesh-group";
              leaf name {
                type jt:ipv4addr;
                description "Neighbor ID";
              }
    
              uses apply-advanced;
    
              leaf mac-pinning {
                type empty;
                description "Enable MAC pinning";
              }
    
              container static {
                junos:must "((!(".. backup-neighbor") || all ".. backup-neighbor <*> static"))";
                junos:must-message "Backup neighbor should be static";
                presence "enable static";
                description
                  "Configuration of static vpls";
                uses apply-advanced;
    
                leaf incoming-label {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "VPLS incoming static label [1000000 - 1048575] or [29696 - 41983]";
                }
    
                leaf outgoing-label {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "16 .. 1048575";
                    }
                  }
                  description
                    "VPLS outgoing static label";
                }
    
                choice cword {
                  leaf control-word {
                    type empty;
                    description
                      "Adds control-word to the Layer 2 encapsulation";
                  }
                  leaf no-control-word {
                    type empty;
                    description
                      "Disables control-word to the Layer 2 encapsulation";
                  }
                }  // choice cword
              }  // container static
    
              container associate-profile {
                description
                  "Associate profile options for dynamic IFL";
                uses apply-advanced;
    
                leaf profile-name {
                  type string {
                    length "1 .. 81";
                  }
                  description
                    "Associated profile name";
                }
    
                leaf profile-variable-set {
                  type string {
                    length "1 .. 81";
                  }
                  description
                    "Associate dynamic variable set with the profile";
                }
              }  // container associate-profile
    
              leaf psn-tunnel-endpoint {
                type jt:ipv4addr;
                description
                  "Endpoint of the transport tunnel on the remote PE";
              }
    
              leaf community {
                type string;
                description
                  "Community associated with this neighbor";
              }
    
              leaf encapsulation-type {
                type enumeration {
                  enum "ethernet-vlan" {
                    junos:must "(!(".. static"))";
                    junos:must-message "not supported for static vpls";
                    value 0;
                    description
                      "Ethernet VLAN encapsulation";
                  }
                  enum "ethernet" {
                    junos:must "(!(".. static"))";
                    junos:must-message "not supported for static vpls";
                    value 1;
                    description
                      "Ethernet encapsulation";
                  }
                }
                description
                  "Encapsulation type for VPN";
              }
    
              leaf ignore-encapsulation-mismatch {
                junos:must "(!(".. static"))";
                junos:must-message "not supported for static vpls";
                type empty;
                description
                  "Allow different encapsulation types on local and remote end";
              }
    
              container pseudowire-status-tlv {
                junos:must "(!(".. static"))";
                junos:must-message "not supported for static vpls";
                presence
                  "enable pseudowire-status-tlv";
                description
                  "Send pseudowire status TLV";
                uses apply-advanced;
    
                leaf hot-standby-vc-on {
                  type empty;
                  description
                    "Activate pseudowire upon arrival of 'hot-standby' status TLV message";
                }
              }  // container pseudowire-status-tlv
    
              leaf switchover-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 180000";
                  }
                }
                units "milliseconds";
                default "10000";
                description
                  "Pseudowire switchover delay ";
              }
    
              container revert-time {
                presence "enable revert-time";
                description
                  "Enable pseudowire redundancy reversion (seconds)";
                leaf delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 600";
                    }
                  }
                  units "seconds";
                  description
                    "Reversion timer (seconds)";
                }
    
                leaf maximum {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 1200";
                    }
                  }
                  units "seconds";
                  description
                    "Maximum reversion interval to add over revert-time delay";
                }
              }  // container revert-time
    
              leaf connection-protection {
                junos:must "((!(".. backup-neighbor") || all ".. backup-neighbor <*> standby"))";
                junos:must-message "For connection-protection services, backup neighbor must be standby";
                junos:must "(!(".. switchover-delay"))";
                junos:must-message "connection-protection cannot be configured with switchover-delay";
                junos:must "(!(".. revert-time"))";
                junos:must-message "connection-protection cannot be configured with revert-time";
                type empty;
                description
                  "End-2-end protection via OAM failure detection";
              }
    
              list backup-neighbor {
                key "name";
                ordered-by user;
                description
                  "Configuration of redundant l2circuit";
                leaf name {
                  type jt:ipv4addr;
                  description "Neighbor ID";
                }
    
                uses apply-advanced;
    
                container static {
                  junos:must "(".. .. static")";
                  junos:must-message "Primary Neighbor must be static";
                  presence "enable static";
                  description
                    "Configuration of static vpls";
                  uses apply-advanced;
    
                  leaf incoming-label {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "VPLS incoming static label [1000000 - 1048575] or [29696 - 41983]";
                  }
    
                  leaf outgoing-label {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "16 .. 1048575";
                      }
                    }
                    description
                      "VPLS outgoing static label";
                  }
                }  // container static
    
                leaf community {
                  junos:must "(!(".. .. connection-protection"))";
                  junos:must-message "The backup neighbor cannot be configured with community alongwith connection-protection";
                  type string;
                  description
                    "Community associated with this Layer 2 circuit";
                }
    
                leaf psn-tunnel-endpoint {
                  type jt:ipv4addr;
                  description
                    "Endpoint of the transport tunnel on the remote PE";
                }
    
                leaf standby {
                  type empty;
                  description
                    "Keep backup pseudowire in continuous standby";
                }
    
                leaf hot-standby {
                  junos:must "((!(".. .. .. control-word") && !(".. .. .. .. control-word")))";
                  junos:must-message "Hot-standby cannot be configured while having control-word enabled";
                  junos:must "(".. .. pseudowire-status-tlv")";
                  junos:must-message "Pseudowire-status-tlv must be configured in order to have hot-standby enabled";
                  junos:must "(!(".. .. connection-protection"))";
                  junos:must-message "Hot-standby cannot be configured while having connection-protection enabled";
                  junos:must "(!(".. standby"))";
                  junos:must-message "The backup neighbor cannot be configured with standby and hot-standby features simultaneously";
                  type empty;
                  description
                    "Keep backup pseudowire in continuous standby mode and ready for traffic forwarding";
                }
              }  // list backup-neighbor
    
              container oam {
                description
                  "OAM Configuration for VPN";
                uses apply-advanced;
    
                leaf ping-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "30 .. 3600";
                    }
                  }
                  units "seconds";
                  default "60";
                  description
                    "Time interval between ping messages";
                }
    
                leaf ping-multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "1 .. 5";
                    }
                  }
                  description
                    "Number of ping reply missed before declaring BFD down";
                }
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection (BFD) options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
                }  // container bfd-liveness-detection
              }  // container oam
    
              leaf-list vpls-id-list {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                ordered-by user;
                description
                  "LDP VPLS Identifier list for this neighbor";
              }
            }  // list neighbor
    
            list interface {
              key "name";
              description
                "Interfaces belonging to this flood group";
              leaf name {
                junos:must "(".. .. .. .. .. interface $$")";
                junos:must-message "Interface must be part of this VPLS routing instance";
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
            }  // list interface
    
            container associate-profile {
              description
                "Associate profile options for dynamic IFL";
              uses apply-advanced;
    
              leaf profile-name {
                type string {
                  length "1 .. 81";
                }
                description
                  "Associated profile name";
              }
    
              leaf profile-variable-set {
                type string {
                  length "1 .. 81";
                }
                description
                  "Associate dynamic variable set with the profile";
              }
            }  // container associate-profile
    
            choice peer-as-choice {
              container peer-as {
                description
                  "Autonomous system of the peer";
                uses apply-advanced;
    
                leaf all {
                  type empty;
                  description
                    "Include peers from all autonomous systems";
                }
              }  // container peer-as
            }  // choice peer-as-choice
    
            leaf vpls-id {
              junos:must "(!(any ".. .. mesh-group <*> route-distinguisher"))";
              junos:must-message "Does not support FEC129 and FEC128 LDP VPLS mesh-group under the same instance";
              junos:must "(!(".. interface"))";
              junos:must-message "'vpls-id' must not be defined when specifying 'interface' in a mesh-group";
              type string;
              description
                "LDP VPLS Identifier for this mesh-group";
            }
    
            leaf-list vrf-import {
              junos:must "(".. route-distinguisher")";
              junos:must-message "route distinguisher must be defined";
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy for VPLS instance mesh-group";
            }
    
            leaf-list vrf-export {
              junos:must "(".. route-distinguisher")";
              junos:must-message "route distinguisher must be defined";
              type jt:policy-algebra;
              ordered-by user;
              description
                "Export policy for VPLS instance mesh-group";
            }
    
            container vrf-target {
              junos:must "(".. route-distinguisher")";
              junos:must-message "route distinguisher must be defined";
              description
                "VPLS mesh-group target community configuration";
              uses apply-advanced;
    
              leaf community {
                type string {
                  junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                  junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                }
                description
                  "Target community to use in import and export";
              }
    
              leaf import {
                type string {
                  junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                  junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                }
                description
                  "Target community to use when filtering on import";
              }
    
              leaf export {
                type string {
                  junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                  junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                }
                description
                  "Target community to use when marking routes on export";
              }
            }  // container vrf-target
    
            container mac-flush {
              presence "enable mac-flush";
              description
                "Enables mac-flush processing";
              uses apply-advanced;
    
              leaf any-interface {
                junos:must "((".. .. vpls-id" || ".. .. .. vpls-id"))";
                junos:must-message "'any-interface' can be configured only for LDP VPLS";
                type empty;
                description
                  "Send mac-flush when any AC interface goes down";
              }
    
              leaf any-spoke {
                junos:must "((".. .. vpls-id" || ".. .. .. vpls-id"))";
                junos:must-message "'any-spoke' can be configured only for LDP VPLS";
                type empty;
                description
                  "Send mac-flush when any spoke pseudo wire goes down";
              }
    
              leaf propagate {
                junos:must "((".. .. vpls-id" || ".. .. .. vpls-id"))";
                junos:must-message "'propagate' can be configured only for LDP VPLS";
                type empty;
                description
                  "Propagate mac-flush to the core";
              }
            }  // container mac-flush
    
            container route-distinguisher {
              junos:must "(!(any ".. .. mesh-group <*> vpls-id"))";
              junos:must-message "Does not support FEC129 and FEC128 LDP VPLS mesh-group under the same instance";
              description
                "Route distinguisher for this mesh-group";
              leaf rd-type {
                type string {
                  junos:posix-pattern "^[0-9.]+L?:[0-9]+$";
                  junos:pattern-message "Use format 'x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. 123456L:100";
                }
                description
                  "Number in (16 bit:32 bit) or (32 bit 'L':16 bit) or (IP address:16 bit) format";
              }
            }  // container route-distinguisher
          }  // list mesh-group
    
          leaf service-type {
            type enumeration {
              enum "single" {
                value 0;
                description
                  "Only one service for the virtual-switch";
              }
            }
            description
              "Specify service type for vpls";
          }
    
          leaf designated-forwarder-election-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1800";
              }
            }
            units "seconds";
            description
              "Time to wait before electing a DF(seconds)";
          }
    
          leaf designated-forwarder-preference-least {
            type empty;
            description
              "Use least preference in DF election";
          }
    
          leaf encapsulation {
            junos:must "((((".. .. .. instance-type virtual-switch" || (".. .. ..  instance-type evpn" || (".. .. .. instance-type mac-vrf" || ".. .. .. instance-type evpn-vpws"))) && !(".. .. .. switch-options route-distinguisher")) || ".. .. .. switch-options route-distinguisher"))";
            junos:must-message "Encapsulation can only be configured for an EVPN instance";
            type enumeration {
              enum "mpls" {
                value 0;
                description "MPLS encapsulation";
              }
              enum "vxlan" {
                value 1;
                description
                  "VXLAN encapsulation";
              }
              enum "mpls-inet6" {
                value 2;
                description
                  "MPLS over IPv6 encapsulation";
              }
            }
            default "mpls";
            description
              "Encapsulation type for EVPN";
          }
    
          leaf default-gateway {
            type enumeration {
              enum "advertise" {
                value 0;
                description
                  "Advertise IRB MACs with default gateway community";
              }
              enum "no-gateway-community" {
                value 1;
                description
                  "Advertise IRB MACs without default gateway community";
              }
              enum "do-not-advertise" {
                value 2;
                description
                  "Do not advertise IRB MACs";
              }
            }
            description "Default gateway mode";
          }
    
          container duplicate-mac-detection {
            description
              "Duplicate MAC detection settings";
            uses apply-advanced;
    
            leaf detection-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 20";
                }
              }
              description
                "Number of moves to trigger duplicate MAC detection";
            }
    
            leaf detection-window {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "5 .. 600";
                }
              }
              units "seconds";
              description
                "Time window for detection of duplicate MACs";
            }
    
            leaf auto-recovery-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 360";
                }
              }
              units "minutes";
              description
                "Automatically unblock duplicate MACs after a time delay";
            }
          }  // container duplicate-mac-detection
    
          choice extended-attributes {
            case case_1 {
            }  // case case_1
            leaf-list extended-vni-list {
              junos:must "(!((".. .. .. .. .. chassis satellite-management redundancy-groups" && !(".. mclag"))))";
              junos:must-message "Need to configure 'protocols evpn mclag' when evpn is configured with mclag.";
              junos:must "(".. encapsulation vxlan")";
              junos:must-message "Extended VNI list can only be configured with encapsulation vxlan";
              junos:must "((".. .. .. instance-type virtual-switch" || ".. .. .. instance-type mac-vrf"))";
              junos:must-message "Extended VNI list can only be configured in a virtual switch instance";
              type string;
              description
                "List of VNI identifiers (1..16777214) or all, that are to be EVPN extended";
            }
    
            case case_3 {
            }  // case case_3
          }  // choice extended-attributes
    
          container evi-options {
            junos:must "(".. extended-isid-list")";
            junos:must-message "Extended-isid-list must be configured";
            description "EVI options";
            uses juniper-protocols-evi-options;
          }  // container evi-options
    
          container remote-ip-host-routes {
            junos:must "(!(".. encapsulation mpls-inet6"))";
            junos:must-message "VMTO not supported with encapsulation mpls-inet6";
            junos:must "(!(".. .. .. instance-type vrf"))";
            junos:must-message "remote-ip-host-routes knob is for virtual-switch, EVPN or default instance";
            presence
              "enable remote-ip-host-routes";
            description
              "Virtual machine traffic optimization(VMTO) for EVPN";
            uses apply-advanced;
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Policy to control the creation of remote IP host routes";
            }
    
            leaf no-advertise-community {
              type empty;
              description
                "Don't advertise Type 2 route's community";
            }
          }  // container remote-ip-host-routes
    
          container assisted-replication {
            junos:must "(!("forwarding-options multicast-replication evpn irb local-only"))";
            junos:must-message "Assisted Replication is not valid with forwarding-options multicast-replication evpn irb local-only";
            junos:must "(".. encapsulation vxlan")";
            junos:must-message "Assisted Replication is supported only with encapsulation vxlan option";
            description
              "Option to enable Assisted Replication";
            uses apply-advanced;
    
            choice AR {
              container leaf {
                presence "enable leaf";
                description
                  "Assisted Replicator Leaf";
                uses apply-advanced;
    
                leaf replicator-activation-delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 180";
                    }
                  }
                  units "seconds";
                  default "10";
                  description
                    "Dealy interval in starting replication";
                }
              }  // container leaf
    
              case case_2 {
              }  // case case_2
            }  // choice AR
          }  // container assisted-replication
    
          container vrf-target {
            junos:must "((".. extended-isid-list" || ".. extended-vlan-list"))";
            junos:must-message "Extended-isid-list or extended-vlan-list must be configured";
            description
              "VRF target community configuration";
            uses apply-advanced;
    
            leaf community {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use in import and export";
            }
          }  // container vrf-target
    
          container interconnect {
            description "Interconnect";
            uses juniper-protocols-evpn-interconnect;
          }  // container interconnect
    
          leaf pmsi-tunnel-endpoint {
            junos:must "(!(".. pbb-evpn-core"))";
            junos:must-message "Not Supported for PBB EVPN";
            junos:must "(!(".. encapsulation mpls-inet6"))";
            junos:must-message "Not supported for encapsulation mpls-inet6";
            junos:must "(!(".. encapsulation vxlan"))";
            junos:must-message "Not Supported for EVPN-VXLAN encapsulation";
            junos:must "(!(".. .. .. provider-tunnel"))";
            junos:must-message "Not Applicable for P2MP Tunnels";
            junos:must "(!(".. .. .. instance-type evpn-vpws"))";
            junos:must-message "Not Applicable for instance-type EVPN-VPWS";
            type jt:ipv4addr;
            description
              "IM IR PMSI tunnel Endpoint for remote PE";
          }
    
          leaf pmsi-tunnel-endpoint-inet6 {
            junos:must "(".. encapsulation mpls-inet6")";
            junos:must-message "Supported for mpls-inet6 encapsulation only";
            junos:must "(!(".. .. .. instance-type evpn-vpws"))";
            junos:must-message "Not Applicable for instance-type EVPN-VPWS";
            type jt:ipv6addr;
            description
              "IM IR PMSI IPv6 tunnel Endpoint for remote PE";
          }
    
          leaf normalization {
            junos:must "(!(".. encapsulation vxlan"))";
            junos:must-message "Not applicable for EVPN-VXLAN encapsulation";
            junos:must "((".. .. .. instance-type mac-vrf" && ".. .. .. service-type vlan-based"))";
            junos:must-message "Applicable for mac-vrf vlan-based service only";
            type empty;
            description
              "Enable vlan id normalization for interfaces";
          }
    
          leaf smet-etag-carry-vid {
            junos:must "((".. .. .. instance-type mac-vrf" && ".. .. .. service-type vlan-based"))";
            junos:must-message "Applicable for mac-vrf vlan-based service only";
            type empty;
            description
              "SMET Type 6,7 and 8 Routes to carry vlan id in Ethernet Tag field";
          }
    
          container irb-symmetric-routing {
            junos:must "(".. .. .. instance-type vrf")";
            junos:must-message "EVPN T-2 symmetric-routing must be configured with instance-type vrf";
            description
              "Enable EVPN T-2 symmtric routing";
            uses apply-advanced;
    
            leaf vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16777214";
                }
              }
              description
                "VXLAN network identifier used for T-2 Symmetric Routing IP prefixes";
            }
          }  // container irb-symmetric-routing
    
          container ip-prefix-routes {
            junos:must "(".. .. .. instance-type vrf")";
            junos:must-message "ip-prefix-routes must be configured with instance-type vrf";
            presence "enable ip-prefix-routes";
            description
              "Advertise IP prefixes through EVPN";
            uses apply-advanced;
    
            leaf advertise {
              type enumeration {
                enum "gateway-address" {
                  junos:must "(".. gateway-interface")";
                  junos:must-message "advertise gateway-address must be configured with gateway-interface";
                  value 0;
                  description
                    "Advertise a gateway address in exported IP prefix routes";
                }
                enum "direct-nexthop" {
                  junos:must "((".. encapsulation vxlan" || ".. .. .. .. vrf-table-label"))";
                  junos:must-message "vrf-table-label must be used unless encapsulation vxlan is configured";
                  value 1;
                  description
                    "Advertise a direct nexthop in exported IP prefix routes";
                }
              }
              description
                "Advertisement attributes for IP prefixes";
            }
    
            leaf gateway-interface {
              junos:must "(".. advertise gateway-address")";
              junos:must-message "gateway-interface must be configured with advertise gateway-address";
              junos:must "(".. .. .. .. interface $$")";
              junos:must-message "Interface must configured in this routing instance";
              junos:must "("interfaces $$ family inet")";
              junos:must-message "Family inet must be defined";
              junos:must "("interfaces $$")";
              junos:must-message "Interface must be defined";
              type union {
                type jt:interface-unit;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Gateway interface used when gateway address is advertised";
            }
    
            leaf encapsulation {
              type enumeration {
                enum "mpls" {
                  junos:must "(".. advertise direct-nexthop")";
                  junos:must-message "encapsulation must be configured with advertise direct-nexthop";
                  value 0;
                  description
                    "MPLS encapsulation";
                }
                enum "vxlan" {
                  junos:must "(".. vni")";
                  junos:must-message "encapsulation vxlan must be configured with vni";
                  junos:must "((".. advertise direct-nexthop" || ".. .. irb-symmetric-routing"))";
                  junos:must-message "encapsulation must be configured with advertise direct-nexthop or irb-symmetric-routing";
                  value 1;
                  description
                    "VXLAN encapsulation";
                }
              }
              description
                "Encapsulation used for IP prefixes";
            }
    
            leaf vni {
              junos:must "(".. encapsulation vxlan")";
              junos:must-message "vni must be configured with encapsulation vxlan";
              junos:must "((".. advertise direct-nexthop" || ".. .. irb-symmetric-routing"))";
              junos:must-message "vni must be configured with advertise direct-nexthop or irb-symmetric-routing";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16777214";
                }
              }
              description
                "VXLAN network identifier used for IP prefixes";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Policy to control import of IP prefixes from EVPN";
            }
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Policy to control export of IP prefixes through EVPN";
            }
    
            container route-attributes {
              description
                "Route Attribute Import Export Option";
              uses apply-advanced;
    
              container as-path {
                description "AS-PATH Attribute";
                uses apply-advanced;
    
                leaf import-action {
                  type enumeration {
                    enum "allow" {
                      value 0;
                      description
                        "Inherit as-path from EVPN routes to IP routes";
                    }
                    enum "skip" {
                      value 1;
                      description
                        "Donot inehrit as-path from EVPN routes to IP routes";
                    }
                  }
                  description
                    "AS-PATH Attribute Inherit Option on Import";
                }
    
                leaf export-action {
                  type enumeration {
                    enum "allow" {
                      value 0;
                      description
                        "Inherit as-path from IP routes to EVPN routes";
                    }
                    enum "skip" {
                      value 1;
                      description
                        "Donot inherit as-path from IP routes to EVPN routes";
                    }
                  }
                  description
                    "AS-PATH Attribute Inherit Option on Export";
                }
              }  // container as-path
    
              container preference {
                description
                  "Preference Attribute";
                uses apply-advanced;
    
                leaf import-action {
                  type enumeration {
                    enum "allow" {
                      value 0;
                      description
                        "Inherit preference from EVPN routes to IP routes";
                    }
                    enum "skip" {
                      value 1;
                      description
                        "Donot inherit preference from EVPN routes to EVPN routes";
                    }
                  }
                  description
                    "Preference Attribute Inerit Option on Import";
                }
    
                leaf export-action {
                  type enumeration {
                    enum "allow" {
                      value 0;
                      description
                        "Inherit preference from IP routes to EVPN routes";
                    }
                    enum "skip" {
                      value 1;
                      description
                        "Donot inherit preference from IP routes to EVPN routes";
                    }
                  }
                  description
                    "Preference Attribute Inherit Option on Export";
                }
              }  // container preference
    
              container community {
                description
                  "Community Attribute";
                uses apply-advanced;
    
                leaf import-action {
                  type enumeration {
                    enum "allow" {
                      value 0;
                      description
                        "Inherit community from EVPN routes to IP routes";
                    }
                    enum "skip" {
                      value 1;
                      description
                        "Donot inherit community from EVPN routes to IP routes";
                    }
                  }
                  description
                    "Community Attribute Inherit Option on Import";
                }
    
                leaf export-action {
                  type enumeration {
                    enum "allow" {
                      value 0;
                      description
                        "Inherit community from IP routes to EVPN routes";
                    }
                    enum "skip" {
                      value 1;
                      description
                        "Donot inherit community from IP route to EVPN routes";
                    }
                  }
                  description
                    "Community Attribute Inherit Option on Export";
                }
              }  // container community
            }  // container route-attributes
          }  // container ip-prefix-routes
    
          leaf igmp-id {
            junos:must "(!(".. encapsulation mpls-inet6"))";
            junos:must-message "IGMP snooping not supported with encapsulation mpls-inet6";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "EVPN IGMP Identifier value";
          }
    
          leaf multicast-mode {
            junos:must "(".. encapsulation vxlan")";
            junos:must-message "multicast-mode can only be configured with encapsulation vxlan";
            junos:must "((((".. .. .. instance-type virtual-switch" || ".. .. .. instance-type mac-vrf") && !(".. .. .. switch-options route-distinguisher")) || ".. .. .. switch-options route-distinguisher"))";
            junos:must-message "multicast-mode can only be configured in a virtual switch instance";
            type enumeration {
              enum "ingress-replication" {
                value 0;
                description
                  "Ingress Replication";
              }
            }
            default "ingress-replication";
            description
              "Multicast mode for EVPN";
          }
    
          container oism {
            junos:must "(".. oism supplemental-bridge-domain-irb")";
            junos:must-message "OISM must be configured with Supplemental Bridge Domain";
            junos:must "(".. .. .. instance-type vrf")";
            junos:must-message "oism must be configured with instance-type vrf";
            description
              "EVPN Multicast OISM features";
            uses apply-advanced;
    
            leaf supplemental-bridge-domain-irb {
              junos:must "(".. .. .. .. interface $$")";
              junos:must-message "Interface must configured in this routing instance";
              junos:must "("interfaces $$")";
              junos:must-message "Interface must be defined";
              type union {
                type jt:interface-unit;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "OISM SBD irb interface address";
            }
    
            leaf originate-smet-on-revenue-vlan-too {
              type empty;
              description
                "Originate smet route on revenue vlan too";
            }
    
            container pim-evpn-gateway {
              presence "enable pim-evpn-gateway";
              description
                "Configure PIM EVPN Gateway PEG parameters";
              uses apply-advanced;
    
              list external-irb {
                key "name";
                ordered-by user;
                description
                  "List of IRBs for external connectivity";
                leaf name {
                  junos:must "(".. .. .. .. .. .. interface $$")";
                  junos:must-message "Interface must be configured in this instance";
                  junos:must "("interfaces $$")";
                  junos:must-message "Interface must be defined";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "External vlan interface name";
                }
    
                uses apply-advanced;
              }  // list external-irb
            }  // container pim-evpn-gateway
          }  // container oism
    
          choice flexible-cross-connect-type {
            leaf flexible-cross-connect-vlan-aware {
              junos:must "(!(".. encapsulation mpls-inet6"))";
              junos:must-message "EVPN flexible cross-connect not supported with encapsulation mpls-inet6";
              junos:must "(!(".. flexible-cross-connect-vlan-unaware"))";
              junos:must-message "VPWS Instance can support either vlan aware or unaware service";
              junos:must "(".. .. .. instance-type evpn-vpws")";
              junos:must-message "instance-type evpn-vpws must be configured";
              type empty;
              description
                "Enable EVPN flexible cross-connect VLAN aware Service";
            }
            leaf flexible-cross-connect-vlan-unaware {
              junos:must "(!(".. flexible-cross-connect-vlan-aware"))";
              junos:must-message "VPWS Instance can support either vlan aware or unaware service";
              junos:must "(!(".. encapsulation mpls-inet6"))";
              junos:must-message "EVPN flexible cross-connect not supported with encapsulation mpls-inet6";
              junos:must "(".. .. .. instance-type evpn-vpws")";
              junos:must-message "instance-type evpn-vpws must be configured";
              type empty;
              description
                "Enable EVPN flexible cross-connect VLAN unaware Service";
            }
          }  // choice flexible-cross-connect-type
    
          leaf auto-service-id {
            junos:must "(".. flexible-cross-connect-vlan-aware")";
            junos:must-message "flexible-cross-connect-vlan-aware must be configured";
            junos:must "(".. .. .. instance-type evpn-vpws")";
            junos:must-message "instance-type evpn-vpws must be configured";
            type empty;
            description
              "Enable auto-derivation of VPWS service instance identifier";
          }
    
          leaf hot-standby-on {
            junos:must "(".. .. .. instance-type evpn-vpws")";
            junos:must-message "instance-type evpn-vpws must be configured";
            type empty;
            description
              "Activate evpn vpws upon becoming DF";
          }
    
          list group {
            junos:must "(".. flexible-cross-connect-vlan-unaware")";
            junos:must-message "flexible-cross-connect-vlan-unaware must be configured";
            junos:must "(".. .. .. instance-type evpn-vpws")";
            junos:must-message "instance-type evpn-vpws must be configured";
            key "name";
            ordered-by user;
            description
              "Enable EVPN flexible cross-connect VLAN unaware Service";
            leaf name {
              type string;
              description
                "Group name to group vlan unaware cross connects";
            }
    
            uses apply-advanced;
    
            container esi {
              presence "enable esi";
              description
                "ESI configuration to group vlan unaware cross connects";
              uses apply-advanced;
    
              leaf identifier {
                type jt:esi;
                description
                  "ESI value for grouping of vlan unaware cross connects";
              }
            }  // container esi
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Name of the  interface part of vlan unaware fxc";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
            }  // list interface
    
            container service-id {
              presence "enable service-id";
              description
                "Service-id for vlan unaware cross connects for  EVPN VPWS";
              uses apply-advanced;
    
              leaf local {
                junos:must "(unique ".. .. group <*> service-id local $$")";
                junos:must-message "Unique Local SID can only be configured ";
                junos:must "(unique ".. .. interface <*> vpws-service-id local $$")";
                junos:must-message "Unique Local SID can only be configured ";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16777215";
                  }
                }
                description
                  "Local service id for vlan unaware service";
              }
    
              leaf remote {
                junos:must "(unique ".. .. group <*> service-id remote $$")";
                junos:must-message "Unique Remote SID can only be configured ";
                junos:must "(unique ".. .. interface <*> vpws-service-id remote $$")";
                junos:must-message "Unique Remote SID can only be configured ";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16777215";
                  }
                }
                description
                  "Remote service id for vlan unaware service";
              }
            }  // container service-id
          }  // list group
    
          container vni-options {
            junos:must "(".. .. .. vrf-target")";
            junos:must-message "vrf-target must be configured";
            junos:must "((".. extended-vni-list" || ".. .. .. instance-type mac-vrf"))";
            junos:must-message "Extended-vni-list must be configured for non mac-vrf instance";
            junos:must "(".. encapsulation vxlan")";
            junos:must-message "encapsulation vxlan must be configured";
            description "VNI options";
            uses apply-advanced;
    
            list vni {
              key "name";
              description "Per-vni options";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "1 .. 16777214";
                  }
                }
              }
    
              uses apply-advanced;
    
              container vrf-target {
                description
                  "VRF target community configuration";
                uses apply-advanced;
    
                leaf export {
                  type string {
                    junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                    junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                  }
                  status deprecated;
                  description
                    "Target community to use when marking routes on export";
                }
    
                leaf community {
                  type string {
                    junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                    junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                  }
                  description "Target community";
                }
              }  // container vrf-target
            }  // list vni
          }  // container vni-options
    
          container traceoptions {
            description
              "Trace options for Layer 2 VPNs";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "error" {
                    value 0;
                    description "Trace errors";
                  }
                  enum "topology" {
                    value 1;
                    description
                      "Trace Layer 2 VPN, VPLS and EVPN topology changes";
                  }
                  enum "nlri" {
                    value 2;
                    description
                      "Trace Layer 2 VPN, VPLS and EVPN remote site advertisements";
                  }
                  enum "connections" {
                    value 3;
                    description
                      "Trace Layer 2 VPN and VPLS connections";
                  }
                  enum "automatic-site" {
                    value 4;
                    description
                      "Trace VPLS automatic site state";
                  }
                  enum "oam" {
                    value 5;
                    description
                      "Trace OAM messages";
                  }
                  enum "mac-database" {
                    value 6;
                    description
                      "Trace MAC route database in a EVPN instance";
                  }
                  enum "nsr" {
                    value 7;
                    description
                      "Trace NSR in a EVPN instance";
                  }
                  enum "egress-protection" {
                    value 8;
                    description
                      "Trace Edge Protection messages";
                  }
                  enum "instance" {
                    value 9;
                    description
                      "Evpn instance related messages";
                  }
                  enum "interface" {
                    value 10;
                    description
                      "Interface related messages";
                  }
                  enum "l2aldsync" {
                    value 11;
                    description
                      "Messages related to EVPN-L2ALD communication";
                  }
                  enum "p2mp" {
                    value 12;
                    description "P2MP messages";
                  }
                  enum "esi" {
                    value 13;
                    description
                      "Evpn ethernet segment related messages";
                  }
                  enum "mcsn" {
                    value 14;
                    description
                      "Evpn multicast snooping related messages";
                  }
                  enum "vpws" {
                    value 15;
                    description "VPWS messages";
                  }
                  enum "irb" {
                    value 16;
                    description
                      "Integrated routing bridging messages";
                  }
                  enum "ar" {
                    value 17;
                    description
                      "Assisted-replication messages";
                  }
                  enum "etree" {
                    value 18;
                    description
                      "Evpn etree messages";
                  }
                  enum "kernel" {
                    value 19;
                    description
                      "Messages related to rpd-kernel communication";
                  }
                  enum "bd" {
                    value 20;
                    description
                      "Evpn bridge domain messages";
                  }
                  enum "pbb" {
                    value 21;
                    description
                      "Evpn provider backbone bridging messages";
                  }
                  enum "infra" {
                    value 22;
                    description
                      "Messages related to infrastructure in evpn";
                  }
                  enum "pfxdb" {
                    value 23;
                    description
                      "Type-5 related messages";
                  }
                  enum "route" {
                    value 24;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 25;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 26;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 27;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 28;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 29;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 30;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 31;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf encapsulation-type {
            type enumeration {
              enum "atm-aal5" {
                value 0;
                description
                  "ATM AAL/5 encapsulation";
              }
              enum "atm-cell" {
                value 1;
                description
                  "ATM port promiscuous mode cell encapsulation";
              }
              enum "atm-cell-port-mode" {
                value 2;
                description
                  "ATM port promiscuous mode cell encapsulation";
              }
              enum "atm-cell-vp-mode" {
                value 3;
                description
                  "ATM VP promiscuous mode cell encapsulation";
              }
              enum "atm-cell-vc-mode" {
                value 4;
                description
                  "ATM non-promiscuous cell encapsulation";
              }
              enum "frame-relay" {
                value 5;
                description
                  "Frame Relay encapsulation";
              }
              enum "ppp" {
                value 6;
                description "PPP encapsulation";
              }
              enum "cisco-hdlc" {
                value 7;
                description
                  "Cisco-compatible HDLC encapsulation";
              }
              enum "ethernet-vlan" {
                value 8;
                description
                  "Ethernet VLAN encapsulation";
              }
              enum "ethernet" {
                value 9;
                description
                  "Ethernet encapsulation";
              }
              enum "interworking" {
                value 10;
                description
                  "Layer 2.5 interworking VPN";
              }
              enum "frame-relay-port-mode" {
                value 11;
                description
                  "Frame Relay port mode encapsulation";
              }
              enum "satop-t1" {
                value 12;
                description
                  "SATOP-T1 based Layer 2 VPN";
              }
              enum "satop-e1" {
                value 13;
                description
                  "SATOP-E1 based Layer 2 VPN";
              }
              enum "satop-t3" {
                value 14;
                description
                  "SATOP-T3 based Layer 2 VPN";
              }
              enum "satop-e3" {
                value 15;
                description
                  "SATOP-E3 based Layer 2 VPN";
              }
              enum "cesop" {
                value 16;
                description
                  "CESOP based Layer 2 VPN";
              }
            }
            description
              "Encapsulation type for VPN";
          }
    
          leaf control-word {
            type empty;
            description
              "Add control word to the Layer 2 encapsulation";
          }
    
          leaf no-control-word {
            type empty;
            description
              "Disables control word on the Layer 2 encapsulation";
          }
    
          leaf site-range {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65534";
              }
            }
            description
              "Maximum site identifier in this VPLS domain";
          }
    
          leaf label-block-size {
            type enumeration {
              enum "2" {
                value 0;
                description
                  "Label block size of 2";
              }
              enum "4" {
                value 1;
                description
                  "Label block size of 4";
              }
              enum "8" {
                value 2;
                description
                  "Label block size of 8";
              }
              enum "16" {
                value 3;
                description
                  "Label block size of 16";
              }
            }
            description
              "Label block size for this VPLS instance";
          }
    
          choice tunnel-services-choice {
            container tunnel-services {
              description
                "Use tunnel services for this VPLS instance";
              uses apply-advanced;
    
              leaf-list devices {
                type union {
                  type jt:interface-device;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                ordered-by user;
                description
                  "Tunnel services devices to use for this VPLS instance";
              }
    
              leaf primary {
                type union {
                  type jt:interface-device;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Primary tunnel services device to use for VPLS instance";
              }
            }  // container tunnel-services
            leaf no-tunnel-services {
              type empty;
              description
                "Do not use tunnel services for this VPLS instance";
            }
          }  // choice tunnel-services-choice
    
          leaf community {
            type string;
            description
              "Community associated with this VPLS instance";
          }
    
          leaf vpls-id {
            type string;
            description
              "Identifier for this VPLS instance";
          }
    
          leaf mtu {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "512 .. 65535";
              }
            }
            description
              "MTU to be advertised to the remote end";
          }
    
          leaf ignore-mtu-mismatch {
            type empty;
            description
              "Allow different MTU values on local and remote end";
          }
    
          container mac-flush {
            presence "enable mac-flush";
            description
              "Enables mac-flush processing";
            uses apply-advanced;
    
            leaf any-interface {
              junos:must "((".. .. vpls-id" || any ".. .. mesh-group <*> vpls-id"))";
              junos:must-message "'any-interface' can be configured only for LDP VPLS";
              type empty;
              description
                "Send mac-flush when any AC interface goes down";
            }
    
            leaf any-spoke {
              junos:must "((".. .. vpls-id" || any ".. .. mesh-group <*> vpls-id"))";
              junos:must-message "'any-spoke' can be configured only for LDP VPLS";
              type empty;
              description
                "Send mac-flush when any spoke pseudo wire goes down";
            }
    
            leaf propagate {
              junos:must "((".. .. vpls-id" || any ".. .. mesh-group <*> vpls-id"))";
              junos:must-message "'propagate' can be configured only for LDP VPLS";
              type empty;
              description
                "Propagate mac-flush to the core";
            }
          }  // container mac-flush
    
          leaf ignore-encapsulation-mismatch {
            type empty;
            description
              "Allow different encapsulation types on local and remote end";
          }
    
          leaf pseudowire-status-tlv {
            type empty;
            description
              "Send pseudowire status TLV";
          }
    
          leaf flow-label-transmit {
            type empty;
            description
              "Advertise capability to push Flow Label in transmit direction to remote PE";
          }
    
          leaf flow-label-receive {
            type empty;
            description
              "Advertise capability to pop Flow Label in receive direction to remote PE";
          }
    
          leaf flow-label-transmit-static {
            junos:must "((".. vpls-id" || (".. .. .. l2vpn-id" || (".. .. .. instance-type evpn-vpws" || (".. .. .. instance-type evpn" || ".. .. .. instance-type virtual-switch")))))";
            junos:must-message "Flow-Label static only supported for FEC128 or FEC129 VPLS, EVPN, Virtual-switch or VPWS";
            junos:must "(!(".. flow-label-transmit"))";
            junos:must-message "Can't have flow-label-transmit-static along with flow-label-transmit";
            type empty;
            description
              "Push Flow Label on PW packets sent to remote PE";
          }
    
          leaf flow-label-receive-static {
            junos:must "((".. vpls-id" || (".. .. .. l2vpn-id" || (".. .. .. instance-type evpn-vpws" || (".. .. .. instance-type evpn" || ".. .. .. instance-type virtual-switch")))))";
            junos:must-message "Flow-Label static only supported for FEC128 or FEC129 VPLS, EVPN, Virtual-switch or VPWS";
            junos:must "(!(".. flow-label-receive"))";
            junos:must-message "Can't have flow-label-receive-static along with flow-label-receive";
            type empty;
            description
              "Pop Flow Label from PW packets received from remote PE";
          }
    
          container associate-profile {
            description
              "Associate profile options for dynamic IFL";
            uses apply-advanced;
    
            leaf profile-name {
              type string {
                length "1 .. 81";
              }
              description
                "Associated profile name";
            }
    
            leaf profile-variable-set {
              type string {
                length "1 .. 81";
              }
              description
                "Associate dynamic variable set with the profile";
            }
          }  // container associate-profile
    
          leaf connectivity-type {
            type enumeration {
              enum "ce" {
                value 0;
                description
                  "CE interface is required";
              }
              enum "irb" {
                value 1;
                description
                  "IRB interface is sufficient";
              }
              enum "permanent" {
                value 2;
                description
                  "Pseudowire permanently up";
              }
            }
            description
              "Specify type of interface sufficient to bring vpls connection up";
          }
    
          list import-labeled-routes {
            junos:must "(!(".. neighbor"))";
            junos:must-message "not supported for static vpls";
            key "name";
            ordered-by user;
            description
              "Import ingress label route to instance.mpls.0 from mpls.0";
            leaf name {
              junos:must "("routing-instances $$ protocols mpls")";
              junos:must-message "protocols MPLS must be configured on routing-instance to import the labeled routes";
              junos:must "("routing-instances $$ instance-type virtual-router")";
              junos:must-message "Ingress labelled route can be imported only to routing-instance type virtual-router";
              junos:must "("routing-instances $$")";
              junos:must-message "Referenced routing instance must be defined";
              type string;
              description
                "Routing instance name where label route has to be imported";
            }
          }  // list import-labeled-routes
    
          container oam {
            description
              "OAM Configuration for VPN";
            uses apply-advanced;
    
            leaf ping-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "30 .. 3600";
                }
              }
              units "seconds";
              default "60";
              description
                "Time interval between ping messages";
            }
    
            leaf ping-multiplier {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 5";
                }
              }
              description
                "Number of ping reply missed before declaring BFD down";
            }
    
            container bfd-liveness-detection {
              description
                "Bidirectional Forwarding Detection (BFD) options";
              uses apply-advanced;
    
              leaf version {
                type enumeration {
                  enum "0" {
                    value 0;
                    description
                      "BFD version 0 (deprecated)";
                  }
                  enum "1" {
                    value 1;
                    description "BFD version 1";
                  }
                  enum "automatic" {
                    value 2;
                    description
                      "Choose BFD version automatically";
                  }
                }
                default "automatic";
                description
                  "BFD protocol version number";
              }
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit and receive interval";
              }
    
              leaf minimum-transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                status deprecated;
                description
                  "Minimum transmit interval";
              }
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval";
              }
    
              leaf multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                default "3";
                description
                  "Detection time multiplier";
              }
    
              choice adaptation-choice {
                leaf no-adaptation {
                  type empty;
                  description
                    "Disable adaptation";
                }
              }  // choice adaptation-choice
    
              container transmit-interval {
                description
                  "Transmit-interval options";
                uses apply-advanced;
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit interval";
                }
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High transmit interval triggering a trap";
                }
              }  // container transmit-interval
    
              container detection-time {
                description
                  "Detection-time options";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High detection-time triggering a trap";
                }
              }  // container detection-time
            }  // container bfd-liveness-detection
    
            container control-channel {
              description
                "Supported control channel type ";
              uses apply-advanced;
    
              choice action-choice {
                leaf pwe3-control-word {
                  type empty;
                  description
                    "For BGP based PW send oam packets with control word, with 0001b as first nibble";
                }
                leaf router-alert-label {
                  type empty;
                  description
                    "For BGP based PW send oam packets with router alert label";
                }
                leaf pw-label-ttl-1 {
                  type empty;
                  description
                    "For BGP based PW send oam packets with MPLS pw label TTL = 1";
                }
              }  // choice action-choice
            }  // container control-channel
          }  // container oam
    
          container multi-homing {
            description
              "Multi-homing configuration for FEC129 VPLS";
            uses apply-advanced;
    
            leaf peer-active {
              type empty;
              description
                "Keep CE interfaces in up state when all BGP peers go down";
            }
    
            list site {
              key "name";
              description
                "Sites connected to this provider equipment";
              leaf name {
                type string;
                description
                  "Name of Layer 2 VPN or VPLS site";
              }
    
              uses apply-advanced;
    
              leaf identifier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65534";
                  }
                }
                description
                  "Layer 2 VPN or VPLS multi-homing identifier";
              }
    
              leaf preference {
                type string;
                description
                  "Layer 2 VPN or VPLS multi-homing preference";
              }
    
              container active-interface {
                description
                  "Configure interface to designate as active";
                uses apply-advanced;
    
                choice interface_name {
                  leaf any {
                    type empty;
                    description
                      "One configured interface is designated active at random";
                  }
                  leaf primary {
                    junos:must "(".. .. .. .. .. .. interface $$")";
                    junos:must-message "Interface must be part of this VPLS routing instance";
                    type union {
                      type jt:interface-name;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Interface to designate as active if it is operational";
                  }
                }  // choice interface_name
              }  // container active-interface
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Interface that connects this site to the VPN";
                leaf name {
                  junos:must "(".. .. .. .. .. .. interface $$")";
                  junos:must-message "Interface must be part of this VPLS routing instance";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                leaf preference {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Layer 2 VPN or VPLS multi-homing preference for the interface";
                }
              }  // list interface
    
              leaf peer-active {
                type empty;
                description
                  "Keep CE interfaces in up state when all BGP peers go down";
              }
            }  // list site
          }  // container multi-homing
        }  // grouping juniper-protocols-l2vpn
    
        grouping juniper-protocols-evi-options {
          uses apply-advanced;
    
          list isid {
            key "name";
            description "Per-evi options";
            leaf name {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "256 .. 16777214";
                }
              }
            }
    
            uses apply-advanced;
    
            container vrf-target {
              description
                "VRF target community configuration";
              uses apply-advanced;
    
              leaf community {
                type string {
                  junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                  junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                }
                description "Target community";
              }
            }  // container vrf-target
          }  // list isid
        }  // grouping juniper-protocols-evi-options
    
        grouping juniper-protocols-evpn-interconnect {
          description
            "Interconnect configuration for the routing instance";
          uses apply-advanced;
    
          leaf-list vrf-import {
            junos:must "(".. route-distinguisher")";
            junos:must-message "route distinguisher must be defined for vrf-import";
            type jt:policy-algebra;
            ordered-by user;
            description
              "Import policy for Interconnect";
          }
    
          leaf-list vrf-export {
            junos:must "(".. route-distinguisher")";
            junos:must-message "route distinguisher must be defined for vrf-export";
            type jt:policy-algebra;
            ordered-by user;
            description
              "Export policy for Interconnect";
          }
    
          container vrf-target {
            junos:must "(".. route-distinguisher")";
            junos:must-message "route distinguisher must be defined for vrf-target";
            description
              "Interconnect target community configuration";
            uses apply-advanced;
    
            leaf community {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use in import and export";
            }
    
            leaf import {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use when filtering on import";
            }
    
            leaf export {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use when marking routes on export";
            }
          }  // container vrf-target
    
          container route-distinguisher {
            description
              "Route distinguisher for this interconnect";
            leaf rd-type {
              type string {
                junos:posix-pattern "^[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. 123456L:100";
              }
              description
                "Number in (16 bit:32 bit) or (32 bit 'L':16 bit) or (IP address:16 bit) format";
            }
          }  // container route-distinguisher
    
          container esi {
            description
              "ESI configuration of interconnect";
            uses apply-advanced;
    
            leaf identifier {
              junos:must "(unique "interfaces <*> esi $$")";
              junos:must-message "ESI value must be unique across all IFDs and IFLs";
              type jt:esi;
              description
                "ESI value for interconnect";
            }
    
            choice mode {
              leaf all-active {
                type empty;
                description "All-active mode";
              }
            }  // choice mode
    
            container df-election-type {
              presence "enable df-election-type";
              description "DF Election Type";
              uses apply-advanced;
    
              choice pref_choice {
                container preference {
                  presence "enable preference";
                  description
                    "Preference based DF election";
                  uses apply-advanced;
    
                  leaf value {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 65535";
                      }
                    }
                    default "32767";
                    description
                      "Preference value for EVPN Multihoming DF election";
                  }
                }  // container preference
              }  // choice pref_choice
    
              choice mod_choice {
                container mod {
                  junos:must "(!(".. preference"))";
                  junos:must-message "preference must not be configured";
                  presence "enable mod";
                  description
                    "MOD based DF election";
                }  // container mod
              }  // choice mod_choice
            }  // container df-election-type
          }  // container esi
    
          leaf-list interconnected-vni-list {
            type string;
            description
              "List of translated VNIs (1..16777214) or all, that are to be EVPN interconnected";
          }
        }  // grouping juniper-protocols-evpn-interconnect
    
        grouping juniper-protocols-ldp {
          uses apply-advanced;
    
          container traceoptions {
            description "Trace options for LDP";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "error" {
                    value 0;
                    description
                      "Trace errored packets";
                  }
                  enum "event" {
                    value 1;
                    description
                      "Trace LDP state machine events";
                  }
                  enum "packet-dump" {
                    value 2;
                    description
                      "Dump the contents of selected packet types";
                  }
                  enum "packets" {
                    value 3;
                    description
                      "Trace all LDP packets";
                  }
                  enum "periodic" {
                    value 4;
                    description
                      "Trace periodic (hello and keepalive) packets";
                  }
                  enum "initialization" {
                    value 5;
                    description
                      "Trace initialization packets";
                  }
                  enum "notification" {
                    value 6;
                    description
                      "Trace notification packets";
                  }
                  enum "address" {
                    value 7;
                    description
                      "Trace address packets";
                  }
                  enum "label" {
                    value 8;
                    description
                      "Trace label packets";
                  }
                  enum "binding" {
                    value 9;
                    description
                      "Trace label binding state";
                  }
                  enum "path" {
                    value 10;
                    description
                      "Trace label path state";
                  }
                  enum "ppmd" {
                    value 11;
                    description
                      "Trace state and events for ppmd process";
                  }
                  enum "nsr-synchronization" {
                    value 12;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "link-protection" {
                    value 13;
                    description
                      "Trace link protection events";
                  }
                  enum
                    "p2mp-nsr-synchronization" {
                    value 14;
                    description
                      "Trace p2mp NSR synchronization events";
                  }
                  enum "route" {
                    value 15;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 16;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 17;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 18;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 19;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 20;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 21;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 22;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
    
              container filter {
                presence "enable filter";
                description
                  "Filter to apply to this flag";
                uses ldp_filter_obj;
              }  // container filter
            }  // list flag
          }  // container traceoptions
    
          container traffic-statistics {
            description
              "Collect statistics for LDP label-switched paths";
            uses apply-advanced;
    
            container file {
              description
                "Statistics file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            leaf interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "60 .. 65535";
                }
              }
              description
                "Time to collect statistics (seconds)";
            }
    
            leaf no-penultimate-hop {
              type empty;
              description
                "No penultimate hop statistics collection";
            }
          }  // container traffic-statistics
    
          container graceful-restart {
            description
              "Configure graceful restart attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf helper-disable {
              type empty;
              description
                "Disable the graceful restart helper capability";
            }
    
            leaf recovery-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "120 .. 1800";
                }
              }
              units "seconds";
              description
                "Time required for recovery";
            }
    
            leaf maximum-neighbor-recovery-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "140 .. 1900";
                }
              }
              units "seconds";
              description
                "Maximum time stale mappings are maintained";
            }
    
            leaf reconnect-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 300";
                }
              }
              units "seconds";
              description
                "Time required to reestablish session after graceful restart";
            }
    
            leaf maximum-neighbor-reconnect-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 300";
                }
              }
              units "seconds";
              description
                "Maximum reconnect time allowed from a restarting neighbor";
            }
          }  // container graceful-restart
    
          container auto-targeted-session {
            presence
              "enable auto-targeted-session";
            description
              "Configure auto targeted session parameters";
            uses apply-advanced;
    
            leaf teardown-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 300";
                }
              }
              units "seconds";
              default "90";
              description
                "Auto targeted session tear down delay";
            }
    
            leaf maximum-sessions {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1000";
                }
              }
              default "100";
              description
                "Auto targeted maximum sessions";
            }
    
            leaf no-rlfa {
              type empty;
              description
                "Do not allow RLFA in auto targeted sessions";
            }
    
            leaf no-dynamic-tunnels {
              type empty;
              description
                "Do not allow dynamic tunnels in auto targeted sessions";
            }
          }  // container auto-targeted-session
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Route preference";
          }
    
          leaf no-forwarding {
            type empty;
            description
              "Do not use LDP ingress routes for forwarding";
          }
    
          leaf rib-group {
            junos:must "("routing-options rib-groups $$")";
            junos:must-message "Referenced rib-group must be defined";
            type string;
            description
              "Routing table group for importing ingress routes";
          }
    
          leaf rib-group6 {
            junos:must "("routing-options rib-groups $$")";
            junos:must-message "Referenced rib-group must be defined";
            type string;
            description
              "Routing table group for importing ingress v6 routes";
          }
    
          leaf l2-smart-policy {
            type empty;
            description
              "Do not export or import Layer 3 FECs for Layer 2 sessions";
          }
    
          leaf track-igp-metric {
            type empty;
            description "Track the IGP metric";
          }
    
          leaf strict-targeted-hellos {
            type empty;
            description
              "Do not send targeted hellos to unconfigured neighbors";
          }
    
          container longest-match {
            presence "enable longest-match";
            description
              "Configure longest match";
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Longest match import policy";
            }
          }  // container longest-match
    
          leaf-list color-import-policy {
            type jt:policy-algebra;
            ordered-by user;
            description "Import color policy";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          leaf-list egress-policy {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Configure LSP egress policy";
          }
    
          leaf-list dod-request-policy {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Configure DoD label request policy";
          }
    
          container next-hop {
            description "LDP next-hop control";
            uses apply-advanced;
    
            container merged {
              junos:must "("protocols ldp deaggregate")";
              junos:must-message "next-hop merged policy requires deaggregate to be enabled.";
              description "Merged next hop";
              uses apply-advanced;
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Merged next-hop policy";
              }
            }  // container merged
    
            container no-rsvp-tunneling {
              junos:must "("protocols ldp deaggregate")";
              junos:must-message "next-hop no-rsvp-tunneling policy requires deaggregate to be enabled.";
              description "No rsvp tunneling";
              uses apply-advanced;
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "No rsvp tunneling next-hop policy";
              }
            }  // container no-rsvp-tunneling
          }  // container next-hop
    
          choice mtu-discovery-choice {
            leaf mtu-discovery {
              type empty;
              description
                "Enable TCP path MTU discovery";
            }
            leaf no-mtu-discovery {
              type empty;
              description
                "Don't enable TCP path MTU discovery";
            }
          }  // choice mtu-discovery-choice
    
          choice deaggregate-choice {
            leaf deaggregate {
              type empty;
              description
                "Deaggregate FECs into separate labels";
            }
            leaf no-deaggregate {
              type empty;
              description
                "Don't deaggregate FECs into separate labels";
            }
          }  // choice deaggregate-choice
    
          leaf explicit-null {
            type empty;
            description
              "Advertise the EXPLICIT_NULL label for egress FECs";
          }
    
          leaf label-withdrawal-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 120";
              }
            }
            units "seconds";
            default "60";
            description
              "Delay label withdrawal for FECs to avoid label churn";
          }
    
          container make-before-break {
            presence "enable make-before-break";
            description
              "Configure make before break";
            uses apply-advanced;
    
            leaf timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 300";
                }
              }
              units "seconds";
              default "30";
              description
                "Make before break timeout";
            }
    
            leaf switchover-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 300";
                }
              }
              units "seconds";
              default "3";
              description
                "Make before break switchover delay";
            }
          }  // container make-before-break
    
          container transport-address {
            description
              "Address used for TCP sessions";
            choice address-choice {
              leaf router-id {
                type empty;
                description
                  "Use router ID for TCP connections";
              }
              leaf interface {
                type empty;
                description
                  "Use interface address for TCP connections";
              }
              leaf address {
                type jt:ipaddr;
                description
                  "Use specified address for TCP connections";
              }
            }  // choice address-choice
          }  // container transport-address
    
          leaf keepalive-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Keepalive interval (seconds)";
          }
    
          leaf keepalive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Keepalive timeout (seconds)";
          }
    
          list interface {
            key "name";
            description
              "Enable LDP on this interface";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable LDP on this interface";
              }
            }  // choice enable-disable
    
            leaf hello-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Hello interval (seconds)";
            }
    
            leaf hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Hello hold time (seconds)";
            }
    
            container link-protection {
              presence "enable link-protection";
              description
                "Enable link protection to protect interface for link faults only";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable link-protection";
                }
              }  // choice enable-disable
    
              leaf dynamic-rsvp-lsp {
                type empty;
                description
                  "Enable setup of dynamic rsvp lsp for link protection";
              }
            }  // container link-protection
    
            container transport-address {
              description
                "Address used for TCP sessions";
              choice address-choice {
                leaf router-id {
                  type empty;
                  description
                    "Use router ID for TCP connections";
                }
                leaf interface {
                  type empty;
                  description
                    "Use interface address for TCP connections";
                }
                leaf address {
                  type jt:ipaddr;
                  description
                    "Use specified address for TCP connections";
                }
              }  // choice address-choice
            }  // container transport-address
    
            choice allow-subnet-mismatch-choice {
              leaf allow-subnet-mismatch {
                type empty;
                description
                  "Allow subnet mismatch for source address in hello packet";
              }
              leaf no-allow-subnet-mismatch {
                type empty;
                description
                  "Don't allow subnet mismatch for source address in hello packet";
              }
            }  // choice allow-subnet-mismatch-choice
          }  // list interface
    
          list neighbor {
            key "name";
            description
              "Configure a remote LDP neighbor";
            leaf name {
              type jt:ipaddr;
              description "Neighbor address";
            }
    
            uses apply-advanced;
          }  // list neighbor
    
          list session {
            key "name";
            description
              "Configure session parameters";
            leaf name {
              type jt:ipaddr;
              description
                "Session destination address";
            }
    
            uses apply-advanced;
    
            leaf authentication-key {
              type string {
                length "1 .. 126";
              }
              description
                "MD5 authentication key";
            }
    
            leaf authentication-algorithm {
              junos:must "(".. authentication-key-chain")";
              junos:must-message "May not be configured without authentication-key-chain";
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "md5" {
                  value 0;
                  description "Message Digest 5";
                }
                enum "hmac-sha-1-96" {
                  value 1;
                  description
                    "Hash-based Message Authentication Code (SHA1) (96 bits)";
                }
                enum "aes-128-cmac-96" {
                  value 2;
                  description
                    "Cipher-based Message Authentication Code (AES128) (96 bits)";
                }
                enum "ao" {
                  value 3;
                  description
                    "TCP Authentication Option";
                }
              }
              default "hmac-sha-1-96";
              description
                "Authentication algorithm name";
            }
    
            leaf tcpao-handling-with-digest-mismatch {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "drop-if-no-tcpao" {
                  value 0;
                  description
                    "Drop the connection if Digest mismatched";
                }
                enum "allow-without-tcpao" {
                  value 1;
                  description
                    "Allow the connection establishment without TCP-AO";
                }
              }
              description
                "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
            }
    
            leaf authentication-key-chain {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              junos:must "("security authentication-key-chains key-chain $$")";
              junos:must-message "Referenced key-chain must be defined";
              type string {
                length "1 .. 128";
              }
              description "Key chain name";
            }
    
            leaf downstream-on-demand {
              type empty;
              description
                "Configure downstream on demand label distribution mode";
            }
    
            leaf transport-address {
              type jt:ipaddr;
              description
                "Address used for TCP sessions to the neighbor";
            }
    
            choice mtu-discovery-choice {
              leaf mtu-discovery {
                type empty;
                description
                  "Enable TCP path MTU discovery";
              }
              leaf no-mtu-discovery {
                type empty;
                description
                  "Don't enable TCP path MTU discovery";
              }
            }  // choice mtu-discovery-choice
          }  // list session
    
          list session-group {
            key "name";
            description
              "Configure session group parameters";
            leaf name {
              type jt:ipprefix;
              description
                "Session destination address/prefix length";
            }
    
            uses apply-advanced;
    
            leaf authentication-key {
              type string {
                length "1 .. 126";
              }
              description
                "MD5 authentication key";
            }
    
            leaf authentication-algorithm {
              junos:must "(".. authentication-key-chain")";
              junos:must-message "May not be configured without authentication-key-chain";
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "md5" {
                  value 0;
                  description "Message Digest 5";
                }
                enum "hmac-sha-1-96" {
                  value 1;
                  description
                    "Hash-based Message Authentication Code (SHA1) (96 bits)";
                }
                enum "aes-128-cmac-96" {
                  value 2;
                  description
                    "Cipher-based Message Authentication Code (AES128) (96 bits)";
                }
                enum "ao" {
                  value 3;
                  description
                    "TCP Authentication Option";
                }
              }
              default "hmac-sha-1-96";
              description
                "Authentication algorithm name";
            }
    
            leaf tcpao-handling-with-digest-mismatch {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "drop-if-no-tcpao" {
                  value 0;
                  description
                    "Drop the connection if Digest mismatched";
                }
                enum "allow-without-tcpao" {
                  value 1;
                  description
                    "Allow the connection establishment without TCP-AO";
                }
              }
              description
                "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
            }
    
            leaf authentication-key-chain {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              junos:must "("security authentication-key-chains key-chain $$")";
              junos:must-message "Referenced key-chain must be defined";
              type string {
                length "1 .. 128";
              }
              description "Key chain name";
            }
    
            leaf downstream-on-demand {
              type empty;
              description
                "Configure downstream on demand label distribution mode";
            }
    
            leaf transport-address {
              type jt:ipaddr;
              description
                "Address used for TCP sessions to the neighbor";
            }
    
            choice mtu-discovery-choice {
              leaf mtu-discovery {
                type empty;
                description
                  "Enable TCP path MTU discovery";
              }
              leaf no-mtu-discovery {
                type empty;
                description
                  "Don't enable TCP path MTU discovery";
              }
            }  // choice mtu-discovery-choice
          }  // list session-group
    
          container session-protection {
            presence "enable session-protection";
            description
              "Configure session protection";
            leaf timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 65535";
                }
              }
              units "seconds";
              description
                "Session protection timeout";
            }
          }  // container session-protection
    
          container igp-synchronization {
            description
              "Configure IGP synchronization parameters";
            uses apply-advanced;
    
            leaf holddown-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "10 .. 300";
                }
              }
              units "seconds";
              description
                "Time to hold the up notification to the IGPs";
            }
          }  // container igp-synchronization
    
          container log-updown {
            description
              "Logging actions for LSP up/down events";
            uses apply-advanced;
    
            container trap {
              description "SNMP traps options";
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable LDP LSP up/down trap";
                }
              }  // choice enable-disable
            }  // container trap
          }  // container log-updown
    
          container policing {
            description
              "Configure policing for an LDP FEC";
            uses apply-advanced;
    
            list fec {
              key "name";
              ordered-by user;
              description
                "Forwarding equivalence class";
              leaf name {
                type jt:ipv4prefix;
                description
                  "Forwarding equivalence class address";
              }
    
              uses apply-advanced;
    
              leaf ingress-traffic {
                junos:must "(("firewall family any filter $$" || (!("firewall") && ".. .. .. .. .. .. .. .. firewall family any filter $$")))";
                junos:must-message "referenced filter must be defined under firewall family any";
                type string {
                  junos:posix-pattern "!^((__.*)|(.{65,}))$";
                  junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                }
                description
                  "Name of filter to use for policing ingress LDP traffic";
              }
    
              leaf transit-traffic {
                junos:must "(("firewall family any filter $$" || (!("firewall") && ".. .. .. .. .. .. .. .. firewall family any filter $$")))";
                junos:must-message "referenced filter must be defined under firewall family any";
                type string {
                  junos:posix-pattern "!^((__.*)|(.{65,}))$";
                  junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                }
                description
                  "Name of filter to use for policing transit LDP traffic";
              }
            }  // list fec
          }  // container policing
    
          container entropy-label {
            description
              "Insert entropy label for  a LDP FEC";
            uses apply-advanced;
    
            leaf-list ingress-policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Entropy label ingress policy";
            }
          }  // container entropy-label
    
          container oam {
            description
              "Configure periodic OAM for a LDP FEC";
            uses apply-advanced;
    
            leaf-list ingress-policy {
              type jt:policy-algebra;
              ordered-by user;
              description "OAM ingress policy";
            }
    
            leaf-list bfd-port-egress-policy {
              type jt:policy-algebra;
              ordered-by user;
              description "OAM egress policy";
            }
    
            list fec {
              key "name";
              ordered-by user;
              description
                "Forwarding equivalence class";
              leaf name {
                type jt:ipv4prefix;
                description
                  "Forwarding equivalence class address";
              }
    
              uses apply-advanced;
    
              choice bfd_liveness_detection_type {
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection (BFD) options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
    
                  leaf ecmp {
                    type empty;
                    description
                      "Enable equal cost multipath (ECMP) support for BFD";
                  }
    
                  container failure-action {
                    description
                      "Action to take when BFD session goes down";
                    choice action-choice {
                      leaf remove-route {
                        type empty;
                        description
                          "Remove LDP route from the ribs";
                      }
                      leaf remove-nexthop {
                        type empty;
                        description
                          "Remove LDP nexthop from the route";
                      }
                    }  // choice action-choice
                  }  // container failure-action
    
                  leaf holddown-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255000";
                      }
                    }
                    units "milliseconds";
                    default "0";
                    description
                      "Time to hold the session-UP notification to the client";
                  }
    
                  leaf no-router-alert-option {
                    type empty;
                    description
                      "Do not set Router-Alert options in IP header for MPLS-BFD";
                  }
    
                  leaf use-ip-ttl-1 {
                    type empty;
                    description
                      "Set TTL value to 1 in IP header for MPLS-BFD";
                  }
                }  // container bfd-liveness-detection
                leaf no-bfd-liveness-detection {
                  type empty;
                  description
                    "Disable BFD liveness detection";
                }
              }  // choice bfd_liveness_detection_type
    
              container periodic-traceroute {
                presence
                  "enable periodic-traceroute";
                description
                  "Configure periodic traceroute";
                uses apply-advanced;
    
                leaf frequency {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "15 .. 120";
                    }
                  }
                  units "minutes";
                  description
                    "Time between traceroute attempts";
                }
    
                leaf ttl {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Maximum time-to-live value";
                }
    
                leaf retries {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 9";
                    }
                  }
                  description
                    "Number of times to resend probe";
                }
    
                leaf wait {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "5 .. 15";
                    }
                  }
                  units "seconds";
                  description
                    "Time to wait before resending probe";
                }
    
                leaf paths {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Maximum number of paths to traverse";
                }
    
                leaf source {
                  type jt:ipv4addr;
                  description
                    "Source address to use when sending probes";
                }
    
                leaf exp {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "0 .. 7";
                    }
                  }
                  description
                    "Class-of-service value to use when sending probes";
                }
    
                leaf fanout {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 64";
                    }
                  }
                  description
                    "Maximum number of nexthops to search per node";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable periodic traceroute for a FEC";
                }
              }  // container periodic-traceroute
            }  // list fec
    
            container bfd-liveness-detection {
              description
                "Bidirectional Forwarding Detection (BFD) options";
              uses apply-advanced;
    
              leaf version {
                type enumeration {
                  enum "0" {
                    value 0;
                    description
                      "BFD version 0 (deprecated)";
                  }
                  enum "1" {
                    value 1;
                    description "BFD version 1";
                  }
                  enum "automatic" {
                    value 2;
                    description
                      "Choose BFD version automatically";
                  }
                }
                default "automatic";
                description
                  "BFD protocol version number";
              }
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit and receive interval";
              }
    
              leaf minimum-transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                status deprecated;
                description
                  "Minimum transmit interval";
              }
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval";
              }
    
              leaf multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                default "3";
                description
                  "Detection time multiplier";
              }
    
              choice adaptation-choice {
                leaf no-adaptation {
                  type empty;
                  description
                    "Disable adaptation";
                }
              }  // choice adaptation-choice
    
              container transmit-interval {
                description
                  "Transmit-interval options";
                uses apply-advanced;
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit interval";
                }
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High transmit interval triggering a trap";
                }
              }  // container transmit-interval
    
              container detection-time {
                description
                  "Detection-time options";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High detection-time triggering a trap";
                }
              }  // container detection-time
    
              leaf ecmp {
                type empty;
                description
                  "Enable equal cost multipath (ECMP) support for BFD";
              }
    
              container failure-action {
                description
                  "Action to take when BFD session goes down";
                choice action-choice {
                  leaf remove-route {
                    type empty;
                    description
                      "Remove LDP route from the ribs";
                  }
                  leaf remove-nexthop {
                    type empty;
                    description
                      "Remove LDP nexthop from the route";
                  }
                }  // choice action-choice
              }  // container failure-action
    
              leaf holddown-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255000";
                  }
                }
                units "milliseconds";
                default "0";
                description
                  "Time to hold the session-UP notification to the client";
              }
    
              leaf no-router-alert-option {
                type empty;
                description
                  "Do not set Router-Alert options in IP header for MPLS-BFD";
              }
    
              leaf use-ip-ttl-1 {
                type empty;
                description
                  "Set TTL value to 1 in IP header for MPLS-BFD";
              }
            }  // container bfd-liveness-detection
    
            container periodic-traceroute {
              presence
                "enable periodic-traceroute";
              description
                "Configure periodic traceroute";
              uses apply-advanced;
    
              leaf frequency {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "15 .. 120";
                  }
                }
                units "minutes";
                description
                  "Time between traceroute attempts";
              }
    
              leaf ttl {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 255";
                  }
                }
                description
                  "Maximum time-to-live value";
              }
    
              leaf retries {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 9";
                  }
                }
                description
                  "Number of times to resend probe";
              }
    
              leaf wait {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "5 .. 15";
                  }
                }
                units "seconds";
                description
                  "Time to wait before resending probe";
              }
    
              leaf paths {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 255";
                  }
                }
                description
                  "Maximum number of paths to traverse";
              }
    
              leaf source {
                type jt:ipv4addr;
                description
                  "Source address to use when sending probes";
              }
    
              leaf exp {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "0 .. 7";
                  }
                }
                description
                  "Class-of-service value to use when sending probes";
              }
    
              leaf fanout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 64";
                  }
                }
                description
                  "Maximum number of nexthops to search per node";
              }
            }  // container periodic-traceroute
    
            leaf lsp-ping-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "30 .. 3600";
                }
              }
              units "seconds";
              default "60";
              description
                "Time interval between LSP ping messages";
            }
    
            leaf lsp-ping-multiplier {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 5";
                }
              }
              description
                "Number of ping reply missed before declaring BFD down";
            }
          }  // container oam
    
          container targeted-hello {
            description
              "Configure targeted hello parameters";
            uses apply-advanced;
    
            leaf hello-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Hello interval (seconds)";
            }
    
            leaf hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Hold interval (seconds)";
            }
          }  // container targeted-hello
    
          container p2mp {
            presence "enable p2mp";
            description
              "Advertise P2MP capability to peers";
            uses apply-advanced;
    
            container recursive {
              description
                "Configure P2MP recursive parameters";
              uses apply-advanced;
    
              leaf route {
                type empty;
                description
                  "Allow recursive route resolution to signal P2MP FEC";
              }
            }  // container recursive
    
            list root-address {
              key "name";
              description
                "Configure the root address of P2MP LSP";
              leaf name {
                type jt:ipaddr;
                description
                  "Root address of the P2MP LSP";
              }
    
              uses apply-advanced;
    
              list lsp-id {
                key "name";
                description
                  "Configure the generic LSP identifier";
                leaf name {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Generic LSP identifier value";
                }
    
                uses apply-advanced;
              }  // list lsp-id
    
              list group-address {
                key "name";
                description
                  "IPv4/Ipv6 group address for mLDP LSP";
                leaf name {
                  type jt:ipaddr;
                  description
                    "IPv4/Ipv6 group address";
                }
    
                uses apply-advanced;
    
                list source-address {
                  key "name";
                  description
                    "IPv4/Ipv6 source address";
                  leaf name {
                    type jt:ipaddr;
                    description
                      "IPv4/Ipv6 source address for mLDP LSP";
                  }
    
                  uses apply-advanced;
                }  // list source-address
              }  // list group-address
            }  // list root-address
    
            leaf no-rsvp-tunneling {
              type empty;
              description
                "Do not allow LDP P2MP to use RSVP-TE LSPs for tunneling";
            }
          }  // container p2mp
    
          container sr-mapping-client {
            presence "enable sr-mapping-client";
            description
              "Enable LDP to SR mapping-client functionality";
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "SR mapping-client policy";
            }
          }  // container sr-mapping-client
    
          leaf upstream-label-assignment {
            type empty;
            description
              "Allow Upstream Label Assignment capability";
          }
    
          list family {
            key "name";
            ordered-by user;
            description "Address family";
            leaf name {
              type enumeration {
                enum "inet" {
                  value 0;
                  description "IPv4 family";
                }
                enum "inet6" {
                  value 1;
                  description "IPv6 family";
                }
              }
            }
    
            uses apply-advanced;
          }  // list family
    
          leaf transport-preference {
            type enumeration {
              enum "ipv4" {
                value 0;
                description
                  "Use IPv4 for TCP connections";
              }
              enum "ipv6" {
                value 1;
                description
                  "Use IPv6 for TCP connections";
              }
            }
            description
              "TCP transport preference";
          }
    
          container dual-transport {
            presence "enable dual-transport";
            description
              "Use separate IPv4 and IPv6 TCP transport";
            uses apply-advanced;
    
            leaf inet-lsr-id {
              type jt:ipv4addr;
              description
                "LSR identifier for address family inet";
            }
    
            leaf inet6-lsr-id {
              type jt:ipv4addr;
              description
                "LSR identifier for address family inet6";
            }
          }  // container dual-transport
        }  // grouping juniper-protocols-ldp
    
        grouping juniper-protocols-mpls {
          description
            "Multiprotocol Label Switching options";
          uses apply-advanced;
    
          list lsp-external-controller {
            key "name";
            ordered-by user;
            description
              "External path computing entity";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of less than 64 characters";
              }
              description
                "Name of the external path computing entity";
            }
    
            uses apply-advanced;
    
            container label-switched-path-template {
              description
                "Template for externally provisioned LSP parameters";
              uses apply-advanced;
    
              choice dynamic-template {
                leaf template-name {
                  junos:must "(!("protocols mpls label-switched-path $$ p2mp"))";
                  junos:must-message "Referenced template cannot be a p2mp template";
                  junos:must "("protocols mpls label-switched-path $$ template")";
                  junos:must-message "Referenced point-to-point LSP template does not exist";
                  type string {
                    junos:posix-pattern "![*<>]";
                    junos:pattern-message "Template name should not contain '*' and angle brackets";
                    length "1 .. 32";
                  }
                  description
                    "Name of point-to-point LSP template";
                }
                leaf default-template {
                  type empty;
                  description
                    "Use default parameters";
                }
              }  // choice dynamic-template
            }  // container label-switched-path-template
    
            container label-switched-path-p2mp-template {
              description
                "Template for externally provisioned P2MP LSP parameters";
              uses apply-advanced;
    
              choice dynamic-template {
                leaf template-name {
                  junos:must "("protocols mpls label-switched-path $$ p2mp")";
                  junos:must-message "Referenced template should be a p2mp template";
                  junos:must "("protocols mpls label-switched-path $$ template")";
                  junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                  type string {
                    junos:posix-pattern "![*<>]";
                    junos:pattern-message "Template name should not contain '*' and angle brackets";
                    length "1 .. 32";
                  }
                  description
                    "Name of point-to-multipoint LSP template";
                }
                leaf default-template {
                  type empty;
                  description
                    "Use default parameters";
                }
              }  // choice dynamic-template
            }  // container label-switched-path-p2mp-template
    
            list pce-controlled-lsp {
              key "name";
              ordered-by user;
              description
                "Template for externally provisioned LSP using regular expression";
              leaf name {
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of less than 64 characters";
                }
                description
                  "Template regular expression";
              }
    
              uses apply-advanced;
    
              container label-switched-path-template {
                description
                  "Template for externally provisioned LSP parameters";
                uses apply-advanced;
    
                leaf template-name {
                  junos:must "(!("protocols mpls label-switched-path $$ p2mp"))";
                  junos:must-message "Referenced template cannot be a p2mp template";
                  junos:must "("protocols mpls label-switched-path $$ template")";
                  junos:must-message "Referenced point-to-point LSP template does not exist";
                  type string {
                    junos:posix-pattern "![*<>]";
                    junos:pattern-message "Template name should not contain '*' and angle brackets";
                    length "1 .. 64";
                  }
                  description
                    "Name of point-to-point LSP template";
                }
              }  // container label-switched-path-template
    
              container label-switched-path-p2mp-template {
                description
                  "Template for externally provisioned P2MP LSP parameters";
                uses apply-advanced;
    
                leaf template-name {
                  junos:must "("protocols mpls label-switched-path $$ p2mp")";
                  junos:must-message "Referenced template should be a p2mp template";
                  junos:must "("protocols mpls label-switched-path $$ template")";
                  junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                  type string {
                    junos:posix-pattern "![*<>]";
                    junos:pattern-message "Template name should not contain '*' and angle brackets";
                    length "1 .. 64";
                  }
                  description
                    "Name of point-to-multipoint LSP template";
                }
              }  // container label-switched-path-p2mp-template
            }  // list pce-controlled-lsp
          }  // list lsp-external-controller
    
          container path-mtu {
            presence "enable path-mtu";
            description "Path MTU configuration";
            uses apply-advanced;
    
            leaf allow-fragmentation {
              type empty;
              description
                "If needed, fragment IP before encapsulating in MPLS";
            }
    
            container rsvp {
              presence "enable rsvp";
              description
                "RSVP-specific path MTU options";
              uses apply-advanced;
    
              leaf mtu-signaling {
                type empty;
                description
                  "Enable RSVP path MTU signaling";
              }
            }  // container rsvp
          }  // container path-mtu
    
          container diffserv-te {
            description
              "Global diffserv-traffic-engineering options";
            uses apply-advanced;
    
            leaf bandwidth-model {
              type enumeration {
                enum "extended-mam" {
                  value 0;
                  description
                    "Maximum allocation model with support for E-LSPs";
                }
                enum "mam" {
                  value 1;
                  description
                    "Maximum allocation model";
                }
                enum "rdm" {
                  value 2;
                  description
                    "Russian dolls model";
                }
              }
              description
                "Bandwidth constraint model supported";
            }
    
            container te-class-matrix {
              description
                "Supported combinations of traffic-class and preemption";
              uses apply-advanced;
    
              container te0 {
                description
                  "Definition for traffic-engineering class te0";
                uses te-class-object;
              }  // container te0
    
              container te1 {
                description
                  "Definition for traffic-engineering class te1";
                uses te-class-object;
              }  // container te1
    
              container te2 {
                description
                  "Definition for traffic-engineering class te2";
                uses te-class-object;
              }  // container te2
    
              container te3 {
                description
                  "Definition for traffic-engineering class te3";
                uses te-class-object;
              }  // container te3
    
              container te4 {
                description
                  "Definition for traffic-engineering class te4";
                uses te-class-object;
              }  // container te4
    
              container te5 {
                description
                  "Definition for traffic-engineering class te5";
                uses te-class-object;
              }  // container te5
    
              container te6 {
                description
                  "Definition for traffic-engineering class te6";
                uses te-class-object;
              }  // container te6
    
              container te7 {
                description
                  "Definition for traffic-engineering class te7";
                uses te-class-object;
              }  // container te7
            }  // container te-class-matrix
          }  // container diffserv-te
    
          container auto-policing {
            description
              "Automatic policing of LSPs";
            uses apply-advanced;
    
            list class {
              key "name";
              ordered-by user;
              description "Forwarding class";
              leaf name {
                type enumeration {
                  enum "all" {
                    value 0;
                    description
                      "All forwarding classes";
                  }
                  enum "ct0" {
                    value 1;
                    description
                      "Forwarding class 0";
                  }
                  enum "ct1" {
                    value 2;
                    description
                      "Forwarding class 1";
                  }
                  enum "ct2" {
                    value 3;
                    description
                      "Forwarding class 2";
                  }
                  enum "ct3" {
                    value 4;
                    description
                      "Forwarding class 3";
                  }
                }
              }
    
              uses apply-advanced;
    
              choice policing-action {
                leaf drop {
                  type empty;
                  description
                    "Drop packets if bandwidth is exceeded";
                }
                leaf loss-priority-high {
                  type empty;
                  description
                    "Set loss priority to high if bandwidth is exceeded";
                }
                leaf loss-priority-low {
                  type empty;
                  description
                    "Set loss priority to low if bandwidth is exceeded";
                }
              }  // choice policing-action
            }  // list class
          }  // container auto-policing
    
          container statistics {
            description
              "Collect statistics for signaled label-switched paths";
            uses apply-advanced;
    
            container file {
              presence "enable file";
              description
                "Statistics file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            leaf interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 65535";
                }
              }
              description
                "Time to collect statistics (seconds)";
            }
    
            leaf auto-bandwidth {
              type empty;
              description
                "Enable auto bandwidth allocation";
            }
    
            leaf no-transit-statistics {
              type empty;
              description
                "Disable transit LSP statistics collection";
            }
    
            choice transit-polling-type {
              leaf no-transit-statistics-polling {
                type empty;
                status deprecated;
                description
                  "Disable polling and display of transit lsp statistics";
              }
              leaf transit-statistics-polling {
                junos:must "(!(" .. no-transit-statistics"))";
                junos:must-message "no-transit-statistics and transit-statistics-polling cannot coexist";
                type empty;
                description
                  "Enable polling and display of transit lsp statistics";
              }
            }  // choice transit-polling-type
    
            leaf no-bypass-statistics-polling {
              type empty;
              description
                "Disable polling and display of bypass lsp statistics";
            }
    
            leaf statistics-query-batch-size {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 25";
                }
              }
              description
                "Number of LSPs for which statistics will be queried together";
            }
          }  // container statistics
    
          container p2mp-lsp {
            description
              "P2MP LSP control configuration";
            uses apply-advanced;
    
            leaf single-abr {
              type empty;
              description
                "Try to use same exit node for all inter-domain sub LSPs";
            }
    
            leaf no-re-merge {
              type empty;
              description
                "Avoid LSP CSPF creating remerge";
            }
          }  // container p2mp-lsp
    
          container log-updown {
            description
              "Logging actions for LSP up/down events";
            uses apply-advanced;
    
            choice syslog-choice {
              leaf syslog {
                type empty;
                description
                  "Send syslog messages";
              }
              leaf no-syslog {
                type empty;
                description
                  "Don't send syslog messages";
              }
            }  // choice syslog-choice
    
            choice trap-choice {
              leaf trap {
                type empty;
                description "Send SNMP traps";
              }
              container no-trap {
                presence "enable no-trap";
                description
                  "Don't send SNMP traps";
                uses apply-advanced;
    
                leaf mpls-lsp-traps {
                  type empty;
                  description
                    "Dont send mpls lsp up/down traps";
                }
    
                leaf rfc3812-traps {
                  type empty;
                  description
                    "Dont send rfc3812 traps";
                }
              }  // container no-trap
            }  // choice trap-choice
    
            leaf trap-path-down {
              type empty;
              description
                "Send SNMP traps when a path goes down";
            }
    
            leaf trap-path-up {
              type empty;
              description
                "Send SNMP traps when a path goes up";
            }
          }  // container log-updown
    
          container optimize-adaptive-teardown {
            description
              "Post make before break adaptive teardown";
            uses apply-advanced;
    
            leaf p2p {
              type empty;
              description
                "Turn on post make before break adaptive teardown for p2p";
            }
    
            leaf timeout {
              junos:must "(".. p2p")";
              junos:must-message "adaptive-teardown must include 'p2p' attribute";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 65535";
                }
              }
              units "seconds";
              description
                "Timeout for adaptive teardown to clean up LSP";
            }
    
            container delay {
              junos:must "(".. p2p")";
              junos:must-message "adaptive-teardown must include 'p2p' attribute";
              description
                "Delay tearing down old optimized path after adaptive-teardown kicks in";
              uses apply-advanced;
    
              leaf delay-value {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "3 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Delay tearing down old optimized path after adaptive-teardown kicks in";
              }
            }  // container delay
          }  // container optimize-adaptive-teardown
    
          container traffic-engineering {
            presence
              "enable traffic-engineering";
            description
              "Traffic-engineering control";
            uses apply-advanced;
    
            choice protocols {
              leaf bgp {
                type empty;
                description
                  "BGP destinations only";
              }
              leaf bgp-igp {
                type empty;
                description
                  "BGP and IGP destinations";
              }
              leaf bgp-igp-both-ribs {
                type empty;
                description
                  "BGP and IGP destinations with routes in both routing tables";
              }
              leaf mpls-forwarding {
                type empty;
                description
                  "Use MPLS routes for forwarding, not routing";
              }
            }  // choice protocols
    
            container database {
              description
                "Traffic engineering database";
              uses apply-advanced;
    
              container import {
                description
                  "Configure TED import parameters";
                uses apply-advanced;
    
                container l3-unicast-topology {
                  presence
                    "enable l3-unicast-topology";
                  description
                    "Download L3-Unicast topology into RIB";
                  uses apply-advanced;
    
                  leaf bgp-link-state {
                    type empty;
                    description
                      "Export L3-Unicast topology, instead of TE topology, into BGP-LS";
                  }
                }  // container l3-unicast-topology
    
                leaf-list policy {
                  type jt:policy-algebra;
                  ordered-by user;
                  description
                    "Configure import policy";
                }
    
                leaf identifier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint64 {
                      range
                        "2 .. 18446744073709551615";
                    }
                  }
                  description
                    "BGP-TE identifier";
                }
    
                leaf bgp-ls-identifier {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "BGP-TE domain identifier";
                }
    
                leaf ipv6 {
                  type empty;
                  description
                    "Import ipv6 addresses";
                }
              }  // container import
    
              container export {
                description
                  "Configure TED export related parameters";
                uses apply-advanced;
    
                leaf-list policy {
                  type jt:policy-algebra;
                  ordered-by user;
                  description "Export policy";
                }
    
                container credibility {
                  description
                    "TED credibility value for entries from BGP-TE";
                  uses apply-advanced;
    
                  leaf unknown {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from unknown entities";
                  }
    
                  leaf direct {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from directly connected links";
                  }
    
                  leaf static {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from static configuration";
                  }
    
                  leaf ospf {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from ospf";
                  }
    
                  leaf isis-level-1 {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from ISIS Level 1";
                  }
    
                  leaf isis-level-2 {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from ISIS Level 2";
                  }
    
                  leaf bgp {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from BGP";
                  }
                }  // container credibility
    
                leaf l3-unicast-topology {
                  type empty;
                  description
                    "Download RIB entries into L3-Unicast topology";
                }
              }  // container export
            }  // container database
          }  // container traffic-engineering
    
          list admin-groups {
            key "name";
            ordered-by user;
            description "Administrative groups";
            leaf name {
              type string;
              description "Group name";
            }
    
            uses apply-advanced;
    
            leaf group-value {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 31";
                }
              }
              description "Group bit position";
            }
          }  // list admin-groups
    
          leaf advertisement-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 65535";
              }
            }
            units "seconds";
            default "5";
            description
              "Time that an 'LSP down' advertisement will be delayed";
          }
    
          leaf rsvp-error-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 240";
              }
            }
            units "seconds";
            default "25";
            description
              "Time that RSVP PathErr events will be remembered";
          }
    
          leaf optimize-aggressive {
            type empty;
            description
              "Run aggressive optimization algorithm based on IGP metric only";
          }
    
          leaf smart-optimize-timer {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "0 .. 65535";
              }
            }
            units "seconds";
            description
              "Path optimization interval after a link traversed by the path goes down";
          }
    
          leaf optimize-switchover-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "1 .. 900";
              }
            }
            units "seconds";
            description
              "Delay before switching LSP to newly optimized path";
          }
    
          leaf no-propagate-ttl {
            type empty;
            description
              "Disable TTL propagation from IP to MPLS (on push) and MPLS to IP (on pop)";
          }
    
          leaf explicit-null {
            type empty;
            description
              "Advertise the EXPLICIT_NULL label when the router is the egress";
          }
    
          leaf icmp-tunneling {
            type empty;
            description
              "Allow MPLS LSPs to be used for tunneling ICMP error packets";
          }
    
          leaf revert-timer {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "0 .. 65535";
              }
            }
            units "seconds";
            description
              "Hold-down window before reverting back to primary path, 0 means disable";
          }
    
          leaf optimize-hold-dead-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "0 .. 65535";
              }
            }
            units "seconds";
            description
              "Delay before tearing down the old optimized path";
          }
    
          leaf cspf-backoff-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "0 .. 65535";
              }
            }
            units "seconds";
            description
              "Delay before CSPF, when there is PathErr on backup path";
          }
    
          leaf expand-loose-hop {
            type empty;
            description
              "Perform CSPF path computation to expand loose hops";
          }
    
          leaf mib-mpls-show-p2mp {
            type empty;
            description
              "Show p2mp tunnels entries in mpls mib walk";
          }
    
          container bandwidth {
            description
              "Bandwidth to reserve (bps)";
            uses bandwidth-type;
          }  // container bandwidth
    
          container admin-group {
            description
              "Administrative group policy";
            uses admin_group_include_exclude;
          }  // container admin-group
    
          container admin-group-extended {
            description
              "Extended administrative group policy";
            uses admin_group_include_exclude;
          }  // container admin-group-extended
    
          container priority {
            presence "enable priority";
            description "Preemption priorities";
          }  // container priority
    
          leaf setup-priority {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 7";
              }
            }
            description "Set-up priority";
          }
    
          leaf reservation-priority {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 7";
              }
            }
            description "Reservation priority";
          }
    
          container oam {
            description "Periodic OAM";
            uses periodic_oam;
          }  // container oam
    
          leaf class-of-service {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "0 .. 7";
              }
            }
            description "Class-of-service value";
          }
    
          leaf no-decrement-ttl {
            type empty;
            description
              "Do not decrement the TTL within an LSP";
          }
    
          leaf hop-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "2 .. 255";
              }
            }
            description
              "Maximum allowed router hops";
          }
    
          leaf no-cspf {
            type empty;
            description
              "Disable automatic path computation";
          }
    
          leaf admin-down {
            type empty;
            description
              "Set GMPLS LSP to administrative down state";
          }
    
          leaf optimize-timer {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "0 .. 65535";
              }
            }
            units "seconds";
            description
              "Periodical path reoptimizations";
          }
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Preference value";
          }
    
          choice record-choice {
            leaf record {
              type empty;
              description
                "Record transit routers";
            }
            leaf no-record {
              type empty;
              description
                "Don't record transit routers";
            }
          }  // choice record-choice
    
          leaf standby {
            type empty;
            description
              "Keep backup paths in continuous standby";
          }
    
          leaf exclude-srlg {
            type empty;
            description
              "Exclude SRLG links for secondary path";
          }
    
          leaf ultimate-hop-popping {
            type empty;
            description
              "Request ultimate hop popping from egress";
          }
    
          leaf sync-active-path-bandwidth {
            type empty;
            description
              "Signal standby path with bandwidth obtained from active path";
          }
    
          leaf cross-credibility-cspf {
            type empty;
            description
              "Compute paths across multi-protocol links and nodes";
          }
    
          list label-switched-path {
            key "name";
            ordered-by user;
            description "Label-switched path";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description "Name of path";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable MPLS label-switched path";
              }
            }  // choice enable-disable
    
            container traceoptions {
              description
                "Trace options for MPLS label-switched path";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "cspf" {
                      value 0;
                      description
                        "Trace CSPF computation";
                    }
                    enum "cspf-node" {
                      value 1;
                      description
                        "Trace nodes visited during CSPF";
                    }
                    enum "cspf-link" {
                      value 2;
                      description
                        "Trace links visited during CSPF";
                    }
                    enum "cspf-abstract" {
                      value 3;
                      description
                        "Trace abstract hop based CSPF details";
                    }
                    enum "state" {
                      value 4;
                      description
                        "Trace state transitions";
                    }
                    enum "all" {
                      value 5;
                      description
                        "Trace everything";
                    }
                  }
                }
              }  // list flag
            }  // container traceoptions
    
            leaf no-install-to-address {
              type empty;
              description
                "Don't install host route 'to' address into routing tables";
            }
    
            leaf backup {
              type empty;
              description
                "Use LSP for IGP backup";
            }
    
            leaf from {
              type jt:ipv4addr;
              description
                "Address of ingress router";
            }
    
            container pop-and-forward {
              junos:must "(!(".. lsp-external-controller"))";
              junos:must-message "lsp-external-controller unsupported for pop-and-forward LSP";
              junos:must "(!(".. lsp-attributes"))";
              junos:must-message "lsp-attributes unsupported for pop-and-forward LSP";
              junos:must "(!(".. single-sided-associated-bidirectional"))";
              junos:must-message "single-sided-associated-bidirectional unsupported for pop-and-forward LSP";
              junos:must "(!(".. associate-lsp"))";
              junos:must-message "associate-lsp unsupported for pop-and-forward LSP";
              junos:must "(!(".. corouted-bidirectional-passive"))";
              junos:must-message "corouted-bidirectional-passive unsupported for pop-and-forward LSP";
              junos:must "(!(".. corouted-bidirectional"))";
              junos:must-message "corouted-bidirectional unsupported for pop-and-forward LSP";
              junos:must "(!(".. backup"))";
              junos:must-message "backup unsupported for pop-and-forward LSP";
              junos:must "(!(".. no-cspf"))";
              junos:must-message "no-cspf unsupported for pop-and-forward LSP";
              junos:must "(!((".. ultimate-hop-popping" || ".. .. ultimate-hop-popping")))";
              junos:must-message "ultimate hop popping unsupported for pop-and-forward LSP";
              junos:must "(!(".. p2mp"))";
              junos:must-message "p2mp unsupported for pop-and-forward LSP";
              junos:must "(!(".. node-link-protection"))";
              junos:must-message "link/node protection unsupported for pop-and-forward LSP";
              junos:must "(!(".. fast-reroute"))";
              junos:must-message "fast-reroute unsupported for pop-and-forward LSP";
              presence "enable pop-and-forward";
              description
                "Enable LSP as pop-and-forward with auto-delegation";
            }  // container pop-and-forward
    
            choice label-switched-path-or-template {
              leaf to {
                type jt:ipv4addr;
                description
                  "Address of egress router";
              }
              leaf template {
                junos:must "(!(".. associate-lsp"))";
                junos:must-message "Template cannot have associate-lsp";
                junos:must "(!(".. corouted-bidirectional-passive"))";
                junos:must-message "Template cannot be passive bidirectional";
                junos:must "(!(".. corouted-bidirectional"))";
                junos:must-message "Template cannot be active bidirectional";
                junos:must "(!(".. lsp-external-controller"))";
                junos:must-message "Can't configure external controller in template";
                junos:must "(!(".. disable"))";
                junos:must-message "Not applicable for template";
                junos:must "(!((".. primary" || ".. secondary")))";
                junos:must-message "Template cannot include 'path' statement";
                type empty;
                description
                  "Template for dynamic lsp paramaters";
              }
            }  // choice label-switched-path-or-template
    
            leaf corouted-bidirectional {
              junos:must "(!(".. p2mp"))";
              junos:must-message "p2mp unsupported for bidirectional LSP";
              junos:must "(!(".. auto-bandwidth"))";
              junos:must-message "auto-bandwidth unsupported for bidirectional LSP";
              junos:must "(!((".. link-protection" || ".. node-link-protection")))";
              junos:must-message "link/node protection unsupported for bidirectional LSP";
              junos:must "(!(".. fast-reroute"))";
              junos:must-message "fast-reroute unsupported for bidirectional LSP";
              junos:must "(!(".. corouted-bidirectional-passive"))";
              junos:must-message "Passive and active bidirectional attributes cannot coexist";
              type empty;
              description
                "Setup the LSP as a corouted bidirectional LSP";
            }
    
            leaf corouted-bidirectional-passive {
              junos:must "(!(".. p2mp"))";
              junos:must-message "p2mp unsupported for bidirectional LSP";
              junos:must "(!(".. auto-bandwidth"))";
              junos:must-message "auto-bandwidth unsupported for bidirectional LSP";
              junos:must "(!((".. link-protection" || ".. node-link-protection")))";
              junos:must-message "link/node protection unsupported for bidirectional LSP";
              junos:must "(!(".. fast-reroute"))";
              junos:must-message "fast-reroute unsupported for bidirectional LSP";
              junos:must "(!((".. standby" || ".. .. standby")))";
              junos:must-message "standby unsupported for passive bidirectional LSP";
              junos:must "(!(".. soft-preemption"))";
              junos:must-message "soft-preemption unsupported for passive bidirectional LSP";
              junos:must "(!((".. oam bfd-liveness-detection" || ".. .. oam bfd-liveness-detection")))";
              junos:must-message "oam bfd-liveness-detection unsupported for passive bidirectional LSP";
              junos:must "(!((".. no-decrement-ttl" || ".. .. no-decrement-ttl")))";
              junos:must-message "no-decrement-ttl unsupported for passive bidirectional LSP";
              junos:must "(!((".. exclude-srlg" || ".. .. exclude-srlg")))";
              junos:must-message "exclude-srlg unsupported for passive bidirectional LSP";
              junos:must "(!((".. bandwidth" || ".. .. bandwidth")))";
              junos:must-message "bandwidth unsupported for passive bidirectional LSP";
              junos:must "(!((".. admin-group-extended" || ".. .. admin-group-extended")))";
              junos:must-message "admin-group-extended unsupported for passive bidirectional LSP";
              junos:must "(!((".. admin-group" || ".. .. admin-group")))";
              junos:must-message "admin-group unsupported for passive bidirectional LSP";
              junos:must "(!(".. adaptive"))";
              junos:must-message "adaptive unsupported for passive bidirectional LSP";
              junos:must "(!(".. lsp-attributes"))";
              junos:must-message "Passive bidirectional LSP cannot include 'lsp-attributes' statement";
              junos:must "(!((".. primary" || ".. secondary")))";
              junos:must-message "Passive bidirectional LSP cannot include 'path' statement";
              type empty;
              description
                "Associate LSP with incoming corouted bidirectional LSP";
            }
    
            leaf metric {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16777215";
                }
              }
              description "Metric value";
            }
    
            leaf ldp-tunneling {
              type empty;
              description
                "Allow LDP to use this LSP for tunneling";
            }
    
            leaf soft-preemption {
              junos:must "(!(".. fast-reroute"))";
              junos:must-message "soft-preemption is unsupported when fast-reroute is desired";
              type empty;
              description
                "Attempt make-before-break service while preempting this LSP";
            }
    
            list install {
              key "name";
              ordered-by user;
              description "Install prefix";
              leaf name {
                type jt:ipprefix;
                description "Destination prefix";
              }
    
              leaf active {
                type empty;
                description
                  "Install prefix into forwarding table";
              }
            }  // list install
    
            leaf retry-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 600";
                }
              }
              units "seconds";
              description
                "Time before retrying the primary path";
            }
    
            leaf retry-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 10000";
                }
              }
              description
                "Maximum number of times to retry primary path";
            }
    
            container lsp-attributes {
              description
                "Attributes for generalized LSP";
              uses apply-advanced;
    
              leaf signal-bandwidth {
                junos:must "(!((".. switching-type l2sc" || (".. switching-type psc-1" || ".. switching-type ethernet-vlan"))))";
                junos:must-message "signal-bandwidth invalid for VLAN LSP and Packet LSP";
                type enumeration {
                  enum "ds1" {
                    value 0;
                    description "1.544 Mbps";
                  }
                  enum "vt1-5" {
                    value 1;
                    description "1.728 Mbps";
                  }
                  enum "e1" {
                    value 2;
                    description "2.048 Mbps";
                  }
                  enum "vt2" {
                    value 3;
                    description "2.304 Mbps";
                  }
                  enum "ethernet" {
                    value 4;
                    description "10 Mbps";
                  }
                  enum "e3" {
                    value 5;
                    description "34.368 Mbps";
                  }
                  enum "ds3" {
                    value 6;
                    description "44.736 Mbps";
                  }
                  enum "sts-1" {
                    value 7;
                    description "51.84 Mbps";
                  }
                  enum "fastether" {
                    value 8;
                    description "100.00 Mbps";
                  }
                  enum "stm-1" {
                    value 9;
                    description "155.52 Mbps";
                  }
                  enum "stm-4" {
                    value 10;
                    description "622.08 Mbps";
                  }
                  enum "gigether" {
                    value 11;
                    description "1000.00 Mbps";
                  }
                  enum "stm-16" {
                    value 12;
                    description "2488.32 Mbps";
                  }
                  enum "stm-64" {
                    value 13;
                    description "9953.28 Mbps";
                  }
                  enum "10gigether" {
                    value 14;
                    description "10000.00 Mbps";
                  }
                  enum "stm-256" {
                    value 15;
                    description "39813.12 Mbps";
                  }
                  enum "100gige" {
                    value 16;
                    description "100000.00 Mbps";
                  }
                }
                description
                  "Signal bandwidth for the LSP";
              }
    
              leaf switching-type {
                type enumeration {
                  enum "psc-1" {
                    value 0;
                    description
                      "Packet switching";
                  }
                  enum "lambda" {
                    value 1;
                    description
                      "Lambda switching";
                  }
                  enum "fiber" {
                    value 2;
                    description
                      "Fiber switching";
                  }
                  enum "tdm" {
                    value 3;
                    description "TDM switching";
                  }
                  enum "ethernet-vlan" {
                    junos:must "((!(".. encoding-type") || ".. encoding-type ethernet"))";
                    junos:must-message "Only ethernet encoding supported for VLAN LSP";
                    value 4;
                    description
                      "Ethernet VLAN switching";
                  }
                }
                description
                  "LSP switching type desired";
              }
    
              leaf encoding-type {
                type enumeration {
                  enum "packet" {
                    value 0;
                    description
                      "Packet encoding";
                  }
                  enum "ethernet" {
                    value 1;
                    description
                      "Ethernet encoding";
                  }
                  enum "pdh" {
                    value 2;
                    description "PDH encoding";
                  }
                  enum "sonet-sdh" {
                    value 3;
                    description
                      "SONET-SDH encoding";
                  }
                }
                description
                  "LSP encoding type desired";
              }
    
              leaf gpid {
                type enumeration {
                  enum "ipv4" {
                    value 0;
                  }
                  enum "ethernet" {
                    value 1;
                  }
                  enum "ppp" {
                    value 2;
                  }
                  enum "hdlc" {
                    value 3;
                  }
                  enum
                    "pos-no-scrambling-crc-16" {
                    value 4;
                  }
                  enum
                    "pos-no-scrambling-crc-32" {
                    value 5;
                  }
                  enum "pos-scrambling-crc-16" {
                    value 6;
                  }
                  enum "pos-scrambling-crc-32" {
                    value 7;
                  }
                }
                description "Generalized PID";
              }
    
              container upstream-label {
                description
                  "Upstream Label for the bidirectional label-switched path";
                uses apply-advanced;
    
                leaf vlan-id {
                  junos:must "(".. .. switching-type ethernet-vlan")";
                  junos:must-message "VLAN label is valid only for VLAN LSP";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4094";
                    }
                  }
                  description
                    "VLAN ID label for the label-switched path";
                }
              }  // container upstream-label
            }  // container lsp-attributes
    
            leaf revert-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "Hold-down window before reverting back to primary path, 0 means disable";
            }
    
            leaf optimize-hold-dead-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "Delay before tearing down the old optimized path";
            }
    
            leaf cspf-backoff-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "Delay before CSPF, when there is PathErr on backup path";
            }
    
            container bandwidth {
              description
                "Bandwidth to reserve (bps)";
              uses bandwidth-type;
            }  // container bandwidth
    
            container admin-group {
              description
                "Administrative group policy";
              uses admin_group_include_exclude;
            }  // container admin-group
    
            container admin-group-extended {
              description
                "Extended administrative group policy";
              uses admin_group_include_exclude;
            }  // container admin-group-extended
    
            container priority {
              presence "enable priority";
              description
                "Preemption priorities";
            }  // container priority
    
            leaf setup-priority {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 7";
                }
              }
              description "Set-up priority";
            }
    
            leaf reservation-priority {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 7";
                }
              }
              description "Reservation priority";
            }
    
            container oam {
              description "Periodic OAM";
              uses periodic_oam;
            }  // container oam
    
            leaf class-of-service {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "0 .. 7";
                }
              }
              description
                "Class-of-service value";
            }
    
            leaf no-decrement-ttl {
              type empty;
              description
                "Do not decrement the TTL within an LSP";
            }
    
            leaf hop-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "2 .. 255";
                }
              }
              description
                "Maximum allowed router hops";
            }
    
            leaf no-cspf {
              type empty;
              description
                "Disable automatic path computation";
            }
    
            leaf admin-down {
              type empty;
              description
                "Set GMPLS LSP to administrative down state";
            }
    
            leaf optimize-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "Periodical path reoptimizations";
            }
    
            leaf preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Preference value";
            }
    
            choice record-choice {
              leaf record {
                type empty;
                description
                  "Record transit routers";
              }
              leaf no-record {
                type empty;
                description
                  "Don't record transit routers";
              }
            }  // choice record-choice
    
            leaf standby {
              type empty;
              description
                "Keep backup paths in continuous standby";
            }
    
            leaf exclude-srlg {
              type empty;
              description
                "Exclude SRLG links for secondary path";
            }
    
            leaf ultimate-hop-popping {
              type empty;
              description
                "Request ultimate hop popping from egress";
            }
    
            leaf sync-active-path-bandwidth {
              type empty;
              description
                "Signal standby path with bandwidth obtained from active path";
            }
    
            leaf cross-credibility-cspf {
              type empty;
              description
                "Compute paths across multi-protocol links and nodes";
            }
    
            leaf entropy-label {
              type empty;
              description "Enable entropy label";
            }
    
            leaf self-ping-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 65535";
                }
              }
              units "seconds";
              description
                "Duration over which to run self-ping (65535 = until success). Default = 1800s";
            }
    
            leaf no-self-ping {
              type empty;
              description
                "Do not run self-ping for this LSP";
            }
    
            choice cspf-attribute {
              leaf random {
                type empty;
                description
                  "Randomly select among equal-cost paths";
              }
              leaf least-fill {
                type empty;
                description
                  "Select the least filled among equal-cost paths";
              }
              leaf most-fill {
                type empty;
                description
                  "Select the most filled among equal-cost paths";
              }
            }  // choice cspf-attribute
    
            leaf description {
              type string {
                length "1 .. 80";
              }
              description
                "Text description of label-switched path";
            }
    
            choice lp-type {
              leaf link-protection {
                type empty;
                description
                  "Protect LSP from link faults only";
              }
              leaf node-link-protection {
                type empty;
                description
                  "Protect LSP from both link and node faults";
              }
            }  // choice lp-type
    
            leaf intra-domain {
              type empty;
              status deprecated;
              description "Intra-domain LSP";
            }
    
            leaf inter-domain {
              type empty;
              description "Inter-domain LSP";
            }
    
            leaf adaptive {
              type empty;
              description
                "Have the LSP smoothly cut over to new routes";
            }
    
            container in-place-lsp-bandwidth-update {
              junos:must "(!(".. fast-reroute"))";
              junos:must-message "In-place update unsupported for LSPs requesting detour protection";
              junos:must "(!((".. lsp-external-controller" || ".. .. lsp-external-controller")))";
              junos:must-message "In-place update unsupported for externally controlled LSPs";
              junos:must "(!(".. single-sided-associated-bidirectional"))";
              junos:must-message "In-place update unsupported for single-sided-associated-bidirectional LSPs";
              junos:must "(!(".. corouted-bidirectional-passive"))";
              junos:must-message "In-place update unsupported for corouted-bidirectional-passive LSPs";
              junos:must "(!(".. corouted-bidirectional"))";
              junos:must-message "In-place update unsupported for corouted-bidirectional LSPs";
              junos:must "(!((".. no-cspf" || ".. .. no-cspf")))";
              junos:must-message "In-place update unsupported for no-cspf LSPs";
              junos:must "(!(".. p2mp"))";
              junos:must-message "In-place update unsupported for p2mp sub-LSPs";
              presence
                "enable in-place-lsp-bandwidth-update";
              description
                "Update LSP in-place re-using the same LSP identifier";
            }  // container in-place-lsp-bandwidth-update
    
            container fast-reroute {
              presence "enable fast-reroute";
              description "Fast reroute";
              uses apply-advanced;
    
              leaf hop-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Maximum allowed router hops";
              }
    
              choice bw-attribute {
                leaf bandwidth {
                  type string;
                  description
                    "Bandwidth to reserve (bps)";
                }
                leaf bandwidth-percent {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type int32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of main path bandwidth to reserve";
                }
              }  // choice bw-attribute
    
              choice include_any_or_no_include_any {
                leaf no-include-any {
                  type empty;
                  description
                    "Disable include-any checking";
                }
                leaf-list include-any {
                  type string;
                  ordered-by user;
                  description
                    "Groups, one or more of which must be present";
                }
              }  // choice include_any_or_no_include_any
    
              choice include_all_or_no_include_all {
                leaf no-include-all {
                  type empty;
                  description
                    "Disable include-all checking";
                }
                leaf-list include-all {
                  type string;
                  ordered-by user;
                  description
                    "Groups, all of which must be present";
                }
              }  // choice include_all_or_no_include_all
    
              choice exclude_or_no_exclude {
                leaf no-exclude {
                  type empty;
                  description
                    "Disable exclude checking";
                }
                leaf-list exclude {
                  type string;
                  ordered-by user;
                  description
                    "Groups, all of which must be absent";
                }
              }  // choice exclude_or_no_exclude
            }  // container fast-reroute
    
            container p2mp {
              junos:must "(!(".. associate-backup-pe-groups"))";
              junos:must-message "backup-pe-group cannot be associated with P2MP LSP";
              junos:must "(!(".. egress-protection"))";
              junos:must-message "egress-protection unsupported for P2MP LSP branch";
              junos:must "(!(any ".. primary <*> adaptive"))";
              junos:must-message "adaptive unsupported for P2MP LSP branch path";
              junos:must "(!(".. adaptive"))";
              junos:must-message "adaptive unsupported for P2MP LSP branch";
              junos:must "(!(".. install"))";
              junos:must-message "install prefixes invalid for P2MP LSP branch";
              junos:must "(!(".. ldp-tunneling"))";
              junos:must-message "ldp-tunneling unsupported for P2MP LSP branch";
              junos:must "(!(".. backup"))";
              junos:must-message "backup invalid for P2MP LSP branch";
              junos:must "(!(".. no-install-to-address"))";
              junos:must-message "no-install-to-address invalid for P2MP LSP branch";
              junos:must "(!(".. node-link-protection"))";
              junos:must-message "node protection unsupported for P2MP LSP branch";
              junos:must "(!(".. fast-reroute"))";
              junos:must-message "fast-reroute unsupported for P2MP LSP branch";
              junos:must "(!(".. secondary"))";
              junos:must-message "secondary paths unsupported for P2MP LSP branch";
              junos:must "(!(".. ultimate-hop-popping"))";
              junos:must-message "For point-to-multipoint LSP, ultimate hop popping cannot be configured";
              junos:must "(!(".. lsp-external-controller"))";
              junos:must-message "Can't configure lsp-external-controller knob in p2mp LSPs";
              junos:must "((!(".. .. .. .. .. logical-systems") || !(".. .. ipv6-tunneling")))";
              junos:must-message "In logical systems, IPv6 tunneling cannot be configured with P2MP LSPs";
              junos:must "((any ".. p2mp <*>" || ".. template"))";
              junos:must-message "For S2L point-to-multipoint LSP, parent point-to-multipoint LSP name must be configured";
              presence "enable p2mp";
              description
                "Point-to-multipoint label-switched path";
              leaf path_name {
                junos:must "(!(".. .. .. label-switched-path $$"))";
                junos:must-message "The P2MP name is the same as an existing LSP name";
                junos:must "(!(".. .. template"))";
                junos:must-message "Name not applicable for point-to-multipoint template";
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of less than 64 characters";
                }
                description
                  "Name of point-to-multipoint LSP";
              }
            }  // container p2mp
    
            container auto-bandwidth {
              junos:must "(!(".. p2mp"))";
              junos:must-message "Cannot do auto-bandwidth for P2MP LSP branch";
              junos:must "((!(".. lsp-attributes") || (".. lsp-attributes switching-type psc-1" && (!(".. lsp-attributes encoding-type") || ".. lsp-attributes encoding-type packet"))))";
              junos:must-message "Cannot do auto-bandwidth for non-packet LSP";
              presence "enable auto-bandwidth";
              description
                "Do auto bandwidth allocation for this LSP";
              uses apply-advanced;
    
              leaf adjust-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "300 .. 315360000";
                  }
                }
                units "seconds";
                default "86400";
                description
                  "Time to adjust LSP bandwidth";
              }
    
              leaf adjust-threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 50";
                  }
                }
                units "percent";
                default "0";
                description
                  "Percentage change in average LSP utilization to trigger auto-adjustment";
              }
    
              leaf adjust-threshold-absolute {
                type string;
                units "bps";
                default "0";
                description
                  "Change in average LSP utilization to trigger auto-adjustment";
              }
    
              leaf adjust-threshold-activate-bandwidth {
                type string;
                units "bps";
                description
                  "Adjusts signaled bw if greater than this value";
              }
    
              leaf minimum-bandwidth {
                type string;
                units "bps";
                description
                  "Minimum LSP bandwidth";
              }
    
              leaf maximum-bandwidth {
                type string;
                units "bps";
                description
                  "Maximum LSP bandwidth";
              }
    
              leaf minimum-bandwidth-adjust-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "300 .. 31536000";
                  }
                }
                units "seconds";
                description
                  "Duration for which minimum bandwidth will be frozen";
              }
    
              leaf minimum-bandwidth-adjust-threshold-change {
                junos:must "(".. minimum-bandwidth-adjust-interval")";
                junos:must-message "minimum-bandwidth-adjust-interval must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 100";
                  }
                }
                units "percent";
                description
                  "Change in max average bandwidth to freeze min bandwidth";
              }
    
              leaf minimum-bandwidth-adjust-threshold-value {
                junos:must "(!(".. minimum-bandwidth-adjust-threshold-change"))";
                junos:must-message "minimum-bandwidth-adjust-threshold-change cannot be configured with minimum-bandwidth-adjust-threshold-value";
                junos:must "(".. minimum-bandwidth-adjust-interval")";
                junos:must-message "minimum-bandwidth-adjust-interval must be configured";
                type string;
                units "bps";
                status deprecated;
                description
                  "Freeze min bandwidth if max average bandwidth falls below this bw";
              }
    
              leaf monitor-bandwidth {
                type empty;
                description
                  "Monitor LSP bandwidth without adjustments";
              }
    
              leaf adjust-threshold-overflow-limit {
                junos:must "(((".. adjust-threshold" && ".. maximum-bandwidth") && (!(".. adjust-threshold $$={0}") && !(".. maximum-bandwidth $$={0}"))))";
                junos:must-message "Non-zero adjust-threshold and maximum-bandwidth MUST be configured";
                junos:must "(!(".. monitor-bandwidth"))";
                junos:must-message "adjust-threshold-overflow-limit cannot be used with monitor-bandwidth";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Number of consecutive overflow samples to trigger auto-adjustment";
              }
    
              leaf adjust-threshold-underflow-limit {
                junos:must "((".. adjust-threshold" && !(".. adjust-threshold 0")))";
                junos:must-message "Non-zero adjust-threshold must be configured";
                junos:must "(!(".. monitor-bandwidth"))";
                junos:must-message "adjust-threshold-underflow-limit cannot be used with monitor-bandwidth";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Number of consecutive underflow samples to trigger auto-adjustment";
              }
    
              leaf resignal-minimum-bandwidth {
                type empty;
                description
                  "Resignal the LSP using minimum-bandwidth";
              }
    
              leaf sync-active-path-bandwidth {
                type empty;
                description
                  "Signal standby path with bandwidth obtained from active path";
              }
            }  // container auto-bandwidth
    
            container optimize-on-change {
              description
                "Specify additional re-optimization triggers for this LSP";
              uses apply-advanced;
    
              leaf link-congestion {
                type empty;
                description
                  "Optimize when a link becomes congested";
              }
            }  // container optimize-on-change
    
            container deselect-on-bandwidth-failure {
              presence
                "enable deselect-on-bandwidth-failure";
              description
                "Deselect active path if it cannot meet the bandwidth constraint";
              uses apply-advanced;
    
              leaf tear-lsp {
                type empty;
                description
                  "Bring down active path when all paths fail to reserve required bandwidth";
              }
            }  // container deselect-on-bandwidth-failure
    
            container track-igp-metric {
              description
                "Track IGP metric for LSP install prefixes";
              uses apply-advanced;
    
              leaf install-v4-prefixes {
                type empty;
                description
                  "Track IGP metric for IPV4 prefixes";
              }
    
              leaf install-v6-prefixes {
                type empty;
                description
                  "Track IGP metric for IPV6 prefixes";
              }
            }  // container track-igp-metric
    
            container associate-lsp {
              junos:must "((".. oam mpls-tp-mode" || ".. .. oam mpls-tp-mode"))";
              junos:must-message "mpls-tp-mode must be configured for associate-lsp";
              description
                "Associate the LSP for OAM";
              uses apply-advanced;
    
              leaf lsp-name {
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of 64 characters or less";
                }
                description
                  "Name of assocation LSP";
              }
    
              leaf from {
                type jt:ipv4addr;
                description
                  "Address of ingress router of associated LSP";
              }
            }  // container associate-lsp
    
            list primary {
              key "name";
              ordered-by user;
              description "Preferred path";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description "Name of path";
              }
    
              uses apply-advanced;
    
              container bandwidth {
                description
                  "Bandwidth to reserve (bps)";
                uses bandwidth-type;
              }  // container bandwidth
    
              container admin-group {
                description
                  "Administrative group policy";
                uses admin_group_include_exclude;
              }  // container admin-group
    
              container admin-group-extended {
                description
                  "Extended administrative group policy";
                uses admin_group_include_exclude;
              }  // container admin-group-extended
    
              container priority {
                presence "enable priority";
                description
                  "Preemption priorities";
              }  // container priority
    
              leaf setup-priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description "Set-up priority";
              }
    
              leaf reservation-priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Reservation priority";
              }
    
              container oam {
                description "Periodic OAM";
                uses periodic_oam;
              }  // container oam
    
              leaf class-of-service {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Class-of-service value";
              }
    
              leaf no-decrement-ttl {
                type empty;
                description
                  "Do not decrement the TTL within an LSP";
              }
    
              leaf hop-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "2 .. 255";
                  }
                }
                description
                  "Maximum allowed router hops";
              }
    
              leaf no-cspf {
                type empty;
                description
                  "Disable automatic path computation";
              }
    
              leaf admin-down {
                type empty;
                description
                  "Set GMPLS LSP to administrative down state";
              }
    
              leaf optimize-timer {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Periodical path reoptimizations";
              }
    
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value";
              }
    
              choice record-choice {
                leaf record {
                  type empty;
                  description
                    "Record transit routers";
                }
                leaf no-record {
                  type empty;
                  description
                    "Don't record transit routers";
                }
              }  // choice record-choice
    
              leaf standby {
                type empty;
                description
                  "Keep backup paths in continuous standby";
              }
    
              leaf exclude-srlg {
                type empty;
                description
                  "Exclude SRLG links for secondary path";
              }
    
              leaf ultimate-hop-popping {
                type empty;
                description
                  "Request ultimate hop popping from egress";
              }
    
              leaf sync-active-path-bandwidth {
                type empty;
                description
                  "Signal standby path with bandwidth obtained from active path";
              }
    
              leaf cross-credibility-cspf {
                type empty;
                description
                  "Compute paths across multi-protocol links and nodes";
              }
    
              leaf adaptive {
                type empty;
                description
                  "Have the LSP smoothly cut over to new routes";
              }
    
              leaf select {
                type enumeration {
                  enum "manual" {
                    value 0;
                    description
                      "Manual override as preferred active path, if up and stable";
                  }
                  enum "unconditional" {
                    value 1;
                    description
                      "Unconditional override as preferred active path, regardless of up/down status";
                  }
                }
              }
    
              container upstream-label {
                description
                  "Upstream Label for the bidirectional label-switched path";
                uses apply-advanced;
    
                leaf vlan-id {
                  junos:must "(".. .. .. lsp-attributes switching-type ethernet-vlan")";
                  junos:must-message "VLAN label is valid only for VLAN LSP";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4094";
                    }
                  }
                  description
                    "VLAN ID label for the label-switched path";
                }
              }  // container upstream-label
    
              container optimize-on-change {
                junos:must "(!("protocols mpls label-switched-path $$ optimize-on-change"))";
                junos:must-message "LSP already has optimize-on-change";
                description
                  "Specify additional re-optimization triggers for this path";
                uses apply-advanced;
    
                leaf link-congestion {
                  type empty;
                  description
                    "Optimize when a link becomes congested";
                }
              }  // container optimize-on-change
            }  // list primary
    
            list secondary {
              key "name";
              ordered-by user;
              description "Backup path";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description "Name of path";
              }
    
              uses apply-advanced;
    
              container bandwidth {
                description
                  "Bandwidth to reserve (bps)";
                uses bandwidth-type;
              }  // container bandwidth
    
              container admin-group {
                description
                  "Administrative group policy";
                uses admin_group_include_exclude;
              }  // container admin-group
    
              container admin-group-extended {
                description
                  "Extended administrative group policy";
                uses admin_group_include_exclude;
              }  // container admin-group-extended
    
              container priority {
                presence "enable priority";
                description
                  "Preemption priorities";
              }  // container priority
    
              leaf setup-priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description "Set-up priority";
              }
    
              leaf reservation-priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Reservation priority";
              }
    
              container oam {
                description "Periodic OAM";
                uses periodic_oam;
              }  // container oam
    
              leaf class-of-service {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Class-of-service value";
              }
    
              leaf no-decrement-ttl {
                type empty;
                description
                  "Do not decrement the TTL within an LSP";
              }
    
              leaf hop-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "2 .. 255";
                  }
                }
                description
                  "Maximum allowed router hops";
              }
    
              leaf no-cspf {
                type empty;
                description
                  "Disable automatic path computation";
              }
    
              leaf admin-down {
                type empty;
                description
                  "Set GMPLS LSP to administrative down state";
              }
    
              leaf optimize-timer {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Periodical path reoptimizations";
              }
    
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value";
              }
    
              choice record-choice {
                leaf record {
                  type empty;
                  description
                    "Record transit routers";
                }
                leaf no-record {
                  type empty;
                  description
                    "Don't record transit routers";
                }
              }  // choice record-choice
    
              leaf standby {
                type empty;
                description
                  "Keep backup paths in continuous standby";
              }
    
              leaf exclude-srlg {
                type empty;
                description
                  "Exclude SRLG links for secondary path";
              }
    
              leaf ultimate-hop-popping {
                type empty;
                description
                  "Request ultimate hop popping from egress";
              }
    
              leaf sync-active-path-bandwidth {
                type empty;
                description
                  "Signal standby path with bandwidth obtained from active path";
              }
    
              leaf cross-credibility-cspf {
                type empty;
                description
                  "Compute paths across multi-protocol links and nodes";
              }
    
              leaf adaptive {
                type empty;
                description
                  "Have the LSP smoothly cut over to new routes";
              }
    
              leaf select {
                type enumeration {
                  enum "manual" {
                    value 0;
                    description
                      "Manual override as preferred active path, if up and stable";
                  }
                  enum "unconditional" {
                    value 1;
                    description
                      "Unconditional override as preferred active path, regardless of up/down status";
                  }
                }
              }
    
              container upstream-label {
                description
                  "Upstream Label for the bidirectional label-switched path";
                uses apply-advanced;
    
                leaf vlan-id {
                  junos:must "(".. .. .. lsp-attributes switching-type ethernet-vlan")";
                  junos:must-message "VLAN label is valid only for VLAN LSP";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4094";
                    }
                  }
                  description
                    "VLAN ID label for the label-switched path";
                }
              }  // container upstream-label
    
              container optimize-on-change {
                junos:must "(!("protocols mpls label-switched-path $$ optimize-on-change"))";
                junos:must-message "LSP already has optimize-on-change";
                description
                  "Specify additional re-optimization triggers for this path";
                uses apply-advanced;
    
                leaf link-congestion {
                  type empty;
                  description
                    "Optimize when a link becomes congested";
                }
              }  // container optimize-on-change
    
              container non-active-hold-priority {
                description
                  "Non-active hold priority";
                leaf non-active-hold-prio-value {
                  junos:must "(!((".. .. no-cspf" || (".. .. .. no-cspf" || ".. .. .. .. no-cspf"))))";
                  junos:must-message "Non-active hold priority unsupported for no-cspf LSPs";
                  junos:must "((".. .. standby" || (".. .. .. standby" || ".. .. .. .. standby")))";
                  junos:must-message "Non-active hold priority supported only for standby path";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 7";
                    }
                  }
                  description
                    "Non-active hold priority value";
                }
              }  // container non-active-hold-priority
            }  // list secondary
    
            container policing {
              description
                "Traffic policing for this LSP";
              leaf filter {
                junos:must "(!("firewall family any filter $$ interface-specific"))";
                junos:must-message "LSP policing filter must not be interface-specific";
                junos:must "(("firewall family any filter $$" || (!("firewall") && ".. .. .. .. .. .. .. .. firewall family any filter $$")))";
                junos:must-message "referenced filter must be defined under firewall family any";
                type string {
                  junos:posix-pattern "!^((__.*)|(.{65,}))$";
                  junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                }
                description
                  "Name of filter to use for policing LSP traffic";
              }
    
              leaf no-auto-policing {
                type empty;
                description
                  "Turn off automatic policing for this LSP";
              }
            }  // container policing
    
            leaf lsp-external-controller {
              junos:must "(!(".. single-sided-associated-bidirectional"))";
              junos:must-message "Single-sided associated bidir LSP cannot be externally controlled";
              junos:must "(!(".. corouted-bidirectional"))";
              junos:must-message "Externally controlled LSP cannot be corouted bidirectional";
              junos:must "(!(".. corouted-bidirectional-passive"))";
              junos:must-message "Externally controlled LSP cannot be corouted bidirectional";
              junos:must "("protocols mpls lsp-external-controller $$")";
              junos:must-message "Referenced lsp-external-controller is not defined";
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of less than 64 characters";
              }
              description
                "Name of the external path computing entity";
            }
    
            leaf associate-backup-pe-groups {
              junos:must "(".. oam bfd-liveness-detection")";
              junos:must-message "bfd-liveness-detection must be configured for this feature.";
              type empty;
              description
                "Associate this LSP with backup-pe groups";
            }
    
            leaf egress-protection {
              junos:must "(!(".. install"))";
              junos:must-message "Cannot install routes for an egress protection LSP";
              type empty;
              description
                "Use this LSP for egress protection data transport";
            }
    
            leaf transport-class {
              junos:must "("routing-options transport-class name $$")";
              junos:must-message "Referenced transport class is not defined";
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of less than 64 characters";
              }
              description
                "Transport class this LSP belongs to";
            }
          }  // list label-switched-path
    
          container deselect-on-bandwidth-failure {
            presence
              "enable deselect-on-bandwidth-failure";
            description
              "Deselect active path if it cannot meet the bandwidth constraint";
            uses apply-advanced;
    
            leaf tear-lsp {
              type empty;
              description
                "Bring down active path when all paths fail to reserve required bandwidth";
            }
          }  // container deselect-on-bandwidth-failure
    
          container track-igp-metric {
            description
              "Track IGP metric for LSP install prefixes";
            uses apply-advanced;
    
            leaf install-v4-prefixes {
              type empty;
              description
                "Track IGP metric for IPV4 prefixes";
            }
    
            leaf install-v6-prefixes {
              type empty;
              description
                "Track IGP metric for IPV6 prefixes";
            }
          }  // container track-igp-metric
    
          list container-label-switched-path {
            key "name";
            ordered-by user;
            leaf name {
              junos:must "(!(".. .. label-switched-path $$"))";
              junos:must-message "The Container LSP name is the same as an existing LSP name";
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "Name of container-lsp";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable MPLS container-label-switched path";
              }
            }  // choice enable-disable
    
            leaf description {
              type string {
                length "1 .. 80";
              }
              description
                "Text description of label-switched path";
            }
    
            container label-switched-path-template {
              description
                "Template for dynamic point-to-point LSP parameters";
              uses apply-advanced;
    
              choice dynamic-template {
                leaf template-name {
                  junos:must "(!("protocols mpls label-switched-path $$ egress-protection"))";
                  junos:must-message "Referenced point-to-point LSP template cannot have egress-protection";
                  junos:must "(!("protocols mpls label-switched-path $$ p2mp"))";
                  junos:must-message "Referenced point-to-point LSP template cannot be p2mp sub LSP";
                  junos:must "(!("protocols mpls label-switched-path $$ bandwidth"))";
                  junos:must-message "Referenced point-to-point LSP template cannot have static bandwidth";
                  junos:must "(!("protocols mpls label-swithced-path $$ policing"))";
                  junos:must-message "Referenced point-to-point LSP template cannot have policing";
                  junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ no-cspf"))))";
                  junos:must-message "Referenced point-to-point LSP template cannot have no-cspf";
                  junos:must "(("protocols mpls label-switched-path $$" && "protocols mpls label-switched-path $$ template"))";
                  junos:must-message "Referenced point-to-point LSP template does not exist";
                  type string {
                    junos:posix-pattern "![*<>]";
                    junos:pattern-message "Template name should not contain '*' and angle brackets";
                    length "1 .. 64";
                  }
                  description
                    "Name of point-to-point LSP template";
                }
                leaf default-template {
                  type empty;
                  description
                    "Use default parameters";
                }
              }  // choice dynamic-template
            }  // container label-switched-path-template
    
            leaf to {
              type jt:ipv4addr;
              description
                "Address of egress router";
            }
    
            leaf suffix {
              type string {
                length "1 .. 64";
              }
              description
                "Suffix to generate names of members of container LSP";
            }
    
            container splitting-merging {
              description
                "Do splitting and merging";
              uses apply-advanced;
    
              leaf maximum-member-lsps {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "1 .. 64";
                  }
                }
                description
                  "Maximum number of LSPs";
              }
    
              leaf minimum-member-lsps {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "1 .. 64";
                  }
                }
                description
                  "Minimum number of LSPs";
              }
    
              leaf splitting-bandwidth {
                type string;
                units "bps";
                description
                  "Maximum bandwidth threshold for splitting";
              }
    
              leaf merging-bandwidth {
                type string;
                units "bps";
                description
                  "Minimum bandwidth threshold for merging";
              }
    
              leaf maximum-signaling-bandwidth {
                type string;
                units "bps";
                description
                  "Maximum bandwidth for signaling during normalization";
              }
    
              leaf minimum-signaling-bandwidth {
                type string;
                units "bps";
                description
                  "Minimum bandwidth for signaling during normalization";
              }
    
              leaf splitting-merging-threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 100";
                  }
                }
                units "percent";
                default "10";
                description
                  "Change in aggregate LSP utilization to trigger splitting or merging";
              }
    
              container normalization {
                description "Do normalization";
                uses apply-advanced;
    
                leaf normalize-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "300 .. 315360000";
                    }
                  }
                  units "seconds";
                  default "86400";
                  description
                    "Time to normalize container LSP";
                }
    
                leaf failover-normalization {
                  type empty;
                  description
                    "Do pre-mature normalization in case some LSPs go down before next normalization";
                }
    
                leaf no-incremental-normalize {
                  type empty;
                  description
                    "Do not normalize unless all LSPs are successfully signaled";
                }
    
                leaf normalization-retry-duration {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 86400";
                    }
                  }
                  units "seconds";
                  description
                    "Time before retrying the container LSP normalization";
                }
    
                leaf normalization-retry-limits {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1000";
                    }
                  }
                  description
                    "Maximum number of times to retry container LSP normalization";
                }
              }  // container normalization
    
              container sampling {
                description
                  "Sampling information";
                uses apply-advanced;
    
                leaf cut-off-threshold {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 100";
                    }
                  }
                  default "0";
                  description
                    "Cut-off percentile to remove outliers from aggregate samples";
                }
    
                choice sampling-mode {
                  leaf use-average-aggregate {
                    type empty;
                    description
                      "Use average of the samples";
                  }
                  leaf use-percentile {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 100";
                      }
                    }
                    default "100";
                    description
                      "Use a percentile of the samples";
                  }
                }  // choice sampling-mode
              }  // container sampling
            }  // container splitting-merging
    
            leaf lsp-external-controller {
              junos:must "("protocols mpls lsp-external-controller $$")";
              junos:must-message "Referenced lsp-external-controller is not defined";
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of less than 64 characters";
              }
              description
                "Name of the external path computing entity";
            }
          }  // list container-label-switched-path
    
          list transit-lsp-association {
            key "name";
            ordered-by user;
            description
              "Transit label switch path assoication";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "Name of transit assocation LSP group";
            }
    
            uses apply-advanced;
    
            leaf lsp-name-1 {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "Name of assocation LSP 1";
            }
    
            leaf from-1 {
              type jt:ipv4addr;
              description
                "Address of associated LSP 1";
            }
    
            leaf lsp-name-2 {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "Name of assocation LSP 2";
            }
    
            leaf from-2 {
              type jt:ipv4addr;
              description
                "Address of associated LSP 2";
            }
          }  // list transit-lsp-association
    
          list path {
            key "name";
            ordered-by user;
            description
              "Route of a label-switched path";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of less than 64 characters";
              }
              description
                "Name of label-switched path";
            }
    
            uses apply-advanced;
    
            list path-list {
              key "name";
              ordered-by user;
              description
                "List of routers in the label-switched path";
              leaf name {
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of less than 64 characters";
                }
                description
                  "Address of next system in path";
              }
    
              leaf abstract {
                junos:must "(".. .. .. abstract-hop ${path-list}")";
                junos:must-message "Referenced abstart hop must be configured";
                type empty;
                description
                  "Next system in path is abstract";
              }
    
              choice loose_strict_none {
                leaf loose {
                  type empty;
                  description
                    "Next hop might not be adjacent";
                }
                leaf loose-link {
                  type empty;
                  description
                    "Next hop link might not be adjacent";
                }
                leaf strict {
                  type empty;
                  description
                    "Next hop must be adjacent";
                }
              }  // choice loose_strict_none
            }  // list path-list
          }  // list path
    
          list constituent-list {
            key "name";
            ordered-by user;
            description
              "MPLS constituent list for abstract hops";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "Constituent list name";
            }
    
            uses apply-advanced;
    
            leaf-list srlg {
              type string;
              max-elements 16;
              ordered-by user;
              description "SRLG Name";
            }
    
            leaf-list admin-group {
              type string;
              max-elements 16;
              ordered-by user;
              description
                "Administrative groups";
            }
    
            leaf-list admin-group-extended {
              type string;
              max-elements 16;
              ordered-by user;
              description
                "Extended administrative groups";
            }
          }  // list constituent-list
    
          list abstract-hop {
            key "name";
            ordered-by user;
            description "MPLS abstract hop";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description "Abstract hop name";
            }
    
            uses apply-advanced;
    
            leaf operator {
              type enumeration {
                enum "AND" {
                  value 0;
                  description "AND";
                }
                enum "OR" {
                  value 1;
                  description "OR";
                }
              }
              description
                "Operation among constituent lists";
            }
    
            list constituent-list {
              key "name";
              ordered-by user;
              description
                "Building abstract hop using constituent lists";
              leaf name {
                junos:must "("protocols mpls constituent-list $$")";
                junos:must-message "Referenced constituent list does not exist";
                type string {
                  length "1 .. 64";
                }
                description
                  "Constituent list name";
              }
    
              uses apply-advanced;
    
              choice list-type {
                leaf include-any-list {
                  type empty;
                  description "Include any";
                }
                leaf include-all-list {
                  type empty;
                  description "Include all";
                }
                leaf exclude-any-list {
                  type empty;
                  description "Exclude any";
                }
                leaf exclude-all-list {
                  type empty;
                  description "Exclude all";
                }
              }  // choice list-type
            }  // list constituent-list
          }  // list abstract-hop
    
          container egress-protection {
            description
              "Egress router protection";
            uses apply-advanced;
    
            list context-identifier {
              key "name";
              description "Context identifier";
              leaf name {
                type jt:ipv4addr;
                description "IP address";
              }
    
              uses apply-advanced;
    
              choice context-type {
                leaf primary {
                  type empty;
                  description "Primary";
                }
                leaf protector {
                  type empty;
                  description "Protector";
                }
              }  // choice context-type
    
              leaf metric {
                junos:must "(!(" .. advertise-mode stub-alias"))";
                junos:must-message "Metric configuration is not supported with stub-alias mode";
                junos:must "(".. protector")";
                junos:must-message "Configurable only for protector context identifiers";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 16777215";
                  }
                }
                description "IGP metric";
              }
    
              leaf advertise-mode {
                type enumeration {
                  enum "stub-proxy" {
                    value 0;
                    description "Proxy";
                  }
                  enum "stub-alias" {
                    value 1;
                    description "Alias";
                  }
                }
                description "Advertise mode";
              }
    
              leaf-list admin-group {
                junos:must "((".. protector" && ".. advertise-mode stub-proxy"))";
                junos:must-message "Configurable only for protector with proxy mode";
                type string;
                ordered-by user;
                description
                  "Administrative groups";
              }
            }  // list context-identifier
    
            container traceoptions {
              description
                "Trace options for egress-protection";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "state" {
                      value 0;
                      description
                        "Trace state transitions";
                    }
                    enum "route" {
                      value 1;
                      description
                        "Trace route transitions";
                    }
                    enum "error" {
                      value 2;
                      description
                        "Trace error conditions";
                    }
                    enum "all" {
                      value 3;
                      description
                        "Trace everything";
                    }
                  }
                }
              }  // list flag
            }  // container traceoptions
          }  // container egress-protection
    
          container label-range {
            description "MPLS labels ranges";
            uses apply-advanced;
    
            list lsi-label-range {
              key "name";
              ordered-by user;
              description "LSI-label-range";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_start";
              }
    
              leaf range-end {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_end";
              }
            }  // list lsi-label-range
    
            list dynamic-label-range {
              key "name";
              ordered-by user;
              description "Dynamic-label-range";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_start";
              }
    
              leaf range-end {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_end";
              }
            }  // list dynamic-label-range
    
            list block-label-range {
              key "name";
              ordered-by user;
              description "Block-label-range";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_start";
              }
    
              leaf range-end {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_end";
              }
            }  // list block-label-range
    
            list srgb-label-range {
              key "name";
              max-elements 1;
              ordered-by user;
              description "SRGB-label-range";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_start";
              }
    
              leaf range-end {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_end";
              }
            }  // list srgb-label-range
    
            leaf label-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Limit for the number of concurrent active labels";
            }
    
            list static-label-range {
              key "name";
              ordered-by user;
              description "Static-label-range";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_start";
              }
    
              leaf range-end {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_end";
              }
            }  // list static-label-range
          }  // container label-range
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable MPLS";
            }
          }  // choice enable-disable
    
          container label-history {
            presence "enable label-history";
            description
              "MPLS label history recording";
            uses apply-advanced;
    
            leaf max-entries {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Limit for the number of history entry per label";
            }
          }  // container label-history
    
          container traceoptions {
            description "Trace options for MPLS";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "connection" {
                    value 0;
                    description
                      "Trace CCC activity";
                  }
                  enum "connection-detail" {
                    value 1;
                    description
                      "Trace CCC activity in detail";
                  }
                  enum "cspf" {
                    value 2;
                    description
                      "Trace CSPF computation";
                  }
                  enum "cspf-node" {
                    value 3;
                    description
                      "Trace nodes visited during CSPF";
                  }
                  enum "cspf-link" {
                    value 4;
                    description
                      "Trace links visited during CSPF";
                  }
                  enum "cspf-abstract" {
                    value 5;
                    description
                      "Trace abstract hop based CSPF details";
                  }
                  enum "state" {
                    value 6;
                    description
                      "Trace state transitions";
                  }
                  enum "error" {
                    value 7;
                    description
                      "Trace error conditions";
                  }
                  enum "lsping" {
                    value 8;
                    description
                      "Trace LSP ping packets received";
                  }
                  enum "graceful-restart" {
                    value 9;
                    description
                      "Trace graceful-restart-related events";
                  }
                  enum "nsr-synchronization" {
                    value 10;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum
                    "nsr-synchronization-detail" {
                    value 11;
                    description
                      "Trace NSR synchronization events in detail";
                  }
                  enum "static" {
                    value 12;
                    description
                      "Trace static label-switched path";
                  }
                  enum "egress-protection" {
                    value 13;
                    description
                      "Trace egress protection events";
                  }
                  enum "all" {
                    value 14;
                    description
                      "Trace everything";
                  }
                  enum "autobw-state" {
                    value 15;
                    description
                      "Trace autobandwidth events in mpls trace";
                  }
                  enum
                    "externally-controlled-lsp" {
                    value 16;
                    description
                      "Trace externally controlled LSP events in mpls trace";
                  }
                  enum "ted-import" {
                    value 17;
                    description
                      "Trace leaking TED entries into lsdist.0 table";
                  }
                  enum "ted-export" {
                    value 18;
                    description
                      "Trace leaking of entries from lsdist.0 table into TED";
                  }
                  enum "lsp-history" {
                    value 19;
                    description
                      "Trace LSP history events";
                  }
                  enum "abstract-hop" {
                    value 20;
                    description
                      "Trace abstract hop related events";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
    
          leaf ipv6-tunneling {
            type empty;
            description
              "Allow MPLS LSPs to be used for tunneling IPv6 traffic";
          }
    
          list interface {
            key "name";
            ordered-by user;
            description "MPLS interface options";
            uses juniper-protocols-mpls-interface;
          }  // list interface
    
          list static-label-switched-path {
            key "name";
            ordered-by user;
            description
              "Static label-switched path";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description "Name of path";
            }
    
            uses apply-advanced;
    
            choice lsp-type {
              container bypass {
                description
                  "Bypass ingress label-switched path";
                uses apply-advanced;
    
                leaf bandwidth {
                  type string;
                  units "bps";
                  description
                    "Bandwidth to reserve";
                }
    
                leaf description {
                  type string {
                    length "1 .. 80";
                  }
                  description
                    "Text description of label-switched path";
                }
    
                leaf next-hop {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "IPv4 or IPv6 address or interface of next-hop router";
                }
    
                leaf next-table {
                  type string;
                  description
                    "Next-table for lookup";
                }
    
                leaf push {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 1048575";
                    }
                  }
                  description "Label to push";
                }
    
                leaf to {
                  type jt:ipaddr;
                  description
                    "Address of egress router";
                }
              }  // container bypass
              list transit {
                key "name";
                ordered-by user;
                description
                  "Transit label-switched path";
                leaf name {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "16 .. 1048575";
                    }
                  }
                  description
                    "Incoming label value";
                }
    
                uses apply-advanced;
    
                leaf bandwidth {
                  type string;
                  units "bps";
                  description
                    "Bandwidth to reserve";
                }
    
                leaf description {
                  type string {
                    length "1 .. 80";
                  }
                  description
                    "Text description of label-switched path";
                }
    
                container link-protection {
                  description
                    "Bypass link protection";
                  leaf bypass-name {
                    type string {
                      length "1 .. 64";
                    }
                    description
                      "Bypass label-switched path name";
                  }
                }  // container link-protection
    
                leaf next-hop {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "IPv4 or IPv6 address or interface of next-hop router";
                }
    
                leaf member-interface {
                  type union {
                    type jt:interface-unit;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "AE member interface name";
                }
    
                container node-protection {
                  description
                    "Bypass node protection";
                  leaf bypass-name {
                    type string {
                      length "1 .. 64";
                    }
                    description
                      "Bypass label-switched path name";
                  }
    
                  leaf next-next-label {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1048575";
                      }
                    }
                    description
                      "Label expected by next-next-hop";
                  }
                }  // container node-protection
    
                choice label-action {
                  leaf swap {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1048575";
                      }
                    }
                    description
                      "Swap top label with this label";
                  }
                  leaf pop {
                    type empty;
                    description
                      "Pop the top label";
                  }
                  leaf stitch {
                    junos:must "(!((".. link-protection" || ".. node-protection")))";
                    junos:must-message "Link-protection and node-protection are invalid for LSP stitching";
                    type empty;
                    description
                      "Swap top label with the resolved LSP";
                  }
                }  // choice label-action
              }  // list transit
              container ingress {
                description
                  "Ingress LSR configuration for a static LSP";
                uses apply-advanced;
    
                leaf bandwidth {
                  type string;
                  units "bps";
                  description
                    "Bandwidth to reserve";
                }
    
                leaf class-of-service {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type int32 {
                      range "0 .. 7";
                    }
                  }
                  description
                    "Class-of-service value";
                }
    
                leaf description {
                  type string {
                    length "1 .. 80";
                  }
                  description
                    "Text description of label-switched path";
                }
    
                list install {
                  key "name";
                  ordered-by user;
                  description "Install prefix";
                  leaf name {
                    type jt:ipv4prefix;
                    description
                      "Destination prefix";
                  }
    
                  leaf active {
                    type empty;
                    description
                      "Install prefix into forwarding table";
                  }
                }  // list install
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777215";
                    }
                  }
                  description "Metric value";
                }
    
                leaf next-hop {
                  type union {
                    type jt:ipv4addr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "IPv4 address or interface of next-hop router";
                }
    
                container link-protection {
                  description
                    "Bypass link protection";
                  leaf bypass-name {
                    type string {
                      length "1 .. 64";
                    }
                    description
                      "Bypass label-switched path name";
                  }
                }  // container link-protection
    
                container node-protection {
                  description
                    "Bypass node protection";
                  leaf bypass-name {
                    type string {
                      length "1 .. 64";
                    }
                    description
                      "Bypass label-switched path name";
                  }
    
                  leaf next-next-label {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1048575";
                      }
                    }
                    description
                      "Label expected by next-next-hop";
                  }
                }  // container node-protection
    
                leaf no-install-to-address {
                  type empty;
                  description
                    "Don't install host route 'to' address into routing tables";
                }
    
                container policing {
                  description
                    "Traffic policing for this LSP";
                  leaf filter {
                    junos:must "(!("firewall family any filter $$ interface-specific"))";
                    junos:must-message "LSP policing filter must not be interface-specific";
                    junos:must "(("firewall family any filter $$" || (!("firewall") && ".. .. .. .. .. .. .. .. firewall family any filter $$")))";
                    junos:must-message "referenced filter must be defined under firewall family any";
                    type string {
                      junos:posix-pattern "!^((__.*)|(.{65,}))$";
                      junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                    }
                    description
                      "Name of filter to use for policing LSP traffic";
                  }
    
                  leaf no-auto-policing {
                    type empty;
                    description
                      "Turn off automatic policing for this LSP";
                  }
                }  // container policing
    
                leaf preference {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Preference value";
                }
    
                leaf to {
                  type jt:ipv4addr;
                  description
                    "Address of egress router";
                }
    
                leaf push {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 1048575";
                    }
                  }
                  description "Label to push";
                }
    
                leaf entropy-label {
                  type empty;
                  description
                    "Enable entropy label";
                }
              }  // container ingress
              container segment {
                description
                  "Segment for segment routing";
                uses apply-advanced;
    
                leaf sid-label {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "16 .. 1048575";
                    }
                  }
                  description
                    "Segment identifier (SID) label";
                }
    
                leaf description {
                  type string {
                    length "1 .. 80";
                  }
                  description
                    "Text description of label-switched path";
                }
    
                leaf next-hop {
                  type union {
                    type jt:ipv4addr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "IPv4 address or interface of next-hop router";
                }
    
                choice label-action {
                  leaf swap {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1048575";
                      }
                    }
                    description
                      "Swap the SID label to this label";
                  }
                  leaf pop {
                    type empty;
                    description
                      "Pop the SID label";
                  }
                }  // choice label-action
              }  // container segment
            }  // choice lsp-type
          }  // list static-label-switched-path
        }  // grouping juniper-protocols-mpls
    
        grouping admin_group_include_exclude {
          uses apply-advanced;
    
          choice include-any-choice {
            leaf-list include-any {
              type string;
              ordered-by user;
              description
                "Groups, one or more of which must be present";
            }
          }  // choice include-any-choice
    
          choice include-all-choice {
            leaf-list include-all {
              type string;
              ordered-by user;
              description
                "Groups, all of which must be present";
            }
          }  // choice include-all-choice
    
          choice exclude-choice {
            leaf-list exclude {
              type string;
              ordered-by user;
              description
                "Groups, all of which must be absent";
            }
          }  // choice exclude-choice
        }  // grouping admin_group_include_exclude
    
        grouping bandwidth-type {
          uses apply-advanced;
    
          leaf per-traffic-class-bandwidth {
            type string;
            units "bps";
            description "Bandwidth to reserve";
          }
    
          leaf ct0 {
            type string;
            units "bps";
            description
              "Bandwidth from traffic class 0";
          }
    
          leaf ct1 {
            type string;
            units "bps";
            description
              "Bandwidth from traffic class 1";
          }
    
          leaf ct2 {
            type string;
            units "bps";
            description
              "Bandwidth from traffic class 2";
          }
    
          leaf ct3 {
            type string;
            units "bps";
            description
              "Bandwidth from traffic class 3";
          }
        }  // grouping bandwidth-type
    
        grouping juniper-protocols-mpls-interface {
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Interface name";
          }
    
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable MPLS on this interface";
            }
          }  // choice enable-disable
    
          leaf-list srlg {
            type string;
            max-elements 64;
            ordered-by user;
            description "SRLG Name";
          }
    
          leaf always-mark-connection-protection-tlv {
            type empty;
            description
              "Mark connection protection tlv on this interface";
          }
    
          leaf switch-away-lsps {
            type empty;
            description
              "Switch away protected LSPs to their bypass LSPs";
          }
    
          leaf-list admin-group {
            type string;
            ordered-by user;
            description "Administrative groups";
          }
    
          leaf-list admin-group-extended {
            type string;
            ordered-by user;
            description
              "Extended administrative groups";
          }
    
          container static {
            description
              "Static label-switch path related configurations";
            uses apply-advanced;
    
            leaf protection-revert-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "FRR revert wait time, 0 means disable";
            }
          }  // container static
        }  // grouping juniper-protocols-mpls-interface
    
        grouping juniper-protocols-msdp {
          uses apply-advanced;
    
          leaf data-encapsulation {
            type enumeration {
              enum "disable" {
                value 0;
                description
                  "Disable data encapsulation";
              }
              enum "enable" {
                value 1;
                description
                  "Enable data encapsulation";
              }
            }
            description
              "Set encapsulation of data packets";
          }
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container active-source-limit {
            description
              "Limit the number of active sources accepted";
            uses apply-advanced;
    
            leaf maximum {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1000000";
                }
              }
              default "25000";
              description
                "Maximum number of active sources accepted";
            }
    
            leaf threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1000000";
                }
              }
              default "24000";
              description
                "RED threshold for active source acceptance";
            }
    
            leaf log-warning {
              junos:must "(".. maximum")";
              junos:must-message "Maximum must be configured to configure log-warning";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              default "100";
              description
                "Percentage of maximum at which to start generating warnings";
            }
    
            leaf log-interval {
              junos:must "(".. maximum")";
              junos:must-message "Maximum must be configured to configure log-interval";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "6 .. 32767";
                }
              }
              description
                "Time between log messages";
            }
          }  // container active-source-limit
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable MSDP";
            }
          }  // choice enable-disable
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
    
          leaf local-address {
            type jt:ipv4addr;
            description "Local address";
          }
    
          container traceoptions {
            description "Trace options for MSDP";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all MSDP packets";
                  }
                  enum "route" {
                    value 1;
                    description
                      "Trace routing information";
                  }
                  enum "nsr-synchronization" {
                    value 2;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "source-active" {
                    value 3;
                    description
                      "Trace source-active messages";
                  }
                  enum "source-active-request" {
                    value 4;
                    description
                      "Trace source-active request messages";
                  }
                  enum "source-active-response" {
                    value 5;
                    description
                      "Trace source-active response messages";
                  }
                  enum "keepalive" {
                    value 6;
                    description
                      "Trace keepalive messages";
                  }
                  enum "normal" {
                    value 7;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 8;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 9;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 10;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 11;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 12;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 13;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          list peer {
            key "name";
            ordered-by user;
            description "Configure an MSDP peer";
            leaf name {
              type jt:ipv4addr;
              description "Peer address";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description "Disable MSDP";
              }
            }  // choice enable-disable
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
    
            leaf local-address {
              type jt:ipv4addr;
              description "Local address";
            }
    
            container traceoptions {
              description
                "Trace options for MSDP";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "packets" {
                      value 0;
                      description
                        "Trace all MSDP packets";
                    }
                    enum "route" {
                      value 1;
                      description
                        "Trace routing information";
                    }
                    enum "nsr-synchronization" {
                      value 2;
                      description
                        "Trace NSR synchronization events";
                    }
                    enum "source-active" {
                      value 3;
                      description
                        "Trace source-active messages";
                    }
                    enum "source-active-request" {
                      value 4;
                      description
                        "Trace source-active request messages";
                    }
                    enum
                      "source-active-response" {
                      value 5;
                      description
                        "Trace source-active response messages";
                    }
                    enum "keepalive" {
                      value 6;
                      description
                        "Trace keepalive messages";
                    }
                    enum "normal" {
                      value 7;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 8;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 9;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 10;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 11;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 12;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 13;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            container active-source-limit {
              description
                "Limit the number of active sources accepted";
              uses apply-advanced;
    
              leaf maximum {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1000000";
                  }
                }
                default "25000";
                description
                  "Maximum number of active sources accepted";
              }
    
              leaf threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1000000";
                  }
                }
                default "24000";
                description
                  "RED threshold for active source acceptance";
              }
    
              leaf log-warning {
                junos:must "(".. maximum")";
                junos:must-message "Maximum must be configured to configure log-warning";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                default "100";
                description
                  "Percentage of maximum at which to start generating warnings";
              }
    
              leaf log-interval {
                junos:must "(".. maximum")";
                junos:must-message "Maximum must be configured to configure log-interval";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "6 .. 32767";
                  }
                }
                description
                  "Time between log messages";
              }
            }  // container active-source-limit
    
            leaf keep-alive {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "10 .. 60";
                }
              }
              units "seconds";
              description
                "Time limit for sending out periodic keep alive to peer";
            }
    
            leaf hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "15 .. 150";
                }
              }
              units "seconds";
              description
                "Max time to terminating a peer for having not received any message from ";
            }
    
            leaf sa-hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "75 .. 300";
                }
              }
              units "seconds";
              description
                "Max time for holding a sa message before timing out";
            }
    
            leaf default-peer {
              type empty;
              description "Default RPF peer";
            }
    
            leaf authentication-key {
              type string {
                length "1 .. 126";
              }
              description
                "MD5 authentication key";
            }
          }  // list peer
    
          leaf keep-alive {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 60";
              }
            }
            units "seconds";
            description
              "Time limit for sending out periodic keep alive to peer";
          }
    
          leaf hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 150";
              }
            }
            units "seconds";
            description
              "Max time to terminating a peer for having not received any message from ";
          }
    
          leaf sa-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "75 .. 300";
              }
            }
            units "seconds";
            description
              "Max time for holding a sa message before timing out";
          }
    
          list source {
            key "name";
            ordered-by user;
            description
              "Configure parameters for each source";
            leaf name {
              type jt:ipprefix;
              description
                "Source address or prefix";
            }
    
            uses apply-advanced;
    
            container active-source-limit {
              description
                "Limit the number of active sources accepted";
              uses apply-advanced;
    
              leaf maximum {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1000000";
                  }
                }
                default "25000";
                description
                  "Maximum number of active sources accepted";
              }
    
              leaf threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1000000";
                  }
                }
                default "24000";
                description
                  "RED threshold for active source acceptance";
              }
    
              leaf log-warning {
                junos:must "(".. maximum")";
                junos:must-message "Maximum must be configured to configure log-warning";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                default "100";
                description
                  "Percentage of maximum at which to start generating warnings";
              }
    
              leaf log-interval {
                junos:must "(".. maximum")";
                junos:must-message "Maximum must be configured to configure log-interval";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "6 .. 32767";
                  }
                }
                description
                  "Time between log messages";
              }
            }  // container active-source-limit
          }  // list source
    
          list group {
            key "name";
            ordered-by user;
            description
              "Configure MSDP peer groups";
            leaf name {
              type string;
              description "MSDP peer group name";
            }
    
            uses apply-advanced;
    
            leaf mode {
              type enumeration {
                enum "standard" {
                  value 0;
                  description
                    "Use standard MSDP source-active flooding rules";
                }
                enum "mesh-group" {
                  value 1;
                  description
                    "Group peers are mesh group members";
                }
              }
              default "standard";
              description
                "MSDP group source-active flooding mode";
            }
    
            choice enable-disable {
              leaf disable {
                type empty;
                description "Disable MSDP";
              }
            }  // choice enable-disable
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
    
            leaf local-address {
              type jt:ipv4addr;
              description "Local address";
            }
    
            container traceoptions {
              description
                "Trace options for MSDP";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "packets" {
                      value 0;
                      description
                        "Trace all MSDP packets";
                    }
                    enum "route" {
                      value 1;
                      description
                        "Trace routing information";
                    }
                    enum "nsr-synchronization" {
                      value 2;
                      description
                        "Trace NSR synchronization events";
                    }
                    enum "source-active" {
                      value 3;
                      description
                        "Trace source-active messages";
                    }
                    enum "source-active-request" {
                      value 4;
                      description
                        "Trace source-active request messages";
                    }
                    enum
                      "source-active-response" {
                      value 5;
                      description
                        "Trace source-active response messages";
                    }
                    enum "keepalive" {
                      value 6;
                      description
                        "Trace keepalive messages";
                    }
                    enum "normal" {
                      value 7;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 8;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 9;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 10;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 11;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 12;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 13;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            list peer {
              key "name";
              ordered-by user;
              description
                "Configure an MSDP peer";
              leaf name {
                type jt:ipv4addr;
                description "Peer address";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description "Disable MSDP";
                }
              }  // choice enable-disable
    
              leaf-list export {
                type jt:policy-algebra;
                ordered-by user;
                description "Export policy";
              }
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description "Import policy";
              }
    
              leaf local-address {
                type jt:ipv4addr;
                description "Local address";
              }
    
              container traceoptions {
                description
                  "Trace options for MSDP";
                uses apply-advanced;
    
                container file {
                  description
                    "Trace file options";
                  leaf filename {
                    type string {
                      junos:posix-pattern "![/ %]";
                      junos:pattern-message "Must not contain '/', % or a space";
                      length "1 .. 1024";
                    }
                    description
                      "Name of file in which to write trace information";
                  }
    
                  leaf replace {
                    type empty;
                    status deprecated;
                    description
                      "Replace trace file rather than appending to it";
                  }
    
                  leaf size {
                    type string;
                    description
                      "Maximum trace file size";
                  }
    
                  leaf files {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "2 .. 1000";
                      }
                    }
                    default "10";
                    description
                      "Maximum number of trace files";
                  }
    
                  leaf no-stamp {
                    type empty;
                    status deprecated;
                    description
                      "Do not timestamp trace file";
                  }
    
                  choice world-readable-choice {
                    leaf world-readable {
                      type empty;
                      description
                        "Allow any user to read the log file";
                    }
                    leaf no-world-readable {
                      type empty;
                      description
                        "Don't allow any user to read the log file";
                    }
                  }  // choice world-readable-choice
                }  // container file
    
                list flag {
                  key "name";
                  ordered-by user;
                  description
                    "Tracing parameters";
                  leaf name {
                    type enumeration {
                      enum "packets" {
                        value 0;
                        description
                          "Trace all MSDP packets";
                      }
                      enum "route" {
                        value 1;
                        description
                          "Trace routing information";
                      }
                      enum "nsr-synchronization" {
                        value 2;
                        description
                          "Trace NSR synchronization events";
                      }
                      enum "source-active" {
                        value 3;
                        description
                          "Trace source-active messages";
                      }
                      enum
                        "source-active-request" {
                        value 4;
                        description
                          "Trace source-active request messages";
                      }
                      enum
                        "source-active-response" {
                        value 5;
                        description
                          "Trace source-active response messages";
                      }
                      enum "keepalive" {
                        value 6;
                        description
                          "Trace keepalive messages";
                      }
                      enum "normal" {
                        value 7;
                        description
                          "Trace normal events";
                      }
                      enum "general" {
                        value 8;
                        description
                          "Trace general events";
                      }
                      enum "state" {
                        value 9;
                        description
                          "Trace state transitions";
                      }
                      enum "policy" {
                        value 10;
                        description
                          "Trace policy processing";
                      }
                      enum "task" {
                        value 11;
                        description
                          "Trace routing protocol task processing";
                      }
                      enum "timer" {
                        value 12;
                        description
                          "Trace routing protocol timer processing";
                      }
                      enum "all" {
                        value 13;
                        description
                          "Trace everything";
                      }
                    }
                  }
    
                  leaf send {
                    type empty;
                    description
                      "Trace transmitted packets";
                  }
    
                  leaf receive {
                    type empty;
                    description
                      "Trace received packets";
                  }
    
                  leaf detail {
                    type empty;
                    description
                      "Trace detailed information";
                  }
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this trace flag";
                  }
                }  // list flag
              }  // container traceoptions
    
              container active-source-limit {
                description
                  "Limit the number of active sources accepted";
                uses apply-advanced;
    
                leaf maximum {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1000000";
                    }
                  }
                  default "25000";
                  description
                    "Maximum number of active sources accepted";
                }
    
                leaf threshold {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1000000";
                    }
                  }
                  default "24000";
                  description
                    "RED threshold for active source acceptance";
                }
    
                leaf log-warning {
                  junos:must "(".. maximum")";
                  junos:must-message "Maximum must be configured to configure log-warning";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  default "100";
                  description
                    "Percentage of maximum at which to start generating warnings";
                }
    
                leaf log-interval {
                  junos:must "(".. maximum")";
                  junos:must-message "Maximum must be configured to configure log-interval";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "6 .. 32767";
                    }
                  }
                  description
                    "Time between log messages";
                }
              }  // container active-source-limit
    
              leaf keep-alive {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10 .. 60";
                  }
                }
                units "seconds";
                description
                  "Time limit for sending out periodic keep alive to peer";
              }
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "15 .. 150";
                  }
                }
                units "seconds";
                description
                  "Max time to terminating a peer for having not received any message from ";
              }
    
              leaf sa-hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "75 .. 300";
                  }
                }
                units "seconds";
                description
                  "Max time for holding a sa message before timing out";
              }
    
              leaf default-peer {
                type empty;
                description "Default RPF peer";
              }
    
              leaf authentication-key {
                type string {
                  length "1 .. 126";
                }
                description
                  "MD5 authentication key";
              }
            }  // list peer
          }  // list group
        }  // grouping juniper-protocols-msdp
    
        grouping juniper-protocols-mstp {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable MSTP";
            }
          }  // choice enable-disable
    
          leaf bpdu-destination-mac-address {
            type enumeration {
              enum "provider-bridge-group" {
                value 0;
                description
                  "802.1ad provider bridge group address";
              }
            }
            description
              "Destination MAC address in the spanning tree BPDUs";
          }
    
          leaf configuration-name {
            type string {
              length "1 .. 32";
            }
            description
              "Configuration name (part of MST configuration identifier)";
          }
    
          leaf revision-level {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Revision level (part of MST configuration identifier)";
          }
    
          leaf max-hops {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 255";
              }
            }
            description "Maximum number of hops";
          }
    
          leaf max-age {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "6 .. 40";
              }
            }
            units "seconds";
            description
              "Maximum age of received protocol bpdu";
          }
    
          leaf hello-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 10";
              }
            }
            units "seconds";
            description
              "Time interval between configuration BPDUs";
          }
    
          leaf forward-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "4 .. 30";
              }
            }
            units "seconds";
            description
              "Time spent in listening or learning state";
          }
    
          leaf system-identifier {
            type jt:mac-unicast;
            description
              "Sytem identifier to represent this node";
          }
    
          container traceoptions {
            description
              "Tracing options for debugging protocol operation";
            uses stp-trace-options;
          }  // container traceoptions
    
          leaf bridge-priority {
            type string {
              junos:posix-pattern "^(0|4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
              junos:pattern-message "Must be a multiple of 4096";
            }
            description
              "Priority of the bridge (in increments of 4k - 0,4k,8k,..60k)";
          }
    
          leaf backup-bridge-priority {
            type string {
              junos:posix-pattern "^(4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
              junos:pattern-message "Must be a multiple of 4096";
            }
            description
              "Priority of the bridge (in increments of 4k - 4k,8k,..60k)";
          }
    
          leaf bpdu-block-on-edge {
            type empty;
            description
              "Block BPDU on all interfaces configured as edge (BPDU Protect)";
          }
    
          leaf vpls-flush-on-topology-change {
            type empty;
            description
              "Enable VPLS MAC flush on root protected CE interface receving topology change";
          }
    
          leaf priority-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 255";
              }
            }
            units "seconds";
            description
              "Hold time before switching to primary priority when core domain becomes up";
          }
    
          list system-id {
            key "name";
            ordered-by user;
            description
              "System ID to IP mapping";
            uses system-id-ip-map;
          }  // list system-id
    
          list interface {
            key "name";
            description "Interface options";
            uses mstp-interface;
          }  // list interface
    
          list msti {
            key "name";
            description "Per-MSTI options";
            leaf name {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 4094";
                }
              }
            }
    
            uses apply-advanced;
    
            leaf bridge-priority {
              type string {
                junos:posix-pattern "^(0|4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
                junos:pattern-message "Must be a multiple of 4096";
              }
              description
                "Priority of the bridge (in increments of 4k - 0,4k,8k,..60k)";
            }
    
            leaf backup-bridge-priority {
              type string {
                junos:posix-pattern "^(4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
                junos:pattern-message "Must be a multiple of 4096";
              }
              description
                "Priority of the bridge (in increments of 4k - 4k,8k,..60k)";
            }
    
            leaf-list vlan {
              type string;
              ordered-by user;
              description
                "VLAN ID or VLAN ID range [1..4094]";
            }
    
            list interface {
              key "name";
              description "Interface options";
              uses mstp-interface;
            }  // list interface
          }  // list msti
        }  // grouping juniper-protocols-mstp
    
        grouping juniper-protocols-mvpn {
          description "BGP-MVPN configuration";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for BGP-MVPN";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "error" {
                    value 0;
                    description "Trace errors";
                  }
                  enum "nlri" {
                    value 1;
                    description
                      "Trace MVPN advertisements";
                  }
                  enum "topology" {
                    value 2;
                    description
                      "Trace MVPN topology changes";
                  }
                  enum "tunnel" {
                    value 3;
                    description
                      "Trace provider tunnel events";
                  }
                  enum "umh" {
                    value 4;
                    description
                      "Trace Upstream Multicast Hop (UMH) events";
                  }
                  enum "intra-as-ad" {
                    value 5;
                    description
                      "Trace MVPN intra-AS auto discovery routes";
                  }
                  enum "inter-as-ad" {
                    value 6;
                    description
                      "Trace MVPN inter-AS auto discovery routes";
                  }
                  enum "spmsi-ad" {
                    value 7;
                    description
                      "Trace MVPN SPMSI auto discovery routes";
                  }
                  enum "leaf-ad" {
                    value 8;
                    description
                      "Trace MVPN leaf auto discovery routes";
                  }
                  enum "source-active" {
                    value 9;
                    description
                      "Trace MVPN source active routes";
                  }
                  enum "cmcast-join" {
                    value 10;
                    description
                      "Trace MVPN c-multicast join routes";
                  }
                  enum "mdt-safi-ad" {
                    value 11;
                    description
                      "Trace MVPN MDT SAFI auto discovery routes";
                  }
                  enum "mvpn-limit" {
                    value 12;
                    description
                      "Trace MVPN spmsi and cmcast limit events";
                  }
                  enum "nsr-synchronization" {
                    value 13;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "route" {
                    value 14;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 15;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 16;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 17;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 18;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 19;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 20;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 21;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          container autodiscovery-only {
            junos:must "(!(".. route-target"))";
            junos:must-message "MVPN autodiscovery-only mode cannot be used with route-target";
            junos:must "(!(".. sender-site"))";
            junos:must-message "MVPN autodiscovery-only mode cannot be used with sender-site";
            junos:must "(!(".. receiver-site"))";
            junos:must-message "MVPN autodiscovery-only mode cannot be used with receiver-site";
            junos:must "(".. .. .. protocols pim mvpn")";
            junos:must-message "MVPN autodiscovery-only mode requires protocols pim mvpn configuration for the instance.";
            junos:must "(!(".. .. .. provider-tunnel family inet pim-asm"))";
            junos:must-message "MVPN autodiscovery-only mode requires a PIM-SSM provider-tunnel root address.";
            junos:must "((".. .. .. provider-tunnel pim-ssm" || ".. .. .. provider-tunnel family inet pim-ssm"))";
            junos:must-message "MVPN autodiscovery-only mode requires a PIM-SSM provider-tunnel root address.";
            status deprecated;
            description
              "Use MVPN exclusively for PE router autodiscovery";
            uses apply-advanced;
    
            container intra-as {
              description
                "Intra-AS autodiscovery options";
              uses apply-advanced;
    
              leaf inclusive {
                type empty;
                description
                  "Inclusive provider tunnel autodiscovery";
              }
            }  // container intra-as
          }  // container autodiscovery-only
    
          container family {
            description
              "BGP-MVPN address family";
            uses apply-advanced;
    
            container any {
              presence "enable any";
              description
                "BGP-MVPN properties for all families";
              uses apply-advanced;
    
              leaf disable {
                type empty;
                description
                  "Disable all families";
              }
            }  // container any
    
            container inet {
              description
                "IPv4 BGP-MVPN properties";
              uses apply-advanced;
    
              container autodiscovery-only {
                junos:must "(!(".. .. .. route-target"))";
                junos:must-message "MVPN autodiscovery-only mode cannot be used with route-target";
                junos:must "(!(".. .. .. sender-site"))";
                junos:must-message "MVPN autodiscovery-only mode cannot be used with sender-site";
                junos:must "(!(".. .. .. receiver-site"))";
                junos:must-message "MVPN autodiscovery-only mode cannot be used with receiver-site";
                junos:must "(".. .. .. .. .. protocols pim mvpn")";
                junos:must-message "MVPN autodiscovery-only mode requires protocols pim mvpn configuration for the instance.";
                junos:must "(!(".. .. .. .. .. provider-tunnel family inet pim-asm"))";
                junos:must-message "MVPN autodiscovery-only mode requires a PIM-SSM provider-tunnel root address.";
                junos:must "((".. .. .. .. .. provider-tunnel pim-ssm" || ".. .. .. .. .. provider-tunnel family inet pim-ssm"))";
                junos:must-message "MVPN autodiscovery-only mode requires a PIM-SSM provider-tunnel root address.";
                description
                  "Use MVPN exclusively for PE router autodiscovery";
                uses apply-advanced;
    
                container intra-as {
                  description
                    "Intra-AS autodiscovery options";
                  uses apply-advanced;
    
                  leaf inclusive {
                    type empty;
                    description
                      "Inclusive provider tunnel autodiscovery";
                  }
                }  // container intra-as
              }  // container autodiscovery-only
    
              leaf disable {
                type empty;
                description
                  "Disable family IPv4";
              }
            }  // container inet
    
            container inet6 {
              presence "enable inet6";
              description
                "IPv6 BGP-MVPN properties";
              uses apply-advanced;
    
              container autodiscovery-only {
                junos:must "(!(".. .. .. route-target"))";
                junos:must-message "MVPN autodiscovery-only mode cannot be used with route-target";
                junos:must "(!(".. .. .. sender-site"))";
                junos:must-message "MVPN autodiscovery-only mode cannot be used with sender-site";
                junos:must "(!(".. .. .. receiver-site"))";
                junos:must-message "MVPN autodiscovery-only mode cannot be used with receiver-site";
                junos:must "(".. .. .. .. .. protocols pim mvpn")";
                junos:must-message "MVPN autodiscovery-only mode requires protocols pim mvpn configuration for the instance.";
                junos:must "(!(".. .. .. .. .. provider-tunnel family inet pim-asm"))";
                junos:must-message "MVPN autodiscovery-only mode requires a PIM-SSM provider-tunnel root address.";
                junos:must "((".. .. .. .. .. provider-tunnel pim-ssm" || ".. .. .. .. .. provider-tunnel family inet pim-ssm"))";
                junos:must-message "MVPN autodiscovery-only mode requires a PIM-SSM provider-tunnel root address.";
                description
                  "Use MVPN exclusively for PE router autodiscovery";
                uses apply-advanced;
    
                container intra-as {
                  description
                    "Intra-AS autodiscovery options";
                  uses apply-advanced;
    
                  leaf inclusive {
                    type empty;
                    description
                      "Inclusive provider tunnel autodiscovery";
                  }
                }  // container intra-as
              }  // container autodiscovery-only
    
              leaf disable {
                type empty;
                description
                  "Disable family IPv6";
              }
            }  // container inet6
          }  // container family
    
          choice sender-receiver-site-choice {
            leaf receiver-site {
              junos:must "(!(".. .. .. provider-tunnel"))";
              junos:must-message "MVPN instance with only receiver sites cannot be the root of a provider-tunnel";
              type empty;
              description
                "MVPN instance has sites only with multicast receivers";
            }
            leaf sender-site {
              junos:must "(".. .. .. provider-tunnel")";
              junos:must-message "MVPN instance with sources must be the root of a provider-tunnel";
              type empty;
              description
                "MVPN instance has sites only with multicast sources";
            }
          }  // choice sender-receiver-site-choice
    
          leaf unicast-umh-election {
            junos:must "(!(".. mvpn-join-load-balance"))";
            junos:must-message "UMH election based on unicast route cannot be configured with mvpn-join-load-balance";
            junos:must "(!(".. .. .. .. .. protocols bgp path-selection cisco-non-deterministic"))";
            junos:must-message "Upstream Multicast Hop election cannot be used with 'protocols bgp path-selection cisco-non-deterministic'";
            type empty;
            description
              "Upstream Multicast Hop election based on unicast route preference";
          }
    
          container static-umh {
            description
              "Upstream Multicast Hop election based on static configuration";
            uses apply-advanced;
    
            leaf primary {
              type jt:ipv4addr;
              description
                "Primary Upstream Multicast Hop";
            }
    
            leaf backup {
              type jt:ipv4addr;
              description
                "Secondary Upstream Multicast Hop";
            }
    
            choice source-tree_choice {
              leaf source-tree {
                type empty;
                description
                  "Mandatory attribute - static-umh applies only to MVPN source-tree c-multicast joins";
              }
            }  // choice source-tree_choice
          }  // container static-umh
    
          leaf cmcast-joins-limit-inet {
            junos:must "(".. mvpn-mode rpt-spt")";
            junos:must-message "Cmcast limit can only be configured for MVPN rpt-spt mode";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 15000";
              }
            }
            description
              "Maximum number of cmcast entries for v4";
          }
    
          leaf cmcast-joins-limit-inet6 {
            junos:must "(".. mvpn-mode rpt-spt")";
            junos:must-message "Cmcastv6 limit can only be configured for MVPN rpt-spt mode";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 15000";
              }
            }
            description
              "Maximum number of cmcast entries for v6";
          }
    
          container mvpn-mode {
            description "MVPN mode of operation";
            uses apply-advanced;
    
            choice mode {
              container rpt-spt {
                presence "enable rpt-spt";
                description
                  "MVPN works in multicast RPT and SPT mode";
                uses apply-advanced;
    
                leaf spt-switch-timer {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 60";
                    }
                  }
                  units "seconds";
                  description
                    "Timeout before a PE router switches between RPT and SPT";
                }
              }  // container rpt-spt
              container spt-only {
                presence "enable spt-only";
                description
                  "MVPN works in multicast SPT only mode (default mode)";
                uses apply-advanced;
    
                container source-active-advertisement {
                  description
                    "Attributes associated with advertising Source-Active A-D routes";
                  uses apply-advanced;
    
                  leaf dampen {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 30";
                      }
                    }
                    units "minutes";
                    description
                      "Time to wait before re-advertising source-active route";
                  }
    
                  leaf min-rate {
                    type string;
                    units "bits per second";
                    description
                      "Minimum traffic rate required to advertise Source-Active route";
                  }
                }  // container source-active-advertisement
    
                leaf convert-sa-to-msdp {
                  type empty;
                  description
                    "Turn on MVPN SA route to MSDP SA conversion";
                }
              }  // container spt-only
            }  // choice mode
          }  // container mvpn-mode
    
          container route-target {
            description
              "Configure route-targets for MVPN routes";
            uses apply-advanced;
    
            container import-target {
              description
                "Target communities used when importing routes";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Use the same target community as configured for unicast";
                choice receiver-sender-target-choice {
                  leaf receiver {
                    junos:must "(!(".. .. .. .. receiver-site"))";
                    junos:must-message "MVPN instance with only receivers must not import routes from other receiver only sites";
                    type empty;
                    description
                      "Target community used when importing receiver site routes";
                  }
                  leaf sender {
                    junos:must "(!(".. .. .. .. sender-site"))";
                    junos:must-message "MVPN instance with only sources must not import routes from other sender only sites";
                    type empty;
                    description
                      "Target community used when importing sender site routes";
                  }
                }  // choice receiver-sender-target-choice
              }  // container unicast
    
              container target {
                presence "enable target";
                description "Target community";
                leaf target-value {
                  type string {
                    junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                    junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                  }
                }
    
                choice receiver-sender-target-choice {
                  leaf receiver {
                    junos:must "(!(".. .. .. .. receiver-site"))";
                    junos:must-message "MVPN instance with only receivers must not import routes from other receiver only sites";
                    type empty;
                    description
                      "Target community used when importing receiver site routes";
                  }
                  leaf sender {
                    junos:must "(!(".. .. .. .. sender-site"))";
                    junos:must-message "MVPN instance with only sources must not import routes from other sender only sites";
                    type empty;
                    description
                      "Target community used when importing sender site routes";
                  }
                }  // choice receiver-sender-target-choice
              }  // container target
            }  // container import-target
    
            container export-target {
              description
                "Target communities used when exporting routes";
              uses apply-advanced;
    
              leaf unicast {
                type empty;
                description
                  "Use the same target community as configured for unicast";
              }
    
              leaf target {
                type string {
                  junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                  junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                }
                description "Target community";
              }
            }  // container export-target
          }  // container route-target
    
          container mvpn-join-load-balance {
            junos:must "(!(".. unicast-umh-election"))";
            junos:must-message "MVPN join load balancing cannot be configured with unicast-umh-election";
            description
              "MVPN Join Load Balancing Algorithm";
            uses apply-advanced;
    
            choice algorithm {
              container bytewise-xor-hash {
                presence
                  "enable bytewise-xor-hash";
                description
                  "Upstream selection using bytewise XOR hash";
              }  // container bytewise-xor-hash
            }  // choice algorithm
          }  // container mvpn-join-load-balance
    
          container hot-root-standby {
            junos:must "(!(".. .. .. instance-type mpls-internet-multicast"))";
            junos:must-message "MVPN live-live - hot-root-standby cannot be configured in mpls-internet-multicast vrf";
            junos:must "(".. sender-based-rpf")";
            junos:must-message "MVPN live-live - hot-root-standby configuration needs sender-based-rpf configuration";
            description
              "MVPN live-live - hot root standby";
            uses apply-advanced;
    
            choice tree {
              container source-tree {
                presence "enable source-tree";
                description
                  "MVPN live-live - hot root standby for source tree";
              }  // container source-tree
            }  // choice tree
    
            container min-rate {
              junos:must "(".. .. hot-root-standby source-tree")";
              junos:must-message "MVPN live-live - min-rate can be configured only if hot-root-standby source-tree is configured";
              description
                "Minimum traffic rate for the provider tunnel below which switchover is initiated (in bps)";
              uses apply-advanced;
    
              leaf rate {
                type string;
                units "bits per second";
                description
                  "Minium traffic rate for the provider tunnel below which switchover is initiated (in bps)";
              }
    
              leaf revert-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 20";
                  }
                }
                units "seconds";
                description
                  "Time to delay updating of multicast routes to allow for multicast convergence";
              }
            }  // container min-rate
          }  // container hot-root-standby
    
          container inter-region-template {
            description
              "MVPN inter-region tunnel mapping template";
            uses apply-advanced;
    
            list template {
              key "name";
              ordered-by user;
              description
                "Define a inter-region template";
              leaf name {
                type string;
                description "MVPN Template Name";
              }
    
              uses apply-advanced;
    
              list region {
                key "name";
                ordered-by user;
                description
                  "BGP peer group names used as region";
                leaf name {
                  junos:must "("protocols bgp group $$")";
                  junos:must-message "BGP group must be present";
                  type string;
                  description "Region name";
                }
    
                uses apply-advanced;
    
                choice tunnel-type {
                  container rsvp-te {
                    junos:must "("protocols rsvp")";
                    junos:must-message "RSVP must be configured in the master instance";
                    description
                      "RSVP-TE point-to-multipoint LSP for flooding";
                    uses apply-advanced;
    
                    choice static-or-dynamic {
                      leaf static-lsp {
                        type string {
                          junos:posix-pattern "^.{1,32}$";
                          junos:pattern-message "Must be a string of 32 characters or less";
                        }
                        description
                          "Name of point-to-multipoint LSP";
                      }
                      container label-switched-path-template {
                        description
                          "Template for dynamic point-to-multipoint LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                            junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-multipoint LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // choice static-or-dynamic
                  }  // container rsvp-te
                  container ldp-p2mp {
                    junos:must "("protocols ldp p2mp")";
                    junos:must-message "LDP P2MP must be configured in the master instance";
                    presence "enable ldp-p2mp";
                    description
                      "LDP point-to-multipoint LSP for flooding";
                  }  // container ldp-p2mp
                  container ingress-replication {
                    description
                      "Ingress replication tunnel";
                    uses apply-advanced;
    
                    leaf create-new-ucast-tunnel {
                      junos:must "(".. label-switched-path label-switched-path-template")";
                      junos:must-message "label-switched-path-template must be defined";
                      type empty;
                      description
                        "Create new unicast tunnel for ingress replication";
                    }
    
                    container label-switched-path {
                      presence
                        "enable label-switched-path";
                      description
                        "Point-to-point LSP unicast tunnel";
                      uses apply-advanced;
    
                      container label-switched-path-template {
                        junos:must "(".. .. create-new-ucast-tunnel")";
                        junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                        description
                          "Template for dynamic point-to-point LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                            junos:must-message "Referenced point-to-point LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-point LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // container label-switched-path
                  }  // container ingress-replication
                  leaf incoming {
                    type empty;
                    description
                      "Same as incoming provider tunnel";
                  }
                }  // choice tunnel-type
              }  // list region
    
              container all-regions {
                description
                  "Used for all regions not specified";
                uses apply-advanced;
    
                choice tunnel-type {
                  container rsvp-te {
                    junos:must "("protocols rsvp")";
                    junos:must-message "RSVP must be configured in the master instance";
                    description
                      "RSVP-TE point-to-multipoint LSP for flooding";
                    uses apply-advanced;
    
                    choice static-or-dynamic {
                      leaf static-lsp {
                        type string {
                          junos:posix-pattern "^.{1,32}$";
                          junos:pattern-message "Must be a string of 32 characters or less";
                        }
                        description
                          "Name of point-to-multipoint LSP";
                      }
                      container label-switched-path-template {
                        description
                          "Template for dynamic point-to-multipoint LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                            junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-multipoint LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // choice static-or-dynamic
                  }  // container rsvp-te
                  container ldp-p2mp {
                    junos:must "("protocols ldp p2mp")";
                    junos:must-message "LDP P2MP must be configured in the master instance";
                    presence "enable ldp-p2mp";
                    description
                      "LDP point-to-multipoint LSP for flooding";
                  }  // container ldp-p2mp
                  container ingress-replication {
                    description
                      "Ingress replication tunnel";
                    uses apply-advanced;
    
                    leaf create-new-ucast-tunnel {
                      junos:must "(".. label-switched-path label-switched-path-template")";
                      junos:must-message "label-switched-path-template must be defined";
                      type empty;
                      description
                        "Create new unicast tunnel for ingress replication";
                    }
    
                    container label-switched-path {
                      presence
                        "enable label-switched-path";
                      description
                        "Point-to-point LSP unicast tunnel";
                      uses apply-advanced;
    
                      container label-switched-path-template {
                        junos:must "(".. .. create-new-ucast-tunnel")";
                        junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                        description
                          "Template for dynamic point-to-point LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                            junos:must-message "Referenced point-to-point LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-point LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // container label-switched-path
                  }  // container ingress-replication
                  leaf incoming {
                    type empty;
                    description
                      "Same as incoming provider tunnel";
                  }
                }  // choice tunnel-type
              }  // container all-regions
            }  // list template
          }  // container inter-region-template
    
          leaf source-redundancy {
            type empty;
            description
              "Assume all the sources for a particular group is sending same data";
          }
    
          container umh-selection-additional-input {
            description
              "Additional parameters to consider during UMH";
            uses apply-advanced;
    
            leaf source-active-preference {
              junos:must "(!(".. .. mvpn-mode rpt-spt"))";
              junos:must-message "Source active preference can be configured only for spt only mode";
              type empty;
              description
                "Use the preference set in the source active route";
            }
    
            leaf tunnel-status {
              type empty;
              description
                "Use the RSVP tunnel status";
            }
          }  // container umh-selection-additional-input
        }  // grouping juniper-protocols-mvpn
    
        grouping juniper-protocols-mvrp {
          description "MVRP Configuration";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Tracing options for MVRP";
            uses mrp-trace-options;
          }  // container traceoptions
    
          leaf join-timer {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "100 .. 500";
              }
            }
            units "milliseconds";
            default "200";
            description "Join timer interval";
          }
    
          leaf leave-timer {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "300 .. 1000";
              }
            }
            units "milliseconds";
            default "800";
            description "Leave timer interval";
          }
    
          leaf leaveall-timer {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "10 .. 60";
              }
            }
            units "seconds";
            default "10";
            description
              "Leaveall timer interval";
          }
    
          leaf no-dynamic-vlan {
            type empty;
            description
              "Disable dynamic VLAN creation";
          }
    
          leaf no-attribute-length-in-pdu {
            type empty;
            description
              "No attribute length while sending pdu ";
          }
    
          leaf bpdu-destination-mac-address {
            type enumeration {
              enum "provider-bridge-group" {
                value 0;
                description
                  "802.1ad provider bridge group address";
              }
            }
            description
              "Destination MAC address in the MVRP BPDUs";
          }
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Configure interface options";
            leaf name {
              junos:must "((((".. .. .. rstp interface $$" || ".. .. .. rstp interface all") && !(".. .. .. rstp interface $$ disable")) || ((".. .. .. mstp interface $$" || ".. .. .. mstp interface all") && !(".. .. .. mstp interface $$ disable"))))";
              junos:must-message "rstp/mstp is not enabled on the interface, mvrp is not allowed";
              junos:must "((!("interfaces $$ flexible-vlan-tagging") && (!("interfaces $$ vlan-tagging") && !("interfaces $$ stacked-vlan-tagging"))))";
              junos:must-message "mvrp is not supported on interfaces if flexible-vlan-tagging/vlan-tagging/stacked-vlan-tagging enabled";
              junos:must "(("interfaces $$ unit $$={0} family ethernet-switching interface-mode trunk" || "interfaces $$ unit $$={0} family bridge interface-mode trunk"))";
              junos:must-message "mvrp can be enabled only on interfaces with interface-mode trunk";
              type union {
                type jt:interface-device;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf join-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "100 .. 500";
                }
              }
              units "milliseconds";
              description "Join timer interval";
            }
    
            leaf leave-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "300 .. 1000";
                }
              }
              units "milliseconds";
              description "Leave timer interval";
            }
    
            leaf leaveall-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "10 .. 60";
                }
              }
              units "seconds";
              description
                "Leaveall timer interval";
            }
    
            leaf point-to-point {
              type empty;
              description
                "Port is point to point";
            }
    
            leaf registration {
              type enumeration {
                enum "normal" {
                  value 0;
                  description
                    "Normal registration mode";
                }
                enum "restricted" {
                  value 1;
                  description
                    "Restricted registration mode";
                }
                enum "forbidden" {
                  value 2;
                  description
                    "Forbidden registration mode";
                }
              }
              default "normal";
              description "Registration mode";
            }
          }  // list interface
        }  // grouping juniper-protocols-mvrp
    
        grouping juniper-protocols-ospf {
          uses apply-advanced;
    
          list topology {
            key "name";
            ordered-by user;
            description "Topology parameters";
            leaf name {
              type string;
              description "Topology name";
            }
    
            uses apply-advanced;
    
            leaf disable {
              type empty;
              description
                "Disable this topology";
            }
    
            leaf topology-id {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "32 .. 127";
                }
              }
              description "Topology identifier";
            }
    
            leaf overload {
              type empty;
              description
                "Set the overload mode (repel transit traffic)";
            }
    
            leaf rib-group {
              junos:must "("routing-options rib-groups $$")";
              junos:must-message "Referenced rib-group must be defined";
              type string;
              description
                "Routing table group for importing routes";
            }
    
            container spf-options {
              description
                "Configure options for SPF";
              uses apply-advanced;
    
              leaf delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "50 .. 8000";
                  }
                }
                units "milliseconds";
                description
                  "Time to wait before running an SPF";
              }
    
              leaf holddown {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2000 .. 20000";
                  }
                }
                units "milliseconds";
                description
                  "Time to hold down before running an SPF";
              }
    
              leaf rapid-runs {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 10";
                  }
                }
                description
                  "Number of maximum rapid SPF runs before holddown";
              }
    
              leaf no-ignore-our-externals {
                type empty;
                description
                  "Do not ignore self-generated external and NSSA LSAs";
              }
            }  // container spf-options
    
            container backup-spf-options {
              description
                "Configure options for backup SPF";
              uses apply-advanced;
    
              container remote-backup-calculation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                presence
                  "enable remote-backup-calculation";
                description
                  "Calculate Remote LFA backup nexthops";
                uses apply-advanced;
    
                container pq-nodes-nearest-to-source {
                  description
                    "PQ nodes selection based upon nearest to source";
                  uses apply-advanced;
    
                  leaf percent {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "10 .. 100";
                      }
                    }
                    description
                      "Selection percentage for nearest to source";
                  }
                }  // container pq-nodes-nearest-to-source
              }  // container remote-backup-calculation
    
              container use-post-convergence-lfa {
                junos:must "("protocols ospf source-packet-routing")";
                junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                presence
                  "enable use-post-convergence-lfa";
                description
                  "Calculate post-convergence backup paths";
                uses apply-advanced;
    
                leaf maximum-labels {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 8";
                    }
                  }
                  description
                    "Maximum number of labels installed for post-convergence paths";
                }
    
                leaf maximum-backup-paths {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 8";
                    }
                  }
                  description
                    "Maximum number of equal-cost post-convergence paths installed";
                }
              }  // container use-post-convergence-lfa
    
              leaf use-source-packet-routing {
                junos:must "(".. .. source-packet-routing")";
                junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                junos:must "(!(".. remote-backup-calculation"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options remote-backup-calculation'";
                type empty;
                description
                  "Use spring backup paths for inet.0 routes";
              }
    
              leaf disable {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Do not run backup SPF";
              }
    
              leaf no-install {
                type empty;
                description
                  "Do not install backup nexthops into the RIB";
              }
    
              leaf downstream-paths-only {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Use only downstream backup paths";
              }
    
              container per-prefix-calculation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                description
                  "Calculate backup nexthops for non-best prefix originators";
                uses apply-advanced;
    
                leaf stubs {
                  type empty;
                  description
                    "Per prefix calculation for stubs only";
                }
    
                leaf summary {
                  type empty;
                  description
                    "Per prefix calculation for summary originators only";
                }
    
                leaf externals {
                  type empty;
                  description
                    "Per prefix calculation for externals";
                }
    
                leaf all {
                  type empty;
                  description
                    "Per prefix calculation for all";
                }
              }  // container per-prefix-calculation
    
              leaf node-link-degradation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Degrade to link protection when nodelink protection not available";
              }
            }  // container backup-spf-options
    
            leaf prefix-export-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Maximum number of prefixes that can be exported";
            }
          }  // list topology
    
          container backup-spf-options {
            description
              "Configure options for backup SPF";
            uses apply-advanced;
    
            container remote-backup-calculation {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              presence
                "enable remote-backup-calculation";
              description
                "Calculate Remote LFA backup nexthops";
              uses apply-advanced;
    
              container pq-nodes-nearest-to-source {
                description
                  "PQ nodes selection based upon nearest to source";
                uses apply-advanced;
    
                leaf percent {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "10 .. 100";
                    }
                  }
                  description
                    "Selection percentage for nearest to source";
                }
              }  // container pq-nodes-nearest-to-source
            }  // container remote-backup-calculation
    
            container use-post-convergence-lfa {
              junos:must "("protocols ospf source-packet-routing")";
              junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
              presence
                "enable use-post-convergence-lfa";
              description
                "Calculate post-convergence backup paths";
              uses apply-advanced;
    
              leaf maximum-labels {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 8";
                  }
                }
                description
                  "Maximum number of labels installed for post-convergence paths";
              }
    
              leaf maximum-backup-paths {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 8";
                  }
                }
                description
                  "Maximum number of equal-cost post-convergence paths installed";
              }
            }  // container use-post-convergence-lfa
    
            leaf use-source-packet-routing {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
              junos:must "(!(".. remote-backup-calculation"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options remote-backup-calculation'";
              type empty;
              description
                "Use spring backup paths for inet.0 routes";
            }
    
            leaf disable {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Do not run backup SPF";
            }
    
            leaf no-install {
              type empty;
              description
                "Do not install backup nexthops into the RIB";
            }
    
            leaf downstream-paths-only {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Use only downstream backup paths";
            }
    
            container per-prefix-calculation {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              description
                "Calculate backup nexthops for non-best prefix originators";
              uses apply-advanced;
    
              leaf stubs {
                type empty;
                description
                  "Per prefix calculation for stubs only";
              }
    
              leaf summary {
                type empty;
                description
                  "Per prefix calculation for summary originators only";
              }
    
              leaf externals {
                type empty;
                description
                  "Per prefix calculation for externals";
              }
    
              leaf all {
                type empty;
                description
                  "Per prefix calculation for all";
              }
            }  // container per-prefix-calculation
    
            leaf node-link-degradation {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Degrade to link protection when nodelink protection not available";
            }
          }  // container backup-spf-options
    
          container traffic-engineering {
            presence
              "enable traffic-engineering";
            description
              "Configure traffic engineering attributes";
            uses apply-advanced;
    
            leaf no-topology {
              type empty;
              description
                "Disable dissemination of TE link-state topology information";
            }
    
            leaf multicast-rpf-routes {
              junos:must "(!(".. .. topology $$={ipv4-multicast}"))";
              junos:must-message "multicast-rpf-routes cannot be used with topology ipv4-multicast";
              junos:must "(".. shortcuts")";
              junos:must-message "multicast-rpf-routes cannot be used without shortcuts";
              type empty;
              description
                "Install routes for multicast RPF checks into inet.2";
            }
    
            leaf l3-unicast-topology {
              type empty;
              description
                "Download IGP topology into TED";
            }
    
            container ignore-lsp-metrics {
              presence
                "enable ignore-lsp-metrics";
              description
                "Ignore label-switched path metrics when doing shortcuts";
              uses apply-advanced;
    
              leaf unconfigured-only {
                type empty;
                description
                  "Ignore lsp metrics for unconfigured only";
              }
            }  // container ignore-lsp-metrics
    
            container shortcuts {
              presence "enable shortcuts";
              description
                "Use label-switched paths as next hops, if possible";
              uses apply-advanced;
    
              leaf ignore-lsp-metrics {
                type empty;
                status deprecated;
                description
                  "Ignore label-switched path metrics when doing shortcuts";
              }
    
              leaf lsp-metric-into-summary {
                type empty;
                description
                  "Advertise LSP metric into summary LSAs";
              }
    
              list family {
                key "name";
                ordered-by user;
                description
                  "Address family specific traffic-engineering attributes";
                leaf name {
                  type enumeration {
                    enum "inet" {
                      value 0;
                      description "IPv4 family";
                    }
                    enum "inet-mpls" {
                      value 1;
                      description
                        "IPv4-MPLS family";
                    }
                  }
                }
    
                uses apply-advanced;
              }  // list family
            }  // container shortcuts
    
            leaf advertise-unnumbered-interfaces {
              type empty;
              description
                "Advertise unnumbered interfaces";
            }
    
            leaf credibility-protocol-preference {
              type empty;
              description
                "TED protocol credibility follows protocol preference";
            }
    
            container advertisement {
              description
                "Advertise TE parameters even if RSVP is not turned on";
              uses apply-advanced;
    
              leaf always {
                type empty;
                description
                  "Advertise TE parameters in TE LSAs";
              }
            }  // container advertisement
          }  // container traffic-engineering
    
          container source-packet-routing {
            junos:must "(!(".. .. .. protocols mpls disable"))";
            junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
            junos:must "(".. .. .. protocols mpls ")";
            junos:must-message "SPRING configuration is not allowed without 'protocols mpls'";
            presence
              "enable source-packet-routing";
            description
              "Enable source packet routing (SPRING)";
            uses apply-advanced;
    
            container adjacency-segment {
              description
                "Attributes for adjacency segments in spring";
              uses apply-advanced;
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "180000 .. 900000";
                  }
                }
                description
                  "Retain time of Adjacency segment after isolating from an interface";
              }
            }  // container adjacency-segment
    
            leaf-list prefix-segment {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Prefix Segment policy";
            }
    
            leaf explicit-null {
              type empty;
              description
                "Set E and P bits in all Prefix SID advertisements";
            }
    
            container node-segment {
              presence "enable node-segment";
              description
                "Enable support for Node segments in SPRING";
              uses apply-advanced;
    
              leaf ipv4-index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set ipv4 node segment index";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "32 .. 16385";
                  }
                }
                description
                  "Set range of node segment indices allowed";
              }
            }  // container node-segment
    
            container srgb {
              junos:must "(!(".. node-segment index-range"))";
              junos:must-message "Can not be configured with node-segment index-range";
              description
                "Set the SRGB global block in SPRING";
              leaf start-label {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Start range for SRGB label block";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Index to the SRGB start label block";
              }
            }  // container srgb
    
            leaf mapping-server {
              junos:must "(".. node-segment")";
              junos:must-message "protocols ospf source-packet-routing node-segment must be defined";
              junos:must "("routing-options source-packet-routing mapping-server-entry $$")";
              junos:must-message "Referenced source-packet-routing mapping-server-entry must be defined";
              type string;
              description "Mapping server name";
            }
    
            leaf install-prefix-sid-for-best-route {
              type empty;
              description
                "For best route install a exact prefix sid route";
            }
    
            leaf ldp-stitching {
              type empty;
              description
                "Enable SR to LDP stitching";
            }
    
            leaf-list flex-algorithm {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "128 .. 255";
                }
              }
              max-elements 16;
              description
                "Flex-algorithms we would like to participate in";
            }
          }  // container source-packet-routing
    
          list area {
            key "name";
            ordered-by user;
            description "Configure an OSPF area";
            leaf name {
              type jt:areaid;
              description "Area ID";
            }
    
            uses apply-advanced;
    
            choice stub-option {
              container stub {
                presence "enable stub";
                description
                  "Configure a stub area";
                leaf default-metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777215";
                    }
                  }
                  description
                    "Metric for the default route in this stub area";
                }
    
                choice summaries-choice {
                  leaf summaries {
                    type empty;
                    description
                      "Flood summary LSAs into this stub area";
                  }
                  leaf no-summaries {
                    type empty;
                    description
                      "Don't flood summary LSAs into this stub area";
                  }
                }  // choice summaries-choice
              }  // container stub
              container nssa {
                presence "enable nssa";
                description
                  "Configure a not-so-stubby area";
                uses apply-advanced;
    
                container default-lsa {
                  presence "enable default-lsa";
                  description
                    "Configure a default LSA";
                  uses apply-advanced;
    
                  leaf default-metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 16777215";
                      }
                    }
                    description
                      "Metric for the default route in this area";
                  }
    
                  leaf metric-type {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 2";
                      }
                    }
                    description
                      "External metric type for the default type 7 LSA";
                  }
    
                  leaf type-7 {
                    type empty;
                    description
                      "Flood type 7 default LSA if no-summaries is configured";
                  }
                }  // container default-lsa
    
                leaf default-metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777215";
                    }
                  }
                  status deprecated;
                  description
                    "Metric for the default route in this area";
                }
    
                leaf metric-type {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 2";
                    }
                  }
                  status deprecated;
                  description
                    "External metric type for the default type 7 LSA";
                }
    
                choice summaries-choice {
                  leaf summaries {
                    type empty;
                    description
                      "Flood summary LSAs into this NSSA area";
                  }
                  leaf no-summaries {
                    type empty;
                    description
                      "Don't flood summary LSAs into this NSSA area";
                  }
                }  // choice summaries-choice
    
                list area-range {
                  key "name";
                  ordered-by user;
                  description
                    "Configure NSSA area ranges";
                  leaf name {
                    type jt:ipprefix;
                    description
                      "Range to summarize NSSA routes in this area";
                  }
    
                  uses apply-advanced;
    
                  leaf restrict {
                    type empty;
                    description
                      "Restrict advertisement of this area range";
                  }
    
                  leaf exact {
                    type empty;
                    description
                      "Enforce exact match for advertisement of this area range";
                  }
    
                  container override-metric {
                    presence
                      "enable override-metric";
                    description
                      "Override the dynamic metric for this area-range";
                    uses apply-advanced;
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 16777215";
                        }
                      }
                      description "Metric value";
                    }
    
                    leaf metric-type {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 2";
                        }
                      }
                      default "1";
                      description
                        "Set the metric type for the override metric";
                    }
                  }  // container override-metric
                }  // list area-range
              }  // container nssa
            }  // choice stub-option
    
            list area-range {
              key "name";
              ordered-by user;
              description
                "Configure area ranges";
              leaf name {
                type jt:ipprefix;
                description
                  "Range to summarize routes in this area";
              }
    
              uses apply-advanced;
    
              leaf restrict {
                type empty;
                description
                  "Restrict advertisement of this area range";
              }
    
              leaf exact {
                type empty;
                description
                  "Enforce exact match for advertisement of this area range";
              }
    
              leaf override-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16777215";
                  }
                }
                description
                  "Override the dynamic metric for this area-range";
              }
            }  // list area-range
    
            leaf-list network-summary-export {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Export policy for Type 3 Summary LSAs";
            }
    
            leaf-list network-summary-import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy for Type 3 Summary LSAs";
            }
    
            leaf-list inter-area-prefix-export {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Export policy for Inter Area Prefix LSAs";
            }
    
            leaf-list inter-area-prefix-import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy for Inter Area Prefix LSAs";
            }
    
            leaf authentication-type {
              type enumeration {
                enum "none" {
                  value 0;
                  status deprecated;
                  description
                    "No authentication";
                }
                enum "simple" {
                  value 1;
                  status deprecated;
                  description
                    "Simple password authentication";
                }
                enum "md5" {
                  value 2;
                  status deprecated;
                  description
                    "MD5 authentication";
                }
              }
              status deprecated;
              description "Authentication type";
            }
    
            list virtual-link {
              junos:must "(".. .. area $$={0.0.0.0}")";
              junos:must-message "virtual link can be configured only under backbone area";
              key "neighbor-id transit-area";
              ordered-by user;
              description
                "Configure virtual links";
              leaf neighbor-id {
                type jt:ipv4addr;
                description
                  "Router ID of a virtual neighbor";
              }
    
              leaf transit-area {
                type jt:areaid;
                description
                  "Transit area in common with virtual neighbor";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable this virtual link";
                }
              }  // choice enable-disable
    
              leaf retransmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Retransmission interval (seconds)";
              }
    
              leaf transit-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Transit delay (seconds)";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Hello interval (seconds)";
              }
    
              leaf dead-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Dead interval (seconds)";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 65535";
                  }
                }
                description
                  "Maximum OSPF packet size";
              }
    
              choice auth {
                container authentication {
                  uses juniper-ospf-authentication;
                }  // container authentication
                container authentication-key {
                  status deprecated;
                  description
                    "Authentication key";
                  leaf keyname {
                    type jt:unreadable;
                    description
                      "Authentication key value";
                  }
    
                  leaf key-id {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
                }  // container authentication-key
              }  // choice auth
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              leaf no-neighbor-down-notification {
                type empty;
                description
                  "Don't inform other protocols about neighbor down events";
              }
    
              leaf ipsec-sa {
                junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                junos:must-message "Must not configure ipsec-sa for st0 interface";
                junos:must "("security ipsec security-association $$ manual")";
                junos:must-message "Referenced IPSec security association must be a manual SA";
                junos:must "("security ipsec security-association $$ mode transport")";
                junos:must-message "Referenced IPSec security association must be in transport mode";
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec security association must be defined";
                type string {
                  length "1 .. 32";
                }
                description
                  "IPSec security association name";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list virtual-link
    
            list sham-link-remote {
              key "name";
              ordered-by user;
              description
                "Configure parameters for remote sham link endpoint";
              leaf name {
                junos:must "(!(".. .. .. sham-link local $$"))";
                junos:must-message "Local and remote sham link endpoint addresses must be different";
                junos:must "(".. .. .. sham-link local")";
                junos:must-message "Local sham link endpoint must be configured";
                type jt:ipaddr;
                description
                  "Remote sham link endpoint address";
              }
    
              uses apply-advanced;
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description "Sham link metric";
              }
    
              leaf ipsec-sa {
                junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                junos:must-message "Must not configure ipsec-sa for st0 interface";
                junos:must "("security ipsec security-association $$ manual")";
                junos:must-message "Referenced IPSec security association must be a manual SA";
                junos:must "("security ipsec security-association $$ mode transport")";
                junos:must-message "Referenced IPSec security association must be in transport mode";
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec security association must be defined";
                type string {
                  length "1 .. 32";
                }
                description
                  "IPSec security association name";
              }
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list sham-link-remote
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Include an interface in this area";
              leaf name {
                junos:must "((!(".. interface-type nbma") || (!(("interfaces $$" || any "logical-systems <*> interfaces $$")) || (any "interfaces $$-IFL family inet address <*>" || any "logical-systems <*> interfaces $$-IFL family inet address <*>"))))";
                junos:must-message "IPv4 address must be configured on the interface for nbma mode";
                type union {
                  type jt:ipv4addr-or-interface;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF on this interface";
                }
              }  // choice enable-disable
    
              leaf interface-type {
                type enumeration {
                  enum "nbma" {
                    value 0;
                    description
                      "Nonbroadcast multiaccess";
                  }
                  enum "p2mp" {
                    value 1;
                    description
                      "Point-to-multipoint NBMA";
                  }
                  enum "p2p" {
                    value 2;
                    description "Point-to-point";
                  }
                  enum "p2mp-over-lan" {
                    value 3;
                    description
                      "Point-to-multipoint over LAN mode";
                  }
                }
                description "Type of interface";
              }
    
              choice protection-type {
                leaf link-protection {
                  type empty;
                  description
                    "Protect interface from link faults only";
                }
                leaf node-link-protection {
                  type empty;
                  description
                    "Protect interface from both link and node faults";
                }
              }  // choice protection-type
    
              leaf no-eligible-backup {
                type empty;
                description
                  "Not eligible to backup traffic from protected interfaces";
              }
    
              leaf no-eligible-remote-backup {
                type empty;
                description
                  "Not eligible for Remote-LFA backup traffic from protected interfaces";
              }
    
              container passive {
                presence "enable passive";
                description
                  "Do not run OSPF, but advertise it";
                uses apply-advanced;
    
                container traffic-engineering {
                  description
                    "Advertise TE link information";
                  uses apply-advanced;
    
                  leaf remote-node-id {
                    type jt:ipaddr;
                    description
                      "Remote address of the link";
                  }
    
                  leaf remote-node-router-id {
                    junos:must "(".. remote-node-id")";
                    junos:must-message "remote-node-id must be configured";
                    type jt:ipv4addr;
                    description
                      "TE Router-ID of the remote node";
                  }
                }  // container traffic-engineering
              }  // container passive
    
              leaf secondary {
                junos:must "(!(" .. ipsec-sa"))";
                junos:must-message "secondary interface cannot have ipsec-sa configured";
                junos:must "(!(" .. dynamic-neighbors"))";
                junos:must-message "secondary interface cannot have dynamic-neighbors configured";
                junos:must "(!(" .. neighbor"))";
                junos:must-message "secondary interface cannot have configured neighbors";
                junos:must "(!(" .. interface-type p2mp"))";
                junos:must-message "secondary interface cannot be set as type p2mp";
                junos:must "(!(" .. interface-type nbma"))";
                junos:must-message "secondary interface cannot be set as type nbma";
                junos:must "(!(" .. passive"))";
                junos:must-message "secondary interface cannot be configured passive";
                type empty;
                description
                  "Treat interface as secondary";
              }
    
              leaf own-router-lsa {
                type empty;
                description
                  "Generate a separate router LSA for this interface";
              }
    
              container bandwidth-based-metrics {
                junos:must "(".. metric")";
                junos:must-message "Metric must be configured";
                description
                  "Configure bandwidth based metrics";
                uses apply-advanced;
    
                list bandwidth {
                  key "name";
                  description
                    "Bandwidth threshold";
                  leaf name {
                    type string;
                  }
    
                  leaf metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Metric associated with specified bandwidth";
                  }
                }  // list bandwidth
              }  // container bandwidth-based-metrics
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description "Interface metric";
              }
    
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Designated router priority";
              }
    
              leaf retransmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Retransmission interval (seconds)";
              }
    
              leaf transit-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Transit delay (seconds)";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Hello interval (seconds)";
              }
    
              leaf dead-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Dead interval (seconds)";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 65535";
                  }
                }
                description
                  "Maximum OSPF packet size";
              }
    
              choice auth {
                container authentication {
                  uses juniper-ospf-authentication;
                }  // container authentication
                container authentication-key {
                  status deprecated;
                  description
                    "Authentication key";
                  leaf keyname {
                    type jt:unreadable;
                    description
                      "Authentication key value";
                  }
    
                  leaf key-id {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
                }  // container authentication-key
              }  // choice auth
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              leaf no-neighbor-down-notification {
                type empty;
                description
                  "Don't inform other protocols about neighbor down events";
              }
    
              leaf ipsec-sa {
                junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                junos:must-message "Must not configure ipsec-sa for st0 interface";
                junos:must "("security ipsec security-association $$ manual")";
                junos:must-message "Referenced IPSec security association must be a manual SA";
                junos:must "("security ipsec security-association $$ mode transport")";
                junos:must-message "Referenced IPSec security association must be in transport mode";
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec security association must be defined";
                type string {
                  length "1 .. 32";
                }
                description
                  "IPSec security association name";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
    
              leaf transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                status deprecated;
                description
                  "OSPF packet transmit interval (milliseconds)";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
    
                leaf full-neighbors-only {
                  type empty;
                  description
                    "Setup BFD sessions only to Full neighbors";
                }
    
                leaf holddown-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to hold the session-UP notification to the client";
                }
              }  // container bfd-liveness-detection
    
              leaf dynamic-neighbors {
                junos:must "(" .. interface-type p2mp")";
                junos:must-message "dynamic-neighbors option can be set only if the interface type is p2mp";
                type empty;
                description
                  "Learn neighbors dynamically on a p2mp interface";
              }
    
              leaf no-advertise-adjacency-segment {
                type empty;
                description
                  "Do not advertise an adjacency segment for this interface";
              }
    
              list neighbor {
                junos:must "(!(" .. dynamic-neighbors"))";
                junos:must-message "Neighbors cannot be specified manually if dynamic-neighbors is set";
                key "name";
                ordered-by user;
                description "NBMA neighbor";
                leaf name {
                  type jt:ipaddr;
                  description
                    "Address of neighbor";
                }
    
                leaf eligible {
                  type empty;
                  description
                    "Eligible to be DR on an NBMA network";
                }
              }  // list neighbor
    
              leaf poll-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Poll interval for NBMA interfaces";
              }
    
              leaf no-interface-state-traps {
                type empty;
                description
                  "Do not send interface state change traps";
              }
    
              leaf strict-bfd {
                junos:must "(" .. bfd-liveness-detection")";
                junos:must-message "strict bfd cannot be configured without bfd.";
                junos:must "(!(" .. bfd-liveness-detection full-neighbors-only"))";
                junos:must-message "full-neighbors-only and strict-bfd cannot be configured together";
                type empty;
                description
                  "Enable strict bfd over this interface";
              }
    
              container post-convergence-lfa {
                junos:must "("protocols ospf backup-spf-options use-post-convergence-lfa")";
                junos:must-message "Not allowed without 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                presence
                  "enable post-convergence-lfa";
                description
                  "Protect interface using post-convergence backup path";
                uses apply-advanced;
    
                container node-protection {
                  presence
                    "enable node-protection";
                  description
                    "Compute backup path assuming node failure";
                  uses apply-advanced;
    
                  leaf cost {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Cost for node protection";
                  }
                }  // container node-protection
    
                leaf srlg-protection {
                  type empty;
                  description
                    "Compute backup path assuming SRLG failure";
                }
    
                leaf fate-sharing-protection {
                  type empty;
                  description
                    "Compute backup path assuming fate-sharing group failure";
                }
              }  // container post-convergence-lfa
    
              leaf te-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Traffic engineering metric";
              }
    
              container ldp-synchronization {
                presence
                  "enable ldp-synchronization";
                description
                  "Advertise maximum metric until LDP is operational";
                uses ldp-sync-obj;
              }  // container ldp-synchronization
    
              container ipv4-adjacency-segment {
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                description
                  "Configure ipv4 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  description
                    "Adjacency SID is eligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container protected
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container unprotected
              }  // container ipv4-adjacency-segment
    
              list lan-neighbor {
                junos:must "(!(".. ipv4-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if ipv4-adjacency-segment is configured in the same interface";
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if no-advertise-adjacency-segment is configured in the same interface ";
                junos:must "(!(".. interface-type p2p"))";
                junos:must-message "lan-neighbor can't be configured for point-to-point interfaces";
                key "name";
                ordered-by user;
                description
                  "Configuration specific to a LAN neighbor";
                leaf name {
                  type jt:ipaddr;
                  description
                    "Address of neighbor";
                }
    
                uses apply-advanced;
    
                container ipv4-adjacency-segment {
                  junos:must "(!(".. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                  description
                    "Configure ipv4 adjacency segment";
                  uses apply-advanced;
    
                  container protected {
                    description
                      "Adjacency SID is eligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container protected
    
                  container unprotected {
                    description
                      "Adjacency SID uneligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container unprotected
                }  // container ipv4-adjacency-segment
              }  // list lan-neighbor
            }  // list interface
    
            leaf no-context-identifier-advertisement {
              junos:must "(!(".. context-identifier"))";
              junos:must-message "no-context-identifier-advertisement and context-identifier attributes are mutually exclusive";
              type empty;
              description
                "Disable context identifier advertisments in this area";
            }
    
            list peer-interface {
              key "name";
              ordered-by user;
              description
                "Configuration for peer interface";
              leaf name {
                type string;
                description
                  "Name of peer interface";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF on this control peer";
                }
              }  // choice enable-disable
    
              leaf retransmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Retransmission interval (seconds)";
              }
    
              leaf transit-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Transit delay (seconds)";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Hello interval (seconds)";
              }
    
              leaf dead-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Dead interval (seconds)";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 65535";
                  }
                }
                description
                  "Maximum OSPF packet size";
              }
    
              choice auth {
                container authentication {
                  uses juniper-ospf-authentication;
                }  // container authentication
                container authentication-key {
                  status deprecated;
                  description
                    "Authentication key";
                  leaf keyname {
                    type jt:unreadable;
                    description
                      "Authentication key value";
                  }
    
                  leaf key-id {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
                }  // container authentication-key
              }  // choice auth
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              leaf no-neighbor-down-notification {
                type empty;
                description
                  "Don't inform other protocols about neighbor down events";
              }
            }  // list peer-interface
    
            leaf no-source-packet-routing {
              type empty;
              description
                "Disable SPRING in this area";
            }
    
            list context-identifier {
              junos:must "(!(".. no-context-identifier-advertisement"))";
              junos:must-message "no-context-identifier-advertisement and context-identifier attributes are mutually exclusive";
              key "name";
              ordered-by user;
              description
                "Configure context identifier in support of edge protection";
              leaf name {
                type jt:ipv4addr;
                description "Context identifier";
              }
    
              uses apply-advanced;
            }  // list context-identifier
    
            list label-switched-path {
              junos:must "(!(".. .. traffic-engineering multicast-rpf-routes"))";
              junos:must-message "cannot advertise LSPs when using multicast-rpf-routes";
              key "name";
              ordered-by user;
              description
                "Configuration for advertisement of a label-switched path";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of label-switched path to be advertised";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF on this label-switched path";
                }
              }  // choice enable-disable
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description "Interface metric";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list label-switched-path
          }  // list area
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable OSPF";
            }
          }  // choice enable-disable
    
          container traceoptions {
            description "Trace options for OSPF";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "spf" {
                    value 0;
                    description
                      "Trace SPF calculations";
                  }
                  enum "error" {
                    value 1;
                    description
                      "Trace errored packets";
                  }
                  enum "event" {
                    value 2;
                    description
                      "Trace OSPF state machine events";
                  }
                  enum "packet-dump" {
                    value 3;
                    description
                      "Dump the contents of selected packet types";
                  }
                  enum "flooding" {
                    value 4;
                    description
                      "Trace LSA flooding";
                  }
                  enum "lsa-analysis" {
                    value 5;
                    description
                      "Trace LSA analysis";
                  }
                  enum "packets" {
                    value 6;
                    description
                      "Trace all OSPF packets";
                  }
                  enum "hello" {
                    value 7;
                    description
                      "Trace hello packets";
                  }
                  enum "database-description" {
                    value 8;
                    description
                      "Trace database description packets";
                  }
                  enum "lsa-request" {
                    value 9;
                    description
                      "Trace LSA request packets";
                  }
                  enum "lsa-update" {
                    value 10;
                    description
                      "Trace LSA update packets";
                  }
                  enum "lsa-ack" {
                    value 11;
                    description
                      "Trace LSA acknowledgment packets";
                  }
                  enum "ldp-synchronization" {
                    value 12;
                    description
                      "Trace synchronization between OSPF and LDP";
                  }
                  enum "on-demand" {
                    value 13;
                    description
                      "Trace demand circuit extensions";
                  }
                  enum "nsr-synchronization" {
                    value 14;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "graceful-restart" {
                    value 15;
                    description
                      "Trace graceful restart";
                  }
                  enum "restart-signaling" {
                    value 16;
                    description
                      "Trace restart signaling";
                  }
                  enum "backup-spf" {
                    value 17;
                    description
                      "Trace backup SPF (LFA) specific events";
                  }
                  enum "source-packet-routing" {
                    value 18;
                    description
                      "Trace source packet routing (SPRING) events";
                  }
                  enum "post-convergence-lfa" {
                    value 19;
                    description
                      "Trace post-convergence-lfa related events";
                  }
                  enum "flex-algorithm" {
                    value 20;
                    description
                      "Trace flex-algorithm related events";
                  }
                  enum "route" {
                    value 21;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 22;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 23;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 24;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 25;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 26;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 27;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 28;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          container spf-options {
            description
              "Configure options for SPF";
            uses apply-advanced;
    
            leaf delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "50 .. 8000";
                }
              }
              units "milliseconds";
              description
                "Time to wait before running an SPF";
            }
    
            leaf holddown {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2000 .. 20000";
                }
              }
              units "milliseconds";
              description
                "Time to hold down before running an SPF";
            }
    
            leaf rapid-runs {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 10";
                }
              }
              description
                "Number of maximum rapid SPF runs before holddown";
            }
    
            leaf no-ignore-our-externals {
              type empty;
              description
                "Do not ignore self-generated external and NSSA LSAs";
            }
          }  // container spf-options
    
          leaf prefix-export-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 4294967295";
              }
            }
            description
              "Maximum number of prefixes that can be exported";
          }
    
          container rib-groups {
            description
              "Routing table groups for importing OSPF routes";
            uses apply-advanced;
    
            leaf inet {
              junos:must "("routing-options rib-groups $$")";
              junos:must-message "Referenced rib-groups must be defined";
              junos:must "(!(".. topology $$={default} rib-group"))";
              junos:must-message "rib-group cannot be used with topology default rib-group";
              type string;
              description
                "Name of the IPv4/v6 routing table group";
            }
    
            leaf inet3 {
              junos:must "("routing-options rib-groups $$")";
              junos:must-message "Referenced rib-groups must be defined";
              junos:must "(!(".. topology $$={default} rib-group"))";
              junos:must-message "rib-group cannot be used with topology default rib-group";
              type string;
              description
                "Name of the IPv4/v6 inet.3 routing table group";
            }
          }  // container rib-groups
    
          leaf job-stats {
            type empty;
            description "Collect job statistics";
          }
    
          container overload {
            presence "enable overload";
            description
              "Set the overload mode (repel transit traffic)";
            uses apply-advanced;
    
            leaf timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 3600";
                }
              }
              units "seconds";
              description
                "Time after which overload mode is reset";
            }
    
            leaf allow-route-leaking {
              type empty;
              description
                "Allow routes to be leaked when overload is configured";
            }
    
            leaf stub-network {
              type empty;
              description
                "Advertise Stub Network with maximum metric";
            }
    
            leaf intra-area-prefix {
              type empty;
              description
                "Advertise Intra Area Prefix with maximum metric";
            }
    
            leaf as-external {
              type empty;
              description
                "Advertise As External with maximum usable metric";
            }
          }  // container overload
    
          container database-protection {
            presence
              "enable database-protection";
            description
              "Configure database protection attributes";
            uses apply-advanced;
    
            leaf maximum-lsa {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1000000";
                }
              }
              description
                "Maximum allowed non self-generated LSAs";
            }
    
            leaf warning-only {
              type empty;
              description
                "Emit only a warning when LSA maximum limit is exceeded";
            }
    
            leaf warning-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "30 .. 100";
                }
              }
              units "percent";
              description
                "Percentage of LSA maximum above which to trigger warning";
            }
    
            leaf ignore-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 32";
                }
              }
              description
                "Maximum number of times to go into ignore state";
            }
    
            leaf ignore-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "30 .. 3600";
                }
              }
              units "seconds";
              description
                "Time to stay in ignore state and ignore all neighbors";
            }
    
            leaf reset-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 86400";
                }
              }
              units "seconds";
              description
                "Time after which the ignore count gets reset to zero";
            }
          }  // container database-protection
    
          container graceful-restart {
            description
              "Configure graceful restart attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable OSPF graceful restart capability";
              }
            }  // choice enable-disable
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              units "seconds";
              description
                "Time for all neighbors to become full";
            }
    
            leaf notify-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              units "seconds";
              description
                "Time to send all max-aged grace LSAs";
            }
    
            container helper-disable {
              presence "enable helper-disable";
              description
                "Disable graceful restart helper capability";
              uses apply-advanced;
    
              choice disable-choices {
                leaf standard {
                  type empty;
                  description
                    "Disable helper-mode for rfc3623 based GR";
                }
                leaf restart-signaling {
                  type empty;
                  description
                    "Disable helper mode for restart-signaling ";
                }
                leaf both {
                  type empty;
                  description
                    "Disable helper mode for both the types of GR";
                }
              }  // choice disable-choices
            }  // container helper-disable
    
            leaf no-strict-lsa-checking {
              junos:must "(!(".. helper-disable"))";
              junos:must-message "To configure no-strict-lsa-checking, helper-disable must not be set";
              type empty;
              description
                "Do not abort graceful helper mode upon LSA changes";
            }
          }  // container graceful-restart
    
          leaf route-type-community {
            type enumeration {
              enum "iana" {
                value 0;
                description
                  "BGP extended community value used is 0x0306";
              }
              enum "vendor" {
                value 1;
                description
                  "Vendor BGP extended community value used is 0x8000";
              }
            }
            description
              "Specify BGP extended community value to encode OSPF route type";
          }
    
          container domain-id {
            description "Configure domain ID";
            choice domain_id_or_disable {
              leaf domain-id {
                type string;
                description "Domain ID";
              }
              leaf disable {
                type empty;
                description "Disable domain ID";
              }
            }  // choice domain_id_or_disable
          }  // container domain-id
    
          choice domain_vpn_tag_or_disable {
            leaf domain-vpn-tag {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Domain VPN tag for external LSA";
            }
            leaf no-domain-vpn-tag {
              type empty;
              description
                "Disable domain VPN tag";
            }
          }  // choice domain_vpn_tag_or_disable
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of internal routes";
          }
    
          leaf external-preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of external routes";
          }
    
          leaf labeled-preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of labeled routes";
          }
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Import policy (for external routes or setting priority)";
          }
    
          leaf reference-bandwidth {
            type string;
            description
              "Bandwidth for calculating metric defaults";
          }
    
          leaf lsa-refresh-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "25 .. 50";
              }
            }
            default "50";
            description
              "LSA refresh interval (minutes)";
          }
    
          leaf spf-delay {
            junos:must "(!(".. spf-options delay"))";
            junos:must-message "You can only configure either spf-delay or delay under spf-options";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "50 .. 8000";
              }
            }
            units "milliseconds";
            status deprecated;
            description
              "Time to wait before running an SPF";
          }
    
          leaf no-rfc-1583 {
            type empty;
            description
              "Disable RFC1583 compatibility";
          }
    
          leaf forwarding-address-to-broadcast {
            type empty;
            description
              "Set forwarding address in Type 5 LSA in broadcast network";
          }
    
          choice nssa-abr-option {
            leaf no-nssa-abr {
              type empty;
              description
                "Disable full NSSA functionality at ABR";
            }
          }  // choice nssa-abr-option
    
          container sham-link {
            presence "enable sham-link";
            description
              "Configure parameters for sham links";
            uses apply-advanced;
    
            leaf local {
              type jt:ipaddr;
              description
                "Local sham link endpoint address";
            }
    
            leaf no-advertise-local {
              type empty;
              status deprecated;
              description
                "Don't advertise local sham link endpoint as stub in router LSA";
            }
          }  // container sham-link
        }  // grouping juniper-protocols-ospf
    
        grouping juniper-ospf-authentication {
          description
            "Authentication information";
          uses apply-advanced;
    
          choice authentication-type {
            leaf simple-password {
              type jt:unreadable;
              description "Authentication key";
            }
            list md5 {
              key "name";
              ordered-by user;
              description
                "MD5 authentication key";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Key ID for MD5 authentication";
              }
    
              leaf key {
                type jt:unreadable;
                description
                  "MD5 authentication key value";
              }
    
              leaf start-time {
                type jt:time;
                description
                  "Start time for key transmission (YYYY-MM-DD.HH:MM)";
              }
            }  // list md5
          }  // choice authentication-type
        }  // grouping juniper-ospf-authentication
    
        grouping juniper-protocols-ospf3 {
          list realm {
            key "name";
            ordered-by user;
            description
              "OSPFv3 realm configuration";
            leaf name {
              type enumeration {
                enum "ipv6-unicast" {
                  value 0;
                  description
                    "IPv6 unicast realm";
                }
                enum "ipv6-multicast" {
                  value 1;
                  description
                    "IPv6 multicast realm";
                }
                enum "ipv4-unicast" {
                  value 2;
                  description
                    "IPv4 unicast realm";
                }
                enum "ipv4-multicast" {
                  value 3;
                  description
                    "IPv4 multicast realm";
                }
              }
              description "OSPFv3 realm name";
            }
    
            uses apply-advanced;
    
            list topology {
              key "name";
              ordered-by user;
              description "Topology parameters";
              leaf name {
                type string;
                description "Topology name";
              }
    
              uses apply-advanced;
    
              leaf disable {
                type empty;
                description
                  "Disable this topology";
              }
    
              leaf topology-id {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "32 .. 127";
                  }
                }
                description
                  "Topology identifier";
              }
    
              leaf overload {
                type empty;
                description
                  "Set the overload mode (repel transit traffic)";
              }
    
              leaf rib-group {
                junos:must "("routing-options rib-groups $$")";
                junos:must-message "Referenced rib-group must be defined";
                type string;
                description
                  "Routing table group for importing routes";
              }
    
              container spf-options {
                description
                  "Configure options for SPF";
                uses apply-advanced;
    
                leaf delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "50 .. 8000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to wait before running an SPF";
                }
    
                leaf holddown {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2000 .. 20000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to hold down before running an SPF";
                }
    
                leaf rapid-runs {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 10";
                    }
                  }
                  description
                    "Number of maximum rapid SPF runs before holddown";
                }
    
                leaf no-ignore-our-externals {
                  type empty;
                  description
                    "Do not ignore self-generated external and NSSA LSAs";
                }
              }  // container spf-options
    
              container backup-spf-options {
                description
                  "Configure options for backup SPF";
                uses apply-advanced;
    
                container remote-backup-calculation {
                  junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                  junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                  presence
                    "enable remote-backup-calculation";
                  description
                    "Calculate Remote LFA backup nexthops";
                  uses apply-advanced;
    
                  container pq-nodes-nearest-to-source {
                    description
                      "PQ nodes selection based upon nearest to source";
                    uses apply-advanced;
    
                    leaf percent {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "10 .. 100";
                        }
                      }
                      description
                        "Selection percentage for nearest to source";
                    }
                  }  // container pq-nodes-nearest-to-source
                }  // container remote-backup-calculation
    
                container use-post-convergence-lfa {
                  junos:must "("protocols ospf source-packet-routing")";
                  junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                  presence
                    "enable use-post-convergence-lfa";
                  description
                    "Calculate post-convergence backup paths";
                  uses apply-advanced;
    
                  leaf maximum-labels {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "2 .. 8";
                      }
                    }
                    description
                      "Maximum number of labels installed for post-convergence paths";
                  }
    
                  leaf maximum-backup-paths {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 8";
                      }
                    }
                    description
                      "Maximum number of equal-cost post-convergence paths installed";
                  }
                }  // container use-post-convergence-lfa
    
                leaf use-source-packet-routing {
                  junos:must "(".. .. source-packet-routing")";
                  junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                  junos:must "(!(".. remote-backup-calculation"))";
                  junos:must-message "Not allowed with 'protocols ospf backup-spf-options remote-backup-calculation'";
                  type empty;
                  description
                    "Use spring backup paths for inet.0 routes";
                }
    
                leaf disable {
                  junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                  junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                  type empty;
                  description
                    "Do not run backup SPF";
                }
    
                leaf no-install {
                  type empty;
                  description
                    "Do not install backup nexthops into the RIB";
                }
    
                leaf downstream-paths-only {
                  junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                  junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                  type empty;
                  description
                    "Use only downstream backup paths";
                }
    
                container per-prefix-calculation {
                  junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                  junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                  description
                    "Calculate backup nexthops for non-best prefix originators";
                  uses apply-advanced;
    
                  leaf stubs {
                    type empty;
                    description
                      "Per prefix calculation for stubs only";
                  }
    
                  leaf summary {
                    type empty;
                    description
                      "Per prefix calculation for summary originators only";
                  }
    
                  leaf externals {
                    type empty;
                    description
                      "Per prefix calculation for externals";
                  }
    
                  leaf all {
                    type empty;
                    description
                      "Per prefix calculation for all";
                  }
                }  // container per-prefix-calculation
    
                leaf node-link-degradation {
                  junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                  junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                  type empty;
                  description
                    "Degrade to link protection when nodelink protection not available";
                }
              }  // container backup-spf-options
    
              leaf prefix-export-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 4294967295";
                  }
                }
                description
                  "Maximum number of prefixes that can be exported";
              }
            }  // list topology
    
            container backup-spf-options {
              description
                "Configure options for backup SPF";
              uses apply-advanced;
    
              container remote-backup-calculation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                presence
                  "enable remote-backup-calculation";
                description
                  "Calculate Remote LFA backup nexthops";
                uses apply-advanced;
    
                container pq-nodes-nearest-to-source {
                  description
                    "PQ nodes selection based upon nearest to source";
                  uses apply-advanced;
    
                  leaf percent {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "10 .. 100";
                      }
                    }
                    description
                      "Selection percentage for nearest to source";
                  }
                }  // container pq-nodes-nearest-to-source
              }  // container remote-backup-calculation
    
              container use-post-convergence-lfa {
                junos:must "("protocols ospf source-packet-routing")";
                junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                presence
                  "enable use-post-convergence-lfa";
                description
                  "Calculate post-convergence backup paths";
                uses apply-advanced;
    
                leaf maximum-labels {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 8";
                    }
                  }
                  description
                    "Maximum number of labels installed for post-convergence paths";
                }
    
                leaf maximum-backup-paths {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 8";
                    }
                  }
                  description
                    "Maximum number of equal-cost post-convergence paths installed";
                }
              }  // container use-post-convergence-lfa
    
              leaf use-source-packet-routing {
                junos:must "(".. .. source-packet-routing")";
                junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                junos:must "(!(".. remote-backup-calculation"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options remote-backup-calculation'";
                type empty;
                description
                  "Use spring backup paths for inet.0 routes";
              }
    
              leaf disable {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Do not run backup SPF";
              }
    
              leaf no-install {
                type empty;
                description
                  "Do not install backup nexthops into the RIB";
              }
    
              leaf downstream-paths-only {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Use only downstream backup paths";
              }
    
              container per-prefix-calculation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                description
                  "Calculate backup nexthops for non-best prefix originators";
                uses apply-advanced;
    
                leaf stubs {
                  type empty;
                  description
                    "Per prefix calculation for stubs only";
                }
    
                leaf summary {
                  type empty;
                  description
                    "Per prefix calculation for summary originators only";
                }
    
                leaf externals {
                  type empty;
                  description
                    "Per prefix calculation for externals";
                }
    
                leaf all {
                  type empty;
                  description
                    "Per prefix calculation for all";
                }
              }  // container per-prefix-calculation
    
              leaf node-link-degradation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Degrade to link protection when nodelink protection not available";
              }
            }  // container backup-spf-options
    
            container traffic-engineering {
              presence
                "enable traffic-engineering";
              description
                "Configure traffic engineering attributes";
              uses apply-advanced;
    
              leaf no-topology {
                type empty;
                description
                  "Disable dissemination of TE link-state topology information";
              }
    
              leaf multicast-rpf-routes {
                junos:must "(!(".. .. topology $$={ipv4-multicast}"))";
                junos:must-message "multicast-rpf-routes cannot be used with topology ipv4-multicast";
                junos:must "(".. shortcuts")";
                junos:must-message "multicast-rpf-routes cannot be used without shortcuts";
                type empty;
                description
                  "Install routes for multicast RPF checks into inet.2";
              }
    
              leaf l3-unicast-topology {
                type empty;
                description
                  "Download IGP topology into TED";
              }
    
              container ignore-lsp-metrics {
                presence
                  "enable ignore-lsp-metrics";
                description
                  "Ignore label-switched path metrics when doing shortcuts";
                uses apply-advanced;
    
                leaf unconfigured-only {
                  type empty;
                  description
                    "Ignore lsp metrics for unconfigured only";
                }
              }  // container ignore-lsp-metrics
    
              container shortcuts {
                presence "enable shortcuts";
                description
                  "Use label-switched paths as next hops, if possible";
                uses apply-advanced;
    
                leaf ignore-lsp-metrics {
                  type empty;
                  status deprecated;
                  description
                    "Ignore label-switched path metrics when doing shortcuts";
                }
    
                leaf lsp-metric-into-summary {
                  type empty;
                  description
                    "Advertise LSP metric into summary LSAs";
                }
    
                list family {
                  key "name";
                  ordered-by user;
                  description
                    "Address family specific traffic-engineering attributes";
                  leaf name {
                    type enumeration {
                      enum "inet" {
                        value 0;
                        description
                          "IPv4 family";
                      }
                      enum "inet-mpls" {
                        value 1;
                        description
                          "IPv4-MPLS family";
                      }
                    }
                  }
    
                  uses apply-advanced;
                }  // list family
              }  // container shortcuts
    
              leaf advertise-unnumbered-interfaces {
                type empty;
                description
                  "Advertise unnumbered interfaces";
              }
    
              leaf credibility-protocol-preference {
                type empty;
                description
                  "TED protocol credibility follows protocol preference";
              }
    
              container advertisement {
                description
                  "Advertise TE parameters even if RSVP is not turned on";
                uses apply-advanced;
    
                leaf always {
                  type empty;
                  description
                    "Advertise TE parameters in TE LSAs";
                }
              }  // container advertisement
            }  // container traffic-engineering
    
            container source-packet-routing {
              junos:must "(!(".. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              junos:must "(".. .. .. protocols mpls ")";
              junos:must-message "SPRING configuration is not allowed without 'protocols mpls'";
              presence
                "enable source-packet-routing";
              description
                "Enable source packet routing (SPRING)";
              uses apply-advanced;
    
              container adjacency-segment {
                description
                  "Attributes for adjacency segments in spring";
                uses apply-advanced;
    
                leaf hold-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "180000 .. 900000";
                    }
                  }
                  description
                    "Retain time of Adjacency segment after isolating from an interface";
                }
              }  // container adjacency-segment
    
              leaf-list prefix-segment {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Prefix Segment policy";
              }
    
              leaf explicit-null {
                type empty;
                description
                  "Set E and P bits in all Prefix SID advertisements";
              }
    
              container node-segment {
                presence "enable node-segment";
                description
                  "Enable support for Node segments in SPRING";
                uses apply-advanced;
    
                leaf ipv4-index {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 199999";
                    }
                  }
                  description
                    "Set ipv4 node segment index";
                }
    
                leaf index-range {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "32 .. 16385";
                    }
                  }
                  description
                    "Set range of node segment indices allowed";
                }
              }  // container node-segment
    
              container srgb {
                junos:must "(!(".. node-segment index-range"))";
                junos:must-message "Can not be configured with node-segment index-range";
                description
                  "Set the SRGB global block in SPRING";
                leaf start-label {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32;
                  }
                  description
                    "Start range for SRGB label block";
                }
    
                leaf index-range {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32;
                  }
                  description
                    "Index to the SRGB start label block";
                }
              }  // container srgb
    
              leaf mapping-server {
                junos:must "(".. node-segment")";
                junos:must-message "protocols ospf source-packet-routing node-segment must be defined";
                junos:must "("routing-options source-packet-routing mapping-server-entry $$")";
                junos:must-message "Referenced source-packet-routing mapping-server-entry must be defined";
                type string;
                description
                  "Mapping server name";
              }
    
              leaf install-prefix-sid-for-best-route {
                type empty;
                description
                  "For best route install a exact prefix sid route";
              }
    
              leaf ldp-stitching {
                type empty;
                description
                  "Enable SR to LDP stitching";
              }
    
              leaf-list flex-algorithm {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 255";
                  }
                }
                max-elements 16;
                description
                  "Flex-algorithms we would like to participate in";
              }
            }  // container source-packet-routing
    
            list area {
              key "name";
              ordered-by user;
              description
                "Configure an OSPF area";
              leaf name {
                type jt:areaid;
                description "Area ID";
              }
    
              uses apply-advanced;
    
              choice stub-option {
                container stub {
                  presence "enable stub";
                  description
                    "Configure a stub area";
                  leaf default-metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 16777215";
                      }
                    }
                    description
                      "Metric for the default route in this stub area";
                  }
    
                  choice summaries-choice {
                    leaf summaries {
                      type empty;
                      description
                        "Flood summary LSAs into this stub area";
                    }
                    leaf no-summaries {
                      type empty;
                      description
                        "Don't flood summary LSAs into this stub area";
                    }
                  }  // choice summaries-choice
                }  // container stub
                container nssa {
                  presence "enable nssa";
                  description
                    "Configure a not-so-stubby area";
                  uses apply-advanced;
    
                  container default-lsa {
                    presence
                      "enable default-lsa";
                    description
                      "Configure a default LSA";
                    uses apply-advanced;
    
                    leaf default-metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 16777215";
                        }
                      }
                      description
                        "Metric for the default route in this area";
                    }
    
                    leaf metric-type {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 2";
                        }
                      }
                      description
                        "External metric type for the default type 7 LSA";
                    }
    
                    leaf type-7 {
                      type empty;
                      description
                        "Flood type 7 default LSA if no-summaries is configured";
                    }
                  }  // container default-lsa
    
                  leaf default-metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 16777215";
                      }
                    }
                    status deprecated;
                    description
                      "Metric for the default route in this area";
                  }
    
                  leaf metric-type {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 2";
                      }
                    }
                    status deprecated;
                    description
                      "External metric type for the default type 7 LSA";
                  }
    
                  choice summaries-choice {
                    leaf summaries {
                      type empty;
                      description
                        "Flood summary LSAs into this NSSA area";
                    }
                    leaf no-summaries {
                      type empty;
                      description
                        "Don't flood summary LSAs into this NSSA area";
                    }
                  }  // choice summaries-choice
    
                  list area-range {
                    key "name";
                    ordered-by user;
                    description
                      "Configure NSSA area ranges";
                    leaf name {
                      type jt:ipprefix;
                      description
                        "Range to summarize NSSA routes in this area";
                    }
    
                    uses apply-advanced;
    
                    leaf restrict {
                      type empty;
                      description
                        "Restrict advertisement of this area range";
                    }
    
                    leaf exact {
                      type empty;
                      description
                        "Enforce exact match for advertisement of this area range";
                    }
    
                    container override-metric {
                      presence
                        "enable override-metric";
                      description
                        "Override the dynamic metric for this area-range";
                      uses apply-advanced;
    
                      leaf metric {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "1 .. 16777215";
                          }
                        }
                        description
                          "Metric value";
                      }
    
                      leaf metric-type {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "1 .. 2";
                          }
                        }
                        default "1";
                        description
                          "Set the metric type for the override metric";
                      }
                    }  // container override-metric
                  }  // list area-range
                }  // container nssa
              }  // choice stub-option
    
              list area-range {
                key "name";
                ordered-by user;
                description
                  "Configure area ranges";
                leaf name {
                  type jt:ipprefix;
                  description
                    "Range to summarize routes in this area";
                }
    
                uses apply-advanced;
    
                leaf restrict {
                  type empty;
                  description
                    "Restrict advertisement of this area range";
                }
    
                leaf exact {
                  type empty;
                  description
                    "Enforce exact match for advertisement of this area range";
                }
    
                leaf override-metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777215";
                    }
                  }
                  description
                    "Override the dynamic metric for this area-range";
                }
              }  // list area-range
    
              leaf-list network-summary-export {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Export policy for Type 3 Summary LSAs";
              }
    
              leaf-list network-summary-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for Type 3 Summary LSAs";
              }
    
              leaf-list inter-area-prefix-export {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Export policy for Inter Area Prefix LSAs";
              }
    
              leaf-list inter-area-prefix-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for Inter Area Prefix LSAs";
              }
    
              leaf authentication-type {
                type enumeration {
                  enum "none" {
                    value 0;
                    status deprecated;
                    description
                      "No authentication";
                  }
                  enum "simple" {
                    value 1;
                    status deprecated;
                    description
                      "Simple password authentication";
                  }
                  enum "md5" {
                    value 2;
                    status deprecated;
                    description
                      "MD5 authentication";
                  }
                }
                status deprecated;
                description
                  "Authentication type";
              }
    
              list virtual-link {
                junos:must "(".. .. area $$={0.0.0.0}")";
                junos:must-message "virtual link can be configured only under backbone area";
                key "neighbor-id transit-area";
                ordered-by user;
                description
                  "Configure virtual links";
                leaf neighbor-id {
                  type jt:ipv4addr;
                  description
                    "Router ID of a virtual neighbor";
                }
    
                leaf transit-area {
                  type jt:areaid;
                  description
                    "Transit area in common with virtual neighbor";
                }
    
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable this virtual link";
                  }
                }  // choice enable-disable
    
                leaf retransmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Retransmission interval (seconds)";
                }
    
                leaf transit-delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Transit delay (seconds)";
                }
    
                leaf hello-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Hello interval (seconds)";
                }
    
                leaf dead-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Dead interval (seconds)";
                }
    
                leaf mtu {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "128 .. 65535";
                    }
                  }
                  description
                    "Maximum OSPF packet size";
                }
    
                choice auth {
                  container authentication {
                    uses juniper-ospf-authentication;
                  }  // container authentication
                  container authentication-key {
                    status deprecated;
                    description
                      "Authentication key";
                    leaf keyname {
                      type jt:unreadable;
                      description
                        "Authentication key value";
                    }
    
                    leaf key-id {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 255";
                        }
                      }
                      description
                        "Key ID for MD5 authentication";
                    }
                  }  // container authentication-key
                }  // choice auth
    
                leaf demand-circuit {
                  type empty;
                  description
                    "Interface functions as a demand circuit";
                }
    
                leaf flood-reduction {
                  type empty;
                  description
                    "Enable flood reduction";
                }
    
                leaf no-neighbor-down-notification {
                  type empty;
                  description
                    "Don't inform other protocols about neighbor down events";
                }
    
                leaf ipsec-sa {
                  junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                  junos:must-message "Must not configure ipsec-sa for st0 interface";
                  junos:must "("security ipsec security-association $$ manual")";
                  junos:must-message "Referenced IPSec security association must be a manual SA";
                  junos:must "("security ipsec security-association $$ mode transport")";
                  junos:must-message "Referenced IPSec security association must be in transport mode";
                  junos:must "("security ipsec security-association $$")";
                  junos:must-message "Referenced IPSec security association must be defined";
                  type string {
                    length "1 .. 32";
                  }
                  description
                    "IPSec security association name";
                }
    
                list topology {
                  key "name";
                  ordered-by user;
                  description
                    "Topology specific attributes";
                  leaf name {
                    type string;
                    description "Topology name";
                  }
    
                  uses apply-advanced;
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this topology";
                  }
    
                  leaf metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Topology metric";
                  }
    
                  container bandwidth-based-metrics {
                    junos:must "(".. metric")";
                    junos:must-message "Metric must be configured";
                    description
                      "Configure bandwidth based metrics";
                    uses apply-advanced;
    
                    list bandwidth {
                      key "name";
                      description
                        "Bandwidth threshold";
                      leaf name {
                        type string;
                      }
    
                      leaf metric {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint16 {
                            range "1 .. 65535";
                          }
                        }
                        description
                          "Metric associated with specified bandwidth";
                      }
                    }  // list bandwidth
                  }  // container bandwidth-based-metrics
                }  // list topology
              }  // list virtual-link
    
              list sham-link-remote {
                key "name";
                ordered-by user;
                description
                  "Configure parameters for remote sham link endpoint";
                leaf name {
                  junos:must "(!(".. .. .. sham-link local $$"))";
                  junos:must-message "Local and remote sham link endpoint addresses must be different";
                  junos:must "(".. .. .. sham-link local")";
                  junos:must-message "Local sham link endpoint must be configured";
                  type jt:ipaddr;
                  description
                    "Remote sham link endpoint address";
                }
    
                uses apply-advanced;
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Sham link metric";
                }
    
                leaf ipsec-sa {
                  junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                  junos:must-message "Must not configure ipsec-sa for st0 interface";
                  junos:must "("security ipsec security-association $$ manual")";
                  junos:must-message "Referenced IPSec security association must be a manual SA";
                  junos:must "("security ipsec security-association $$ mode transport")";
                  junos:must-message "Referenced IPSec security association must be in transport mode";
                  junos:must "("security ipsec security-association $$")";
                  junos:must-message "Referenced IPSec security association must be defined";
                  type string {
                    length "1 .. 32";
                  }
                  description
                    "IPSec security association name";
                }
    
                leaf demand-circuit {
                  type empty;
                  description
                    "Interface functions as a demand circuit";
                }
    
                leaf flood-reduction {
                  type empty;
                  description
                    "Enable flood reduction";
                }
    
                list topology {
                  key "name";
                  ordered-by user;
                  description
                    "Topology specific attributes";
                  leaf name {
                    type string;
                    description "Topology name";
                  }
    
                  uses apply-advanced;
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this topology";
                  }
    
                  leaf metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Topology metric";
                  }
    
                  container bandwidth-based-metrics {
                    junos:must "(".. metric")";
                    junos:must-message "Metric must be configured";
                    description
                      "Configure bandwidth based metrics";
                    uses apply-advanced;
    
                    list bandwidth {
                      key "name";
                      description
                        "Bandwidth threshold";
                      leaf name {
                        type string;
                      }
    
                      leaf metric {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint16 {
                            range "1 .. 65535";
                          }
                        }
                        description
                          "Metric associated with specified bandwidth";
                      }
                    }  // list bandwidth
                  }  // container bandwidth-based-metrics
                }  // list topology
              }  // list sham-link-remote
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Include an interface in this area";
                leaf name {
                  junos:must "((!(".. interface-type nbma") || (!(("interfaces $$" || any "logical-systems <*> interfaces $$")) || (any "interfaces $$-IFL family inet address <*>" || any "logical-systems <*> interfaces $$-IFL family inet address <*>"))))";
                  junos:must-message "IPv4 address must be configured on the interface for nbma mode";
                  type union {
                    type jt:ipv4addr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable OSPF on this interface";
                  }
                }  // choice enable-disable
    
                leaf interface-type {
                  type enumeration {
                    enum "nbma" {
                      value 0;
                      description
                        "Nonbroadcast multiaccess";
                    }
                    enum "p2mp" {
                      value 1;
                      description
                        "Point-to-multipoint NBMA";
                    }
                    enum "p2p" {
                      value 2;
                      description
                        "Point-to-point";
                    }
                    enum "p2mp-over-lan" {
                      value 3;
                      description
                        "Point-to-multipoint over LAN mode";
                    }
                  }
                  description
                    "Type of interface";
                }
    
                choice protection-type {
                  leaf link-protection {
                    type empty;
                    description
                      "Protect interface from link faults only";
                  }
                  leaf node-link-protection {
                    type empty;
                    description
                      "Protect interface from both link and node faults";
                  }
                }  // choice protection-type
    
                leaf no-eligible-backup {
                  type empty;
                  description
                    "Not eligible to backup traffic from protected interfaces";
                }
    
                leaf no-eligible-remote-backup {
                  type empty;
                  description
                    "Not eligible for Remote-LFA backup traffic from protected interfaces";
                }
    
                container passive {
                  presence "enable passive";
                  description
                    "Do not run OSPF, but advertise it";
                  uses apply-advanced;
    
                  container traffic-engineering {
                    description
                      "Advertise TE link information";
                    uses apply-advanced;
    
                    leaf remote-node-id {
                      type jt:ipaddr;
                      description
                        "Remote address of the link";
                    }
    
                    leaf remote-node-router-id {
                      junos:must "(".. remote-node-id")";
                      junos:must-message "remote-node-id must be configured";
                      type jt:ipv4addr;
                      description
                        "TE Router-ID of the remote node";
                    }
                  }  // container traffic-engineering
                }  // container passive
    
                leaf secondary {
                  junos:must "(!(" .. ipsec-sa"))";
                  junos:must-message "secondary interface cannot have ipsec-sa configured";
                  junos:must "(!(" .. dynamic-neighbors"))";
                  junos:must-message "secondary interface cannot have dynamic-neighbors configured";
                  junos:must "(!(" .. neighbor"))";
                  junos:must-message "secondary interface cannot have configured neighbors";
                  junos:must "(!(" .. interface-type p2mp"))";
                  junos:must-message "secondary interface cannot be set as type p2mp";
                  junos:must "(!(" .. interface-type nbma"))";
                  junos:must-message "secondary interface cannot be set as type nbma";
                  junos:must "(!(" .. passive"))";
                  junos:must-message "secondary interface cannot be configured passive";
                  type empty;
                  description
                    "Treat interface as secondary";
                }
    
                leaf own-router-lsa {
                  type empty;
                  description
                    "Generate a separate router LSA for this interface";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Interface metric";
                }
    
                leaf priority {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255";
                    }
                  }
                  description
                    "Designated router priority";
                }
    
                leaf retransmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Retransmission interval (seconds)";
                }
    
                leaf transit-delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Transit delay (seconds)";
                }
    
                leaf hello-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Hello interval (seconds)";
                }
    
                leaf dead-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Dead interval (seconds)";
                }
    
                leaf mtu {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "128 .. 65535";
                    }
                  }
                  description
                    "Maximum OSPF packet size";
                }
    
                choice auth {
                  container authentication {
                    uses juniper-ospf-authentication;
                  }  // container authentication
                  container authentication-key {
                    status deprecated;
                    description
                      "Authentication key";
                    leaf keyname {
                      type jt:unreadable;
                      description
                        "Authentication key value";
                    }
    
                    leaf key-id {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 255";
                        }
                      }
                      description
                        "Key ID for MD5 authentication";
                    }
                  }  // container authentication-key
                }  // choice auth
    
                leaf demand-circuit {
                  type empty;
                  description
                    "Interface functions as a demand circuit";
                }
    
                leaf flood-reduction {
                  type empty;
                  description
                    "Enable flood reduction";
                }
    
                leaf no-neighbor-down-notification {
                  type empty;
                  description
                    "Don't inform other protocols about neighbor down events";
                }
    
                leaf ipsec-sa {
                  junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                  junos:must-message "Must not configure ipsec-sa for st0 interface";
                  junos:must "("security ipsec security-association $$ manual")";
                  junos:must-message "Referenced IPSec security association must be a manual SA";
                  junos:must "("security ipsec security-association $$ mode transport")";
                  junos:must-message "Referenced IPSec security association must be in transport mode";
                  junos:must "("security ipsec security-association $$")";
                  junos:must-message "Referenced IPSec security association must be defined";
                  type string {
                    length "1 .. 32";
                  }
                  description
                    "IPSec security association name";
                }
    
                list topology {
                  key "name";
                  ordered-by user;
                  description
                    "Topology specific attributes";
                  leaf name {
                    type string;
                    description "Topology name";
                  }
    
                  uses apply-advanced;
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this topology";
                  }
    
                  leaf metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Topology metric";
                  }
    
                  container bandwidth-based-metrics {
                    junos:must "(".. metric")";
                    junos:must-message "Metric must be configured";
                    description
                      "Configure bandwidth based metrics";
                    uses apply-advanced;
    
                    list bandwidth {
                      key "name";
                      description
                        "Bandwidth threshold";
                      leaf name {
                        type string;
                      }
    
                      leaf metric {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint16 {
                            range "1 .. 65535";
                          }
                        }
                        description
                          "Metric associated with specified bandwidth";
                      }
                    }  // list bandwidth
                  }  // container bandwidth-based-metrics
                }  // list topology
    
                leaf transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  status deprecated;
                  description
                    "OSPF packet transmit interval (milliseconds)";
                }
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
    
                  container authentication {
                    description
                      "Authentication options";
                    uses apply-advanced;
    
                    leaf key-chain {
                      junos:must "(".. algorithm")";
                      junos:must-message "May not be configured without algorithm";
                      junos:must "("security authentication-key-chains key-chain $$")";
                      junos:must-message "Referenced key-chain must be defined";
                      type string;
                      description
                        "Key chain name";
                    }
    
                    leaf algorithm {
                      junos:must "(".. key-chain")";
                      junos:must-message "May not be configured without key-chain";
                      type enumeration {
                        enum "simple-password" {
                          value 0;
                          description
                            "Simple password";
                        }
                        enum "keyed-md5" {
                          value 1;
                          description
                            "Keyed message Digest 5";
                        }
                        enum
                          "meticulous-keyed-md5" {
                          value 2;
                          description
                            "Meticulous keyed message Digest 5";
                        }
                        enum "keyed-sha-1" {
                          value 3;
                          description
                            "Keyed secure hash algorithm (SHA1) ";
                        }
                        enum
                          "meticulous-keyed-sha-1" {
                          value 4;
                          description
                            "Meticulous keyed secure hash algorithm (SHA1) ";
                        }
                      }
                      description
                        "Algorithm name";
                    }
    
                    leaf loose-check {
                      type empty;
                      description
                        "Verify authentication only if authentication is negotiated";
                    }
                  }  // container authentication
    
                  leaf full-neighbors-only {
                    type empty;
                    description
                      "Setup BFD sessions only to Full neighbors";
                  }
    
                  leaf holddown-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Time to hold the session-UP notification to the client";
                  }
                }  // container bfd-liveness-detection
    
                leaf dynamic-neighbors {
                  junos:must "(" .. interface-type p2mp")";
                  junos:must-message "dynamic-neighbors option can be set only if the interface type is p2mp";
                  type empty;
                  description
                    "Learn neighbors dynamically on a p2mp interface";
                }
    
                leaf no-advertise-adjacency-segment {
                  type empty;
                  description
                    "Do not advertise an adjacency segment for this interface";
                }
    
                list neighbor {
                  junos:must "(!(" .. dynamic-neighbors"))";
                  junos:must-message "Neighbors cannot be specified manually if dynamic-neighbors is set";
                  key "name";
                  ordered-by user;
                  description "NBMA neighbor";
                  leaf name {
                    type jt:ipaddr;
                    description
                      "Address of neighbor";
                  }
    
                  leaf eligible {
                    type empty;
                    description
                      "Eligible to be DR on an NBMA network";
                  }
                }  // list neighbor
    
                leaf poll-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Poll interval for NBMA interfaces";
                }
    
                leaf no-interface-state-traps {
                  type empty;
                  description
                    "Do not send interface state change traps";
                }
    
                leaf strict-bfd {
                  junos:must "(" .. bfd-liveness-detection")";
                  junos:must-message "strict bfd cannot be configured without bfd.";
                  junos:must "(!(" .. bfd-liveness-detection full-neighbors-only"))";
                  junos:must-message "full-neighbors-only and strict-bfd cannot be configured together";
                  type empty;
                  description
                    "Enable strict bfd over this interface";
                }
    
                container post-convergence-lfa {
                  junos:must "("protocols ospf backup-spf-options use-post-convergence-lfa")";
                  junos:must-message "Not allowed without 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                  presence
                    "enable post-convergence-lfa";
                  description
                    "Protect interface using post-convergence backup path";
                  uses apply-advanced;
    
                  container node-protection {
                    presence
                      "enable node-protection";
                    description
                      "Compute backup path assuming node failure";
                    uses apply-advanced;
    
                    leaf cost {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Cost for node protection";
                    }
                  }  // container node-protection
    
                  leaf srlg-protection {
                    type empty;
                    description
                      "Compute backup path assuming SRLG failure";
                  }
    
                  leaf fate-sharing-protection {
                    type empty;
                    description
                      "Compute backup path assuming fate-sharing group failure";
                  }
                }  // container post-convergence-lfa
    
                leaf te-metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  description
                    "Traffic engineering metric";
                }
    
                container ldp-synchronization {
                  presence
                    "enable ldp-synchronization";
                  description
                    "Advertise maximum metric until LDP is operational";
                  uses ldp-sync-obj;
                }  // container ldp-synchronization
    
                container ipv4-adjacency-segment {
                  junos:must "(!(".. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                  description
                    "Configure ipv4 adjacency segment";
                  uses apply-advanced;
    
                  container protected {
                    description
                      "Adjacency SID is eligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container protected
    
                  container unprotected {
                    description
                      "Adjacency SID uneligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container unprotected
                }  // container ipv4-adjacency-segment
    
                list lan-neighbor {
                  junos:must "(!(".. ipv4-adjacency-segment"))";
                  junos:must-message "lan-neighbor can't be configured if ipv4-adjacency-segment is configured in the same interface";
                  junos:must "(!(".. no-advertise-adjacency-segment"))";
                  junos:must-message "lan-neighbor can't be configured if no-advertise-adjacency-segment is configured in the same interface ";
                  junos:must "(!(".. interface-type p2p"))";
                  junos:must-message "lan-neighbor can't be configured for point-to-point interfaces";
                  key "name";
                  ordered-by user;
                  description
                    "Configuration specific to a LAN neighbor";
                  leaf name {
                    type jt:ipaddr;
                    description
                      "Address of neighbor";
                  }
    
                  uses apply-advanced;
    
                  container ipv4-adjacency-segment {
                    junos:must "(!(".. no-advertise-adjacency-segment"))";
                    junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                    description
                      "Configure ipv4 adjacency segment";
                    uses apply-advanced;
    
                    container protected {
                      description
                        "Adjacency SID is eligible for protection";
                      choice adjsid-type {
                        container index {
                          description
                            "Adjacency SID indexed from SRGB";
                          leaf index-number {
                            type union {
                              type string {
                                pattern
                                  "<.*>|$.*";
                              }
                              type uint32 {
                                range
                                  "0 .. 199999";
                              }
                            }
                          }
                        }  // container index
                        leaf label {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "16 .. 1048575";
                            }
                          }
                          description
                            "Adjacency SID from static label pool";
                        }
                        leaf dynamic {
                          type empty;
                          description
                            "Dynamically allocate an adjacency segment";
                        }
                      }  // choice adjsid-type
                    }  // container protected
    
                    container unprotected {
                      description
                        "Adjacency SID uneligible for protection";
                      choice adjsid-type {
                        container index {
                          description
                            "Adjacency SID indexed from SRGB";
                          leaf index-number {
                            type union {
                              type string {
                                pattern
                                  "<.*>|$.*";
                              }
                              type uint32 {
                                range
                                  "0 .. 199999";
                              }
                            }
                          }
                        }  // container index
                        leaf label {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "16 .. 1048575";
                            }
                          }
                          description
                            "Adjacency SID from static label pool";
                        }
                        leaf dynamic {
                          type empty;
                          description
                            "Dynamically allocate an adjacency segment";
                        }
                      }  // choice adjsid-type
                    }  // container unprotected
                  }  // container ipv4-adjacency-segment
                }  // list lan-neighbor
              }  // list interface
    
              leaf no-context-identifier-advertisement {
                junos:must "(!(".. context-identifier"))";
                junos:must-message "no-context-identifier-advertisement and context-identifier attributes are mutually exclusive";
                type empty;
                description
                  "Disable context identifier advertisments in this area";
              }
    
              list peer-interface {
                key "name";
                ordered-by user;
                description
                  "Configuration for peer interface";
                leaf name {
                  type string;
                  description
                    "Name of peer interface";
                }
    
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable OSPF on this control peer";
                  }
                }  // choice enable-disable
    
                leaf retransmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Retransmission interval (seconds)";
                }
    
                leaf transit-delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Transit delay (seconds)";
                }
    
                leaf hello-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Hello interval (seconds)";
                }
    
                leaf dead-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Dead interval (seconds)";
                }
    
                leaf mtu {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "128 .. 65535";
                    }
                  }
                  description
                    "Maximum OSPF packet size";
                }
    
                choice auth {
                  container authentication {
                    uses juniper-ospf-authentication;
                  }  // container authentication
                  container authentication-key {
                    status deprecated;
                    description
                      "Authentication key";
                    leaf keyname {
                      type jt:unreadable;
                      description
                        "Authentication key value";
                    }
    
                    leaf key-id {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 255";
                        }
                      }
                      description
                        "Key ID for MD5 authentication";
                    }
                  }  // container authentication-key
                }  // choice auth
    
                leaf demand-circuit {
                  type empty;
                  description
                    "Interface functions as a demand circuit";
                }
    
                leaf flood-reduction {
                  type empty;
                  description
                    "Enable flood reduction";
                }
    
                leaf no-neighbor-down-notification {
                  type empty;
                  description
                    "Don't inform other protocols about neighbor down events";
                }
              }  // list peer-interface
    
              leaf no-source-packet-routing {
                type empty;
                description
                  "Disable SPRING in this area";
              }
    
              list context-identifier {
                junos:must "(!(".. no-context-identifier-advertisement"))";
                junos:must-message "no-context-identifier-advertisement and context-identifier attributes are mutually exclusive";
                key "name";
                ordered-by user;
                description
                  "Configure context identifier in support of edge protection";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Context identifier";
                }
    
                uses apply-advanced;
              }  // list context-identifier
    
              list label-switched-path {
                junos:must "(!(".. .. traffic-engineering multicast-rpf-routes"))";
                junos:must-message "cannot advertise LSPs when using multicast-rpf-routes";
                key "name";
                ordered-by user;
                description
                  "Configuration for advertisement of a label-switched path";
                leaf name {
                  type string {
                    length "1 .. 64";
                  }
                  description
                    "Name of label-switched path to be advertised";
                }
    
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable OSPF on this label-switched path";
                  }
                }  // choice enable-disable
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Interface metric";
                }
    
                list topology {
                  key "name";
                  ordered-by user;
                  description
                    "Topology specific attributes";
                  leaf name {
                    type string;
                    description "Topology name";
                  }
    
                  uses apply-advanced;
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this topology";
                  }
    
                  leaf metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Topology metric";
                  }
    
                  container bandwidth-based-metrics {
                    junos:must "(".. metric")";
                    junos:must-message "Metric must be configured";
                    description
                      "Configure bandwidth based metrics";
                    uses apply-advanced;
    
                    list bandwidth {
                      key "name";
                      description
                        "Bandwidth threshold";
                      leaf name {
                        type string;
                      }
    
                      leaf metric {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint16 {
                            range "1 .. 65535";
                          }
                        }
                        description
                          "Metric associated with specified bandwidth";
                      }
                    }  // list bandwidth
                  }  // container bandwidth-based-metrics
                }  // list topology
              }  // list label-switched-path
            }  // list area
    
            choice enable-disable {
              leaf disable {
                type empty;
                description "Disable OSPF";
              }
            }  // choice enable-disable
    
            container traceoptions {
              description
                "Trace options for OSPF";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "spf" {
                      value 0;
                      description
                        "Trace SPF calculations";
                    }
                    enum "error" {
                      value 1;
                      description
                        "Trace errored packets";
                    }
                    enum "event" {
                      value 2;
                      description
                        "Trace OSPF state machine events";
                    }
                    enum "packet-dump" {
                      value 3;
                      description
                        "Dump the contents of selected packet types";
                    }
                    enum "flooding" {
                      value 4;
                      description
                        "Trace LSA flooding";
                    }
                    enum "lsa-analysis" {
                      value 5;
                      description
                        "Trace LSA analysis";
                    }
                    enum "packets" {
                      value 6;
                      description
                        "Trace all OSPF packets";
                    }
                    enum "hello" {
                      value 7;
                      description
                        "Trace hello packets";
                    }
                    enum "database-description" {
                      value 8;
                      description
                        "Trace database description packets";
                    }
                    enum "lsa-request" {
                      value 9;
                      description
                        "Trace LSA request packets";
                    }
                    enum "lsa-update" {
                      value 10;
                      description
                        "Trace LSA update packets";
                    }
                    enum "lsa-ack" {
                      value 11;
                      description
                        "Trace LSA acknowledgment packets";
                    }
                    enum "ldp-synchronization" {
                      value 12;
                      description
                        "Trace synchronization between OSPF and LDP";
                    }
                    enum "on-demand" {
                      value 13;
                      description
                        "Trace demand circuit extensions";
                    }
                    enum "nsr-synchronization" {
                      value 14;
                      description
                        "Trace NSR synchronization events";
                    }
                    enum "graceful-restart" {
                      value 15;
                      description
                        "Trace graceful restart";
                    }
                    enum "restart-signaling" {
                      value 16;
                      description
                        "Trace restart signaling";
                    }
                    enum "backup-spf" {
                      value 17;
                      description
                        "Trace backup SPF (LFA) specific events";
                    }
                    enum "source-packet-routing" {
                      value 18;
                      description
                        "Trace source packet routing (SPRING) events";
                    }
                    enum "post-convergence-lfa" {
                      value 19;
                      description
                        "Trace post-convergence-lfa related events";
                    }
                    enum "flex-algorithm" {
                      value 20;
                      description
                        "Trace flex-algorithm related events";
                    }
                    enum "route" {
                      value 21;
                      description
                        "Trace routing information";
                    }
                    enum "normal" {
                      value 22;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 23;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 24;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 25;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 26;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 27;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 28;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            container spf-options {
              description
                "Configure options for SPF";
              uses apply-advanced;
    
              leaf delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "50 .. 8000";
                  }
                }
                units "milliseconds";
                description
                  "Time to wait before running an SPF";
              }
    
              leaf holddown {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2000 .. 20000";
                  }
                }
                units "milliseconds";
                description
                  "Time to hold down before running an SPF";
              }
    
              leaf rapid-runs {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 10";
                  }
                }
                description
                  "Number of maximum rapid SPF runs before holddown";
              }
    
              leaf no-ignore-our-externals {
                type empty;
                description
                  "Do not ignore self-generated external and NSSA LSAs";
              }
            }  // container spf-options
    
            leaf prefix-export-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Maximum number of prefixes that can be exported";
            }
    
            container rib-groups {
              description
                "Routing table groups for importing OSPF routes";
              uses apply-advanced;
    
              leaf inet {
                junos:must "("routing-options rib-groups $$")";
                junos:must-message "Referenced rib-groups must be defined";
                junos:must "(!(".. topology $$={default} rib-group"))";
                junos:must-message "rib-group cannot be used with topology default rib-group";
                type string;
                description
                  "Name of the IPv4/v6 routing table group";
              }
    
              leaf inet3 {
                junos:must "("routing-options rib-groups $$")";
                junos:must-message "Referenced rib-groups must be defined";
                junos:must "(!(".. topology $$={default} rib-group"))";
                junos:must-message "rib-group cannot be used with topology default rib-group";
                type string;
                description
                  "Name of the IPv4/v6 inet.3 routing table group";
              }
            }  // container rib-groups
    
            leaf job-stats {
              type empty;
              description
                "Collect job statistics";
            }
    
            container overload {
              presence "enable overload";
              description
                "Set the overload mode (repel transit traffic)";
              uses apply-advanced;
    
              leaf timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "60 .. 3600";
                  }
                }
                units "seconds";
                description
                  "Time after which overload mode is reset";
              }
    
              leaf allow-route-leaking {
                type empty;
                description
                  "Allow routes to be leaked when overload is configured";
              }
    
              leaf stub-network {
                type empty;
                description
                  "Advertise Stub Network with maximum metric";
              }
    
              leaf intra-area-prefix {
                type empty;
                description
                  "Advertise Intra Area Prefix with maximum metric";
              }
    
              leaf as-external {
                type empty;
                description
                  "Advertise As External with maximum usable metric";
              }
            }  // container overload
    
            container database-protection {
              presence
                "enable database-protection";
              description
                "Configure database protection attributes";
              uses apply-advanced;
    
              leaf maximum-lsa {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1000000";
                  }
                }
                description
                  "Maximum allowed non self-generated LSAs";
              }
    
              leaf warning-only {
                type empty;
                description
                  "Emit only a warning when LSA maximum limit is exceeded";
              }
    
              leaf warning-threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "30 .. 100";
                  }
                }
                units "percent";
                description
                  "Percentage of LSA maximum above which to trigger warning";
              }
    
              leaf ignore-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "1 .. 32";
                  }
                }
                description
                  "Maximum number of times to go into ignore state";
              }
    
              leaf ignore-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "30 .. 3600";
                  }
                }
                units "seconds";
                description
                  "Time to stay in ignore state and ignore all neighbors";
              }
    
              leaf reset-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "60 .. 86400";
                  }
                }
                units "seconds";
                description
                  "Time after which the ignore count gets reset to zero";
              }
            }  // container database-protection
    
            container graceful-restart {
              description
                "Configure graceful restart attributes";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF graceful restart capability";
                }
              }  // choice enable-disable
    
              leaf restart-duration {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 3600";
                  }
                }
                units "seconds";
                description
                  "Time for all neighbors to become full";
              }
    
              leaf notify-duration {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 3600";
                  }
                }
                units "seconds";
                description
                  "Time to send all max-aged grace LSAs";
              }
    
              container helper-disable {
                presence "enable helper-disable";
                description
                  "Disable graceful restart helper capability";
                uses apply-advanced;
    
                choice disable-choices {
                  leaf standard {
                    type empty;
                    description
                      "Disable helper-mode for rfc3623 based GR";
                  }
                  leaf restart-signaling {
                    type empty;
                    description
                      "Disable helper mode for restart-signaling ";
                  }
                  leaf both {
                    type empty;
                    description
                      "Disable helper mode for both the types of GR";
                  }
                }  // choice disable-choices
              }  // container helper-disable
    
              leaf no-strict-lsa-checking {
                junos:must "(!(".. helper-disable"))";
                junos:must-message "To configure no-strict-lsa-checking, helper-disable must not be set";
                type empty;
                description
                  "Do not abort graceful helper mode upon LSA changes";
              }
            }  // container graceful-restart
    
            leaf route-type-community {
              type enumeration {
                enum "iana" {
                  value 0;
                  description
                    "BGP extended community value used is 0x0306";
                }
                enum "vendor" {
                  value 1;
                  description
                    "Vendor BGP extended community value used is 0x8000";
                }
              }
              description
                "Specify BGP extended community value to encode OSPF route type";
            }
    
            container domain-id {
              description "Configure domain ID";
              choice domain_id_or_disable {
                leaf domain-id {
                  type string;
                  description "Domain ID";
                }
                leaf disable {
                  type empty;
                  description
                    "Disable domain ID";
                }
              }  // choice domain_id_or_disable
            }  // container domain-id
    
            choice domain_vpn_tag_or_disable {
              leaf domain-vpn-tag {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 4294967295";
                  }
                }
                description
                  "Domain VPN tag for external LSA";
              }
              leaf no-domain-vpn-tag {
                type empty;
                description
                  "Disable domain VPN tag";
              }
            }  // choice domain_vpn_tag_or_disable
    
            leaf preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of internal routes";
            }
    
            leaf external-preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of external routes";
            }
    
            leaf labeled-preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of labeled routes";
            }
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy (for external routes or setting priority)";
            }
    
            leaf reference-bandwidth {
              type string;
              description
                "Bandwidth for calculating metric defaults";
            }
    
            leaf lsa-refresh-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "25 .. 50";
                }
              }
              default "50";
              description
                "LSA refresh interval (minutes)";
            }
    
            leaf spf-delay {
              junos:must "(!(".. spf-options delay"))";
              junos:must-message "You can only configure either spf-delay or delay under spf-options";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "50 .. 8000";
                }
              }
              units "milliseconds";
              status deprecated;
              description
                "Time to wait before running an SPF";
            }
    
            leaf no-rfc-1583 {
              type empty;
              description
                "Disable RFC1583 compatibility";
            }
    
            leaf forwarding-address-to-broadcast {
              type empty;
              description
                "Set forwarding address in Type 5 LSA in broadcast network";
            }
    
            choice nssa-abr-option {
              leaf no-nssa-abr {
                type empty;
                description
                  "Disable full NSSA functionality at ABR";
              }
            }  // choice nssa-abr-option
    
            container sham-link {
              presence "enable sham-link";
              description
                "Configure parameters for sham links";
              uses apply-advanced;
    
              leaf local {
                type jt:ipaddr;
                description
                  "Local sham link endpoint address";
              }
    
              leaf no-advertise-local {
                type empty;
                status deprecated;
                description
                  "Don't advertise local sham link endpoint as stub in router LSA";
              }
            }  // container sham-link
          }  // list realm
    
          uses apply-advanced;
    
          list topology {
            key "name";
            ordered-by user;
            description "Topology parameters";
            leaf name {
              type string;
              description "Topology name";
            }
    
            uses apply-advanced;
    
            leaf disable {
              type empty;
              description
                "Disable this topology";
            }
    
            leaf topology-id {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "32 .. 127";
                }
              }
              description "Topology identifier";
            }
    
            leaf overload {
              type empty;
              description
                "Set the overload mode (repel transit traffic)";
            }
    
            leaf rib-group {
              junos:must "("routing-options rib-groups $$")";
              junos:must-message "Referenced rib-group must be defined";
              type string;
              description
                "Routing table group for importing routes";
            }
    
            container spf-options {
              description
                "Configure options for SPF";
              uses apply-advanced;
    
              leaf delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "50 .. 8000";
                  }
                }
                units "milliseconds";
                description
                  "Time to wait before running an SPF";
              }
    
              leaf holddown {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2000 .. 20000";
                  }
                }
                units "milliseconds";
                description
                  "Time to hold down before running an SPF";
              }
    
              leaf rapid-runs {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 10";
                  }
                }
                description
                  "Number of maximum rapid SPF runs before holddown";
              }
    
              leaf no-ignore-our-externals {
                type empty;
                description
                  "Do not ignore self-generated external and NSSA LSAs";
              }
            }  // container spf-options
    
            container backup-spf-options {
              description
                "Configure options for backup SPF";
              uses apply-advanced;
    
              container remote-backup-calculation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                presence
                  "enable remote-backup-calculation";
                description
                  "Calculate Remote LFA backup nexthops";
                uses apply-advanced;
    
                container pq-nodes-nearest-to-source {
                  description
                    "PQ nodes selection based upon nearest to source";
                  uses apply-advanced;
    
                  leaf percent {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "10 .. 100";
                      }
                    }
                    description
                      "Selection percentage for nearest to source";
                  }
                }  // container pq-nodes-nearest-to-source
              }  // container remote-backup-calculation
    
              container use-post-convergence-lfa {
                junos:must "("protocols ospf source-packet-routing")";
                junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                presence
                  "enable use-post-convergence-lfa";
                description
                  "Calculate post-convergence backup paths";
                uses apply-advanced;
    
                leaf maximum-labels {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 8";
                    }
                  }
                  description
                    "Maximum number of labels installed for post-convergence paths";
                }
    
                leaf maximum-backup-paths {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 8";
                    }
                  }
                  description
                    "Maximum number of equal-cost post-convergence paths installed";
                }
              }  // container use-post-convergence-lfa
    
              leaf use-source-packet-routing {
                junos:must "(".. .. source-packet-routing")";
                junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                junos:must "(!(".. remote-backup-calculation"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options remote-backup-calculation'";
                type empty;
                description
                  "Use spring backup paths for inet.0 routes";
              }
    
              leaf disable {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Do not run backup SPF";
              }
    
              leaf no-install {
                type empty;
                description
                  "Do not install backup nexthops into the RIB";
              }
    
              leaf downstream-paths-only {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Use only downstream backup paths";
              }
    
              container per-prefix-calculation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                description
                  "Calculate backup nexthops for non-best prefix originators";
                uses apply-advanced;
    
                leaf stubs {
                  type empty;
                  description
                    "Per prefix calculation for stubs only";
                }
    
                leaf summary {
                  type empty;
                  description
                    "Per prefix calculation for summary originators only";
                }
    
                leaf externals {
                  type empty;
                  description
                    "Per prefix calculation for externals";
                }
    
                leaf all {
                  type empty;
                  description
                    "Per prefix calculation for all";
                }
              }  // container per-prefix-calculation
    
              leaf node-link-degradation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Degrade to link protection when nodelink protection not available";
              }
            }  // container backup-spf-options
    
            leaf prefix-export-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Maximum number of prefixes that can be exported";
            }
          }  // list topology
    
          container backup-spf-options {
            description
              "Configure options for backup SPF";
            uses apply-advanced;
    
            container remote-backup-calculation {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              presence
                "enable remote-backup-calculation";
              description
                "Calculate Remote LFA backup nexthops";
              uses apply-advanced;
    
              container pq-nodes-nearest-to-source {
                description
                  "PQ nodes selection based upon nearest to source";
                uses apply-advanced;
    
                leaf percent {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "10 .. 100";
                    }
                  }
                  description
                    "Selection percentage for nearest to source";
                }
              }  // container pq-nodes-nearest-to-source
            }  // container remote-backup-calculation
    
            container use-post-convergence-lfa {
              junos:must "("protocols ospf source-packet-routing")";
              junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
              presence
                "enable use-post-convergence-lfa";
              description
                "Calculate post-convergence backup paths";
              uses apply-advanced;
    
              leaf maximum-labels {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 8";
                  }
                }
                description
                  "Maximum number of labels installed for post-convergence paths";
              }
    
              leaf maximum-backup-paths {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 8";
                  }
                }
                description
                  "Maximum number of equal-cost post-convergence paths installed";
              }
            }  // container use-post-convergence-lfa
    
            leaf use-source-packet-routing {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
              junos:must "(!(".. remote-backup-calculation"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options remote-backup-calculation'";
              type empty;
              description
                "Use spring backup paths for inet.0 routes";
            }
    
            leaf disable {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Do not run backup SPF";
            }
    
            leaf no-install {
              type empty;
              description
                "Do not install backup nexthops into the RIB";
            }
    
            leaf downstream-paths-only {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Use only downstream backup paths";
            }
    
            container per-prefix-calculation {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              description
                "Calculate backup nexthops for non-best prefix originators";
              uses apply-advanced;
    
              leaf stubs {
                type empty;
                description
                  "Per prefix calculation for stubs only";
              }
    
              leaf summary {
                type empty;
                description
                  "Per prefix calculation for summary originators only";
              }
    
              leaf externals {
                type empty;
                description
                  "Per prefix calculation for externals";
              }
    
              leaf all {
                type empty;
                description
                  "Per prefix calculation for all";
              }
            }  // container per-prefix-calculation
    
            leaf node-link-degradation {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Degrade to link protection when nodelink protection not available";
            }
          }  // container backup-spf-options
    
          container traffic-engineering {
            presence
              "enable traffic-engineering";
            description
              "Configure traffic engineering attributes";
            uses apply-advanced;
    
            leaf no-topology {
              type empty;
              description
                "Disable dissemination of TE link-state topology information";
            }
    
            leaf multicast-rpf-routes {
              junos:must "(!(".. .. topology $$={ipv4-multicast}"))";
              junos:must-message "multicast-rpf-routes cannot be used with topology ipv4-multicast";
              junos:must "(".. shortcuts")";
              junos:must-message "multicast-rpf-routes cannot be used without shortcuts";
              type empty;
              description
                "Install routes for multicast RPF checks into inet.2";
            }
    
            leaf l3-unicast-topology {
              type empty;
              description
                "Download IGP topology into TED";
            }
    
            container ignore-lsp-metrics {
              presence
                "enable ignore-lsp-metrics";
              description
                "Ignore label-switched path metrics when doing shortcuts";
              uses apply-advanced;
    
              leaf unconfigured-only {
                type empty;
                description
                  "Ignore lsp metrics for unconfigured only";
              }
            }  // container ignore-lsp-metrics
    
            container shortcuts {
              presence "enable shortcuts";
              description
                "Use label-switched paths as next hops, if possible";
              uses apply-advanced;
    
              leaf ignore-lsp-metrics {
                type empty;
                status deprecated;
                description
                  "Ignore label-switched path metrics when doing shortcuts";
              }
    
              leaf lsp-metric-into-summary {
                type empty;
                description
                  "Advertise LSP metric into summary LSAs";
              }
    
              list family {
                key "name";
                ordered-by user;
                description
                  "Address family specific traffic-engineering attributes";
                leaf name {
                  type enumeration {
                    enum "inet" {
                      value 0;
                      description "IPv4 family";
                    }
                    enum "inet-mpls" {
                      value 1;
                      description
                        "IPv4-MPLS family";
                    }
                  }
                }
    
                uses apply-advanced;
              }  // list family
            }  // container shortcuts
    
            leaf advertise-unnumbered-interfaces {
              type empty;
              description
                "Advertise unnumbered interfaces";
            }
    
            leaf credibility-protocol-preference {
              type empty;
              description
                "TED protocol credibility follows protocol preference";
            }
    
            container advertisement {
              description
                "Advertise TE parameters even if RSVP is not turned on";
              uses apply-advanced;
    
              leaf always {
                type empty;
                description
                  "Advertise TE parameters in TE LSAs";
              }
            }  // container advertisement
          }  // container traffic-engineering
    
          container source-packet-routing {
            junos:must "(!(".. .. .. protocols mpls disable"))";
            junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
            junos:must "(".. .. .. protocols mpls ")";
            junos:must-message "SPRING configuration is not allowed without 'protocols mpls'";
            presence
              "enable source-packet-routing";
            description
              "Enable source packet routing (SPRING)";
            uses apply-advanced;
    
            container adjacency-segment {
              description
                "Attributes for adjacency segments in spring";
              uses apply-advanced;
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "180000 .. 900000";
                  }
                }
                description
                  "Retain time of Adjacency segment after isolating from an interface";
              }
            }  // container adjacency-segment
    
            leaf-list prefix-segment {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Prefix Segment policy";
            }
    
            leaf explicit-null {
              type empty;
              description
                "Set E and P bits in all Prefix SID advertisements";
            }
    
            container node-segment {
              presence "enable node-segment";
              description
                "Enable support for Node segments in SPRING";
              uses apply-advanced;
    
              leaf ipv4-index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set ipv4 node segment index";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "32 .. 16385";
                  }
                }
                description
                  "Set range of node segment indices allowed";
              }
            }  // container node-segment
    
            container srgb {
              junos:must "(!(".. node-segment index-range"))";
              junos:must-message "Can not be configured with node-segment index-range";
              description
                "Set the SRGB global block in SPRING";
              leaf start-label {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Start range for SRGB label block";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Index to the SRGB start label block";
              }
            }  // container srgb
    
            leaf mapping-server {
              junos:must "(".. node-segment")";
              junos:must-message "protocols ospf source-packet-routing node-segment must be defined";
              junos:must "("routing-options source-packet-routing mapping-server-entry $$")";
              junos:must-message "Referenced source-packet-routing mapping-server-entry must be defined";
              type string;
              description "Mapping server name";
            }
    
            leaf install-prefix-sid-for-best-route {
              type empty;
              description
                "For best route install a exact prefix sid route";
            }
    
            leaf ldp-stitching {
              type empty;
              description
                "Enable SR to LDP stitching";
            }
    
            leaf-list flex-algorithm {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "128 .. 255";
                }
              }
              max-elements 16;
              description
                "Flex-algorithms we would like to participate in";
            }
          }  // container source-packet-routing
    
          list area {
            key "name";
            ordered-by user;
            description "Configure an OSPF area";
            leaf name {
              type jt:areaid;
              description "Area ID";
            }
    
            uses apply-advanced;
    
            choice stub-option {
              container stub {
                presence "enable stub";
                description
                  "Configure a stub area";
                leaf default-metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777215";
                    }
                  }
                  description
                    "Metric for the default route in this stub area";
                }
    
                choice summaries-choice {
                  leaf summaries {
                    type empty;
                    description
                      "Flood summary LSAs into this stub area";
                  }
                  leaf no-summaries {
                    type empty;
                    description
                      "Don't flood summary LSAs into this stub area";
                  }
                }  // choice summaries-choice
              }  // container stub
              container nssa {
                presence "enable nssa";
                description
                  "Configure a not-so-stubby area";
                uses apply-advanced;
    
                container default-lsa {
                  presence "enable default-lsa";
                  description
                    "Configure a default LSA";
                  uses apply-advanced;
    
                  leaf default-metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 16777215";
                      }
                    }
                    description
                      "Metric for the default route in this area";
                  }
    
                  leaf metric-type {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 2";
                      }
                    }
                    description
                      "External metric type for the default type 7 LSA";
                  }
    
                  leaf type-7 {
                    type empty;
                    description
                      "Flood type 7 default LSA if no-summaries is configured";
                  }
                }  // container default-lsa
    
                leaf default-metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777215";
                    }
                  }
                  status deprecated;
                  description
                    "Metric for the default route in this area";
                }
    
                leaf metric-type {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 2";
                    }
                  }
                  status deprecated;
                  description
                    "External metric type for the default type 7 LSA";
                }
    
                choice summaries-choice {
                  leaf summaries {
                    type empty;
                    description
                      "Flood summary LSAs into this NSSA area";
                  }
                  leaf no-summaries {
                    type empty;
                    description
                      "Don't flood summary LSAs into this NSSA area";
                  }
                }  // choice summaries-choice
    
                list area-range {
                  key "name";
                  ordered-by user;
                  description
                    "Configure NSSA area ranges";
                  leaf name {
                    type jt:ipprefix;
                    description
                      "Range to summarize NSSA routes in this area";
                  }
    
                  uses apply-advanced;
    
                  leaf restrict {
                    type empty;
                    description
                      "Restrict advertisement of this area range";
                  }
    
                  leaf exact {
                    type empty;
                    description
                      "Enforce exact match for advertisement of this area range";
                  }
    
                  container override-metric {
                    presence
                      "enable override-metric";
                    description
                      "Override the dynamic metric for this area-range";
                    uses apply-advanced;
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 16777215";
                        }
                      }
                      description "Metric value";
                    }
    
                    leaf metric-type {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 2";
                        }
                      }
                      default "1";
                      description
                        "Set the metric type for the override metric";
                    }
                  }  // container override-metric
                }  // list area-range
              }  // container nssa
            }  // choice stub-option
    
            list area-range {
              key "name";
              ordered-by user;
              description
                "Configure area ranges";
              leaf name {
                type jt:ipprefix;
                description
                  "Range to summarize routes in this area";
              }
    
              uses apply-advanced;
    
              leaf restrict {
                type empty;
                description
                  "Restrict advertisement of this area range";
              }
    
              leaf exact {
                type empty;
                description
                  "Enforce exact match for advertisement of this area range";
              }
    
              leaf override-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16777215";
                  }
                }
                description
                  "Override the dynamic metric for this area-range";
              }
            }  // list area-range
    
            leaf-list network-summary-export {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Export policy for Type 3 Summary LSAs";
            }
    
            leaf-list network-summary-import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy for Type 3 Summary LSAs";
            }
    
            leaf-list inter-area-prefix-export {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Export policy for Inter Area Prefix LSAs";
            }
    
            leaf-list inter-area-prefix-import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy for Inter Area Prefix LSAs";
            }
    
            leaf authentication-type {
              type enumeration {
                enum "none" {
                  value 0;
                  status deprecated;
                  description
                    "No authentication";
                }
                enum "simple" {
                  value 1;
                  status deprecated;
                  description
                    "Simple password authentication";
                }
                enum "md5" {
                  value 2;
                  status deprecated;
                  description
                    "MD5 authentication";
                }
              }
              status deprecated;
              description "Authentication type";
            }
    
            list virtual-link {
              junos:must "(".. .. area $$={0.0.0.0}")";
              junos:must-message "virtual link can be configured only under backbone area";
              key "neighbor-id transit-area";
              ordered-by user;
              description
                "Configure virtual links";
              leaf neighbor-id {
                type jt:ipv4addr;
                description
                  "Router ID of a virtual neighbor";
              }
    
              leaf transit-area {
                type jt:areaid;
                description
                  "Transit area in common with virtual neighbor";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable this virtual link";
                }
              }  // choice enable-disable
    
              leaf retransmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Retransmission interval (seconds)";
              }
    
              leaf transit-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Transit delay (seconds)";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Hello interval (seconds)";
              }
    
              leaf dead-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Dead interval (seconds)";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 65535";
                  }
                }
                description
                  "Maximum OSPF packet size";
              }
    
              choice auth {
                container authentication {
                  uses juniper-ospf-authentication;
                }  // container authentication
                container authentication-key {
                  status deprecated;
                  description
                    "Authentication key";
                  leaf keyname {
                    type jt:unreadable;
                    description
                      "Authentication key value";
                  }
    
                  leaf key-id {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
                }  // container authentication-key
              }  // choice auth
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              leaf no-neighbor-down-notification {
                type empty;
                description
                  "Don't inform other protocols about neighbor down events";
              }
    
              leaf ipsec-sa {
                junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                junos:must-message "Must not configure ipsec-sa for st0 interface";
                junos:must "("security ipsec security-association $$ manual")";
                junos:must-message "Referenced IPSec security association must be a manual SA";
                junos:must "("security ipsec security-association $$ mode transport")";
                junos:must-message "Referenced IPSec security association must be in transport mode";
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec security association must be defined";
                type string {
                  length "1 .. 32";
                }
                description
                  "IPSec security association name";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list virtual-link
    
            list sham-link-remote {
              key "name";
              ordered-by user;
              description
                "Configure parameters for remote sham link endpoint";
              leaf name {
                junos:must "(!(".. .. .. sham-link local $$"))";
                junos:must-message "Local and remote sham link endpoint addresses must be different";
                junos:must "(".. .. .. sham-link local")";
                junos:must-message "Local sham link endpoint must be configured";
                type jt:ipaddr;
                description
                  "Remote sham link endpoint address";
              }
    
              uses apply-advanced;
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description "Sham link metric";
              }
    
              leaf ipsec-sa {
                junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                junos:must-message "Must not configure ipsec-sa for st0 interface";
                junos:must "("security ipsec security-association $$ manual")";
                junos:must-message "Referenced IPSec security association must be a manual SA";
                junos:must "("security ipsec security-association $$ mode transport")";
                junos:must-message "Referenced IPSec security association must be in transport mode";
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec security association must be defined";
                type string {
                  length "1 .. 32";
                }
                description
                  "IPSec security association name";
              }
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list sham-link-remote
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Include an interface in this area";
              leaf name {
                junos:must "((!(".. interface-type nbma") || (!(("interfaces $$" || any "logical-systems <*> interfaces $$")) || (any "interfaces $$-IFL family inet address <*>" || any "logical-systems <*> interfaces $$-IFL family inet address <*>"))))";
                junos:must-message "IPv4 address must be configured on the interface for nbma mode";
                type union {
                  type jt:ipv4addr-or-interface;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF on this interface";
                }
              }  // choice enable-disable
    
              leaf interface-type {
                type enumeration {
                  enum "nbma" {
                    value 0;
                    description
                      "Nonbroadcast multiaccess";
                  }
                  enum "p2mp" {
                    value 1;
                    description
                      "Point-to-multipoint NBMA";
                  }
                  enum "p2p" {
                    value 2;
                    description "Point-to-point";
                  }
                  enum "p2mp-over-lan" {
                    value 3;
                    description
                      "Point-to-multipoint over LAN mode";
                  }
                }
                description "Type of interface";
              }
    
              choice protection-type {
                leaf link-protection {
                  type empty;
                  description
                    "Protect interface from link faults only";
                }
                leaf node-link-protection {
                  type empty;
                  description
                    "Protect interface from both link and node faults";
                }
              }  // choice protection-type
    
              leaf no-eligible-backup {
                type empty;
                description
                  "Not eligible to backup traffic from protected interfaces";
              }
    
              leaf no-eligible-remote-backup {
                type empty;
                description
                  "Not eligible for Remote-LFA backup traffic from protected interfaces";
              }
    
              container passive {
                presence "enable passive";
                description
                  "Do not run OSPF, but advertise it";
                uses apply-advanced;
    
                container traffic-engineering {
                  description
                    "Advertise TE link information";
                  uses apply-advanced;
    
                  leaf remote-node-id {
                    type jt:ipaddr;
                    description
                      "Remote address of the link";
                  }
    
                  leaf remote-node-router-id {
                    junos:must "(".. remote-node-id")";
                    junos:must-message "remote-node-id must be configured";
                    type jt:ipv4addr;
                    description
                      "TE Router-ID of the remote node";
                  }
                }  // container traffic-engineering
              }  // container passive
    
              leaf secondary {
                junos:must "(!(" .. ipsec-sa"))";
                junos:must-message "secondary interface cannot have ipsec-sa configured";
                junos:must "(!(" .. dynamic-neighbors"))";
                junos:must-message "secondary interface cannot have dynamic-neighbors configured";
                junos:must "(!(" .. neighbor"))";
                junos:must-message "secondary interface cannot have configured neighbors";
                junos:must "(!(" .. interface-type p2mp"))";
                junos:must-message "secondary interface cannot be set as type p2mp";
                junos:must "(!(" .. interface-type nbma"))";
                junos:must-message "secondary interface cannot be set as type nbma";
                junos:must "(!(" .. passive"))";
                junos:must-message "secondary interface cannot be configured passive";
                type empty;
                description
                  "Treat interface as secondary";
              }
    
              leaf own-router-lsa {
                type empty;
                description
                  "Generate a separate router LSA for this interface";
              }
    
              container bandwidth-based-metrics {
                junos:must "(".. metric")";
                junos:must-message "Metric must be configured";
                description
                  "Configure bandwidth based metrics";
                uses apply-advanced;
    
                list bandwidth {
                  key "name";
                  description
                    "Bandwidth threshold";
                  leaf name {
                    type string;
                  }
    
                  leaf metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Metric associated with specified bandwidth";
                  }
                }  // list bandwidth
              }  // container bandwidth-based-metrics
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description "Interface metric";
              }
    
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Designated router priority";
              }
    
              leaf retransmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Retransmission interval (seconds)";
              }
    
              leaf transit-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Transit delay (seconds)";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Hello interval (seconds)";
              }
    
              leaf dead-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Dead interval (seconds)";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 65535";
                  }
                }
                description
                  "Maximum OSPF packet size";
              }
    
              choice auth {
                container authentication {
                  uses juniper-ospf-authentication;
                }  // container authentication
                container authentication-key {
                  status deprecated;
                  description
                    "Authentication key";
                  leaf keyname {
                    type jt:unreadable;
                    description
                      "Authentication key value";
                  }
    
                  leaf key-id {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
                }  // container authentication-key
              }  // choice auth
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              leaf no-neighbor-down-notification {
                type empty;
                description
                  "Don't inform other protocols about neighbor down events";
              }
    
              leaf ipsec-sa {
                junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                junos:must-message "Must not configure ipsec-sa for st0 interface";
                junos:must "("security ipsec security-association $$ manual")";
                junos:must-message "Referenced IPSec security association must be a manual SA";
                junos:must "("security ipsec security-association $$ mode transport")";
                junos:must-message "Referenced IPSec security association must be in transport mode";
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec security association must be defined";
                type string {
                  length "1 .. 32";
                }
                description
                  "IPSec security association name";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
    
              leaf transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                status deprecated;
                description
                  "OSPF packet transmit interval (milliseconds)";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
    
                leaf full-neighbors-only {
                  type empty;
                  description
                    "Setup BFD sessions only to Full neighbors";
                }
    
                leaf holddown-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to hold the session-UP notification to the client";
                }
              }  // container bfd-liveness-detection
    
              leaf dynamic-neighbors {
                junos:must "(" .. interface-type p2mp")";
                junos:must-message "dynamic-neighbors option can be set only if the interface type is p2mp";
                type empty;
                description
                  "Learn neighbors dynamically on a p2mp interface";
              }
    
              leaf no-advertise-adjacency-segment {
                type empty;
                description
                  "Do not advertise an adjacency segment for this interface";
              }
    
              list neighbor {
                junos:must "(!(" .. dynamic-neighbors"))";
                junos:must-message "Neighbors cannot be specified manually if dynamic-neighbors is set";
                key "name";
                ordered-by user;
                description "NBMA neighbor";
                leaf name {
                  type jt:ipaddr;
                  description
                    "Address of neighbor";
                }
    
                leaf eligible {
                  type empty;
                  description
                    "Eligible to be DR on an NBMA network";
                }
              }  // list neighbor
    
              leaf poll-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Poll interval for NBMA interfaces";
              }
    
              leaf no-interface-state-traps {
                type empty;
                description
                  "Do not send interface state change traps";
              }
    
              leaf strict-bfd {
                junos:must "(" .. bfd-liveness-detection")";
                junos:must-message "strict bfd cannot be configured without bfd.";
                junos:must "(!(" .. bfd-liveness-detection full-neighbors-only"))";
                junos:must-message "full-neighbors-only and strict-bfd cannot be configured together";
                type empty;
                description
                  "Enable strict bfd over this interface";
              }
    
              container post-convergence-lfa {
                junos:must "("protocols ospf backup-spf-options use-post-convergence-lfa")";
                junos:must-message "Not allowed without 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                presence
                  "enable post-convergence-lfa";
                description
                  "Protect interface using post-convergence backup path";
                uses apply-advanced;
    
                container node-protection {
                  presence
                    "enable node-protection";
                  description
                    "Compute backup path assuming node failure";
                  uses apply-advanced;
    
                  leaf cost {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Cost for node protection";
                  }
                }  // container node-protection
    
                leaf srlg-protection {
                  type empty;
                  description
                    "Compute backup path assuming SRLG failure";
                }
    
                leaf fate-sharing-protection {
                  type empty;
                  description
                    "Compute backup path assuming fate-sharing group failure";
                }
              }  // container post-convergence-lfa
    
              leaf te-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Traffic engineering metric";
              }
    
              container ldp-synchronization {
                presence
                  "enable ldp-synchronization";
                description
                  "Advertise maximum metric until LDP is operational";
                uses ldp-sync-obj;
              }  // container ldp-synchronization
    
              container ipv4-adjacency-segment {
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                description
                  "Configure ipv4 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  description
                    "Adjacency SID is eligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container protected
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container unprotected
              }  // container ipv4-adjacency-segment
    
              list lan-neighbor {
                junos:must "(!(".. ipv4-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if ipv4-adjacency-segment is configured in the same interface";
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if no-advertise-adjacency-segment is configured in the same interface ";
                junos:must "(!(".. interface-type p2p"))";
                junos:must-message "lan-neighbor can't be configured for point-to-point interfaces";
                key "name";
                ordered-by user;
                description
                  "Configuration specific to a LAN neighbor";
                leaf name {
                  type jt:ipaddr;
                  description
                    "Address of neighbor";
                }
    
                uses apply-advanced;
    
                container ipv4-adjacency-segment {
                  junos:must "(!(".. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                  description
                    "Configure ipv4 adjacency segment";
                  uses apply-advanced;
    
                  container protected {
                    description
                      "Adjacency SID is eligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container protected
    
                  container unprotected {
                    description
                      "Adjacency SID uneligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container unprotected
                }  // container ipv4-adjacency-segment
              }  // list lan-neighbor
            }  // list interface
    
            leaf no-context-identifier-advertisement {
              junos:must "(!(".. context-identifier"))";
              junos:must-message "no-context-identifier-advertisement and context-identifier attributes are mutually exclusive";
              type empty;
              description
                "Disable context identifier advertisments in this area";
            }
    
            list peer-interface {
              key "name";
              ordered-by user;
              description
                "Configuration for peer interface";
              leaf name {
                type string;
                description
                  "Name of peer interface";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF on this control peer";
                }
              }  // choice enable-disable
    
              leaf retransmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Retransmission interval (seconds)";
              }
    
              leaf transit-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Transit delay (seconds)";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Hello interval (seconds)";
              }
    
              leaf dead-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Dead interval (seconds)";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 65535";
                  }
                }
                description
                  "Maximum OSPF packet size";
              }
    
              choice auth {
                container authentication {
                  uses juniper-ospf-authentication;
                }  // container authentication
                container authentication-key {
                  status deprecated;
                  description
                    "Authentication key";
                  leaf keyname {
                    type jt:unreadable;
                    description
                      "Authentication key value";
                  }
    
                  leaf key-id {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
                }  // container authentication-key
              }  // choice auth
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              leaf no-neighbor-down-notification {
                type empty;
                description
                  "Don't inform other protocols about neighbor down events";
              }
            }  // list peer-interface
    
            leaf no-source-packet-routing {
              type empty;
              description
                "Disable SPRING in this area";
            }
    
            list context-identifier {
              junos:must "(!(".. no-context-identifier-advertisement"))";
              junos:must-message "no-context-identifier-advertisement and context-identifier attributes are mutually exclusive";
              key "name";
              ordered-by user;
              description
                "Configure context identifier in support of edge protection";
              leaf name {
                type jt:ipv4addr;
                description "Context identifier";
              }
    
              uses apply-advanced;
            }  // list context-identifier
    
            list label-switched-path {
              junos:must "(!(".. .. traffic-engineering multicast-rpf-routes"))";
              junos:must-message "cannot advertise LSPs when using multicast-rpf-routes";
              key "name";
              ordered-by user;
              description
                "Configuration for advertisement of a label-switched path";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of label-switched path to be advertised";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF on this label-switched path";
                }
              }  // choice enable-disable
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description "Interface metric";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list label-switched-path
          }  // list area
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable OSPF";
            }
          }  // choice enable-disable
    
          container traceoptions {
            description "Trace options for OSPF";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "spf" {
                    value 0;
                    description
                      "Trace SPF calculations";
                  }
                  enum "error" {
                    value 1;
                    description
                      "Trace errored packets";
                  }
                  enum "event" {
                    value 2;
                    description
                      "Trace OSPF state machine events";
                  }
                  enum "packet-dump" {
                    value 3;
                    description
                      "Dump the contents of selected packet types";
                  }
                  enum "flooding" {
                    value 4;
                    description
                      "Trace LSA flooding";
                  }
                  enum "lsa-analysis" {
                    value 5;
                    description
                      "Trace LSA analysis";
                  }
                  enum "packets" {
                    value 6;
                    description
                      "Trace all OSPF packets";
                  }
                  enum "hello" {
                    value 7;
                    description
                      "Trace hello packets";
                  }
                  enum "database-description" {
                    value 8;
                    description
                      "Trace database description packets";
                  }
                  enum "lsa-request" {
                    value 9;
                    description
                      "Trace LSA request packets";
                  }
                  enum "lsa-update" {
                    value 10;
                    description
                      "Trace LSA update packets";
                  }
                  enum "lsa-ack" {
                    value 11;
                    description
                      "Trace LSA acknowledgment packets";
                  }
                  enum "ldp-synchronization" {
                    value 12;
                    description
                      "Trace synchronization between OSPF and LDP";
                  }
                  enum "on-demand" {
                    value 13;
                    description
                      "Trace demand circuit extensions";
                  }
                  enum "nsr-synchronization" {
                    value 14;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "graceful-restart" {
                    value 15;
                    description
                      "Trace graceful restart";
                  }
                  enum "restart-signaling" {
                    value 16;
                    description
                      "Trace restart signaling";
                  }
                  enum "backup-spf" {
                    value 17;
                    description
                      "Trace backup SPF (LFA) specific events";
                  }
                  enum "source-packet-routing" {
                    value 18;
                    description
                      "Trace source packet routing (SPRING) events";
                  }
                  enum "post-convergence-lfa" {
                    value 19;
                    description
                      "Trace post-convergence-lfa related events";
                  }
                  enum "flex-algorithm" {
                    value 20;
                    description
                      "Trace flex-algorithm related events";
                  }
                  enum "route" {
                    value 21;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 22;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 23;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 24;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 25;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 26;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 27;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 28;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          container spf-options {
            description
              "Configure options for SPF";
            uses apply-advanced;
    
            leaf delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "50 .. 8000";
                }
              }
              units "milliseconds";
              description
                "Time to wait before running an SPF";
            }
    
            leaf holddown {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2000 .. 20000";
                }
              }
              units "milliseconds";
              description
                "Time to hold down before running an SPF";
            }
    
            leaf rapid-runs {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 10";
                }
              }
              description
                "Number of maximum rapid SPF runs before holddown";
            }
    
            leaf no-ignore-our-externals {
              type empty;
              description
                "Do not ignore self-generated external and NSSA LSAs";
            }
          }  // container spf-options
    
          leaf prefix-export-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 4294967295";
              }
            }
            description
              "Maximum number of prefixes that can be exported";
          }
    
          container rib-groups {
            description
              "Routing table groups for importing OSPF routes";
            uses apply-advanced;
    
            leaf inet {
              junos:must "("routing-options rib-groups $$")";
              junos:must-message "Referenced rib-groups must be defined";
              junos:must "(!(".. topology $$={default} rib-group"))";
              junos:must-message "rib-group cannot be used with topology default rib-group";
              type string;
              description
                "Name of the IPv4/v6 routing table group";
            }
    
            leaf inet3 {
              junos:must "("routing-options rib-groups $$")";
              junos:must-message "Referenced rib-groups must be defined";
              junos:must "(!(".. topology $$={default} rib-group"))";
              junos:must-message "rib-group cannot be used with topology default rib-group";
              type string;
              description
                "Name of the IPv4/v6 inet.3 routing table group";
            }
          }  // container rib-groups
    
          leaf job-stats {
            type empty;
            description "Collect job statistics";
          }
    
          container overload {
            presence "enable overload";
            description
              "Set the overload mode (repel transit traffic)";
            uses apply-advanced;
    
            leaf timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 3600";
                }
              }
              units "seconds";
              description
                "Time after which overload mode is reset";
            }
    
            leaf allow-route-leaking {
              type empty;
              description
                "Allow routes to be leaked when overload is configured";
            }
    
            leaf stub-network {
              type empty;
              description
                "Advertise Stub Network with maximum metric";
            }
    
            leaf intra-area-prefix {
              type empty;
              description
                "Advertise Intra Area Prefix with maximum metric";
            }
    
            leaf as-external {
              type empty;
              description
                "Advertise As External with maximum usable metric";
            }
          }  // container overload
    
          container database-protection {
            presence
              "enable database-protection";
            description
              "Configure database protection attributes";
            uses apply-advanced;
    
            leaf maximum-lsa {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1000000";
                }
              }
              description
                "Maximum allowed non self-generated LSAs";
            }
    
            leaf warning-only {
              type empty;
              description
                "Emit only a warning when LSA maximum limit is exceeded";
            }
    
            leaf warning-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "30 .. 100";
                }
              }
              units "percent";
              description
                "Percentage of LSA maximum above which to trigger warning";
            }
    
            leaf ignore-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 32";
                }
              }
              description
                "Maximum number of times to go into ignore state";
            }
    
            leaf ignore-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "30 .. 3600";
                }
              }
              units "seconds";
              description
                "Time to stay in ignore state and ignore all neighbors";
            }
    
            leaf reset-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 86400";
                }
              }
              units "seconds";
              description
                "Time after which the ignore count gets reset to zero";
            }
          }  // container database-protection
    
          container graceful-restart {
            description
              "Configure graceful restart attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable OSPF graceful restart capability";
              }
            }  // choice enable-disable
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              units "seconds";
              description
                "Time for all neighbors to become full";
            }
    
            leaf notify-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              units "seconds";
              description
                "Time to send all max-aged grace LSAs";
            }
    
            container helper-disable {
              presence "enable helper-disable";
              description
                "Disable graceful restart helper capability";
              uses apply-advanced;
    
              choice disable-choices {
                leaf standard {
                  type empty;
                  description
                    "Disable helper-mode for rfc3623 based GR";
                }
                leaf restart-signaling {
                  type empty;
                  description
                    "Disable helper mode for restart-signaling ";
                }
                leaf both {
                  type empty;
                  description
                    "Disable helper mode for both the types of GR";
                }
              }  // choice disable-choices
            }  // container helper-disable
    
            leaf no-strict-lsa-checking {
              junos:must "(!(".. helper-disable"))";
              junos:must-message "To configure no-strict-lsa-checking, helper-disable must not be set";
              type empty;
              description
                "Do not abort graceful helper mode upon LSA changes";
            }
          }  // container graceful-restart
    
          leaf route-type-community {
            type enumeration {
              enum "iana" {
                value 0;
                description
                  "BGP extended community value used is 0x0306";
              }
              enum "vendor" {
                value 1;
                description
                  "Vendor BGP extended community value used is 0x8000";
              }
            }
            description
              "Specify BGP extended community value to encode OSPF route type";
          }
    
          container domain-id {
            description "Configure domain ID";
            choice domain_id_or_disable {
              leaf domain-id {
                type string;
                description "Domain ID";
              }
              leaf disable {
                type empty;
                description "Disable domain ID";
              }
            }  // choice domain_id_or_disable
          }  // container domain-id
    
          choice domain_vpn_tag_or_disable {
            leaf domain-vpn-tag {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Domain VPN tag for external LSA";
            }
            leaf no-domain-vpn-tag {
              type empty;
              description
                "Disable domain VPN tag";
            }
          }  // choice domain_vpn_tag_or_disable
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of internal routes";
          }
    
          leaf external-preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of external routes";
          }
    
          leaf labeled-preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of labeled routes";
          }
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Import policy (for external routes or setting priority)";
          }
    
          leaf reference-bandwidth {
            type string;
            description
              "Bandwidth for calculating metric defaults";
          }
    
          leaf lsa-refresh-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "25 .. 50";
              }
            }
            default "50";
            description
              "LSA refresh interval (minutes)";
          }
    
          leaf spf-delay {
            junos:must "(!(".. spf-options delay"))";
            junos:must-message "You can only configure either spf-delay or delay under spf-options";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "50 .. 8000";
              }
            }
            units "milliseconds";
            status deprecated;
            description
              "Time to wait before running an SPF";
          }
    
          leaf no-rfc-1583 {
            type empty;
            description
              "Disable RFC1583 compatibility";
          }
    
          leaf forwarding-address-to-broadcast {
            type empty;
            description
              "Set forwarding address in Type 5 LSA in broadcast network";
          }
    
          choice nssa-abr-option {
            leaf no-nssa-abr {
              type empty;
              description
                "Disable full NSSA functionality at ABR";
            }
          }  // choice nssa-abr-option
    
          container sham-link {
            presence "enable sham-link";
            description
              "Configure parameters for sham links";
            uses apply-advanced;
    
            leaf local {
              type jt:ipaddr;
              description
                "Local sham link endpoint address";
            }
    
            leaf no-advertise-local {
              type empty;
              status deprecated;
              description
                "Don't advertise local sham link endpoint as stub in router LSA";
            }
          }  // container sham-link
        }  // grouping juniper-protocols-ospf3
    
        grouping juniper-protocols-pim {
          uses apply-advanced;
    
          container family {
            description "Local address family";
            container any {
              presence "enable any";
              description
                "Default properties for all address families";
              uses apply-advanced;
    
              leaf disable {
                type empty;
                description
                  "Disable all families";
              }
            }  // container any
    
            container inet {
              presence "enable inet";
              description
                "IPv4 specific properties";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable PIMv4 on all interfaces";
                }
              }  // choice enable-disable
            }  // container inet
    
            container inet6 {
              presence "enable inet6";
              description
                "IPv6 specific properties";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable PIMv6 on all interfaces";
                }
              }  // choice enable-disable
            }  // container inet6
          }  // container family
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable PIM";
            }
          }  // choice enable-disable
    
          container nonstop-routing {
            junos:must "("routing-options nonstop-routing")";
            junos:must-message "To disable PIM nonstop-routing, non-stop routing must be globally enabled.";
            description
              "Configure PIM nonstop-routing attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable non-stop routing for PIM";
              }
            }  // choice enable-disable
          }  // container nonstop-routing
    
          container traceoptions {
            description "Trace options for PIM";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "route" {
                    value 0;
                    description
                      "Trace routing information";
                  }
                  enum "packets" {
                    value 1;
                    description
                      "Trace all PIM packets";
                  }
                  enum "hello" {
                    value 2;
                    description
                      "Trace hello packets";
                  }
                  enum "register" {
                    value 3;
                    description
                      "Trace register/register-stop messages";
                  }
                  enum "join" {
                    value 4;
                    description
                      "Trace join/prune/graft/graft-ack messages";
                  }
                  enum "prune" {
                    value 5;
                    description
                      "Trace join/prune/graft/graft-ack messages";
                  }
                  enum "graft" {
                    value 6;
                    description
                      "Trace join/prune/graft/graft-ack messages";
                  }
                  enum "bootstrap" {
                    value 7;
                    description
                      "Trace bootstrap/RP/auto-RP messages";
                  }
                  enum "rp" {
                    value 8;
                    description
                      "Trace bootstrap/RP/auto-RP messages";
                  }
                  enum "autorp" {
                    value 9;
                    description
                      "Trace bootstrap/RP/auto-RP messages";
                  }
                  enum "assert" {
                    value 10;
                    description
                      "Trace assert messages";
                  }
                  enum "mdt" {
                    value 11;
                    description
                      "Trace messages related to multicast data tunnels";
                  }
                  enum "nsr-synchronization" {
                    value 12;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum
                    "bidirectional-df-election" {
                    value 13;
                    description
                      "Trace bidirectional PIM DF election events";
                  }
                  enum "mofrr" {
                    value 14;
                    description
                      "Trace Multicast only Fast Re-Route messages";
                  }
                  enum "normal" {
                    value 15;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 16;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 17;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 18;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 19;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 20;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 21;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
    
              container filter {
                presence "enable filter";
                description
                  "Filter to apply to this flag";
                uses pim_filter_obj;
              }  // container filter
            }  // list flag
          }  // container traceoptions
    
          container dense-groups {
            description
              "Dense mode groups for sparse-dense mode";
            uses apply-advanced;
    
            leaf dynamic-reject {
              type empty;
              description
                "Reject dynamic autorp negative dense-mode prefixes learnt from network";
            }
    
            list pim-dense-group-type {
              key "name";
              ordered-by user;
              leaf name {
                type jt:ipprefix;
                description
                  "Group address or range to forward in dense mode";
              }
    
              choice dense-group-flags {
                leaf reject {
                  type empty;
                  description
                    "Do not include prefix as dense mode; force sparse mode";
                }
                leaf announce {
                  type empty;
                  description
                    "Advertise as negative prefix in auto-RP announce messages";
                }
              }  // choice dense-group-flags
            }  // list pim-dense-group-type
          }  // container dense-groups
    
          leaf vpn-tunnel-source {
            type jt:ipv4addr;
            status deprecated;
            description
              "Source address for the provider space mGRE tunnel";
          }
    
          leaf vpn-group-address {
            junos:must "(!(".. .. .. provider-tunnel pim-ssm"))";
            junos:must-message "'provider-tunnel pim-ssm' can not be configured with 'pim vpn-group-address'. Please disable one of them.";
            junos:must "((!(".. .. .. provider-tunnel pim-asm") || ".. .. .. provider-tunnel pim-asm group-address $$"))";
            junos:must-message "MVPN inclusive provider-tunnel group-address must be same as 'vpn-group-address'";
            type jt:ipv4addr;
            status deprecated;
            description
              "Group address for the VPN in provider space";
          }
    
          leaf-list tunnel-devices {
            type union {
              type jt:interface-device;
              type string {
                pattern "<.*>|$.*";
              }
            }
            ordered-by user;
            description
              "Tunnel devices to be used for creating mt interfaces";
          }
    
          container rpf-selection {
            description "Select RPF neighbor";
            uses apply-advanced;
    
            list group {
              key "name";
              ordered-by user;
              description
                "IP prefix of multicast group";
              leaf name {
                type jt:ipprefix;
                description "IP prefix of group";
              }
    
              uses apply-advanced;
    
              container wildcard-source {
                presence
                  "enable wildcard-source";
                description
                  "Select RPF for (*,g) and unspecified (s,g) joins";
                uses apply-advanced;
    
                leaf next-hop {
                  type jt:ipaddr;
                  description "Next-hop address";
                }
              }  // container wildcard-source
    
              list source {
                key "name";
                ordered-by user;
                description
                  "IP prefix of one or more multicast sources";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP prefix of source";
                }
    
                uses apply-advanced;
    
                leaf next-hop {
                  type jt:ipaddr;
                  description "Next-hop address";
                }
              }  // list source
            }  // list group
    
            list prefix-list {
              key "name";
              ordered-by user;
              description
                "Multicast group prefix list";
              leaf name {
                junos:must "("policy-options prefix-list $$")";
                junos:must-message "This prefix-list must be configured in policy-options.";
                type string;
                description
                  "Name of prefix list to match against";
              }
    
              uses apply-advanced;
    
              container wildcard-source {
                presence
                  "enable wildcard-source";
                description
                  "Select RPF for (*,g) and unspecified (s,g) joins";
                uses apply-advanced;
    
                leaf next-hop {
                  type jt:ipaddr;
                  description "Next-hop address";
                }
              }  // container wildcard-source
    
              list source {
                key "name";
                ordered-by user;
                description
                  "IP prefix of one or more multicast sources";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP prefix of source";
                }
    
                uses apply-advanced;
    
                leaf next-hop {
                  type jt:ipaddr;
                  description "Next-hop address";
                }
              }  // list source
            }  // list prefix-list
          }  // container rpf-selection
    
          container mvpn {
            presence "enable mvpn";
            description
              "PIM MVPN control-plane options";
            uses apply-advanced;
    
            container autodiscovery {
              junos:must "(!(".. .. vpn-group-address"))";
              junos:must-message "PIM MVPN autodiscovery options cannot be configured with 'vpn-group-address'";
              junos:must "(".. .. .. mvpn")";
              junos:must-message "Autodiscovery for PIM MVPNs requires 'protocols mvpn'";
              junos:must "(!(".. .. mdt"))";
              junos:must-message "PIM MVPN auto-discovery cannot be configured with 'pim mdt'";
              status deprecated;
              description
                "PE router autodiscovery options for SSM MDTs";
              uses apply-advanced;
    
              leaf inet-mdt {
                type empty;
                description
                  "MDT-SAFI PE autodiscovery for SSM MDTs";
              }
            }  // container autodiscovery
    
            container family {
              description
                "PIM MVPN address family";
              uses apply-advanced;
    
              container inet {
                description
                  "IPv4 PIM MVPN specific properties";
                uses apply-advanced;
    
                leaf rosen-mvpn {
                  type empty;
                  status deprecated;
                }
    
                leaf ngen-mvpn {
                  junos:must "(".. .. .. .. .. mvpn")";
                  junos:must-message "Requires 'protocols mvpn'";
                  type empty;
                  status deprecated;
                }
    
                container autodiscovery {
                  junos:must "(!(".. .. .. .. vpn-group-address"))";
                  junos:must-message "PIM MVPN autodiscovery options cannot be configured with 'vpn-group-address'";
                  junos:must "(".. .. .. .. .. mvpn")";
                  junos:must-message "Autodiscovery for PIM MVPNs requires 'protocols mvpn'";
                  junos:must "(!(".. .. .. .. mdt"))";
                  junos:must-message "PIM MVPN auto-discovery cannot be configured with 'pim mdt'";
                  description
                    "PE router autodiscovery options for SSM MDTs";
                  uses apply-advanced;
    
                  leaf inet-mdt {
                    type empty;
                    description
                      "MDT-SAFI PE autodiscovery for SSM MDTs";
                  }
                }  // container autodiscovery
    
                leaf disable {
                  type empty;
                  description
                    "Disable family IPv4";
                }
              }  // container inet
    
              container inet6 {
                description
                  "IPv6 PIM MVPN specific properties";
                uses apply-advanced;
    
                leaf rosen-mvpn {
                  type empty;
                  status deprecated;
                }
    
                leaf ngen-mvpn {
                  junos:must "(".. .. .. .. .. mvpn")";
                  junos:must-message "Requires 'protocols mvpn'";
                  type empty;
                  status deprecated;
                }
    
                container autodiscovery {
                  junos:must "(!(".. .. .. .. vpn-group-address"))";
                  junos:must-message "PIM MVPN autodiscovery options cannot be configured with 'vpn-group-address'";
                  junos:must "(".. .. .. .. .. mvpn")";
                  junos:must-message "Autodiscovery for PIM MVPNs requires 'protocols mvpn'";
                  junos:must "(!(".. .. .. .. mdt"))";
                  junos:must-message "PIM MVPN auto-discovery cannot be configured with 'pim mdt'";
                  description
                    "PE router autodiscovery options for SSM MDTs";
                  uses apply-advanced;
    
                  leaf inet-mdt {
                    type empty;
                    description
                      "MDT-SAFI PE autodiscovery for SSM MDTs";
                  }
                }  // container autodiscovery
    
                leaf disable {
                  type empty;
                  description
                    "Disable family IPv6";
                }
              }  // container inet6
            }  // container family
          }  // container mvpn
    
          container rib-group {
            description "Routing table group";
            uses rib_group_type;
          }  // container rib-group
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description
              "PIM sparse import join policy";
          }
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description
              "PIM sparse export join policy";
          }
    
          container mldp-inband-signalling {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable mldp-inband-signalling";
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "PIM MLDP join translation filter policy";
            }
          }  // container mldp-inband-signalling
    
          container rpf-vector {
            description "RPF vector TLV";
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "RPF vector TLV include policy";
            }
          }  // container rpf-vector
    
          leaf assert-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "5 .. 210";
              }
            }
            default "180";
            description "Set assert timeout";
          }
    
          leaf assert-robust-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 5";
              }
            }
            default "2";
            description
              "Number of assert messages an assert winner sends in one cycle";
          }
    
          leaf join-prune-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "210 .. 420";
              }
            }
            default "210";
            description "Set join/prune timeout";
          }
    
          container spt-threshold {
            description
              "Set shortest-path-tree threshold policy";
            uses apply-advanced;
    
            leaf-list infinity {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Apply policy to always remain on shared tree";
            }
          }  // container spt-threshold
    
          container sglimit {
            description
              "Set limit on number of (S,G) states ";
            uses apply-advanced;
    
            list family {
              junos:must "(!(".. maximum"))";
              junos:must-message "Family wise threshold cannot be configuredif global threshold is already configured";
              key "name";
              ordered-by user;
              description "Protocol family";
              leaf name {
                type enumeration {
                  enum "inet" {
                    value 0;
                    description "IPv4 family";
                  }
                  enum "inet6" {
                    value 1;
                    description "IPv6 family";
                  }
                }
              }
    
              uses apply-advanced;
    
              leaf maximum {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum limit above which additional entries are not accepted";
              }
    
              leaf threshold {
                junos:must "(".. maximum")";
                junos:must-message "To configure threshold, maximum must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                description
                  "Percentage of maximum at which to start generating warnings";
              }
    
              leaf log-interval {
                junos:must "(".. maximum")";
                junos:must-message "To configure log-interval, maximum must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Time between successive log messages";
              }
            }  // list family
    
            leaf maximum {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Maximum limit above which additional entries are not accepted";
            }
    
            leaf threshold {
              junos:must "(".. maximum")";
              junos:must-message "To configure threshold, maximum must be configured";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of maximum at which to start generating warnings";
            }
    
            leaf log-interval {
              junos:must "(".. maximum")";
              junos:must-message "To configure log-interval, maximum must be configured";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Time between successive log messages";
            }
          }  // container sglimit
    
          container rp {
            junos:must "(!(" .. passive"))";
            junos:must-message "pim rp cannot be configured with pim passive";
            description
              "Router's rendezvous point properties";
            uses apply-advanced;
    
            leaf bootstrap-priority {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 255";
                }
              }
              description
                "Eligibility to be the bootstrap router (IPv4 only)";
            }
    
            leaf-list bootstrap-import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Bootstrap import policy (IPv4 only)";
            }
    
            leaf-list bootstrap-export {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Bootstrap export policy (IPv4 only)";
            }
    
            container bootstrap {
              description "Bootstrap properties";
              uses apply-advanced;
    
              container family {
                description
                  "Bootstrap address family";
                container inet {
                  junos:must "(!((".. .. .. bootstrap-priority" || (".. .. .. bootstrap-import" || ".. .. .. bootstrap-export"))))";
                  junos:must-message "Duplicate IPv4 bootstrap configuration";
                  description
                    "IPv4 bootstrap properties";
                  uses pim_bootstrap_options_type;
                }  // container inet
    
                container inet6 {
                  description
                    "IPv6 bootstrap properties";
                  uses pim_bootstrap_options_type;
                }  // container inet6
              }  // container family
            }  // container bootstrap
    
            container register-limit {
              description
                "Set limit on incoming registers that create (S,G) state";
              uses apply-advanced;
    
              list family {
                junos:must "(!(".. maximum"))";
                junos:must-message "Family wise threshold cannot be configuredif global threshold is already configured";
                key "name";
                ordered-by user;
                description "Protocol family";
                leaf name {
                  type enumeration {
                    enum "inet" {
                      value 0;
                      description "IPv4 family";
                    }
                    enum "inet6" {
                      value 1;
                      description "IPv6 family";
                    }
                  }
                }
    
                uses apply-advanced;
    
                leaf maximum {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Maximum limit above which additional entries are not accepted";
                }
    
                leaf threshold {
                  junos:must "(".. maximum")";
                  junos:must-message "To configure threshold, maximum must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of maximum at which to start generating warnings";
                }
    
                leaf log-interval {
                  junos:must "(".. maximum")";
                  junos:must-message "To configure log-interval, maximum must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Time between successive log messages";
                }
              }  // list family
    
              leaf maximum {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum limit above which additional entries are not accepted";
              }
    
              leaf threshold {
                junos:must "(".. maximum")";
                junos:must-message "To configure threshold, maximum must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                description
                  "Percentage of maximum at which to start generating warnings";
              }
    
              leaf log-interval {
                junos:must "(".. maximum")";
                junos:must-message "To configure log-interval, maximum must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Time between successive log messages";
              }
            }  // container register-limit
    
            container group-rp-mapping {
              description "Group-rp-mapping";
              uses apply-advanced;
    
              list family {
                junos:must "(!(".. maximum"))";
                junos:must-message "Family wise threshold cannot be configuredif global threshold is already configured";
                key "name";
                ordered-by user;
                description "Protocol family";
                leaf name {
                  type enumeration {
                    enum "inet" {
                      value 0;
                      description "IPv4 family";
                    }
                    enum "inet6" {
                      value 1;
                      description "IPv6 family";
                    }
                  }
                }
    
                uses apply-advanced;
    
                leaf maximum {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Maximum limit above which additional entries are not accepted";
                }
    
                leaf threshold {
                  junos:must "(".. maximum")";
                  junos:must-message "To configure threshold, maximum must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of maximum at which to start generating warnings";
                }
    
                leaf log-interval {
                  junos:must "(".. maximum")";
                  junos:must-message "To configure log-interval, maximum must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Time between successive log messages";
                }
              }  // list family
    
              leaf maximum {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum limit above which additional entries are not accepted";
              }
    
              leaf threshold {
                junos:must "(".. maximum")";
                junos:must-message "To configure threshold, maximum must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                description
                  "Percentage of maximum at which to start generating warnings";
              }
    
              leaf log-interval {
                junos:must "(".. maximum")";
                junos:must-message "To configure log-interval, maximum must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Time between successive log messages";
              }
            }  // container group-rp-mapping
    
            leaf-list rp-register-policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "RP policy applied to incoming register messages";
            }
    
            leaf-list dr-register-policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "DR policy applied to outgoing register messages";
            }
    
            container local {
              description
                "Router's local RP properties";
              uses apply-advanced;
    
              leaf address {
                type jt:ipv4addr;
                description
                  "Local RP address (IPv4 only)";
              }
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable this RP (IPv4 only)";
                }
              }  // choice enable-disable
    
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Router's priority for becoming an RP (IPv4 only)";
              }
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "How long neighbor considers this router to be up, in seconds (IPv4 only)";
              }
    
              list group-ranges {
                key "name";
                ordered-by user;
                description
                  "Group address range for which this router can be an RP (IPv4 only)";
                leaf name {
                  type jt:ipv4prefix;
                }
    
                uses apply-advanced;
              }  // list group-ranges
    
              leaf override {
                type empty;
                description
                  "Static RP mapping will take precedence over dynamic";
              }
    
              leaf process-non-null-as-null-register {
                type empty;
                description
                  "Process incoming non null registers as null registers";
              }
    
              container family {
                description
                  "Local RP address family";
                container inet {
                  description
                    "IPv4 local RP properties";
                  uses apply-advanced;
    
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Local RP address";
                  }
    
                  choice enable-disable {
                    leaf disable {
                      type empty;
                      description
                        "Disable this RP";
                    }
                  }  // choice enable-disable
    
                  leaf priority {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Router's priority for becoming an RP";
                  }
    
                  leaf hold-time {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "How long neighbor considers this router to be up, in seconds";
                  }
    
                  list group-ranges {
                    key "name";
                    ordered-by user;
                    description
                      "Group address range for which this router can be an RP";
                    leaf name {
                      type jt:ipv4prefix;
                    }
    
                    uses apply-advanced;
                  }  // list group-ranges
    
                  leaf override {
                    type empty;
                    description
                      "Static RP mapping will take precedence over dynamic";
                  }
    
                  container anycast-pim {
                    description
                      "Attributes for IPv4 anycast PIM";
                    uses apply-advanced;
    
                    container rp-set {
                      description
                        "Rendezvous points belonging to anycast RP set";
                      uses apply-advanced;
    
                      list address {
                        key "name";
                        ordered-by user;
                        description
                          "IPv4 address of one or more remote anycast RPs";
                        leaf name {
                          type jt:ipaddr;
                          description
                            "IPv4 address of remote anycast RP";
                        }
    
                        uses apply-advanced;
    
                        leaf forward-msdp-sa {
                          type empty;
                          description
                            "Forward SAs learned from MSDP to this RP";
                        }
                      }  // list address
                    }  // container rp-set
    
                    leaf local-address {
                      type jt:ipaddr;
                      description
                        "Local address for replicating register messages to other RPs";
                    }
                  }  // container anycast-pim
                }  // container inet
    
                container inet6 {
                  description
                    "IPv6 local RP properties";
                  uses apply-advanced;
    
                  leaf address {
                    type jt:ipv6addr;
                    description
                      "Local RP address";
                  }
    
                  choice enable-disable {
                    leaf disable {
                      type empty;
                      description
                        "Disable this RP";
                    }
                  }  // choice enable-disable
    
                  leaf priority {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Router's priority for becoming an RP";
                  }
    
                  leaf hold-time {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "How long neighbor considers this router to be up, in seconds";
                  }
    
                  list group-ranges {
                    key "name";
                    ordered-by user;
                    description
                      "Group address range for which this router can be an RP";
                    leaf name {
                      type jt:ipv6prefix;
                    }
    
                    uses apply-advanced;
                  }  // list group-ranges
    
                  leaf override {
                    type empty;
                    description
                      "Static RP mapping will take precedence over dynamic";
                  }
    
                  container anycast-pim {
                    description
                      "Attributes for IPv6 anycast PIM";
                    uses apply-advanced;
    
                    container rp-set {
                      description
                        "Rendezvous points belonging to anycast RP set";
                      uses apply-advanced;
    
                      list address {
                        key "name";
                        ordered-by user;
                        description
                          "IPv6 address of one or more remote anycast RPs";
                        leaf name {
                          type jt:ipv6addr;
                          description
                            "IPv6 address of remote anycast RP";
                        }
    
                        uses apply-advanced;
                      }  // list address
                    }  // container rp-set
    
                    leaf local-address {
                      type jt:ipv6addr;
                      description
                        "Local address for replicating register messages to other RPs";
                    }
                  }  // container anycast-pim
                }  // container inet6
              }  // container family
            }  // container local
    
            container embedded-rp {
              presence "enable embedded-rp";
              description
                "Set embedded-RP mode (IPv6 only)";
              uses apply-advanced;
    
              list group-ranges {
                key "name";
                ordered-by user;
                description
                  "Group address range of RP";
                uses pim_rp_group_range_type;
              }  // list group-ranges
    
              leaf maximum-rps {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 500";
                  }
                }
                default "100";
                description
                  "Maximum number of embedded RPs";
              }
            }  // container embedded-rp
    
            container auto-rp {
              description
                "Set auto-RP mode (IPv4 only)";
              uses apply-advanced;
    
              choice autorp-mode {
                leaf discovery {
                  type empty;
                  description
                    "Listen for auto-RP discovery messages";
                }
                leaf announce {
                  type empty;
                  description
                    "Transmit auto-RP announcement messages";
                }
                leaf mapping {
                  type empty;
                  description
                    "Transmit auto-RP mapping messages";
                }
              }  // choice autorp-mode
    
              choice mapping-agent-election-choice {
                leaf mapping-agent-election {
                  type empty;
                  description
                    "Consider higher-addressed mapping agents as authoritative";
                }
                leaf no-mapping-agent-election {
                  type empty;
                  description
                    "Don't consider higher-addressed mapping agents as authoritative";
                }
              }  // choice mapping-agent-election-choice
            }  // container auto-rp
    
            container static {
              description
                "Configure static PIM RPs";
              uses apply-advanced;
    
              list address {
                key "name";
                ordered-by user;
                description "RP address";
                leaf name {
                  type jt:ipaddr;
                  description "IP address of RP";
                }
    
                uses apply-advanced;
    
                leaf version {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 2";
                    }
                  }
                  status deprecated;
                  description
                    "PIM version of RP";
                }
    
                list group-ranges {
                  key "name";
                  ordered-by user;
                  description
                    "Group address range of RP";
                  uses pim_rp_group_range_type;
                }  // list group-ranges
    
                leaf override {
                  type empty;
                  description
                    "Static RP mapping will take precedence over dynamic";
                }
              }  // list address
            }  // container static
    
            leaf register-probe-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "5 .. 60";
                }
              }
              units "seconds";
              default "5";
              description "Register probe time";
            }
          }  // container rp
    
          leaf passive {
            junos:must "(!(any ".. interface <*> distributed-dr"))";
            junos:must-message "pim passive cannot be configured with pim distributed-dr";
            junos:must "(!(" .. rp"))";
            junos:must-message "pim passive cannot be configured with pim rp";
            type empty;
            description
              "Configure PIM protocol in passive mode";
          }
    
          list interface {
            key "name";
            ordered-by user;
            description "PIM interface options";
            leaf name {
              junos:must "(((("routing-options multicast interface $$ disable" || ("routing-options multicast interface $$ maximum-bandwidth" || ("routing-options multicast interface $$ nexthop-unicast-address" || ("routing-options multicast interface $$ reverse-oif-mapping" || ("routing-options multicast interface $$ subscriber-leave-timer" || "routing-options multicast interface $$ no-qos-adjust"))))) && !("routing-options multicast interface $$ enable")) || ("protocols pim interface $$ disable" || !(("routing-options multicast interface $$" || "routing-options multicast interface $$ enable")))))";
              junos:must-message "Multicast cannot be enabled on the same interface in the [edit routing-options] hierarchy";
              type string;
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container family {
              description "Local address family";
              container any {
                presence "enable any";
                description
                  "Default properties for all families";
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable all families";
                }
              }  // container any
    
              container inet {
                presence "enable inet";
                description
                  "IPv4 specific properties";
                uses apply-advanced;
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
    
                  container authentication {
                    description
                      "Authentication options";
                    uses apply-advanced;
    
                    leaf key-chain {
                      junos:must "(".. algorithm")";
                      junos:must-message "May not be configured without algorithm";
                      junos:must "("security authentication-key-chains key-chain $$")";
                      junos:must-message "Referenced key-chain must be defined";
                      type string;
                      description
                        "Key chain name";
                    }
    
                    leaf algorithm {
                      junos:must "(".. key-chain")";
                      junos:must-message "May not be configured without key-chain";
                      type enumeration {
                        enum "simple-password" {
                          value 0;
                          description
                            "Simple password";
                        }
                        enum "keyed-md5" {
                          value 1;
                          description
                            "Keyed message Digest 5";
                        }
                        enum
                          "meticulous-keyed-md5" {
                          value 2;
                          description
                            "Meticulous keyed message Digest 5";
                        }
                        enum "keyed-sha-1" {
                          value 3;
                          description
                            "Keyed secure hash algorithm (SHA1) ";
                        }
                        enum
                          "meticulous-keyed-sha-1" {
                          value 4;
                          description
                            "Meticulous keyed secure hash algorithm (SHA1) ";
                        }
                      }
                      description
                        "Algorithm name";
                    }
    
                    leaf loose-check {
                      type empty;
                      description
                        "Verify authentication only if authentication is negotiated";
                    }
                  }  // container authentication
                }  // container bfd-liveness-detection
    
                leaf mcae-mac-synchronize {
                  type empty;
                  description
                    "Mclag mac synchronization";
                }
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable PIMv4 on this interface";
                  }
                }  // choice enable-disable
              }  // container inet
    
              container inet6 {
                presence "enable inet6";
                description
                  "IPv6 specific properties";
                uses apply-advanced;
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
    
                  container authentication {
                    description
                      "Authentication options";
                    uses apply-advanced;
    
                    leaf key-chain {
                      junos:must "(".. algorithm")";
                      junos:must-message "May not be configured without algorithm";
                      junos:must "("security authentication-key-chains key-chain $$")";
                      junos:must-message "Referenced key-chain must be defined";
                      type string;
                      description
                        "Key chain name";
                    }
    
                    leaf algorithm {
                      junos:must "(".. key-chain")";
                      junos:must-message "May not be configured without key-chain";
                      type enumeration {
                        enum "simple-password" {
                          value 0;
                          description
                            "Simple password";
                        }
                        enum "keyed-md5" {
                          value 1;
                          description
                            "Keyed message Digest 5";
                        }
                        enum
                          "meticulous-keyed-md5" {
                          value 2;
                          description
                            "Meticulous keyed message Digest 5";
                        }
                        enum "keyed-sha-1" {
                          value 3;
                          description
                            "Keyed secure hash algorithm (SHA1) ";
                        }
                        enum
                          "meticulous-keyed-sha-1" {
                          value 4;
                          description
                            "Meticulous keyed secure hash algorithm (SHA1) ";
                        }
                      }
                      description
                        "Algorithm name";
                    }
    
                    leaf loose-check {
                      type empty;
                      description
                        "Verify authentication only if authentication is negotiated";
                    }
                  }  // container authentication
                }  // container bfd-liveness-detection
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable PIMv6 on this interface";
                  }
                }  // choice enable-disable
              }  // container inet6
            }  // container family
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable PIM on this interface";
              }
            }  // choice enable-disable
    
            leaf mode {
              type enumeration {
                enum "dense" {
                  value 0;
                  description "Dense mode";
                }
                enum "sparse" {
                  value 1;
                  description "Sparse mode";
                }
                enum "sparse-dense" {
                  value 2;
                  description
                    "Sparse-dense mode";
                }
                enum "bidirectional-sparse" {
                  junos:must "((!(".. .. .. .. .. .. routing-instances") || any ".. .. .. .. .. .. routing-instances <*> instance-type virtual-router"))";
                  junos:must-message "Only master instance and routing-instances of type virtual-router support PIM-BIDIR.";
                  junos:must "(!(".. version $$={1}"))";
                  junos:must-message "PIM Bidirectional is not supported by PIMv1.";
                  value 3;
                  description
                    "Bidirectional-sparse mode";
                }
                enum
                  "bidirectional-sparse-dense" {
                  junos:must "((!(".. .. .. .. .. .. routing-instances") || any ".. .. .. .. .. .. routing-instances <*> instance-type virtual-router"))";
                  junos:must-message "Only master instance and routing-instances of type virtual-router support PIM-BIDIR.";
                  junos:must "(!(".. version $$={1}"))";
                  junos:must-message "PIM Bidirectional is not supported by PIMv1.";
                  value 4;
                  description
                    "Bidirectional-sparse-dense mode";
                }
              }
              description "Mode of interface";
            }
    
            leaf priority {
              junos:must "((!(".. mode dense") || (".. mode dense" && "protocols igmp interface ${interface} version 1")))";
              junos:must-message "PIM DR Priority cannot be configured in Dense Mode unless IGMP V1 is configured";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Hello option DR priority";
            }
    
            container stickydr {
              presence "enable stickydr";
              description "Make DR sticky";
              uses apply-advanced;
            }  // container stickydr
    
            container multiple-triggered-joins {
              presence
                "enable multiple-triggered-joins";
              description
                "Send multiple pim triggered joins in quick intervals";
              uses apply-advanced;
    
              leaf count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "2 .. 15";
                  }
                }
                default "2";
                description
                  "Set number of triggered joins to be sent";
              }
    
              leaf interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "100 .. 1000";
                  }
                }
                default "100";
                description
                  "Set interval between multiple triggered joins to be sent in milliseconds";
              }
            }  // container multiple-triggered-joins
    
            leaf version {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 2";
                }
              }
              status deprecated;
              description "Force PIM version";
            }
    
            leaf hello-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 255";
                }
              }
              units "seconds";
              description "Hello interval";
            }
    
            leaf-list neighbor-policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "PIM neighbor policy applied to incoming hello messages";
            }
    
            leaf-list accept-join-always-from {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Accept pim join/prune messages based on the policy configured";
            }
    
            leaf accept-remote-source {
              type empty;
              description
                "Accept traffic from remote source";
            }
    
            container dual-dr {
              junos:must "(!(" .. distributed-dr"))";
              junos:must-message "pim dual-dr cannot be configured with pim distributed-dr";
              presence "enable dual-dr";
              description
                "Configure PIM Dual DR";
              uses apply-advanced;
    
              leaf enhanced {
                type empty;
                description
                  "Enable enhanced PIM Dual DR";
              }
            }  // container dual-dr
    
            leaf distributed-dr {
              junos:must "(!(".. .. .. passive"))";
              junos:must-message "pim distributed-dr cannot be configured with pim passive";
              junos:must "(!(" .. dual-dr"))";
              junos:must-message "pim distributed-dr cannot be configured with pim dual-dr";
              type empty;
              description "PIM Distributed DR";
            }
    
            leaf reset-tracking-bit {
              type empty;
              description
                "Clear tracking-bit in PIM Hello LAN Prune Delay Option";
            }
    
            leaf propagation-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "250 .. 2000";
                }
              }
              units "milliseconds";
              default "500";
              description
                "Propagation delay value";
            }
    
            leaf override-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "500 .. 6000";
                }
              }
              units "milliseconds";
              default "2000";
              description
                "Override interval value";
            }
    
            container bfd-liveness-detection {
              status deprecated;
              description
                "Bidirectional Forwarding Detection options (ipv4 only)";
              uses apply-advanced;
    
              leaf version {
                type enumeration {
                  enum "0" {
                    value 0;
                    description
                      "BFD version 0 (deprecated)";
                  }
                  enum "1" {
                    value 1;
                    description "BFD version 1";
                  }
                  enum "automatic" {
                    value 2;
                    description
                      "Choose BFD version automatically";
                  }
                }
                default "automatic";
                description
                  "BFD protocol version number";
              }
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit and receive interval";
              }
    
              leaf minimum-transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                status deprecated;
                description
                  "Minimum transmit interval";
              }
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval";
              }
    
              leaf multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                default "3";
                description
                  "Detection time multiplier";
              }
    
              choice adaptation-choice {
                leaf no-adaptation {
                  type empty;
                  description
                    "Disable adaptation";
                }
              }  // choice adaptation-choice
    
              container transmit-interval {
                description
                  "Transmit-interval options";
                uses apply-advanced;
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit interval";
                }
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High transmit interval triggering a trap";
                }
              }  // container transmit-interval
    
              container detection-time {
                description
                  "Detection-time options";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High detection-time triggering a trap";
                }
              }  // container detection-time
    
              container authentication {
                description
                  "Authentication options";
                uses apply-advanced;
    
                leaf key-chain {
                  junos:must "(".. algorithm")";
                  junos:must-message "May not be configured without algorithm";
                  junos:must "("security authentication-key-chains key-chain $$")";
                  junos:must-message "Referenced key-chain must be defined";
                  type string;
                  description "Key chain name";
                }
    
                leaf algorithm {
                  junos:must "(".. key-chain")";
                  junos:must-message "May not be configured without key-chain";
                  type enumeration {
                    enum "simple-password" {
                      value 0;
                      description
                        "Simple password";
                    }
                    enum "keyed-md5" {
                      value 1;
                      description
                        "Keyed message Digest 5";
                    }
                    enum "meticulous-keyed-md5" {
                      value 2;
                      description
                        "Meticulous keyed message Digest 5";
                    }
                    enum "keyed-sha-1" {
                      value 3;
                      description
                        "Keyed secure hash algorithm (SHA1) ";
                    }
                    enum
                      "meticulous-keyed-sha-1" {
                      value 4;
                      description
                        "Meticulous keyed secure hash algorithm (SHA1) ";
                    }
                  }
                  description "Algorithm name";
                }
    
                leaf loose-check {
                  type empty;
                  description
                    "Verify authentication only if authentication is negotiated";
                }
              }  // container authentication
            }  // container bfd-liveness-detection
          }  // list interface
    
          container mdt {
            junos:must "((!(" .. .. mvpn") || ".. mvpn family inet rosen-mvpn"))";
            junos:must-message "Data tunnels cannot be configured with 'protocols mvpn'";
            status deprecated;
            description
              "Configure multicast data tunnel parameters";
            uses apply-advanced;
    
            container threshold {
              description
                "Threshold for creation of multicast tunnels";
              uses apply-advanced;
    
              list group {
                key "name";
                ordered-by user;
                description
                  "IP prefix of multicast group";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP prefix of group";
                }
    
                uses apply-advanced;
    
                list source {
                  key "name";
                  ordered-by user;
                  description
                    "IP prefix of one or more multicast sources ";
                  leaf name {
                    type jt:ipprefix;
                    description
                      "IP prefix of source";
                  }
    
                  uses apply-advanced;
    
                  leaf rate {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "10 .. 1000000";
                      }
                    }
                    units "kilobits";
                    description
                      "Data threshold to create new tunnel";
                  }
                }  // list source
              }  // list group
            }  // container threshold
    
            leaf data-mdt-reuse {
              type empty;
              description
                "Allow multiple customer streams to be transmitted over one data tunnel ";
            }
    
            leaf tunnel-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 8192";
                }
              }
              description
                "Maximum multicast data tunnels";
            }
    
            leaf group-range {
              type jt:ipprefix;
              description
                "Group address range for multicast data tunnels";
            }
          }  // container mdt
    
          container graceful-restart {
            description
              "Configure graceful restart attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable PIM graceful restart capability";
              }
            }  // choice enable-disable
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 300";
                }
              }
              units "seconds";
              description
                "Maximum time for graceful restart to finish (seconds)";
            }
    
            leaf no-bidirectional-mode {
              type empty;
              description
                "Disable PIM graceful restart for bidirectional mode";
            }
    
            leaf restart-complete-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "5 .. 300";
                }
              }
              units "seconds";
              description
                "Maximum time for graceful restart to complete (seconds)";
            }
          }  // container graceful-restart
    
          container join-load-balance {
            presence "enable join-load-balance";
            description
              "Configure PIM join load balancing";
            uses apply-advanced;
    
            leaf automatic {
              type empty;
              description
                "Enable automatic PIM join load balancing";
            }
          }  // container join-load-balance
    
          leaf standby-path-creation-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 300";
              }
            }
            units "seconds";
            description
              "Amount of time to wait before creating standby path";
          }
    
          leaf idle-standby-path-switchover-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 300";
              }
            }
            units "seconds";
            description
              "Amount of time to wait before switching over to idle standby path";
          }
    
          leaf dr-election-on-p2p {
            type empty;
            description
              "Enable DR election on Point-to-Point Interfaces";
          }
    
          leaf no-wildcard-register-stop {
            type empty;
            description
              "Disable sending of wildcard register stop message";
          }
    
          leaf nexthop-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1000";
              }
            }
            units "milliseconds";
            description
              "Nexthop hold time in milliseconds";
          }
    
          leaf mpls-internet-multicast {
            junos:must "(any "routing-instances <*> instance-type mpls-internet-multicast")";
            junos:must-message "The mpls-internet-multicast instance must be configured to support multicast over MPLS";
            type empty;
            description
              "Enable support for Internet Multicast over MPLS";
          }
    
          container join-make-before-break {
            description
              "Enable PIM Join Make-Before-Break during RPF neighbor change";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable Make-Before-Break for PIM RPF neighbor change";
              }
            }  // choice enable-disable
          }  // container join-make-before-break
    
          leaf reset-tracking-bit {
            type empty;
            description
              "Clear tracking-bit in PIM Hello LAN Prune Delay Option";
          }
    
          leaf propagation-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "250 .. 2000";
              }
            }
            units "milliseconds";
            default "500";
            description
              "Propagation delay value";
          }
    
          leaf override-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "500 .. 6000";
              }
            }
            units "milliseconds";
            default "2000";
            description
              "Override interval value";
          }
    
          container default-vpn-source {
            presence "enable default-vpn-source";
            description
              "Let all VRFs use master loopback address for mt interfaces";
            uses apply-advanced;
    
            leaf interface-name {
              junos:must "("interfaces $$-IFL family inet address")";
              junos:must-message "Family inet address should be configured on this loopback interface";
              type union {
                type jt:interface-unit;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Master loopback interface name";
            }
          }  // container default-vpn-source
        }  // grouping juniper-protocols-pim
    
        grouping juniper-protocols-pim-snooping {
          description "PIM snooping options";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for PIM Snooping";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all PIM packets";
                  }
                  enum "hello" {
                    value 1;
                    description
                      "Trace hello packets";
                  }
                  enum "join" {
                    value 2;
                    description
                      "Trace join messages";
                  }
                  enum "prune" {
                    value 3;
                    description
                      "Trace prune messages";
                  }
                  enum "route" {
                    value 4;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 5;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 6;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 7;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 8;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 9;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 10;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 11;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf no-dr-flood {
            type empty;
            description
              "Disable default flooding of multicast data on the PIM designated router port";
          }
    
          list vlan {
            key "name";
            ordered-by user;
            description "Vlan options";
            leaf name {
              junos:must "(".. .. .. .. vlan-id all")";
              junos:must-message "vlan specific configuration is allowed with qualified-learning only";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 1023";
                }
              }
              description
                "Vlan_id of the learning-domain";
            }
    
            uses apply-advanced;
    
            leaf no-dr-flood {
              type empty;
              description
                "Disable default flooding of multicast data on the PIM DR port";
            }
          }  // list vlan
        }  // grouping juniper-protocols-pim-snooping
    
        grouping juniper-protocols-rip {
          uses apply-advanced;
    
          container traceoptions {
            description "Trace options for RIP";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "auth" {
                    value 0;
                    description
                      "Trace RIP authentication";
                  }
                  enum "error" {
                    value 1;
                    description
                      "Trace RIP errors";
                  }
                  enum "expiration" {
                    value 2;
                    description
                      "Trace RIP route expiration processing";
                  }
                  enum "holddown" {
                    value 3;
                    description
                      "Trace RIP hold-down processing";
                  }
                  enum "packets" {
                    value 4;
                    description
                      "Trace all RIP packets";
                  }
                  enum "request" {
                    value 5;
                    description
                      "Trace RIP information packets";
                  }
                  enum "trigger" {
                    value 6;
                    description
                      "Trace RIP triggered updates";
                  }
                  enum "update" {
                    value 7;
                    description
                      "Trace RIP update packets";
                  }
                  enum "nsr-synchronization" {
                    value 8;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "route" {
                    value 9;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 10;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 11;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 12;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 13;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 14;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 15;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 16;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
    
              container filter {
                presence "enable filter";
                description
                  "Filter to apply to this flag";
                uses rip_filter_obj;
              }  // container filter
            }  // list flag
          }  // container traceoptions
    
          container rib-group {
            description
              "Routing table group for importing RIP routes";
            uses rib_group_inet_type;
          }  // container rib-group
    
          leaf metric-in {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 15";
              }
            }
            description
              "Metric value to add to incoming routes";
          }
    
          container send {
            description
              "Configure RIP send options";
            choice send-opts {
              leaf broadcast {
                type empty;
                description
                  "Broadcast RIPv2 packets (RIPv1 compatible)";
              }
              leaf multicast {
                type empty;
                description
                  "Multicast RIPv2 packets";
              }
              leaf none {
                type empty;
                description
                  "Do not send RIP updates";
              }
              leaf version-1 {
                type empty;
                description
                  "Broadcast RIPv1 packets";
              }
            }  // choice send-opts
          }  // container send
    
          container receive {
            description
              "Configure RIP receive options";
            choice receive-opts {
              leaf both {
                type empty;
                description
                  "Accept both RIPv1 and RIPv2 packets";
              }
              leaf none {
                type empty;
                description
                  "Do not receive RIP packets";
              }
              leaf version-1 {
                type empty;
                description
                  "Accept RIPv1 packets only";
              }
              leaf version-2 {
                type empty;
                description
                  "Accept only RIPv2 packets";
              }
            }  // choice receive-opts
          }  // container receive
    
          choice check-zero-choice {
            leaf check-zero {
              type empty;
              description
                "Check reserved fields on incoming RIPv2 packets";
            }
            leaf no-check-zero {
              type empty;
              description
                "Don't check reserved fields on incoming RIPv2 packets";
            }
          }  // choice check-zero-choice
    
          leaf message-size {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "25 .. 255";
              }
            }
            description
              "Number of route entries per update message";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
    
          leaf holddown {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 180";
              }
            }
            units "seconds";
            description "Hold-down time";
          }
    
          leaf route-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "30 .. 360";
              }
            }
            units "seconds";
            description
              "Delay before routes time out";
          }
    
          leaf update-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 60";
              }
            }
            units "seconds";
            description
              "Interval between regular route updates";
          }
    
          choice authentication {
            leaf authentication-type {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "No authentication";
                }
                enum "simple" {
                  value 1;
                  description
                    "Simple password authentication";
                }
                enum "md5" {
                  value 2;
                  description
                    "MD5 authentication";
                }
              }
            }
            list authentication-selective-md5 {
              key "name";
              ordered-by user;
              description
                "MD5 authentication with one or more keys";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Key ID for MD5 authentication";
              }
    
              leaf key {
                type jt:unreadable;
                description
                  "MD5 authentication key value";
              }
    
              leaf start-time {
                type jt:time;
                description
                  "Start time for key transmission (YYYY-MM-DD.HH:MM)";
              }
            }  // list authentication-selective-md5
          }  // choice authentication
    
          leaf authentication-key {
            junos:must "(!(".. authentication-selective-md5"))";
            junos:must-message "Key already provided for selective-md5";
            type jt:unreadable;
            description
              "Authentication key (password)";
          }
    
          list group {
            key "name";
            ordered-by user;
            description "Instance configuration";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,48}$";
                junos:pattern-message "Must be a string of at most 48 characters";
              }
              description "Group name";
            }
    
            uses apply-advanced;
    
            leaf route-timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 360";
                }
              }
              units "seconds";
              description
                "Delay before routes time out";
            }
    
            leaf update-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "10 .. 60";
                }
              }
              units "seconds";
              description
                "Interval between regular route updates";
            }
    
            leaf preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of routes learned by this group";
            }
    
            leaf metric-out {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 15";
                }
              }
              description
                "Default metric of exported routes";
            }
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
    
            leaf demand-circuit {
              junos:must "(!(".. .. authentication-selective-md5"))";
              junos:must-message "selective-md5 isn't supported with demand-circuit,opt for 'authentication-type md5' instead";
              type empty;
              description
                "Enable demand circuit on this interface";
            }
    
            leaf max-retrans-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "5 .. 180";
                }
              }
              description
                "Maximum time to re-transmit a message in demand-circuit";
            }
    
            container bfd-liveness-detection {
              description
                "Bidirectional Forwarding Detection options";
              uses apply-advanced;
    
              leaf version {
                type enumeration {
                  enum "0" {
                    value 0;
                    description
                      "BFD version 0 (deprecated)";
                  }
                  enum "1" {
                    value 1;
                    description "BFD version 1";
                  }
                  enum "automatic" {
                    value 2;
                    description
                      "Choose BFD version automatically";
                  }
                }
                default "automatic";
                description
                  "BFD protocol version number";
              }
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit and receive interval";
              }
    
              leaf minimum-transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                status deprecated;
                description
                  "Minimum transmit interval";
              }
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval";
              }
    
              leaf multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                default "3";
                description
                  "Detection time multiplier";
              }
    
              choice adaptation-choice {
                leaf no-adaptation {
                  type empty;
                  description
                    "Disable adaptation";
                }
              }  // choice adaptation-choice
    
              container transmit-interval {
                description
                  "Transmit-interval options";
                uses apply-advanced;
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit interval";
                }
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High transmit interval triggering a trap";
                }
              }  // container transmit-interval
    
              container detection-time {
                description
                  "Detection-time options";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High detection-time triggering a trap";
                }
              }  // container detection-time
    
              container authentication {
                description
                  "Authentication options";
                uses apply-advanced;
    
                leaf key-chain {
                  junos:must "(".. algorithm")";
                  junos:must-message "May not be configured without algorithm";
                  junos:must "("security authentication-key-chains key-chain $$")";
                  junos:must-message "Referenced key-chain must be defined";
                  type string;
                  description "Key chain name";
                }
    
                leaf algorithm {
                  junos:must "(".. key-chain")";
                  junos:must-message "May not be configured without key-chain";
                  type enumeration {
                    enum "simple-password" {
                      value 0;
                      description
                        "Simple password";
                    }
                    enum "keyed-md5" {
                      value 1;
                      description
                        "Keyed message Digest 5";
                    }
                    enum "meticulous-keyed-md5" {
                      value 2;
                      description
                        "Meticulous keyed message Digest 5";
                    }
                    enum "keyed-sha-1" {
                      value 3;
                      description
                        "Keyed secure hash algorithm (SHA1) ";
                    }
                    enum
                      "meticulous-keyed-sha-1" {
                      value 4;
                      description
                        "Meticulous keyed secure hash algorithm (SHA1) ";
                    }
                  }
                  description "Algorithm name";
                }
    
                leaf loose-check {
                  type empty;
                  description
                    "Verify authentication only if authentication is negotiated";
                }
              }  // container authentication
            }  // container bfd-liveness-detection
    
            list neighbor {
              key "name";
              ordered-by user;
              description
                "Neighbor configuration";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf route-timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "30 .. 360";
                  }
                }
                units "seconds";
                description
                  "Delay before routes time out";
              }
    
              leaf update-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10 .. 60";
                  }
                }
                units "seconds";
                description
                  "Interval between regular route updates";
              }
    
              leaf interface-type {
                type enumeration {
                  enum "p2mp" {
                    junos:must "(!(".. .. .. authentication-selective-md5"))";
                    junos:must-message "selective-md5 isn't supported with 'interface-type p2mp', opt for 'authentication-type md5' instead";
                    value 0;
                    description
                      "Point-to-multipoint link";
                  }
                }
                description
                  "Interface type for the neighbor";
              }
    
              leaf dynamic-peers {
                junos:must "(" .. interface-type p2mp")";
                junos:must-message "dynamic-peers option can be set only if the interface type is p2mp";
                type empty;
                description
                  "Learn peers dynamically on a p2mp interface";
              }
    
              list peer {
                junos:must "(" .. interface-type p2mp")";
                junos:must-message "Peer address can be set only if the interface type is p2mp";
                key "name";
                ordered-by user;
                description "P2MP peer";
                leaf name {
                  type jt:ipaddr;
                  description "Address of peer";
                }
              }  // list peer
    
              leaf metric-in {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 15";
                  }
                }
                description
                  "Metric value to add to incoming routes";
              }
    
              container send {
                description
                  "Configure RIP send options";
                choice send-opts {
                  leaf broadcast {
                    type empty;
                    description
                      "Broadcast RIPv2 packets (RIPv1 compatible)";
                  }
                  leaf multicast {
                    type empty;
                    description
                      "Multicast RIPv2 packets";
                  }
                  leaf none {
                    type empty;
                    description
                      "Do not send RIP updates";
                  }
                  leaf version-1 {
                    type empty;
                    description
                      "Broadcast RIPv1 packets";
                  }
                }  // choice send-opts
              }  // container send
    
              container receive {
                description
                  "Configure RIP receive options";
                choice receive-opts {
                  leaf both {
                    type empty;
                    description
                      "Accept both RIPv1 and RIPv2 packets";
                  }
                  leaf none {
                    type empty;
                    description
                      "Do not receive RIP packets";
                  }
                  leaf version-1 {
                    type empty;
                    description
                      "Accept RIPv1 packets only";
                  }
                  leaf version-2 {
                    type empty;
                    description
                      "Accept only RIPv2 packets";
                  }
                }  // choice receive-opts
              }  // container receive
    
              leaf demand-circuit {
                junos:must "(!(".. .. .. authentication-selective-md5"))";
                junos:must-message "selective-md5 isn't supported with demand-circuit, opt for 'authentication-type md5' instead";
                type empty;
                description
                  "Enable demand circuit on this interface";
              }
    
              leaf max-retrans-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "5 .. 180";
                  }
                }
                description
                  "Maximum time to re-transmit a msg in demand-circuit";
              }
    
              choice check-zero-choice {
                leaf check-zero {
                  type empty;
                  description
                    "Check reserved fields on incoming RIPv1 packets";
                }
                leaf no-check-zero {
                  type empty;
                  description
                    "Don't check reserved fields on incoming RIPv1 packets";
                }
              }  // choice check-zero-choice
    
              leaf any-sender {
                type empty;
                description
                  "Disable strict checks on sender address";
              }
    
              leaf message-size {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "25 .. 255";
                  }
                }
                description
                  "Number of route entries per update message";
              }
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description "Import policy";
              }
    
              choice authentication {
                leaf authentication-type {
                  type enumeration {
                    enum "none" {
                      value 0;
                      description
                        "No authentication";
                    }
                    enum "simple" {
                      value 1;
                      description
                        "Simple password authentication";
                    }
                    enum "md5" {
                      value 2;
                      description
                        "MD5 authentication";
                    }
                  }
                }
                list authentication-selective-md5 {
                  junos:must "(!("..  interface-type p2mp"))";
                  junos:must-message "selective-md5 isn't supported with '.. neighbor <> interface-type p2mp', opt for 'authentication-type md5' instead";
                  junos:must "(!("..  demand-circuit"))";
                  junos:must-message "selective-md5 isn't supported with '.. neighbor <> demand-circuit', opt for 'authentication-type md5' instead";
                  junos:must "(!(".. .. demand-circuit"))";
                  junos:must-message "selective-md5 isn't supported with '.. group <> demand-circuit', opt for 'authentication-type md5' instead";
                  key "name";
                  ordered-by user;
                  description
                    "MD5 authentication with one or more keys";
                  leaf name {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
    
                  leaf key {
                    type jt:unreadable;
                    description
                      "MD5 authentication key value";
                  }
    
                  leaf start-time {
                    type jt:time;
                    description
                      "Start time for key transmission (YYYY-MM-DD.HH:MM)";
                  }
                }  // list authentication-selective-md5
              }  // choice authentication
    
              leaf authentication-key {
                junos:must "(!(".. authentication-selective-md5"))";
                junos:must-message "Key already provided for selective-md5";
                type jt:unreadable;
                description
                  "Authentication key (password)";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
              }  // container bfd-liveness-detection
            }  // list neighbor
          }  // list group
    
          container graceful-restart {
            presence "enable graceful-restart";
            description
              "RIP graceful restart options";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf restart-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 600";
                }
              }
              description
                "Time after which RIP is declared out of restart";
            }
          }  // container graceful-restart
        }  // grouping juniper-protocols-rip
    
        grouping juniper-protocols-ripng {
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for RIPng";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "error" {
                    value 0;
                    description
                      "Trace RIPng errors";
                  }
                  enum "expiration" {
                    value 1;
                    description
                      "Trace RIPng route expiration processing";
                  }
                  enum "holddown" {
                    value 2;
                    description
                      "Trace RIPng hold-down processing";
                  }
                  enum "packets" {
                    value 3;
                    description
                      "Trace all RIPng packets";
                  }
                  enum "request" {
                    value 4;
                    description
                      "Trace RIPng information packets";
                  }
                  enum "trigger" {
                    value 5;
                    description
                      "Trace RIPng triggered updates";
                  }
                  enum "update" {
                    value 6;
                    description
                      "Trace RIPng update packets";
                  }
                  enum "nsr-synchronization" {
                    value 7;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "route" {
                    value 8;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 9;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 10;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 11;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 12;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 13;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 14;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 15;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf metric-in {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 15";
              }
            }
            description
              "Metric value to add to incoming routes";
          }
    
          container send {
            description
              "Configure RIPng send options";
            choice send-opts {
              leaf none {
                type empty;
                description
                  "Do not send RIPng updates";
              }
            }  // choice send-opts
          }  // container send
    
          container receive {
            description
              "Configure RIPng receive options";
            choice receive-opts {
              leaf none {
                type empty;
                description
                  "Do not receive RIPng packets";
              }
            }  // choice receive-opts
          }  // container receive
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
    
          leaf holddown {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 180";
              }
            }
            units "seconds";
            description "Hold-down time";
          }
    
          leaf route-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "30 .. 360";
              }
            }
            units "seconds";
            description
              "Delay before routes time out";
          }
    
          leaf update-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 60";
              }
            }
            units "seconds";
            description
              "Interval between regular route updates";
          }
    
          list group {
            key "name";
            ordered-by user;
            description "Instance configuration";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,48}$";
                junos:pattern-message "Must be a string of at most 48 characters";
              }
              description "Group name";
            }
    
            uses apply-advanced;
    
            leaf route-timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 360";
                }
              }
              units "seconds";
              description
                "Delay before routes time out";
            }
    
            leaf update-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "10 .. 60";
                }
              }
              units "seconds";
              description
                "Interval between regular route updates";
            }
    
            leaf preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of routes learned by this group";
            }
    
            leaf metric-out {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 15";
                }
              }
              description
                "Default metric of exported routes";
            }
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
    
            list neighbor {
              key "name";
              ordered-by user;
              description
                "Neighbor configuration";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf route-timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "30 .. 360";
                  }
                }
                units "seconds";
                description
                  "Delay before routes time out";
              }
    
              leaf update-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10 .. 60";
                  }
                }
                units "seconds";
                description
                  "Interval between regular route updates";
              }
    
              leaf metric-in {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 15";
                  }
                }
                description
                  "Metric value to add to incoming routes";
              }
    
              container send {
                description
                  "Configure RIPng send options";
                choice send-opts {
                  leaf none {
                    type empty;
                    description
                      "Do not send RIPng updates";
                  }
                }  // choice send-opts
              }  // container send
    
              container receive {
                description
                  "Configure RIPng receive options";
                choice receive-opts {
                  leaf none {
                    type empty;
                    description
                      "Do not receive RIPng packets";
                  }
                }  // choice receive-opts
              }  // container receive
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description "Import policy";
              }
            }  // list neighbor
          }  // list group
    
          container graceful-restart {
            presence "enable graceful-restart";
            description
              "RIPng graceful restart options";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf restart-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 600";
                }
              }
              description
                "Time after which RIPng is declared out of restart";
            }
          }  // container graceful-restart
        }  // grouping juniper-protocols-ripng
    
        grouping juniper-protocols-router-discovery {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable router discovery";
            }
          }  // choice enable-disable
    
          container traceoptions {
            description
              "Trace options for router discovery";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "route" {
                    value 0;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 1;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 2;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 3;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 4;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 5;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 6;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 7;
                    description
                      "Trace everything";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interfaces on which to configure router discovery";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf max-advertisement-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "4 .. 1800";
                }
              }
              units "seconds";
              description
                "Maximum time before sending advertisements";
            }
    
            leaf min-advertisement-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "3 .. 1800";
                }
              }
              units "seconds";
              description
                "Minimum time before sending advertisements";
            }
    
            leaf lifetime {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "3 .. 9000";
                }
              }
              units "seconds";
              description
                "How long addresses in advertisements are valid";
            }
          }  // list interface
    
          list address {
            key "name";
            ordered-by user;
            description
              "IP addresses to include in advertisements";
            leaf name {
              type jt:ipv4addr;
              description
                "IP addresses to include in router advertisements";
            }
    
            uses apply-advanced;
    
            leaf advertise {
              type empty;
              description
                "Advertise the IP address in advertisements";
            }
    
            leaf ignore {
              type empty;
              description
                "Do not advertise the IP address in advertisements";
            }
    
            leaf broadcast {
              type empty;
              description
                "Include IP address only in broadcast advertisements";
            }
    
            leaf multicast {
              type empty;
              description
                "Include IP address only in multicast advertisements";
            }
    
            leaf ineligible {
              type empty;
              description
                "IP address can never become a default router";
            }
    
            leaf priority {
              type union {
                type int32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of the address to become a default router";
            }
          }  // list address
        }  // grouping juniper-protocols-router-discovery
    
        grouping juniper-protocols-rsvp {
          description "RSVP options";
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable RSVP";
            }
          }  // choice enable-disable
    
          container graceful-restart {
            description
              "Configure graceful restart attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable RSVP graceful restart capability";
              }
            }  // choice enable-disable
    
            leaf helper-disable {
              type empty;
              description
                "Disable graceful restart helper capability";
            }
    
            leaf maximum-helper-restart-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1800";
                }
              }
              units "seconds";
              default "20";
              description
                "Maximum wait time from down event to neighbor dead";
            }
    
            leaf maximum-helper-recovery-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              units "seconds";
              default "180";
              description
                "Maximum time restarting neighbor states are kept";
            }
          }  // container graceful-restart
    
          container tunnel-services {
            presence "enable tunnel-services";
            description
              "Use tunnel services for P2MP LSP ultimate-hop popping";
            uses apply-advanced;
    
            leaf-list devices {
              type union {
                type jt:interface-device;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              ordered-by user;
              description
                "Tunnel services devices to use for P2MP LSPs";
            }
          }  // container tunnel-services
    
          leaf no-p2mp-sublsp {
            type empty;
            description
              "Disable P2MP sub-LSP object generation";
          }
    
          leaf no-node-id-subobject {
            type empty;
            description
              "Do not include the node-id sub-object in the RRO";
          }
    
          leaf no-interface-hello {
            type empty;
            description
              "Disble interface Hellos on all RSVP interfaces";
          }
    
          container pop-and-forward {
            description
              "RSVP pop-and-forward specific global parameters";
            uses apply-advanced;
    
            container application-label {
              description
                "Number of application labels under the RSVP transport";
              uses apply-advanced;
    
              leaf depth {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 3";
                  }
                }
                default "1";
                description
                  "Application label depth";
              }
            }  // container application-label
          }  // container pop-and-forward
    
          leaf hello-acknowledgements {
            type empty;
            description
              "Acknowledge Hellos on RSVP interfaces not having sessions";
          }
    
          leaf no-hello-acknowledgements {
            junos:must "(!("protocols rsvp hello-acknowledgements"))";
            junos:must-message "Config hello-acknowledgements should be removed";
            type empty;
            description
              "Do not ack Hellos on RSVP interfaces not having sessions";
          }
    
          container node-hello {
            presence "enable node-hello";
            description
              "Enable node-ID based Hellos on all RSVP interfaces";
            leaf hello-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 60";
                }
              }
              units "seconds";
              default "9";
              description "Hello interval";
            }
          }  // container node-hello
    
          leaf no-node-hello {
            junos:must "(!("protocols rsvp node-hello"))";
            junos:must-message "Config node-hello should be removed";
            type empty;
            description
              "Disable node-ID based Hellos on the router";
          }
    
          leaf allow-bidirectional {
            type empty;
            status deprecated;
            description
              "Enable bidirectional support in RSVP";
          }
    
          leaf local-reversion {
            junos:must "(!("protocols rsvp no-local-reversion"))";
            junos:must-message "Config no-local-reversion should be removed";
            type empty;
            description
              "Enable local reversion at this Point of Local Repair";
          }
    
          leaf no-local-reversion {
            type empty;
            description
              "Disable local reversion at this Point of Local Repair";
          }
    
          leaf rfc6510-lsp-attributes {
            type empty;
            description
              "Use RFC6510 compliant LSP_ATTRIBUTES";
          }
    
          container fast-reroute {
            description
              "One-to-one fast-reroute protection mechanism";
            uses apply-advanced;
    
            leaf optimize-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "Frequency of reoptimization for fast-reroute detour";
            }
          }  // container fast-reroute
    
          container load-balance {
            description
              "Per-packet load-balancing algorithm";
            uses apply-advanced;
    
            leaf bandwidth {
              type empty;
              description
                "Per-packet load balancing proportional to LSP bandwidth";
            }
          }  // container load-balance
    
          container traceoptions {
            description "Trace options for RSVP";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "io-event" {
                    value 0;
                    description
                      "Trace RSVP IO task related events";
                  }
                  enum "io-packets" {
                    value 1;
                    description
                      "Trace all RSVP periodic refresh activity";
                  }
                  enum "packets" {
                    value 2;
                    description
                      "Trace all RSVP trigger packets";
                  }
                  enum "path" {
                    value 3;
                    description
                      "Trace RSVP trigger path messages";
                  }
                  enum "resv" {
                    value 4;
                    description
                      "Trace RSVP trigger Resv messages";
                  }
                  enum "pathtear" {
                    value 5;
                    description
                      "Trace RSVP PathTear messages";
                  }
                  enum "resvtear" {
                    value 6;
                    description
                      "Trace RSVP ResvTear messages";
                  }
                  enum "state" {
                    value 7;
                    description
                      "Trace state transitions";
                  }
                  enum "error" {
                    value 8;
                    description
                      "Trace error conditions";
                  }
                  enum "route" {
                    value 9;
                    description
                      "Trace routing information";
                  }
                  enum "lmp" {
                    value 10;
                    description
                      "Trace RSVP-LMP related interactions";
                  }
                  enum "event" {
                    value 11;
                    description
                      "Trace RSVP related events";
                  }
                  enum "nsr-synchronization" {
                    value 12;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "lsp-prefix" {
                    value 13;
                    description
                      "Prefix the trace messages with LSP information";
                  }
                  enum "enhanced-frr" {
                    value 14;
                    description
                      "Enhanced FRR related information";
                  }
                  enum "all" {
                    value 15;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf refresh-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            default "1200";
            description
              "Refresh time in seconds";
          }
    
          leaf keep-multiplier {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 255";
              }
            }
            default "3";
            description "Keep multiplier";
          }
    
          leaf graceful-deletion-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 300";
              }
            }
            units "seconds";
            default "30";
            description
              "Time to complete graceful deletion signaling";
          }
    
          leaf setup-protection {
            type empty;
            description
              "Enable setup protection";
          }
    
          leaf no-p2mp-re-merge {
            type empty;
            description "Enable p2mp remerge";
          }
    
          leaf cross-credibility-cspf {
            type empty;
            description
              "Compute CSPF paths spanning protocols for bypass LSP, detour LSP and loose hop expansion";
          }
    
          container preemption {
            description
              "Set RSVP session preemption attributes";
            uses apply-advanced;
    
            choice preemption-type {
              leaf disabled {
                type empty;
                description
                  "No RSVP session preemption";
              }
              leaf normal {
                type empty;
                description
                  "Run RSVP session preemption to accommodate new sessions";
              }
              leaf aggressive {
                type empty;
                description
                  "Run RSVP session preemption whenever necessary";
              }
            }  // choice preemption-type
    
            container soft-preemption {
              description
                "Options for establishing new path before tearing down a preempted LSP";
              uses apply-advanced;
    
              leaf cleanup-timer {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 10800";
                  }
                }
                units "seconds";
                description
                  "Time a soft-preempted LSP will be maintained";
              }
            }  // container soft-preemption
          }  // container preemption
    
          leaf authentication-key {
            type jt:unreadable;
            description
              "Authentication password";
          }
    
          leaf no-authentication-check {
            type empty;
            description
              "Skip authentication check for received messages";
          }
    
          container associated-bidirectional-lsp {
            description
              "Set associated bidirectional LSP attributes";
            uses apply-advanced;
    
            leaf single-sided-provisioning {
              type empty;
              description
                "Enable unidirectional reverse LSP setup for single sided provisioned forward LSP";
            }
          }  // container associated-bidirectional-lsp
    
          leaf no-enhanced-frr-bypass {
            type empty;
            description
              "Disable enhanced facility backup FRR";
          }
    
          container expand-flood-reflector-hop {
            presence
              "enable expand-flood-reflector-hop";
            description
              "Control expansion of flood reflector ERO strict hops";
          }  // container expand-flood-reflector-hop
    
          list interface {
            key "name";
            ordered-by user;
            description "RSVP interface options";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable RSVP on this interface";
              }
            }  // choice enable-disable
    
            leaf authentication-key {
              type jt:unreadable;
              description
                "Authentication password";
            }
    
            choice aggregate-choice {
              leaf aggregate {
                type empty;
                status deprecated;
                description
                  "Permit refresh reduction extensions on the interface";
              }
              leaf no-aggregate {
                type empty;
                status deprecated;
                description
                  "Don't permit refresh reduction extensions on the interface";
              }
            }  // choice aggregate-choice
    
            choice reliable-choice {
              leaf reliable {
                type empty;
                description
                  "Permit reliable message delivery on the interface";
              }
              leaf no-reliable {
                type empty;
                description
                  "Don't permit reliable message delivery on the interface";
              }
            }  // choice reliable-choice
    
            leaf hello-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 60";
                }
              }
              units "seconds";
              default "9";
              description "Hello interval";
            }
    
            container subscription {
              description
                "Link bandwidth percentage for RSVP reservation";
              uses subscription-type;
            }  // container subscription
    
            leaf bandwidth {
              type string;
              description
                "Available bandwidth for the interface units bps";
            }
    
            container update-threshold {
              description
                "Change in reserved bandwidth to trigger IGP update";
              uses apply-advanced;
    
              leaf threshold-percent {
                type decimal64 {
                  fraction-digits 9;
                  range "0.001 .. 20";
                }
                units "percent";
                default "10.0";
                description
                  "Percentage change in reserved bandwidth to trigger IGP update";
              }
    
              leaf threshold-value {
                type string;
                description
                  "Change in reserved bandwidth to trigger IGP update (will be capped at 20% of link BW)";
              }
            }  // container update-threshold
    
            container update-threshold-max-reservable {
              description
                "Change in non-rsvp bandwidth to trigger IGP update ";
              uses apply-advanced;
    
              leaf bandwidth {
                type string;
                description
                  "Change in non-rsvp bandwidth to trigger IGP update units bps";
              }
    
              leaf percent {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                units "percent";
                description
                  "Percentage change in max-reservable bandwidth to trigger IGP update";
              }
            }  // container update-threshold-max-reservable
    
            container non-rsvp-bandwdith {
              description
                "Config knobs relating to non-rsvp bandwidth";
              uses apply-advanced;
    
              leaf local-bw-override-threshold {
                type empty;
                description
                  "Overide threshold and update local bandwidth with non-rsvp bandwidth usage";
              }
            }  // container non-rsvp-bandwdith
    
            container link-protection {
              presence "enable link-protection";
              description
                "Protect traffic with a label-stacked LSP";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable link protection on this interface";
                }
              }  // choice enable-disable
    
              container bandwidth {
                description
                  "Bandwidth for each bypass";
                uses bandwidth-type;
              }  // container bandwidth
    
              leaf max-bypasses {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 99";
                  }
                }
                default "1";
                description
                  "Max number of bypasses permitted for protecting this interface";
              }
    
              leaf subscription {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                default "100";
                description
                  "Percent of bandwidth guaranteed when admitting protected LSPs into bypasses";
              }
    
              leaf no-node-protection {
                type empty;
                description
                  "Disallow node protection on this interface";
              }
    
              leaf optimize-timer {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 65535";
                  }
                }
                units "seconds";
                default "0";
                description
                  "Interval between bypass reoptimizations";
              }
    
              leaf class-of-service {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Class of service for the bypass LSP";
              }
    
              leaf hop-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 255";
                  }
                }
                description
                  "Maximum allowed router hops for bypass";
              }
    
              leaf no-cspf {
                junos:must "(".. path")";
                junos:must-message "The path of the bypass must be configured when using no-cspf";
                type empty;
                description
                  "Disable automatic path computation";
              }
    
              leaf exclude-srlg {
                type empty;
                description "Exclude SRLG links";
              }
    
              container priority {
                presence "enable priority";
                description
                  "Preemption priorities for the bypass LSP";
              }  // container priority
    
              leaf setup-priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description "Set-up priority";
              }
    
              leaf reservation-priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Reservation priority";
              }
    
              list path {
                key "name";
                ordered-by user;
                description
                  "Explicit route of bypass path";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Address of next system in path";
                }
    
                choice loose_strict_none {
                  leaf loose {
                    type empty;
                    description
                      "Next hop might not be adjacent";
                  }
                  leaf strict {
                    type empty;
                    description
                      "Next hop must be adjacent";
                  }
                }  // choice loose_strict_none
              }  // list path
    
              container admin-group {
                description
                  "Administrative group policy";
                uses admin_group_include_exclude;
              }  // container admin-group
    
              list bypass {
                key "name";
                ordered-by user;
                description
                  "Bypass with specific constraints";
                leaf name {
                  type string {
                    length "1 .. 64";
                  }
                  description "Name of bypass";
                }
    
                uses apply-advanced;
    
                leaf to {
                  type jt:ipv4addr;
                  description
                    "Address of egress router";
                }
    
                container bandwidth {
                  description
                    "Bandwidth for each bypass";
                  uses bandwidth-type;
                }  // container bandwidth
    
                container subscription {
                  presence "enable subscription";
                  description
                    "Bandwidth percent available on bypass for protected LSPs";
                  uses bypass-subscription-type;
                }  // container subscription
    
                leaf description {
                  type string {
                    length "1 .. 80";
                  }
                  description
                    "Text description of bypass";
                }
    
                container priority {
                  presence "enable priority";
                  description
                    "Preemption priorities for bypass";
                }  // container priority
    
                leaf setup-priority {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 7";
                    }
                  }
                  description "Set-up priority";
                }
    
                leaf reservation-priority {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 7";
                    }
                  }
                  description
                    "Reservation priority";
                }
    
                leaf class-of-service {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type int32 {
                      range "0 .. 7";
                    }
                  }
                  description
                    "Class of service for the bypass LSP";
                }
    
                leaf hop-limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 255";
                    }
                  }
                  description
                    "Maximum allowed router hops for bypass";
                }
    
                leaf no-cspf {
                  junos:must "(".. path")";
                  junos:must-message "The path of the bypass must be configured when using no-cspf";
                  type empty;
                  description
                    "Disable automatic path computation";
                }
    
                leaf exclude-srlg {
                  type empty;
                  description
                    "Exclude SRLG links";
                }
    
                list path {
                  key "name";
                  ordered-by user;
                  description
                    "Explicit route of bypass path";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "Address of next system in path";
                  }
    
                  choice loose_strict_none {
                    leaf loose {
                      type empty;
                      description
                        "Next hop might not be adjacent";
                    }
                    leaf strict {
                      type empty;
                      description
                        "Next hop must be adjacent";
                    }
                  }  // choice loose_strict_none
                }  // list path
    
                container admin-group {
                  description
                    "Administrative group policy";
                  uses admin_group_include_exclude;
                }  // container admin-group
              }  // list bypass
            }  // container link-protection
          }  // list interface
    
          list peer-interface {
            key "name";
            ordered-by user;
            description
              "Configuration for peer interface";
            leaf name {
              type string;
              description
                "Name of peer interface";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable RSVP on this control peer";
              }
            }  // choice enable-disable
    
            leaf authentication-key {
              type jt:unreadable;
              description
                "Authentication password";
            }
    
            choice aggregate-choice {
              leaf aggregate {
                type empty;
                status deprecated;
                description
                  "Permit refresh reduction extensions on the interface";
              }
              leaf no-aggregate {
                type empty;
                status deprecated;
                description
                  "Don't permit refresh reduction extensions on the interface";
              }
            }  // choice aggregate-choice
    
            choice reliable-choice {
              leaf reliable {
                type empty;
                description
                  "Permit reliable message delivery on the interface";
              }
              leaf no-reliable {
                type empty;
                description
                  "Don't permit reliable message delivery on the interface";
              }
            }  // choice reliable-choice
    
            leaf hello-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 60";
                }
              }
              units "seconds";
              default "9";
              description "Hello interval";
            }
    
            container dynamic-bidirectional-transport {
              presence
                "enable dynamic-bidirectional-transport";
              description
                "Enable dynamic setup of bidirectional packet LSP for transporting non-packet GMPLS LSP";
              uses apply-advanced;
    
              leaf template {
                junos:must "(!("protocols mpls label-switched-path $$ p2mp"))";
                junos:must-message "Referenced template cannot be a p2mp template";
                junos:must "(("protocols mpls label-switched-path $$" && "protocols mpls label-switched-path $$ template"))";
                junos:must-message "Referenced LSP template does not exist";
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of 64 characters or less";
                }
                description
                  "Template for the dynamic bidirectional packet LSP";
              }
            }  // container dynamic-bidirectional-transport
          }  // list peer-interface
    
          list lsp-set {
            key "name";
            ordered-by user;
            description
              "Configuration for lsp set";
            leaf name {
              type string;
              description "Name of lsp set";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable this lsp set";
              }
            }  // choice enable-disable
    
            container match-criteria {
              description
                "Match criteria for this lsp set";
              uses lsp-set-match-type;
            }  // container match-criteria
    
            container traceoptions {
              description
                "Trace options for this lsp set";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "io-event" {
                      value 0;
                      description
                        "Trace RSVP IO task related events";
                    }
                    enum "io-packets" {
                      value 1;
                      description
                        "Trace all RSVP periodic refresh activity";
                    }
                    enum "packets" {
                      value 2;
                      description
                        "Trace all RSVP packets";
                    }
                    enum "path" {
                      value 3;
                      description
                        "Trace RSVP path messages";
                    }
                    enum "resv" {
                      value 4;
                      description
                        "Trace RSVP Resv messages";
                    }
                    enum "pathtear" {
                      value 5;
                      description
                        "Trace RSVP PathTear messages";
                    }
                    enum "resvtear" {
                      value 6;
                      description
                        "Trace RSVP ResvTear messages";
                    }
                    enum "state" {
                      value 7;
                      description
                        "Trace state transitions";
                    }
                    enum "error" {
                      value 8;
                      description
                        "Trace error conditions";
                    }
                    enum "route" {
                      value 9;
                      description
                        "Trace routing information";
                    }
                    enum "lmp" {
                      value 10;
                      description
                        "Trace RSVP-LMP related interactions";
                    }
                    enum "event" {
                      value 11;
                      description
                        "Trace RSVP related events";
                    }
                    enum "nsr-synchronization" {
                      value 12;
                      description
                        "Trace NSR synchronization events";
                    }
                    enum "lsp-prefix" {
                      value 13;
                      description
                        "Prefix the trace messages with LSP information";
                    }
                    enum "enhanced-frr" {
                      value 14;
                      description
                        "Enhanced FRR related information";
                    }
                    enum "all" {
                      value 15;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
          }  // list lsp-set
        }  // grouping juniper-protocols-rsvp
    
        grouping bypass-subscription-type {
          uses apply-advanced;
    
          leaf subscription {
            type string;
            default "100";
            description
              "Subscription percentage for bandwidth protection";
          }
        }  // grouping bypass-subscription-type
    
        grouping juniper-protocols-stp {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable STP";
            }
          }  // choice enable-disable
    
          leaf bpdu-destination-mac-address {
            type enumeration {
              enum "provider-bridge-group" {
                value 0;
                description
                  "802.1ad provider bridge group address";
              }
            }
            description
              "Destination MAC address in the spanning tree BPDUs";
          }
    
          leaf bridge-priority {
            type string {
              junos:posix-pattern "^(0|4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
              junos:pattern-message "Must be a multiple of 4096";
            }
            description
              "Priority of the bridge (in increments of 4k - 0,4k,8k,..60k)";
          }
    
          leaf backup-bridge-priority {
            type string {
              junos:posix-pattern "^(4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
              junos:pattern-message "Must be a multiple of 4096";
            }
            description
              "Priority of the bridge (in increments of 4k - 4k,8k,..60k)";
          }
    
          leaf max-age {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "6 .. 40";
              }
            }
            units "seconds";
            description
              "Maximum age of received protocol bpdu";
          }
    
          leaf hello-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 10";
              }
            }
            units "seconds";
            description
              "Time interval between configuration BPDUs";
          }
    
          leaf forward-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "4 .. 30";
              }
            }
            units "seconds";
            description
              "Time spent in listening or learning state";
          }
    
          leaf system-identifier {
            type jt:mac-unicast;
            description
              "Sytem identifier to represent this node";
          }
    
          container traceoptions {
            description
              "Tracing options for debugging protocol operation";
            uses stp-trace-options;
          }  // container traceoptions
    
          leaf vpls-flush-on-topology-change {
            type empty;
            description
              "Enable VPLS MAC flush on root protected CE interface receving topology change";
          }
    
          leaf priority-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 255";
              }
            }
            units "seconds";
            description
              "Hold time before switching to primary priority when core domain becomes up";
          }
    
          list system-id {
            key "name";
            ordered-by user;
            description
              "System ID to IP mapping";
            uses system-id-ip-map;
          }  // list system-id
    
          list interface {
            key "name";
            description "Interface options";
            uses stp-interface;
          }  // list interface
    
          leaf extended-system-id {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "0 .. 4095";
              }
            }
            description
              "Extended system identifier";
          }
    
          leaf force-version {
            type enumeration {
              enum "stp" {
                value 0;
                description
                  "Spanning tree protocol";
              }
            }
            description "Force protocol version";
          }
    
          leaf bpdu-block-on-edge {
            type empty;
            description
              "Block BPDU on all interfaces configured as edge (BPDU Protect)";
          }
        }  // grouping juniper-protocols-stp
    
        grouping juniper-protocols-vstp {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable VSTP";
            }
          }  // choice enable-disable
    
          leaf force-version {
            type enumeration {
              enum "stp" {
                value 0;
                description
                  "Spanning tree protocol";
              }
            }
            description "Force protocol version";
          }
    
          leaf bpdu-block-on-edge {
            type empty;
            description
              "Block BPDU on all interfaces configured as edge (BPDU Protect)";
          }
    
          leaf vpls-flush-on-topology-change {
            type empty;
            description
              "Enable VPLS MAC flush on root protected CE interface receving topology change";
          }
    
          leaf priority-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 255";
              }
            }
            units "seconds";
            description
              "Hold time before switching to primary priority when core domain becomes up";
          }
    
          list system-id {
            key "name";
            ordered-by user;
            description
              "System ID to IP mapping";
            uses system-id-ip-map;
          }  // list system-id
    
          list interface {
            key "name";
            description "Interface options";
            uses stp-interface;
          }  // list interface
    
          list vlan {
            key "name";
            description
              "VLAN spanning tree options";
            leaf name {
              type string;
              description "VLAN id or all";
            }
    
            uses apply-advanced;
    
            leaf bridge-priority {
              type string {
                junos:posix-pattern "^(0|4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
                junos:pattern-message "Must be a multiple of 4096";
              }
              description
                "Priority of the bridge (in increments of 4k - 0,4k,8k,..60k)";
            }
    
            leaf backup-bridge-priority {
              type string {
                junos:posix-pattern "^(4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
                junos:pattern-message "Must be a multiple of 4096";
              }
              description
                "Priority of the bridge (in increments of 4k - 4k,8k,..60k)";
            }
    
            leaf max-age {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "6 .. 40";
                }
              }
              units "seconds";
              description
                "Maximum age of received protocol bpdu";
            }
    
            leaf hello-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 10";
                }
              }
              units "seconds";
              description
                "Time interval between configuration BPDUs";
            }
    
            leaf forward-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "4 .. 30";
                }
              }
              units "seconds";
              description
                "Time spent in listening or learning state";
            }
    
            leaf system-identifier {
              type jt:mac-unicast;
              description
                "Sytem identifier to represent this node";
            }
    
            container traceoptions {
              description
                "Tracing options for debugging protocol operation";
              uses stp-trace-options;
            }  // container traceoptions
    
            list interface {
              key "name";
              description "Interface options";
              uses stp-interface;
            }  // list interface
          }  // list vlan
    
          container vlan-group {
            presence "enable vlan-group";
            description
              "Spanning tree options for group of VLANs";
            uses apply-advanced;
    
            list group {
              key "name";
              ordered-by user;
              description "Name if VLAN group";
              leaf name {
                type string {
                  junos:posix-pattern "^[[:alpha:]][[:alnum:]_-]+$";
                  junos:pattern-message "Must be a string beginning with a letter and consisting of letters, numbers, dashes, and underscores";
                  length "1 .. 63";
                }
                description "VLAN group name";
              }
    
              uses apply-advanced;
    
              leaf-list vlan {
                type string;
                ordered-by user;
                description
                  "VLAN ID or VLAN ID range [1..4094]";
              }
    
              leaf bridge-priority {
                type string {
                  junos:posix-pattern "^(0|4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
                  junos:pattern-message "Must be a multiple of 4096";
                }
                description
                  "Priority of the bridge (in increments of 4k - 0,4k,8k,..60k)";
              }
    
              leaf backup-bridge-priority {
                type string {
                  junos:posix-pattern "^(4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
                  junos:pattern-message "Must be a multiple of 4096";
                }
                description
                  "Priority of the bridge (in increments of 4k - 4k,8k,..60k)";
              }
    
              leaf max-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "6 .. 40";
                  }
                }
                units "seconds";
                description
                  "Maximum age of received protocol bpdu";
              }
    
              leaf hello-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 10";
                  }
                }
                units "seconds";
                description
                  "Time interval between configuration BPDUs";
              }
    
              leaf forward-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "4 .. 30";
                  }
                }
                units "seconds";
                description
                  "Time spent in listening or learning state";
              }
    
              leaf system-identifier {
                type jt:mac-unicast;
                description
                  "Sytem identifier to represent this node";
              }
    
              container traceoptions {
                description
                  "Tracing options for debugging protocol operation";
                uses stp-trace-options;
              }  // container traceoptions
    
              list interface {
                key "name";
                description "Interface options";
                uses stp-interface;
              }  // list interface
            }  // list group
          }  // container vlan-group
        }  // grouping juniper-protocols-vstp
    
        grouping juniper-ri-protocols-bfd {
          uses apply-advanced;
    
          container sbfd {
            description
              "Seamless BFD parameters";
            uses apply-advanced;
    
            leaf-list pool {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "List of seamless BFD endpoints";
            }
    
            list local-discriminator {
              key "name";
              ordered-by user;
              description
                "Local discriminator for seamless BFD responder";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Local discriminator for seamless BFD responder";
              }
    
              uses apply-advanced;
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval for seamless BFD responder";
              }
    
              leaf local-ip-address {
                type jt:ipv4addr;
                description
                  "IPv4 source address";
              }
            }  // list local-discriminator
          }  // container sbfd
        }  // grouping juniper-ri-protocols-bfd
    
        grouping juniper-ri-protocols-igmp-snooping {
          description "IGMP snooping options";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for IGMP Snooping";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all IGMP packets";
                  }
                  enum "query" {
                    value 1;
                    description
                      "Trace IGMP membership query messages";
                  }
                  enum "report" {
                    value 2;
                    description
                      "Trace membership report messages";
                  }
                  enum "leave" {
                    value 3;
                    description
                      "Trace leave group messages (IGMPv2 only)";
                  }
                  enum "group" {
                    value 4;
                    description
                      "Trace group operations";
                  }
                  enum "client-notification" {
                    value 5;
                    description
                      "Trace notifications";
                  }
                  enum "host-notification" {
                    value 6;
                    description
                      "Trace host notifications";
                  }
                  enum "route" {
                    value 7;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 8;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 9;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 10;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 11;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 12;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 13;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 14;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf query-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1024";
              }
            }
            units "seconds";
            default "125";
            description
              "When to send host query messages";
          }
    
          container l2-querier {
            description "Enable L2 querier mode";
            uses apply-advanced;
    
            leaf source-address {
              type jt:ipv4addr;
              description
                "Source IP address to use for L2 querier";
            }
          }  // container l2-querier
    
          leaf query-response-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "10";
            description
              "How long to wait for a host query response";
          }
    
          leaf query-last-member-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "1";
            description
              "When to send group query messages";
          }
    
          leaf robust-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "2 .. 10";
              }
            }
            default "2";
            description
              "Expected packet loss on a subnet";
          }
    
          leaf learn-pim-router {
            type empty;
            description
              "Learn PIM router interfaces from PIM hellos";
          }
    
          leaf immediate-leave {
            type empty;
            description
              "Enable immediate group leave on interfaces";
          }
    
          leaf evpn-ssm-reports-only {
            type empty;
            description
              "Accept and process only <s,g> reports of SSM groups";
          }
    
          container proxy {
            presence "enable proxy";
            description "Enable proxy mode";
            uses apply-advanced;
    
            leaf source-address {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "With qualified-learning source-address should be configured under Vlan options";
              type jt:ipv4addr;
              description
                "Source IP address to use for proxy";
            }
    
            leaf irb {
              type empty;
              description
                "Proxy IGMP reports to IRB";
            }
          }  // container proxy
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interface options for IGMP";
            leaf name {
              junos:must "(!("interfaces $$-IFL vlan-tags inner-range"))";
              junos:must-message "interface with vlan-tags inner-range should be specified in a learning-domain only";
              junos:must "(!("interfaces $$-IFL vlan-id-range"))";
              junos:must-message "interface with vlan-id-range should be specified in a learning-domain only";
              junos:must "(".. .. .. .. interface $$")";
              junos:must-message "interface options can be specified for the interfaces in the routing-instance";
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, interface should be configured only under vlan";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            leaf host-only-interface {
              junos:must "(!(".. multicast-router-interface"))";
              junos:must-message "interface cannot be both host-only and multicast-router";
              type empty;
              description
                "Enable interfaces to be treated as host-side interfaces";
            }
    
            leaf group-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 65535";
                }
              }
              description
                "Maximum number of (source,group) per interface";
            }
    
            container static {
              description
                "Static group or source membership";
              uses apply-advanced;
    
              list group {
                key "name";
                ordered-by user;
                description
                  "IP multicast group address";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "IP multicast group address";
                }
    
                uses apply-advanced;
    
                list source {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast source address";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "Source address of IP multicast data";
                  }
    
                  uses apply-advanced;
                }  // list source
              }  // list group
            }  // container static
          }  // list interface
    
          list pseudowire-remote-address {
            junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
            junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
            key "name";
            ordered-by user;
            description
              "Pseudowire interface options for IGMP";
            leaf name {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, pseudowire-remote-address should be configured only under vlan";
              type jt:ipv4addr;
              description
                "Pseudowire endpoint address";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
          }  // list pseudowire-remote-address
    
          list qualified-vlan {
            key "name";
            ordered-by user;
            description
              "VLAN options for qualified-learning";
            leaf name {
              junos:must "(".. .. .. .. .. vlans ${vlan} vlan-id all")";
              junos:must-message "vlan specific configuration is allowed with qualified-learning only";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 1023";
                }
              }
              description
                "VLAN ID of the learning-domain";
            }
    
            uses apply-advanced;
    
            leaf query-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1024";
                }
              }
              units "seconds";
              description
                "When to send host query messages";
            }
    
            leaf query-response-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "How long to wait for a host query response";
            }
    
            leaf query-last-member-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "When to send group query messages";
            }
    
            leaf robust-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10";
                }
              }
              description
                "Expected packet loss on a subnet";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            container proxy {
              presence "enable proxy";
              description "Enable proxy mode";
              uses apply-advanced;
    
              leaf source-address {
                type jt:ipv4addr;
                description
                  "Source IP address to use for proxy";
              }
            }  // container proxy
    
            leaf evpn-ssm-reports-only {
              type empty;
              description
                "Accept and process only <s,g> reports of SSM groups";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface options for IGMP";
              leaf name {
                junos:must "(".. .. .. .. .. .. vlans ${vlan} interface $$")";
                junos:must-message "interface options can be specified for the interfaces in the routing-instance";
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              leaf host-only-interface {
                junos:must "(!(".. multicast-router-interface"))";
                junos:must-message "interface cannot be both host-only and multicast-router";
                type empty;
                description
                  "Enable interfaces to be treated as host-side interfaces";
              }
    
              leaf group-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum number of (source,group) per interface";
              }
    
              container static {
                description
                  "Static group or source membership";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast group address";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "IP multicast group address";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast source address";
                    leaf name {
                      type jt:ipv4addr;
                      description
                        "Source address of IP multicast data";
                    }
    
                    uses apply-advanced;
                  }  // list source
                }  // list group
              }  // container static
            }  // list interface
    
            list pseudowire-remote-address {
              junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
              junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
              key "name";
              ordered-by user;
              description
                "Pseudowire interface options for IGMP";
              leaf name {
                type jt:ipv4addr;
                description
                  "Pseudowire endpoint address";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
            }  // list pseudowire-remote-address
          }  // list qualified-vlan
    
          list vlan {
            key "name";
            ordered-by user;
            description "Vlan options";
            leaf name {
              junos:must "(!(".. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Snooping cannot be enabled on secondary vlan";
              type string {
                length "1 .. 64";
              }
              description "VLAN name";
            }
    
            uses apply-advanced;
    
            leaf query-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1024";
                }
              }
              units "seconds";
              description
                "When to send host query messages";
            }
    
            leaf query-response-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "How long to wait for a host query response";
            }
    
            leaf query-last-member-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "When to send group query messages";
            }
    
            leaf robust-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10";
                }
              }
              description
                "Expected packet loss on a subnet";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            container proxy {
              presence "enable proxy";
              description "Enable proxy mode";
              uses apply-advanced;
    
              leaf source-address {
                junos:must "((!(".. .. .. .. .. vlans ${vlan} vlan-id all") && !(".. .. .. .. .. vlans ${vlan} vlan-id inner-all")))";
                junos:must-message "With qualified-learning source-address should be configured under Vlan options";
                type jt:ipv4addr;
                description
                  "Source IP address to use for proxy";
              }
            }  // container proxy
    
            leaf evpn-ssm-reports-only {
              type empty;
              description
                "Accept and process only <s,g> reports of SSM groups";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface options for IGMP";
              leaf name {
                junos:must "(!("interfaces $$-IFL vlan-tags inner-range"))";
                junos:must-message "interface with vlan-tags inner-range should be specified in a learning-domain only";
                junos:must "(!("interfaces $$-IFL vlan-id-range"))";
                junos:must-message "interface with vlan-id-range should be specified in a learning-domain only";
                junos:must "(!(".. .. .. .. .. vlans ${vlan} vlan-id all"))";
                junos:must-message "When 'vlan-id all' is configured, interface should be configured only under vlan";
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              leaf host-only-interface {
                junos:must "(!(".. multicast-router-interface"))";
                junos:must-message "interface cannot be both host-only and multicast-router";
                type empty;
                description
                  "Enable interfaces to be treated as host-side interfaces";
              }
    
              leaf group-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum number of (source,group) per interface";
              }
    
              container static {
                description
                  "Static group or source membership";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast group address";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "IP multicast group address";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast source address";
                    leaf name {
                      type jt:ipv4addr;
                      description
                        "Source address of IP multicast data";
                    }
    
                    uses apply-advanced;
                  }  // list source
                }  // list group
              }  // container static
            }  // list interface
    
            list pseudowire-remote-address {
              junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
              junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
              key "name";
              ordered-by user;
              description
                "Pseudowire interface options for IGMP";
              leaf name {
                type jt:ipv4addr;
                description
                  "Pseudowire endpoint address";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
            }  // list pseudowire-remote-address
    
            list qualified-vlan {
              key "name";
              ordered-by user;
              description
                "VLAN options for qualified-learning";
              leaf name {
                junos:must "(".. .. .. .. .. vlans ${vlan} vlan-id all")";
                junos:must-message "vlan specific configuration is allowed with qualified-learning only";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1023";
                  }
                }
                description
                  "VLAN ID of the learning-domain";
              }
    
              uses apply-advanced;
    
              leaf query-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1024";
                  }
                }
                units "seconds";
                description
                  "When to send host query messages";
              }
    
              leaf query-response-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "How long to wait for a host query response";
              }
    
              leaf query-last-member-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "When to send group query messages";
              }
    
              leaf robust-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 10";
                  }
                }
                description
                  "Expected packet loss on a subnet";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              container proxy {
                presence "enable proxy";
                description "Enable proxy mode";
                uses apply-advanced;
    
                leaf source-address {
                  type jt:ipv4addr;
                  description
                    "Source IP address to use for proxy";
                }
              }  // container proxy
    
              leaf evpn-ssm-reports-only {
                type empty;
                description
                  "Accept and process only <s,g> reports of SSM groups";
              }
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Interface options for IGMP";
                leaf name {
                  junos:must "(".. .. .. .. .. .. vlans ${vlan} interface $$")";
                  junos:must-message "interface options can be specified for the interfaces in the routing-instance";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
    
                leaf host-only-interface {
                  junos:must "(!(".. multicast-router-interface"))";
                  junos:must-message "interface cannot be both host-only and multicast-router";
                  type empty;
                  description
                    "Enable interfaces to be treated as host-side interfaces";
                }
    
                leaf group-limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Maximum number of (source,group) per interface";
                }
    
                container static {
                  description
                    "Static group or source membership";
                  uses apply-advanced;
    
                  list group {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast group address";
                    leaf name {
                      type jt:ipv4addr;
                      description
                        "IP multicast group address";
                    }
    
                    uses apply-advanced;
    
                    list source {
                      key "name";
                      ordered-by user;
                      description
                        "IP multicast source address";
                      leaf name {
                        type jt:ipv4addr;
                        description
                          "Source address of IP multicast data";
                      }
    
                      uses apply-advanced;
                    }  // list source
                  }  // list group
                }  // container static
              }  // list interface
    
              list pseudowire-remote-address {
                junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
                junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
                key "name";
                ordered-by user;
                description
                  "Pseudowire interface options for IGMP";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Pseudowire endpoint address";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
              }  // list pseudowire-remote-address
            }  // list qualified-vlan
          }  // list vlan
        }  // grouping juniper-ri-protocols-igmp-snooping
    
        grouping juniper-ri-protocols-mld-snooping {
          description "MLD snooping options";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for MLD Snooping";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all MLD packets";
                  }
                  enum "query" {
                    value 1;
                    description
                      "Trace MLD membership query messages";
                  }
                  enum "report" {
                    value 2;
                    description
                      "Trace membership report messages";
                  }
                  enum "leave" {
                    value 3;
                    description
                      "Trace leave group messages (MLDv2 only)";
                  }
                  enum "group" {
                    value 4;
                    description
                      "Trace group operations";
                  }
                  enum "client-notification" {
                    value 5;
                    description
                      "Trace notifications";
                  }
                  enum "host-notification" {
                    value 6;
                    description
                      "Trace host notifications";
                  }
                  enum "route" {
                    value 7;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 8;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 9;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 10;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 11;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 12;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 13;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 14;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf query-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1024";
              }
            }
            units "seconds";
            default "125";
            description
              "When to send host query messages";
          }
    
          container l2-querier {
            description "Enable L2 querier mode";
            uses apply-advanced;
    
            leaf source-address {
              type jt:ipv6addr;
              description
                "Source IP address to use for L2 querier";
            }
          }  // container l2-querier
    
          leaf query-response-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "10";
            description
              "How long to wait for a host query response";
          }
    
          leaf query-last-member-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "1";
            description
              "When to send group query messages";
          }
    
          leaf robust-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "2 .. 10";
              }
            }
            default "2";
            description
              "Expected packet loss on a subnet";
          }
    
          leaf immediate-leave {
            type empty;
            description
              "Enable immediate group leave on interfaces";
          }
    
          leaf evpn-ssm-reports-only {
            type empty;
            description
              "Accept and process only <s,g> reports of SSM groups";
          }
    
          container proxy {
            presence "enable proxy";
            description "Enable proxy mode";
            uses apply-advanced;
    
            leaf source-address {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "With qualified-learning source-address should be configured under Vlan options";
              type jt:ipv6addr;
              description
                "Source IP address to use for proxy";
            }
    
            leaf irb {
              type empty;
              description
                "Proxy IGMP reports to IRB";
            }
          }  // container proxy
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interface options for MLD";
            leaf name {
              junos:must "(!("interfaces $$-IFL vlan-tags inner-range"))";
              junos:must-message "interface with vlan-tags inner-range should be specified in a learning-domain only";
              junos:must "(!("interfaces $$-IFL vlan-id-range"))";
              junos:must-message "interface with vlan-id-range should be specified in a learning-domain only";
              junos:must "(".. .. .. .. interface $$")";
              junos:must-message "interface options can be specified for the interfaces in the routing-instance";
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, interface should be configured only under vlan";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            leaf host-only-interface {
              junos:must "(!(".. multicast-router-interface"))";
              junos:must-message "interface cannot be both host-only and multicast-router";
              type empty;
              description
                "Enable interfaces to be treated as host-side interfaces";
            }
    
            leaf group-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 65535";
                }
              }
              description
                "Maximum number of (source,group) per interface";
            }
    
            container static {
              description
                "Static group or source membership";
              uses apply-advanced;
    
              list group {
                key "name";
                ordered-by user;
                description
                  "IP multicast group address";
                leaf name {
                  type jt:ipv6addr;
                  description
                    "IP multicast group address";
                }
    
                uses apply-advanced;
    
                list source {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast source address";
                  leaf name {
                    type jt:ipv6addr;
                    description
                      "Source address of IP multicast data";
                  }
    
                  uses apply-advanced;
                }  // list source
              }  // list group
            }  // container static
          }  // list interface
    
          list pseudowire-remote-address {
            junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
            junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
            key "name";
            ordered-by user;
            description
              "Pseudowire interface options for MLD";
            leaf name {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, pseudowire-remote-address should be configured only under vlan";
              type jt:ipv4addr;
              description
                "Pseudowire endpoint address";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
          }  // list pseudowire-remote-address
    
          list qualified-vlan {
            key "name";
            ordered-by user;
            description
              "VLAN options for qualified-learning";
            leaf name {
              junos:must "(".. .. .. .. .. vlans ${vlan} vlan-id all")";
              junos:must-message "vlan specific configuration is allowed with qualified-learning only";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 1023";
                }
              }
              description
                "VLAN ID of the learning-domain";
            }
    
            uses apply-advanced;
    
            leaf query-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1024";
                }
              }
              units "seconds";
              description
                "When to send host query messages";
            }
    
            leaf query-response-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "How long to wait for a host query response";
            }
    
            leaf query-last-member-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "When to send group query messages";
            }
    
            leaf robust-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10";
                }
              }
              description
                "Expected packet loss on a subnet";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            container proxy {
              presence "enable proxy";
              description "Enable proxy mode";
              uses apply-advanced;
    
              leaf source-address {
                type jt:ipv6addr;
                description
                  "Source IP address to use for proxy";
              }
            }  // container proxy
    
            leaf evpn-ssm-reports-only {
              type empty;
              description
                "Accept and process only <s,g> reports of SSM groups";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface options for MLD";
              leaf name {
                junos:must "(".. .. .. .. .. .. vlans ${vlan} interface $$")";
                junos:must-message "interface options can be specified for the interfaces in the routing-instance";
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              leaf host-only-interface {
                junos:must "(!(".. multicast-router-interface"))";
                junos:must-message "interface cannot be both host-only and multicast-router";
                type empty;
                description
                  "Enable interfaces to be treated as host-side interfaces";
              }
    
              leaf group-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum number of (source,group) per interface";
              }
    
              container static {
                description
                  "Static group or source membership";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast group address";
                  leaf name {
                    type jt:ipv6addr;
                    description
                      "IP multicast group address";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast source address";
                    leaf name {
                      type jt:ipv6addr;
                      description
                        "Source address of IP multicast data";
                    }
    
                    uses apply-advanced;
                  }  // list source
                }  // list group
              }  // container static
            }  // list interface
    
            list pseudowire-remote-address {
              junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
              junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
              key "name";
              ordered-by user;
              description
                "Pseudowire interface options for MLD";
              leaf name {
                type jt:ipv4addr;
                description
                  "Pseudowire endpoint address";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
            }  // list pseudowire-remote-address
          }  // list qualified-vlan
    
          list vlan {
            key "name";
            ordered-by user;
            description "Vlan options";
            leaf name {
              junos:must "(!(".. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Snooping cannot be enabled on secondary vlan";
              type string {
                length "1 .. 64";
              }
              description
                "Vlan of the bridge-domain";
            }
    
            uses apply-advanced;
    
            leaf query-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1024";
                }
              }
              units "seconds";
              description
                "When to send host query messages";
            }
    
            leaf query-response-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "How long to wait for a host query response";
            }
    
            leaf query-last-member-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "When to send group query messages";
            }
    
            leaf robust-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10";
                }
              }
              description
                "Expected packet loss on a subnet";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            container proxy {
              presence "enable proxy";
              description "Enable proxy mode";
              uses apply-advanced;
    
              leaf source-address {
                junos:must "((!(".. .. .. .. .. vlans ${vlan} vlan-id all") && !(".. .. .. .. .. vlans ${vlan} vlan-id inner-all")))";
                junos:must-message "With qualified-learning source-address should be configured under Vlan options";
                type jt:ipv6addr;
                description
                  "Source IP address to use for proxy";
              }
            }  // container proxy
    
            leaf evpn-ssm-reports-only {
              type empty;
              description
                "Accept and process only <s,g> reports of SSM groups";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface options for MLD";
              leaf name {
                junos:must "(!("interfaces $$-IFL vlan-tags inner-range"))";
                junos:must-message "interface with vlan-tags inner-range should be specified in a learning-domain only";
                junos:must "(!("interfaces $$-IFL vlan-id-range"))";
                junos:must-message "interface with vlan-id-range should be specified in a learning-domain only";
                junos:must "(!(".. .. .. .. .. vlans ${vlan} vlan-id all"))";
                junos:must-message "When 'vlan-id all' is configured, interface should be configured only under vlan";
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              leaf host-only-interface {
                junos:must "(!(".. multicast-router-interface"))";
                junos:must-message "interface cannot be both host-only and multicast-router";
                type empty;
                description
                  "Enable interfaces to be treated as host-side interfaces";
              }
    
              leaf group-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum number of (source,group) per interface";
              }
    
              container static {
                description
                  "Static group or source membership";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast group address";
                  leaf name {
                    type jt:ipv6addr;
                    description
                      "IP multicast group address";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast source address";
                    leaf name {
                      type jt:ipv6addr;
                      description
                        "Source address of IP multicast data";
                    }
    
                    uses apply-advanced;
                  }  // list source
                }  // list group
              }  // container static
            }  // list interface
    
            list pseudowire-remote-address {
              junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
              junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
              key "name";
              ordered-by user;
              description
                "Pseudowire interface options for MLD";
              leaf name {
                type jt:ipv4addr;
                description
                  "Pseudowire endpoint address";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
            }  // list pseudowire-remote-address
    
            list qualified-vlan {
              key "name";
              ordered-by user;
              description
                "VLAN options for qualified-learning";
              leaf name {
                junos:must "(".. .. .. .. .. vlans ${vlan} vlan-id all")";
                junos:must-message "vlan specific configuration is allowed with qualified-learning only";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1023";
                  }
                }
                description
                  "VLAN ID of the learning-domain";
              }
    
              uses apply-advanced;
    
              leaf query-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1024";
                  }
                }
                units "seconds";
                description
                  "When to send host query messages";
              }
    
              leaf query-response-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "How long to wait for a host query response";
              }
    
              leaf query-last-member-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "When to send group query messages";
              }
    
              leaf robust-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 10";
                  }
                }
                description
                  "Expected packet loss on a subnet";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              container proxy {
                presence "enable proxy";
                description "Enable proxy mode";
                uses apply-advanced;
    
                leaf source-address {
                  type jt:ipv6addr;
                  description
                    "Source IP address to use for proxy";
                }
              }  // container proxy
    
              leaf evpn-ssm-reports-only {
                type empty;
                description
                  "Accept and process only <s,g> reports of SSM groups";
              }
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Interface options for MLD";
                leaf name {
                  junos:must "(".. .. .. .. .. .. vlans ${vlan} interface $$")";
                  junos:must-message "interface options can be specified for the interfaces in the routing-instance";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
    
                leaf host-only-interface {
                  junos:must "(!(".. multicast-router-interface"))";
                  junos:must-message "interface cannot be both host-only and multicast-router";
                  type empty;
                  description
                    "Enable interfaces to be treated as host-side interfaces";
                }
    
                leaf group-limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Maximum number of (source,group) per interface";
                }
    
                container static {
                  description
                    "Static group or source membership";
                  uses apply-advanced;
    
                  list group {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast group address";
                    leaf name {
                      type jt:ipv6addr;
                      description
                        "IP multicast group address";
                    }
    
                    uses apply-advanced;
    
                    list source {
                      key "name";
                      ordered-by user;
                      description
                        "IP multicast source address";
                      leaf name {
                        type jt:ipv6addr;
                        description
                          "Source address of IP multicast data";
                      }
    
                      uses apply-advanced;
                    }  // list source
                  }  // list group
                }  // container static
              }  // list interface
    
              list pseudowire-remote-address {
                junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
                junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
                key "name";
                ordered-by user;
                description
                  "Pseudowire interface options for MLD";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Pseudowire endpoint address";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
              }  // list pseudowire-remote-address
            }  // list qualified-vlan
          }  // list vlan
        }  // grouping juniper-ri-protocols-mld-snooping
    
        grouping juniper-routing-instance-switch-options {
          description
            "Bridge options for the routing instance";
          uses apply-advanced;
    
          container mac-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC address forwarding table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container mac-table-size
    
          container mac-ip-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-ip-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC+IP bindings table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings";
            }
          }  // container mac-ip-table-size
    
          container interface-mac-limit {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC address learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses per interface";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
                enum "log" {
                  value 2;
                  description
                    "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                }
                enum "shutdown" {
                  value 3;
                  description
                    "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                }
                enum "drop-and-log" {
                  value 4;
                  description
                    "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container interface-mac-limit
    
          container interface-mac-ip-limit {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-ip-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC+IP bindings learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings per interface";
            }
          }  // container interface-mac-ip-limit
    
          container mac-notification {
            presence "enable mac-notification";
            description
              "MAC notification options";
            uses apply-advanced;
    
            leaf notification-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 60";
                }
              }
              units "seconds";
              default "30";
              description
                "Interval for sending MAC notifications";
            }
          }  // container mac-notification
    
          leaf mac-table-aging-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            units "seconds";
            description
              "Delay for discarding MAC address if no updates are received";
          }
    
          leaf no-mac-learning {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "no-mac-learning needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Disable dynamic MAC address learning";
          }
    
          leaf no-normalization {
            type empty;
            description
              "Disable vlan id normalization for interfaces";
          }
    
          leaf mac-statistics {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-statistics needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Enable MAC address statistics";
          }
    
          container mib {
            presence "enable mib";
            description "Snmp mib options";
            uses apply-advanced;
    
            container dot1q-mib {
              presence "enable dot1q-mib";
              description
                "Dot1q MIB configuration options";
              uses apply-advanced;
    
              leaf port-list {
                type enumeration {
                  enum "bit-map" {
                    value 0;
                    description
                      "Port list is represented in bit-map format";
                  }
                  enum "string" {
                    value 1;
                    description
                      "Port list is represented in string format";
                  }
                }
                description
                  "Port list for staticegressports and staticuntaggedports MIB";
              }
            }  // container dot1q-mib
          }  // container mib
    
          container static-rvtep-mac {
            description
              "Configure Static MAC and remote VxLAN tunnel endpoint entries";
            uses apply-advanced;
    
            list mac {
              key "mac_addr remote-vtep";
              description "Unicast MAC address";
              leaf mac_addr {
                type jt:mac-unicast;
              }
    
              leaf remote-vtep {
                type jt:ipaddr;
                description
                  "Configure static remote VXLAN tunnel endpoints";
              }
            }  // list mac
          }  // container static-rvtep-mac
    
          leaf service-id {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Service ID required if multi-chassis AE is part of a bridge-domain";
          }
    
          leaf ovsdb-managed {
            junos:must "(!("routing-instances ${instance} protocols evpn encapsulation vxlan"))";
            junos:must-message "Not valid with protocols evpn encapsulation vxlan";
            type empty;
            description
              "All vxlan bridge domains in routing instance are remote managed";
          }
    
          list interface {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface needs to be specified under switch-options for a virtual-switch instance";
            key "name";
            ordered-by user;
            description
              "Interface that connect this site to the VPN";
            leaf name {
              junos:must "((".. .. .. interface $$" || "FALSE"))";
              junos:must-message "Interface must be part of this routing instance";
              junos:must "((".. .. .. interface $$" || (".. .. .. .. .. interface $$" || "interfaces $$-IFL family ethernet-switching")))";
              junos:must-message "Interface must be part of this routing instance";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container interface-mac-limit {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              description
                "Maximum number of MAC addresses learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC addresses per interface";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable interface for interface-mac-limit";
              }
    
              leaf packet-action {
                type enumeration {
                  enum "none" {
                    value 0;
                    description
                      "Forward the packet";
                  }
                  enum "drop" {
                    value 1;
                    description
                      "Drop packets and do not learn. Default is forward";
                  }
                  enum "log" {
                    value 2;
                    description
                      "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "shutdown" {
                    value 3;
                    description
                      "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "drop-and-log" {
                    value 4;
                    description
                      "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                  }
                }
                description
                  "Action when MAC limit is reached";
              }
            }  // container interface-mac-limit
    
            leaf action-priority {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 8";
                }
              }
              description
                "Blocking priority of this interface on mac move detection";
            }
    
            list static-mac {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              key "name";
              ordered-by user;
              description
                "Static MAC addresses assigned to this interface";
              leaf name {
                junos:must "((!("FALSE") || all ".. vlan-id <*>"))";
                junos:must-message " Specify vlan-id for qualified learning ";
                type jt:mac-addr;
                description "MAC address";
              }
    
              uses apply-advanced;
    
              list vlan-id {
                junos:must "("FALSE")";
                junos:must-message "'vlan-id all' has to be configured for the bridging domain";
                key "name";
                ordered-by user;
                description
                  "VLAN ID of learning VLAN";
                leaf name {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4094";
                    }
                  }
                  description "Learning VLAN";
                }
    
                uses apply-advanced;
              }  // list vlan-id
            }  // list static-mac
    
            container interface-mac-ip-limit {
              description
                "Maximum number of MAC+IP bindings learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC+IP bindings per interface";
              }
            }  // container interface-mac-ip-limit
    
            leaf no-mac-learning {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              type empty;
              description
                "Disable dynamic MAC address learning";
            }
    
            leaf mac-pinning {
              type empty;
              description "Enable MAC pinning";
            }
    
            leaf persistent-learning {
              junos:must "(!("switch-options mac-table-aging-time "))";
              junos:must-message "Persistent learning can not co-exist with mac-table-aging-time";
              type empty;
              description
                "Enable persistent MAC learning on this interface";
            }
          }  // list interface
    
          container traceoptions {
            description
              "Layer 2 trace options for this routing instance";
            uses apply-advanced;
    
            leaf no-remote-trace {
              junos:must "("system tracing")";
              junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
              type empty;
              description
                "Disable remote tracing";
            }
    
            container file {
              description
                "Trace file information";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "3";
                description
                  "Maximum number of trace files";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
    
              leaf match {
                type jt:regular-expression;
                description
                  "Regular expression for lines to be logged";
              }
            }  // container file
    
            leaf level {
              type enumeration {
                enum "error" {
                  value 0;
                  description
                    "Match error conditions";
                }
                enum "warning" {
                  value 1;
                  description
                    "Match warning messages";
                }
                enum "notice" {
                  value 2;
                  description
                    "Match conditions that should be handled specially";
                }
                enum "info" {
                  value 3;
                  description
                    "Match informational messages";
                }
                enum "verbose" {
                  value 4;
                  description
                    "Match verbose messages";
                }
                enum "all" {
                  value 5;
                  description "Match all levels";
                }
              }
              default "error";
              description
                "Level of debugging output";
            }
    
            list flag {
              key "name";
              ordered-by user;
              description
                "Type of operation or event to include in trace";
              leaf name {
                type enumeration {
                  enum "configuration" {
                    value 0;
                    description
                      "Configuration operations";
                  }
                  enum "routing-socket" {
                    value 1;
                    description
                      "Routing socket operations";
                  }
                  enum "interface-device" {
                    value 2;
                    description
                      "Interface device operations";
                  }
                  enum "interface-logical" {
                    value 3;
                    description
                      "Logical interface operations";
                  }
                  enum "interface-family" {
                    value 4;
                    description
                      "Interface family operations";
                  }
                  enum "bridging-domain" {
                    value 5;
                    description
                      "Bridging domain operations";
                  }
                  enum "bridge-interface" {
                    value 6;
                    description
                      "Interface bridge operations";
                  }
                  enum "learning-domain" {
                    value 7;
                    description
                      "Learning domain operations";
                  }
                  enum "ipc" {
                    value 8;
                    description
                      "Inter-process communications operations";
                  }
                  enum "mac-learning" {
                    value 9;
                    description
                      "MAC address learning operations";
                  }
                  enum "initialization" {
                    value 10;
                    description
                      "Initialization operations";
                  }
                  enum "flood-next-hop" {
                    value 11;
                    description
                      "Flood next hop operations";
                  }
                  enum "irb" {
                    value 12;
                    description
                      "Integrated routing and bridging operations";
                  }
                  enum "vpls-ping" {
                    value 13;
                    description
                      "VPLS ping operations";
                  }
                  enum "vpls-loop-prev" {
                    value 14;
                    description
                      "VPLS loop prevention";
                  }
                  enum "storm-control" {
                    value 15;
                    description "Storm-control";
                  }
                  enum
                    "unknown-unicast-forwarding" {
                    value 16;
                    description
                      "Trace unknown unicast forwarding events";
                  }
                  enum "vxlan" {
                    value 17;
                    description "VXLAN";
                  }
                  enum "all" {
                    value 18;
                    description "All operations";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
    
          container voip {
            description
              "Voice-over-IP configuration";
            uses apply-advanced;
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Enable voice over IP on this port";
              leaf name {
                type string;
              }
    
              uses apply-advanced;
    
              leaf vlan {
                junos:must "(!("vlans $$ vlan-range "))";
                junos:must-message "Ranged vlan cannot be used by Voice-over-IP";
                type string;
                description
                  "VLAN for voice over IP";
              }
    
              leaf forwarding-class {
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be string of 64 characters or less";
                }
                description "Forwarding class";
              }
            }  // list interface
          }  // container voip
    
          container unknown-unicast-forwarding {
            description
              "Set interface for forwarding of unknown unicast packets";
            uses apply-advanced;
    
            list vlan {
              key "name";
              description
                "VLAN for the unknown unicast packets";
              leaf name {
                type string;
                description
                  "VLAN name or VLAN Tag (1..4095)";
              }
    
              uses apply-advanced;
    
              leaf interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Interface to send unknown unicast packets for the VLAN";
              }
            }  // list vlan
          }  // container unknown-unicast-forwarding
        }  // grouping juniper-routing-instance-switch-options
    
        grouping juniper-routing-options {
          uses apply-advanced;
    
          container logical-system-mux {
            description
              "Logical system control daemon information";
            uses apply-advanced;
    
            container traceoptions {
              description "Trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "debug" {
                      value 0;
                      description
                        "Trace debug-level lrmuxd activities";
                    }
                    enum "parse" {
                      value 1;
                      description
                        "Trace configuration parsing";
                    }
                    enum "route" {
                      value 2;
                      description
                        "Trace routing information";
                    }
                    enum "normal" {
                      value 3;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 4;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 5;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 6;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 7;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 8;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 9;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
          }  // container logical-system-mux
    
          container auto-bandwidth {
            presence "enable auto-bandwidth";
            description "Auto bandwidth";
            uses apply-advanced;
    
            list template {
              key "name";
              ordered-by user;
              description
                "Auto bandwidth template";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description
                  "Auto bandwidth template name (Maximum length 64)";
              }
    
              uses apply-advanced;
    
              leaf adjust-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "30 .. 3600";
                  }
                }
                description "Adjust interval";
              }
    
              leaf adjust-threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 100";
                  }
                }
                description
                  "Percentage threshhold";
              }
    
              leaf statistic-collection-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10 .. 300";
                  }
                }
                description
                  "Collection interval";
              }
    
              leaf auto-bandwidth-subscription {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 200";
                  }
                }
                description
                  "Percentage threshhold for subscription";
              }
            }  // list template
    
            container traceoptions {
              description
                "Trace options for sr stats";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "all" {
                      value 0;
                      description "Trace All";
                    }
                    enum "timer" {
                      value 1;
                      description
                        "Trace traffic recv by periodic timer";
                    }
                    enum "state" {
                      value 2;
                      description
                        "Trace state of sensor";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
          }  // container auto-bandwidth
    
          container backup-selection {
            presence "enable backup-selection";
            description
              "Backup selection options";
            uses apply-advanced;
    
            list destination {
              key "name";
              description
                "IP/IPv6 prefix for which backup selection policy is configured";
              leaf name {
                type jt:ipprefix-mandatory;
                description
                  "IP/IPv6 address (and optional prefix length)";
              }
    
              uses apply-advanced;
    
              list interface {
                key "name";
                description
                  "Primary nexthop interface for which backup selection policy is configured";
                leaf name {
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                container admin-group {
                  description
                    "Administrative group policies for backup-selection";
                  uses apply-advanced;
    
                  leaf-list exclude {
                    type string;
                    description
                      "Do not use interface if any admin group available";
                  }
    
                  leaf-list include-all {
                    type string;
                    description
                      "Use interface if admin groups available entirely";
                  }
    
                  leaf-list include-any {
                    type string;
                    description
                      "Use interface if any admin group is available";
                  }
    
                  leaf-list preference {
                    type string;
                    ordered-by user;
                    description
                      "Administrative groups in descending preference order";
                  }
                }  // container admin-group
    
                leaf srlg {
                  type enumeration {
                    enum "loose" {
                      value 0;
                      description "Loose SRLG";
                    }
                    enum "strict" {
                      value 1;
                      description "Strict SRLG";
                    }
                  }
                  default "loose";
                  description
                    "Evaluate Shared Risk Link Group(SRLG) characteristics for backup selection";
                }
    
                leaf protection-type {
                  type enumeration {
                    enum "link" {
                      value 0;
                      description
                        "Protect the primary interface from link faults only";
                    }
                    enum "node" {
                      value 1;
                      description
                        "Protect the primary interface from node faults only";
                    }
                    enum "node-link" {
                      value 2;
                      description
                        "Protect the primary interface from either link or node faults; prefer node protection";
                    }
                  }
                  description
                    "Type of protection to be considered";
                }
    
                leaf downstream-paths-only {
                  type empty;
                  description
                    "Choose only the downstream nodes for backup";
                }
    
                leaf bandwidth-greater-equal-primary {
                  type empty;
                  description
                    "Use backup nexthop only if bandwidth is >= bandwidth of primary nexthop";
                }
    
                container backup-neighbor {
                  description
                    "Backup Neighbor ID based policies for backup selection";
                  uses apply-advanced;
    
                  leaf-list exclude {
                    type jt:ipv4addr;
                    description
                      "List of backup neighbors to be excluded";
                  }
    
                  leaf-list preference {
                    type jt:ipv4addr;
                    ordered-by user;
                    description
                      "List of backup neighbors in descending order preference";
                  }
                }  // container backup-neighbor
    
                container node {
                  description
                    "Node ID based policies for backup selection";
                  uses apply-advanced;
    
                  leaf-list exclude {
                    type jt:ipv4addr;
                    description
                      "List of nodes to be excluded";
                  }
    
                  leaf-list preference {
                    type jt:ipv4addr;
                    ordered-by user;
                    description
                      "List of nodes in the descending order of preference";
                  }
                }  // container node
    
                container node-tag {
                  description
                    "Node  tag policies";
                  uses apply-advanced;
    
                  leaf-list exclude {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "The set of node tags to be excluded";
                  }
    
                  leaf-list preference {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "The set of node tags in the descending order of preference";
                  }
                }  // container node-tag
    
                leaf root-metric {
                  type enumeration {
                    enum "lowest" {
                      value 0;
                      description
                        "Choose lowest root metric";
                    }
                    enum "highest" {
                      value 1;
                      description
                        "Choose highest root metric";
                    }
                  }
                  description "Root metric";
                }
    
                leaf dest-metric {
                  type enumeration {
                    enum "lowest" {
                      value 0;
                      description
                        "Choose lowest destination metric";
                    }
                    enum "highest" {
                      value 1;
                      description
                        "Choose highest destination metric";
                    }
                  }
                  description
                    "Destination metric";
                }
    
                leaf-list metric-order {
                  type enumeration {
                    enum "root" {
                      value 0;
                    }
                    enum "dest" {
                      value 1;
                    }
                  }
                  max-elements 2;
                  ordered-by user;
                  description
                    "Metric evaluation order";
                }
    
                leaf-list evaluation-order {
                  type enumeration {
                    enum "admin-group" {
                      value 0;
                      description
                        "Administrative Group/Link Color";
                    }
                    enum "srlg" {
                      value 1;
                      description "SRLG";
                    }
                    enum "bandwidth" {
                      value 2;
                      description "Bandwidth";
                    }
                    enum "protection-type" {
                      value 3;
                      description
                        "Type of protection";
                    }
                    enum "backup-neighbor" {
                      value 4;
                      description
                        "Backup Neighbor";
                    }
                    enum "node" {
                      value 5;
                      description "Node";
                    }
                    enum "node-tag" {
                      value 6;
                      description "Node tag";
                    }
                    enum "metric" {
                      value 7;
                      description
                        "Metric related parameters";
                    }
                  }
                  ordered-by user;
                  description
                    "Interface policy criteria evaluation order";
                }
              }  // list interface
            }  // list destination
          }  // container backup-selection
    
          list flex-algorithm {
            key "name";
            description
              "Configure flex-algorithms supported by this node.";
            leaf name {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "128 .. 255";
                }
              }
              description "Algorithm id";
            }
    
            uses apply-advanced;
    
            container definition {
              description
                "Configure flex-algorithm definition.";
              uses apply-advanced;
    
              leaf metric-type {
                type enumeration {
                  enum "igp-metric" {
                    value 0;
                    description
                      "Metric configured to be used for IGP";
                  }
                  enum "te-metric" {
                    value 1;
                    description
                      "Traffic-engineering metric";
                  }
                  enum "delay-metric" {
                    value 2;
                    description
                      "Min unidirectional link delay metric";
                  }
                }
              }
    
              choice calculation-type {
                leaf spf {
                  type empty;
                  description
                    "Normal SPF of type 0";
                }
                leaf strict-spf {
                  type empty;
                  description "Strict SPF";
                }
              }  // choice calculation-type
    
              leaf use-flex-algorithm-prefix-metric {
                type empty;
                description
                  "Set M flag in the flex-algorithm definition flags";
              }
    
              leaf priority {
                junos:must "(!(".. no-advertise"))";
                junos:must-message "Priority is relevant only if fad is advertised.";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Priority of the flex-algorithm advertisement.";
              }
    
              container admin-group {
                description
                  "Administrative group policy";
                uses admin_group_include_exclude;
              }  // container admin-group
            }  // container definition
    
            leaf color {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Color to be associated with this flex-algorithm";
            }
    
            leaf use-transport-class {
              junos:must "("routing-options transport-class auto-create")";
              junos:must-message "Please enable auto-create under routing-options transport-class hierarchy";
              type empty;
              description
                "Install ingress routes via transport class RIBs";
            }
          }  // list flex-algorithm
    
          container source-packet-routing {
            description
              "Source packet routing (SPRING)";
            uses apply-advanced;
    
            list mapping-server-entry {
              key "name";
              ordered-by user;
              description "Mapping server entry";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description
                  "Mapping server entry name";
              }
    
              uses apply-advanced;
    
              list prefix-segment {
                key "name";
                max-elements 64;
                ordered-by user;
                description "Prefix segment";
                leaf name {
                  type jt:ipprefix;
                  description
                    "Prefix segment prefix";
                }
    
                uses apply-advanced;
    
                leaf index {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 199999";
                    }
                  }
                  description
                    "Prefix segment index";
                }
    
                leaf attached {
                  type empty;
                  description
                    "Set attached flag in IS-IS mapping server advertisement";
                }
    
                leaf domain-wide-flooding {
                  type empty;
                  description
                    "Set S-flag in IS-IS mapping server advertisement";
                }
    
                leaf no-node-segment {
                  type empty;
                  description
                    "Clear node segment flag in mapping server prefix segment";
                }
              }  // list prefix-segment
    
              list prefix-segment-range {
                key "name";
                max-elements 64;
                ordered-by user;
                description
                  "Prefix segment range";
                leaf name {
                  type string {
                    length "1 .. 64";
                  }
                  description
                    "Prefix segment range name";
                }
    
                uses apply-advanced;
    
                leaf start-prefix {
                  type jt:ipprefix;
                  description "Start prefix";
                }
    
                leaf start-index {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 199999";
                    }
                  }
                  description "Start index";
                }
    
                leaf size {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1024";
                    }
                  }
                  description
                    "Size of prefix segment range";
                }
    
                leaf attached {
                  type empty;
                  description
                    "Set attached flag in IS-IS mapping server advertisement";
                }
    
                leaf domain-wide-flooding {
                  type empty;
                  description
                    "Set S-flag in IS-IS mapping server advertisement";
                }
    
                leaf no-node-segment {
                  type empty;
                  description
                    "Clear node segment flag in mapping server prefix segment";
                }
              }  // list prefix-segment-range
            }  // list mapping-server-entry
    
            container srv6 {
              description
                "SRv6 source-packet-routing";
              uses apply-advanced;
    
              list locator {
                key "name";
                ordered-by user;
                leaf name {
                  type string {
                    length "1 .. 64";
                  }
                  description
                    "Locator entry name";
                }
    
                uses apply-advanced;
    
                leaf algorithm {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255";
                    }
                  }
                  description
                    "Algorithm associated with this locator";
                }
    
                leaf address {
                  type jt:ipv6prefix;
                  description
                    "Configure Locator Service for SRv6";
                }
              }  // list locator
    
              leaf no-reduced-srh {
                type empty;
                description
                  "SRv6 Encapsulation mode non reduced SRH";
              }
    
              leaf transit-srh-insert {
                type empty;
                description
                  "SRv6 SRH insert mode on transit";
              }
            }  // container srv6
          }  // container source-packet-routing
    
          leaf route-distinguisher-id {
            type jt:ipv4addr;
            description
              "Identifier used in route distinguishers for routing instances";
          }
    
          list rib {
            key "name";
            ordered-by user;
            description "Routing table options";
            leaf name {
              type string;
              description "Routing table name";
            }
    
            uses apply-advanced;
    
            container static {
              description "Static routes";
              uses apply-advanced;
    
              leaf rib-group {
                type string;
                description
                  "Routing table group";
              }
    
              container defaults {
                description
                  "Global route options";
                uses apply-advanced;
    
                choice retain-choice {
                  leaf retain {
                    junos:must "(!(".. resolve"))";
                    junos:must-message "Must not specify resolve with retain";
                    type empty;
                    description
                      "Always keep route in forwarding table";
                  }
                  leaf no-retain {
                    junos:must "(!(".. resolve"))";
                    junos:must-message "Must not specify resolve with retain";
                    type empty;
                    description
                      "Don't always keep route in forwarding table";
                  }
                }  // choice retain-choice
    
                choice install-choice {
                  leaf install {
                    type empty;
                    description
                      "Install route into forwarding table";
                  }
                  leaf no-install {
                    type empty;
                    description
                      "Don't install route into forwarding table";
                  }
                }  // choice install-choice
    
                choice readvertise-choice {
                  leaf readvertise {
                    type empty;
                    description
                      "Mark route as eligible to be readvertised";
                  }
                  leaf no-readvertise {
                    type empty;
                    description
                      "Don't mark route as eligible to be readvertised";
                  }
                }  // choice readvertise-choice
    
                choice resolve-choice {
                  leaf resolve {
                    type empty;
                    description
                      "Allow resolution of indirectly connected next hops";
                  }
                  leaf no-resolve {
                    type empty;
                    description
                      "Don't allow resolution of indirectly connected next hops";
                  }
                }  // choice resolve-choice
    
                choice longest-match-choice {
                  leaf longest-match {
                    junos:must "(".. resolve")";
                    junos:must-message "Requires resolve to be configured";
                    type empty;
                    description
                      "Always use longest prefix match to resolve next hops";
                  }
                  leaf no-longest-match {
                    junos:must "(".. resolve")";
                    junos:must-message "Requires resolve to be configured";
                    type empty;
                    description
                      "Don't always use longest prefix match to resolve next hops";
                  }
                }  // choice longest-match-choice
    
                choice passive_flag {
                  leaf active {
                    type empty;
                    description
                      "Remove inactive route from forwarding table";
                  }
                  leaf passive {
                    type empty;
                    description
                      "Retain inactive route in forwarding table";
                  }
                }  // choice passive_flag
    
                container metric {
                  presence "enable metric";
                  description "Metric value";
                  uses rib_static_metric_type;
                }  // container metric
    
                container metric2 {
                  presence "enable metric2";
                  description "Metric value 2";
                  uses rib_static_metric_type;
                }  // container metric2
    
                container metric3 {
                  presence "enable metric3";
                  description "Metric value 3";
                  uses rib_static_metric_type;
                }  // container metric3
    
                container metric4 {
                  presence "enable metric4";
                  description "Metric value 4";
                  uses rib_static_metric_type;
                }  // container metric4
    
                container tag {
                  presence "enable tag";
                  description "Tag string";
                  uses rib_static_metric_type;
                }  // container tag
    
                container tag2 {
                  presence "enable tag2";
                  description "Tag string 2";
                  uses rib_static_metric_type;
                }  // container tag2
    
                container preference {
                  presence "enable preference";
                  description "Preference value";
                  uses rib_static_metric_type;
                }  // container preference
    
                container preference2 {
                  presence "enable preference2";
                  description
                    "Preference value 2";
                  uses rib_static_metric_type;
                }  // container preference2
    
                container color {
                  presence "enable color";
                  description
                    "Color (preference) value";
                  uses rib_static_metric_type;
                }  // container color
    
                container color2 {
                  presence "enable color2";
                  description
                    "Color (preference) value 2";
                  uses rib_static_metric_type;
                }  // container color2
    
                leaf-list community {
                  type jt:community;
                  ordered-by user;
                  description
                    "BGP community identifier";
                }
    
                container as-path {
                  description
                    "Autonomous system path";
                  uses apply-advanced;
    
                  leaf path {
                    type string;
                    description
                      "Autonomous system path";
                  }
    
                  leaf origin {
                    type enumeration {
                      enum "igp" {
                        value 0;
                        description
                          "Path originated in the local IGP";
                      }
                      enum "egp" {
                        value 1;
                        description
                          "Path originated in another AS";
                      }
                      enum "incomplete" {
                        value 2;
                        description
                          "Path was learned by some other means";
                      }
                    }
                  }
    
                  leaf atomic-aggregate {
                    type empty;
                    description
                      "Add ATOMIC_AGGREGATE path attribute to route";
                  }
    
                  container aggregator {
                    presence "enable aggregator";
                    description
                      "Add AGGREGATOR path attribute to route";
                  }  // container aggregator
    
                  leaf as-number {
                    type string {
                      junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                      junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                    }
                    description
                      " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                  }
    
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Address of BGP system that formed the route";
                  }
                }  // container as-path
              }  // container defaults
    
              list route {
                key "name";
                ordered-by user;
                description "Static route";
                leaf name {
                  type jt:ipprefix;
                }
    
                uses apply-advanced;
    
                choice next_hop {
                  leaf-list next-hop {
                    type union {
                      type jt:ipaddr-or-interface;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Next hop to destination";
                  }
                  leaf reject {
                    type empty;
                    description
                      "Drop packets to destination; send ICMP unreachables";
                  }
                  leaf discard {
                    type empty;
                    description
                      "Drop packets to destination; send no ICMP unreachables";
                  }
                  leaf receive {
                    type empty;
                    description
                      "Install a receive route for the destination";
                  }
                  leaf next-table {
                    type string {
                      junos:posix-pattern "^(((.{0,128})[:](.{1,128})[.]|((.{1,128})[.]))?([a-z]|[0-9]|[-_])+[.]((1?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5])))$";
                      junos:pattern-message "Must match the format [<instance-name>[:<topology-name>].]<family-name>.<rib-id>";
                    }
                    description
                      "Next hop to another table";
                  }
                }  // choice next_hop
    
                list qualified-next-hop {
                  key "name";
                  ordered-by user;
                  description
                    "Next hop with qualifiers";
                  uses qualified_nh_obj;
                }  // list qualified-next-hop
    
                leaf backup-pe-group {
                  junos:must "(".. p2mp-lsp-next-hop")";
                  junos:must-message "Backup groups only allowed for static routes with p2mp lsp next-hop";
                  type string;
                  description
                    "Multicast source redundancy group";
                }
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection (BFD) options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
    
                  container authentication {
                    description
                      "Authentication options";
                    uses apply-advanced;
    
                    leaf key-chain {
                      junos:must "(".. algorithm")";
                      junos:must-message "May not be configured without algorithm";
                      junos:must "("security authentication-key-chains key-chain $$")";
                      junos:must-message "Referenced key-chain must be defined";
                      type string;
                      description
                        "Key chain name";
                    }
    
                    leaf algorithm {
                      junos:must "(".. key-chain")";
                      junos:must-message "May not be configured without key-chain";
                      type enumeration {
                        enum "simple-password" {
                          value 0;
                          description
                            "Simple password";
                        }
                        enum "keyed-md5" {
                          value 1;
                          description
                            "Keyed message Digest 5";
                        }
                        enum
                          "meticulous-keyed-md5" {
                          value 2;
                          description
                            "Meticulous keyed message Digest 5";
                        }
                        enum "keyed-sha-1" {
                          value 3;
                          description
                            "Keyed secure hash algorithm (SHA1) ";
                        }
                        enum
                          "meticulous-keyed-sha-1" {
                          value 4;
                          description
                            "Meticulous keyed secure hash algorithm (SHA1) ";
                        }
                      }
                      description
                        "Algorithm name";
                    }
    
                    leaf loose-check {
                      type empty;
                      description
                        "Verify authentication only if authentication is negotiated";
                    }
                  }  // container authentication
    
                  leaf neighbor {
                    type jt:ipaddr;
                    description
                      "BFD neighbor address";
                  }
    
                  leaf local-address {
                    type jt:ipaddr;
                    description
                      "BFD local address (for multihop only)";
                  }
    
                  leaf holddown-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Time to hold the session-UP notification to the client";
                  }
    
                  leaf minimum-receive-ttl {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint8 {
                        range "1 .. 255";
                      }
                    }
                    description
                      "Minimum receive TTL below which to drop";
                  }
                }  // container bfd-liveness-detection
    
                choice retain-choice {
                  leaf retain {
                    junos:must "(!(".. resolve"))";
                    junos:must-message "Must not specify resolve with retain";
                    type empty;
                    description
                      "Always keep route in forwarding table";
                  }
                  leaf no-retain {
                    junos:must "(!(".. resolve"))";
                    junos:must-message "Must not specify resolve with retain";
                    type empty;
                    description
                      "Don't always keep route in forwarding table";
                  }
                }  // choice retain-choice
    
                choice install-choice {
                  leaf install {
                    type empty;
                    description
                      "Install route into forwarding table";
                  }
                  leaf no-install {
                    type empty;
                    description
                      "Don't install route into forwarding table";
                  }
                }  // choice install-choice
    
                choice readvertise-choice {
                  leaf readvertise {
                    type empty;
                    description
                      "Mark route as eligible to be readvertised";
                  }
                  leaf no-readvertise {
                    type empty;
                    description
                      "Don't mark route as eligible to be readvertised";
                  }
                }  // choice readvertise-choice
    
                choice resolve-choice {
                  leaf resolve {
                    type empty;
                    description
                      "Allow resolution of indirectly connected next hops";
                  }
                  leaf no-resolve {
                    type empty;
                    description
                      "Don't allow resolution of indirectly connected next hops";
                  }
                }  // choice resolve-choice
    
                choice longest-match-choice {
                  leaf longest-match {
                    junos:must "(".. resolve")";
                    junos:must-message "Requires resolve to be configured";
                    type empty;
                    description
                      "Always use longest prefix match to resolve next hops";
                  }
                  leaf no-longest-match {
                    junos:must "(".. resolve")";
                    junos:must-message "Requires resolve to be configured";
                    type empty;
                    description
                      "Don't always use longest prefix match to resolve next hops";
                  }
                }  // choice longest-match-choice
    
                choice passive_flag {
                  leaf active {
                    type empty;
                    description
                      "Remove inactive route from forwarding table";
                  }
                  leaf passive {
                    type empty;
                    description
                      "Retain inactive route in forwarding table";
                  }
                }  // choice passive_flag
    
                container metric {
                  presence "enable metric";
                  description "Metric value";
                  uses rib_static_metric_type;
                }  // container metric
    
                container metric2 {
                  presence "enable metric2";
                  description "Metric value 2";
                  uses rib_static_metric_type;
                }  // container metric2
    
                container metric3 {
                  presence "enable metric3";
                  description "Metric value 3";
                  uses rib_static_metric_type;
                }  // container metric3
    
                container metric4 {
                  presence "enable metric4";
                  description "Metric value 4";
                  uses rib_static_metric_type;
                }  // container metric4
    
                container tag {
                  presence "enable tag";
                  description "Tag string";
                  uses rib_static_metric_type;
                }  // container tag
    
                container tag2 {
                  presence "enable tag2";
                  description "Tag string 2";
                  uses rib_static_metric_type;
                }  // container tag2
    
                container preference {
                  presence "enable preference";
                  description "Preference value";
                  uses rib_static_metric_type;
                }  // container preference
    
                container preference2 {
                  presence "enable preference2";
                  description
                    "Preference value 2";
                  uses rib_static_metric_type;
                }  // container preference2
    
                container color {
                  presence "enable color";
                  description
                    "Color (preference) value";
                  uses rib_static_metric_type;
                }  // container color
    
                container color2 {
                  presence "enable color2";
                  description
                    "Color (preference) value 2";
                  uses rib_static_metric_type;
                }  // container color2
    
                leaf-list community {
                  type jt:community;
                  ordered-by user;
                  description
                    "BGP community identifier";
                }
    
                container as-path {
                  description
                    "Autonomous system path";
                  uses apply-advanced;
    
                  leaf path {
                    type string;
                    description
                      "Autonomous system path";
                  }
    
                  leaf origin {
                    type enumeration {
                      enum "igp" {
                        value 0;
                        description
                          "Path originated in the local IGP";
                      }
                      enum "egp" {
                        value 1;
                        description
                          "Path originated in another AS";
                      }
                      enum "incomplete" {
                        value 2;
                        description
                          "Path was learned by some other means";
                      }
                    }
                  }
    
                  leaf atomic-aggregate {
                    type empty;
                    description
                      "Add ATOMIC_AGGREGATE path attribute to route";
                  }
    
                  container aggregator {
                    presence "enable aggregator";
                    description
                      "Add AGGREGATOR path attribute to route";
                  }  // container aggregator
    
                  leaf as-number {
                    type string {
                      junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                      junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                    }
                    description
                      " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                  }
    
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Address of BGP system that formed the route";
                  }
                }  // container as-path
    
                list lsp-next-hop {
                  key "name";
                  ordered-by user;
                  description "LSP next hop";
                  uses lsp_nh_obj;
                }  // list lsp-next-hop
    
                list p2mp-lsp-next-hop {
                  key "name";
                  max-elements 1;
                  ordered-by user;
                  description
                    "Point-to-multipoint LSP next hop";
                  uses lsp_nh_obj;
                }  // list p2mp-lsp-next-hop
    
                container spring-te-lsp-next-hop {
                  junos:must "("protocols source-packet-routing tunnel-tracking")";
                  junos:must-message "Please enable the tunnel-tracking  under 'protocols source-packet-routing' hierarchy";
                  description
                    "SPRING-TE LSP next hop";
                  uses springte_lsp_nh_obj;
                }  // container spring-te-lsp-next-hop
    
                container p2mp-ldp-next-hop {
                  description
                    "Point-to-multipoint LDP LSP next hop";
                  uses p2mp_ldp_lsp_nh_obj;
                }  // container p2mp-ldp-next-hop
    
                list static-lsp-next-hop {
                  key "name";
                  ordered-by user;
                  description
                    "Static LSP next hop";
                  uses lsp_nh_obj;
                }  // list static-lsp-next-hop
              }  // list route
    
              container static-route {
                description
                  "Static route Status";
                leaf bfd-admin-down {
                  type enumeration {
                    enum "active" {
                      value 0;
                      description
                        "Static route will be inactive on bfd-admin-down";
                    }
                    enum "passive" {
                      value 1;
                      description
                        "Static route will remain active on bfd-admin-down";
                    }
                  }
                  description
                    "Static route State on BFD ADMIN DOWN";
                }
              }  // container static-route
    
              list route-target-filter {
                key "name";
                ordered-by user;
                description
                  "Route-target-filter route";
                leaf name {
                  type string {
                    junos:posix-pattern "^[0-9.]{1,15}L?:[0-9]{1,10}/([0-9]|[2-5][0-9]|6[0-4])$";
                    junos:pattern-message "Use format 'x:y/len' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. 123456L:100 and len is a prefix length from 0 to 64";
                    length "1 .. 47";
                  }
                }
    
                uses apply-advanced;
    
                leaf-list neighbor {
                  type jt:ipaddr-scoped;
                  ordered-by user;
                  description
                    "BGP peers for filter";
                }
    
                leaf-list group {
                  type string;
                  ordered-by user;
                  description
                    "BGP groups for filter";
                }
    
                leaf local {
                  type empty;
                  description
                    "Locally originated filter";
                }
              }  // list route-target-filter
            }  // container static
    
            list martians {
              key "address choice-ident choice-value";
              ordered-by user;
              description "Invalid routes";
              uses martian_type;
            }  // list martians
    
            container aggregate {
              description "Coalesced routes";
              uses rib_aggregate_type;
            }  // container aggregate
    
            container generate {
              description "Route of last resort";
              uses rib_aggregate_type;
            }  // container generate
    
            choice maximum-paths-type {
              container maximum-routes {
                status deprecated;
                description
                  "Maximum number of routes";
                leaf limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  description
                    "Maximum number of routes";
                }
    
                choice log_type {
                  leaf threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 100";
                      }
                    }
                    description
                      "Percentage of limit at which to start generating warnings";
                  }
                  leaf log-only {
                    type empty;
                    description
                      "Generate warning messages only";
                  }
                }  // choice log_type
    
                leaf log-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "5 .. 86400";
                    }
                  }
                  units "seconds";
                  description
                    "Minimum interval between log messages";
                }
              }  // container maximum-routes
              container maximum-paths {
                description
                  "Maximum number of paths";
                leaf limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  description
                    "Maximum number of paths";
                }
    
                choice log_type {
                  leaf threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 100";
                      }
                    }
                    description
                      "Percentage of limit at which to start generating warnings";
                  }
                  leaf log-only {
                    type empty;
                    description
                      "Generate warning messages only";
                  }
                }  // choice log_type
    
                leaf log-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "5 .. 86400";
                    }
                  }
                  units "seconds";
                  description
                    "Minimum interval between log messages";
                }
              }  // container maximum-paths
            }  // choice maximum-paths-type
    
            container maximum-prefixes {
              description
                "Maximum number of prefixes";
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Maximum number of prefixes";
              }
    
              choice log_type {
                leaf threshold {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of limit at which to start generating warnings";
                }
                leaf log-only {
                  type empty;
                  description
                    "Generate warning messages only";
                }
              }  // choice log_type
    
              leaf log-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "5 .. 86400";
                  }
                }
                units "seconds";
                description
                  "Minimum interval between log messages";
              }
            }  // container maximum-prefixes
    
            container multipath {
              presence "enable multipath";
              description
                "Protocol-independent load balancing";
              uses apply-advanced;
    
              container vpn-unequal-cost {
                presence
                  "enable vpn-unequal-cost";
                description
                  "Include VPN routes with unequal IGP metrics";
                leaf equal-external-internal {
                  type empty;
                  description
                    "Include external and internal VPN routes";
                }
              }  // container vpn-unequal-cost
    
              leaf as-path-compare {
                type empty;
                description
                  "Compare AS path sequences in addition to AS path length";
              }
    
              leaf preserve-nexthop-hierarchy {
                type empty;
                description
                  "Force multipath to create List nexthop";
              }
            }  // container multipath
    
            container policy-multipath {
              description
                "Policy based multipath";
              uses apply-advanced;
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy to create policy based multipath";
              }
    
              container traceoptions {
                description "Trace options";
                uses apply-advanced;
    
                container file {
                  description
                    "Trace file options";
                  leaf filename {
                    type string {
                      junos:posix-pattern "![/ %]";
                      junos:pattern-message "Must not contain '/', % or a space";
                      length "1 .. 1024";
                    }
                    description
                      "Name of file in which to write trace information";
                  }
    
                  leaf replace {
                    type empty;
                    status deprecated;
                    description
                      "Replace trace file rather than appending to it";
                  }
    
                  leaf size {
                    type string;
                    description
                      "Maximum trace file size";
                  }
    
                  leaf files {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "2 .. 1000";
                      }
                    }
                    default "10";
                    description
                      "Maximum number of trace files";
                  }
    
                  leaf no-stamp {
                    type empty;
                    status deprecated;
                    description
                      "Do not timestamp trace file";
                  }
    
                  choice world-readable-choice {
                    leaf world-readable {
                      type empty;
                      description
                        "Allow any user to read the log file";
                    }
                    leaf no-world-readable {
                      type empty;
                      description
                        "Don't allow any user to read the log file";
                    }
                  }  // choice world-readable-choice
                }  // container file
    
                list flag {
                  key "name";
                  ordered-by user;
                  description
                    "Tracing parameters";
                  leaf name {
                    type enumeration {
                      enum "route" {
                        value 0;
                        description
                          "Policy-multipath route tracing.";
                      }
                    }
                  }
    
                  leaf send {
                    type empty;
                    description
                      "Trace transmitted packets";
                  }
    
                  leaf receive {
                    type empty;
                    description
                      "Trace received packets";
                  }
    
                  leaf detail {
                    type empty;
                    description
                      "Trace detailed information";
                  }
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this trace flag";
                  }
                }  // list flag
              }  // container traceoptions
            }  // container policy-multipath
    
            container protect {
              description
                "Protocol-independent protection";
              leaf core {
                type empty;
                description
                  "Protect against unreachability to service-edge router";
              }
            }  // container protect
    
            container access {
              description "Access routes";
              uses apply-advanced;
    
              list route {
                key "name";
                ordered-by user;
                description "Access route";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP address of destination";
                }
    
                uses apply-advanced;
    
                leaf-list next-hop {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  ordered-by user;
                  description
                    "Next hop to destination";
                }
    
                list qualified-next-hop {
                  key "name";
                  ordered-by user;
                  description
                    "Next hop with qualifiers";
                  uses qualified_nh_obj;
                }  // list qualified-next-hop
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description "Metric value";
                }
    
                leaf preference {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Preference value";
                }
    
                leaf tag {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Tag string";
                }
    
                leaf tag2 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Tag2 string";
                }
              }  // list route
            }  // container access
    
            container access-internal {
              description
                "Access-internal routes";
              uses apply-advanced;
    
              list route {
                key "name";
                ordered-by user;
                description
                  "Access-internal route";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP address and optional prefix length of destination";
                }
    
                uses apply-advanced;
    
                leaf-list next-hop {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  ordered-by user;
                  description
                    "Next hop to destination";
                }
    
                list qualified-next-hop {
                  key "name";
                  ordered-by user;
                  description
                    "Next hop with qualifiers";
                  uses qualified_nh_obj;
                }  // list qualified-next-hop
              }  // list route
            }  // container access-internal
    
            container bgp-static {
              description
                "Routes for BGP static advertisements";
              uses apply-advanced;
    
              list route {
                key "name";
                ordered-by user;
                description "BGP-static route";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP address and optional prefix length of destination";
                }
    
                uses apply-advanced;
    
                container metric {
                  presence "enable metric";
                  description "Metric value";
                  uses rib_static_metric_type;
                }  // container metric
    
                container metric2 {
                  presence "enable metric2";
                  description "Metric value 2";
                  uses rib_static_metric_type;
                }  // container metric2
    
                container metric3 {
                  presence "enable metric3";
                  description "Metric value 3";
                  uses rib_static_metric_type;
                }  // container metric3
    
                container metric4 {
                  presence "enable metric4";
                  description "Metric value 4";
                  uses rib_static_metric_type;
                }  // container metric4
    
                container tag {
                  presence "enable tag";
                  description "Tag string";
                  uses rib_static_metric_type;
                }  // container tag
    
                container tag2 {
                  presence "enable tag2";
                  description "Tag string 2";
                  uses rib_static_metric_type;
                }  // container tag2
    
                container preference {
                  presence "enable preference";
                  description "Preference value";
                  uses rib_static_metric_type;
                }  // container preference
    
                container preference2 {
                  presence "enable preference2";
                  description
                    "Preference value 2";
                  uses rib_static_metric_type;
                }  // container preference2
    
                container color {
                  presence "enable color";
                  description
                    "Color (preference) value";
                  uses rib_static_metric_type;
                }  // container color
    
                container color2 {
                  presence "enable color2";
                  description
                    "Color (preference) value 2";
                  uses rib_static_metric_type;
                }  // container color2
    
                leaf-list community {
                  type jt:community;
                  ordered-by user;
                  description
                    "BGP community identifier";
                }
    
                container as-path {
                  description
                    "Autonomous system path";
                  uses apply-advanced;
    
                  leaf path {
                    type string;
                    description
                      "Autonomous system path";
                  }
    
                  leaf origin {
                    type enumeration {
                      enum "igp" {
                        value 0;
                        description
                          "Path originated in the local IGP";
                      }
                      enum "egp" {
                        value 1;
                        description
                          "Path originated in another AS";
                      }
                      enum "incomplete" {
                        value 2;
                        description
                          "Path was learned by some other means";
                      }
                    }
                  }
    
                  leaf atomic-aggregate {
                    type empty;
                    description
                      "Add ATOMIC_AGGREGATE path attribute to route";
                  }
    
                  container aggregator {
                    presence "enable aggregator";
                    description
                      "Add AGGREGATOR path attribute to route";
                  }  // container aggregator
    
                  leaf as-number {
                    type string {
                      junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                      junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                    }
                    description
                      " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                  }
    
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Address of BGP system that formed the route";
                  }
                }  // container as-path
              }  // list route
            }  // container bgp-static
    
            container flow {
              description
                "Locally defined flow routing information";
              uses apply-advanced;
    
              container validation {
                presence "enable validation";
                description
                  "Flow route validation options";
                uses flow-validation;
              }  // container validation
    
              list route {
                key "name";
                ordered-by user;
                description "Flow route";
                uses flow-route-inet6;
              }  // list route
    
              container interface-group {
                description
                  "Interface-group for applying flow-spec filter";
                uses flow-interface-group;
              }  // container interface-group
    
              leaf discard-action-for-unresolved-redir-addr {
                type empty;
                description
                  "For action redirect IP if redirect address is unresolved install discard action filter";
              }
    
              choice per-route-accounting-choice {
                leaf per-route-accounting {
                  type empty;
                  description
                    "Enable traffic accounting per flowspec route";
                }
                leaf no-per-route-accounting {
                  type empty;
                  description
                    "Don't enable traffic accounting per flowspec route";
                }
              }  // choice per-route-accounting-choice
            }  // container flow
    
            container label {
              presence "enable label";
              description "Label processing";
              uses apply-advanced;
    
              leaf-list allocation {
                junos:must "(".. .. .. instance-type vrf")";
                junos:must-message "'allocation' policy is valid only for 'instance-type vrf'";
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Label allocation policy";
              }
    
              leaf-list substitution {
                junos:must "(".. .. .. instance-type vrf")";
                junos:must-message "'substitution' policy is valid only for 'instance-type vrf'";
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Label substitution policy";
              }
            }  // container label
          }  // list rib
    
          container label {
            presence "enable label";
            description "Label processing";
            uses apply-advanced;
    
            leaf-list allocation {
              junos:must "(".. .. .. instance-type vrf")";
              junos:must-message "'allocation' policy is valid only for 'instance-type vrf'";
              type jt:policy-algebra;
              ordered-by user;
              description
                "Label allocation policy";
            }
    
            leaf-list substitution {
              junos:must "(".. .. .. instance-type vrf")";
              junos:must-message "'substitution' policy is valid only for 'instance-type vrf'";
              type jt:policy-algebra;
              ordered-by user;
              description
                "Label substitution policy";
            }
          }  // container label
    
          container options {
            description "Miscellaneous options";
            uses apply-advanced;
    
            leaf no-send {
              type empty;
              status deprecated;
              description
                "Listen only; do not send protocol packets";
            }
    
            leaf no-resolve {
              type empty;
              status deprecated;
              description
                "Do not use DNS name resolution";
            }
    
            container syslog {
              description
                "Set system logging level";
              uses apply-advanced;
    
              container level {
                description "Logging level";
                leaf emergency {
                  type empty;
                  description "Emergency level";
                }
    
                leaf alert {
                  type empty;
                  description "Alert level";
                }
    
                leaf critical {
                  type empty;
                  description "Critical level";
                }
    
                leaf error {
                  type empty;
                  description "Error level";
                }
    
                leaf warning {
                  type empty;
                  description "Warning level";
                }
    
                leaf notice {
                  type empty;
                  description "Notice level";
                }
    
                leaf info {
                  type empty;
                  description
                    "Informational level";
                }
    
                leaf debug {
                  type empty;
                  description "Debugging level";
                }
              }  // container level
    
              leaf upto {
                type enumeration {
                  enum "emergency" {
                    value 0;
                    description
                      "Emergency level";
                  }
                  enum "alert" {
                    value 1;
                    description "Alert level";
                  }
                  enum "critical" {
                    value 2;
                    description "Critical level";
                  }
                  enum "error" {
                    value 3;
                    description "Error level";
                  }
                  enum "warning" {
                    value 4;
                    description "Warning level";
                  }
                  enum "notice" {
                    value 5;
                    description "Notice level";
                  }
                  enum "info" {
                    value 6;
                    description
                      "Informational level";
                  }
                  enum "debug" {
                    value 7;
                    description
                      "Debugging level";
                  }
                }
                description
                  "Log up to a particular logging level";
              }
            }  // container syslog
    
            leaf mark {
              type union {
                type int32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              units "seconds";
              description
                "Periodically mark the trace file";
            }
          }  // container options
    
          container resolution {
            presence "enable resolution";
            description
              "Route next-hop resolution options";
            uses apply-advanced;
    
            leaf-list tracefilter {
              type jt:policy-algebra;
              ordered-by user;
              description "Filter policy";
            }
    
            container traceoptions {
              description "Trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "event" {
                      value 0;
                      description
                        "Event processing";
                    }
                    enum "flash" {
                      value 1;
                      description
                        "Flash processing";
                    }
                    enum "kernel" {
                      value 2;
                      description
                        "Kernel communication";
                    }
                    enum "indirect" {
                      value 3;
                      description
                        "Indirect next-hop addition, change, or deletion";
                    }
                    enum "task" {
                      value 4;
                      description
                        "Task or job processing";
                    }
                    enum "igp-frr" {
                      value 5;
                      description
                        "IGP triggered FRR events";
                    }
                    enum "igp-frr-extensive" {
                      value 6;
                      description
                        "IGP triggered FRR Extensive events";
                    }
                    enum "tunnel" {
                      value 7;
                      description
                        "Resolver dynamic tunnel events";
                    }
                    enum "all" {
                      value 8;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            choice preserve-nexthop-hierarchy-choice {
              leaf preserve-nexthop-hierarchy {
                type empty;
                description
                  "Preserve nexthop hierarchy when installing nexthop to forwarding plane";
              }
              leaf no-preserve-nexthop-hierarchy {
                type empty;
                description
                  "Don't preserve nexthop hierarchy when installing nexthop to forwarding plane";
              }
            }  // choice preserve-nexthop-hierarchy-choice
    
            list rib {
              key "name";
              ordered-by user;
              description
                "Routing table resolution options";
              leaf name {
                type string;
                description "Routing table name";
              }
    
              uses apply-advanced;
    
              leaf-list resolution-family {
                type string;
                ordered-by user;
                description
                  "Family of resultion tree";
              }
    
              leaf-list resolution-ribs {
                type string;
                ordered-by user;
                description
                  "Routing tables to use for default routing table family resolution";
              }
    
              leaf-list inet-resolution-ribs {
                type string;
                ordered-by user;
                description
                  "Routing tables to use for ipv4 family protocol-next-hop resolution";
              }
    
              leaf-list inet6-resolution-ribs {
                type string;
                ordered-by user;
                description
                  "Routing tables to use for ipv6 family protocol-next-hop resolution";
              }
    
              leaf-list iso-resolution-ribs {
                type string;
                ordered-by user;
                description
                  "Routing tables to use for iso family protocol-next-hop resolution";
              }
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description "Import policy";
              }
    
              leaf-list inet-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for IPV4 family resolution tree";
              }
    
              leaf-list inet6-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for IPV6 family resolution tree";
              }
    
              leaf-list iso-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for ISO family resolution tree";
              }
    
              leaf-list inetcolor-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for INETCOLOR family resolution tree";
              }
    
              leaf-list inet6color-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for INET6COLOR family resolution tree";
              }
            }  // list rib
    
            choice prefer-recursive-primary-path-choice {
              leaf prefer-recursive-primary-path {
                type empty;
                description
                  "Prefer primary path to resolve nexthop during recursive-resolution";
              }
              leaf no-prefer-recursive-primary-path {
                type empty;
                description
                  "Don't prefer primary path to resolve nexthop during recursive-resolution";
              }
            }  // choice prefer-recursive-primary-path-choice
    
            list scheme {
              key "name";
              ordered-by user;
              description
                "Nexthop resolution fallback";
              leaf name {
                type string;
                description
                  "Name the resolution scheme";
              }
    
              uses apply-advanced;
    
              leaf-list resolution-ribs {
                junos:must "(!(".. transport-classes"))";
                junos:must-message "resolution-ribs and transport-classes are mutually exclusive options";
                type string;
                ordered-by user;
                description
                  "Routing tables to use for nexthop resolution, in fallback order";
              }
    
              leaf mapping-community {
                type jt:community;
                description
                  "Community on service-route that maps to this transport";
              }
            }  // list scheme
          }  // container resolution
    
          container interface-routes {
            description
              "Define routing table groups for interface routes";
            uses apply-advanced;
    
            container rib-group {
              description "Routing table group";
              uses rib_group_type;
            }  // container rib-group
    
            list family {
              key "name";
              ordered-by user;
              description "Address family";
              leaf name {
                type enumeration {
                  enum "inet" {
                    value 0;
                    description "IPv4 family";
                  }
                  enum "inet6" {
                    value 1;
                    description "IPv6 family";
                  }
                }
              }
    
              uses apply-advanced;
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description "Import policy";
              }
    
              container export {
                description
                  "Control exportability of local routes";
                uses apply-advanced;
    
                leaf point-to-point {
                  type empty;
                  description
                    "Make point-to-point routes exportable";
                }
    
                leaf lan {
                  type empty;
                  description
                    "Make LAN routes exportable";
                }
              }  // container export
            }  // list family
          }  // container interface-routes
    
          leaf loopback-strict-disable {
            type empty;
            description
              "Completely disable lo0 host prefix when in admin-down state";
          }
    
          container traceoptions {
            description
              "Global routing protocol trace options";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "parse" {
                    value 0;
                    description
                      "Trace configuration parsing";
                  }
                  enum "regex-parse" {
                    value 1;
                    description
                      "Trace regular-expression parsing";
                  }
                  enum "config-internal" {
                    value 2;
                    description
                      "Trace configuration internals";
                  }
                  enum "nsr-synchronization" {
                    value 3;
                    description
                      "Trace nonstop routing synchronization events";
                  }
                  enum "condition-manager" {
                    value 4;
                    description
                      "Trace condition manager events";
                  }
                  enum "graceful-restart" {
                    value 5;
                    description
                      "Trace Graceful Restart events";
                  }
                  enum "session" {
                    value 6;
                    description
                      "Trace Session ID allocations/deallocations";
                  }
                  enum "hfrr-fsm" {
                    value 7;
                    description
                      "Host FRR FSM events tracing";
                  }
                  enum "hfrr-route" {
                    value 8;
                    description
                      "Host FRR route events tracing";
                  }
                  enum "statistics-id-group" {
                    value 9;
                    description
                      "Trace Statistics ID Group operations";
                  }
                  enum "route-record" {
                    value 10;
                    description
                      "Trace route-record server-side events";
                  }
                  enum "jvision-lsp" {
                    value 11;
                    description
                      "Trace Jvision events and errors";
                  }
                  enum "dyn-nh-template" {
                    value 12;
                    description
                      "Dynamic nexthops template events tracing";
                  }
                  enum "read-route" {
                    value 13;
                    description
                      "Read route events tracing";
                  }
                  enum "route" {
                    value 14;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 15;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 16;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 17;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 18;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 19;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 20;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 21;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          container topologies {
            junos:must "(!("routing-options no-multi-topology-routing"))";
            junos:must-message "Multi topology routing is disabled";
            description
              "Define routing topologies";
            uses apply-advanced;
    
            list family {
              key "name";
              ordered-by user;
              description "Address family";
              leaf name {
                type enumeration {
                  enum "inet" {
                    value 0;
                    description "IPv4 family";
                  }
                  enum "inet6" {
                    value 1;
                    description "IPv6 family";
                  }
                }
              }
    
              uses apply-advanced;
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology information";
                leaf name {
                  type string {
                    junos:posix-pattern "!^((.*:.*)|(.{129,}))$";
                    junos:pattern-message "Must be a non-reserved string of 128 characters or less";
                  }
                  description "Topology name";
                }
    
                uses apply-advanced;
              }  // list topology
            }  // list family
          }  // container topologies
    
          leaf router-id {
            type jt:ipv4addr;
            description "Router identifier";
          }
    
          container autonomous-system {
            description
              "Autonomous system number";
            leaf as-number {
              type string {
                junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
              }
              description
                " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
            }
    
            leaf loops {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 10";
                }
              }
              description
                "Maximum number of times this AS can be in an AS path";
            }
    
            leaf asdot-notation {
              type empty;
              description
                "Use AS-Dot notation to display true 4 byte AS numbers";
            }
    
            container independent-domain {
              presence
                "enable independent-domain";
              description
                "Independent autonomous-system domain from master instance";
              container no-attrset {
                presence "enable no-attrset";
                description
                  "Do not tunnel ce bgp attributes across provider network";
              }  // container no-attrset
            }  // container independent-domain
          }  // container autonomous-system
    
          container confederation {
            description
              "Confederation autonomous system number";
            leaf confederation-as {
              type string {
                junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
              }
              description
                " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
            }
    
            leaf-list members {
              type string;
              ordered-by user;
              description
                " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
            }
          }  // container confederation
    
          leaf ipv6-router-id {
            type string;
            description "IPv6 router identifier";
          }
    
          container graceful-restart {
            junos:must "(!("routing-options nonstop-routing"))";
            junos:must-message "Graceful restart and Nonstop routing may not be enabled simultaneously";
            presence "enable graceful-restart";
            description
              "Graceful or hitless routing restart options";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "120 .. 10000";
                }
              }
              description
                "Maximum time for which router is in graceful restart";
            }
          }  // container graceful-restart
    
          container flow {
            description
              "Locally defined flow routing information";
            uses apply-advanced;
    
            leaf firewall-install-disable {
              type empty;
              description
                "Disable installing flowspec firewall filters in dfwd ";
            }
    
            choice per-route-accounting-choice {
              leaf per-route-accounting {
                type empty;
                description
                  "Enable traffic accounting per flowspec route";
              }
              leaf no-per-route-accounting {
                type empty;
                description
                  "Don't enable traffic accounting per flowspec route";
              }
            }  // choice per-route-accounting-choice
    
            container validation {
              presence "enable validation";
              description
                "Flow route validation options";
              uses flow-validation;
            }  // container validation
    
            container interface-group {
              description
                "Interface-group for applying flow-spec filter";
              uses flow-interface-group;
            }  // container interface-group
    
            list route {
              key "name";
              ordered-by user;
              description "Flow route";
              uses flow-route-inet;
            }  // list route
    
            leaf term-order {
              type enumeration {
                enum "legacy" {
                  value 0;
                  description
                    "Legacy term order (default)";
                }
                enum "standard" {
                  value 1;
                  description
                    "RFC compliant term order";
                }
              }
              description
                "Term evaluation order for flow routes";
            }
    
            leaf discard-action-for-unresolved-redir-addr {
              type empty;
              description
                "For action redirect IP if redirect address is unresolved install discard action filter";
            }
          }  // container flow
    
          leaf no-soft-core {
            type empty;
            description
              "Disable soft assert to generate core and just log the event";
          }
    
          leaf med-igp-update-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 600";
              }
            }
            description
              "Delay (in minutes) in updating MED IGP for bgp groups with 'delay-med-update' ";
          }
    
          container bmp {
            presence "enable bmp";
            description
              "BGP Monitoring Protocol (BMP) configuration";
            uses apply-advanced;
    
            leaf authentication-key {
              type string {
                length "1 .. 126";
              }
              description
                "MD5 authentication key";
            }
    
            leaf authentication-algorithm {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "md5" {
                  value 0;
                  description "Message Digest 5";
                }
                enum "hmac-sha-1-96" {
                  value 1;
                  description
                    "Hash-based Message Authentication Code (SHA1) (96 bits)";
                }
                enum "aes-128-cmac-96" {
                  value 2;
                  description
                    "Cipher-based Message Authentication Code (AES128) (96 bits)";
                }
                enum "ao" {
                  value 3;
                  description
                    "TCP Authentication Option";
                }
              }
              default "hmac-sha-1-96";
              description
                "Authentication algorithm name";
            }
    
            leaf tcpao-handling-with-digest-mismatch {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "drop-if-no-tcpao" {
                  value 0;
                  description
                    "Drop the connection if Digest mismatched";
                }
                enum "allow-without-tcpao" {
                  value 1;
                  description
                    "Allow the connection establishment without TCP-AO";
                }
              }
              description
                "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
            }
    
            leaf authentication-key-chain {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              junos:must "("security authentication-key-chains key-chain $$")";
              junos:must-message "Referenced key-chain must be defined";
              type string {
                length "1 .. 128";
              }
              description "Key chain name";
            }
    
            container hold-down {
              presence "enable hold-down";
              leaf hold-down-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "30 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Prevent re-establishment for this time";
              }
    
              leaf flaps {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 10";
                  }
                }
                description
                  "Number of flaps before damping";
              }
    
              leaf period {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "30 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Time period for flaps";
              }
            }  // container hold-down
    
            leaf initiation-message {
              type string {
                length "1 .. 255";
              }
              description
                "User string sent with the initiation message";
            }
    
            leaf local-address {
              type jt:ipaddr;
              description
                "Address of local end of BMP session";
            }
    
            leaf local-port {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1024 .. 65535";
                }
              }
              description
                "Local port for listening";
            }
    
            leaf connection-mode {
              type enumeration {
                enum "active" {
                  value 0;
                  description
                    "Initiate the connection";
                }
                enum "passive" {
                  value 1;
                  description
                    "Listen for the connection";
                }
              }
              description
                "Specify active or passive";
            }
    
            leaf priority {
              type enumeration {
                enum "low" {
                  value 0;
                  description "Lowest priority";
                }
                enum "medium" {
                  value 1;
                  description "Medium priority";
                }
                enum "high" {
                  value 2;
                  description "Highest priority";
                }
              }
              description
                "Relative dispatch priority";
            }
    
            leaf monitor {
              type enumeration {
                enum "enable" {
                  value 0;
                  description
                    "Enable monitoring of BGP peer(s)";
                }
                enum "disable" {
                  value 1;
                  description
                    "Disable monitoring of BGP peer(s)";
                }
              }
              description
                "Enable/Disable monitoring";
            }
    
            container route-monitoring {
              description
                "Control route monitoring settings";
              uses apply-advanced;
    
              leaf none {
                junos:must "((!(".. pre-policy") && (!(".. post-policy") && (!(".. rib-out") && !(".. loc-rib")))))";
                junos:must-message "May not be configured with pre-policy or post-policy or rib-out or loc-rib";
                type empty;
                description
                  "Do not send route monitoring messages";
              }
    
              leaf loc-rib {
                junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                junos:must-message "Update threading can't be configured alone with bmp loc-rib monitoring";
                type empty;
                description
                  "Send local-rib route monitoring messages";
              }
    
              container pre-policy {
                presence "enable pre-policy";
                description
                  "Send pre policy route monitoring messages";
                leaf exclude-non-feasible {
                  type empty;
                  description
                    "Exclude looped routes, etc";
                }
              }  // container pre-policy
    
              container post-policy {
                presence "enable post-policy";
                description
                  "Send post policy route monitoring messages";
                leaf exclude-non-eligible {
                  type empty;
                  description
                    "Exclude unresolved routes, etc.";
                }
              }  // container post-policy
    
              container rib-out {
                junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                junos:must-message "Update threading can't be configured alone with bmp rib-out monitoring";
                presence "enable rib-out";
                description
                  "Send adj-ribs-out route monitoring messages";
                leaf pre-policy {
                  type empty;
                  description
                    "Send pre-policy adj-ribs-out route monitoring messages";
                }
    
                leaf post-policy {
                  type empty;
                  description
                    "Send post-policy adj-ribs-out route monitoring messages";
                }
              }  // container rib-out
            }  // container route-monitoring
    
            leaf max-loc-rib-buffer-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 50";
                }
              }
              description
                "Max number of loc-rib outstanding buffers before blocking";
            }
    
            leaf station-address {
              type jt:ipaddr;
              description
                "Address/name of monitoring station";
            }
    
            leaf routing-instance {
              type string;
              description
                "Routing-instance through which BMP station is reachable";
            }
    
            leaf station-port {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Port of monitoring station";
            }
    
            leaf statistics-timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "Statistics message timer, 15-65535, or 0 for no messages";
            }
    
            container traceoptions {
              description "Trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description
                  "Trace flag information";
                leaf name {
                  type enumeration {
                    enum "packets" {
                      value 0;
                      description
                        "Trace all messages";
                    }
                    enum "up" {
                      value 1;
                      description
                        "Trace up messages";
                    }
                    enum "down" {
                      value 2;
                      description
                        "Trace down messages";
                    }
                    enum "statistics" {
                      value 3;
                      description
                        "Trace statistics messages";
                    }
                    enum "route-monitoring" {
                      value 4;
                      description
                        "Trace route monitoring messages";
                    }
                    enum "event" {
                      value 5;
                      description
                        "Trace major events, station establishment, errors, events";
                    }
                    enum "error" {
                      value 6;
                      description
                        "Trace error conditions";
                    }
                    enum "write" {
                      value 7;
                      description
                        "Trace writing of messages";
                    }
                    enum "route" {
                      value 8;
                      description
                        "Trace routing information";
                    }
                    enum "normal" {
                      value 9;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 10;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 11;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 12;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 13;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 14;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 15;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            list station {
              key "name";
              description "Define a BMP station";
              leaf name {
                type string;
                description "Station name";
              }
    
              uses apply-advanced;
    
              leaf authentication-key {
                type string {
                  length "1 .. 126";
                }
                description
                  "MD5 authentication key";
              }
    
              leaf authentication-algorithm {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "md5" {
                    value 0;
                    description
                      "Message Digest 5";
                  }
                  enum "hmac-sha-1-96" {
                    value 1;
                    description
                      "Hash-based Message Authentication Code (SHA1) (96 bits)";
                  }
                  enum "aes-128-cmac-96" {
                    value 2;
                    description
                      "Cipher-based Message Authentication Code (AES128) (96 bits)";
                  }
                  enum "ao" {
                    value 3;
                    description
                      "TCP Authentication Option";
                  }
                }
                description
                  "Authentication algorithm name";
              }
    
              leaf tcpao-handling-with-digest-mismatch {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "drop-if-no-tcpao" {
                    value 0;
                    description
                      "Drop the connection if Digest mismatched";
                  }
                  enum "allow-without-tcpao" {
                    value 1;
                    description
                      "Allow the connection establishment without TCP-AO";
                  }
                }
                description
                  "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
              }
    
              leaf authentication-key-chain {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string {
                  length "1 .. 128";
                }
                description "Key chain name";
              }
    
              container hold-down {
                presence "enable hold-down";
                leaf hold-down-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "30 .. 65535";
                    }
                  }
                  units "seconds";
                  description
                    "Prevent re-establishment for this time";
                }
    
                leaf flaps {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 10";
                    }
                  }
                  description
                    "Number of flaps before damping";
                }
    
                leaf period {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "30 .. 65535";
                    }
                  }
                  units "seconds";
                  description
                    "Time period for flaps";
                }
              }  // container hold-down
    
              leaf initiation-message {
                type string {
                  length "1 .. 255";
                }
                description
                  "User string sent with the initiation message";
              }
    
              leaf local-address {
                type jt:ipaddr;
                description
                  "Address of local end of BMP session";
              }
    
              leaf local-port {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1024 .. 65535";
                  }
                }
                description
                  "Local port for listening";
              }
    
              leaf connection-mode {
                type enumeration {
                  enum "active" {
                    value 0;
                    description
                      "Initiate the connection";
                  }
                  enum "passive" {
                    value 1;
                    description
                      "Listen for the connection";
                  }
                }
                description
                  "Specify active or passive";
              }
    
              leaf priority {
                type enumeration {
                  enum "low" {
                    value 0;
                    description
                      "Lowest priority";
                  }
                  enum "medium" {
                    value 1;
                    description
                      "Medium priority";
                  }
                  enum "high" {
                    value 2;
                    description
                      "Highest priority";
                  }
                }
                description
                  "Relative dispatch priority";
              }
    
              leaf monitor {
                type enumeration {
                  enum "enable" {
                    value 0;
                    description
                      "Enable monitoring of BGP peer(s)";
                  }
                  enum "disable" {
                    value 1;
                    description
                      "Disable monitoring of BGP peer(s)";
                  }
                }
                description
                  "Enable/Disable monitoring";
              }
    
              container route-monitoring {
                description
                  "Control route monitoring settings";
                uses apply-advanced;
    
                leaf none {
                  junos:must "((!(".. pre-policy") && (!(".. post-policy") && (!(".. rib-out") && !(".. loc-rib")))))";
                  junos:must-message "May not be configured with pre-policy or post-policy or rib-out or loc-rib";
                  type empty;
                  description
                    "Do not send route monitoring messages";
                }
    
                leaf loc-rib {
                  junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                  junos:must-message "Update threading can't be configured alone with bmp loc-rib monitoring";
                  type empty;
                  description
                    "Send local-rib route monitoring messages";
                }
    
                container pre-policy {
                  presence "enable pre-policy";
                  description
                    "Send pre policy route monitoring messages";
                  leaf exclude-non-feasible {
                    type empty;
                    description
                      "Exclude looped routes, etc";
                  }
                }  // container pre-policy
    
                container post-policy {
                  presence "enable post-policy";
                  description
                    "Send post policy route monitoring messages";
                  leaf exclude-non-eligible {
                    type empty;
                    description
                      "Exclude unresolved routes, etc.";
                  }
                }  // container post-policy
    
                container rib-out {
                  junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                  junos:must-message "Update threading can't be configured alone with bmp rib-out monitoring";
                  presence "enable rib-out";
                  description
                    "Send adj-ribs-out route monitoring messages";
                  leaf pre-policy {
                    type empty;
                    description
                      "Send pre-policy adj-ribs-out route monitoring messages";
                  }
    
                  leaf post-policy {
                    type empty;
                    description
                      "Send post-policy adj-ribs-out route monitoring messages";
                  }
                }  // container rib-out
              }  // container route-monitoring
    
              leaf max-loc-rib-buffer-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 50";
                  }
                }
                description
                  "Max number of loc-rib outstanding buffers before blocking";
              }
    
              leaf station-address {
                type jt:ipaddr;
                description
                  "Address/name of monitoring station";
              }
    
              leaf routing-instance {
                type string;
                description
                  "Routing-instance through which BMP station is reachable";
              }
    
              leaf station-port {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Port of monitoring station";
              }
    
              leaf statistics-timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Statistics message timer, 15-65535, or 0 for no messages";
              }
    
              container traceoptions {
                description "Trace options";
                uses apply-advanced;
    
                container file {
                  description
                    "Trace file options";
                  leaf filename {
                    type string {
                      junos:posix-pattern "![/ %]";
                      junos:pattern-message "Must not contain '/', % or a space";
                      length "1 .. 1024";
                    }
                    description
                      "Name of file in which to write trace information";
                  }
    
                  leaf replace {
                    type empty;
                    status deprecated;
                    description
                      "Replace trace file rather than appending to it";
                  }
    
                  leaf size {
                    type string;
                    description
                      "Maximum trace file size";
                  }
    
                  leaf files {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "2 .. 1000";
                      }
                    }
                    default "10";
                    description
                      "Maximum number of trace files";
                  }
    
                  leaf no-stamp {
                    type empty;
                    status deprecated;
                    description
                      "Do not timestamp trace file";
                  }
    
                  choice world-readable-choice {
                    leaf world-readable {
                      type empty;
                      description
                        "Allow any user to read the log file";
                    }
                    leaf no-world-readable {
                      type empty;
                      description
                        "Don't allow any user to read the log file";
                    }
                  }  // choice world-readable-choice
                }  // container file
    
                list flag {
                  key "name";
                  ordered-by user;
                  description
                    "Trace flag information";
                  leaf name {
                    type enumeration {
                      enum "packets" {
                        value 0;
                        description
                          "Trace all messages";
                      }
                      enum "up" {
                        value 1;
                        description
                          "Trace up messages";
                      }
                      enum "down" {
                        value 2;
                        description
                          "Trace down messages";
                      }
                      enum "statistics" {
                        value 3;
                        description
                          "Trace statistics messages";
                      }
                      enum "route-monitoring" {
                        value 4;
                        description
                          "Trace route monitoring messages";
                      }
                      enum "event" {
                        value 5;
                        description
                          "Trace major events, station establishment, errors, events";
                      }
                      enum "error" {
                        value 6;
                        description
                          "Trace error conditions";
                      }
                      enum "write" {
                        value 7;
                        description
                          "Trace writing of messages";
                      }
                      enum "route" {
                        value 8;
                        description
                          "Trace routing information";
                      }
                      enum "normal" {
                        value 9;
                        description
                          "Trace normal events";
                      }
                      enum "general" {
                        value 10;
                        description
                          "Trace general events";
                      }
                      enum "state" {
                        value 11;
                        description
                          "Trace state transitions";
                      }
                      enum "policy" {
                        value 12;
                        description
                          "Trace policy processing";
                      }
                      enum "task" {
                        value 13;
                        description
                          "Trace routing protocol task processing";
                      }
                      enum "timer" {
                        value 14;
                        description
                          "Trace routing protocol timer processing";
                      }
                      enum "all" {
                        value 15;
                        description
                          "Trace everything";
                      }
                    }
                  }
    
                  leaf send {
                    type empty;
                    description
                      "Trace transmitted packets";
                  }
    
                  leaf receive {
                    type empty;
                    description
                      "Trace received packets";
                  }
    
                  leaf detail {
                    type empty;
                    description
                      "Trace detailed information";
                  }
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this trace flag";
                  }
                }  // list flag
              }  // container traceoptions
            }  // list station
          }  // container bmp
    
          leaf bgp-orf-cisco-mode {
            type empty;
            description
              "Using BGP ORF capability code 130 and Prefix ORF type 128";
          }
    
          leaf highwatermark-log-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "5 .. 1200";
              }
            }
            units "seconds";
            description
              "High watermark log interval (default 30 seconds)";
          }
    
          leaf time-averaged-watermark-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 15";
              }
            }
            units "days";
            description
              "For calculating average watermark";
          }
    
          container ppm {
            presence "enable ppm";
            description
              "Set periodic packet management properties";
            uses apply-advanced;
    
            leaf delegate-processing {
              type empty;
              status deprecated;
              description
                "Enable distribution of PPM sessions";
            }
    
            leaf no-delegate-processing {
              type empty;
              description
                "Disable PPM sessions distribution";
            }
    
            leaf redistribution-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 120";
                }
              }
              description
                "Time to wait after switchover before starting timers";
            }
          }  // container ppm
    
          leaf no-bfd-triggered-local-repair {
            type empty;
            description
              "Disable bfd triggered local repair";
          }
    
          leaf maximum-ecmp {
            type enumeration {
              enum "16" {
                value 0;
                description
                  "Maximum 16 ECMP routes";
              }
              enum "32" {
                value 1;
                description
                  "Maximum 32 ECMP routes";
              }
              enum "64" {
                value 2;
                description
                  "Maximum 64 ECMP routes";
              }
              enum "96" {
                value 3;
                description
                  "Maximum 96 ECMP routes";
              }
              enum "128" {
                value 4;
                description
                  "Maximum 128 ECMP routes";
              }
              enum "160" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 5;
                description
                  "Maximum 160 ECMP routes";
              }
              enum "192" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 6;
                description
                  "Maximum 192 ECMP routes";
              }
              enum "224" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 7;
                description
                  "Maximum 224 ECMP routes";
              }
              enum "256" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 8;
                description
                  "Maximum 256 ECMP routes";
              }
              enum "288" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 9;
                description
                  "Maximum 288 ECMP routes";
              }
              enum "320" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 10;
                description
                  "Maximum 320 ECMP routes";
              }
              enum "352" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 11;
                description
                  "Maximum 352 ECMP routes";
              }
              enum "384" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 12;
                description
                  "Maximum 384 ECMP routes";
              }
              enum "416" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 13;
                description
                  "Maximum 416 ECMP routes";
              }
              enum "448" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 14;
                description
                  "Maximum 448 ECMP routes";
              }
              enum "480" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 15;
                description
                  "Maximum 480 ECMP routes";
              }
              enum "512" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 16;
                description
                  "Maximum 512 ECMP routes";
              }
            }
            description
              "Maximum ECMP limit for nexthops";
          }
    
          container static {
            description "Static routes";
            uses apply-advanced;
    
            leaf rib-group {
              type string;
              description "Routing table group";
            }
    
            container defaults {
              description "Global route options";
              uses apply-advanced;
    
              choice retain-choice {
                leaf retain {
                  junos:must "(!(".. resolve"))";
                  junos:must-message "Must not specify resolve with retain";
                  type empty;
                  description
                    "Always keep route in forwarding table";
                }
                leaf no-retain {
                  junos:must "(!(".. resolve"))";
                  junos:must-message "Must not specify resolve with retain";
                  type empty;
                  description
                    "Don't always keep route in forwarding table";
                }
              }  // choice retain-choice
    
              choice install-choice {
                leaf install {
                  type empty;
                  description
                    "Install route into forwarding table";
                }
                leaf no-install {
                  type empty;
                  description
                    "Don't install route into forwarding table";
                }
              }  // choice install-choice
    
              choice readvertise-choice {
                leaf readvertise {
                  type empty;
                  description
                    "Mark route as eligible to be readvertised";
                }
                leaf no-readvertise {
                  type empty;
                  description
                    "Don't mark route as eligible to be readvertised";
                }
              }  // choice readvertise-choice
    
              choice resolve-choice {
                leaf resolve {
                  type empty;
                  description
                    "Allow resolution of indirectly connected next hops";
                }
                leaf no-resolve {
                  type empty;
                  description
                    "Don't allow resolution of indirectly connected next hops";
                }
              }  // choice resolve-choice
    
              choice longest-match-choice {
                leaf longest-match {
                  junos:must "(".. resolve")";
                  junos:must-message "Requires resolve to be configured";
                  type empty;
                  description
                    "Always use longest prefix match to resolve next hops";
                }
                leaf no-longest-match {
                  junos:must "(".. resolve")";
                  junos:must-message "Requires resolve to be configured";
                  type empty;
                  description
                    "Don't always use longest prefix match to resolve next hops";
                }
              }  // choice longest-match-choice
    
              choice passive_flag {
                leaf active {
                  type empty;
                  description
                    "Remove inactive route from forwarding table";
                }
                leaf passive {
                  type empty;
                  description
                    "Retain inactive route in forwarding table";
                }
              }  // choice passive_flag
    
              container metric {
                presence "enable metric";
                description "Metric value";
                uses rib_static_metric_type;
              }  // container metric
    
              container metric2 {
                presence "enable metric2";
                description "Metric value 2";
                uses rib_static_metric_type;
              }  // container metric2
    
              container metric3 {
                presence "enable metric3";
                description "Metric value 3";
                uses rib_static_metric_type;
              }  // container metric3
    
              container metric4 {
                presence "enable metric4";
                description "Metric value 4";
                uses rib_static_metric_type;
              }  // container metric4
    
              container tag {
                presence "enable tag";
                description "Tag string";
                uses rib_static_metric_type;
              }  // container tag
    
              container tag2 {
                presence "enable tag2";
                description "Tag string 2";
                uses rib_static_metric_type;
              }  // container tag2
    
              container preference {
                presence "enable preference";
                description "Preference value";
                uses rib_static_metric_type;
              }  // container preference
    
              container preference2 {
                presence "enable preference2";
                description "Preference value 2";
                uses rib_static_metric_type;
              }  // container preference2
    
              container color {
                presence "enable color";
                description
                  "Color (preference) value";
                uses rib_static_metric_type;
              }  // container color
    
              container color2 {
                presence "enable color2";
                description
                  "Color (preference) value 2";
                uses rib_static_metric_type;
              }  // container color2
    
              leaf-list community {
                type jt:community;
                ordered-by user;
                description
                  "BGP community identifier";
              }
    
              container as-path {
                description
                  "Autonomous system path";
                uses apply-advanced;
    
                leaf path {
                  type string;
                  description
                    "Autonomous system path";
                }
    
                leaf origin {
                  type enumeration {
                    enum "igp" {
                      value 0;
                      description
                        "Path originated in the local IGP";
                    }
                    enum "egp" {
                      value 1;
                      description
                        "Path originated in another AS";
                    }
                    enum "incomplete" {
                      value 2;
                      description
                        "Path was learned by some other means";
                    }
                  }
                }
    
                leaf atomic-aggregate {
                  type empty;
                  description
                    "Add ATOMIC_AGGREGATE path attribute to route";
                }
    
                container aggregator {
                  presence "enable aggregator";
                  description
                    "Add AGGREGATOR path attribute to route";
                }  // container aggregator
    
                leaf as-number {
                  type string {
                    junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                    junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                  }
                  description
                    " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                }
    
                leaf address {
                  type jt:ipv4addr;
                  description
                    "Address of BGP system that formed the route";
                }
              }  // container as-path
            }  // container defaults
    
            list route {
              key "name";
              ordered-by user;
              description "Static route";
              leaf name {
                type jt:ipprefix;
              }
    
              uses apply-advanced;
    
              choice next_hop {
                leaf-list next-hop {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  ordered-by user;
                  description
                    "Next hop to destination";
                }
                leaf reject {
                  type empty;
                  description
                    "Drop packets to destination; send ICMP unreachables";
                }
                leaf discard {
                  type empty;
                  description
                    "Drop packets to destination; send no ICMP unreachables";
                }
                leaf receive {
                  type empty;
                  description
                    "Install a receive route for the destination";
                }
                leaf next-table {
                  type string {
                    junos:posix-pattern "^(((.{0,128})[:](.{1,128})[.]|((.{1,128})[.]))?([a-z]|[0-9]|[-_])+[.]((1?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5])))$";
                    junos:pattern-message "Must match the format [<instance-name>[:<topology-name>].]<family-name>.<rib-id>";
                  }
                  description
                    "Next hop to another table";
                }
              }  // choice next_hop
    
              list qualified-next-hop {
                key "name";
                ordered-by user;
                description
                  "Next hop with qualifiers";
                uses qualified_nh_obj;
              }  // list qualified-next-hop
    
              leaf backup-pe-group {
                junos:must "(".. p2mp-lsp-next-hop")";
                junos:must-message "Backup groups only allowed for static routes with p2mp lsp next-hop";
                type string;
                description
                  "Multicast source redundancy group";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
    
                leaf neighbor {
                  type jt:ipaddr;
                  description
                    "BFD neighbor address";
                }
    
                leaf local-address {
                  type jt:ipaddr;
                  description
                    "BFD local address (for multihop only)";
                }
    
                leaf holddown-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to hold the session-UP notification to the client";
                }
    
                leaf minimum-receive-ttl {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Minimum receive TTL below which to drop";
                }
              }  // container bfd-liveness-detection
    
              choice retain-choice {
                leaf retain {
                  junos:must "(!(".. resolve"))";
                  junos:must-message "Must not specify resolve with retain";
                  type empty;
                  description
                    "Always keep route in forwarding table";
                }
                leaf no-retain {
                  junos:must "(!(".. resolve"))";
                  junos:must-message "Must not specify resolve with retain";
                  type empty;
                  description
                    "Don't always keep route in forwarding table";
                }
              }  // choice retain-choice
    
              choice install-choice {
                leaf install {
                  type empty;
                  description
                    "Install route into forwarding table";
                }
                leaf no-install {
                  type empty;
                  description
                    "Don't install route into forwarding table";
                }
              }  // choice install-choice
    
              choice readvertise-choice {
                leaf readvertise {
                  type empty;
                  description
                    "Mark route as eligible to be readvertised";
                }
                leaf no-readvertise {
                  type empty;
                  description
                    "Don't mark route as eligible to be readvertised";
                }
              }  // choice readvertise-choice
    
              choice resolve-choice {
                leaf resolve {
                  type empty;
                  description
                    "Allow resolution of indirectly connected next hops";
                }
                leaf no-resolve {
                  type empty;
                  description
                    "Don't allow resolution of indirectly connected next hops";
                }
              }  // choice resolve-choice
    
              choice longest-match-choice {
                leaf longest-match {
                  junos:must "(".. resolve")";
                  junos:must-message "Requires resolve to be configured";
                  type empty;
                  description
                    "Always use longest prefix match to resolve next hops";
                }
                leaf no-longest-match {
                  junos:must "(".. resolve")";
                  junos:must-message "Requires resolve to be configured";
                  type empty;
                  description
                    "Don't always use longest prefix match to resolve next hops";
                }
              }  // choice longest-match-choice
    
              choice passive_flag {
                leaf active {
                  type empty;
                  description
                    "Remove inactive route from forwarding table";
                }
                leaf passive {
                  type empty;
                  description
                    "Retain inactive route in forwarding table";
                }
              }  // choice passive_flag
    
              container metric {
                presence "enable metric";
                description "Metric value";
                uses rib_static_metric_type;
              }  // container metric
    
              container metric2 {
                presence "enable metric2";
                description "Metric value 2";
                uses rib_static_metric_type;
              }  // container metric2
    
              container metric3 {
                presence "enable metric3";
                description "Metric value 3";
                uses rib_static_metric_type;
              }  // container metric3
    
              container metric4 {
                presence "enable metric4";
                description "Metric value 4";
                uses rib_static_metric_type;
              }  // container metric4
    
              container tag {
                presence "enable tag";
                description "Tag string";
                uses rib_static_metric_type;
              }  // container tag
    
              container tag2 {
                presence "enable tag2";
                description "Tag string 2";
                uses rib_static_metric_type;
              }  // container tag2
    
              container preference {
                presence "enable preference";
                description "Preference value";
                uses rib_static_metric_type;
              }  // container preference
    
              container preference2 {
                presence "enable preference2";
                description "Preference value 2";
                uses rib_static_metric_type;
              }  // container preference2
    
              container color {
                presence "enable color";
                description
                  "Color (preference) value";
                uses rib_static_metric_type;
              }  // container color
    
              container color2 {
                presence "enable color2";
                description
                  "Color (preference) value 2";
                uses rib_static_metric_type;
              }  // container color2
    
              leaf-list community {
                type jt:community;
                ordered-by user;
                description
                  "BGP community identifier";
              }
    
              container as-path {
                description
                  "Autonomous system path";
                uses apply-advanced;
    
                leaf path {
                  type string;
                  description
                    "Autonomous system path";
                }
    
                leaf origin {
                  type enumeration {
                    enum "igp" {
                      value 0;
                      description
                        "Path originated in the local IGP";
                    }
                    enum "egp" {
                      value 1;
                      description
                        "Path originated in another AS";
                    }
                    enum "incomplete" {
                      value 2;
                      description
                        "Path was learned by some other means";
                    }
                  }
                }
    
                leaf atomic-aggregate {
                  type empty;
                  description
                    "Add ATOMIC_AGGREGATE path attribute to route";
                }
    
                container aggregator {
                  presence "enable aggregator";
                  description
                    "Add AGGREGATOR path attribute to route";
                }  // container aggregator
    
                leaf as-number {
                  type string {
                    junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                    junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                  }
                  description
                    " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                }
    
                leaf address {
                  type jt:ipv4addr;
                  description
                    "Address of BGP system that formed the route";
                }
              }  // container as-path
    
              list lsp-next-hop {
                key "name";
                ordered-by user;
                description "LSP next hop";
                uses lsp_nh_obj;
              }  // list lsp-next-hop
    
              list p2mp-lsp-next-hop {
                key "name";
                max-elements 1;
                ordered-by user;
                description
                  "Point-to-multipoint LSP next hop";
                uses lsp_nh_obj;
              }  // list p2mp-lsp-next-hop
    
              container spring-te-lsp-next-hop {
                junos:must "("protocols source-packet-routing tunnel-tracking")";
                junos:must-message "Please enable the tunnel-tracking  under 'protocols source-packet-routing' hierarchy";
                description
                  "SPRING-TE LSP next hop";
                uses springte_lsp_nh_obj;
              }  // container spring-te-lsp-next-hop
    
              container p2mp-ldp-next-hop {
                description
                  "Point-to-multipoint LDP LSP next hop";
                uses p2mp_ldp_lsp_nh_obj;
              }  // container p2mp-ldp-next-hop
    
              list static-lsp-next-hop {
                key "name";
                ordered-by user;
                description
                  "Static LSP next hop";
                uses lsp_nh_obj;
              }  // list static-lsp-next-hop
            }  // list route
    
            container static-route {
              description "Static route Status";
              leaf bfd-admin-down {
                type enumeration {
                  enum "active" {
                    value 0;
                    description
                      "Static route will be inactive on bfd-admin-down";
                  }
                  enum "passive" {
                    value 1;
                    description
                      "Static route will remain active on bfd-admin-down";
                  }
                }
                description
                  "Static route State on BFD ADMIN DOWN";
              }
            }  // container static-route
    
            list route-target-filter {
              key "name";
              ordered-by user;
              description
                "Route-target-filter route";
              leaf name {
                type string {
                  junos:posix-pattern "^[0-9.]{1,15}L?:[0-9]{1,10}/([0-9]|[2-5][0-9]|6[0-4])$";
                  junos:pattern-message "Use format 'x:y/len' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. 123456L:100 and len is a prefix length from 0 to 64";
                  length "1 .. 47";
                }
              }
    
              uses apply-advanced;
    
              leaf-list neighbor {
                type jt:ipaddr-scoped;
                ordered-by user;
                description
                  "BGP peers for filter";
              }
    
              leaf-list group {
                type string;
                ordered-by user;
                description
                  "BGP groups for filter";
              }
    
              leaf local {
                type empty;
                description
                  "Locally originated filter";
              }
            }  // list route-target-filter
          }  // container static
    
          list martians {
            key "address choice-ident choice-value";
            ordered-by user;
            description "Invalid routes";
            uses martian_type;
          }  // list martians
    
          container aggregate {
            description "Coalesced routes";
            uses rib_aggregate_type;
          }  // container aggregate
    
          container generate {
            description "Route of last resort";
            uses rib_aggregate_type;
          }  // container generate
    
          choice maximum-paths-type {
            container maximum-routes {
              status deprecated;
              description
                "Maximum number of routes";
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Maximum number of routes";
              }
    
              choice log_type {
                leaf threshold {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of limit at which to start generating warnings";
                }
                leaf log-only {
                  type empty;
                  description
                    "Generate warning messages only";
                }
              }  // choice log_type
    
              leaf log-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "5 .. 86400";
                  }
                }
                units "seconds";
                description
                  "Minimum interval between log messages";
              }
            }  // container maximum-routes
            container maximum-paths {
              description
                "Maximum number of paths";
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Maximum number of paths";
              }
    
              choice log_type {
                leaf threshold {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of limit at which to start generating warnings";
                }
                leaf log-only {
                  type empty;
                  description
                    "Generate warning messages only";
                }
              }  // choice log_type
    
              leaf log-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "5 .. 86400";
                  }
                }
                units "seconds";
                description
                  "Minimum interval between log messages";
              }
            }  // container maximum-paths
          }  // choice maximum-paths-type
    
          container maximum-prefixes {
            description
              "Maximum number of prefixes";
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 4294967295";
                }
              }
              description
                "Maximum number of prefixes";
            }
    
            choice log_type {
              leaf threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                description
                  "Percentage of limit at which to start generating warnings";
              }
              leaf log-only {
                type empty;
                description
                  "Generate warning messages only";
              }
            }  // choice log_type
    
            leaf log-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "5 .. 86400";
                }
              }
              units "seconds";
              description
                "Minimum interval between log messages";
            }
          }  // container maximum-prefixes
    
          container multipath {
            presence "enable multipath";
            description
              "Protocol-independent load balancing";
            uses apply-advanced;
    
            container vpn-unequal-cost {
              presence "enable vpn-unequal-cost";
              description
                "Include VPN routes with unequal IGP metrics";
              leaf equal-external-internal {
                type empty;
                description
                  "Include external and internal VPN routes";
              }
            }  // container vpn-unequal-cost
    
            leaf as-path-compare {
              type empty;
              description
                "Compare AS path sequences in addition to AS path length";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Force multipath to create List nexthop";
            }
          }  // container multipath
    
          container policy-multipath {
            description "Policy based multipath";
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy to create policy based multipath";
            }
    
            container traceoptions {
              description "Trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "route" {
                      value 0;
                      description
                        "Policy-multipath route tracing.";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
          }  // container policy-multipath
    
          container protect {
            description
              "Protocol-independent protection";
            leaf core {
              type empty;
              description
                "Protect against unreachability to service-edge router";
            }
          }  // container protect
    
          container access {
            description "Access routes";
            uses apply-advanced;
    
            list route {
              key "name";
              ordered-by user;
              description "Access route";
              leaf name {
                type jt:ipprefix;
                description
                  "IP address of destination";
              }
    
              uses apply-advanced;
    
              leaf-list next-hop {
                type union {
                  type jt:ipaddr-or-interface;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                ordered-by user;
                description
                  "Next hop to destination";
              }
    
              list qualified-next-hop {
                key "name";
                ordered-by user;
                description
                  "Next hop with qualifiers";
                uses qualified_nh_obj;
              }  // list qualified-next-hop
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description "Metric value";
              }
    
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value";
              }
    
              leaf tag {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Tag string";
              }
    
              leaf tag2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Tag2 string";
              }
            }  // list route
          }  // container access
    
          container access-internal {
            description "Access-internal routes";
            uses apply-advanced;
    
            list route {
              key "name";
              ordered-by user;
              description
                "Access-internal route";
              leaf name {
                type jt:ipprefix;
                description
                  "IP address and optional prefix length of destination";
              }
    
              uses apply-advanced;
    
              leaf-list next-hop {
                type union {
                  type jt:ipaddr-or-interface;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                ordered-by user;
                description
                  "Next hop to destination";
              }
    
              list qualified-next-hop {
                key "name";
                ordered-by user;
                description
                  "Next hop with qualifiers";
                uses qualified_nh_obj;
              }  // list qualified-next-hop
            }  // list route
          }  // container access-internal
    
          container bgp-static {
            description
              "Routes for BGP static advertisements";
            uses apply-advanced;
    
            list route {
              key "name";
              ordered-by user;
              description "BGP-static route";
              leaf name {
                type jt:ipprefix;
                description
                  "IP address and optional prefix length of destination";
              }
    
              uses apply-advanced;
    
              container metric {
                presence "enable metric";
                description "Metric value";
                uses rib_static_metric_type;
              }  // container metric
    
              container metric2 {
                presence "enable metric2";
                description "Metric value 2";
                uses rib_static_metric_type;
              }  // container metric2
    
              container metric3 {
                presence "enable metric3";
                description "Metric value 3";
                uses rib_static_metric_type;
              }  // container metric3
    
              container metric4 {
                presence "enable metric4";
                description "Metric value 4";
                uses rib_static_metric_type;
              }  // container metric4
    
              container tag {
                presence "enable tag";
                description "Tag string";
                uses rib_static_metric_type;
              }  // container tag
    
              container tag2 {
                presence "enable tag2";
                description "Tag string 2";
                uses rib_static_metric_type;
              }  // container tag2
    
              container preference {
                presence "enable preference";
                description "Preference value";
                uses rib_static_metric_type;
              }  // container preference
    
              container preference2 {
                presence "enable preference2";
                description "Preference value 2";
                uses rib_static_metric_type;
              }  // container preference2
    
              container color {
                presence "enable color";
                description
                  "Color (preference) value";
                uses rib_static_metric_type;
              }  // container color
    
              container color2 {
                presence "enable color2";
                description
                  "Color (preference) value 2";
                uses rib_static_metric_type;
              }  // container color2
    
              leaf-list community {
                type jt:community;
                ordered-by user;
                description
                  "BGP community identifier";
              }
    
              container as-path {
                description
                  "Autonomous system path";
                uses apply-advanced;
    
                leaf path {
                  type string;
                  description
                    "Autonomous system path";
                }
    
                leaf origin {
                  type enumeration {
                    enum "igp" {
                      value 0;
                      description
                        "Path originated in the local IGP";
                    }
                    enum "egp" {
                      value 1;
                      description
                        "Path originated in another AS";
                    }
                    enum "incomplete" {
                      value 2;
                      description
                        "Path was learned by some other means";
                    }
                  }
                }
    
                leaf atomic-aggregate {
                  type empty;
                  description
                    "Add ATOMIC_AGGREGATE path attribute to route";
                }
    
                container aggregator {
                  presence "enable aggregator";
                  description
                    "Add AGGREGATOR path attribute to route";
                }  // container aggregator
    
                leaf as-number {
                  type string {
                    junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                    junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                  }
                  description
                    " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                }
    
                leaf address {
                  type jt:ipv4addr;
                  description
                    "Address of BGP system that formed the route";
                }
              }  // container as-path
            }  // list route
          }  // container bgp-static
    
          list rib-groups {
            key "name";
            ordered-by user;
            description
              "Group of routing tables";
            uses rpd_rib_group_type;
          }  // list rib-groups
    
          leaf route-record {
            type empty;
            description "Enable route recording";
          }
    
          leaf-list instance-import {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Import policy for instance RIBs";
          }
    
          leaf-list instance-export {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Export policy for instance RIBs";
          }
    
          container auto-export {
            presence "enable auto-export";
            description
              "Export routes between routing instances";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable auto-export";
              }
            }  // choice enable-disable
    
            container traceoptions {
              description "Trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "export" {
                      value 0;
                      description
                        "Export processing";
                    }
                    enum "route" {
                      value 1;
                      description
                        "Trace routing information";
                    }
                    enum "normal" {
                      value 2;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 3;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 4;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 5;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 6;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 7;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 8;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            container family {
              container inet {
                description "IPv4 parameters";
                uses export-af-obj;
              }  // container inet
    
              container inet6 {
                description "IPv6 parameters";
                uses export-af-obj;
              }  // container inet6
    
              container iso {
                description "ISO parameters";
                uses export-af-obj;
              }  // container iso
            }  // container family
          }  // container auto-export
    
          container transport-class {
            junos:must "("routing-options route-distinguisher-id")";
            junos:must-message "transport classes use auto-rd. Please configure route-distinguisher-id";
            presence "enable transport-class";
            description
              "Transport layer options";
            uses apply-advanced;
    
            leaf auto-create {
              type empty;
              description
                "Auto create on color discovery";
            }
    
            list name {
              key "name";
              ordered-by user;
              description
                "Transport layer collecting Tunnels with similar characteristics";
              leaf name {
                type string;
                description
                  "Transport class name";
              }
    
              uses apply-advanced;
    
              leaf color {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Color(0..4294967295). This auto derives the Mapping Community and Route Target";
              }
            }  // list name
          }  // container transport-class
    
          container dynamic-tunnels {
            description
              "Dynamic tunnel definitions";
            uses apply-advanced;
    
            list tunnel-attributes {
              key "name";
              ordered-by user;
              description
                "Dynamic tunnel attributes definition";
              leaf name {
                type string {
                  junos:posix-pattern "![^a-zA-Z0-9_-]|(^(all|.{64,})$)";
                  junos:pattern-message "Tunnel attribute name is a string consisting of up to 63 letters, numbers, dashes, and underscores";
                }
                description
                  "Dynamic Tunnel attribute name";
              }
    
              uses apply-advanced;
    
              leaf dynamic-tunnel-source-prefix {
                junos:must "(".. dynamic-tunnel-type V4oV6")";
                junos:must-message "Tunnel source address, only valid for V4oV6 tunnel type";
                type jt:ipaddr;
                description
                  "Tunnel source address";
              }
    
              leaf dynamic-tunnel-type {
                type enumeration {
                  enum "GRE" {
                    value 0;
                    description
                      "Tunnel type GRE";
                  }
                  enum "V4oV6" {
                    value 1;
                    description
                      "Tunnel type is IPV4oIPV6";
                  }
                  enum "UDP" {
                    value 2;
                    description
                      "Tunnel type UDP";
                  }
                  enum "BGP-SIGNAL" {
                    value 3;
                    description
                      "Tunnel type BGP-SIGNAL";
                  }
                }
              }
    
              leaf dynamic-tunnel-mtu {
                junos:must "(".. dynamic-tunnel-type V4oV6")";
                junos:must-message "Only supported for tunnel type V4oV6";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "296 .. 9232";
                  }
                }
                description
                  "Dynamic Tunnel MTU value";
              }
    
              leaf dynamic-tunnel-anchor-pfe {
                type string {
                  junos:posix-pattern "^(pfe-)[1-9]?[0-9]/[1-9]?[0-9]/[1-9]?[0-9]$";
                  junos:pattern-message "Must be a PFE interface of form pfe-x/y/z";
                }
                description
                  "Dynamic Tunnel anchor PFE name of format pfe-x/y/z";
              }
    
              leaf dynamic-tunnel-anti-spoof {
                junos:must "(".. dynamic-tunnel-type V4oV6")";
                junos:must-message "Only supported for tunnel type V4oV6";
                type enumeration {
                  enum "on" {
                    value 0;
                    description
                      "Enable antispoofing check. Default is enabled";
                  }
                  enum "off" {
                    value 1;
                    description
                      "Disable antispoofing check";
                  }
                }
              }
    
              leaf dynamic-tunnel-reassembly {
                junos:must "(".. dynamic-tunnel-type V4oV6")";
                junos:must-message "Only supported for tunnel type V4oV6";
                type enumeration {
                  enum "on" {
                    value 0;
                    description
                      "Enable reassembly check. Default is disabled";
                  }
                  enum "off" {
                    value 1;
                    description
                      "Disable reassembly check";
                  }
                }
              }
            }  // list tunnel-attributes
    
            list forwarding-rib {
              key "name";
              ordered-by user;
              description
                "Forwarding routing table for dynamic-tunnel";
              leaf name {
                type string;
                description "Routing table name";
              }
    
              uses apply-advanced;
    
              leaf-list inet-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for V4 dynamic-tunnel";
              }
            }  // list forwarding-rib
    
            container statistics {
              description
                "Fetch traffic statistics for  dynamic tunnels";
              uses apply-advanced;
    
              leaf interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Time after which statistics has to be fetched";
              }
            }  // container statistics
    
            container traceoptions {
              description "Trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "kernel" {
                      value 0;
                      description
                        "Trace kernel communication";
                    }
                    enum "tunnel" {
                      value 1;
                      description
                        "Trace tunnel addition, change, or deletion";
                    }
                    enum "task" {
                      value 2;
                      description
                        "Trace task or job processing";
                    }
                    enum "tunnel-event" {
                      value 3;
                      description
                        "Trace create, delete, up, down event for nh based tunnel";
                    }
                    enum "flash-event" {
                      value 4;
                      description
                        "Trace flash event for tunnel forwarding route";
                    }
                    enum "stats-job" {
                      value 5;
                      description
                        "Trace taffic statistics job related stuff";
                    }
                    enum "all" {
                      value 6;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            leaf gre {
              type enumeration {
                enum "next-hop-based-tunnel" {
                  value 0;
                  description
                    "Enable nh base dynamic-tunnel";
                }
              }
              description
                "Enable dynamic gre tunnel mode";
            }
    
            list dynamic-tunnel {
              key "name";
              ordered-by user;
              uses dynamic_tunnel_type;
            }  // list dynamic-tunnel
          }  // container dynamic-tunnels
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Direct/Host route FRR protection";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf arp-prefix-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 10000";
                }
              }
              description
                "Max ARP/Host FRR routes allowed";
            }
    
            leaf supplementary-blackout-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 15";
                }
              }
              description
                "ARP plimit blackout timer = kernel ARP timeout + supplementary-blackout-timer minutes.";
            }
    
            choice protection-type {
              leaf link-protection {
                type empty;
                description
                  "Protect interface from link faults only";
              }
            }  // choice protection-type
          }  // list interface
    
          container host-fast-reroute {
            presence "enable host-fast-reroute";
            description
              "Host Fast Re-route global values. Applies to all host FRR profiles.";
            uses apply-advanced;
    
            leaf global-arp-prefix-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 10000";
                }
              }
              description
                "Max ARP/Host FRR routes allowed per protected IFL";
            }
    
            leaf global-supplementary-blackout-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 15";
                }
              }
              description
                "ARP plimit global blackout timer = kernel ARP timeout + global-supplementary-blackout-timer minutes.";
            }
          }  // container host-fast-reroute
    
          leaf warm-standby {
            junos:must "(!("routing-options nonstop-routing"))";
            junos:must-message "Warm standby and Nonstop routing cannot be enabled simultaneously";
            type empty;
            description "Enable warm-standby";
          }
    
          leaf nonstop-routing {
            type empty;
            description "Enable nonstop routing";
          }
    
          container nonstop-routing-options {
            presence
              "enable nonstop-routing-options";
            description
              "Nonstop routing options";
            uses apply-advanced;
    
            leaf precision-timers-max-period {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 1800";
                }
              }
              description
                "Set Max period for precision timer support from kernel after switchover";
            }
          }  // container nonstop-routing-options
    
          leaf nsr-phantom-holdtime {
            junos:must "("routing-options nonstop-routing")";
            junos:must-message "Nonstop routing must be enabled";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 10000";
              }
            }
            description
              "Set NSR phantom route hold time";
          }
    
          list srlg {
            key "name";
            ordered-by user;
            description "SRLG configuration";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description "Group name";
            }
    
            uses apply-advanced;
    
            leaf srlg-value {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 4294967295";
                }
              }
              description "Group id";
            }
    
            leaf srlg-cost {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description "Cost value";
            }
          }  // list srlg
    
          container admin-groups-extended-range {
            description
              "Extended administrative groups range";
            uses apply-advanced;
    
            leaf minimum {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "32 .. 4294967295";
                }
              }
              description
                "Minimum value of the range for extended administrative groups";
            }
    
            leaf maximum {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "32 .. 4294967295";
                }
              }
              description
                "Maximum value of the range for extended administrative groups";
            }
          }  // container admin-groups-extended-range
    
          list admin-groups-extended {
            junos:must "(".. admin-groups-extended-range")";
            junos:must-message "admin-groups-extended-range must be configured with admin-groups-extended";
            key "name";
            ordered-by user;
            description
              "Extended administrative groups";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description
                "Group name (Maximum length 64)";
            }
    
            uses apply-advanced;
    
            leaf group-value {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "32 .. 4294967295";
                }
              }
              description "Group id";
            }
          }  // list admin-groups-extended
    
          container source-routing {
            description "Source-routing options";
            uses apply-advanced;
    
            leaf ip {
              type empty;
              description
                "Enable IP Source Routing";
            }
    
            leaf ipv6 {
              type empty;
              description
                "Enable Type 0 RouteHeader processing";
            }
          }  // container source-routing
    
          container forwarding-table {
            uses forwarding-table-type;
          }  // container forwarding-table
    
          container fate-sharing {
            description
              "Fate-sharing links or nodes database";
            uses apply-advanced;
    
            list group {
              key "name";
              ordered-by user;
              description
                "Group of objects sharing common characteristics";
              leaf name {
                type string {
                  junos:posix-pattern "^.{1,32}$";
                  junos:pattern-message "Must be a string of <= 32 characters";
                }
                description
                  "Name of object groups sharing the same fate";
              }
    
              uses apply-advanced;
    
              leaf cost {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description "Cost value";
              }
    
              leaf use-for-post-convergence-lfa {
                type empty;
                description
                  "Use this fate-sharing group as a constraint for post-convergence-lfa";
              }
    
              list from {
                key "name";
                uses fate_sharing_links;
              }  // list from
            }  // list group
          }  // container fate-sharing
    
          container multicast {
            description
              "Global multicast options";
            uses apply-advanced;
    
            container traceoptions {
              description
                "Global multicast trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "parse" {
                      value 0;
                      description
                        "Trace configuration parsing";
                    }
                    enum "config-internal" {
                      value 1;
                      description
                        "Trace configuration internals";
                    }
                    enum "route" {
                      value 2;
                      description
                        "Trace routing information";
                    }
                    enum "normal" {
                      value 3;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 4;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 5;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 6;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 7;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 8;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 9;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            leaf rpf {
              type string;
              status deprecated;
            }
    
            list scope {
              key "name";
              ordered-by user;
              description
                "Multicast address scope";
              leaf name {
                type string;
                description
                  "Name to identify multicast address scope";
              }
    
              uses apply-advanced;
    
              leaf prefix {
                type jt:ipprefix;
                description
                  "Administratively scoped address";
              }
    
              leaf-list interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                ordered-by user;
                description
                  "Interface on which to configure scoping";
              }
            }  // list scope
    
            leaf-list scope-policy {
              type jt:policy-algebra;
              ordered-by user;
              description "Scoping policy";
            }
    
            list flow-map {
              key "name";
              ordered-by user;
              description
                "Multicast flow map configuration";
              leaf name {
                type string;
                description
                  "Name of the flow map";
              }
    
              uses apply-advanced;
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Policy for matched flows";
              }
    
              container bandwidth {
                presence "enable bandwidth";
                description
                  "Bandwidth properties for matched flows";
                leaf bandwidth-value {
                  type string;
                  units "bps";
                  description
                    "Static or default bandwidth for the matched flows";
                }
    
                leaf adaptive {
                  type empty;
                  description
                    "Auto-sense bandwidth for matched flows";
                }
              }  // container bandwidth
    
              leaf-list redundant-sources {
                junos:must "(".. bandwidth adaptive")";
                junos:must-message "redundant-sources can only be configured together with 'bandwidth adaptive'";
                type jt:ipaddr;
                ordered-by user;
                description
                  "Redundant source addresses";
              }
    
              container forwarding-cache {
                description
                  "Forwarding cache properties for matched flows";
                uses apply-advanced;
    
                container timeout {
                  description
                    "Timeout properties for matched flows";
                  choice timeout_choice {
                    leaf timeout-value {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 720";
                        }
                      }
                      units "minutes";
                      description
                        "Timeout for forwarding cache entry";
                    }
                    container never {
                      presence "enable never";
                      description
                        "Forwarding cache entries never time out";
                      uses apply-advanced;
    
                      leaf non-discard-entry-only {
                        type empty;
                        description
                          "Apply only to non-discard entries";
                      }
                    }  // container never
                  }  // choice timeout_choice
                }  // container timeout
              }  // container forwarding-cache
            }  // list flow-map
    
            leaf-list resolve-filter {
              type jt:policy-algebra;
              ordered-by user;
              status deprecated;
              description
                "Multicast resolve policy filter";
            }
    
            leaf-list ssm-groups {
              type jt:ipprefix;
              ordered-by user;
              description
                "Source-specific multicast group ranges";
            }
    
            leaf cont-stats-collection-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "60 .. 3600";
                }
              }
              default "300";
              description
                "IGMP/MLD continuous statistics collection interval";
            }
    
            leaf asm-override-ssm {
              type empty;
              description
                "Allow ASM state for SSM group ranges";
            }
    
            leaf-list rpf-check-policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Disable RPF check for a source group pair";
            }
    
            container pim-to-igmp-proxy {
              description "PIM-to-IGMP proxy";
              uses apply-advanced;
    
              leaf-list upstream-interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                max-elements 2;
                ordered-by user;
                description
                  "Upstream interface list";
              }
            }  // container pim-to-igmp-proxy
    
            container pim-to-mld-proxy {
              description "PIM-to-MLD proxy";
              uses apply-advanced;
    
              leaf-list upstream-interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                max-elements 2;
                ordered-by user;
                description
                  "Upstream interface list";
              }
            }  // container pim-to-mld-proxy
    
            container forwarding-cache {
              description
                "Multicast forwarding cache";
              uses apply-advanced;
    
              leaf allow-maximum {
                type empty;
                description
                  "Allow maximum of global and family level threshold values for suppress and reuse";
              }
    
              list family {
                junos:must "((!(".. threshold") || ".. allow-maximum"))";
                junos:must-message "Family threshold cannot be configured if global threshold is already configured";
                key "name";
                ordered-by user;
                description "Protocol family";
                leaf name {
                  type enumeration {
                    enum "inet" {
                      value 0;
                      description "IPv4 family";
                    }
                    enum "inet6" {
                      value 1;
                      description "IPv6 family";
                    }
                  }
                  description "Protocol family";
                }
    
                uses apply-advanced;
    
                container threshold {
                  presence "enable threshold";
                  description
                    "Multicast forwarding cache suppress threshold";
                  uses apply-advanced;
    
                  leaf suppress {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 200000";
                      }
                    }
                    description
                      "Suppress threshold";
                  }
    
                  leaf reuse {
                    junos:must "(".. suppress")";
                    junos:must-message "To configure reuse, suppress must be configured";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 200000";
                      }
                    }
                    description
                      "Reuse threshold";
                  }
    
                  leaf mvpn-rpt-suppress {
                    junos:must "(".. suppress")";
                    junos:must-message "To configure mvpn-rpt-suppress, suppress must be configured";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 200000";
                      }
                    }
                    description
                      "MVPN RP tree entry suppress threshold";
                  }
    
                  leaf mvpn-rpt-reuse {
                    junos:must "(".. mvpn-rpt-suppress")";
                    junos:must-message "To configure mvpn-rpt-reuse, mvpn-rpt-suppress must be configured";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 200000";
                      }
                    }
                    description
                      "MVPN RP tree entry reuse threshold";
                  }
    
                  leaf log-warning {
                    junos:must "(".. suppress")";
                    junos:must-message "To configure log-warning, suppress must be configured";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 100";
                      }
                    }
                    description
                      "Percentage at which to start generating warnings";
                  }
                }  // container threshold
              }  // list family
    
              container threshold {
                junos:must "((!(".. family") || ".. allow-maximum"))";
                junos:must-message "Global threshold cannot be configured if family threshold is configured";
                description "Threshold";
                uses apply-advanced;
    
                leaf suppress {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 200000";
                    }
                  }
                  description
                    "Suppress threshold";
                }
    
                leaf reuse {
                  junos:must "(".. suppress")";
                  junos:must-message "To configure reuse, suppress must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 200000";
                    }
                  }
                  description "Reuse threshold";
                }
    
                leaf mvpn-rpt-suppress {
                  junos:must "(".. suppress")";
                  junos:must-message "To configure mvpn-rpt-suppress, suppress must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 200000";
                    }
                  }
                  description
                    "MVPN RP tree entry suppress threshold";
                }
    
                leaf mvpn-rpt-reuse {
                  junos:must "(".. mvpn-rpt-suppress")";
                  junos:must-message "To configure mvpn-rpt-reuse, mvpn-rpt-suppress must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 200000";
                    }
                  }
                  description
                    "MVPN RP tree entry reuse threshold";
                }
    
                leaf log-warning {
                  junos:must "(".. suppress")";
                  junos:must-message "To configure log-warning, suppress must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage at which to start generating warnings";
                }
              }  // container threshold
    
              leaf timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 720";
                  }
                }
                description
                  "Forwarding cache entry timeout in minutes";
              }
            }  // container forwarding-cache
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Multicast interface options";
              uses multicast_interface_options_type;
            }  // list interface
    
            list ssm-map {
              key "name";
              ordered-by user;
              description "SSM map definitions";
              leaf name {
                type string;
                description "SSM map name";
              }
    
              uses apply-advanced;
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Policy for matching group";
              }
    
              leaf-list source {
                type jt:ipaddr;
                ordered-by user;
                description
                  "One or more source addresses";
              }
            }  // list ssm-map
    
            list backup-pe-group {
              key "name";
              ordered-by user;
              description
                "Backup PE group definitions";
              leaf name {
                type string;
                description "PE group name";
              }
    
              uses apply-advanced;
    
              leaf-list backups {
                type jt:ipaddr;
                max-elements 8;
                ordered-by user;
                description
                  "One or more IP addresses";
              }
    
              leaf local-address {
                type jt:ipaddr;
                description
                  "Address to be used as local-address for this group";
              }
            }  // list backup-pe-group
    
            leaf omit-wildcard-address {
              type empty;
              description
                "Omit wildcard source/group fields in SPMSI AD NLRI";
            }
    
            leaf local-address {
              type jt:ipv4addr;
              description
                "Local address for PIM and MVPN sessions";
            }
          }  // container multicast
    
          container programmable-rpd {
            description
              "RPD Server module management options";
            uses programmable-rpd-type;
          }  // container programmable-rpd
    
          container validation {
            description
              "Define Route validation";
            uses apply-advanced;
    
            container traceoptions {
              description
                "Trace options for route validation";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "error" {
                      value 0;
                      description
                        "Trace errored packets";
                    }
                    enum "packets" {
                      value 1;
                      description
                        "Trace all I/O packets";
                    }
                    enum "keepalive" {
                      value 2;
                      description
                        "Trace keepalive packets";
                    }
                    enum "update" {
                      value 3;
                      description
                        "Trace update packets";
                    }
                    enum "nsr-synchronization" {
                      value 4;
                      description
                        "Trace NSR synchronization events";
                    }
                    enum "state" {
                      value 5;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 6;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 7;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 8;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "client" {
                      value 9;
                      description
                        "Trace route validation client events";
                    }
                    enum "all" {
                      value 10;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            leaf-list notification-rib {
              type string;
              ordered-by user;
              description
                "Define routing tables that get notified upon validation state change";
            }
    
            list group {
              key "name";
              description
                "Define a group of sessions";
              leaf name {
                type string;
                description "Group name";
              }
    
              uses apply-advanced;
    
              leaf authentication-key {
                type string {
                  length "1 .. 126";
                }
                description
                  "MD5 authentication key";
              }
    
              leaf authentication-algorithm {
                junos:must "(".. authentication-key-chain")";
                junos:must-message "May not be configured without authentication-key-chain";
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "md5" {
                    value 0;
                    description
                      "Message Digest 5";
                  }
                  enum "hmac-sha-1-96" {
                    value 1;
                    description
                      "Hash-based Message Authentication Code (SHA1) (96 bits)";
                  }
                  enum "aes-128-cmac-96" {
                    value 2;
                    description
                      "Cipher-based Message Authentication Code (AES128) (96 bits)";
                  }
                  enum "ao" {
                    value 3;
                    description
                      "TCP Authentication Option";
                  }
                }
                default "hmac-sha-1-96";
                description
                  "Authentication algorithm name";
              }
    
              leaf tcpao-handling-with-digest-mismatch {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "drop-if-no-tcpao" {
                    value 0;
                    description
                      "Drop the connection if Digest mismatched";
                  }
                  enum "allow-without-tcpao" {
                    value 1;
                    description
                      "Allow the connection establishment without TCP-AO";
                  }
                }
                description
                  "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
              }
    
              leaf authentication-key-chain {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string {
                  length "1 .. 128";
                }
                description "Key chain name";
              }
    
              leaf max-sessions {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 63";
                  }
                }
                description
                  "Maximum connected session in this group";
              }
    
              list session {
                key "name";
                description
                  "Configure a session";
                leaf name {
                  type jt:ipaddr;
                }
    
                uses apply-advanced;
    
                container traceoptions {
                  description
                    "Trace options for route validation";
                  uses apply-advanced;
    
                  container file {
                    description
                      "Trace file options";
                    leaf filename {
                      type string {
                        junos:posix-pattern "![/ %]";
                        junos:pattern-message "Must not contain '/', % or a space";
                        length "1 .. 1024";
                      }
                      description
                        "Name of file in which to write trace information";
                    }
    
                    leaf replace {
                      type empty;
                      status deprecated;
                      description
                        "Replace trace file rather than appending to it";
                    }
    
                    leaf size {
                      type string;
                      description
                        "Maximum trace file size";
                    }
    
                    leaf files {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "2 .. 1000";
                        }
                      }
                      default "10";
                      description
                        "Maximum number of trace files";
                    }
    
                    leaf no-stamp {
                      type empty;
                      status deprecated;
                      description
                        "Do not timestamp trace file";
                    }
    
                    choice world-readable-choice {
                      leaf world-readable {
                        type empty;
                        description
                          "Allow any user to read the log file";
                      }
                      leaf no-world-readable {
                        type empty;
                        description
                          "Don't allow any user to read the log file";
                      }
                    }  // choice world-readable-choice
                  }  // container file
    
                  list flag {
                    key "name";
                    ordered-by user;
                    description
                      "Tracing parameters";
                    leaf name {
                      type enumeration {
                        enum "error" {
                          value 0;
                          description
                            "Trace errored packets";
                        }
                        enum "packets" {
                          value 1;
                          description
                            "Trace all I/O packets";
                        }
                        enum "keepalive" {
                          value 2;
                          description
                            "Trace keepalive packets";
                        }
                        enum "update" {
                          value 3;
                          description
                            "Trace update packets";
                        }
                        enum "state" {
                          value 4;
                          description
                            "Trace state transitions";
                        }
                        enum "task" {
                          value 5;
                          description
                            "Trace routing protocol task processing";
                        }
                        enum "timer" {
                          value 6;
                          description
                            "Trace routing protocol timer processing";
                        }
                        enum "all" {
                          value 7;
                          description
                            "Trace everything";
                        }
                      }
                    }
    
                    leaf send {
                      type empty;
                      description
                        "Trace transmitted packets";
                    }
    
                    leaf receive {
                      type empty;
                      description
                        "Trace received packets";
                    }
    
                    leaf detail {
                      type empty;
                      description
                        "Trace detailed information";
                    }
    
                    leaf disable {
                      type empty;
                      description
                        "Disable this trace flag";
                    }
                  }  // list flag
                }  // container traceoptions
    
                leaf authentication-key {
                  type string {
                    length "1 .. 126";
                  }
                  description
                    "MD5 authentication key";
                }
    
                leaf authentication-algorithm {
                  junos:must "(".. authentication-key-chain")";
                  junos:must-message "May not be configured without authentication-key-chain";
                  junos:must "(!(".. authentication-key"))";
                  junos:must-message "May not be configured with authentication-key";
                  type enumeration {
                    enum "md5" {
                      value 0;
                      description
                        "Message Digest 5";
                    }
                    enum "hmac-sha-1-96" {
                      value 1;
                      description
                        "Hash-based Message Authentication Code (SHA1) (96 bits)";
                    }
                    enum "aes-128-cmac-96" {
                      value 2;
                      description
                        "Cipher-based Message Authentication Code (AES128) (96 bits)";
                    }
                    enum "ao" {
                      value 3;
                      description
                        "TCP Authentication Option";
                    }
                  }
                  default "hmac-sha-1-96";
                  description
                    "Authentication algorithm name";
                }
    
                leaf tcpao-handling-with-digest-mismatch {
                  junos:must "(!(".. authentication-key"))";
                  junos:must-message "May not be configured with authentication-key";
                  type enumeration {
                    enum "drop-if-no-tcpao" {
                      value 0;
                      description
                        "Drop the connection if Digest mismatched";
                    }
                    enum "allow-without-tcpao" {
                      value 1;
                      description
                        "Allow the connection establishment without TCP-AO";
                    }
                  }
                  description
                    "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
                }
    
                leaf authentication-key-chain {
                  junos:must "(!(".. authentication-key"))";
                  junos:must-message "May not be configured with authentication-key";
                  junos:must "("security authentication-key-chains key-chain $$")";
                  junos:must-message "Referenced key-chain must be defined";
                  type string {
                    length "1 .. 128";
                  }
                  description "Key chain name";
                }
    
                leaf refresh-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1800";
                    }
                  }
                  units "seconds";
                  description
                    "Interval between keepalive packet transmissions";
                }
    
                leaf hold-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "10 .. 3600";
                    }
                  }
                  units "seconds";
                  description
                    "Time after which the session is declared down.";
                }
    
                leaf record-lifetime {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "60 .. 604800";
                    }
                  }
                  units "seconds";
                  description
                    "Lifetime of route validation records";
                }
    
                leaf preference {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Preference for session establishment";
                }
    
                leaf port {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Portnumber to connect";
                }
    
                leaf local-address {
                  type jt:ipaddr;
                }
              }  // list session
            }  // list group
    
            container static {
              description
                "Define static route validation record";
              uses apply-advanced;
    
              list record {
                key "name";
                description
                  "Static route validation record";
                leaf name {
                  type jt:ipprefix;
                }
    
                uses apply-advanced;
    
                list maximum-length {
                  key "name";
                  ordered-by user;
                  leaf name {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 128";
                      }
                    }
                    description
                      "Maximum prefix-length for route validation record";
                  }
    
                  uses apply-advanced;
    
                  list origin-autonomous-system {
                    key "name";
                    ordered-by user;
                    leaf name {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Legitimate Origin Autonomous System";
                    }
    
                    uses apply-advanced;
    
                    leaf validation-state {
                      type enumeration {
                        enum "invalid" {
                          value 0;
                          description
                            "Invalid route validation state";
                        }
                        enum "valid" {
                          value 1;
                          description
                            "Valid route validation state";
                        }
                      }
                      description
                        "Validation state for route validation record";
                    }
                  }  // list origin-autonomous-system
                }  // list maximum-length
              }  // list record
            }  // container static
          }  // container validation
        }  // grouping juniper-routing-options
    
        grouping dynamic_tunnel_type {
          description
            "Dynamic tunnel definition";
          leaf name {
            type string {
              junos:posix-pattern "![^a-zA-Z0-9_-]|(^(all|.{64,})$)";
              junos:pattern-message "Tunnel name is a string consisting of up to 63 letters, numbers, dashes, and underscores";
            }
            description "Tunnel name";
          }
    
          uses apply-advanced;
    
          leaf source-address {
            junos:must "((".. gre" || (".. udp" || (".. bgp-signal" || ".. ipip"))))";
            junos:must-message "Tunnel type GRE, UDP or BGP-SIGNAL must be configured";
            type jt:ipaddr;
            description "Tunnel source address";
          }
    
          choice tunnel-type {
            list rsvp-te {
              key "name";
              ordered-by user;
              description
                "RSVP-TE point-to-point LSP";
              leaf name {
                type string;
                description
                  "Configure multiple entries for RSVP tunnel";
              }
    
              uses apply-advanced;
    
              container label-switched-path-template {
                description
                  "Template for dynamic point-to-point LSP parameters";
                uses apply-advanced;
    
                choice dynamic-template {
                  leaf template-name {
                    junos:must "(("protocols mpls label-switched-path $$" && "protocols mpls label-switched-path $$ template"))";
                    junos:must-message "Referenced point-to-point LSP template does not exist";
                    type string {
                      junos:posix-pattern "^.{1,32}$";
                      junos:pattern-message "Must be a string of 32 characters or less";
                    }
                    description
                      "Name of point-to-point LSP template";
                  }
                  leaf default-template {
                    type empty;
                    description
                      "Use default parameters";
                  }
                }  // choice dynamic-template
              }  // container label-switched-path-template
    
              list destination-networks {
                key "name";
                ordered-by user;
                description
                  "Create tunnels for routes in these destination networks";
                uses app_network_type;
              }  // list destination-networks
            }  // list rsvp-te
            container spring-te {
              description "SPRING-TE LSP's";
              uses apply-advanced;
    
              list source-routing-path-template {
                key "name";
                ordered-by user;
                description
                  "Template color mapping for SPRING-TE dynamic LSP parameters";
                uses spring-te-template-map;
              }  // list source-routing-path-template
    
              list destination-networks {
                key "name";
                ordered-by user;
                description
                  "Create tunnels for routes in these destination networks";
                uses app_network_type;
              }  // list destination-networks
            }  // container spring-te
            leaf gre {
              junos:must "((".. source-address" && ".. destination-networks"))";
              junos:must-message "Source address and Destination Networks must be configured for tunnel type GRE";
              type empty;
              description
                "Generic routing encapsulation type for IPv4";
            }
    
            case case_4 {
            }  // case case_4
            leaf bgp-signal {
              junos:must "((".. source-address" && ".. destination-networks"))";
              junos:must-message "Source address and Destination Networks must be configured for tunnel type BGP-Signal";
              type empty;
              description
                "BGP signals the encapsulation type for IPv4";
            }
    
            case case_6 {
            }  // case case_6
          }  // choice tunnel-type
    
          list destination-networks {
            junos:must "(((".. gre" || (".. udp" || (".. bgp-signal" || ".. ipip"))) && (!(".. rsvp-te") && !(".. spring-te"))))";
            junos:must-message "Tunnel type GRE or UDP must be configured";
            key "name";
            ordered-by user;
            description
              "Create tunnels for routes in these destination networks";
            uses network_type;
          }  // list destination-networks
        }  // grouping dynamic_tunnel_type
    
        grouping app_network_type {
          leaf name {
            type jt:ipprefix;
            description "Network prefix";
          }
    
          uses apply-advanced;
        }  // grouping app_network_type
    
        grouping export-af-obj {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable auto-export for address family";
            }
          }  // choice enable-disable
    
          container unicast {
            presence "enable unicast";
            description
              "Unicast routing information";
            uses export-subaf-obj;
          }  // container unicast
    
          container multicast {
            presence "enable multicast";
            description
              "Multicast routing information";
            uses export-subaf-obj;
          }  // container multicast
    
          container flow {
            presence "enable flow";
            description
              "Flow routing information";
            uses export-subaf-obj;
          }  // container flow
        }  // grouping export-af-obj
    
        grouping export-subaf-obj {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable instance export";
            }
          }  // choice enable-disable
    
          leaf rib-group {
            type string;
            description
              "Auxiliary rib-group of additional RIBs to consider";
          }
        }  // grouping export-subaf-obj
    
        grouping fate_sharing_links {
          leaf name {
            type jt:ipv4addr;
            description
              "Router ID or LAN interface address";
          }
    
          leaf to {
            type jt:ipv4addr;
            description "Point-to-point links";
          }
        }  // grouping fate_sharing_links
    
        grouping flow-interface-group {
          leaf group {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 255";
              }
            }
            description
              "Interface group ID to match traffic";
          }
    
          leaf exclude {
            type empty;
            description
              "Don't apply flow-spec filter to traffic on this group";
          }
        }  // grouping flow-interface-group
    
        grouping flow-route-inet {
          leaf name {
            type string;
          }
    
          uses apply-advanced;
    
          leaf no-install {
            type empty;
            description
              "Don't install firewall filter in forwarding";
          }
    
          container match {
            description "Flow definition";
            uses flow-route-qualifier-inet;
          }  // container match
    
          container then {
            description
              "Actions to take for this flow";
            uses flow-route-op;
          }  // container then
        }  // grouping flow-route-inet
    
        grouping flow-route-inet6 {
          leaf name {
            type string;
          }
    
          uses apply-advanced;
    
          leaf no-install {
            type empty;
            description
              "Don't install firewall filter in forwarding";
          }
    
          container match {
            description "Flow definition";
            uses flow-route-qualifier-inet6;
          }  // container match
    
          container then {
            description
              "Actions to take for this flow";
            uses flow-route-op;
          }  // container then
        }  // grouping flow-route-inet6
    
        grouping flow-route-op {
          uses apply-advanced;
    
          leaf community {
            type string;
            description "Name of BGP community";
          }
    
          choice flow_op_action {
            leaf accept {
              type empty;
              description
                "Allow traffic through";
            }
            leaf discard {
              type empty;
              description
                "Discard all traffic for this flow";
            }
            leaf rate-limit {
              type string;
              description
                "Rate in bits/sec to limit the flow traffic";
            }
          }  // choice flow_op_action
    
          leaf routing-instance {
            type string {
              junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
              junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
            }
            description
              "Redirect to instance identified via Route Target community";
          }
    
          leaf sample {
            type empty;
            description
              "Sample traffic that matches this flow";
          }
    
          leaf mark {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 63";
              }
            }
            description
              "Set DSCP value for traffic that matches this flow";
          }
    
          leaf next-term {
            type empty;
            description
              "Continue the filter evaluation after matching this flow";
          }
    
          choice redirect_op_action {
            leaf-list redirect {
              type jt:ipaddr;
              ordered-by user;
              description
                "Redirect(Tunnel) this flow's traffic to given next-hop address";
            }
          }  // choice redirect_op_action
        }  // grouping flow-route-op
    
        grouping flow-route-qualifier-inet {
          uses apply-advanced;
    
          leaf-list protocol {
            type string;
            ordered-by user;
            description "IP protocol value";
          }
    
          leaf-list port {
            type string;
            ordered-by user;
          }
    
          leaf-list destination-port {
            type string;
            ordered-by user;
          }
    
          leaf-list source-port {
            type string;
            ordered-by user;
          }
    
          leaf-list tcp-flags {
            type string;
            ordered-by user;
            description "TCP flags";
          }
    
          leaf-list packet-length {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Packet length (0-65535)";
          }
    
          leaf-list dscp {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Differentiated Services (DiffServ) code point (DSCP) (0-63)";
          }
    
          leaf-list fragment {
            type enumeration {
              enum "dont-fragment" {
                value 0;
                description
                  "Don't Fragment flag is set";
              }
              enum "not-a-fragment" {
                value 1;
                description "Not a fragment";
              }
              enum "is-fragment" {
                value 2;
                description "Fragmented packet";
              }
              enum "first-fragment" {
                value 3;
                description "First fragment";
              }
              enum "last-fragment" {
                value 4;
                description "Last fragment";
              }
            }
            ordered-by user;
          }
    
          leaf destination {
            type jt:ipv4prefix;
            description
              "Destination prefix for this traffic flow";
          }
    
          leaf source {
            type jt:ipv4prefix;
            description
              "Source prefix for this traffic flow";
          }
    
          leaf-list icmp-code {
            type string;
            ordered-by user;
            description "ICMP message code";
          }
    
          leaf-list icmp-type {
            type string;
            ordered-by user;
            description "ICMP message type";
          }
        }  // grouping flow-route-qualifier-inet
    
        grouping flow-route-qualifier-inet6 {
          uses apply-advanced;
    
          leaf-list protocol {
            type string;
            ordered-by user;
            description "IP protocol value";
          }
    
          leaf-list port {
            type string;
            ordered-by user;
          }
    
          leaf-list destination-port {
            type string;
            ordered-by user;
          }
    
          leaf-list source-port {
            type string;
            ordered-by user;
          }
    
          leaf-list tcp-flags {
            type string;
            ordered-by user;
            description "TCP flags";
          }
    
          leaf-list packet-length {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Packet length (0-65535)";
          }
    
          leaf-list dscp {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Differentiated Services (DiffServ) code point (DSCP) (0-63)";
          }
    
          leaf-list fragment {
            type enumeration {
              enum "dont-fragment" {
                value 0;
                description
                  "Don't Fragment flag is set";
              }
              enum "not-a-fragment" {
                value 1;
                description "Not a fragment";
              }
              enum "is-fragment" {
                value 2;
                description "Fragmented packet";
              }
              enum "first-fragment" {
                value 3;
                description "First fragment";
              }
              enum "last-fragment" {
                value 4;
                description "Last fragment";
              }
            }
            ordered-by user;
          }
    
          container destination {
            presence "enable destination";
            description
              "Destination prefix for this traffic flow";
            uses flow-prefix-with-offset;
          }  // container destination
    
          container source {
            presence "enable source";
            description
              "Source prefix for this traffic flow";
            uses flow-prefix-with-offset;
          }  // container source
    
          leaf-list icmp6-type {
            type string;
            ordered-by user;
            description "ICMP message type";
          }
    
          leaf-list icmp6-code {
            type string;
            ordered-by user;
            description "ICMP message code";
          }
    
          leaf-list flow-label {
            type jt:policy-algebra;
            ordered-by user;
            description "Flow-label (0-1048575)";
          }
        }  // grouping flow-route-qualifier-inet6
    
        grouping flow-prefix-with-offset {
          leaf prefix {
            type jt:ipv6prefix;
          }
    
          leaf prefix-offset {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Offset from where prefix match will start";
          }
        }  // grouping flow-prefix-with-offset
    
        grouping flow-validation {
          uses apply-advanced;
    
          container traceoptions {
            description "Trace options";
            uses flow-dep-traceoptions;
          }  // container traceoptions
        }  // grouping flow-validation
    
        grouping flow-dep-traceoptions {
          uses apply-advanced;
    
          container file {
            description "Trace file options";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf replace {
              type empty;
              status deprecated;
              description
                "Replace trace file rather than appending to it";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "10";
              description
                "Maximum number of trace files";
            }
    
            leaf no-stamp {
              type empty;
              status deprecated;
              description
                "Do not timestamp trace file";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
          }  // container file
    
          list flag {
            key "name";
            ordered-by user;
            description "Tracing parameters";
            leaf name {
              type enumeration {
                enum "resolution" {
                  value 0;
                  description
                    "Trace flow to unicast route resolution";
                }
                enum "flash" {
                  value 1;
                  description
                    "Trace flash processing";
                }
                enum "route" {
                  value 2;
                  description
                    "Trace routing information";
                }
                enum "normal" {
                  value 3;
                  description
                    "Trace normal events";
                }
                enum "general" {
                  value 4;
                  description
                    "Trace general events";
                }
                enum "state" {
                  value 5;
                  description
                    "Trace state transitions";
                }
                enum "policy" {
                  value 6;
                  description
                    "Trace policy processing";
                }
                enum "task" {
                  value 7;
                  description
                    "Trace routing protocol task processing";
                }
                enum "timer" {
                  value 8;
                  description
                    "Trace routing protocol timer processing";
                }
                enum "all" {
                  value 9;
                  description "Trace everything";
                }
              }
            }
    
            leaf send {
              type empty;
              description
                "Trace transmitted packets";
            }
    
            leaf receive {
              type empty;
              description
                "Trace received packets";
            }
    
            leaf detail {
              type empty;
              description
                "Trace detailed information";
            }
    
            leaf disable {
              type empty;
              description
                "Disable this trace flag";
            }
    
            container filter {
              presence "enable filter";
              description
                "Filter to apply to tracing";
              leaf match-on {
                type enumeration {
                  enum "prefix" {
                    value 0;
                    description
                      "Filter based on prefix";
                  }
                  enum "route-attribute" {
                    value 1;
                    description
                      "Filter based on route attributes";
                  }
                }
                description
                  "Argument on which to match";
              }
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description "Filter policy";
              }
            }  // container filter
          }  // list flag
        }  // grouping flow-dep-traceoptions
    
        grouping forwarding-table-type {
          description
            "Forwarding table management options";
          uses apply-advanced;
    
          leaf remnant-holdtime {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 10000";
              }
            }
            description
              "Time to hold inherited routes from FIB";
          }
    
          leaf chain-composite-max-label-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 16";
              }
            }
            description
              "Maximum labels inside chain composite for the platform.";
          }
    
          leaf krt-nexthop-ack-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 400";
              }
            }
            description
              "Kernel nexthop ack timeout interval";
          }
    
          leaf srv6-chain-merge {
            type empty;
            description
              "Enable merging of srv6 chain nexthops";
          }
    
          container consistency-checking {
            status deprecated;
            description
              "RIB/FIB consistency checking";
            uses apply-advanced;
    
            choice enable-disable {
              leaf enable {
                type empty;
                description
                  "Enable consistency checking";
              }
              leaf disable {
                type empty;
                description
                  "Disable consistency checking";
              }
            }  // choice enable-disable
    
            leaf period {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 4294967295";
                }
              }
              description
                "Periodicity of scan in seconds";
            }
    
            leaf threshold {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Mismatch threshold until complaint";
            }
          }  // container consistency-checking
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          leaf dynamic-list-next-hop {
            junos:must "(!(".. evpn-aliasing-optimize"))";
            junos:must-message "please disable evpn-aliasing-optimize";
            type empty;
            description
              "Dynamic next-hop mode for EVPN";
          }
    
          container evpn-egress-link-protection {
            presence
              "enable evpn-egress-link-protection";
            description
              "EVPN PE-CE egress link failure protection";
            uses apply-advanced;
          }  // container evpn-egress-link-protection
    
          container egress-chaining {
            description "Enable egress-chaining";
            uses apply-advanced;
    
            leaf spring-te {
              type empty;
              description
                "Enable egress-chaining for SPRING-TE routes";
            }
          }  // container egress-chaining
    
          leaf evpn-aliasing-optimize {
            junos:must "(!(".. evpn-egress-link-protection"))";
            junos:must-message "please disable evpn-egress-link-protection";
            junos:must "(!(".. dynamic-list-next-hop"))";
            junos:must-message "please disable dynamic-list-next-hop";
            type empty;
            description
              "EVPN Aliasing convergence improvement";
          }
    
          choice indirect-next-hop-choice {
            leaf indirect-next-hop {
              type empty;
              description
                "Install indirect next hops in Packet Forwarding Engine";
            }
            leaf no-indirect-next-hop {
              type empty;
              description
                "Don't install indirect next hops in Packet Forwarding Engine";
            }
          }  // choice indirect-next-hop-choice
    
          choice route-ack-converge-choice {
            leaf route-ack-converge {
              type empty;
              description
                "Enable the route ack convergence feature";
            }
            leaf no-route-ack-converge {
              type empty;
              description
                "Don't enable the route ack convergence feature";
            }
          }  // choice route-ack-converge-choice
    
          choice indirect-next-hop-change-acknowledgements-choice {
            leaf indirect-next-hop-change-acknowledgements {
              type empty;
              description
                "Request acknowledgements for Indirect next hop changes";
            }
            leaf no-indirect-next-hop-change-acknowledgements {
              type empty;
              description
                "Don't request acknowledgements for Indirect next hop changes";
            }
          }  // choice indirect-next-hop-change-acknowledgements-choice
    
          list rib {
            key "name";
            ordered-by user;
            status deprecated;
            leaf name {
              type string;
            }
          }  // list rib
    
          leaf unicast-reverse-path {
            type enumeration {
              enum "active-paths" {
                value 0;
                description
                  "Consider active paths when performing RP verification";
              }
              enum "feasible-paths" {
                value 1;
                description
                  "Consider all feasible paths for RP verification";
              }
            }
            description
              "Unicast reverse path (RP) verification";
          }
    
          container ip-tunnel-rpf-check {
            presence
              "enable ip-tunnel-rpf-check";
            description
              "IP tunnel Reverse Path Forwarding Check";
            uses apply-advanced;
    
            leaf mode {
              type enumeration {
                enum "strict" {
                  value 0;
                  description
                    "Strict mode for rpf-check(Default)";
                }
                enum "loose" {
                  value 1;
                  description
                    "Loose mode for rpf-check";
                }
              }
              default "strict";
            }
    
            leaf fail-filter {
              junos:must "(("firewall family any filter $$" || ((!("firewall") && ".. .. .. .. .. firewall family any filter $$") || ("firewall family inet filter $$" || ((!("firewall") && ".. .. .. .. .. firewall family inet filter $$") || ("firewall family inet6 filter $$" || (!("firewall") && ".. .. .. .. .. firewall family inet6 filter $$")))))))";
              junos:must-message "referenced filter must be defined under firewall family any|inet|inet6";
              type string {
                junos:posix-pattern "!^((__.*)|(.{65,}))$";
                junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              }
              description
                "Fail filter name for RPF check(family inet|inet6|any)";
            }
          }  // container ip-tunnel-rpf-check
    
          container fib-next-hop-split {
            description
              "Split nexthop to chain nexthop when installing fom rib to fib";
            uses apply-advanced;
    
            leaf labeled-isis {
              type empty;
              description
                "Create composite-chained nexthops for labeled ISIS routes";
            }
          }  // container fib-next-hop-split
        }  // grouping forwarding-table-type
    
        grouping juniper-sampling-options {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable global sampling instance";
            }
          }  // choice enable-disable
    
          container traceoptions {
            description
              "Traffic sampling trace options";
            uses sampling_traceoptions_type;
          }  // container traceoptions
    
          container input {
            description
              "Traffic Sampling data acquisition";
            uses sampling_input_type;
          }  // container input
    
          container output {
            junos:must "(!(".. family"))";
            junos:must-message " 'sampling family <*> ' and 'sampling output' are mutually exclusive";
            junos:must "("forwarding-options sampling input")";
            junos:must-message "Sampling input configuration is not specified";
            status deprecated;
            description
              "Traffic sampling data disposition";
            uses sampling_output_type;
          }  // container output
    
          container family {
            description
              "Address family of packets to sample";
            container inet {
              description "Sample IPv4 packets";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable sampling family inet";
                }
              }  // choice enable-disable
    
              container input {
                junos:must "(!(".. .. .. input"))";
                junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                description
                  "Settings for sampling of input packets";
                uses sampling_family_input_type;
              }  // container input
    
              container output {
                junos:must "((!("forwarding-options sampling input family inet") && (!("forwarding-options sampling input family inet6") && !("forwarding-options sampling input family mpls"))))";
                junos:must-message "output configuration mismatch with old deprecated input configuration";
                junos:must "((".. .. .. input rate" || " .. input rate"))";
                junos:must-message "sampling input rate is not specified";
                junos:must "((".. .. .. input" || ".. input"))";
                junos:must-message "Sampling input configuration is not specified";
                description
                  "Traffic sampling data disposition";
                uses sampling_instance_inet_global_output_type;
              }  // container output
            }  // container inet
    
            container inet6 {
              description "Sample IPv6 packets";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable sampling family inet6";
                }
              }  // choice enable-disable
    
              container input {
                junos:must "(!(".. .. .. input"))";
                junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                description
                  "Settings for sampling of input packets";
                uses sampling_family_input_type;
              }  // container input
    
              container output {
                junos:must "((!("forwarding-options sampling input family inet") && (!("forwarding-options sampling input family inet6") && !("forwarding-options sampling input family mpls"))))";
                junos:must-message "output configuration mismatch with old deprecated input configuration";
                junos:must "((".. .. .. input" || ".. input"))";
                junos:must-message "Sampling input configuration is not specified";
                description
                  "Traffic sampling data disposition";
                uses sampling_family_inet6_output_type;
              }  // container output
            }  // container inet6
    
            container mpls {
              description "Sample mpls packets";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable sampling family mpls";
                }
              }  // choice enable-disable
    
              container input {
                junos:must "(!(".. .. .. input"))";
                junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                description
                  "Settings for sampling of input packets";
                uses sampling_family_input_type;
              }  // container input
    
              container output {
                junos:must "((!("forwarding-options sampling input family inet") && (!("forwarding-options sampling input family inet6") && !("forwarding-options sampling input family mpls"))))";
                junos:must-message "output configuration mismatch with old deprecated input configuration";
                junos:must "((".. .. .. input" || ".. input"))";
                junos:must-message "Sampling input configuration is not specified";
                description
                  "Traffic sampling data disposition";
                uses sampling_global_mpls_output_type;
              }  // container output
            }  // container mpls
          }  // container family
    
          list instance {
            key "name";
            ordered-by user;
            description
              "Instance of sampling parameters";
            leaf name {
              junos:must "(!("forwarding-options port-mirroring instance $$"))";
              junos:must-message "Instance $$ is also defined under port-mirroring hierarchy";
              type string;
              description
                "Name for sampling instance";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable sampling instance";
              }
            }  // choice enable-disable
    
            container input {
              description
                "Traffic Sampling data acquisition";
              uses sampling_instance_input_type;
            }  // container input
    
            container family {
              description
                "Address family of packets to sample";
              container inet {
                description
                  "Sample IPv4 packets";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    status deprecated;
                    description
                      "Disable instance family inet";
                  }
                }  // choice enable-disable
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                  description
                    "Settings for sampling of input packets";
                  uses sampling_family_input_type;
                }  // container input
    
                container output {
                  junos:must "((!("forwarding-options sampling input family inet") && (!("forwarding-options sampling input family inet6") && !("forwarding-options sampling input family mpls"))))";
                  junos:must-message "output configuration mismatch with old deprecated input configuration";
                  junos:must "((".. .. .. input" || ".. input"))";
                  junos:must-message "Sampling input configuration is not specified";
                  description
                    "Traffic sampling data disposition";
                  uses sampling_instance_inet_output_type;
                }  // container output
              }  // container inet
    
              container inet6 {
                description
                  "Sample IPv6 packets";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    status deprecated;
                    description
                      "Disable instance family inet6";
                  }
                }  // choice enable-disable
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                  description
                    "Settings for sampling of input packets";
                  uses sampling_family_input_type;
                }  // container input
    
                container output {
                  junos:must "((!("forwarding-options sampling input family inet") && (!("forwarding-options sampling input family inet6") && !("forwarding-options sampling input family mpls"))))";
                  junos:must-message "output configuration mismatch with old deprecated input configuration";
                  junos:must "((".. .. .. input" || ".. input"))";
                  junos:must-message "Sampling input configuration is not specified";
                  description
                    "Traffic sampling data disposition";
                  uses sampling_instance_inet6_output_type;
                }  // container output
              }  // container inet6
    
              container mpls {
                description
                  "Sample mpls packets";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    status deprecated;
                    description
                      "Disable instance family mpls";
                  }
                }  // choice enable-disable
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                  description
                    "Settings for sampling of input packets";
                  uses sampling_family_input_type;
                }  // container input
    
                container output {
                  junos:must "((!("forwarding-options sampling input family inet") && (!("forwarding-options sampling input family inet6") && !("forwarding-options sampling input family mpls"))))";
                  junos:must-message "output configuration mismatch with old deprecated input configuration";
                  junos:must "((".. .. .. input" || ".. input"))";
                  junos:must-message "Sampling input configuration is not specified";
                  description
                    "Traffic sampling data disposition";
                  uses sampling_instance_mpls_output_type;
                }  // container output
              }  // container mpls
    
              container vpls {
                status deprecated;
                description
                  "Sample vpls packets";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable instance family vpls";
                  }
                }  // choice enable-disable
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                  description
                    "Settings for sampling of input packets";
                  uses sampling_family_input_type;
                }  // container input
    
                container output {
                  junos:must "((".. .. .. input" || ".. input"))";
                  junos:must-message "Sampling input configuration is not specified";
                  description
                    "Traffic sampling data disposition";
                  uses sampling_instance_vpls_output_type;
                }  // container output
              }  // container vpls
    
              container bridge {
                junos:must "(!(".. .. family vpls"))";
                junos:must-message "bridge and vpls families are mutually exclusive";
                description
                  "Sample bridge packets";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable instance family bridge";
                  }
                }  // choice enable-disable
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                  description
                    "Settings for sampling of input packets";
                  uses sampling_family_input_type;
                }  // container input
    
                container output {
                  junos:must "((".. .. .. input" || ".. input"))";
                  junos:must-message "Sampling input configuration is not specified";
                  description
                    "Traffic sampling data disposition";
                  uses sampling_instance_bridge_output_type;
                }  // container output
              }  // container bridge
            }  // container family
          }  // list instance
    
          container jflow-service {
            description
              "Jflow service configuration";
            uses apply-advanced;
    
            container traceoptions {
              description
                "Jflow service trace options";
              uses jflow_service_traceoptions;
            }  // container traceoptions
          }  // container jflow-service
    
          container route-record {
            description
              "Sampling route record configuration";
            uses apply-advanced;
    
            container traceoptions {
              description
                "Sampling route record trace options";
              uses route_record_traceoptions;
            }  // container traceoptions
          }  // container route-record
        }  // grouping juniper-sampling-options
    
        grouping jflow_service_traceoptions {
          description
            "Traceoptions for jflow-service";
          uses apply-advanced;
    
          leaf no-remote-trace {
            junos:must "("system tracing")";
            junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
            type empty;
            description "Disable remote tracing";
          }
    
          container file {
            description "Trace file information";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "3";
              description
                "Maximum number of trace files";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
    
            leaf match {
              type jt:regular-expression;
              description
                "Regular expression for lines to be logged";
            }
          }  // container file
    
          leaf level {
            type enumeration {
              enum "error" {
                value 0;
                description
                  "Match error conditions";
              }
              enum "warning" {
                value 1;
                description
                  "Match warning messages";
              }
              enum "notice" {
                value 2;
                description
                  "Match conditions that should be handled specially";
              }
              enum "info" {
                value 3;
                description
                  "Match informational messages";
              }
              enum "verbose" {
                value 4;
                description
                  "Match verbose messages";
              }
              enum "all" {
                value 5;
                description "Match all levels";
              }
            }
            default "error";
            description
              "Level of debugging output";
          }
    
          list flag {
            key "name";
            ordered-by user;
            description
              "Area of jflow-service to enable debuging output";
            leaf name {
              type enumeration {
                enum "parse" {
                  value 0;
                  description
                    "Trace parsing code";
                }
                enum "rtsock" {
                  value 1;
                  description
                    "Trace rtsock code";
                }
                enum "sm" {
                  value 2;
                  description
                    "Trace State machine code";
                }
                enum "all" {
                  value 3;
                  description
                    "Trace all area of jflow-service code";
                }
              }
            }
          }  // list flag
        }  // grouping jflow_service_traceoptions
    
        grouping junos_hash_key {
          description
            "Select data used in the hash key";
          uses apply-advanced;
    
          container family {
            description "Protocol family";
            container fcoe {
              description "FCoE protocol family";
              uses apply-advanced;
    
              container ethernet-interfaces {
                description
                  "FCoE hash-key configuration on ethernet interfaces";
                uses apply-advanced;
    
                leaf oxid {
                  type enumeration {
                    enum "enable" {
                      value 0;
                      description
                        "Include Originator Exchange ID in the hash key";
                    }
                    enum "disable" {
                      value 1;
                      description
                        "Do not include Originator Exchange ID in the hash key";
                    }
                  }
                  description
                    "Originator Exchange ID";
                }
              }  // container ethernet-interfaces
    
              container fabric-interfaces {
                description
                  "FCoE hash-key configuration on fabric interfaces";
                uses apply-advanced;
    
                leaf oxid {
                  type enumeration {
                    enum "enable" {
                      value 0;
                      description
                        "Include Originator Exchange ID in the hash key";
                    }
                    enum "disable" {
                      value 1;
                      description
                        "Do not include Originator Exchange ID in the hash key";
                    }
                  }
                  description
                    "Originator Exchange ID";
                }
              }  // container fabric-interfaces
            }  // container fcoe
    
            container inet {
              description "IPv4 protocol family";
              uses apply-advanced;
    
              container layer-3 {
                presence "enable layer-3";
                description
                  "Include Layer 3 (IP) data in the hash key";
                uses apply-advanced;
    
                leaf destination-address {
                  type empty;
                  description
                    "Include IP destination address in the hash key";
                }
              }  // container layer-3
    
              container layer-4 {
                presence "enable layer-4";
                description
                  "Include Layer 4 (TCP or UDP) data in the hash key";
                uses apply-advanced;
              }  // container layer-4
            }  // container inet
    
            container inet6 {
              description "IPv6 protocol family";
              uses apply-advanced;
    
              container layer-3 {
                presence "enable layer-3";
                description
                  "Include Layer 3 (IP) data in the hash key";
                uses apply-advanced;
    
                leaf destination-address {
                  type empty;
                  description
                    "Include IP destination address in the hash key";
                }
    
                leaf incoming-interface-index {
                  type empty;
                  description
                    "Include incoming interface index in the hash key";
                }
    
                leaf next-header {
                  type empty;
                  description
                    "Include IP Next Header field in the hash key";
                }
    
                leaf source-address {
                  type empty;
                  description
                    "Include IP source address in the hash key";
                }
    
                leaf traffic-class {
                  type empty;
                  description
                    "Include Traffic Class field in the hash key";
                }
              }  // container layer-3
    
              container layer-4 {
                presence "enable layer-4";
                description
                  "Include Layer 4 (TCP or UDP) data in the hash key";
                uses apply-advanced;
    
                leaf destination-port {
                  type empty;
                  description
                    "Include IP destination port in the hash key";
                }
    
                leaf source-port {
                  type empty;
                  description
                    "Include IP source port in the hash key";
                }
              }  // container layer-4
            }  // container inet6
    
            container mpls {
              description "MPLS protocol family";
              uses apply-advanced;
    
              choice label {
                leaf label-1 {
                  type empty;
                  description
                    "Include the first MPLS label in the hash key";
                }
                leaf all-labels {
                  type empty;
                  description
                    "Include all MPLS labels in hash key";
                }
                leaf no-labels {
                  type empty;
                  description
                    "Exclude all MPLS labels from hash key";
                }
                leaf bottom-label-1 {
                  type empty;
                  description
                    "Include the first MPLS label from bottom-of-stack in the hash key";
                }
              }  // choice label
    
              leaf label-2 {
                junos:must "(".. label-1")";
                junos:must-message "Must also specify label 1;";
                type empty;
                description
                  "Include the second MPLS label in the hash key";
              }
    
              leaf label-3 {
                junos:must "(".. label-2")";
                junos:must-message "Must also specify label 2;";
                type empty;
                description
                  "Include the third MPLS label in the hash key";
              }
    
              container payload {
                junos:must "((".. label-1" || (".. no-labels" || (".. all-labels" || ".. bottom-label-1"))))";
                junos:must-message "Either label-1, bottom-label-1, all-labels or no-labels statement is mandatory";
                description
                  "Include payload data in the hash key";
                uses apply-advanced;
    
                container ether-pseudowire {
                  presence
                    "enable ether-pseudowire";
                  description
                    "Load-balance IP over ethernet PW";
                  uses apply-advanced;
                }  // container ether-pseudowire
    
                container ip {
                  presence "enable ip";
                  description
                    "Include IPv4 or IPv6 payload data in the hash key";
                  uses apply-advanced;
    
                  choice layer-4-select {
                    choice ip-payload {
                      leaf layer-3-only {
                        type empty;
                        description
                          "Include only layer-3 IP information";
                      }
                      leaf enable {
                        type empty;
                        description
                          "Include layer3/4 IP payload in the hash key";
                      }
                      leaf disable {
                        type empty;
                        description
                          "Exclude layer3/4 IP payload in the hash key";
                      }
                    }  // choice ip-payload
                    container port-data {
                      presence
                        "enable port-data";
                      uses apply-advanced;
    
                      leaf source-msb {
                        type empty;
                        description
                          "Include the most significant byte of the source port";
                      }
    
                      leaf source-lsb {
                        type empty;
                        description
                          "Include the least significant byte of the source port";
                      }
    
                      leaf destination-msb {
                        type empty;
                        description
                          "Include the most significant byte of the destination port";
                      }
    
                      leaf destination-lsb {
                        type empty;
                        description
                          "Include the least significant byte of the destination port";
                      }
                    }  // container port-data
                  }  // choice layer-4-select
                }  // container ip
              }  // container payload
            }  // container mpls
    
            container multiservice {
              description
                "Multiservice protocol family";
              uses apply-advanced;
    
              leaf source-mac {
                type empty;
                description
                  "Include source MAC address in hash key";
              }
    
              leaf destination-mac {
                type empty;
                description
                  "Include destination MAC address in hash key";
              }
            }  // container multiservice
          }  // container family
        }  // grouping junos_hash_key
    
        grouping layer2_pm_family_output_type {
          uses apply-advanced;
    
          choice interface-or-next-hop-index {
            leaf interface {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Interface through which to send sampled traffic";
            }
            leaf next-hop-group {
              junos:must "(!(".. no-filter-check"))";
              junos:must-message "no-filter-check is not allowed with next-hop-group";
              junos:must "("forwarding-options next-hop-group $$ group-type layer-2")";
              junos:must-message "Referenced next-hop-group must be defined as layer-2 group";
              type string;
              description
                "Next-hop-group through which to send port-mirror traffic";
            }
            list routing-instance {
              key "name";
              max-elements 1;
              description "Routing instances";
              uses layer2_pm_output-routing-instance-type;
            }  // list routing-instance
            list vlan {
              key "name";
              max-elements 1;
              description
                "Outgoing VLAN for mirrored packets";
              uses pm-rspan-vlan;
            }  // list vlan
    
            case case_5 {
            }  // case case_5
          }  // choice interface-or-next-hop-index
    
          leaf no-filter-check {
            type empty;
            description
              "Do not check for filters on port-mirroring interface";
          }
        }  // grouping layer2_pm_family_output_type
    
        grouping layer2_pm_output-routing-instance-type {
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description "Routing instance name";
          }
    
          uses apply-advanced;
    
          list vlan {
            key "name";
            max-elements 1;
            description
              "Outgoing VLAN for mirrored packets";
            uses pm-rspan-vlan;
          }  // list vlan
        }  // grouping layer2_pm_output-routing-instance-type
    
        grouping ldp-sync-obj {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable LDP synchronization";
            }
          }  // choice enable-disable
    
          leaf hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Time during which maximum metric is advertised";
          }
        }  // grouping ldp-sync-obj
    
        grouping ldp_filter_obj {
          description
            "Filter to apply to tracing";
          leaf match-on {
            type enumeration {
              enum "fec" {
                value 0;
                description
                  "Filter based on FEC associated to the traced object.";
              }
              enum "address" {
                value 1;
                description
                  "Filter based on packet source and destination addresses.";
              }
            }
            description
              "Argument on which to match";
          }
    
          leaf-list policy {
            type jt:policy-algebra;
            ordered-by user;
            description "Filter policy";
          }
        }  // grouping ldp_filter_obj
    
        grouping lsp-set-match-type {
          uses apply-advanced;
    
          leaf lsp-name {
            junos:must "((!(".. lsp-regex") && (!(".. p2mp-name") && !(".. p2mp-regex"))))";
            junos:must-message "Can't configure lsp-name when lsp-regex or p2mp-name or p2mp-regex is configured";
            type string;
            description
              "LSP name that matches this string";
          }
    
          leaf lsp-regex {
            junos:must "((!(".. lsp-name") && (!(".. p2mp-name") && !(".. p2mp-regex"))))";
            junos:must-message "Can't configure lsp-regex when lsp-name or p2mp-name or p2mp-regex is configured";
            type string;
            description
              "All LSPs that match this regular expression pattern";
          }
    
          leaf p2mp-name {
            junos:must "((!(".. lsp-name") && (!(".. lsp-regex") && !(".. p2mp-regex"))))";
            junos:must-message "Can't configure p2mp-name when lsp-name or lsp-regex or p2mp-regex is configured";
            type string;
            description
              "P2MP names that match this string";
          }
    
          leaf p2mp-regex {
            junos:must "((!(".. lsp-name") && (!(".. lsp-regex") && !(".. p2mp-name"))))";
            junos:must-message "Can't configure p2mp-regex when lsp-name or lsp-regex or p2mp-name is configured";
            type string;
            description
              "P2MP names that match this regular expression pattern";
          }
    
          choice router-type {
            leaf egress {
              type empty;
              description
                "All LSPs for which this router is egress";
            }
            leaf ingress {
              type empty;
              description
                "All LSPs for which this router is ingress";
            }
            leaf transit {
              type empty;
              description
                "All LSPs for which this router is transit";
            }
          }  // choice router-type
        }  // grouping lsp-set-match-type
    
        grouping lsp_nh_obj {
          leaf name {
            type string;
            description
              "LSP to use to reach destination";
          }
    
          uses apply-advanced;
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of LSP next hop";
          }
    
          leaf metric {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Metric of LSP next hop";
          }
        }  // grouping lsp_nh_obj
    
        grouping macro-data-type {
          leaf name {
            type string;
            description
              "Keyword part of the keyword-value pair";
          }
    
          leaf value {
            type string;
            description
              "Value part of the keyword-value pair";
          }
        }  // grouping macro-data-type
    
        grouping martian_type {
          description "Invalid routes";
          leaf address {
            type jt:ipprefix;
            description "IP address or hostname";
          }
    
          leaf choice-ident {
            type enumeration {
              enum "exact" {
                value 0;
              }
              enum "longer" {
                value 1;
              }
              enum "orlonger" {
                value 2;
              }
              enum "upto" {
                value 3;
              }
              enum "through" {
                value 4;
              }
              enum "prefix-length-range" {
                value 5;
              }
              enum "allow" {
                value 6;
              }
            }
          }
    
          leaf choice-value {
            type string;
          }
    
          leaf allow {
            type empty;
          }
        }  // grouping martian_type
    
        grouping mpls_pm_family_output_type {
          uses apply-advanced;
        }  // grouping mpls_pm_family_output_type
    
        grouping mrp-trace-options {
          description
            "Trace options for MMRP Protocol";
          uses apply-advanced;
    
          container file {
            description "Trace file options";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf replace {
              type empty;
              status deprecated;
              description
                "Replace trace file rather than appending to it";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "10";
              description
                "Maximum number of trace files";
            }
    
            leaf no-stamp {
              type empty;
              status deprecated;
              description
                "Do not timestamp trace file";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
          }  // container file
    
          list flag {
            junos:must "(".. file")";
            junos:must-message "Trace file name required to enable tracing";
            key "name";
            ordered-by user;
            description "Tracing parameters";
            leaf name {
              type enumeration {
                enum "events" {
                  value 0;
                  description
                    "Trace events to the protocol state machine";
                }
                enum "pdu" {
                  value 1;
                  description
                    "Trace RAPS PDU reception and transmission";
                }
                enum "timers" {
                  value 2;
                  description
                    "Trace protocol timers";
                }
                enum "state-machine" {
                  value 3;
                  description
                    "Trace information of the state machine";
                }
                enum "socket" {
                  value 4;
                  description
                    "Trace soccket activity";
                }
                enum "error" {
                  value 5;
                  description
                    "Trace all failure conditions";
                }
                enum "all" {
                  value 6;
                  description "Trace all";
                }
              }
            }
    
            leaf disable {
              type empty;
              description
                "Disable this trace flag";
            }
          }  // list flag
        }  // grouping mrp-trace-options
    
        grouping mstp-interface {
          leaf name {
            type string;
          }
    
          uses apply-advanced;
    
          leaf priority {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "0 .. 255";
              }
            }
            description
              "Interface priority (in increments of 16 - 0,16,..240)";
          }
    
          leaf cost {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 200000000";
              }
            }
            description "Cost of the interface";
          }
    
          leaf mode {
            type enumeration {
              enum "point-to-point" {
                value 0;
                description
                  "Interface mode is point-to-point";
              }
              enum "shared" {
                value 1;
                description
                  "Interface mode is shared";
              }
            }
            description
              "Interface mode (P2P or shared)";
          }
    
          leaf edge {
            type empty;
            description "Port is an edge port";
          }
    
          leaf access-trunk {
            type empty;
            description
              "Send/Receive untagged RSTP BPDUs on this interface";
          }
    
          container bpdu-timeout-action {
            presence
              "enable bpdu-timeout-action";
            description
              "Define action on BPDU expiry (Loop Protect)";
            uses apply-advanced;
    
            leaf block {
              type empty;
              description "Block the interface";
            }
    
            leaf alarm {
              type empty;
              description "Generate an alarm";
            }
          }  // container bpdu-timeout-action
    
          leaf no-root-port {
            type empty;
            description
              "Do not allow the interface to become root (Root Protect)";
          }
    
          leaf disable {
            type empty;
            description
              "Disable Spanning Tree on port";
          }
        }  // grouping mstp-interface
    
        grouping multicast_interface_options_type {
          description
            "Multicast interface options";
          leaf name {
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Interface name";
          }
    
          uses apply-advanced;
    
          container maximum-bandwidth {
            presence "enable maximum-bandwidth";
            description
              "Maximum multicast bandwidth for the interface";
            leaf bandwidth-limit {
              type string;
              units "bps";
              description
                "Maximum multicast bandwidth on the interface";
            }
          }  // container maximum-bandwidth
    
          choice enable-disable {
            leaf enable {
              type empty;
              status deprecated;
              description "Enable Multicast";
            }
            leaf disable {
              type empty;
              status deprecated;
              description "Disable Multicast";
            }
          }  // choice enable-disable
    
          container reverse-oif-mapping {
            presence
              "enable reverse-oif-mapping";
            description
              "Enable reverse OIF mapping on the multicast interface";
            uses apply-advanced;
    
            leaf no-qos-adjust {
              type empty;
              description
                "Disable reverse OIF mapping QoS adjustment";
            }
          }  // container reverse-oif-mapping
    
          leaf subscriber-leave-timer {
            junos:must "(".. reverse-oif-mapping")";
            junos:must-message "reverse-oif-mapping must be set";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 30";
              }
            }
            units "seconds";
            description
              "Timeout in seconds to credit back the bandwidth on the subscriber interface";
          }
    
          leaf no-qos-adjust {
            type empty;
            description
              "Disable QoS adjustment for this interface";
          }
        }  // grouping multicast_interface_options_type
    
        grouping network_type {
          leaf name {
            type jt:ipprefix;
            description "Network prefix";
          }
    
          uses apply-advanced;
    
          leaf-list dyn-tunnel-attribute-policy {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Import policy for dynamic-tunnel under this destination network";
          }
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of tunnel route under this destination network";
          }
    
          leaf-list colors {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            ordered-by user;
            description
              "Set of color list that will be supported for tunnel creation";
          }
        }  // grouping network_type
    
        grouping next_hop_group_intf_type {
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface through which to send sampled traffic";
          }
    
          uses apply-advanced;
    
          list next-hop {
            junos:must "((".. .. group-type inet" || ".. .. group-type inet6"))";
            junos:must-message "Next-hop can be specified only for group-type inet or inet6";
            key "name";
            ordered-by user;
            description
              "Address of next hop through which to send sampled traffic";
            uses next_hop_type;
          }  // list next-hop
        }  // grouping next_hop_group_intf_type
    
        grouping next_hop_subgroup_intf_type {
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface through which to send sampled traffic";
          }
    
          uses apply-advanced;
    
          list next-hop {
            junos:must "((".. .. .. group-type inet" || ".. .. .. group-type inet6"))";
            junos:must-message "Next-hop can be specified only for group-type inet or inet6";
            key "name";
            ordered-by user;
            description
              "Address of next hop through which to send sampled traffic";
            uses next_hop_type;
          }  // list next-hop
        }  // grouping next_hop_subgroup_intf_type
    
        grouping next_hop_type {
          description
            "Address of next hop through which to send sampled traffic";
          leaf name {
            type jt:ipaddr;
          }
    
          uses apply-advanced;
        }  // grouping next_hop_type
    
        grouping override-local-server-type {
          description "DHCP override processing";
          uses apply-advanced;
    
          leaf interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of clients allowed on an interface";
          }
    
          leaf no-arp {
            junos:must "((!(".. route-suppression destination") && !(".. route-suppression access-internal")))";
            junos:must-message "Cannot specify route-suppression with overrides no-arp";
            type empty;
            status deprecated;
            description
              "Disable DHCP ARP table population";
          }
    
          leaf bootp-support {
            type empty;
            description
              "Allow processing of bootp requests";
          }
    
          container client-discover-match {
            presence
              "enable client-discover-match";
            description
              "Use secondary match criteria for DISCOVER PDU";
            choice match-with {
              leaf option60-and-option82 {
                type empty;
                description
                  "Use option 60 and option 82";
              }
              leaf incoming-interface {
                type empty;
                description
                  "Use incoming interface";
              }
            }  // choice match-with
          }  // container client-discover-match
    
          container delay-offer {
            description
              "Filter options for dhcp-server";
            uses dhcpv4-filter-option;
          }  // container delay-offer
    
          container process-inform {
            presence "enable process-inform";
            description "Process INFORM PDUs";
            uses apply-advanced;
    
            leaf pool {
              type string {
                length "1 .. 64";
              }
              description
                "Pool name for family inet";
            }
          }  // container process-inform
    
          container include-option-82 {
            description
              "Include option-82 in reply packets";
            uses apply-advanced;
    
            leaf nak {
              type empty;
              description
                "Include option-82 in NAK";
            }
    
            leaf forcerenew {
              type empty;
              description
                "Include option-82 in FORCERENEW";
            }
          }  // container include-option-82
    
          leaf delete-binding-on-renegotiation {
            type empty;
            description
              "Delete binding on renegotiation";
          }
    
          leaf allow-no-end-option {
            type empty;
            description
              "Allow packets without end-of-option";
          }
    
          leaf asymmetric-lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "600 .. 86400";
              }
            }
            units "seconds";
            description
              "Use a reduced lease time for the client. In seconds";
          }
    
          leaf protocol-attributes {
            type string {
              length "1 .. 64";
            }
            description
              "DHCPv4 attributes to use as defined under access protocol-attributes";
          }
    
          leaf dual-stack {
            type string {
              length "1 .. 64";
            }
            description
              "Dual stack group to use";
          }
        }  // grouping override-local-server-type
    
        grouping dhcpv4-filter-option {
          description
            "Generic DHCPv4 filter processing";
          uses apply-advanced;
    
          leaf delay-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 30";
              }
            }
            units "seconds";
            default "3";
            description
              "Time delay between discover and offer";
          }
    
          container based-on {
            description "Option number";
            uses apply-advanced;
    
            container option-82 {
              presence "enable option-82";
              description "Option 82";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-82
    
            container option-60 {
              presence "enable option-60";
              description "Option 60";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-60
    
            container option-77 {
              presence "enable option-77";
              description "Option 77";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-77
          }  // container based-on
        }  // grouping dhcpv4-filter-option
    
        grouping override-type {
          description "DHCP override processing";
          uses apply-advanced;
    
          leaf no-unicast-replies {
            junos:must "(!(".. layer2-unicast-replies"))";
            junos:must-message "no-unicast-replies cannot be configured with layer2-unicast-replies";
            type empty;
            description
              "Overwrite unicast bit in incoming packet, when present";
          }
    
          choice allow-snooped-clients-choice {
            leaf allow-snooped-clients {
              type empty;
              description
                "Allow client creation from snooped PDUs";
            }
            leaf no-allow-snooped-clients {
              type empty;
              description
                "Don't allow client creation from snooped PDUs";
            }
          }  // choice allow-snooped-clients-choice
    
          leaf allow-no-end-option {
            type empty;
            description
              "Allow packets without end-of-option";
          }
    
          leaf always-write-giaddr {
            type empty;
            description
              "Overwrite existing 'giaddr' field, when present";
          }
    
          container always-write-option-82 {
            presence
              "enable always-write-option-82";
            description
              "Overwrite existing value of option 82, when present";
            uses write-option-82-type;
          }  // container always-write-option-82
    
          leaf user-defined-option-82 {
            type string {
              length "1 .. 252";
            }
            description
              "Set user defined description for option-82";
          }
    
          leaf layer2-unicast-replies {
            junos:must "(!(".. no-unicast-replies"))";
            junos:must-message "layer2-unicast-replies cannot be configured with no-unicast-replies";
            type empty;
            description
              "Do not broadcast client responses";
          }
    
          leaf trust-option-82 {
            type empty;
            description
              "Trust options-82 option";
          }
    
          leaf delay-authentication {
            type empty;
            description
              "Delay subscriber authentication in DHCP protocol processing until request packet";
          }
    
          leaf disable-relay {
            type empty;
            description
              "Disable DHCP relay processing";
          }
    
          leaf no-bind-on-request {
            type empty;
            description
              "Do not bind if stray DHCP request is received";
          }
    
          leaf interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of client allowed on an interface";
          }
    
          leaf no-arp {
            junos:must "((!(".. route-suppression destination") && !(".. route-suppression access-internal")))";
            junos:must-message "Cannot specify route-suppression with overrides no-arp";
            type empty;
            status deprecated;
            description
              "Disable DHCP ARP table population";
          }
    
          leaf bootp-support {
            type empty;
            description
              "Allows relay of bootp req and reply";
          }
    
          leaf dual-stack {
            type string {
              length "1 .. 64";
            }
            description
              "Dual stack group to use.";
          }
    
          container client-discover-match {
            presence
              "enable client-discover-match";
            description
              "Use secondary match criteria for DISCOVER PDU";
            choice match-with {
              leaf option60-and-option82 {
                type empty;
                description
                  "Use option 60 and option 82";
              }
              leaf incoming-interface {
                type empty;
                description
                  "Use incoming interface";
              }
            }  // choice match-with
          }  // container client-discover-match
    
          container proxy-mode {
            presence "enable proxy-mode";
            description
              "Put the relay in proxy mode";
          }  // container proxy-mode
    
          leaf asymmetric-lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "600 .. 86400";
              }
            }
            units "seconds";
            description
              "Use a reduced lease time for the client. In seconds";
          }
    
          container replace-ip-source-with {
            description
              "Replace IP source address in request and release packets";
            choice replacement-type {
              leaf giaddr {
                type empty;
                description
                  "Replace IP source address with giaddr";
              }
            }  // choice replacement-type
          }  // container replace-ip-source-with
    
          leaf send-release-on-delete {
            type empty;
            description
              "Always send RELEASE to the server when a binding is deleted";
          }
    
          leaf apply-secondary-as-giaddr {
            type empty;
            description
              "Enable DHCP relay to use secondary gateway ip for relay interfaces";
          }
    
          leaf relay-source {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface for relay source";
          }
    
          leaf delete-binding-on-renegotiation {
            type empty;
            description
              "Delete binding on rengotiation";
          }
        }  // grouping override-type
    
        grouping p2mp_ldp_lsp_nh_obj {
          uses apply-advanced;
    
          list root-address {
            key "name";
            description
              "Configure the root address of P2MP LSP";
            leaf name {
              type jt:ipaddr;
              description
                "Root address of the P2MP LSP";
            }
    
            uses apply-advanced;
    
            leaf lsp-id {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Configure the generic LSP identifier";
            }
    
            list group-address {
              key "name";
              description
                "IPv4/Ipv6 group address for mLDP LSP";
              leaf name {
                type jt:ipaddr;
                description
                  "IPv4/Ipv6 group address";
              }
    
              uses apply-advanced;
    
              list source-address {
                key "name";
                description
                  "IPv4/Ipv6 source address";
                leaf name {
                  type jt:ipaddr;
                  description
                    "IPv4/Ipv6 source address for mLDP LSP";
                }
    
                uses apply-advanced;
              }  // list source-address
            }  // list group-address
          }  // list root-address
        }  // grouping p2mp_ldp_lsp_nh_obj
    
        grouping packet-capture-egress-intf-type {
          uses apply-advanced;
    
          list interface {
            key "name";
            description "Interface options";
            leaf name {
              type union {
                type jt:interface-device;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
          }  // list interface
        }  // grouping packet-capture-egress-intf-type
    
        grouping packet_accounting_output_type {
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          list cflowd {
            junos:must "(all ".. interface <*> source-address")";
            junos:must-message "'forwarding-options accounting output interface source-address' must be specified with 'flow-server' and 'interface'";
            junos:must "(any ".. interface <*>")";
            junos:must-message "'forwarding-options accounting output interface' must be specified";
            key "name";
            description
              "Cflowd collector where flow records are sent";
            uses cflowd_packet_accounting_type;
          }  // list cflowd
    
          list interface {
            key "name";
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
        }  // grouping packet_accounting_output_type
    
        grouping cflowd_packet_accounting_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf version {
            type enumeration {
              enum "5" {
                value 0;
                description
                  "Export cflowd aggregates in version 5 format";
              }
              enum "8" {
                value 1;
                description
                  "Export cflowd aggregates in version 8 format";
              }
            }
            default "5";
            description
              "Format of exported cflowd aggregates";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
        }  // grouping cflowd_packet_accounting_type
    
        grouping aggregation_type {
          uses apply-advanced;
    
          leaf autonomous-system {
            type empty;
            description
              "Aggregate by autonomous system number";
          }
    
          leaf protocol-port {
            type empty;
            description
              "Aggregate by protocol and port number";
          }
    
          leaf source-prefix {
            type empty;
            description
              "Aggregate by source prefix";
          }
    
          leaf destination-prefix {
            type empty;
            description
              "Aggregate by destination prefix";
          }
    
          container source-destination-prefix {
            presence
              "enable source-destination-prefix";
            description
              "Aggregate by source and destination prefix";
            uses apply-advanced;
    
            leaf caida-compliant {
              type empty;
              description
                "Compatible with Caida record format for prefix aggregation (v8)";
            }
          }  // container source-destination-prefix
        }  // grouping aggregation_type
    
        grouping packet_export_intf_type {
          leaf name {
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interfaces used to send monitored information";
          }
    
          uses apply-advanced;
    
          leaf engine-id {
            type union {
              type uint8;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Identity (number) of this accounting interface";
          }
    
          leaf engine-type {
            type union {
              type uint8;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Type (number) of this accounting interface";
          }
    
          leaf source-address {
            type jt:ipaddr;
            description
              "Address to use for generating monitored packets";
          }
        }  // grouping packet_export_intf_type
    
        grouping periodic_oam {
          uses apply-advanced;
    
          container mpls-tp-mode {
            presence "enable mpls-tp-mode";
            description
              "MPLS-TP Mode, Do not use IP addressing for OAM";
            uses apply-advanced;
    
            container lsping-channel-type {
              description
                "Supported Control-channel types for MPLS-TP mode....";
              uses apply-advanced;
    
              choice action-choice {
                leaf ipv4 {
                  type empty;
                  description
                    "Use channel-type IPv4(0x0021), With IP-UDP encapsulation";
                }
                leaf on-demand-cv {
                  type empty;
                  description
                    "Use channel-type On-Demand-CV(0x0025), Without IP-UDP encapsulation";
                }
              }  // choice action-choice
            }  // container lsping-channel-type
          }  // container mpls-tp-mode
    
          container bfd-port {
            description
              "Egress knob to select MHOP-BFD port for MPLS BFD";
            uses apply-advanced;
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
          }  // container bfd-port
    
          container bfd-liveness-detection {
            description
              "Bidirectional Forwarding Detection options";
            uses apply-advanced;
    
            leaf version {
              type enumeration {
                enum "0" {
                  value 0;
                  description
                    "BFD version 0 (deprecated)";
                }
                enum "1" {
                  value 1;
                  description "BFD version 1";
                }
                enum "automatic" {
                  value 2;
                  description
                    "Choose BFD version automatically";
                }
              }
              default "automatic";
              description
                "BFD protocol version number";
            }
    
            leaf minimum-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum transmit and receive interval";
            }
    
            leaf minimum-transmit-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              status deprecated;
              description
                "Minimum transmit interval";
            }
    
            leaf minimum-receive-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum receive interval";
            }
    
            leaf multiplier {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255";
                }
              }
              default "3";
              description
                "Detection time multiplier";
            }
    
            choice adaptation-choice {
              leaf no-adaptation {
                type empty;
                description "Disable adaptation";
              }
            }  // choice adaptation-choice
    
            container transmit-interval {
              description
                "Transmit-interval options";
              uses apply-advanced;
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit interval";
              }
    
              leaf threshold {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "milliseconds";
                description
                  "High transmit interval triggering a trap";
              }
            }  // container transmit-interval
    
            container detection-time {
              description
                "Detection-time options";
              uses apply-advanced;
    
              leaf threshold {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "milliseconds";
                description
                  "High detection-time triggering a trap";
              }
            }  // container detection-time
    
            container failure-action {
              description
                "Action to take when BFD session goes down";
              choice action-choice {
                leaf teardown {
                  type empty;
                  description
                    "Teardown label switched path and resignal";
                }
                container make-before-break {
                  presence
                    "enable make-before-break";
                  description
                    "Resignal the label switched path before teardown";
                  uses apply-advanced;
    
                  leaf teardown-timeout {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 30";
                      }
                    }
                    units "seconds";
                    description
                      "Time to wait before teardown";
                  }
                }  // container make-before-break
              }  // choice action-choice
            }  // container failure-action
    
            leaf no-router-alert-option {
              type empty;
              description
                "Do not set Router-Alert options in IP header for MPLS-BFD";
            }
    
            leaf use-ip-ttl-1 {
              type empty;
              description
                "Set TTL value to 1 in IP header for MPLS-BFD";
            }
          }  // container bfd-liveness-detection
    
          container performance-monitoring {
            description
              "Performance monitoring options";
            uses apply-advanced;
    
            container traceoptions {
              description "Trace options for PM";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "init" {
                      value 0;
                      description
                        "Trace init commnad";
                    }
                    enum "error" {
                      value 1;
                      description
                        "Trace error conditions";
                    }
                    enum "event" {
                      value 2;
                      description
                        "Trace state machine events";
                    }
                    enum "general" {
                      value 3;
                      description
                        "Trace general events";
                    }
                    enum "packet" {
                      value 4;
                      description
                        "Trace various packets ";
                    }
                    enum "timer" {
                      value 5;
                      description
                        "Trace timer processing";
                    }
                    enum "all" {
                      value 6;
                      description
                        "Trace everything";
                    }
                  }
                }
              }  // list flag
            }  // container traceoptions
    
            container querier {
              junos:must "(".. .. .. ultimate-hop-popping")";
              junos:must-message "Performance monitoring can be configured only on ultimate-hop-popping LSPs";
              junos:must "(".. .. .. associate-lsp")";
              junos:must-message "Performance monitoring can be configured only for associated LSPs";
              description "Querier options";
              uses apply-advanced;
    
              container loss {
                description
                  "Loss measurement options";
                uses apply-advanced;
    
                list traffic-class {
                  key "name";
                  description
                    "Traffic class specific options";
                  leaf name {
                    type enumeration {
                      enum "tc-0" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 0;
                        description
                          "Traffic class 0";
                      }
                      enum "tc-1" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 1;
                        description
                          "Traffic class 1";
                      }
                      enum "tc-2" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 2;
                        description
                          "Traffic class 2";
                      }
                      enum "tc-3" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 3;
                        description
                          "Traffic class 3";
                      }
                      enum "tc-4" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 4;
                        description
                          "Traffic class 4";
                      }
                      enum "tc-5" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 5;
                        description
                          "Traffic class 5";
                      }
                      enum "tc-6" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 6;
                        description
                          "Traffic class 6";
                      }
                      enum "tc-7" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 7;
                        description
                          "Traffic class 7";
                      }
                      enum "all" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 8;
                        description
                          "All Traffic class";
                      }
                      enum "none" {
                        value 9;
                        description
                          "No Traffic class";
                      }
                    }
                    description
                      "Traffic class value";
                  }
    
                  uses apply-advanced;
    
                  leaf query-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range
                          "1000 .. 4294967295";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf measurement-quantity {
                    type enumeration {
                      enum "bytes" {
                        value 0;
                        description
                          "Byte loss measurement";
                      }
                      enum "packets" {
                        value 1;
                        description
                          "Packet loss measurement";
                      }
                    }
                    default "packets";
                    description
                      "Loss measurement quantity";
                  }
    
                  leaf average-sample-size {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 30";
                      }
                    }
                    description
                      "Number of samples used in average calculation";
                  }
    
                  leaf loss-threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    description
                      "Loss threshold value";
                  }
    
                  leaf loss-threshold-window {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 30";
                      }
                    }
                    description
                      "Number of samples for loss threshold calculation";
                  }
                }  // list traffic-class
              }  // container loss
    
              container delay {
                description
                  "Delay measurement options";
                uses apply-advanced;
    
                list traffic-class {
                  key "name";
                  description
                    "Traffic class specific options";
                  leaf name {
                    type enumeration {
                      enum "tc-0" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 0;
                        description
                          "Traffic class 0";
                      }
                      enum "tc-1" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 1;
                        description
                          "Traffic class 1";
                      }
                      enum "tc-2" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 2;
                        description
                          "Traffic class 2";
                      }
                      enum "tc-3" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 3;
                        description
                          "Traffic class 3";
                      }
                      enum "tc-4" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 4;
                        description
                          "Traffic class 4";
                      }
                      enum "tc-5" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 5;
                        description
                          "Traffic class 5";
                      }
                      enum "tc-6" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 6;
                        description
                          "Traffic class 6";
                      }
                      enum "tc-7" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 7;
                        description
                          "Traffic class 7";
                      }
                      enum "all" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 8;
                        description
                          "All Traffic classes";
                      }
                    }
                    description
                      "Traffic class value";
                  }
    
                  uses apply-advanced;
    
                  leaf query-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range
                          "1000 .. 4294967295";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf padding-size {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 1500";
                      }
                    }
                    description
                      "Size of padding";
                  }
    
                  leaf average-sample-size {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 30";
                      }
                    }
                    description
                      "Number of samples used in average calculation";
                  }
    
                  leaf twcd-delay-threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    units "microseconds";
                    description
                      "Two way channel delay threshold value";
                  }
    
                  leaf rtt-delay-threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    units "microseconds";
                    description
                      "Round trip delay threshold value";
                  }
                }  // list traffic-class
              }  // container delay
    
              container loss-delay {
                description
                  "Combined loss-delay measurement options";
                uses apply-advanced;
    
                list traffic-class {
                  key "name";
                  description
                    "Traffic class specific options";
                  leaf name {
                    type enumeration {
                      enum "tc-0" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 0;
                        description
                          "Traffic class 0";
                      }
                      enum "tc-1" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 1;
                        description
                          "Traffic class 1";
                      }
                      enum "tc-2" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 2;
                        description
                          "Traffic class 2";
                      }
                      enum "tc-3" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 3;
                        description
                          "Traffic class 3";
                      }
                      enum "tc-4" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 4;
                        description
                          "Traffic class 4";
                      }
                      enum "tc-5" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 5;
                        description
                          "Traffic class 5";
                      }
                      enum "tc-6" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 6;
                        description
                          "Traffic class 6";
                      }
                      enum "tc-7" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 7;
                        description
                          "Traffic class 7";
                      }
                      enum "all" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 8;
                        description
                          "All Traffic classes";
                      }
                      enum "none" {
                        value 9;
                        description
                          "No Traffic class";
                      }
                    }
                    description
                      "Traffic class value";
                  }
    
                  uses apply-advanced;
    
                  leaf query-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range
                          "1000 .. 4294967295";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf measurement-quantity {
                    type enumeration {
                      enum "bytes" {
                        value 0;
                        description
                          "Byte loss measurement";
                      }
                      enum "packets" {
                        value 1;
                        description
                          "Packet loss measurement";
                      }
                    }
                    default "packets";
                    description
                      "Loss measurement quantity";
                  }
    
                  leaf padding-size {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 1500";
                      }
                    }
                    description
                      "Size of padding";
                  }
    
                  leaf average-sample-size {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 30";
                      }
                    }
                    description
                      "Number of samples used in average calculation";
                  }
    
                  leaf loss-threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    description
                      "Loss threshold value";
                  }
    
                  leaf loss-threshold-window {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 30";
                      }
                    }
                    description
                      "Number of samples for loss threshold calculation";
                  }
    
                  leaf twcd-delay-threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    units "microseconds";
                    description
                      "Two way channel delay threshold value";
                  }
    
                  leaf rtt-delay-threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    units "microseconds";
                    description
                      "Round trip delay threshold value";
                  }
                }  // list traffic-class
              }  // container loss-delay
            }  // container querier
    
            container responder {
              junos:must "(".. .. .. ultimate-hop-popping")";
              junos:must-message "Performance monitoring can be configured only on ultimate-hop-popping LSPs";
              junos:must "(".. .. .. associate-lsp")";
              junos:must-message "Performance monitoring can be configured only for associated LSPs";
              description "Responder options";
              uses apply-advanced;
    
              container loss {
                description
                  "Loss measurement options";
                uses apply-advanced;
    
                leaf min-query-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1000 .. 4294967295";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum query interval";
                }
              }  // container loss
    
              container delay {
                description
                  "Delay measurement options";
                uses apply-advanced;
    
                leaf min-query-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1000 .. 4294967295";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum query interval";
                }
              }  // container delay
            }  // container responder
          }  // container performance-monitoring
    
          leaf lsp-ping-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "30 .. 3600";
              }
            }
            units "seconds";
            description
              "Time interval between LSP ping messages";
          }
    
          leaf lsp-ping-multiplier {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "1 .. 5";
              }
            }
            description
              "Number of ping reply missed before declaring BFD down";
          }
    
          container traceoptions {
            description
              "Trace options for MPLSOAM process";
            uses apply-advanced;
    
            leaf no-remote-trace {
              junos:must "("system tracing")";
              junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
              type empty;
              description
                "Disable remote tracing";
            }
    
            container file {
              description
                "Trace file information";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "3";
                description
                  "Maximum number of trace files";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
    
              leaf match {
                type jt:regular-expression;
                description
                  "Regular expression for lines to be logged";
              }
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "configuration" {
                    value 0;
                    description
                      "Trace configuration events";
                  }
                  enum "pipe" {
                    value 1;
                    description
                      "Trace pipe activity";
                  }
                  enum "rpc-packet-details" {
                    value 2;
                    description
                      "Trace RPC packet details";
                  }
                  enum "database" {
                    value 3;
                    description
                      "Trace database activity";
                  }
                  enum "network" {
                    value 4;
                    description
                      "Trace network activity";
                  }
                  enum "traceroute" {
                    value 5;
                    description
                      "Trace traceroute activity";
                  }
                  enum "all" {
                    value 6;
                    description
                      "Trace everything";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
        }  // grouping periodic_oam
    
        grouping pim_bootstrap_options_type {
          uses apply-advanced;
    
          leaf priority {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 255";
              }
            }
            description
              "Eligibility to be the bootstrap router";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Bootstrap import policy";
          }
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Bootstrap export policy";
          }
        }  // grouping pim_bootstrap_options_type
    
        grouping pim_filter_obj {
          description
            "Filter to apply to tracing";
          leaf match-on {
            type enumeration {
              enum "prefix" {
                value 0;
                description
                  "Filter based on prefix";
              }
            }
            description
              "Argument on which to match";
          }
    
          leaf-list policy {
            type jt:policy-algebra;
            ordered-by user;
            description "Filter policy";
          }
        }  // grouping pim_filter_obj
    
        grouping pim_rp_group_range_type {
          leaf name {
            type jt:ipprefix;
          }
    
          uses apply-advanced;
    
          leaf nexthop-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1000";
              }
            }
            units "milliseconds";
            description
              "Nexthop hold time in milliseconds";
          }
        }  // grouping pim_rp_group_range_type
    
        grouping pm-rspan-vlan {
          description "RSPAN vlan for pm";
          leaf name {
            junos:must "(!("vlans $$ forwarding-options filter"))";
            junos:must-message "A vlan cannot both be an analyzer output vlan and have a filter applied to it.";
            type string;
            description "VLAN name or VLAN id";
          }
    
          uses apply-advanced;
    
          leaf no-tag {
            type empty;
            description
              "Removes extra RSPAN tag from mirrored packets";
          }
        }  // grouping pm-rspan-vlan
    
        grouping pm_family_input_type {
          description
            "Input options for port mirroring";
          uses apply-advanced;
    
          leaf rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            description
              "Ratio of packets to be sampled (1 out of N)";
          }
    
          leaf run-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 20";
              }
            }
            description
              "Number of samples after initial trigger";
          }
    
          leaf maximum-packet-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 9216";
              }
            }
            units "bytes";
            default "0";
            description
              "Maximum length of the mirrored packet";
          }
        }  // grouping pm_family_input_type
    
        grouping programmable-rpd-type {
          uses apply-advanced;
    
          container traceoptions {
            description "Trace options";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "client" {
                    value 0;
                    description "Client events";
                  }
                  enum "japi" {
                    value 1;
                    description
                      "JAPI related traces";
                  }
                  enum "routing-interface" {
                    value 2;
                    description
                      "Routing interface traces";
                  }
                  enum "route" {
                    value 3;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 4;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 5;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 6;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 7;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 8;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 9;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 10;
                    description
                      "Trace everything";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
    
          container purge-timeout {
            presence "enable purge-timeout";
            description
              "Purge timeout for all programmable-rpd clients in seconds";
            choice purge-parm {
              leaf never {
                type empty;
                description
                  "Client programmed objects are never purged";
              }
              leaf timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 604800";
                  }
                }
                units "seconds";
                description
                  "Timeout value, in seconds, for purging client programmed objects";
              }
            }  // choice purge-parm
          }  // container purge-timeout
    
          list client {
            key "name";
            ordered-by user;
            description
              "Programmable-rpd client options";
            leaf name {
              type string {
                length "1 .. 255";
              }
              description "Client ID";
            }
    
            uses apply-advanced;
    
            list interface-notification {
              key "name";
              ordered-by user;
              description
                "Interfaces for notification";
              leaf name {
                type string {
                  length "1 .. 32";
                }
                description "Interface";
              }
    
              uses apply-advanced;
            }  // list interface-notification
          }  // list client
    
          container rib-service {
            presence "enable rib-service";
            description
              "RIB service API options";
            uses apply-advanced;
    
            container dynamic-next-hop-interface {
              presence
                "enable dynamic-next-hop-interface";
              description
                "Update routes for next-hop interface changes";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable dynamic next-hop interface handling";
                }
              }  // choice enable-disable
            }  // container dynamic-next-hop-interface
          }  // container rib-service
        }  // grouping programmable-rpd-type
    
        grouping qualified_nh_obj {
          leaf name {
            type union {
              type jt:ipaddr-or-interface;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Next hop to destination";
          }
    
          uses apply-advanced;
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of qualified next hop";
          }
    
          leaf metric {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Metric of qualified next hop";
          }
    
          leaf interface {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface of qualified next hop";
          }
    
          leaf mac-address {
            type jt:mac-unicast;
            description "Next-hop Mac Address";
          }
    
          leaf tag {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Tag string";
          }
    
          container bfd-liveness-detection {
            description
              "Bidirectional Forwarding Detection (BFD) options";
            uses apply-advanced;
    
            leaf version {
              type enumeration {
                enum "0" {
                  value 0;
                  description
                    "BFD version 0 (deprecated)";
                }
                enum "1" {
                  value 1;
                  description "BFD version 1";
                }
                enum "automatic" {
                  value 2;
                  description
                    "Choose BFD version automatically";
                }
              }
              default "automatic";
              description
                "BFD protocol version number";
            }
    
            leaf minimum-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum transmit and receive interval";
            }
    
            leaf minimum-transmit-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              status deprecated;
              description
                "Minimum transmit interval";
            }
    
            leaf minimum-receive-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum receive interval";
            }
    
            leaf multiplier {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255";
                }
              }
              default "3";
              description
                "Detection time multiplier";
            }
    
            choice adaptation-choice {
              leaf no-adaptation {
                type empty;
                description "Disable adaptation";
              }
            }  // choice adaptation-choice
    
            container transmit-interval {
              description
                "Transmit-interval options";
              uses apply-advanced;
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit interval";
              }
    
              leaf threshold {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "milliseconds";
                description
                  "High transmit interval triggering a trap";
              }
            }  // container transmit-interval
    
            container detection-time {
              description
                "Detection-time options";
              uses apply-advanced;
    
              leaf threshold {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "milliseconds";
                description
                  "High detection-time triggering a trap";
              }
            }  // container detection-time
    
            container authentication {
              description
                "Authentication options";
              uses apply-advanced;
    
              leaf key-chain {
                junos:must "(".. algorithm")";
                junos:must-message "May not be configured without algorithm";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string;
                description "Key chain name";
              }
    
              leaf algorithm {
                junos:must "(".. key-chain")";
                junos:must-message "May not be configured without key-chain";
                type enumeration {
                  enum "simple-password" {
                    value 0;
                    description
                      "Simple password";
                  }
                  enum "keyed-md5" {
                    value 1;
                    description
                      "Keyed message Digest 5";
                  }
                  enum "meticulous-keyed-md5" {
                    value 2;
                    description
                      "Meticulous keyed message Digest 5";
                  }
                  enum "keyed-sha-1" {
                    value 3;
                    description
                      "Keyed secure hash algorithm (SHA1) ";
                  }
                  enum "meticulous-keyed-sha-1" {
                    value 4;
                    description
                      "Meticulous keyed secure hash algorithm (SHA1) ";
                  }
                }
                description "Algorithm name";
              }
    
              leaf loose-check {
                type empty;
                description
                  "Verify authentication only if authentication is negotiated";
              }
            }  // container authentication
    
            leaf neighbor {
              type jt:ipaddr;
              description "BFD neighbor address";
            }
    
            leaf local-address {
              type jt:ipaddr;
              description
                "BFD local address (for multihop only)";
            }
    
            leaf holddown-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Time to hold the session-UP notification to the client";
            }
    
            leaf minimum-receive-ttl {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 255";
                }
              }
              description
                "Minimum receive TTL below which to drop";
            }
          }  // container bfd-liveness-detection
        }  // grouping qualified_nh_obj
    
        grouping reconfigure-trigger-type {
          description "DHCP reconfigure trigger";
          uses apply-advanced;
    
          leaf radius-disconnect {
            type empty;
            description
              "Trigger DHCP reconfigure by radius initiated disconnect";
          }
        }  // grouping reconfigure-trigger-type
    
        grouping reconfigure-type {
          description
            "DHCP reconfigure processing";
          uses apply-advanced;
    
          leaf clear-on-abort {
            type empty;
            description
              "Delete client on reconfiguration abort";
          }
    
          leaf attempts {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            description
              "Number of reconfigure attempts before aborting";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            description
              "Initial timeout value for retry";
          }
    
          leaf token {
            type string {
              length "1 .. 244";
            }
            description "Reconfigure token";
          }
    
          container trigger {
            description
              "DHCP reconfigure trigger";
            uses reconfigure-trigger-type;
          }  // container trigger
    
          leaf support-option-pd-exclude {
            type empty;
            description
              "Request prefix exclude option in reconfigure message";
          }
        }  // grouping reconfigure-type
    
        grouping relay-active-leasequery-v4-type {
          description
            "Configure active leasequery";
          uses apply-advanced;
    
          leaf topology-discover {
            junos:must "(".. peer-address")";
            junos:must-message "Must configure [peer-address] to configure topology-discover";
            type empty;
            description "Topology discovery";
          }
    
          list peer-address {
            key "name";
            ordered-by user;
            description "Server ip address";
            leaf name {
              type jt:ipaddr;
              description "Peer ip address";
            }
    
            uses apply-advanced;
          }  // list peer-address
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 3600";
              }
            }
            units "seconds";
            default "120";
            description
              "Read/write timeout in seconds";
          }
    
          leaf idle-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 3600";
              }
            }
            units "seconds";
            default "60";
            description
              "Idle timeout in seconds";
          }
        }  // grouping relay-active-leasequery-v4-type
    
        grouping relay-active-leasequery-v6-type {
          description
            "Configure active leasequery";
          uses apply-advanced;
    
          leaf topology-discover {
            junos:must "(".. peer-address")";
            junos:must-message "Must configure [peer-address] to configure topology-discover";
            type empty;
            description "Topology discovery";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 3600";
              }
            }
            units "seconds";
            default "120";
            description
              "Read/write timeout in seconds";
          }
    
          leaf idle-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 3600";
              }
            }
            units "seconds";
            default "60";
            description
              "Idle timeout in seconds";
          }
    
          list peer-address {
            key "name";
            ordered-by user;
            description "Peer ipv6 address";
            leaf name {
              type jt:ipv6addr;
              description "Peer ipv6 address";
            }
    
            uses apply-advanced;
          }  // list peer-address
        }  // grouping relay-active-leasequery-v6-type
    
        grouping relay-bulk-leasequery-v4-type {
          junos:must "(".. overrides always-write-option-82")";
          junos:must-message "Must configure [overrides always-write-option-82] to overwrite circuit-id for bulk-leasequery";
          junos:must "((".. relay-option-82 circuit-id" && !((".. relay-option-82 circuit-id use-interface-description" || ".. relay-option-82 circuit-id require-interface-description"))))";
          junos:must-message "Must configure [relay-option-82 circuit-id] without description to insert circuit-id for bulk-leasequery";
          description
            "Configure bulk leasequery";
          uses apply-advanced;
    
          leaf attempts {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 720";
              }
            }
            default "360";
            description
              "Number of retry attempts";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            units "seconds";
            default "10";
            description "Number of seconds";
          }
        }  // grouping relay-bulk-leasequery-v4-type
    
        grouping relay-bulk-leasequery-v6-type {
          junos:must "(".. relay-agent-interface-id")";
          junos:must-message "Must configure [relay-agent-interface-id] to insert interface-id for bulk-leasequery";
          description
            "Configure bulk leasequery";
          uses apply-advanced;
    
          leaf attempts {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            default "6";
            description
              "Number of retry attempts";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            units "seconds";
            default "10";
            description "Number of seconds";
          }
    
          container trigger {
            description
              "Trigger for bulk leasequery";
            leaf automatic {
              type empty;
              description
                "Trigger automatically";
            }
          }  // container trigger
        }  // grouping relay-bulk-leasequery-v6-type
    
        grouping relay-leasequery-type {
          description "Configure leasequery";
          uses apply-advanced;
    
          leaf attempts {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            default "6";
            description
              "Number of retry attempts";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            units "seconds";
            default "10";
            description "Number of seconds";
          }
        }  // grouping relay-leasequery-type
    
        grouping relay-option-60-type-group {
          description
            "DHCP option-60 processing";
          uses apply-advanced;
    
          container vendor-option {
            description "Add vendor option";
            uses apply-advanced;
    
            container equals {
              description "Option 60 equals";
              uses relay-option-60-match-group;
            }  // container equals
    
            container not-equals {
              status deprecated;
              description
                "Option 60 does not equal";
              uses relay-option-60-match-group;
            }  // container not-equals
    
            container starts-with {
              description
                "Option 60 starts with";
              uses relay-option-60-match-group;
            }  // container starts-with
    
            choice server-group-choice {
              leaf default-relay-server-group {
                junos:must "(".. .. .. .. server-group $$")";
                junos:must-message "Referenced group must be defined under [edit dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is not made";
              }
              leaf default-local-server-group {
                junos:must "(".. .. .. .. .. .. system services dhcp-local-server group $$")";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is not made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is not made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is not made";
              }
            }  // choice server-group-choice
          }  // container vendor-option
        }  // grouping relay-option-60-type-group
    
        grouping relay-option-60-match-group {
          uses apply-advanced;
    
          list ascii {
            key "name";
            description "ASCII string";
            leaf name {
              type string {
                length "1 .. 256";
              }
              description "ASCII string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "(".. .. .. .. .. .. server-group $$")";
                junos:must-message "Referenced group must be defined under [edit forwarding options dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf local-server-group {
                junos:must "(".. .. .. .. .. .. .. .. system services dhcp-local-server group $$")";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list ascii
    
          list hexadecimal {
            key "name";
            description "Hexadecimal string";
            leaf name {
              type string {
                junos:posix-pattern "^[[:xdigit:]]+$";
                junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                length "1 .. 512";
              }
              description "Hexadecimal string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "(".. .. .. .. .. .. server-group $$")";
                junos:must-message "Referenced group must be defined under [edit forwarding-options dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf local-server-group {
                junos:must "(".. .. .. .. .. .. .. .. system services dhcp-local-server group $$")";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list hexadecimal
        }  // grouping relay-option-60-match-group
    
        grouping relay-option-60-type-top {
          description
            "DHCP option-60 processing";
          uses apply-advanced;
    
          container vendor-option {
            description "Add vendor option";
            uses apply-advanced;
    
            container equals {
              description "Option 60 equals";
              uses relay-option-60-match-top;
            }  // container equals
    
            container not-equals {
              status deprecated;
              description
                "Option 60 does not equal";
              uses relay-option-60-match-top;
            }  // container not-equals
    
            container starts-with {
              description
                "Option 60 starts with";
              uses relay-option-60-match-top;
            }  // container starts-with
    
            choice server-group-choice {
              leaf default-relay-server-group {
                junos:must "(".. .. .. server-group $$")";
                junos:must-message "Referenced group must be defined under [edit dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is not made";
              }
              leaf default-local-server-group {
                junos:must "(".. .. .. .. .. system services dhcp-local-server group $$")";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is not made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is not made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is not made";
              }
            }  // choice server-group-choice
          }  // container vendor-option
        }  // grouping relay-option-60-type-top
    
        grouping relay-option-60-match-top {
          uses apply-advanced;
    
          list ascii {
            key "name";
            description "ASCII string";
            leaf name {
              type string {
                length "1 .. 256";
              }
              description "ASCII string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "(".. .. .. .. .. server-group $$")";
                junos:must-message "Referenced group must be defined under [edit forwarding options dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf local-server-group {
                junos:must "(".. .. .. .. .. .. .. system services dhcp-local-server group $$")";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list ascii
    
          list hexadecimal {
            key "name";
            description "Hexadecimal string";
            leaf name {
              type string {
                junos:posix-pattern "^[[:xdigit:]]+$";
                junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                length "1 .. 512";
              }
              description "Hexadecimal string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "(".. .. .. .. .. server-group $$")";
                junos:must-message "Referenced group must be defined under [edit forwarding-options dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf local-server-group {
                junos:must "(".. .. .. .. .. .. .. system services dhcp-local-server group $$")";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list hexadecimal
        }  // grouping relay-option-60-match-top
    
        grouping relay-option-82-type {
          description
            "DHCP option-82 processing";
          uses apply-advanced;
    
          container circuit-id {
            presence "enable circuit-id";
            description "Add circuit identifier";
            uses apply-advanced;
    
            container prefix {
              description
                "Add prefix to circuit/interface-id or remote-id";
              uses apply-advanced;
    
              leaf host-name {
                type empty;
                description
                  "Add router host name to circuit / interface-id or remote-id";
              }
    
              leaf logical-system-name {
                type empty;
                description
                  "Add logical system name to circuit / interface-id or remote-id";
              }
    
              leaf routing-instance-name {
                type empty;
                description
                  "Add routing instance name to circuit / interface-id or remote-id";
              }
            }  // container prefix
    
            leaf use-interface-description {
              junos:must "(!(".. require-interface-description"))";
              junos:must-message "use-interface-description may not be set with require-interface-desciption";
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface description";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface description";
                }
              }
              description
                "Use interface description instead of circuit identifier";
            }
    
            leaf use-vlan-id {
              junos:must "((!(".. no-vlan-interface-name") && (!(".. use-interface-description") && !(".. require-interface-description"))))";
              junos:must-message "Vlan-tag cannot be added as no-vlan-interface-name or interface-description is configured";
              type empty;
              description
                "Use VLAN id instead of name";
            }
    
            container vlan-id-only {
              junos:must "(!((".. include-irb-and-l2" || (".. keep-incoming-circuit-id" || (".. user-defined" || (".. no-vlan-interface-name" || (".. use-interface-description" || (".. use-vlan-id" || (".. prefix" || ".. require-interface-description")))))))))";
              junos:must-message "Vlan-id-only cannot be clubbed along with any other option-82 knob";
              presence "enable vlan-id-only";
              description "Use only VLAN id";
              uses apply-advanced;
            }  // container vlan-id-only
    
            leaf no-vlan-interface-name {
              type empty;
              description
                "Not include vlan or interface name";
            }
    
            leaf include-irb-and-l2 {
              type empty;
              description
                "Include IRB and L2 interface name";
            }
    
            leaf user-defined {
              junos:must "(!((".. include-irb-and-l2" || (".. keep-incoming-circuit-id" || (".. no-vlan-interface-name" || (".. use-interface-description" || (".. use-vlan-id" || (".. prefix" || ".. require-interface-description"))))))))";
              junos:must-message "The user defined description for option 82 must be defined in order to see the usage and doesnt coexist with prefix";
              type empty;
              description
                "Include user defined string";
            }
    
            leaf keep-incoming-circuit-id {
              type empty;
              description
                "Keep incoming circuit identifier";
            }
          }  // container circuit-id
    
          container remote-id {
            presence "enable remote-id";
            description "Add remote identifier";
            uses apply-advanced;
    
            container prefix {
              description
                "Add prefix to circuit/interface-id or remote-id";
              uses apply-advanced;
    
              leaf host-name {
                type empty;
                description
                  "Add router host name to circuit / interface-id or remote-id";
              }
    
              leaf logical-system-name {
                type empty;
                description
                  "Add logical system name to circuit / interface-id or remote-id";
              }
    
              leaf routing-instance-name {
                type empty;
                description
                  "Add routing instance name to circuit / interface-id or remote-id";
              }
            }  // container prefix
    
            leaf use-interface-description {
              junos:must "(!(".. require-interface-description"))";
              junos:must-message "use-interface-description may not be set with require-interface-desciption";
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface description";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface description";
                }
              }
              description
                "Use interface description instead of circuit identifier";
            }
    
            leaf use-vlan-id {
              junos:must "((!(".. no-vlan-interface-name") && (!(".. use-interface-description") && !(".. require-interface-description"))))";
              junos:must-message "Vlan-tag cannot be added as no-vlan-interface-name or interface-description is configured";
              type empty;
              description
                "Use VLAN id instead of name";
            }
    
            leaf no-vlan-interface-name {
              type empty;
              description
                "Not include vlan or interface name";
            }
    
            leaf include-irb-and-l2 {
              type empty;
              description
                "Include IRB and L2 interface name";
            }
    
            container hostname-only {
              junos:must "(!((".. include-irb-and-l2" || (".. keep-incoming-remote-id" || (".. no-vlan-interface-name" || (".. use-interface-description" || (".. use-vlan-id" || (".. prefix" || ".. use-string"))))))))";
              junos:must-message "Hostname-only cannot be clubbed with any other sub-option";
              presence "enable hostname-only";
              description
                "Include hostname only";
              uses apply-advanced;
            }  // container hostname-only
    
            leaf keep-incoming-remote-id {
              type empty;
              description
                "Keep incoming remote identifier";
            }
    
            leaf use-string {
              junos:must "(!((".. use-interface-description" || (".. require-interface-description" || (".. include-irb-and-l2" || (".. keep-incoming-circuit-id" || (".. no-vlan-interface-name" || ".. use-vlan-id")))))))";
              junos:must-message "use-string can only coexist with prefix";
              type string;
              description
                "Use raw string instead of the default remote id";
            }
          }  // container remote-id
    
          leaf server-id-override {
            junos:must "(!(".. link-selection"))";
            junos:must-message "server-id-override cannot be configured with link-selection";
            type empty;
            description
              "Add link-selection and server-id sub-options on packets to server";
          }
    
          leaf link-selection {
            junos:must "(!(".. server-id-override"))";
            junos:must-message "link-selection cannot be configured with server-id-override";
            type empty;
            description
              "Add link-selection suboption on packets to server";
          }
    
          leaf exclude-relay-agent-identifier {
            type empty;
            description
              "Exclude relay agent identifier from packets to server";
          }
    
          container vendor-specific {
            description
              "Add vendor-specific information";
            uses jdhcp-vendor-specific-type;
          }  // container vendor-specific
        }  // grouping relay-option-82-type
    
        grouping relay-v4-option-ascii-hex {
          uses apply-advanced;
    
          list ascii {
            key "name";
            description "ASCII string";
            leaf name {
              type string {
                length "1 .. 256";
              }
              description "ASCII string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "((".. .. .. .. .. .. server-group $$" || (".. .. .. .. .. server-group $$" || (".. .. .. .. server-group $$" || ".. .. .. server-group $$"))))";
                junos:must-message "Referenced group must be defined under [edit forwarding dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf local-server-group {
                junos:must "((".. .. .. .. .. .. .. .. system services dhcp-local-server group $$" || (".. .. .. .. .. .. .. system services dhcp-local-server group $$" || (".. .. .. .. .. .. system services dhcp-local-server group $$" || ".. .. .. .. .. system services dhcp-local-server group $$"))))";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list ascii
    
          list hexadecimal {
            key "name";
            description "Hexadecimal string";
            leaf name {
              type string {
                junos:posix-pattern "^[[:xdigit:]]+$";
                junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                length "1 .. 512";
              }
              description "Hexadecimal string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "((".. .. .. .. .. .. server-group $$" || (".. .. .. .. .. server-group $$" || (".. .. .. .. server-group $$" || ".. .. .. server-group $$"))))";
                junos:must-message "Referenced group must be defined under [edit forwarding dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf local-server-group {
                junos:must "((".. .. .. .. .. .. .. .. system services dhcp-local-server group $$" || (".. .. .. .. .. .. .. system services dhcp-local-server group $$" || (".. .. .. .. .. .. system services dhcp-local-server group $$" || ".. .. .. .. .. system services dhcp-local-server group $$"))))";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list hexadecimal
        }  // grouping relay-v4-option-ascii-hex
    
        grouping relay-v6-option-ascii-hex {
          uses apply-advanced;
    
          list ascii {
            key "name";
            description "ASCII string";
            leaf name {
              type string {
                length "1 .. 256";
              }
              description "ASCII string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "((".. .. .. .. .. .. server-group $$" || (".. .. .. .. .. server-group $$" || (".. .. .. .. server-group $$" || ".. .. .. server-group $$"))))";
                junos:must-message "Referenced group must be defined under [edit forwarding options dhcp-relay dhcpv6 server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list ascii
    
          list hexadecimal {
            key "name";
            description "Hexadecimal string";
            leaf name {
              type string {
                junos:posix-pattern "^[[:xdigit:]]+$";
                junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                length "1 .. 512";
              }
              description "Hexadecimal string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "((".. .. .. .. .. .. server-group $$" || (".. .. .. .. .. server-group $$" || (".. .. .. .. server-group $$" || ".. .. .. server-group $$"))))";
                junos:must-message "Referenced group must be defined under [edit forwarding options dhcp-relay dhcpv6 server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list hexadecimal
        }  // grouping relay-v6-option-ascii-hex
    
        grouping rib-inet3 {
          uses apply-advanced;
    
          container inet.3 {
            presence "enable inet.3";
            description
              "Use inet.3 to exchange labeled unicast routes";
            uses apply-advanced;
          }  // container inet.3
        }  // grouping rib-inet3
    
        grouping rib_aggregate_type {
          uses apply-advanced;
    
          container defaults {
            description "Global route options";
            uses apply-advanced;
    
            container metric {
              presence "enable metric";
              description "Metric value";
              uses rib_static_metric_type;
            }  // container metric
    
            container metric2 {
              presence "enable metric2";
              description "Metric value 2";
              uses rib_static_metric_type;
            }  // container metric2
    
            container metric3 {
              presence "enable metric3";
              description "Metric value 3";
              uses rib_static_metric_type;
            }  // container metric3
    
            container metric4 {
              presence "enable metric4";
              description "Metric value 4";
              uses rib_static_metric_type;
            }  // container metric4
    
            container tag {
              presence "enable tag";
              description "Tag string";
              uses rib_static_metric_type;
            }  // container tag
    
            container tag2 {
              presence "enable tag2";
              description "Tag string 2";
              uses rib_static_metric_type;
            }  // container tag2
    
            container preference {
              presence "enable preference";
              description "Preference value";
              uses rib_static_metric_type;
            }  // container preference
    
            container preference2 {
              presence "enable preference2";
              description "Preference value 2";
              uses rib_static_metric_type;
            }  // container preference2
    
            container color {
              presence "enable color";
              description
                "Color (preference) value";
              uses rib_static_metric_type;
            }  // container color
    
            container color2 {
              presence "enable color2";
              description
                "Color (preference) value 2";
              uses rib_static_metric_type;
            }  // container color2
    
            leaf-list community {
              type jt:community;
              ordered-by user;
              description
                "BGP community identifier";
            }
    
            container as-path {
              description
                "Autonomous system path";
              uses apply-advanced;
    
              leaf path {
                type string;
                description
                  "Autonomous system path";
              }
    
              leaf origin {
                type enumeration {
                  enum "igp" {
                    value 0;
                    description
                      "Path originated in the local IGP";
                  }
                  enum "egp" {
                    value 1;
                    description
                      "Path originated in another AS";
                  }
                  enum "incomplete" {
                    value 2;
                    description
                      "Path was learned by some other means";
                  }
                }
              }
    
              leaf atomic-aggregate {
                type empty;
                description
                  "Add ATOMIC_AGGREGATE path attribute to route";
              }
    
              container aggregator {
                presence "enable aggregator";
                description
                  "Add AGGREGATOR path attribute to route";
              }  // container aggregator
    
              leaf as-number {
                type string {
                  junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                  junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                }
                description
                  " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
              }
    
              leaf address {
                type jt:ipv4addr;
                description
                  "Address of BGP system that formed the route";
              }
            }  // container as-path
    
            leaf discard {
              type empty;
              description
                "Drop packets to destination; send no ICMP unreachables";
            }
    
            leaf next-table {
              type string;
              description
                "Next hop to another table";
            }
    
            choice brief_flag {
              leaf brief {
                type empty;
                description
                  "Include longest common sequences from contributing paths";
              }
              leaf full {
                type empty;
                description
                  "Include all AS numbers from all contributing paths";
              }
            }  // choice brief_flag
    
            choice passive_flag {
              leaf active {
                type empty;
                description
                  "Remove inactive route from forwarding table";
              }
              leaf passive {
                type empty;
                description
                  "Retain inactive route in forwarding table";
              }
            }  // choice passive_flag
          }  // container defaults
    
          list route {
            key "name";
            ordered-by user;
            description
              "Individual route options";
            leaf name {
              type jt:ipprefix;
              description "Destination prefix";
            }
    
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description "Policy filter";
            }
    
            container metric {
              presence "enable metric";
              description "Metric value";
              uses rib_static_metric_type;
            }  // container metric
    
            container metric2 {
              presence "enable metric2";
              description "Metric value 2";
              uses rib_static_metric_type;
            }  // container metric2
    
            container metric3 {
              presence "enable metric3";
              description "Metric value 3";
              uses rib_static_metric_type;
            }  // container metric3
    
            container metric4 {
              presence "enable metric4";
              description "Metric value 4";
              uses rib_static_metric_type;
            }  // container metric4
    
            container tag {
              presence "enable tag";
              description "Tag string";
              uses rib_static_metric_type;
            }  // container tag
    
            container tag2 {
              presence "enable tag2";
              description "Tag string 2";
              uses rib_static_metric_type;
            }  // container tag2
    
            container preference {
              presence "enable preference";
              description "Preference value";
              uses rib_static_metric_type;
            }  // container preference
    
            container preference2 {
              presence "enable preference2";
              description "Preference value 2";
              uses rib_static_metric_type;
            }  // container preference2
    
            container color {
              presence "enable color";
              description
                "Color (preference) value";
              uses rib_static_metric_type;
            }  // container color
    
            container color2 {
              presence "enable color2";
              description
                "Color (preference) value 2";
              uses rib_static_metric_type;
            }  // container color2
    
            leaf-list community {
              type jt:community;
              ordered-by user;
              description
                "BGP community identifier";
            }
    
            container as-path {
              description
                "Autonomous system path";
              uses apply-advanced;
    
              leaf path {
                type string;
                description
                  "Autonomous system path";
              }
    
              leaf origin {
                type enumeration {
                  enum "igp" {
                    value 0;
                    description
                      "Path originated in the local IGP";
                  }
                  enum "egp" {
                    value 1;
                    description
                      "Path originated in another AS";
                  }
                  enum "incomplete" {
                    value 2;
                    description
                      "Path was learned by some other means";
                  }
                }
              }
    
              leaf atomic-aggregate {
                type empty;
                description
                  "Add ATOMIC_AGGREGATE path attribute to route";
              }
    
              container aggregator {
                presence "enable aggregator";
                description
                  "Add AGGREGATOR path attribute to route";
              }  // container aggregator
    
              leaf as-number {
                type string {
                  junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                  junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                }
                description
                  " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
              }
    
              leaf address {
                type jt:ipv4addr;
                description
                  "Address of BGP system that formed the route";
              }
            }  // container as-path
    
            leaf discard {
              type empty;
              description
                "Drop packets to destination; send no ICMP unreachables";
            }
    
            leaf next-table {
              type string;
              description
                "Next hop to another table";
            }
    
            choice brief_flag {
              leaf brief {
                type empty;
                description
                  "Include longest common sequences from contributing paths";
              }
              leaf full {
                type empty;
                description
                  "Include all AS numbers from all contributing paths";
              }
            }  // choice brief_flag
    
            choice passive_flag {
              leaf active {
                type empty;
                description
                  "Remove inactive route from forwarding table";
              }
              leaf passive {
                type empty;
                description
                  "Retain inactive route in forwarding table";
              }
            }  // choice passive_flag
          }  // list route
        }  // grouping rib_aggregate_type
    
        grouping rib_group_inet_type {
          description "Routing table group";
          leaf ribgroup-name {
            type string;
            description
              "Name of the routing table group";
          }
        }  // grouping rib_group_inet_type
    
        grouping rib_group_type {
          uses apply-advanced;
    
          leaf inet-old-style {
            type string;
            status deprecated;
            description
              "Name of the IPv4 routing table group";
          }
    
          leaf inet {
            type string;
            description
              "Name of the IPv4 routing table group";
          }
    
          leaf inet3 {
            type string;
            description
              "Name of the IPv4 inet.3 routing table group";
          }
    
          leaf inet6 {
            type string;
            description
              "Name of the IPv6 routing table group";
          }
    
          leaf inet63 {
            type string;
            description
              "Name of the IPv6 inet6.3 routing table group";
          }
        }  // grouping rib_group_type
    
        grouping rib_static_metric_type {
          leaf metric-value {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Metric value";
          }
    
          leaf type {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 16";
              }
            }
            description "Metric type";
          }
        }  // grouping rib_static_metric_type
    
        grouping rip_filter_obj {
          description
            "Filter to apply to tracing";
          leaf match-on {
            type enumeration {
              enum "prefix" {
                value 0;
                description
                  "Filter based on prefix";
              }
            }
            description
              "Argument on which to match";
          }
    
          leaf-list policy {
            type jt:policy-algebra;
            ordered-by user;
            description "Filter policy";
          }
        }  // grouping rip_filter_obj
    
        grouping route_record_traceoptions {
          description
            "Traceoptions for sampling route record";
          uses apply-advanced;
    
          leaf no-remote-trace {
            junos:must "("system tracing")";
            junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
            type empty;
            description "Disable remote tracing";
          }
    
          container file {
            description "Trace file information";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "3";
              description
                "Maximum number of trace files";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
    
            leaf match {
              type jt:regular-expression;
              description
                "Regular expression for lines to be logged";
            }
          }  // container file
    
          leaf level {
            type enumeration {
              enum "error" {
                value 0;
                description
                  "Match error conditions";
              }
              enum "warning" {
                value 1;
                description
                  "Match warning messages";
              }
              enum "notice" {
                value 2;
                description
                  "Match conditions that should be handled specially";
              }
              enum "info" {
                value 3;
                description
                  "Match informational messages";
              }
              enum "verbose" {
                value 4;
                description
                  "Match verbose messages";
              }
              enum "all" {
                value 5;
                description "Match all levels";
              }
            }
            default "error";
            description
              "Level of debugging output";
          }
    
          list flag {
            key "name";
            ordered-by user;
            description
              "Area of route-record to enable debuging output";
            leaf name {
              type enumeration {
                enum "parse" {
                  value 0;
                  description
                    "Trace parsing code";
                }
                enum "all" {
                  value 1;
                  description
                    "Trace all area of jflow-service code";
                }
              }
            }
          }  // list flag
        }  // grouping route_record_traceoptions
    
        grouping rpd_rib_group_type {
          description "Routing table group";
          leaf name {
            type string;
            description "Routing table group";
          }
    
          uses apply-advanced;
    
          leaf export-rib {
            type string;
            description "Export routing table";
          }
    
          leaf-list import-rib {
            type string;
            ordered-by user;
            description "Import routing table";
          }
    
          leaf-list import-policy {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
        }  // grouping rpd_rib_group_type
    
        grouping sampling_family_inet6_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_sampling_inet6_sampling_type;
          }  // list flow-server
    
          list interface {
            junos:must "((any ".. flow-server <*>" || any ".. extension-service <*>"))";
            junos:must-message "'flow-server' or 'extension-service' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline;
          }  // container inline-jflow
    
          list extension-service {
            junos:must "(!(".. flow-active-timeout"))";
            junos:must-message "'.. flow-active-timeout' is not needed with 'extension-service'";
            junos:must "(!(".. flow-inactive-timeout"))";
            junos:must-message "'.. flow-inactive-timeout' is not valid for 'extension-service'";
            junos:must "(!(".. aggregate-export-interval"))";
            junos:must-message "'.. aggregate-export-interval' is not valid for 'extension-service'";
            junos:must "(!(any ".. flow-server <*>"))";
            junos:must-message "'.. flow-server' is not needed with 'extension-service'";
            junos:must "(!(any ".. interface <*> source-address"))";
            junos:must-message "'.. interface source-address' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-id"))";
            junos:must-message "'.. interface engine-id' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-type"))";
            junos:must-message "'.. interface engine-type' is not valid for 'extension-service'";
            junos:must "(any ".. interface <*>")";
            junos:must-message "'.. interface' must be specified with 'extension-service'";
            key "name";
            ordered-by user;
            description
              "Define the customer specific sampling configuration";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Customer prefixed sampling service name";
            }
    
            uses apply-advanced;
          }  // list extension-service
        }  // grouping sampling_family_inet6_output_type
    
        grouping cflowd_sampling_inet6_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
        }  // grouping cflowd_sampling_inet6_sampling_type
    
        grouping packet_export_inline {
          uses apply-advanced;
    
          leaf source-address {
            type jt:ipaddr;
            description
              "Address to use for generating monitored packets";
          }
    
          leaf flow-export-rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 3200";
              }
            }
            description
              "Flow export rate of monitored packets in kpps";
          }
        }  // grouping packet_export_inline
    
        grouping sampling_family_input_type {
          description
            "Configure input options for packet sampling";
          uses apply-advanced;
    
          leaf rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            description
              "Ratio of packets to be sampled (1 out of N)";
          }
    
          leaf run-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 20";
              }
            }
            default "0";
            description
              "Number of samples after initial trigger";
          }
    
          leaf max-packets-per-second {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            default "1000";
            description
              "Threshold of samples per second before dropping";
          }
    
          leaf maximum-packet-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 9192";
              }
            }
            units "bytes";
            default "0";
            description
              "Maximum length of the sampled packet";
          }
        }  // grouping sampling_family_input_type
    
        grouping sampling_global_mpls_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_global_mpls_sampling_type;
          }  // list flow-server
    
          list interface {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
        }  // grouping sampling_global_mpls_output_type
    
        grouping cflowd_global_mpls_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
        }  // grouping cflowd_global_mpls_sampling_type
    
        grouping sampling_input_type {
          description
            "Configure input options for packet sampling";
          uses apply-advanced;
    
          leaf rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            description
              "Ratio of packets to be sampled (1 out of N)";
          }
    
          leaf run-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 20";
              }
            }
            default "0";
            description
              "Number of samples after initial trigger";
          }
    
          leaf max-packets-per-second {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            default "1000";
            description
              "Threshold of samples per second before dropping";
          }
    
          leaf maximum-packet-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 9192";
              }
            }
            units "bytes";
            default "0";
            description
              "Maximum length of the sampled packet";
          }
    
          container family {
            presence "enable family";
            status deprecated;
            description "Protocol family";
            container inet {
              description
                "Sampling parameters for IPv4";
              uses apply-advanced;
    
              leaf rate {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Ratio of packets to be sampled (1 out of N)";
              }
    
              leaf run-length {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 20";
                  }
                }
                default "0";
                description
                  "Number of samples after initial trigger";
              }
    
              leaf max-packets-per-second {
                type union {
                  type uint16;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                default "1000";
                description
                  "Threshold of samples per second before dropping";
              }
    
              leaf maximum-packet-length {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 9192";
                  }
                }
                units "bytes";
                default "0";
                description
                  "Maximum length of the sampled packet";
              }
            }  // container inet
    
            container mpls {
              description
                "Sampling parameters for MPLS";
              uses apply-advanced;
    
              leaf rate {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Ratio of packets to be sampled (1 out of N)";
              }
    
              leaf run-length {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 20";
                  }
                }
                default "0";
                description
                  "Number of samples after initial trigger";
              }
    
              leaf max-packets-per-second {
                type union {
                  type uint16;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                default "1000";
                description
                  "Threshold of samples per second before dropping";
              }
    
              leaf maximum-packet-length {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 9192";
                  }
                }
                units "bytes";
                default "0";
                description
                  "Maximum length of the sampled packet";
              }
            }  // container mpls
          }  // container family
        }  // grouping sampling_input_type
    
        grouping sampling_instance_bridge_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          list flow-server {
            junos:must "(".. inline-jflow")";
            junos:must-message "Output 'inline Jflow' should be configured with flow-server";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_instance_bridge_sampling_type;
          }  // list flow-server
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline_instance;
          }  // container inline-jflow
        }  // grouping sampling_instance_bridge_output_type
    
        grouping cflowd_instance_bridge_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
        }  // grouping cflowd_instance_bridge_sampling_type
    
        grouping packet_export_inline_instance {
          uses apply-advanced;
    
          leaf source-address {
            type jt:ipaddr;
            description
              "Address to use for generating monitored packets";
          }
    
          leaf flow-export-rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 3200";
              }
            }
            description
              "Flow export rate of monitored packets in kpps";
          }
        }  // grouping packet_export_inline_instance
    
        grouping sampling_instance_inet6_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_instance_inet6_sampling_type;
          }  // list flow-server
    
          list interface {
            junos:must "((any ".. flow-server <*>" || any ".. extension-service <*>"))";
            junos:must-message "'flow-server' or 'extension-service' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline_instance;
          }  // container inline-jflow
    
          list extension-service {
            junos:must "(!(".. flow-active-timeout"))";
            junos:must-message "'.. flow-active-timeout' is not needed with 'extension-service'";
            junos:must "(!(".. flow-inactive-timeout"))";
            junos:must-message "'.. flow-inactive-timeout' is not valid for 'extension-service'";
            junos:must "(!(".. aggregate-export-interval"))";
            junos:must-message "'.. aggregate-export-interval' is not valid for 'extension-service'";
            junos:must "(!(any ".. flow-server <*>"))";
            junos:must-message "'.. flow-server' is not needed with 'extension-service'";
            junos:must "(!(any ".. interface <*> source-address"))";
            junos:must-message "'.. interface source-address' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-id"))";
            junos:must-message "'.. interface engine-id' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-type"))";
            junos:must-message "'.. interface engine-type' is not valid for 'extension-service'";
            junos:must "(any ".. interface <*>")";
            junos:must-message "'.. interface' must be specified with 'extension-service'";
            key "name";
            ordered-by user;
            description
              "Define the customer specific sampling configuration";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Customer prefixed sampling service name";
            }
    
            uses apply-advanced;
          }  // list extension-service
        }  // grouping sampling_instance_inet6_output_type
    
        grouping cflowd_instance_inet6_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
        }  // grouping cflowd_instance_inet6_sampling_type
    
        grouping sampling_instance_inet_global_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          container file {
            junos:must "(!(any ".. extension-service <*>"))";
            junos:must-message "This configuration is not required with 'extension-service'";
            description
              "Configure parameters for dumping sampled packets";
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable sampled packet dumps";
              }
            }  // choice enable-disable
    
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file to contain sampled packet dumps";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10000";
                }
              }
              default "10";
              description
                "Maximum number of sampled packet dump files";
            }
    
            leaf size {
              type string;
              description
                "Maximum sample dump file size";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the sampled dump";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the sampled dump";
              }
            }  // choice world-readable-choice
    
            choice stamp-choice {
              leaf stamp {
                type empty;
                description
                  "Timestamp every packet in the dump";
              }
              leaf no-stamp {
                type empty;
                description
                  "Don't timestamp every packet in the dump";
              }
            }  // choice stamp-choice
          }  // container file
    
          container port-mirroring {
            junos:must "(!(any ".. extension-service <*>"))";
            junos:must-message "This configuration is not required with 'extension-service'";
            presence "enable port-mirroring";
            description
              "Configure sending sampled traffic out through an interface";
            uses inet_pm_family_output_type;
          }  // container port-mirroring
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_sampling_inet_type;
          }  // list flow-server
    
          list interface {
            junos:must "((any ".. flow-server <*>" || any ".. extension-service <*>"))";
            junos:must-message "'flow-server' or 'extension-service' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
    
          list extension-service {
            junos:must "(!(".. flow-active-timeout"))";
            junos:must-message "'.. flow-active-timeout' is not needed with 'extension-service'";
            junos:must "(!(".. flow-inactive-timeout"))";
            junos:must-message "'.. flow-inactive-timeout' is not valid for 'extension-service'";
            junos:must "(!(".. aggregate-export-interval"))";
            junos:must-message "'.. aggregate-export-interval' is not valid for 'extension-service'";
            junos:must "(!(any ".. flow-server <*>"))";
            junos:must-message "'.. flow-server' is not needed with 'extension-service'";
            junos:must "(!(any ".. interface <*> source-address"))";
            junos:must-message "'.. interface source-address' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-id"))";
            junos:must-message "'.. interface engine-id' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-type"))";
            junos:must-message "'.. interface engine-type' is not valid for 'extension-service'";
            junos:must "(any ".. interface <*>")";
            junos:must-message "'.. interface' must be specified with 'extension-service'";
            key "name";
            ordered-by user;
            description
              "Define the customer specific sampling configuration";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Customer prefixed sampling service name";
            }
    
            uses apply-advanced;
          }  // list extension-service
        }  // grouping sampling_instance_inet_global_output_type
    
        grouping cflowd_sampling_inet_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
    
          leaf version {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            type enumeration {
              enum "5" {
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 0;
                description
                  "Export cflowd aggregates in version 5 format";
              }
              enum "8" {
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 1;
                description
                  "Export cflowd aggregates in version 8 format";
              }
              enum "500" {
                junos:must "(!(".. .. interface"))";
                junos:must-message "This feature is only supported for RE based sampling";
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 2;
                description
                  "Export cflowd aggregates in ASN 500 format";
              }
            }
            default "5";
            description
              "Format of exported cflowd aggregates";
          }
        }  // grouping cflowd_sampling_inet_type
    
        grouping sampling_instance_inet_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            junos:must "((".. interface" || ".. inline-jflow"))";
            junos:must-message "Output 'interface' or 'inline Jflow' should be configured with flow-server";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_instance_inet_sampling_type;
          }  // list flow-server
    
          list interface {
            junos:must "((any ".. flow-server <*>" || any ".. extension-service <*>"))";
            junos:must-message "'flow-server' or 'extension-service' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline_instance;
          }  // container inline-jflow
    
          list extension-service {
            junos:must "(!(".. flow-active-timeout"))";
            junos:must-message "'.. flow-active-timeout' is not needed with 'extension-service'";
            junos:must "(!(".. flow-inactive-timeout"))";
            junos:must-message "'.. flow-inactive-timeout' is not valid for 'extension-service'";
            junos:must "(!(".. aggregate-export-interval"))";
            junos:must-message "'.. aggregate-export-interval' is not valid for 'extension-service'";
            junos:must "(!(any ".. flow-server <*>"))";
            junos:must-message "'.. flow-server' is not needed with 'extension-service'";
            junos:must "(!(any ".. interface <*> source-address"))";
            junos:must-message "'.. interface source-address' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-id"))";
            junos:must-message "'.. interface engine-id' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-type"))";
            junos:must-message "'.. interface engine-type' is not valid for 'extension-service'";
            junos:must "(any ".. interface <*>")";
            junos:must-message "'.. interface' must be specified with 'extension-service'";
            key "name";
            ordered-by user;
            description
              "Define the customer specific sampling configuration";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Customer prefixed sampling service name";
            }
    
            uses apply-advanced;
          }  // list extension-service
        }  // grouping sampling_instance_inet_output_type
    
        grouping cflowd_instance_inet_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
    
          leaf version {
            junos:must "(!(any ".. .. .. .. .. family mpls output flow-server <*> version9"))";
            junos:must-message "Select only one version";
            junos:must "(!(any ".. .. .. .. .. family inet6 output flow-server <*> version9"))";
            junos:must-message "Select only one version";
            junos:must "(!(any ".. .. .. .. .. family inet output flow-server <*> version9"))";
            junos:must-message "Select only one version";
            junos:must "(!(any ".. .. flow-server <*> version-ipfix"))";
            junos:must-message "Select only one version";
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            type enumeration {
              enum "5" {
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 0;
                description
                  "Export cflowd aggregates in version 5 format";
              }
              enum "8" {
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 1;
                description
                  "Export cflowd aggregates in version 8 format";
              }
            }
            default "5";
            description
              "Format of exported cflowd aggregates";
          }
        }  // grouping cflowd_instance_inet_sampling_type
    
        grouping sampling_instance_input_type {
          description
            "Configure input options for packet sampling";
          uses apply-advanced;
    
          leaf rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            description
              "Ratio of packets to be sampled (1 out of N)";
          }
    
          leaf run-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 20";
              }
            }
            default "0";
            description
              "Number of samples after initial trigger";
          }
    
          leaf max-packets-per-second {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            default "1000";
            description
              "Threshold of samples per second before dropping";
          }
    
          leaf maximum-packet-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 9192";
              }
            }
            units "bytes";
            default "0";
            description
              "Maximum length of the sampled packet";
          }
        }  // grouping sampling_instance_input_type
    
        grouping sampling_instance_mpls_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            junos:must "((".. interface" || ".. inline-jflow"))";
            junos:must-message "Output 'interface' or 'inline Jflow' should be configured with flow-server";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_instance_mpls_sampling_type;
          }  // list flow-server
    
          list interface {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline_instance;
          }  // container inline-jflow
        }  // grouping sampling_instance_mpls_output_type
    
        grouping cflowd_instance_mpls_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
        }  // grouping cflowd_instance_mpls_sampling_type
    
        grouping sampling_instance_vpls_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          list flow-server {
            junos:must "(".. inline-jflow")";
            junos:must-message "Output 'inline Jflow' should be configured with flow-server";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_instance_vpls_sampling_type;
          }  // list flow-server
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline_instance;
          }  // container inline-jflow
        }  // grouping sampling_instance_vpls_output_type
    
        grouping cflowd_instance_vpls_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
        }  // grouping cflowd_instance_vpls_sampling_type
    
        grouping sampling_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          container file {
            junos:must "(!(any ".. extension-service <*>"))";
            junos:must-message "This configuration is not required with 'extension-service'";
            description
              "Configure parameters for dumping sampled packets";
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable sampled packet dumps";
              }
            }  // choice enable-disable
    
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file to contain sampled packet dumps";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10000";
                }
              }
              default "10";
              description
                "Maximum number of sampled packet dump files";
            }
    
            leaf size {
              type string;
              description
                "Maximum sample dump file size";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the sampled dump";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the sampled dump";
              }
            }  // choice world-readable-choice
    
            choice stamp-choice {
              leaf stamp {
                type empty;
                description
                  "Timestamp every packet in the dump";
              }
              leaf no-stamp {
                type empty;
                description
                  "Don't timestamp every packet in the dump";
              }
            }  // choice stamp-choice
          }  // container file
    
          container port-mirroring {
            junos:must "(!(any ".. extension-service <*>"))";
            junos:must-message "This configuration is not required with 'extension-service'";
            presence "enable port-mirroring";
            description
              "Configure sending sampled traffic out through an interface";
            uses inet_pm_family_output_type;
          }  // container port-mirroring
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_sampling_type;
          }  // list flow-server
    
          list interface {
            junos:must "((any ".. flow-server <*>" || any ".. extension-service <*>"))";
            junos:must-message "'flow-server' or 'extension-service' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
    
          list extension-service {
            junos:must "(!(".. flow-active-timeout"))";
            junos:must-message "'.. flow-active-timeout' is not needed with 'extension-service'";
            junos:must "(!(".. flow-inactive-timeout"))";
            junos:must-message "'.. flow-inactive-timeout' is not valid for 'extension-service'";
            junos:must "(!(".. aggregate-export-interval"))";
            junos:must-message "'.. aggregate-export-interval' is not valid for 'extension-service'";
            junos:must "(!(any ".. flow-server <*>"))";
            junos:must-message "'.. flow-server' is not needed with 'extension-service'";
            junos:must "(!(any ".. interface <*> source-address"))";
            junos:must-message "'.. interface source-address' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-id"))";
            junos:must-message "'.. interface engine-id' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-type"))";
            junos:must-message "'.. interface engine-type' is not valid for 'extension-service'";
            junos:must "(any ".. interface <*>")";
            junos:must-message "'.. interface' must be specified with 'extension-service'";
            key "name";
            ordered-by user;
            description
              "Define the customer specific sampling configuration";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Customer prefixed sampling service name";
            }
    
            uses apply-advanced;
          }  // list extension-service
        }  // grouping sampling_output_type
    
        grouping cflowd_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
    
          leaf version {
            junos:must "("forwarding-options sampling input family inet")";
            junos:must-message "input 'family inet' must be configured";
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            type enumeration {
              enum "5" {
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 0;
                description
                  "Export cflowd aggregates in version 5 format";
              }
              enum "8" {
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 1;
                description
                  "Export cflowd aggregates in version 8 format";
              }
              enum "500" {
                junos:must "(!(".. .. interface"))";
                junos:must-message "This feature is only supported for RE based sampling";
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 2;
                description
                  "Export cflowd aggregates in ASN 500 format";
              }
            }
            default "5";
            description
              "Format of exported cflowd aggregates";
          }
        }  // grouping cflowd_sampling_type
    
        grouping sampling_traceoptions_type {
          description
            "Configure packet sampling traceoptions";
          uses apply-advanced;
    
          leaf no-remote-trace {
            junos:must "("system tracing")";
            junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
            type empty;
            description "Disable remote tracing";
          }
    
          container file {
            description "Trace file information";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "3";
              description
                "Maximum number of trace files";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
    
            leaf match {
              type jt:regular-expression;
              description
                "Regular expression for lines to be logged";
            }
          }  // container file
        }  // grouping sampling_traceoptions_type
    
        grouping security-dhcpv6-options-type {
          description "Configure DHCPv6 options";
          uses apply-advanced;
    
          container option-37 {
            presence "enable option-37";
            description
              "Configure DHCPv6 remote identifier option";
            uses apply-advanced;
    
            container prefix {
              description
                "Configure DHCPv6 remote identifier prefix";
              uses apply-advanced;
    
              leaf host-name {
                type empty;
                description
                  "Prefix router host name to DHCPv6 remote identifier";
              }
    
              leaf logical-system-name {
                type empty;
                description
                  "Prefix logical system name to DHCPv6 remote identifier";
              }
    
              leaf routing-instance-name {
                type empty;
                description
                  "Prefix routing instance name to DHCPv6 remote identifier";
              }
    
              leaf vlan-name {
                type empty;
                description
                  "Prefix vlan name to DHCPv6 remote identifier";
              }
    
              leaf vlan-id {
                type empty;
                description
                  "Prefix vlan tag to DHCPv6 remote identifier";
              }
            }  // container prefix
    
            leaf use-interface-mac {
              type empty;
              description
                "Add incoming interface's MAC address to DHCPv6 remote identifier";
            }
    
            leaf use-interface-index {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface index";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface index";
                }
              }
              description
                "Add interface index to DHCPv6 remote identifier";
            }
    
            leaf use-interface-name {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface name";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface name";
                }
              }
              description
                "Add interface name to DHCPv6 remote identifier";
            }
    
            leaf use-interface-description {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface description";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface description";
                }
              }
              description
                "Add interface description to DHCPv6 remote identifier";
            }
    
            leaf use-string {
              junos:must "(!(".. use-interface-description"))";
              junos:must-message "use-string and use-interface-description cannot be configured together";
              type string;
              description
                "Add custom string to DHCPv6 remote identifier";
            }
          }  // container option-37
    
          container option-18 {
            presence "enable option-18";
            description
              "Configure DHCPv6 interface identifier option";
            uses apply-advanced;
    
            container prefix {
              description
                "Configure DHCPv6 interface identifier prefix";
              uses apply-advanced;
    
              leaf host-name {
                type empty;
                description
                  "Prefix router host name to DHCPv6 interface identifier";
              }
    
              leaf logical-system-name {
                type empty;
                description
                  "Prefix logical system name to DHCPv6 interface identifier";
              }
    
              leaf routing-instance-name {
                type empty;
                description
                  "Prefix routing instance name to DHCPv6 interface identifier";
              }
    
              leaf vlan-name {
                type empty;
                description
                  "Prefix vlan name to DHCPv6 interface identifier";
              }
    
              leaf vlan-id {
                type empty;
                description
                  "Prefix vlan tag to DHCPv6 interface identifier";
              }
            }  // container prefix
    
            leaf use-interface-mac {
              type empty;
              description
                "Add incoming interface's MAC address to DHCPv6 circuit identifier";
            }
    
            leaf use-interface-index {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface index";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface index";
                }
              }
              description
                "Add interface index to DHCPv6 interface identifier";
            }
    
            leaf use-interface-name {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface name";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface name";
                }
              }
              description
                "Add interface name to DHCPv6 remote identifier";
            }
    
            leaf use-interface-description {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface description";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface description";
                }
              }
              description
                "Add interface description to DHCPv6 interface identifier";
            }
    
            leaf use-string {
              junos:must "(!(".. use-interface-description"))";
              junos:must-message "use-string and use-interface-description cannot be configured together";
              type string;
              description
                "Add custom string to DHCPv6 interface identifier";
            }
          }  // container option-18
    
          container option-16 {
            presence "enable option-16";
            description
              "Configure DHCPv6 vendor class identifier option. Overwrite if exists";
            uses apply-advanced;
    
            leaf use-string {
              type string;
              description
                "Add custom string to DHCPv6 vendor identifier";
            }
          }  // container option-16
    
          leaf option-79 {
            junos:must "(".. .. light-weight-dhcpv6-relay")";
            junos:must-message "Option-79 can be configured only on LDRAs";
            type empty;
            description
              "Configure DHCPv6 client link layer address option";
          }
        }  // grouping security-dhcpv6-options-type
    
        grouping security-option-82-type {
          description
            "DHCP option-82 processing";
          uses apply-advanced;
    
          container circuit-id {
            presence "enable circuit-id";
            description
              "Configure DHCP option 82 circuit id";
            uses apply-advanced;
    
            container prefix {
              description
                "Configure DHCP option 82 circuit id prefix";
              uses apply-advanced;
    
              leaf host-name {
                type empty;
                description
                  "Add router host name to DHCP option-82 circuit id";
              }
    
              leaf logical-system-name {
                type empty;
                description
                  "Add logical system name to DHCP option-82 circuit id";
              }
    
              leaf routing-instance-name {
                type empty;
                description
                  "Add routing instance name to DHCP option-82 circuit id";
              }
            }  // container prefix
    
            leaf use-interface-description {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface description";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface description";
                }
              }
              description
                "Use interface description instead of circuit identifier";
            }
    
            leaf use-vlan-id {
              type empty;
              description
                "Use VLAN id instead of name";
            }
          }  // container circuit-id
    
          container remote-id {
            presence "enable remote-id";
            description
              "Configure DHCP option 82 remote id";
            uses apply-advanced;
    
            leaf host-name {
              type empty;
              description
                "Add router host name to DHCP option-82 remote id";
            }
    
            leaf use-interface-description {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface description";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface description";
                }
              }
              description
                "Use interface description instead of interface name";
            }
    
            leaf use-string {
              junos:must "(!(".. use-interface-description"))";
              junos:must-message "use-string and use-interface-description cannot be configured together";
              type string;
              description
                "Use raw string instead of the default remote id";
            }
    
            leaf mac {
              type empty;
              description
                "Add chassis MAC Address to DHCP option-82 remote id";
            }
          }  // container remote-id
    
          container vendor-id {
            presence "enable vendor-id";
            description
              "Configure DHCP option 82 vendor id";
            uses apply-advanced;
    
            leaf use-string {
              type string;
              default "Juniper Networks";
              description
                "Use raw string instead of the default vendor id";
            }
          }  // container vendor-id
        }  // grouping security-option-82-type
    
        grouping server-active-leasequery-type {
          description "Allow active leasequery";
          uses apply-advanced;
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 3600";
              }
            }
            units "seconds";
            default "120";
            description
              "Read/write timeout in seconds";
          }
    
          leaf idle-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 3600";
              }
            }
            units "seconds";
            default "60";
            description
              "Idle-timeout in seconds";
          }
        }  // grouping server-active-leasequery-type
    
        grouping server-bulk-leasequery-type {
          description "Allow bulk leasequery";
          uses apply-advanced;
    
          leaf max-connections {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            default "3";
            description
              "Max TCP connections allowed at a time";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1000";
              }
            }
            units "seconds";
            default "120";
            description
              "Timeout for blocked connection";
          }
    
          leaf max-empty-replies {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 100";
              }
            }
            units "seconds";
            default "5";
            description
              "Maximum number of empty replies for a connection";
          }
    
          leaf restricted-requestor {
            type empty;
            description
              "Allow bulk leasequery only from restricted requestors";
          }
        }  // grouping server-bulk-leasequery-type
    
        grouping server-group-type {
          uses apply-advanced;
    
          list server-group {
            key "name";
            ordered-by user;
            description
              "One or more server groups";
            leaf name {
              type string {
                junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
                junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                length "1 .. 64";
              }
              description "Server group name";
            }
    
            uses apply-advanced;
    
            list address {
              key "name";
              max-elements 32;
              ordered-by user;
              description
                "IP Address of one or more DHCP servers";
              leaf name {
                type jt:ipaddr;
                description
                  "IP Address of DHCP server";
              }
    
              uses apply-advanced;
            }  // list address
          }  // list server-group
        }  // grouping server-group-type
    
        grouping server-leasequery-type {
          description "Allow leasequery";
          uses apply-advanced;
    
          leaf restricted-requestor {
            type empty;
            description
              "Allow leasequery only from restricted requestors";
          }
        }  // grouping server-leasequery-type
    
        grouping server-match-action-choice {
          uses apply-advanced;
    
          choice v4-action-choice {
            leaf forward-only {
              type empty;
              description
                "Forward without subscriber services";
            }
            leaf create-relay-entry {
              type empty;
              description
                "Create relay entry and allow subscriber services";
            }
          }  // choice v4-action-choice
        }  // grouping server-match-action-choice
    
        grouping server-match-v6-ascii-hex {
          uses apply-advanced;
    
          list ascii {
            key "name";
            description "ASCII string";
            leaf name {
              type string {
                length "1 .. 256";
              }
              description "ASCII string";
            }
    
            uses apply-advanced;
    
            choice server-match-action-choice {
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
              leaf create-relay-entry {
                type empty;
                description
                  "Create relay entry and allow subscriber services";
              }
            }  // choice server-match-action-choice
          }  // list ascii
    
          list hexadecimal {
            key "name";
            description "Hexadecimal string";
            leaf name {
              type string {
                junos:posix-pattern "^[[:xdigit:]]+$";
                junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                length "1 .. 512";
              }
              description "Hexadecimal string";
            }
    
            uses apply-advanced;
    
            choice server-match-action-choice {
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
              leaf create-relay-entry {
                type empty;
                description
                  "Create relay entry and allow subscriber services";
              }
            }  // choice server-match-action-choice
          }  // list hexadecimal
        }  // grouping server-match-v6-ascii-hex
    
        grouping server-v6-option-ascii-hex {
          uses apply-advanced;
    
          list ascii {
            key "name";
            description "ASCII string";
            leaf name {
              type string {
                length "1 .. 256";
              }
              description "ASCII string";
            }
    
            uses apply-advanced;
          }  // list ascii
    
          list hexadecimal {
            key "name";
            description "Hexadecimal string";
            leaf name {
              type string {
                junos:posix-pattern "^[[:xdigit:]]+$";
                junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                length "1 .. 512";
              }
              description "Hexadecimal string";
            }
    
            uses apply-advanced;
          }  // list hexadecimal
        }  // grouping server-v6-option-ascii-hex
    
        grouping smpl-analyzer-type {
          leaf name {
            junos:must "(!("forwarding-options sampling instance $$"))";
            junos:must-message "analyzer must not have the same name as of any other sampling instance";
            junos:must "(!("forwarding-options port-mirroring instance $$"))";
            junos:must-message "analyzer must not have the same name as of any other port mirror instance";
            type string {
              junos:posix-pattern "^[[:alpha:]][[:alnum:]_-]+$";
              junos:pattern-message "Must be a string beginning with a letter and consisting of letters, numbers, dashes, and underscores";
              length "1 .. 63";
            }
            description "Analyzer name";
          }
    
          uses apply-advanced;
    
          container input {
            description
              "Ports and VLANs to monitor";
            uses smpl-analyzer-input-type;
          }  // container input
    
          container output {
            description
              "Outgoing port or VLAN for mirrored packets";
            uses smpl-analyzer-output-type;
          }  // container output
        }  // grouping smpl-analyzer-type
    
        grouping smpl-analyzer-input-type {
          uses apply-advanced;
    
          leaf rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Ratio of packets to be sampled (1 out of N)";
          }
    
          leaf maximum-packet-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 9216";
              }
            }
            units "bytes";
            description
              "Maximum length of the mirrored packet";
          }
    
          container ingress {
            description
              "Ports and VLANs to monitor incoming traffic";
            uses smpl-analyzer-ingress-type;
          }  // container ingress
    
          container egress {
            description
              "Ports and VLANs to monitor outgoing traffic";
            uses smpl-analyzer-egress-type;
          }  // container egress
        }  // grouping smpl-analyzer-input-type
    
        grouping smpl-analyzer-egress-type {
          uses apply-advanced;
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Port to monitor outgoing traffic";
            uses analyzer-egress-interface-type;
          }  // list interface
    
          list routing-instance {
            key "name";
            description "Routing instances";
            uses analyzer-egress-routing-instance-type;
          }  // list routing-instance
    
          list vlan {
            key "name";
            ordered-by user;
            description
              "VLAN to monitor outgoing traffic";
            uses analyzer-egress-vlan-type;
          }  // list vlan
        }  // grouping smpl-analyzer-egress-type
    
        grouping analyzer-egress-interface-type {
          leaf name {
            type string;
            description "Logical interface name";
          }
    
          uses apply-advanced;
        }  // grouping analyzer-egress-interface-type
    
        grouping analyzer-egress-routing-instance-type {
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description "Routing instance name";
          }
    
          uses apply-advanced;
    
          list vlan {
            key "name";
            ordered-by user;
            description
              "VLAN to monitor outgoing traffic";
            uses analyzer-egress-vlan-type;
          }  // list vlan
        }  // grouping analyzer-egress-routing-instance-type
    
        grouping analyzer-egress-vlan-type {
          leaf name {
            junos:must "(!(any "forwarding-options analyzer <*> output vlan $$"))";
            junos:must-message "vlan must not be output of any analyzer session";
            junos:must "(unique "forwarding-options analyzer <*> input egress vlan $$")";
            junos:must-message "vlan must not be input egress to any other analyzer";
            type string;
            description
              "VLAN name, VLAN id or VLAN range string";
          }
    
          uses apply-advanced;
        }  // grouping analyzer-egress-vlan-type
    
        grouping smpl-analyzer-ingress-type {
          uses apply-advanced;
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Port to monitor incoming traffic";
            uses analyzer-ingress-interface-type;
          }  // list interface
    
          list routing-instance {
            key "name";
            description "Routing instances";
            uses analyzer-ingress-routing-instance-type;
          }  // list routing-instance
    
          list vlan {
            key "name";
            ordered-by user;
            description
              "VLAN to monitor incoming traffic";
            uses analyzer-ingress-vlan-type;
          }  // list vlan
        }  // grouping smpl-analyzer-ingress-type
    
        grouping analyzer-ingress-interface-type {
          leaf name {
            type string;
            description "Logical interface name";
          }
    
          uses apply-advanced;
        }  // grouping analyzer-ingress-interface-type
    
        grouping analyzer-ingress-routing-instance-type {
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description "Routing instance name";
          }
    
          uses apply-advanced;
    
          list vlan {
            key "name";
            ordered-by user;
            description
              "VLAN to monitor incoming traffic";
            uses analyzer-ingress-vlan-type;
          }  // list vlan
        }  // grouping analyzer-ingress-routing-instance-type
    
        grouping analyzer-ingress-vlan-type {
          leaf name {
            junos:must "(!(any "forwarding-options analyzer <*> output vlan $$"))";
            junos:must-message "vlan must not be output of any analyzer session";
            junos:must "(unique "forwarding-options analyzer <*> input ingress vlan $$")";
            junos:must-message "vlan must not be input ingress to any other analyzer";
            junos:must "(!("vlans $$ vlan-id-list"))";
            junos:must-message "vlan-id-list cannot be configured on forwarding-options analyzer";
            type string;
            description
              "VLAN name, VLAN id or VLAN range string";
          }
    
          uses apply-advanced;
        }  // grouping analyzer-ingress-vlan-type
    
        grouping smpl-analyzer-output-type {
          uses apply-advanced;
    
          choice interface_or_vlan {
            leaf interface {
              junos:must "(!("interfaces $$-IFL family inet"))";
              junos:must-message "An interface configured as family inet cannot be configured as analyzer output interface";
              junos:must "(!(("interfaces $$-IFL family inet" || "interfaces $$-IFL family inet6")))";
              junos:must-message "An interface configured as family inet/inet6 cannot be configured as analyzer output interface";
              junos:must "(!(("interfaces $$-IFL family ethernet-switching filter" || ("interfaces $$-IFL family inet filter" || "interfaces $$-IFL family inet6 filter"))))";
              junos:must-message "An interface cannot both be an analyzer output interface and have a filter applied to it.";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Outgoing port for mirrored packets";
            }
            leaf ip-address {
              type jt:ipv4addr;
              description
                "ERSPAN Destination IP Address";
            }
            leaf ipv6-address {
              type jt:ipv6addr;
              description
                "ERSPAN Destination IPv6 Address";
            }
            leaf next-hop-group {
              junos:must "("forwarding-options next-hop-group $$ group-type layer-2")";
              junos:must-message "Referenced next-hop-group must be defined as layer-2 group";
              type string;
              description
                "Next-hop-group through which to send port-mirror traffic";
            }
            list routing-instance {
              key "name";
              max-elements 1;
              description "Routing instances";
              uses output-routing-instance-type;
            }  // list routing-instance
            list vlan {
              key "name";
              max-elements 1;
              description
                "Outgoing VLAN for mirrored packets";
              uses pm-rspan-vlan;
            }  // list vlan
    
            case case_7 {
            }  // case case_7
          }  // choice interface_or_vlan
        }  // grouping smpl-analyzer-output-type
    
        grouping output-routing-instance-type {
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description "Routing instance name";
          }
    
          uses apply-advanced;
    
          choice ipaddr_or_vlan {
            leaf ip-address {
              type jt:ipv4addr;
              description
                "ERSPAN Destination IP Address";
            }
            leaf ipv6-address {
              type jt:ipv6addr;
              description
                "ERSPAN Destination IPv6 Address";
            }
            list vlan {
              key "name";
              max-elements 1;
              description
                "Outgoing VLAN for mirrored packets";
              uses pm-rspan-vlan;
            }  // list vlan
    
            case case_4 {
            }  // case case_4
          }  // choice ipaddr_or_vlan
        }  // grouping output-routing-instance-type
    
        grouping spring-te-template-map {
          description
            "SPRING-TE template color map";
          leaf name {
            junos:must "("protocols source-packet-routing source-routing-path-template $$ primary")";
            junos:must-message "Referenced spring-te template doesn't exist or primary not configured in it";
            type string;
            description
              "Name of SPRING-TE template";
          }
    
          uses apply-advanced;
    
          choice colors {
            leaf-list color {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Set of color list to be mapped to corresponding SPRING-TE template";
            }
            leaf color-any {
              type empty;
              description
                "Map any color to corresponding SPRING-TE template";
            }
          }  // choice colors
        }  // grouping spring-te-template-map
    
        grouping springte_lsp_nh_obj {
          uses apply-advanced;
    
          leaf nexthop {
            type string {
              length "1 .. 128";
            }
            description
              "SPRING-TE LSP to use to reach destination";
          }
    
          container lsp-source {
            description
              "Source of tunnel creation";
            uses apply-advanced;
    
            choice lsp-src-choice {
              leaf pcep {
                type empty;
                description
                  "Path computation element protocol";
              }
              leaf static {
                type empty;
                description
                  "Static configuration";
              }
              leaf dtm {
                type empty;
                description
                  "Dynamic tunnel module";
              }
              leaf bgp {
                type empty;
                description "BGP SRTE";
              }
            }  // choice lsp-src-choice
          }  // container lsp-source
        }  // grouping springte_lsp_nh_obj
    
        grouping stp-interface {
          leaf name {
            type string;
          }
    
          uses apply-advanced;
    
          leaf priority {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "0 .. 255";
              }
            }
            description
              "Interface priority (in increments of 16 - 0,16,..240)";
          }
    
          leaf cost {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 200000000";
              }
            }
            description "Cost of the interface";
          }
    
          leaf mode {
            type enumeration {
              enum "point-to-point" {
                value 0;
                description
                  "Interface mode is point-to-point";
              }
              enum "shared" {
                value 1;
                description
                  "Interface mode is shared";
              }
            }
            description
              "Interface mode (P2P or shared)";
          }
    
          leaf edge {
            type empty;
            description "Port is an edge port";
          }
    
          leaf access-trunk {
            type empty;
            description
              "Send/Receive untagged RSTP BPDUs on this interface";
          }
    
          container bpdu-timeout-action {
            presence
              "enable bpdu-timeout-action";
            description
              "Define action on BPDU expiry (Loop Protect)";
            uses apply-advanced;
    
            leaf block {
              type empty;
              description "Block the interface";
            }
    
            leaf alarm {
              type empty;
              description "Generate an alarm";
            }
          }  // container bpdu-timeout-action
    
          leaf no-root-port {
            type empty;
            description
              "Do not allow the interface to become root (Root Protect)";
          }
    
          leaf disable {
            type empty;
            description
              "Disable Spanning Tree on port";
          }
        }  // grouping stp-interface
    
        grouping stp-trace-options {
          description
            "Trace options for Spanning Tree Protocol";
          uses apply-advanced;
    
          container file {
            description "Trace file options";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf replace {
              type empty;
              status deprecated;
              description
                "Replace trace file rather than appending to it";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "10";
              description
                "Maximum number of trace files";
            }
    
            leaf no-stamp {
              type empty;
              status deprecated;
              description
                "Do not timestamp trace file";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
          }  // container file
    
          list flag {
            junos:must "(".. file")";
            junos:must-message "Trace file name required to enable tracing";
            key "name";
            ordered-by user;
            description "Tracing parameters";
            leaf name {
              type enumeration {
                enum "events" {
                  value 0;
                  description
                    "Trace events to the protocol state machine";
                }
                enum "bpdu" {
                  value 1;
                  description
                    "Trace BPDU reception and transmission";
                }
                enum "timers" {
                  value 2;
                  description
                    "Trace protocol timers";
                }
                enum
                  "port-information-state-machine" {
                  value 3;
                  description
                    "Trace port information state machine";
                }
                enum
                  "port-receive-state-machine" {
                  value 4;
                  description
                    "Trace port receive state machine";
                }
                enum
                  "port-role-select-state-machine" {
                  value 5;
                  description
                    "Trace port role selection state machine";
                }
                enum
                  "port-role-transit-state-machine" {
                  value 6;
                  description
                    "Trace port role transit state machine";
                }
                enum
                  "port-state-transit-state-machine" {
                  value 7;
                  description
                    "Trace port state transit state machine";
                }
                enum
                  "port-migration-state-machine" {
                  value 8;
                  description
                    "Trace port migration state machine";
                }
                enum
                  "port-transmit-state-machine" {
                  value 9;
                  description
                    "Trace port transmit state machine";
                }
                enum
                  "topology-change-state-machine" {
                  value 10;
                  description
                    "Trace topology change state machine";
                }
                enum
                  "bridge-detection-state-machine" {
                  value 11;
                  description
                    "Trace Bridge detection state machine";
                }
                enum "state-machine-variables" {
                  value 12;
                  description
                    "Trace when state machine variables change";
                }
                enum "ppmd" {
                  value 13;
                  description
                    "Trace state and events for ppmd process";
                }
                enum "all-failures" {
                  value 14;
                  description
                    "Trace all failure conditions";
                }
                enum "all" {
                  value 15;
                  description "Trace all";
                }
              }
            }
    
            leaf disable {
              type empty;
              description
                "Disable this trace flag";
            }
          }  // list flag
        }  // grouping stp-trace-options
    
        grouping subscription-type {
          uses apply-advanced;
    
          leaf link-subscription {
            type string;
            default "100";
            description
              "Link bandwidth percentage for RSVP reservation";
          }
    
          leaf ct0 {
            junos:must "("protocols mpls diffserv-te bandwidth-model")";
            junos:must-message "Must have a diffserv-te bandwidth model configured when configuring subscription per traffic class";
            type string;
            default "100";
            description
              "Subscription percentage for traffic class 0";
          }
    
          leaf ct1 {
            junos:must "("protocols mpls diffserv-te bandwidth-model")";
            junos:must-message "Must have a diffserv-te bandwidth model configured when configuring subscription per traffic class";
            type string;
            default "100";
            description
              "Subscription percentage for traffic class 1";
          }
    
          leaf ct2 {
            junos:must "("protocols mpls diffserv-te bandwidth-model")";
            junos:must-message "Must have a diffserv-te bandwidth model configured when configuring subscription per traffic class";
            type string;
            default "100";
            description
              "Subscription percentage for traffic class 2";
          }
    
          leaf ct3 {
            junos:must "("protocols mpls diffserv-te bandwidth-model")";
            junos:must-message "Must have a diffserv-te bandwidth model configured when configuring subscription per traffic class";
            type string;
            default "100";
            description
              "Subscription percentage for traffic class 3";
          }
    
          list priority {
            key "priority-value";
            ordered-by user;
            description
              "Subscription percentage for a specific priority";
            leaf priority-value {
              junos:must "(!("protocols mpls diffserv-te"))";
              junos:must-message "Cannot configure per-priority subscription alongside diffserv-te";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 7";
                }
              }
              description
                "Priority for which subscription percent is being configured";
            }
    
            uses apply-advanced;
    
            leaf percent {
              junos:must "(!("protocols mpls diffserv-te"))";
              junos:must-message "Cannot configure per-priority subscription alongside diffserv-te";
              type string;
              description
                "Subscription percent for the specific priority";
            }
          }  // list priority
        }  // grouping subscription-type
    
        grouping system-id-ip-map {
          leaf name {
            type jt:mac-unicast;
          }
    
          uses apply-advanced;
    
          leaf ip-address {
            type jt:ipv4prefix;
            description "Peer ID (IP Address)";
          }
        }  // grouping system-id-ip-map
    
        grouping te-class-object {
          leaf traffic-class {
            type enumeration {
              enum "ct0" {
                value 0;
                description "Traffic class 0";
              }
              enum "ct1" {
                value 1;
                description "Traffic class 1";
              }
              enum "ct2" {
                value 2;
                description "Traffic class 2";
              }
              enum "ct3" {
                value 3;
                description "Traffic class 3";
              }
            }
            description "Traffic class";
          }
    
          leaf priority {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 7";
              }
            }
            description
              "Preemption priority for this class";
          }
        }  // grouping te-class-object
    
        grouping v6-relay-option-interface-id-type {
          description "Interface ID processing";
          uses apply-advanced;
    
          container prefix {
            description
              "Add prefix to circuit/interface-id or remote-id";
            uses apply-advanced;
    
            leaf host-name {
              type empty;
              description
                "Add router host name to circuit / interface-id or remote-id";
            }
    
            leaf logical-system-name {
              type empty;
              description
                "Add logical system name to circuit / interface-id or remote-id";
            }
    
            leaf routing-instance-name {
              type empty;
              description
                "Add routing instance name to circuit / interface-id or remote-id";
            }
          }  // container prefix
    
          leaf use-interface-description {
            junos:must "(!(".. require-interface-description"))";
            junos:must-message "use-interface-description may not be set with require-interface-desciption";
            type enumeration {
              enum "logical" {
                value 0;
                description
                  "Use the logical interface description";
              }
              enum "device" {
                value 1;
                description
                  "Use the device interface description";
              }
            }
            description
              "Use interface description instead of circuit identifier";
          }
    
          leaf use-vlan-id {
            junos:must "((!(".. no-vlan-interface-name") && (!(".. use-interface-description") && !(".. require-interface-description"))))";
            junos:must-message "Vlan-tag cannot be added as no-vlan-interface-name or interface-description is configured";
            type empty;
            description
              "Use VLAN id instead of name";
          }
    
          leaf no-vlan-interface-name {
            type empty;
            description
              "Not include vlan or interface name";
          }
    
          leaf include-irb-and-l2 {
            type empty;
            description
              "Include IRB and L2 interface name";
          }
    
          container use-option-82 {
            presence "enable use-option-82";
            description
              "Use option-82 circuit-id for interface-id";
            uses v6-relay-option-cid-rid-action;
          }  // container use-option-82
    
          container keep-incoming-interface-id {
            presence
              "enable keep-incoming-interface-id";
            description
              "Keep incoming interface identifier";
            uses v6-relay-option-cid-rid-action;
          }  // container keep-incoming-interface-id
        }  // grouping v6-relay-option-interface-id-type
    
        grouping v6-relay-option-cid-rid-action {
          uses apply-advanced;
    
          leaf strict {
            type empty;
            description
              "Drop packet if id not present";
          }
        }  // grouping v6-relay-option-cid-rid-action
    
        grouping v6-relay-option-remote-id-type {
          description "Remote ID processing";
          uses apply-advanced;
    
          container prefix {
            description
              "Add prefix to circuit/interface-id or remote-id";
            uses apply-advanced;
    
            leaf host-name {
              type empty;
              description
                "Add router host name to circuit / interface-id or remote-id";
            }
    
            leaf logical-system-name {
              type empty;
              description
                "Add logical system name to circuit / interface-id or remote-id";
            }
    
            leaf routing-instance-name {
              type empty;
              description
                "Add routing instance name to circuit / interface-id or remote-id";
            }
          }  // container prefix
    
          leaf use-interface-description {
            junos:must "(!(".. require-interface-description"))";
            junos:must-message "use-interface-description may not be set with require-interface-desciption";
            type enumeration {
              enum "logical" {
                value 0;
                description
                  "Use the logical interface description";
              }
              enum "device" {
                value 1;
                description
                  "Use the device interface description";
              }
            }
            description
              "Use interface description instead of circuit identifier";
          }
    
          leaf use-vlan-id {
            junos:must "((!(".. no-vlan-interface-name") && (!(".. use-interface-description") && !(".. require-interface-description"))))";
            junos:must-message "Vlan-tag cannot be added as no-vlan-interface-name or interface-description is configured";
            type empty;
            description
              "Use VLAN id instead of name";
          }
    
          leaf no-vlan-interface-name {
            type empty;
            description
              "Not include vlan or interface name";
          }
    
          leaf include-irb-and-l2 {
            type empty;
            description
              "Include IRB and L2 interface name";
          }
    
          container use-option-82 {
            presence "enable use-option-82";
            description
              "Use option-82 remote-id for v6 remote-id";
            uses v6-relay-option-cid-rid-action;
          }  // container use-option-82
    
          leaf keep-incoming-remote-id {
            type empty;
            description
              "Keep incoming remote identifier";
          }
        }  // grouping v6-relay-option-remote-id-type
    
        grouping v6-server-group-type {
          uses apply-advanced;
    
          list server-group {
            key "name";
            ordered-by user;
            description
              "One or more server groups";
            leaf name {
              type string {
                junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
                junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                length "1 .. 64";
              }
              description
                "DHCPv6 Server group name";
            }
    
            uses apply-advanced;
    
            list address {
              key "name";
              max-elements 32;
              ordered-by user;
              description
                "IP Address of one or more DHCP servers";
              leaf name {
                type jt:ipaddr;
                description
                  "IP Address of DHCP server";
              }
    
              uses apply-advanced;
            }  // list address
          }  // list server-group
        }  // grouping v6-server-group-type
    
        grouping vlan-policy {
          description "Virtual LAN";
          leaf name {
            type string;
            description "VLAN id";
          }
    
          uses apply-advanced;
    
          container policy {
            description "Attach policy";
            uses apply-advanced;
    
            leaf policy-name {
              type string;
              description
                "Router Advertisement Guard policy name";
            }
    
            choice policy-type {
              leaf stateful {
                type empty;
                description
                  "Stateful router advertisement guard";
              }
              leaf stateless {
                type empty;
                description
                  "Stateless router advertisement guard";
              }
            }  // choice policy-type
          }  // container policy
        }  // grouping vlan-policy
    
        grouping vlan-types {
          description "Virtual LAN";
          leaf name {
            junos:must "(((!("vlans ${vlan} isolated-vlan") && (!("vlans ${vlan} community-vlans") && !("vlans ${vlan} private-vlan"))) || !("vlans ${vlan} forwarding-options filter output")))";
            junos:must-message "Configuring Egress VACL is not supported on PVLAN";
            type string {
              length "2 .. 64";
            }
            description "VLAN name";
          }
    
          uses apply-advanced;
    
          leaf description {
            type string {
              junos:posix-pattern "^.{1,255}$";
              junos:pattern-message "Must be a string of 255 characters or less";
            }
            description
              "Text description of VLANs";
          }
    
          choice vlan-identifier-choice {
            leaf vlan-id {
              type string;
              description
                "IEEE 802.1q VLAN identifier for VLAN";
            }
            leaf-list vlan-id-list {
              junos:must "(!(("routing-instances ${instance} instance-type mac-vrf" && " .. vxlan")))";
              junos:must-message "vxlan can not be specified under vlan-id-list for mac-vrf instance";
              junos:must "((!(".. isolated-vlan") && !(".. community-vlans")))";
              junos:must-message "PVLAN related configuration cannot be specified with vlan-id-list";
              junos:must "(!(" .. multicast-snooping-options"))";
              junos:must-message "multicast-snooping-options can not be specified under vlan-id-list";
              junos:must "(!(" .. domain-type"))";
              junos:must-message "domain-type can not be specified  under vlan-id-list";
              junos:must "(!(".. interface"))";
              junos:must-message "interface can not be specified under vlan-id-list";
              junos:must "(!(any ".. switch-options interface <*> static-mac"))";
              junos:must-message "static mac can not be specified under vlan-id-list";
              type jt:vlan-range;
              description
                "Create VLAN for each of the vlan-id specified in the vlan-id-list";
            }
            container vlan-tags {
              presence "enable vlan-tags";
              description
                "IEEE 802.1q VLAN tags for VLANs";
              leaf outer {
                type string {
                  junos:posix-pattern "^(0[Xx][0-9A-Fa-f]{4}.([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4]))$|^([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4])$";
                  junos:pattern-message "vlan-id in vlan-tag (0xNNNN.vlan-id) must be 0 to 4094";
                }
                description
                  "[tpid.]vlan-id, tpid format is 0xNNNN and is optional";
              }
    
              leaf inner {
                type string {
                  junos:posix-pattern "^(0[Xx][0-9A-Fa-f]{4}.([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4]))$|^([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4])$";
                  junos:pattern-message "vlan-id in vlan-tag (0xNNNN.vlan-id) must be 0 to 4094";
                }
                description
                  "[tpid.]vlan-id, tpid format is 0xNNNN and is optional";
              }
            }  // container vlan-tags
          }  // choice vlan-identifier-choice
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interface name for this VLAN";
            leaf name {
              junos:must "(!("interfaces $$-IFL encapsulation ethernet"))";
              junos:must-message "encapsulation ethernet is not allowed on l2 interface";
              junos:must "(!((("interfaces $$-IFL vlan-id-list" || "interfaces $$-IFL vlan-id-range") && (".. .. .. .. instance-type mac-vrf" && (".. .. .. .. service-type vlan-aware" || ".. .. .. .. service-type vlan-based")))))";
              junos:must-message "Interface with vlan-id-list/vlan-id-range cannot be added to vlan under mac-vrf routing-instance with vlan-based/vlan-aware service-type";
              junos:must "((!("interfaces $$-IFL family") || "interfaces $$-IFL family ethernet-switching"))";
              junos:must-message "only family ethernet-switching can be configured on this interface";
              junos:must "((!(("interfaces $$ vlan-id-list" || "interfaces $$ vlan-tags inner-list")) || (!((".. .. vlan-id" || ".. .. vlan-tags")) || (".. .. no-normalization" || ".. .. switch-options no-normalization"))))";
              junos:must-message "interface with vlan-id-list/inner-list cannot be added to a vlan with a vlan-id/vlan-tags configured";
              junos:must "(!(("interfaces $$-IFL family ethernet-switching interface-mode" || "interfaces $$-IFL family ethernet-switching vlan members")))";
              junos:must-message "Interface with 'interface-mode' config is not allowed under vlans";
              junos:must "(!(".. .. .. interfaces $$"))";
              junos:must-message "This interface is already defined at the routing-instance level";
              junos:must "(("interfaces $$-IFL" || !(".. .. .. .. protocols evpn encapsulation")))";
              junos:must-message "Interface not defined; Interface must be defined for configuring under VLAN for protocols evpn";
              junos:must "(((".. .. vlan-id all" && "interfaces $$-IFL input-vlan-map pop") || ((".. .. vlan-id inner-all" && "interfaces $$-IFL input-vlan-map") || (!((".. .. vlan-id" || ".. .. vlan-tags")) || (!(("interfaces $$-IFL input-vlan-map" || "interfaces $$-IFL output-vlan-map")) || (".. .. no-normalization" || ".. .. switch-options no-normalization"))))))";
              junos:must-message "interface with input/output vlan-maps cannot be added to a routing-instance with a vlan-id/vlan-tags configured";
              junos:must "((!("interfaces $$-IFL vlan-tags inner-range") || ((".. .. vlan-id all" || ".. .. vlan-id inner-all") || (".. .. no-normalization" || ".. .. switch-options no-normalization"))))";
              junos:must-message "vlan-tags inner-range is specified for this logical interface; 'vlan-id all' or 'vlan-id inner-all' should also be enabled";
              junos:must "(((!("interfaces $$-IFL vlan-id-range") || ".. .. vlan-id all") || (".. .. no-normalization" || ".. .. switch-options no-normalization")))";
              junos:must-message "vlan-id-range is specified for this logical interface; 'vlan-id all' should also be enabled";
              junos:must "(!(".. .. switch-options interface $$ interface-mac-limit"))";
              junos:must-message "Interface mac limit should not be configured at VLAN level for sub interfaces";
              junos:must "(!("interfaces $$-IFL output-vlan-map push"))";
              junos:must-message "interface with output-vlan-map is not supported with push";
              junos:must "((!("interfaces $$-IFL vlan-id-list") || !(("interfaces $$-IFL input-vlan-map swap" || "interfaces $$-IFL input-vlan-map pop"))))";
              junos:must-message "interface with vlan-id-list and input-vlan-map swap/pop is not supported";
              junos:must "((!("interfaces $$-IFL vlan-id-list") || "interfaces $$-IFL input-vlan-map"))";
              junos:must-message "interface with vlan-id-list is supported only with input-vlan-map push";
              junos:must "((!("interfaces $$-IFL vlan-id") || !((".. .. vlan-tags" || ".. .. vlan-id-list"))))";
              junos:must-message "interface with vlan-id cannot be added to vlan with vlan-tags/vlan-id-list configured";
              junos:must "((!("interfaces $$-IFL vlan-id-list") || !((".. .. vlan-id" || (".. .. vlan-tags" || ".. .. vlan-id-list")))))";
              junos:must-message "interface with vlan-id-list cannot be added to a vlan with a vlan-id/vlan-tags/vlan-id-list configured";
              type string;
            }
    
            uses apply-advanced;
          }  // list interface
    
          leaf l3-interface {
            junos:must "(!((".. .. .. protocols evpn mclag" && !(".. no-arp-suppression"))))";
            junos:must-message "no-arp-suppression needs to be configured, when evpn is configured with mclag.";
            junos:must "(!((".. mcae-mac-synchronize" && "interfaces $$-IFL mac")))";
            junos:must-message "irb-ifl mac and vlan mcae-mac-synchronize cannot coexist";
            junos:must "((!("interfaces $$-IFL family mpls") || !(("routing-instances ${instance} instance-type virtual-switch" && ("routing-instances ${instance} protocols vpls" && "routing-instances ${instance} route-distinguisher")))))";
            junos:must-message "routing-interface with family MPLS cannot be added to virtual-switch with protocol VPLS";
            junos:must "((!(".. vlan-tags") || !("interfaces $$-IFL family mpls")))";
            junos:must-message "routing-interface with family MPLS cannot be added to bridge-domain with 'vlan-tags'";
            junos:must "(!("routing-instances ${instance} service-type vlan-bundle"))";
            junos:must-message "routing-interface not valid for vlan-bundle service type";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id inner-all")))";
            junos:must-message "l3-interface cannot be configured under vlans with 'vlan-id all' or 'vlan-id inner-all'";
            junos:must "((".. vlan-id" || ".. vlan-tags"))";
            junos:must-message "l3-interface can be configured only under vlans with 'vlan-id'/'vlan-tags'";
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "L3 interface name for this vlans";
          }
    
          container forwarding-options {
            description
              "Forwarding options configuration";
            uses juniper-ethernet-switching-forwarding-options;
          }  // container forwarding-options
    
          container multicast-snooping-options {
            junos:must "(".. .. .. protocols igmp-snooping vlan ${vlan}")";
            junos:must-message "multicast-snooping-options can be configured only if snooping is enabled on the vlan";
            description
              "Multicast snooping option configuration";
            uses juniper-multicast-snooping-options;
          }  // container multicast-snooping-options
    
          container switch-options {
            description
              "VLANs switch-options configuration";
            uses juniper-protocols-vlan;
          }  // container switch-options
    
          leaf domain-type {
            type enumeration {
              enum "bridge" {
                value 0;
                description
                  "Forwarding instance";
              }
            }
            description
              "Type of VLANs SVLAN/DVLAN";
          }
    
          leaf no-irb-layer-2-copy {
            junos:must "(".. l3-interface")";
            junos:must-message "l3-interface must be configured to configure this feature";
            type empty;
            description
              "Disable transmission of layer-2 copy of packets of IRB routing-interface";
          }
    
          leaf service-id {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Service id required if VLAN is of type MC-AE, and vlan-id all or vlan-id none or vlan-tags is configured";
          }
    
          leaf mcae-mac-synchronize {
            junos:must "(".. l3-interface")";
            junos:must-message "Layer 3 interface for this VLAN is not configured";
            type empty;
            description
              "Enable IRB MAC synchronization in this VLAN";
          }
    
          leaf mcae-mac-flush {
            type empty;
            description
              "Enable IRB MAC flush in a/s mode for this VLAN on MCAE link up";
          }
    
          leaf private-vlan {
            junos:must "(!((".. isolated-vlan" || ".. community-vlans")))";
            junos:must-message "This vlan is already configured as primary vlan";
            junos:must "(!(".. l3-interface"))";
            junos:must-message "l3-interface cannot be configured on a secondary vlan";
            type enumeration {
              enum "isolated" {
                value 0;
                description "Isolated vlan";
              }
              enum "community" {
                value 1;
                description "Community vlan";
              }
            }
            description
              "Type of secondary vlan for private vlan";
          }
    
          leaf isolated-vlan {
            junos:must "(!(".. private-vlan"))";
            junos:must-message "This vlan is already configured as secondary vlan";
            type string;
            description "VLAN id or name";
          }
    
          leaf-list community-vlans {
            junos:must "(!(".. private-vlan"))";
            junos:must-message "This vlan is already configured as secondary vlan";
            type string;
            ordered-by user;
            description
              "List of VLAN id or name";
          }
    
          container vxlan {
            junos:must "((". riot-loopback" || (!(". riot-loopback") && (((". ovsdb-managed" || ".. .. .. switch-options ovsdb-managed") && (!((". ingress-node-replication" || ".. .. .. protocols evpn encapsulation vxlan")) && !(". multicast-group"))) || ((!((". ovsdb-managed" || ".. .. .. switch-options ovsdb-managed")) && ((". ingress-node-replication" || ".. .. .. protocols evpn encapsulation vxlan") && !(". multicast-group"))) || (!((". ovsdb-managed" || ".. .. .. switch-options ovsdb-managed")) && (!((". ingress-node-replication" || ".. .. .. protocols evpn encapsulation vxlan")) && ". multicast-group")))))))";
            junos:must-message "ovsdb, multicast-group, ingress-node-replication cannot be configured together. ingress-node-replication must be configured when remote-vtep-list is configured";
            junos:must "((". ovsdb-managed" || (".. .. .. switch-options ovsdb-managed" || (". multicast-group" || ("routing-instances ${instance} remote-vtep-list" || (".. .. .. switch-options remote-vtep-list" || (". ingress-node-replication" || (".. .. .. protocols evpn encapsulation vxlan" || ". riot-loopback"))))))))";
            junos:must-message "One of multicast-group or ovsdb-managed or ingress-node-replication or protocols evpn encapsulation vxlan or remote-vtep-list or riot-loopback should be enabled";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id all")))";
            junos:must-message "vxlan does not support bridge domain with 'vlan-id all' or 'vlan-id inner-all'";
            junos:must "((". riot-loopback" || (!(". riot-loopback") && ("routing-instances ${instance} vtep-source-interface" || ".. .. .. switch-options vtep-source-interface"))))";
            junos:must-message "vtep-source-interface is required for VXLAN configuration";
            uses apply-advanced;
    
            leaf ovsdb-managed {
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || (".. .. .. .. switch-options remote-vtep-list" || (".. multicast-group" || ".. .. .. .. protocols evpn encapsulation vxlan")))))";
              junos:must-message "ovsdb-managed not valid with remote-vtep-list or multicast-group or protocol evpn encapsulation vxlan";
              type empty;
              description
                "Bridge-domain is managed remotely via VXLAN OVSDB Controller";
            }
    
            leaf vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 16777214";
                }
              }
              description "VXLAN identifier";
            }
    
            leaf translation-vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16777214";
                }
              }
              description
                "Translated VXLAN identifier";
            }
    
            leaf multicast-group {
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || (".. .. .. switch-options remote-vtep-list" || (".. ovsdb-managed" || ("routing-instances ${instance} switch-options ovsdb-managed" || ".. .. .. .. protocols evpn encapsulation vxlan"))))))";
              junos:must-message "multicast-group not valid with remote-vtep-list or ovsdb-managed or evpn configuration";
              type jt:ipv4addr;
              description
                "Multicast group registered for VXLAN segment";
            }
    
            leaf encapsulate-inner-vlan {
              type empty;
              description
                "Retain inner VLAN in the packet";
            }
    
            leaf decapsulate-accept-inner-vlan {
              type empty;
              description
                "Accept VXLAN packets with inner VLAN";
            }
    
            leaf unreachable-vtep-aging-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "300 .. 1800";
                }
              }
              units "seconds";
              description
                "Unreachable VXLAN tunnel endpoint removal timer";
            }
    
            leaf-list static-remote-vtep-list {
              type jt:ipaddr;
              max-elements 1024;
              description
                "Configure vlan specific static remote VXLAN tunnel endpoints";
            }
    
            leaf riot-loopback {
              type empty;
              description
                "Enable loopback on RIOT platform";
            }
          }  // container vxlan
        }  // grouping vlan-types
    
        grouping juniper-ethernet-switching-forwarding-options {
          uses apply-advanced;
    
          container filter {
            description
              "Filtering for ethernet switching forwarding table";
            uses apply-advanced;
    
            leaf input {
              type string;
              description
                "Name of input filter to apply for forwarded packets";
            }
    
            leaf output {
              junos:must "(!(any "firewall family ethernet-switching filter $$ term <*> from traffic-type-except"))";
              junos:must-message "Vacl with term as 'from traffic-type-except' not supported on the egress side";
              junos:must "(!(any "firewall family ethernet-switching filter $$ term <*> from traffic-type"))";
              junos:must-message "Vacl with term as 'from traffic-type' not supported on the egress side";
              type string;
              description
                "Name of output filter to apply for forwarded packets";
            }
          }  // container filter
    
          container flood {
            description
              "Filtering for ethernet switching flood table";
            uses apply-advanced;
    
            leaf input {
              type string;
              description
                "Name of input filter to apply for ethernet switching flood packets";
            }
          }  // container flood
    
          container dhcp-relay {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'dhcp-relay' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            status deprecated;
            description
              "Dynamic Host Configuration Protocol relay configuration";
            uses jdhcp-relay-type;
          }  // container dhcp-relay
    
          container dhcp-security {
            presence "enable dhcp-security";
            description
              "DHCP access security configuration";
            uses jdhcp-security-type;
          }  // container dhcp-security
        }  // grouping juniper-ethernet-switching-forwarding-options
    
        grouping juniper-protocols-vlan {
          description
            "VLANs switch-options configuration";
          uses apply-advanced;
    
          container mac-table-size {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-table-size needs to be specified under switch-options for a virtual-switch instance";
            junos:must "((".. .. vlan-id" || ".. .. vlan-id-list"))";
            junos:must-message "Only vlans with vlan-id/vlan-id-list can support this switch-option";
            junos:must "(!(".. .. .. .. vlans ${vlan} private-vlan"))";
            junos:must-message "Switch-options configuration is not allowed on secondary VLANs";
            description
              "Size of MAC address forwarding table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container mac-table-size
    
          container mac-ip-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-ip-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC+IP bindings table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings";
            }
          }  // container mac-ip-table-size
    
          container interface-mac-limit {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-limit needs to be specified under switch-options for a virtual-switch instance";
            junos:must "((".. .. vlan-id" || ".. .. vlan-id-list"))";
            junos:must-message "Only vlans with vlan-id/vlan-id-list can support this switch-option";
            junos:must "(!(".. .. .. .. vlans ${vlan} private-vlan"))";
            junos:must-message "Switch-options configuration is not allowed on secondary VLANs";
            description
              "Maximum MAC address learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses per interface";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
                enum "log" {
                  value 2;
                  description
                    "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                }
                enum "shutdown" {
                  value 3;
                  description
                    "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                }
                enum "drop-and-log" {
                  value 4;
                  description
                    "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container interface-mac-limit
    
          container interface-mac-ip-limit {
            description
              "Maximum number of MAC+IP bindings learned on the interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings per interface";
            }
          }  // container interface-mac-ip-limit
    
          leaf mac-table-aging-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            units "seconds";
            description
              "Delay for discarding MAC address if no updates are received";
          }
    
          leaf no-mac-learning {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "no-mac-learning needs to be specified under switch-options for a virtual-switch instance";
            junos:must "(!(".. .. .. .. vlans ${vlan} private-vlan"))";
            junos:must-message "Switch-options configuration is not allowed on secondary VLANs";
            type empty;
            description
              "Disable dynamic MAC address learning";
          }
    
          leaf no-normalization {
            type empty;
            description
              "Disable vlan id normalization for interfaces";
          }
    
          leaf mac-statistics {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-statistics needs to be specified under switch-options for a virtual-switch instance";
            junos:must "(!(".. .. .. .. vlans ${vlan} private-vlan"))";
            junos:must-message "Switch-options configuration is not allowed on secondary VLANs";
            type empty;
            description
              "Enable MAC address statistics";
          }
    
          container static-rvtep-mac {
            description
              "Configure Static MAC and remote VxLAN tunnel endpoint entries";
            uses apply-advanced;
    
            list mac {
              key "mac_addr remote-vtep";
              description "Unicast MAC address";
              leaf mac_addr {
                type jt:mac-unicast;
              }
    
              leaf remote-vtep {
                type jt:ipaddr;
                description
                  "Configure static remote VXLAN tunnel endpoints";
              }
            }  // list mac
          }  // container static-rvtep-mac
    
          list interface {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface needs to be specified under switch-options for a virtual-switch instance";
            key "name";
            ordered-by user;
            description
              "Interface that connect this site to the VPN";
            leaf name {
              junos:must "(((".. .. .. interface $$" || (".. .. .. .. .. interface $$" || "interfaces $$-IFL family ethernet-switching vlan")) || "interfaces $$-IFL family ethernet-switching"))";
              junos:must-message "Interface must be part of this routing instance";
              junos:must "((".. .. .. interface $$" || (".. .. .. .. .. interface $$" || "interfaces $$-IFL family ethernet-switching")))";
              junos:must-message "Interface must be part of this routing instance";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container interface-mac-limit {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              description
                "Maximum number of MAC addresses learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC addresses per interface";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable interface for interface-mac-limit";
              }
    
              leaf packet-action {
                type enumeration {
                  enum "none" {
                    value 0;
                    description
                      "Forward the packet";
                  }
                  enum "drop" {
                    value 1;
                    description
                      "Drop packets and do not learn. Default is forward";
                  }
                  enum "log" {
                    value 2;
                    description
                      "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "shutdown" {
                    value 3;
                    description
                      "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "drop-and-log" {
                    value 4;
                    description
                      "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                  }
                }
                description
                  "Action when MAC limit is reached";
              }
            }  // container interface-mac-limit
    
            leaf action-priority {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 8";
                }
              }
              description
                "Blocking priority of this interface on mac move detection";
            }
    
            list static-mac {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              key "name";
              ordered-by user;
              description
                "Static MAC addresses assigned to this interface";
              leaf name {
                junos:must "((!(".. .. .. .. vlan-id all") || all ".. vlan-id <*>"))";
                junos:must-message " Specify vlan-id for qualified learning ";
                type jt:mac-addr;
                description "MAC address";
              }
    
              uses apply-advanced;
    
              list vlan-id {
                junos:must "(".. .. .. .. vlan-id all")";
                junos:must-message "'vlan-id all' has to be configured for the bridging domain";
                key "name";
                ordered-by user;
                description
                  "VLAN ID of learning VLAN";
                leaf name {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4094";
                    }
                  }
                  description "Learning VLAN";
                }
    
                uses apply-advanced;
              }  // list vlan-id
            }  // list static-mac
    
            container interface-mac-ip-limit {
              description
                "Maximum number of MAC+IP bindings learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC+IP bindings per interface";
              }
            }  // container interface-mac-ip-limit
    
            leaf no-mac-learning {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              junos:must "(!(".. .. .. private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaceswhich are part of secondary VLANs";
              type empty;
              description
                "Disable dynamic MAC address learning";
            }
    
            leaf mac-pinning {
              type empty;
              description "Enable MAC pinning";
            }
    
            leaf persistent-learning {
              junos:must "(!("switch-options mac-table-aging-time "))";
              junos:must-message "Persistent learning can not co-exist with mac-table-aging-time";
              type empty;
              description
                "Enable persistent MAC learning on this interface";
            }
          }  // list interface
    
          container traceoptions {
            description
              "Trace options for this bridge domain";
            uses apply-advanced;
    
            leaf no-remote-trace {
              junos:must "("system tracing")";
              junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
              type empty;
              description
                "Disable remote tracing";
            }
    
            container file {
              description
                "Trace file information";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "3";
                description
                  "Maximum number of trace files";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
    
              leaf match {
                type jt:regular-expression;
                description
                  "Regular expression for lines to be logged";
              }
            }  // container file
    
            leaf level {
              type enumeration {
                enum "error" {
                  value 0;
                  description
                    "Match error conditions";
                }
                enum "warning" {
                  value 1;
                  description
                    "Match warning messages";
                }
                enum "notice" {
                  value 2;
                  description
                    "Match conditions that should be handled specially";
                }
                enum "info" {
                  value 3;
                  description
                    "Match informational messages";
                }
                enum "verbose" {
                  value 4;
                  description
                    "Match verbose messages";
                }
                enum "all" {
                  value 5;
                  description "Match all levels";
                }
              }
              default "error";
              description
                "Level of debugging output";
            }
    
            list flag {
              key "name";
              ordered-by user;
              description
                "Type of operation or event to include in trace";
              leaf name {
                type enumeration {
                  enum "configuration" {
                    value 0;
                    description
                      "Configuration operations";
                  }
                  enum "routing-socket" {
                    value 1;
                    description
                      "Routing socket operations";
                  }
                  enum "interface-device" {
                    value 2;
                    description
                      "Interface device operations";
                  }
                  enum "interface-logical" {
                    value 3;
                    description
                      "Logical interface operations";
                  }
                  enum "interface-family" {
                    value 4;
                    description
                      "Interface family operations";
                  }
                  enum "learning-domain" {
                    value 5;
                    description
                      "Learning domain operations";
                  }
                  enum "ipc" {
                    value 6;
                    description
                      "Inter-process communications operations";
                  }
                  enum "mac-learning" {
                    value 7;
                    description
                      "MAC address learning operations";
                  }
                  enum "initialization" {
                    value 8;
                    description
                      "Initialization operations";
                  }
                  enum "flood-next-hop" {
                    value 9;
                    description
                      "Flood next hop operations";
                  }
                  enum "storm-control" {
                    value 10;
                    description "Storm-control";
                  }
                  enum
                    "unknown-unicast-forwarding" {
                    value 11;
                    description
                      "Trace unknown unicast forwarding events";
                  }
                  enum "all" {
                    value 12;
                    description "All operations";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
        }  // grouping juniper-protocols-vlan
    
        grouping write-option-82-type {
          uses apply-advanced;
        }  // grouping write-option-82-type
      }  // module junos-ex-conf-routing-instances
    

© 2024 YumaWorks, Inc. All rights reserved.