##// END OF EJS Templates
diffs: sticky top-file bar + context aware file labels....
marcink -
r3126:4c30a2d8 default
parent child Browse files
Show More
@@ -1,196 +1,200 b''
1 1 {
2 2 "dirs": {
3 3 "css": {
4 4 "src":"rhodecode/public/css",
5 5 "dest":"rhodecode/public/css"
6 6 },
7 7 "js": {
8 8 "src": "rhodecode/public/js/src",
9 9 "src_rc": "rhodecode/public/js/rhodecode",
10 10 "dest": "rhodecode/public/js",
11 11 "bower": "bower_components",
12 12 "node_modules": "node_modules"
13 13 }
14 14 },
15 15 "copy": {
16 16 "main": {
17 17 "expand": true,
18 18 "cwd": "bower_components",
19 19 "src": "webcomponentsjs/webcomponents-lite.js",
20 20 "dest": "<%= dirs.js.dest %>/vendors"
21 21 }
22 22 },
23 23 "concat": {
24 24 "polymercss": {
25 25 "src": [
26 26 "<%= dirs.js.src %>/components/root-styles-prefix.html",
27 27 "<%= dirs.css.src %>/style-polymer.css",
28 28 "<%= dirs.js.src %>/components/root-styles-suffix.html"
29 29 ],
30 30 "dest": "<%= dirs.js.dest %>/src/components/root-styles.gen.html",
31 31 "nonull": true
32 32 },
33 33 "dist": {
34 34 "src": [
35 35 "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js",
36 36 "<%= dirs.js.node_modules %>/mousetrap/mousetrap.min.js",
37 37 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
38 38 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
39 39 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
40 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
41 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
42 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
43 "<%= dirs.js.node_modules %>/waypoints/lib/jquery.waypoints.min.js",
40 44 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
41 45 "<%= dirs.js.src %>/logging.js",
42 46 "<%= dirs.js.src %>/bootstrap.js",
43 47 "<%= dirs.js.src %>/i18n_utils.js",
44 48 "<%= dirs.js.src %>/deform.js",
45 49 "<%= dirs.js.src %>/ejs.js",
46 50 "<%= dirs.js.src %>/ejs_templates/utils.js",
47 51 "<%= dirs.js.src %>/plugins/jquery.pjax.js",
48 52 "<%= dirs.js.src %>/plugins/jquery.dataTables.js",
49 53 "<%= dirs.js.src %>/plugins/flavoured_checkbox.js",
50 54 "<%= dirs.js.src %>/plugins/jquery.auto-grow-input.js",
51 55 "<%= dirs.js.src %>/plugins/jquery.autocomplete.js",
52 56 "<%= dirs.js.src %>/plugins/jquery.debounce.js",
53 57 "<%= dirs.js.src %>/plugins/jquery.mark.js",
54 58 "<%= dirs.js.src %>/plugins/jquery.timeago.js",
55 59 "<%= dirs.js.src %>/plugins/jquery.timeago-extension.js",
56 60 "<%= dirs.js.src %>/select2/select2.js",
57 61 "<%= dirs.js.src %>/codemirror/codemirror.js",
58 62 "<%= dirs.js.src %>/codemirror/codemirror_loadmode.js",
59 63 "<%= dirs.js.src %>/codemirror/codemirror_hint.js",
60 64 "<%= dirs.js.src %>/codemirror/codemirror_overlay.js",
61 65 "<%= dirs.js.src %>/codemirror/codemirror_placeholder.js",
62 66 "<%= dirs.js.src %>/codemirror/codemirror_simplemode.js",
63 67 "<%= dirs.js.dest %>/mode/meta.js",
64 68 "<%= dirs.js.dest %>/mode/meta_ext.js",
65 69 "<%= dirs.js.src_rc %>/i18n/select2/translations.js",
66 70 "<%= dirs.js.src %>/rhodecode/utils/array.js",
67 71 "<%= dirs.js.src %>/rhodecode/utils/string.js",
68 72 "<%= dirs.js.src %>/rhodecode/utils/pyroutes.js",
69 73 "<%= dirs.js.src %>/rhodecode/utils/ajax.js",
70 74 "<%= dirs.js.src %>/rhodecode/utils/autocomplete.js",
71 75 "<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js",
72 76 "<%= dirs.js.src %>/rhodecode/utils/ie.js",
73 77 "<%= dirs.js.src %>/rhodecode/utils/os.js",
74 78 "<%= dirs.js.src %>/rhodecode/utils/topics.js",
75 79 "<%= dirs.js.src %>/rhodecode/init.js",
76 80 "<%= dirs.js.src %>/rhodecode/changelog.js",
77 81 "<%= dirs.js.src %>/rhodecode/codemirror.js",
78 82 "<%= dirs.js.src %>/rhodecode/comments.js",
79 83 "<%= dirs.js.src %>/rhodecode/constants.js",
80 84 "<%= dirs.js.src %>/rhodecode/files.js",
81 85 "<%= dirs.js.src %>/rhodecode/followers.js",
82 86 "<%= dirs.js.src %>/rhodecode/menus.js",
83 87 "<%= dirs.js.src %>/rhodecode/notifications.js",
84 88 "<%= dirs.js.src %>/rhodecode/permissions.js",
85 89 "<%= dirs.js.src %>/rhodecode/pjax.js",
86 90 "<%= dirs.js.src %>/rhodecode/pullrequests.js",
87 91 "<%= dirs.js.src %>/rhodecode/settings.js",
88 92 "<%= dirs.js.src %>/rhodecode/select2_widgets.js",
89 93 "<%= dirs.js.src %>/rhodecode/tooltips.js",
90 94 "<%= dirs.js.src %>/rhodecode/users.js",
91 95 "<%= dirs.js.src %>/rhodecode/appenlight.js",
92 96 "<%= dirs.js.src %>/rhodecode.js"
93 97 ],
94 98 "dest": "<%= dirs.js.dest %>/scripts.js",
95 99 "nonull": true
96 100 }
97 101 },
98 102 "crisper": {
99 103 "dist": {
100 104 "options": {
101 105 "cleanup": false,
102 106 "onlySplit": true
103 107 },
104 108 "src": "<%= dirs.js.dest %>/rhodecode-components.html",
105 109 "dest": "<%= dirs.js.dest %>/rhodecode-components.js"
106 110 }
107 111 },
108 112 "less": {
109 113 "development": {
110 114 "options": {
111 115 "compress": false,
112 116 "yuicompress": false,
113 117 "optimization": 0
114 118 },
115 119 "files": {
116 120 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
117 121 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less"
118 122 }
119 123 },
120 124 "production": {
121 125 "options": {
122 126 "compress": true,
123 127 "yuicompress": true,
124 128 "optimization": 2
125 129 },
126 130 "files": {
127 131 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
128 132 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less"
129 133 }
130 134 },
131 135 "components": {
132 136 "files": [
133 137 {
134 138 "cwd": "<%= dirs.js.src %>/components/",
135 139 "dest": "<%= dirs.js.src %>/components/",
136 140 "src": [
137 141 "**/*.less"
138 142 ],
139 143 "expand": true,
140 144 "ext": ".css"
141 145 }
142 146 ]
143 147 }
144 148 },
145 149 "watch": {
146 150 "less": {
147 151 "files": [
148 152 "<%= dirs.css.src %>/**/*.less",
149 153 "<%= dirs.js.src %>/components/**/*.less"
150 154 ],
151 155 "tasks": [
152 156 "less:development",
153 157 "less:components",
154 158 "concat:polymercss",
155 159 "vulcanize",
156 160 "crisper",
157 161 "concat:dist"
158 162 ]
159 163 },
160 164 "js": {
161 165 "files": [
162 166 "!<%= dirs.js.src %>/components/root-styles.gen.html",
163 167 "<%= dirs.js.src %>/**/*.js",
164 168 "<%= dirs.js.src %>/components/**/*.html"
165 169 ],
166 170 "tasks": [
167 171 "less:components",
168 172 "concat:polymercss",
169 173 "vulcanize",
170 174 "crisper",
171 175 "concat:dist"
172 176 ]
173 177 }
174 178 },
175 179 "jshint": {
176 180 "rhodecode": {
177 181 "src": "<%= dirs.js.src %>/rhodecode/**/*.js",
178 182 "options": {
179 183 "jshintrc": ".jshintrc"
180 184 }
181 185 }
182 186 },
183 187 "vulcanize": {
184 188 "default": {
185 189 "options": {
186 190 "abspath": "",
187 191 "inlineScripts": true,
188 192 "inlineCss": true,
189 193 "stripComments": true
190 194 },
191 195 "files": {
192 196 "<%= dirs.js.dest %>/rhodecode-components.html": "<%= dirs.js.src %>/components/shared-components.html"
193 197 }
194 198 }
195 199 }
196 200 }
@@ -1,33 +1,35 b''
1 1 {
2 2 "name": "rhodecode-enterprise",
3 3 "version": "1.0.0",
4 4 "private": true,
5 5 "description" : "RhodeCode JS packaged",
6 6 "license": "SEE LICENSE IN LICENSE.txt",
7 7 "repository" : {
8 8 "type" : "hg",
9 9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
10 10 },
11 11 "devDependencies": {
12 12 "grunt": "^0.4.5",
13 13 "grunt-contrib-copy": "^1.0.0",
14 14 "grunt-contrib-concat": "^0.5.1",
15 15 "grunt-contrib-jshint": "^0.12.0",
16 16 "grunt-contrib-less": "^1.1.0",
17 17 "grunt-contrib-watch": "^0.6.1",
18 18 "crisper": "^2.1.1",
19 19 "vulcanize": "^1.16.0",
20 20 "grunt-crisper": "^1.0.1",
21 21 "grunt-vulcanize": "^1.0.0",
22 22 "node2nix": "^1.0.0",
23 23 "jshint": "^2.9.1-rc3",
24 24 "bower": "^1.8.4",
25 25 "jquery": "1.11.3",
26 26 "favico.js": "^0.3.10",
27 27 "clipboard": "^2.0.1",
28 28 "qrious": "^4.0.2",
29 29 "moment": "^2.18.1",
30 30 "mousetrap": "^1.6.1",
31 "sticky-sidebar": "3.3.1",
32 "waypoints": "4.0.1",
31 33 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
32 34 }
33 35 }
@@ -1,30 +1,30 b''
1 1 # Generated by bower2nix v3.2.0 (https://github.com/rvl/bower2nix)
2 2 { fetchbower, buildEnv }:
3 3 buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
4 (fetchbower "webcomponentsjs" "1.2.3" "^1.2.3" "0db2fjk779rhl9d4ifpk1j9a83vngx6j3hk7si1752dqxj857267")
5 (fetchbower "polymer" "Polymer/polymer#2.6.0" "Polymer/polymer#^2.6.0" "1jw5syjn0naa7dlxzxvsgwb20zbkbpx0pcg0wzjq4wr49c20nw0k")
6 (fetchbower "paper-button" "PolymerElements/paper-button#2.1.2" "PolymerElements/paper-button#^2.1.2" "1lwmjwhvimh02gss39yjp5h7yg9mxl1ig59yrk085v86y5f5ilz1")
4 (fetchbower "webcomponentsjs" "1.2.7" "^1.2.3" "0wbybia53zjfcyh4yvjc4ds8vvfizmmsyd35qgja4v0hlyvf4zms")
5 (fetchbower "polymer" "Polymer/polymer#2.6.1" "Polymer/polymer#^2.6.0" "0zr44hh50851hfqwgw5r4pa330p1jp60rrffcqrw3wwggfl38s4n")
6 (fetchbower "paper-button" "PolymerElements/paper-button#2.1.3" "PolymerElements/paper-button#^2.1.2" "1w016daj1l8hyklaqskcz4c3zxcm77cd5k3lj0324xn45n3vvphc")
7 7 (fetchbower "paper-spinner" "PolymerElements/paper-spinner#2.1.0" "PolymerElements/paper-spinner#^2.1.0" "07jamgxzvy4r9pgf5ikj1fm8nkrw6sywgcxvmm7ax58hjvmd4i45")
8 8 (fetchbower "paper-tooltip" "PolymerElements/paper-tooltip#2.1.1" "PolymerElements/paper-tooltip#^2.1.1" "0ja9vz4xps7dxfx6kmrwq0gifbjsyc3pk9l3hd5233ss72ghlvgb")
9 9 (fetchbower "paper-toast" "PolymerElements/paper-toast#2.1.2" "PolymerElements/paper-toast#^2.1.2" "0mkj9ayjx2l9hvrz4kw3yjbgrs9w873k05ywv94nh92mzpjkxn04")
10 10 (fetchbower "paper-toggle-button" "PolymerElements/paper-toggle-button#2.1.1" "PolymerElements/paper-toggle-button#^2.1.1" "1rl5ar3ny6r3v9hr8s68v8b3zh5yl52pikhi4b9iv9grv29g5999")
11 11 (fetchbower "iron-ajax" "PolymerElements/iron-ajax#2.1.3" "PolymerElements/iron-ajax#^2.1.3" "187zb6lkv18yapl292qhn611mbl4i2bqs2dimlwmdjaln285nc1l")
12 12 (fetchbower "iron-autogrow-textarea" "PolymerElements/iron-autogrow-textarea#2.2.0" "PolymerElements/iron-autogrow-textarea#^2.2.0" "1cx7g49m20z08x25z24g2pvv6m6dwfbkga3nsw0rpi3jk7xhznqw")
13 13 (fetchbower "iron-a11y-keys" "PolymerElements/iron-a11y-keys#2.1.2" "PolymerElements/iron-a11y-keys#^2.1.2" "0zdn3bzfrk88iwahmmzvcjn3m90zga1l8dx42b365n8if0n0zapj")
14 (fetchbower "shadycss" "webcomponents/shadycss#1.3.5" "webcomponents/shadycss#^v1.1.0" "1xp07d6jlmc3ywg4cdp2nijwi0vrbzw468242xz0s6zx5z2n2wzf")
14 (fetchbower "shadycss" "webcomponents/shadycss#1.5.2" "webcomponents/shadycss#^v1.1.0" "03fgbgvb80zjrgnq43gk0hr4cbvjs8rkqpfv1c2qsn7b6q71izlx")
15 15 (fetchbower "iron-flex-layout" "PolymerElements/iron-flex-layout#2.0.3" "PolymerElements/iron-flex-layout#1 - 2" "1ir9ili3rkcgbfj6is5s70vyb7m6avz0av0lpjjlhhsplrrl90bk")
16 16 (fetchbower "paper-behaviors" "PolymerElements/paper-behaviors#2.1.1" "PolymerElements/paper-behaviors#1 - 2" "0wzyznmy1q64jsm6lck0xma92lg2hz9h9m05r68iy20iyrvbjld7")
17 17 (fetchbower "paper-styles" "PolymerElements/paper-styles#2.1.0" "PolymerElements/paper-styles#1 - 2" "0xzsd7pvjsk7lgcmvx4q0dvps40q3mymkx26zgs8ns91s1ssfqbx")
18 18 (fetchbower "iron-a11y-announcer" "PolymerElements/iron-a11y-announcer#2.1.0" "PolymerElements/iron-a11y-announcer#1 - 2" "1hvmw76im8y3pxmg1yfnlkzap429q9i4v1z42y7m8lz0996jmxrz")
19 19 (fetchbower "iron-overlay-behavior" "PolymerElements/iron-overlay-behavior#2.3.4" "PolymerElements/iron-overlay-behavior#1 - 2" "0hk2fxhfz7kg27349qz1c87vq6nfdcnjr9az3q95ak3rigsb71wg")
20 20 (fetchbower "iron-fit-behavior" "PolymerElements/iron-fit-behavior#2.2.1" "PolymerElements/iron-fit-behavior#1 - 2" "0v89am4r2fncr7m9k0f2xqh5bvgn2dqjjc7p515ix4grk89whbs3")
21 21 (fetchbower "iron-checked-element-behavior" "PolymerElements/iron-checked-element-behavior#2.1.1" "PolymerElements/iron-checked-element-behavior#1 - 2" "00gpvnb7anspadw59av7lca6p03qlx59dgnhw3lqf5v223dsh0l3")
22 22 (fetchbower "iron-behaviors" "PolymerElements/iron-behaviors#2.1.1" "PolymerElements/iron-behaviors#1 - 2" "0c71l1il76jg8gvyh8bwlqraif53gfnz5700vpg35qyr1biwbr1w")
23 23 (fetchbower "iron-validatable-behavior" "PolymerElements/iron-validatable-behavior#2.1.0" "PolymerElements/iron-validatable-behavior#1 - 2" "1j65zv7hcxdcyyanzhp2wap3bnx7cz8ghd44m12fad2206jj6ysi")
24 24 (fetchbower "iron-a11y-keys-behavior" "PolymerElements/iron-a11y-keys-behavior#2.1.1" "PolymerElements/iron-a11y-keys-behavior#1 - 2" "0jsw7wvh4wzcjqdbvxyha99h1ph61lykyyyvdb6hm8m8w40bhs9b")
25 25 (fetchbower "paper-ripple" "PolymerElements/paper-ripple#2.1.1" "PolymerElements/paper-ripple#1 - 2" "0sam6w83nxf9mss79j6hjfsx0288pf4hwr1bw5xclzgpddcjmrm5")
26 26 (fetchbower "font-roboto" "PolymerElements/font-roboto#1.1.0" "PolymerElements/font-roboto#^1.0.1" "0z4msvaa5pnr84j2r957g313fmdbdbrknhdw1axy5g48845yv04s")
27 27 (fetchbower "iron-resizable-behavior" "PolymerElements/iron-resizable-behavior#2.1.1" "PolymerElements/iron-resizable-behavior#1 - 2" "0169rg6kby0ypfiwbkin46ywaszwj7r91yn081yqd96l1115aqnk")
28 28 (fetchbower "iron-form-element-behavior" "PolymerElements/iron-form-element-behavior#2.1.3" "PolymerElements/iron-form-element-behavior#1 - 2" "1c83kkfqvb5pdlvrhad3l7b11i244a8lykc8kzfnb9ya0xrln0cn")
29 29 (fetchbower "iron-meta" "PolymerElements/iron-meta#2.1.1" "PolymerElements/iron-meta#1 - 2" "12w1pcl3w97xpxihqddbf2d9dx8xz5i1jd9bz1xrmfsh25isni40")
30 30 ]; }
@@ -1,3386 +1,3406 b''
1 1 # This file has been generated by node2nix 1.6.0. Do not edit!
2 2
3 3 {nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
4 4
5 5 let
6 6 sources = {
7 7 "@types/clone-0.1.30" = {
8 8 name = "_at_types_slash_clone";
9 9 packageName = "@types/clone";
10 10 version = "0.1.30";
11 11 src = fetchurl {
12 12 url = "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz";
13 13 sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614";
14 14 };
15 15 };
16 "@types/node-4.2.23" = {
16 "@types/node-4.9.0" = {
17 17 name = "_at_types_slash_node";
18 18 packageName = "@types/node";
19 version = "4.2.23";
20 src = fetchurl {
21 url = "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz";
22 sha512 = "U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==";
23 };
24 };
25 "@types/node-6.0.114" = {
19 version = "4.9.0";
20 src = fetchurl {
21 url = "https://registry.npmjs.org/@types/node/-/node-4.9.0.tgz";
22 sha512 = "xUFkZ+er9gUGw0x9qyfmr/Th0LuX6IB0m7HrRMB6sO6vcBVRFZ/3YV1EeiOC2fG50RX09avDfKwGBHOnPVxFeg==";
23 };
24 };
25 "@types/node-6.0.118" = {
26 26 name = "_at_types_slash_node";
27 27 packageName = "@types/node";
28 version = "6.0.114";
29 src = fetchurl {
30 url = "https://registry.npmjs.org/@types/node/-/node-6.0.114.tgz";
31 sha512 = "5ViC9dwf1VIAtrOFTvOuN04lJgw28eKjuy0Vg2Bd/fSlxKP2feCSkIw04ZgOENL2ywdWrtbkthp1XVLEjJmouw==";
28 version = "6.0.118";
29 src = fetchurl {
30 url = "https://registry.npmjs.org/@types/node/-/node-6.0.118.tgz";
31 sha512 = "N33cKXGSqhOYaPiT4xUGsYlPPDwFtQM/6QxJxuMXA/7BcySW+lkn2yigWP7vfs4daiL/7NJNU6DMCqg5N4B+xQ==";
32 32 };
33 33 };
34 34 "@types/parse5-0.0.31" = {
35 35 name = "_at_types_slash_parse5";
36 36 packageName = "@types/parse5";
37 37 version = "0.0.31";
38 38 src = fetchurl {
39 url = "https://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz";
39 url = "http://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz";
40 40 sha1 = "e827a493a443b156e1b582a2e4c3bdc0040f2ee7";
41 41 };
42 42 };
43 43 "abbrev-1.1.1" = {
44 44 name = "abbrev";
45 45 packageName = "abbrev";
46 46 version = "1.1.1";
47 47 src = fetchurl {
48 48 url = "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz";
49 49 sha512 = "nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==";
50 50 };
51 51 };
52 52 "acorn-3.3.0" = {
53 53 name = "acorn";
54 54 packageName = "acorn";
55 55 version = "3.3.0";
56 56 src = fetchurl {
57 57 url = "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz";
58 58 sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
59 59 };
60 60 };
61 "acorn-5.7.1" = {
61 "acorn-5.7.3" = {
62 62 name = "acorn";
63 63 packageName = "acorn";
64 version = "5.7.1";
65 src = fetchurl {
66 url = "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz";
67 sha512 = "d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==";
64 version = "5.7.3";
65 src = fetchurl {
66 url = "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz";
67 sha512 = "T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==";
68 68 };
69 69 };
70 70 "acorn-jsx-3.0.1" = {
71 71 name = "acorn-jsx";
72 72 packageName = "acorn-jsx";
73 73 version = "3.0.1";
74 74 src = fetchurl {
75 75 url = "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz";
76 76 sha1 = "afdf9488fb1ecefc8348f6fb22f464e32a58b36b";
77 77 };
78 78 };
79 79 "ajv-4.11.8" = {
80 80 name = "ajv";
81 81 packageName = "ajv";
82 82 version = "4.11.8";
83 83 src = fetchurl {
84 84 url = "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz";
85 85 sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
86 86 };
87 87 };
88 88 "amdefine-1.0.1" = {
89 89 name = "amdefine";
90 90 packageName = "amdefine";
91 91 version = "1.0.1";
92 92 src = fetchurl {
93 93 url = "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz";
94 94 sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5";
95 95 };
96 96 };
97 97 "ansi-escape-sequences-3.0.0" = {
98 98 name = "ansi-escape-sequences";
99 99 packageName = "ansi-escape-sequences";
100 100 version = "3.0.0";
101 101 src = fetchurl {
102 102 url = "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz";
103 103 sha1 = "1c18394b6af9b76ff9a63509fa497669fd2ce53e";
104 104 };
105 105 };
106 106 "ansi-regex-0.2.1" = {
107 107 name = "ansi-regex";
108 108 packageName = "ansi-regex";
109 109 version = "0.2.1";
110 110 src = fetchurl {
111 111 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz";
112 112 sha1 = "0d8e946967a3d8143f93e24e298525fc1b2235f9";
113 113 };
114 114 };
115 115 "ansi-regex-2.1.1" = {
116 116 name = "ansi-regex";
117 117 packageName = "ansi-regex";
118 118 version = "2.1.1";
119 119 src = fetchurl {
120 120 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
121 121 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
122 122 };
123 123 };
124 124 "ansi-styles-1.1.0" = {
125 125 name = "ansi-styles";
126 126 packageName = "ansi-styles";
127 127 version = "1.1.0";
128 128 src = fetchurl {
129 129 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz";
130 130 sha1 = "eaecbf66cd706882760b2f4691582b8f55d7a7de";
131 131 };
132 132 };
133 133 "ansi-styles-2.2.1" = {
134 134 name = "ansi-styles";
135 135 packageName = "ansi-styles";
136 136 version = "2.2.1";
137 137 src = fetchurl {
138 138 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";
139 139 sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
140 140 };
141 141 };
142 142 "appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1" = {
143 143 name = "appenlight-client";
144 144 packageName = "appenlight-client";
145 145 version = "0.5.1";
146 146 src = fetchgit {
147 147 url = "https://git@github.com/AppEnlight/appenlight-client-js.git";
148 148 rev = "14712c64c230fbbe94fcbc8094aef5eb3b90b307";
149 149 sha256 = "05146f5b932f166c9a4db601bc9c13ae686899653d1dd03121652631f9bc83d6";
150 150 };
151 151 };
152 152 "aproba-1.2.0" = {
153 153 name = "aproba";
154 154 packageName = "aproba";
155 155 version = "1.2.0";
156 156 src = fetchurl {
157 157 url = "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz";
158 158 sha512 = "Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==";
159 159 };
160 160 };
161 161 "are-we-there-yet-1.1.5" = {
162 162 name = "are-we-there-yet";
163 163 packageName = "are-we-there-yet";
164 164 version = "1.1.5";
165 165 src = fetchurl {
166 166 url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
167 167 sha512 = "5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==";
168 168 };
169 169 };
170 170 "argparse-0.1.16" = {
171 171 name = "argparse";
172 172 packageName = "argparse";
173 173 version = "0.1.16";
174 174 src = fetchurl {
175 175 url = "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz";
176 176 sha1 = "cfd01e0fbba3d6caed049fbd758d40f65196f57c";
177 177 };
178 178 };
179 179 "array-back-1.0.4" = {
180 180 name = "array-back";
181 181 packageName = "array-back";
182 182 version = "1.0.4";
183 183 src = fetchurl {
184 184 url = "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz";
185 185 sha1 = "644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b";
186 186 };
187 187 };
188 188 "asap-2.0.6" = {
189 189 name = "asap";
190 190 packageName = "asap";
191 191 version = "2.0.6";
192 192 src = fetchurl {
193 193 url = "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz";
194 194 sha1 = "e50347611d7e690943208bbdafebcbc2fb866d46";
195 195 };
196 196 };
197 "asn1-0.2.3" = {
197 "asn1-0.2.4" = {
198 198 name = "asn1";
199 199 packageName = "asn1";
200 version = "0.2.3";
201 src = fetchurl {
202 url = "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz";
203 sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86";
200 version = "0.2.4";
201 src = fetchurl {
202 url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
203 sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
204 204 };
205 205 };
206 206 "assert-plus-0.2.0" = {
207 207 name = "assert-plus";
208 208 packageName = "assert-plus";
209 209 version = "0.2.0";
210 210 src = fetchurl {
211 211 url = "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz";
212 212 sha1 = "d74e1b87e7affc0db8aadb7021f3fe48101ab234";
213 213 };
214 214 };
215 215 "assert-plus-1.0.0" = {
216 216 name = "assert-plus";
217 217 packageName = "assert-plus";
218 218 version = "1.0.0";
219 219 src = fetchurl {
220 220 url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
221 221 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
222 222 };
223 223 };
224 224 "async-0.1.22" = {
225 225 name = "async";
226 226 packageName = "async";
227 227 version = "0.1.22";
228 228 src = fetchurl {
229 229 url = "https://registry.npmjs.org/async/-/async-0.1.22.tgz";
230 230 sha1 = "0fc1aaa088a0e3ef0ebe2d8831bab0dcf8845061";
231 231 };
232 232 };
233 233 "async-0.2.10" = {
234 234 name = "async";
235 235 packageName = "async";
236 236 version = "0.2.10";
237 237 src = fetchurl {
238 238 url = "https://registry.npmjs.org/async/-/async-0.2.10.tgz";
239 239 sha1 = "b6bbe0b0674b9d719708ca38de8c237cb526c3d1";
240 240 };
241 241 };
242 242 "async-1.0.0" = {
243 243 name = "async";
244 244 packageName = "async";
245 245 version = "1.0.0";
246 246 src = fetchurl {
247 247 url = "https://registry.npmjs.org/async/-/async-1.0.0.tgz";
248 248 sha1 = "f8fc04ca3a13784ade9e1641af98578cfbd647a9";
249 249 };
250 250 };
251 251 "async-2.6.1" = {
252 252 name = "async";
253 253 packageName = "async";
254 254 version = "2.6.1";
255 255 src = fetchurl {
256 256 url = "https://registry.npmjs.org/async/-/async-2.6.1.tgz";
257 257 sha512 = "fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==";
258 258 };
259 259 };
260 260 "asynckit-0.4.0" = {
261 261 name = "asynckit";
262 262 packageName = "asynckit";
263 263 version = "0.4.0";
264 264 src = fetchurl {
265 265 url = "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz";
266 266 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
267 267 };
268 268 };
269 269 "aws-sign2-0.6.0" = {
270 270 name = "aws-sign2";
271 271 packageName = "aws-sign2";
272 272 version = "0.6.0";
273 273 src = fetchurl {
274 274 url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz";
275 275 sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f";
276 276 };
277 277 };
278 "aws4-1.7.0" = {
278 "aws4-1.8.0" = {
279 279 name = "aws4";
280 280 packageName = "aws4";
281 version = "1.7.0";
282 src = fetchurl {
283 url = "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz";
284 sha512 = "32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==";
281 version = "1.8.0";
282 src = fetchurl {
283 url = "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz";
284 sha512 = "ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==";
285 285 };
286 286 };
287 287 "babel-polyfill-6.26.0" = {
288 288 name = "babel-polyfill";
289 289 packageName = "babel-polyfill";
290 290 version = "6.26.0";
291 291 src = fetchurl {
292 292 url = "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz";
293 293 sha1 = "379937abc67d7895970adc621f284cd966cf2153";
294 294 };
295 295 };
296 296 "babel-runtime-6.26.0" = {
297 297 name = "babel-runtime";
298 298 packageName = "babel-runtime";
299 299 version = "6.26.0";
300 300 src = fetchurl {
301 301 url = "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz";
302 302 sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
303 303 };
304 304 };
305 305 "balanced-match-1.0.0" = {
306 306 name = "balanced-match";
307 307 packageName = "balanced-match";
308 308 version = "1.0.0";
309 309 src = fetchurl {
310 310 url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
311 311 sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
312 312 };
313 313 };
314 314 "base64-js-1.2.3" = {
315 315 name = "base64-js";
316 316 packageName = "base64-js";
317 317 version = "1.2.3";
318 318 src = fetchurl {
319 319 url = "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz";
320 320 sha512 = "MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==";
321 321 };
322 322 };
323 323 "bcrypt-pbkdf-1.0.2" = {
324 324 name = "bcrypt-pbkdf";
325 325 packageName = "bcrypt-pbkdf";
326 326 version = "1.0.2";
327 327 src = fetchurl {
328 328 url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
329 329 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
330 330 };
331 331 };
332 332 "boom-2.10.1" = {
333 333 name = "boom";
334 334 packageName = "boom";
335 335 version = "2.10.1";
336 336 src = fetchurl {
337 337 url = "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz";
338 338 sha1 = "39c8918ceff5799f83f9492a848f625add0c766f";
339 339 };
340 340 };
341 341 "bower-1.8.4" = {
342 342 name = "bower";
343 343 packageName = "bower";
344 344 version = "1.8.4";
345 345 src = fetchurl {
346 346 url = "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz";
347 347 sha1 = "e7876a076deb8137f7d06525dc5e8c66db82f28a";
348 348 };
349 349 };
350 350 "brace-expansion-1.1.11" = {
351 351 name = "brace-expansion";
352 352 packageName = "brace-expansion";
353 353 version = "1.1.11";
354 354 src = fetchurl {
355 355 url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";
356 356 sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
357 357 };
358 358 };
359 359 "buffer-from-1.1.1" = {
360 360 name = "buffer-from";
361 361 packageName = "buffer-from";
362 362 version = "1.1.1";
363 363 src = fetchurl {
364 364 url = "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz";
365 365 sha512 = "MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==";
366 366 };
367 367 };
368 368 "builtin-modules-1.1.1" = {
369 369 name = "builtin-modules";
370 370 packageName = "builtin-modules";
371 371 version = "1.1.1";
372 372 src = fetchurl {
373 373 url = "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz";
374 374 sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f";
375 375 };
376 376 };
377 377 "builtins-1.0.3" = {
378 378 name = "builtins";
379 379 packageName = "builtins";
380 380 version = "1.0.3";
381 381 src = fetchurl {
382 382 url = "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz";
383 383 sha1 = "cb94faeb61c8696451db36534e1422f94f0aee88";
384 384 };
385 385 };
386 386 "caseless-0.12.0" = {
387 387 name = "caseless";
388 388 packageName = "caseless";
389 389 version = "0.12.0";
390 390 src = fetchurl {
391 391 url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";
392 392 sha1 = "1b681c21ff84033c826543090689420d187151dc";
393 393 };
394 394 };
395 395 "chalk-0.5.1" = {
396 396 name = "chalk";
397 397 packageName = "chalk";
398 398 version = "0.5.1";
399 399 src = fetchurl {
400 400 url = "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz";
401 401 sha1 = "663b3a648b68b55d04690d49167aa837858f2174";
402 402 };
403 403 };
404 404 "chalk-1.1.3" = {
405 405 name = "chalk";
406 406 packageName = "chalk";
407 407 version = "1.1.3";
408 408 src = fetchurl {
409 409 url = "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";
410 410 sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
411 411 };
412 412 };
413 413 "cli-1.0.1" = {
414 414 name = "cli";
415 415 packageName = "cli";
416 416 version = "1.0.1";
417 417 src = fetchurl {
418 418 url = "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz";
419 419 sha1 = "22817534f24bfa4950c34d532d48ecbc621b8c14";
420 420 };
421 421 };
422 422 "clipboard-2.0.1" = {
423 423 name = "clipboard";
424 424 packageName = "clipboard";
425 425 version = "2.0.1";
426 426 src = fetchurl {
427 427 url = "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz";
428 428 sha512 = "7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==";
429 429 };
430 430 };
431 431 "clone-1.0.4" = {
432 432 name = "clone";
433 433 packageName = "clone";
434 434 version = "1.0.4";
435 435 src = fetchurl {
436 436 url = "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz";
437 437 sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
438 438 };
439 439 };
440 440 "co-4.6.0" = {
441 441 name = "co";
442 442 packageName = "co";
443 443 version = "4.6.0";
444 444 src = fetchurl {
445 445 url = "https://registry.npmjs.org/co/-/co-4.6.0.tgz";
446 446 sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
447 447 };
448 448 };
449 449 "code-point-at-1.1.0" = {
450 450 name = "code-point-at";
451 451 packageName = "code-point-at";
452 452 version = "1.1.0";
453 453 src = fetchurl {
454 454 url = "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";
455 455 sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
456 456 };
457 457 };
458 458 "coffee-script-1.3.3" = {
459 459 name = "coffee-script";
460 460 packageName = "coffee-script";
461 461 version = "1.3.3";
462 462 src = fetchurl {
463 463 url = "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz";
464 464 sha1 = "150d6b4cb522894369efed6a2101c20bc7f4a4f4";
465 465 };
466 466 };
467 467 "colors-0.6.2" = {
468 468 name = "colors";
469 469 packageName = "colors";
470 470 version = "0.6.2";
471 471 src = fetchurl {
472 472 url = "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz";
473 473 sha1 = "2423fe6678ac0c5dae8852e5d0e5be08c997abcc";
474 474 };
475 475 };
476 476 "colors-1.0.3" = {
477 477 name = "colors";
478 478 packageName = "colors";
479 479 version = "1.0.3";
480 480 src = fetchurl {
481 481 url = "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz";
482 482 sha1 = "0433f44d809680fdeb60ed260f1b0c262e82a40b";
483 483 };
484 484 };
485 "combined-stream-1.0.6" = {
485 "combined-stream-1.0.7" = {
486 486 name = "combined-stream";
487 487 packageName = "combined-stream";
488 version = "1.0.6";
489 src = fetchurl {
490 url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz";
491 sha1 = "723e7df6e801ac5613113a7e445a9b69cb632818";
488 version = "1.0.7";
489 src = fetchurl {
490 url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz";
491 sha512 = "brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==";
492 492 };
493 493 };
494 494 "command-line-args-3.0.5" = {
495 495 name = "command-line-args";
496 496 packageName = "command-line-args";
497 497 version = "3.0.5";
498 498 src = fetchurl {
499 499 url = "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz";
500 500 sha1 = "5bd4ad45e7983e5c1344918e40280ee2693c5ac0";
501 501 };
502 502 };
503 503 "command-line-usage-3.0.8" = {
504 504 name = "command-line-usage";
505 505 packageName = "command-line-usage";
506 506 version = "3.0.8";
507 507 src = fetchurl {
508 508 url = "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz";
509 509 sha1 = "b6a20978c1b383477f5c11a529428b880bfe0f4d";
510 510 };
511 511 };
512 512 "concat-map-0.0.1" = {
513 513 name = "concat-map";
514 514 packageName = "concat-map";
515 515 version = "0.0.1";
516 516 src = fetchurl {
517 517 url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
518 518 sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
519 519 };
520 520 };
521 521 "concat-stream-1.6.2" = {
522 522 name = "concat-stream";
523 523 packageName = "concat-stream";
524 524 version = "1.6.2";
525 525 src = fetchurl {
526 526 url = "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz";
527 527 sha512 = "27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==";
528 528 };
529 529 };
530 "config-chain-1.1.11" = {
530 "config-chain-1.1.12" = {
531 531 name = "config-chain";
532 532 packageName = "config-chain";
533 version = "1.1.11";
534 src = fetchurl {
535 url = "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz";
536 sha1 = "aba09747dfbe4c3e70e766a6e41586e1859fc6f2";
533 version = "1.1.12";
534 src = fetchurl {
535 url = "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz";
536 sha512 = "a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==";
537 537 };
538 538 };
539 539 "console-browserify-1.1.0" = {
540 540 name = "console-browserify";
541 541 packageName = "console-browserify";
542 542 version = "1.1.0";
543 543 src = fetchurl {
544 544 url = "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz";
545 545 sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10";
546 546 };
547 547 };
548 548 "console-control-strings-1.1.0" = {
549 549 name = "console-control-strings";
550 550 packageName = "console-control-strings";
551 551 version = "1.1.0";
552 552 src = fetchurl {
553 553 url = "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz";
554 554 sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
555 555 };
556 556 };
557 557 "core-js-2.5.7" = {
558 558 name = "core-js";
559 559 packageName = "core-js";
560 560 version = "2.5.7";
561 561 src = fetchurl {
562 562 url = "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz";
563 563 sha512 = "RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==";
564 564 };
565 565 };
566 566 "core-util-is-1.0.2" = {
567 567 name = "core-util-is";
568 568 packageName = "core-util-is";
569 569 version = "1.0.2";
570 570 src = fetchurl {
571 571 url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
572 572 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
573 573 };
574 574 };
575 575 "crisper-1.2.0" = {
576 576 name = "crisper";
577 577 packageName = "crisper";
578 578 version = "1.2.0";
579 579 src = fetchurl {
580 580 url = "https://registry.npmjs.org/crisper/-/crisper-1.2.0.tgz";
581 581 sha1 = "9a91f597d71f6110294e076ad44dbb3408568e46";
582 582 };
583 583 };
584 584 "crisper-2.1.1" = {
585 585 name = "crisper";
586 586 packageName = "crisper";
587 587 version = "2.1.1";
588 588 src = fetchurl {
589 589 url = "https://registry.npmjs.org/crisper/-/crisper-2.1.1.tgz";
590 590 sha512 = "yxfj9nTbFunDASztAxVF8hCPwaZBvTjayNzG3YL/VVQfQaKBXX2+TM3p1xB1Pxd8RYeDQJkJIQRwM3FQSIa+pw==";
591 591 };
592 592 };
593 593 "cryptiles-2.0.5" = {
594 594 name = "cryptiles";
595 595 packageName = "cryptiles";
596 596 version = "2.0.5";
597 597 src = fetchurl {
598 598 url = "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz";
599 599 sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8";
600 600 };
601 601 };
602 602 "cycle-1.0.3" = {
603 603 name = "cycle";
604 604 packageName = "cycle";
605 605 version = "1.0.3";
606 606 src = fetchurl {
607 607 url = "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz";
608 608 sha1 = "21e80b2be8580f98b468f379430662b046c34ad2";
609 609 };
610 610 };
611 611 "dashdash-1.14.1" = {
612 612 name = "dashdash";
613 613 packageName = "dashdash";
614 614 version = "1.14.1";
615 615 src = fetchurl {
616 616 url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
617 617 sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
618 618 };
619 619 };
620 620 "date-now-0.1.4" = {
621 621 name = "date-now";
622 622 packageName = "date-now";
623 623 version = "0.1.4";
624 624 src = fetchurl {
625 625 url = "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz";
626 626 sha1 = "eaf439fd4d4848ad74e5cc7dbef200672b9e345b";
627 627 };
628 628 };
629 629 "dateformat-1.0.2-1.2.3" = {
630 630 name = "dateformat";
631 631 packageName = "dateformat";
632 632 version = "1.0.2-1.2.3";
633 633 src = fetchurl {
634 634 url = "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz";
635 635 sha1 = "b0220c02de98617433b72851cf47de3df2cdbee9";
636 636 };
637 637 };
638 638 "debug-0.7.4" = {
639 639 name = "debug";
640 640 packageName = "debug";
641 641 version = "0.7.4";
642 642 src = fetchurl {
643 643 url = "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz";
644 644 sha1 = "06e1ea8082c2cb14e39806e22e2f6f757f92af39";
645 645 };
646 646 };
647 647 "debug-2.6.9" = {
648 648 name = "debug";
649 649 packageName = "debug";
650 650 version = "2.6.9";
651 651 src = fetchurl {
652 652 url = "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz";
653 653 sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
654 654 };
655 655 };
656 656 "deep-extend-0.4.2" = {
657 657 name = "deep-extend";
658 658 packageName = "deep-extend";
659 659 version = "0.4.2";
660 660 src = fetchurl {
661 661 url = "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz";
662 662 sha1 = "48b699c27e334bf89f10892be432f6e4c7d34a7f";
663 663 };
664 664 };
665 665 "deep-is-0.1.3" = {
666 666 name = "deep-is";
667 667 packageName = "deep-is";
668 668 version = "0.1.3";
669 669 src = fetchurl {
670 670 url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz";
671 671 sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
672 672 };
673 673 };
674 674 "delayed-stream-1.0.0" = {
675 675 name = "delayed-stream";
676 676 packageName = "delayed-stream";
677 677 version = "1.0.0";
678 678 src = fetchurl {
679 679 url = "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";
680 680 sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
681 681 };
682 682 };
683 683 "delegate-3.2.0" = {
684 684 name = "delegate";
685 685 packageName = "delegate";
686 686 version = "3.2.0";
687 687 src = fetchurl {
688 688 url = "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz";
689 689 sha512 = "IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==";
690 690 };
691 691 };
692 692 "delegates-1.0.0" = {
693 693 name = "delegates";
694 694 packageName = "delegates";
695 695 version = "1.0.0";
696 696 src = fetchurl {
697 697 url = "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz";
698 698 sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
699 699 };
700 700 };
701 701 "doctrine-0.7.2" = {
702 702 name = "doctrine";
703 703 packageName = "doctrine";
704 704 version = "0.7.2";
705 705 src = fetchurl {
706 706 url = "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz";
707 707 sha1 = "7cb860359ba3be90e040b26b729ce4bfa654c523";
708 708 };
709 709 };
710 710 "dom-serializer-0.1.0" = {
711 711 name = "dom-serializer";
712 712 packageName = "dom-serializer";
713 713 version = "0.1.0";
714 714 src = fetchurl {
715 715 url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz";
716 716 sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82";
717 717 };
718 718 };
719 719 "dom5-1.1.0" = {
720 720 name = "dom5";
721 721 packageName = "dom5";
722 722 version = "1.1.0";
723 723 src = fetchurl {
724 724 url = "https://registry.npmjs.org/dom5/-/dom5-1.1.0.tgz";
725 725 sha1 = "3a0c7700c083ab4c4d26938a78b0f0c6dcc37794";
726 726 };
727 727 };
728 728 "dom5-1.3.6" = {
729 729 name = "dom5";
730 730 packageName = "dom5";
731 731 version = "1.3.6";
732 732 src = fetchurl {
733 733 url = "https://registry.npmjs.org/dom5/-/dom5-1.3.6.tgz";
734 734 sha1 = "a7088a9fc5f3b08dc9f6eda4c7abaeb241945e0d";
735 735 };
736 736 };
737 737 "domelementtype-1.1.3" = {
738 738 name = "domelementtype";
739 739 packageName = "domelementtype";
740 740 version = "1.1.3";
741 741 src = fetchurl {
742 742 url = "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz";
743 743 sha1 = "bd28773e2642881aec51544924299c5cd822185b";
744 744 };
745 745 };
746 746 "domelementtype-1.3.0" = {
747 747 name = "domelementtype";
748 748 packageName = "domelementtype";
749 749 version = "1.3.0";
750 750 src = fetchurl {
751 751 url = "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz";
752 752 sha1 = "b17aed82e8ab59e52dd9c19b1756e0fc187204c2";
753 753 };
754 754 };
755 755 "domhandler-2.3.0" = {
756 756 name = "domhandler";
757 757 packageName = "domhandler";
758 758 version = "2.3.0";
759 759 src = fetchurl {
760 760 url = "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz";
761 761 sha1 = "2de59a0822d5027fabff6f032c2b25a2a8abe738";
762 762 };
763 763 };
764 764 "domutils-1.5.1" = {
765 765 name = "domutils";
766 766 packageName = "domutils";
767 767 version = "1.5.1";
768 768 src = fetchurl {
769 769 url = "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz";
770 770 sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
771 771 };
772 772 };
773 773 "ecc-jsbn-0.1.2" = {
774 774 name = "ecc-jsbn";
775 775 packageName = "ecc-jsbn";
776 776 version = "0.1.2";
777 777 src = fetchurl {
778 778 url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
779 779 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
780 780 };
781 781 };
782 782 "entities-1.0.0" = {
783 783 name = "entities";
784 784 packageName = "entities";
785 785 version = "1.0.0";
786 786 src = fetchurl {
787 787 url = "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz";
788 788 sha1 = "b2987aa3821347fcde642b24fdfc9e4fb712bf26";
789 789 };
790 790 };
791 791 "entities-1.1.1" = {
792 792 name = "entities";
793 793 packageName = "entities";
794 794 version = "1.1.1";
795 795 src = fetchurl {
796 796 url = "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz";
797 797 sha1 = "6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0";
798 798 };
799 799 };
800 800 "errno-0.1.7" = {
801 801 name = "errno";
802 802 packageName = "errno";
803 803 version = "0.1.7";
804 804 src = fetchurl {
805 805 url = "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz";
806 806 sha512 = "MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==";
807 807 };
808 808 };
809 809 "es6-promise-2.3.0" = {
810 810 name = "es6-promise";
811 811 packageName = "es6-promise";
812 812 version = "2.3.0";
813 813 src = fetchurl {
814 814 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz";
815 815 sha1 = "96edb9f2fdb01995822b263dd8aadab6748181bc";
816 816 };
817 817 };
818 "es6-promise-4.2.4" = {
818 "es6-promise-4.2.5" = {
819 819 name = "es6-promise";
820 820 packageName = "es6-promise";
821 version = "4.2.4";
822 src = fetchurl {
823 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz";
824 sha512 = "/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==";
821 version = "4.2.5";
822 src = fetchurl {
823 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz";
824 sha512 = "n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==";
825 825 };
826 826 };
827 827 "escape-string-regexp-1.0.5" = {
828 828 name = "escape-string-regexp";
829 829 packageName = "escape-string-regexp";
830 830 version = "1.0.5";
831 831 src = fetchurl {
832 832 url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
833 833 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
834 834 };
835 835 };
836 836 "escodegen-1.11.0" = {
837 837 name = "escodegen";
838 838 packageName = "escodegen";
839 839 version = "1.11.0";
840 840 src = fetchurl {
841 841 url = "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz";
842 842 sha512 = "IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==";
843 843 };
844 844 };
845 845 "espree-3.5.4" = {
846 846 name = "espree";
847 847 packageName = "espree";
848 848 version = "3.5.4";
849 849 src = fetchurl {
850 850 url = "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz";
851 851 sha512 = "yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==";
852 852 };
853 853 };
854 854 "esprima-1.0.4" = {
855 855 name = "esprima";
856 856 packageName = "esprima";
857 857 version = "1.0.4";
858 858 src = fetchurl {
859 859 url = "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz";
860 860 sha1 = "9f557e08fc3b4d26ece9dd34f8fbf476b62585ad";
861 861 };
862 862 };
863 863 "esprima-3.1.3" = {
864 864 name = "esprima";
865 865 packageName = "esprima";
866 866 version = "3.1.3";
867 867 src = fetchurl {
868 868 url = "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz";
869 869 sha1 = "fdca51cee6133895e3c88d535ce49dbff62a4633";
870 870 };
871 871 };
872 872 "estraverse-3.1.0" = {
873 873 name = "estraverse";
874 874 packageName = "estraverse";
875 875 version = "3.1.0";
876 876 src = fetchurl {
877 877 url = "https://registry.npmjs.org/estraverse/-/estraverse-3.1.0.tgz";
878 878 sha1 = "15e28a446b8b82bc700ccc8b96c78af4da0d6cba";
879 879 };
880 880 };
881 881 "estraverse-4.2.0" = {
882 882 name = "estraverse";
883 883 packageName = "estraverse";
884 884 version = "4.2.0";
885 885 src = fetchurl {
886 886 url = "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz";
887 887 sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
888 888 };
889 889 };
890 890 "esutils-1.1.6" = {
891 891 name = "esutils";
892 892 packageName = "esutils";
893 893 version = "1.1.6";
894 894 src = fetchurl {
895 895 url = "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz";
896 896 sha1 = "c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375";
897 897 };
898 898 };
899 899 "esutils-2.0.2" = {
900 900 name = "esutils";
901 901 packageName = "esutils";
902 902 version = "2.0.2";
903 903 src = fetchurl {
904 904 url = "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz";
905 905 sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b";
906 906 };
907 907 };
908 908 "eventemitter2-0.4.14" = {
909 909 name = "eventemitter2";
910 910 packageName = "eventemitter2";
911 911 version = "0.4.14";
912 912 src = fetchurl {
913 913 url = "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz";
914 914 sha1 = "8f61b75cde012b2e9eb284d4545583b5643b61ab";
915 915 };
916 916 };
917 917 "exit-0.1.2" = {
918 918 name = "exit";
919 919 packageName = "exit";
920 920 version = "0.1.2";
921 921 src = fetchurl {
922 922 url = "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz";
923 923 sha1 = "0632638f8d877cc82107d30a0fff1a17cba1cd0c";
924 924 };
925 925 };
926 926 "extend-3.0.2" = {
927 927 name = "extend";
928 928 packageName = "extend";
929 929 version = "3.0.2";
930 930 src = fetchurl {
931 931 url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";
932 932 sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
933 933 };
934 934 };
935 935 "extract-zip-1.6.7" = {
936 936 name = "extract-zip";
937 937 packageName = "extract-zip";
938 938 version = "1.6.7";
939 939 src = fetchurl {
940 940 url = "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz";
941 941 sha1 = "a840b4b8af6403264c8db57f4f1a74333ef81fe9";
942 942 };
943 943 };
944 944 "extsprintf-1.3.0" = {
945 945 name = "extsprintf";
946 946 packageName = "extsprintf";
947 947 version = "1.3.0";
948 948 src = fetchurl {
949 949 url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";
950 950 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
951 951 };
952 952 };
953 953 "eyes-0.1.8" = {
954 954 name = "eyes";
955 955 packageName = "eyes";
956 956 version = "0.1.8";
957 957 src = fetchurl {
958 958 url = "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz";
959 959 sha1 = "62cf120234c683785d902348a800ef3e0cc20bc0";
960 960 };
961 961 };
962 962 "fast-levenshtein-2.0.6" = {
963 963 name = "fast-levenshtein";
964 964 packageName = "fast-levenshtein";
965 965 version = "2.0.6";
966 966 src = fetchurl {
967 967 url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
968 968 sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
969 969 };
970 970 };
971 971 "favico.js-0.3.10" = {
972 972 name = "favico.js";
973 973 packageName = "favico.js";
974 974 version = "0.3.10";
975 975 src = fetchurl {
976 976 url = "https://registry.npmjs.org/favico.js/-/favico.js-0.3.10.tgz";
977 977 sha1 = "80586e27a117f24a8d51c18a99bdc714d4339301";
978 978 };
979 979 };
980 980 "faye-websocket-0.4.4" = {
981 981 name = "faye-websocket";
982 982 packageName = "faye-websocket";
983 983 version = "0.4.4";
984 984 src = fetchurl {
985 985 url = "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz";
986 986 sha1 = "c14c5b3bf14d7417ffbfd990c0a7495cd9f337bc";
987 987 };
988 988 };
989 989 "fd-slicer-1.0.1" = {
990 990 name = "fd-slicer";
991 991 packageName = "fd-slicer";
992 992 version = "1.0.1";
993 993 src = fetchurl {
994 994 url = "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz";
995 995 sha1 = "8b5bcbd9ec327c5041bf9ab023fd6750f1177e65";
996 996 };
997 997 };
998 998 "feature-detect-es6-1.5.0" = {
999 999 name = "feature-detect-es6";
1000 1000 packageName = "feature-detect-es6";
1001 1001 version = "1.5.0";
1002 1002 src = fetchurl {
1003 1003 url = "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.5.0.tgz";
1004 1004 sha512 = "DzWPIGzTnfp3/KK1d/YPfmgLqeDju9F2DQYBL35VusgSApcA7XGqVtXfR4ETOOFEzdFJ3J7zh0Gkk011TiA4uQ==";
1005 1005 };
1006 1006 };
1007 1007 "file-sync-cmp-0.1.1" = {
1008 1008 name = "file-sync-cmp";
1009 1009 packageName = "file-sync-cmp";
1010 1010 version = "0.1.1";
1011 1011 src = fetchurl {
1012 1012 url = "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz";
1013 1013 sha1 = "a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b";
1014 1014 };
1015 1015 };
1016 1016 "find-replace-1.0.3" = {
1017 1017 name = "find-replace";
1018 1018 packageName = "find-replace";
1019 1019 version = "1.0.3";
1020 1020 src = fetchurl {
1021 1021 url = "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz";
1022 1022 sha1 = "b88e7364d2d9c959559f388c66670d6130441fa0";
1023 1023 };
1024 1024 };
1025 1025 "findit-2.0.0" = {
1026 1026 name = "findit";
1027 1027 packageName = "findit";
1028 1028 version = "2.0.0";
1029 1029 src = fetchurl {
1030 1030 url = "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz";
1031 1031 sha1 = "6509f0126af4c178551cfa99394e032e13a4d56e";
1032 1032 };
1033 1033 };
1034 1034 "findup-sync-0.1.3" = {
1035 1035 name = "findup-sync";
1036 1036 packageName = "findup-sync";
1037 1037 version = "0.1.3";
1038 1038 src = fetchurl {
1039 1039 url = "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz";
1040 1040 sha1 = "7f3e7a97b82392c653bf06589bd85190e93c3683";
1041 1041 };
1042 1042 };
1043 1043 "foreachasync-3.0.0" = {
1044 1044 name = "foreachasync";
1045 1045 packageName = "foreachasync";
1046 1046 version = "3.0.0";
1047 1047 src = fetchurl {
1048 1048 url = "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz";
1049 1049 sha1 = "5502987dc8714be3392097f32e0071c9dee07cf6";
1050 1050 };
1051 1051 };
1052 1052 "forever-agent-0.6.1" = {
1053 1053 name = "forever-agent";
1054 1054 packageName = "forever-agent";
1055 1055 version = "0.6.1";
1056 1056 src = fetchurl {
1057 1057 url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
1058 1058 sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
1059 1059 };
1060 1060 };
1061 1061 "form-data-2.1.4" = {
1062 1062 name = "form-data";
1063 1063 packageName = "form-data";
1064 1064 version = "2.1.4";
1065 1065 src = fetchurl {
1066 1066 url = "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz";
1067 1067 sha1 = "33c183acf193276ecaa98143a69e94bfee1750d1";
1068 1068 };
1069 1069 };
1070 1070 "fs-extra-0.6.4" = {
1071 1071 name = "fs-extra";
1072 1072 packageName = "fs-extra";
1073 1073 version = "0.6.4";
1074 1074 src = fetchurl {
1075 1075 url = "https://registry.npmjs.org/fs-extra/-/fs-extra-0.6.4.tgz";
1076 1076 sha1 = "f46f0c75b7841f8d200b3348cd4d691d5a099d15";
1077 1077 };
1078 1078 };
1079 1079 "fs-extra-1.0.0" = {
1080 1080 name = "fs-extra";
1081 1081 packageName = "fs-extra";
1082 1082 version = "1.0.0";
1083 1083 src = fetchurl {
1084 1084 url = "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz";
1085 1085 sha1 = "cd3ce5f7e7cb6145883fcae3191e9877f8587950";
1086 1086 };
1087 1087 };
1088 1088 "fs.extra-1.3.2" = {
1089 1089 name = "fs.extra";
1090 1090 packageName = "fs.extra";
1091 1091 version = "1.3.2";
1092 1092 src = fetchurl {
1093 1093 url = "https://registry.npmjs.org/fs.extra/-/fs.extra-1.3.2.tgz";
1094 1094 sha1 = "dd023f93013bee24531f1b33514c37b20fd93349";
1095 1095 };
1096 1096 };
1097 1097 "fs.realpath-1.0.0" = {
1098 1098 name = "fs.realpath";
1099 1099 packageName = "fs.realpath";
1100 1100 version = "1.0.0";
1101 1101 src = fetchurl {
1102 1102 url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";
1103 1103 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
1104 1104 };
1105 1105 };
1106 1106 "gauge-2.7.4" = {
1107 1107 name = "gauge";
1108 1108 packageName = "gauge";
1109 1109 version = "2.7.4";
1110 1110 src = fetchurl {
1111 1111 url = "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz";
1112 1112 sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
1113 1113 };
1114 1114 };
1115 1115 "gaze-0.5.2" = {
1116 1116 name = "gaze";
1117 1117 packageName = "gaze";
1118 1118 version = "0.5.2";
1119 1119 src = fetchurl {
1120 1120 url = "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz";
1121 1121 sha1 = "40b709537d24d1d45767db5a908689dfe69ac44f";
1122 1122 };
1123 1123 };
1124 1124 "getobject-0.1.0" = {
1125 1125 name = "getobject";
1126 1126 packageName = "getobject";
1127 1127 version = "0.1.0";
1128 1128 src = fetchurl {
1129 1129 url = "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz";
1130 1130 sha1 = "047a449789fa160d018f5486ed91320b6ec7885c";
1131 1131 };
1132 1132 };
1133 1133 "getpass-0.1.7" = {
1134 1134 name = "getpass";
1135 1135 packageName = "getpass";
1136 1136 version = "0.1.7";
1137 1137 src = fetchurl {
1138 1138 url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";
1139 1139 sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
1140 1140 };
1141 1141 };
1142 1142 "glob-3.1.21" = {
1143 1143 name = "glob";
1144 1144 packageName = "glob";
1145 1145 version = "3.1.21";
1146 1146 src = fetchurl {
1147 1147 url = "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz";
1148 1148 sha1 = "d29e0a055dea5138f4d07ed40e8982e83c2066cd";
1149 1149 };
1150 1150 };
1151 1151 "glob-3.2.11" = {
1152 1152 name = "glob";
1153 1153 packageName = "glob";
1154 1154 version = "3.2.11";
1155 1155 src = fetchurl {
1156 1156 url = "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz";
1157 1157 sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d";
1158 1158 };
1159 1159 };
1160 "glob-7.1.2" = {
1160 "glob-7.1.3" = {
1161 1161 name = "glob";
1162 1162 packageName = "glob";
1163 version = "7.1.2";
1164 src = fetchurl {
1165 url = "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz";
1166 sha512 = "MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==";
1163 version = "7.1.3";
1164 src = fetchurl {
1165 url = "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz";
1166 sha512 = "vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==";
1167 1167 };
1168 1168 };
1169 1169 "globule-0.1.0" = {
1170 1170 name = "globule";
1171 1171 packageName = "globule";
1172 1172 version = "0.1.0";
1173 1173 src = fetchurl {
1174 1174 url = "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz";
1175 1175 sha1 = "d9c8edde1da79d125a151b79533b978676346ae5";
1176 1176 };
1177 1177 };
1178 1178 "good-listener-1.2.2" = {
1179 1179 name = "good-listener";
1180 1180 packageName = "good-listener";
1181 1181 version = "1.2.2";
1182 1182 src = fetchurl {
1183 1183 url = "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz";
1184 1184 sha1 = "d53b30cdf9313dffb7dc9a0d477096aa6d145c50";
1185 1185 };
1186 1186 };
1187 1187 "graceful-fs-1.2.3" = {
1188 1188 name = "graceful-fs";
1189 1189 packageName = "graceful-fs";
1190 1190 version = "1.2.3";
1191 1191 src = fetchurl {
1192 1192 url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz";
1193 1193 sha1 = "15a4806a57547cb2d2dbf27f42e89a8c3451b364";
1194 1194 };
1195 1195 };
1196 1196 "graceful-fs-4.1.11" = {
1197 1197 name = "graceful-fs";
1198 1198 packageName = "graceful-fs";
1199 1199 version = "4.1.11";
1200 1200 src = fetchurl {
1201 1201 url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz";
1202 1202 sha1 = "0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658";
1203 1203 };
1204 1204 };
1205 1205 "grunt-0.4.5" = {
1206 1206 name = "grunt";
1207 1207 packageName = "grunt";
1208 1208 version = "0.4.5";
1209 1209 src = fetchurl {
1210 1210 url = "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz";
1211 1211 sha1 = "56937cd5194324adff6d207631832a9d6ba4e7f0";
1212 1212 };
1213 1213 };
1214 1214 "grunt-contrib-concat-0.5.1" = {
1215 1215 name = "grunt-contrib-concat";
1216 1216 packageName = "grunt-contrib-concat";
1217 1217 version = "0.5.1";
1218 1218 src = fetchurl {
1219 1219 url = "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.5.1.tgz";
1220 1220 sha1 = "953c6efdfdfd2c107ab9c85077f2d4b24d31cd49";
1221 1221 };
1222 1222 };
1223 1223 "grunt-contrib-copy-1.0.0" = {
1224 1224 name = "grunt-contrib-copy";
1225 1225 packageName = "grunt-contrib-copy";
1226 1226 version = "1.0.0";
1227 1227 src = fetchurl {
1228 1228 url = "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz";
1229 1229 sha1 = "7060c6581e904b8ab0d00f076e0a8f6e3e7c3573";
1230 1230 };
1231 1231 };
1232 1232 "grunt-contrib-jshint-0.12.0" = {
1233 1233 name = "grunt-contrib-jshint";
1234 1234 packageName = "grunt-contrib-jshint";
1235 1235 version = "0.12.0";
1236 1236 src = fetchurl {
1237 1237 url = "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.12.0.tgz";
1238 1238 sha1 = "f6b2f06fc715264837a7ab6c69a1ce1a689c2c29";
1239 1239 };
1240 1240 };
1241 1241 "grunt-contrib-less-1.4.1" = {
1242 1242 name = "grunt-contrib-less";
1243 1243 packageName = "grunt-contrib-less";
1244 1244 version = "1.4.1";
1245 1245 src = fetchurl {
1246 1246 url = "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-1.4.1.tgz";
1247 1247 sha1 = "3bbdec0b75d12ceaa55d62943625c0b0861cdf6f";
1248 1248 };
1249 1249 };
1250 1250 "grunt-contrib-watch-0.6.1" = {
1251 1251 name = "grunt-contrib-watch";
1252 1252 packageName = "grunt-contrib-watch";
1253 1253 version = "0.6.1";
1254 1254 src = fetchurl {
1255 1255 url = "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz";
1256 1256 sha1 = "64fdcba25a635f5b4da1b6ce6f90da0aeb6e3f15";
1257 1257 };
1258 1258 };
1259 1259 "grunt-crisper-1.0.1" = {
1260 1260 name = "grunt-crisper";
1261 1261 packageName = "grunt-crisper";
1262 1262 version = "1.0.1";
1263 1263 src = fetchurl {
1264 1264 url = "https://registry.npmjs.org/grunt-crisper/-/grunt-crisper-1.0.1.tgz";
1265 1265 sha1 = "e7c091dcaff10deb0091e3035ca7e54008991fe7";
1266 1266 };
1267 1267 };
1268 1268 "grunt-legacy-log-0.1.3" = {
1269 1269 name = "grunt-legacy-log";
1270 1270 packageName = "grunt-legacy-log";
1271 1271 version = "0.1.3";
1272 1272 src = fetchurl {
1273 1273 url = "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz";
1274 1274 sha1 = "ec29426e803021af59029f87d2f9cd7335a05531";
1275 1275 };
1276 1276 };
1277 1277 "grunt-legacy-log-utils-0.1.1" = {
1278 1278 name = "grunt-legacy-log-utils";
1279 1279 packageName = "grunt-legacy-log-utils";
1280 1280 version = "0.1.1";
1281 1281 src = fetchurl {
1282 1282 url = "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz";
1283 1283 sha1 = "c0706b9dd9064e116f36f23fe4e6b048672c0f7e";
1284 1284 };
1285 1285 };
1286 1286 "grunt-legacy-util-0.2.0" = {
1287 1287 name = "grunt-legacy-util";
1288 1288 packageName = "grunt-legacy-util";
1289 1289 version = "0.2.0";
1290 1290 src = fetchurl {
1291 1291 url = "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz";
1292 1292 sha1 = "93324884dbf7e37a9ff7c026dff451d94a9e554b";
1293 1293 };
1294 1294 };
1295 1295 "grunt-vulcanize-1.0.0" = {
1296 1296 name = "grunt-vulcanize";
1297 1297 packageName = "grunt-vulcanize";
1298 1298 version = "1.0.0";
1299 1299 src = fetchurl {
1300 1300 url = "https://registry.npmjs.org/grunt-vulcanize/-/grunt-vulcanize-1.0.0.tgz";
1301 1301 sha1 = "f4d6cfef274f8216c06f6c290e7dbb3b9e9e3b0f";
1302 1302 };
1303 1303 };
1304 1304 "har-schema-1.0.5" = {
1305 1305 name = "har-schema";
1306 1306 packageName = "har-schema";
1307 1307 version = "1.0.5";
1308 1308 src = fetchurl {
1309 1309 url = "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz";
1310 1310 sha1 = "d263135f43307c02c602afc8fe95970c0151369e";
1311 1311 };
1312 1312 };
1313 1313 "har-validator-4.2.1" = {
1314 1314 name = "har-validator";
1315 1315 packageName = "har-validator";
1316 1316 version = "4.2.1";
1317 1317 src = fetchurl {
1318 1318 url = "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz";
1319 1319 sha1 = "33481d0f1bbff600dd203d75812a6a5fba002e2a";
1320 1320 };
1321 1321 };
1322 1322 "has-ansi-0.1.0" = {
1323 1323 name = "has-ansi";
1324 1324 packageName = "has-ansi";
1325 1325 version = "0.1.0";
1326 1326 src = fetchurl {
1327 1327 url = "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz";
1328 1328 sha1 = "84f265aae8c0e6a88a12d7022894b7568894c62e";
1329 1329 };
1330 1330 };
1331 1331 "has-ansi-2.0.0" = {
1332 1332 name = "has-ansi";
1333 1333 packageName = "has-ansi";
1334 1334 version = "2.0.0";
1335 1335 src = fetchurl {
1336 1336 url = "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
1337 1337 sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
1338 1338 };
1339 1339 };
1340 1340 "has-unicode-2.0.1" = {
1341 1341 name = "has-unicode";
1342 1342 packageName = "has-unicode";
1343 1343 version = "2.0.1";
1344 1344 src = fetchurl {
1345 1345 url = "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz";
1346 1346 sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
1347 1347 };
1348 1348 };
1349 1349 "hasha-2.2.0" = {
1350 1350 name = "hasha";
1351 1351 packageName = "hasha";
1352 1352 version = "2.2.0";
1353 1353 src = fetchurl {
1354 1354 url = "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz";
1355 1355 sha1 = "78d7cbfc1e6d66303fe79837365984517b2f6ee1";
1356 1356 };
1357 1357 };
1358 1358 "hawk-3.1.3" = {
1359 1359 name = "hawk";
1360 1360 packageName = "hawk";
1361 1361 version = "3.1.3";
1362 1362 src = fetchurl {
1363 1363 url = "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz";
1364 1364 sha1 = "078444bd7c1640b0fe540d2c9b73d59678e8e1c4";
1365 1365 };
1366 1366 };
1367 1367 "hoek-2.16.3" = {
1368 1368 name = "hoek";
1369 1369 packageName = "hoek";
1370 1370 version = "2.16.3";
1371 1371 src = fetchurl {
1372 1372 url = "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz";
1373 1373 sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
1374 1374 };
1375 1375 };
1376 1376 "hooker-0.2.3" = {
1377 1377 name = "hooker";
1378 1378 packageName = "hooker";
1379 1379 version = "0.2.3";
1380 1380 src = fetchurl {
1381 1381 url = "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz";
1382 1382 sha1 = "b834f723cc4a242aa65963459df6d984c5d3d959";
1383 1383 };
1384 1384 };
1385 1385 "hosted-git-info-2.7.1" = {
1386 1386 name = "hosted-git-info";
1387 1387 packageName = "hosted-git-info";
1388 1388 version = "2.7.1";
1389 1389 src = fetchurl {
1390 1390 url = "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz";
1391 1391 sha512 = "7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==";
1392 1392 };
1393 1393 };
1394 1394 "htmlparser2-3.8.3" = {
1395 1395 name = "htmlparser2";
1396 1396 packageName = "htmlparser2";
1397 1397 version = "3.8.3";
1398 1398 src = fetchurl {
1399 1399 url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz";
1400 1400 sha1 = "996c28b191516a8be86501a7d79757e5c70c1068";
1401 1401 };
1402 1402 };
1403 1403 "http-signature-1.1.1" = {
1404 1404 name = "http-signature";
1405 1405 packageName = "http-signature";
1406 1406 version = "1.1.1";
1407 1407 src = fetchurl {
1408 1408 url = "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz";
1409 1409 sha1 = "df72e267066cd0ac67fb76adf8e134a8fbcf91bf";
1410 1410 };
1411 1411 };
1412 1412 "hydrolysis-1.25.0" = {
1413 1413 name = "hydrolysis";
1414 1414 packageName = "hydrolysis";
1415 1415 version = "1.25.0";
1416 1416 src = fetchurl {
1417 1417 url = "https://registry.npmjs.org/hydrolysis/-/hydrolysis-1.25.0.tgz";
1418 1418 sha1 = "a4fb14a37a1e03b0db52d8aaa57c682272a14d84";
1419 1419 };
1420 1420 };
1421 1421 "iconv-lite-0.2.11" = {
1422 1422 name = "iconv-lite";
1423 1423 packageName = "iconv-lite";
1424 1424 version = "0.2.11";
1425 1425 src = fetchurl {
1426 1426 url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz";
1427 1427 sha1 = "1ce60a3a57864a292d1321ff4609ca4bb965adc8";
1428 1428 };
1429 1429 };
1430 1430 "image-size-0.5.5" = {
1431 1431 name = "image-size";
1432 1432 packageName = "image-size";
1433 1433 version = "0.5.5";
1434 1434 src = fetchurl {
1435 1435 url = "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz";
1436 1436 sha1 = "09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c";
1437 1437 };
1438 1438 };
1439 1439 "inflight-1.0.6" = {
1440 1440 name = "inflight";
1441 1441 packageName = "inflight";
1442 1442 version = "1.0.6";
1443 1443 src = fetchurl {
1444 1444 url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
1445 1445 sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
1446 1446 };
1447 1447 };
1448 1448 "inherits-1.0.2" = {
1449 1449 name = "inherits";
1450 1450 packageName = "inherits";
1451 1451 version = "1.0.2";
1452 1452 src = fetchurl {
1453 1453 url = "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz";
1454 1454 sha1 = "ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b";
1455 1455 };
1456 1456 };
1457 1457 "inherits-2.0.3" = {
1458 1458 name = "inherits";
1459 1459 packageName = "inherits";
1460 1460 version = "2.0.3";
1461 1461 src = fetchurl {
1462 1462 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
1463 1463 sha1 = "633c2c83e3da42a502f52466022480f4208261de";
1464 1464 };
1465 1465 };
1466 1466 "ini-1.3.5" = {
1467 1467 name = "ini";
1468 1468 packageName = "ini";
1469 1469 version = "1.3.5";
1470 1470 src = fetchurl {
1471 1471 url = "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz";
1472 1472 sha512 = "RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==";
1473 1473 };
1474 1474 };
1475 1475 "is-builtin-module-1.0.0" = {
1476 1476 name = "is-builtin-module";
1477 1477 packageName = "is-builtin-module";
1478 1478 version = "1.0.0";
1479 1479 src = fetchurl {
1480 1480 url = "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz";
1481 1481 sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe";
1482 1482 };
1483 1483 };
1484 1484 "is-fullwidth-code-point-1.0.0" = {
1485 1485 name = "is-fullwidth-code-point";
1486 1486 packageName = "is-fullwidth-code-point";
1487 1487 version = "1.0.0";
1488 1488 src = fetchurl {
1489 1489 url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
1490 1490 sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
1491 1491 };
1492 1492 };
1493 1493 "is-stream-1.1.0" = {
1494 1494 name = "is-stream";
1495 1495 packageName = "is-stream";
1496 1496 version = "1.1.0";
1497 1497 src = fetchurl {
1498 1498 url = "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz";
1499 1499 sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
1500 1500 };
1501 1501 };
1502 1502 "is-typedarray-1.0.0" = {
1503 1503 name = "is-typedarray";
1504 1504 packageName = "is-typedarray";
1505 1505 version = "1.0.0";
1506 1506 src = fetchurl {
1507 1507 url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";
1508 1508 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
1509 1509 };
1510 1510 };
1511 1511 "isarray-0.0.1" = {
1512 1512 name = "isarray";
1513 1513 packageName = "isarray";
1514 1514 version = "0.0.1";
1515 1515 src = fetchurl {
1516 1516 url = "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz";
1517 1517 sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
1518 1518 };
1519 1519 };
1520 1520 "isarray-1.0.0" = {
1521 1521 name = "isarray";
1522 1522 packageName = "isarray";
1523 1523 version = "1.0.0";
1524 1524 src = fetchurl {
1525 1525 url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
1526 1526 sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
1527 1527 };
1528 1528 };
1529 1529 "isexe-2.0.0" = {
1530 1530 name = "isexe";
1531 1531 packageName = "isexe";
1532 1532 version = "2.0.0";
1533 1533 src = fetchurl {
1534 1534 url = "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz";
1535 1535 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
1536 1536 };
1537 1537 };
1538 1538 "isstream-0.1.2" = {
1539 1539 name = "isstream";
1540 1540 packageName = "isstream";
1541 1541 version = "0.1.2";
1542 1542 src = fetchurl {
1543 1543 url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
1544 1544 sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
1545 1545 };
1546 1546 };
1547 1547 "jquery-1.11.3" = {
1548 1548 name = "jquery";
1549 1549 packageName = "jquery";
1550 1550 version = "1.11.3";
1551 1551 src = fetchurl {
1552 1552 url = "https://registry.npmjs.org/jquery/-/jquery-1.11.3.tgz";
1553 1553 sha1 = "dd8b74278b27102d29df63eae28308a8cfa1b583";
1554 1554 };
1555 1555 };
1556 1556 "js-yaml-2.0.5" = {
1557 1557 name = "js-yaml";
1558 1558 packageName = "js-yaml";
1559 1559 version = "2.0.5";
1560 1560 src = fetchurl {
1561 1561 url = "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz";
1562 1562 sha1 = "a25ae6509999e97df278c6719da11bd0687743a8";
1563 1563 };
1564 1564 };
1565 1565 "jsbn-0.1.1" = {
1566 1566 name = "jsbn";
1567 1567 packageName = "jsbn";
1568 1568 version = "0.1.1";
1569 1569 src = fetchurl {
1570 1570 url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";
1571 1571 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
1572 1572 };
1573 1573 };
1574 1574 "jshint-2.9.6" = {
1575 1575 name = "jshint";
1576 1576 packageName = "jshint";
1577 1577 version = "2.9.6";
1578 1578 src = fetchurl {
1579 1579 url = "https://registry.npmjs.org/jshint/-/jshint-2.9.6.tgz";
1580 1580 sha512 = "KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==";
1581 1581 };
1582 1582 };
1583 1583 "json-schema-0.2.3" = {
1584 1584 name = "json-schema";
1585 1585 packageName = "json-schema";
1586 1586 version = "0.2.3";
1587 1587 src = fetchurl {
1588 1588 url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";
1589 1589 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
1590 1590 };
1591 1591 };
1592 1592 "json-stable-stringify-1.0.1" = {
1593 1593 name = "json-stable-stringify";
1594 1594 packageName = "json-stable-stringify";
1595 1595 version = "1.0.1";
1596 1596 src = fetchurl {
1597 1597 url = "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz";
1598 1598 sha1 = "9a759d39c5f2ff503fd5300646ed445f88c4f9af";
1599 1599 };
1600 1600 };
1601 1601 "json-stringify-safe-5.0.1" = {
1602 1602 name = "json-stringify-safe";
1603 1603 packageName = "json-stringify-safe";
1604 1604 version = "5.0.1";
1605 1605 src = fetchurl {
1606 1606 url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
1607 1607 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
1608 1608 };
1609 1609 };
1610 1610 "jsonfile-1.0.1" = {
1611 1611 name = "jsonfile";
1612 1612 packageName = "jsonfile";
1613 1613 version = "1.0.1";
1614 1614 src = fetchurl {
1615 1615 url = "https://registry.npmjs.org/jsonfile/-/jsonfile-1.0.1.tgz";
1616 1616 sha1 = "ea5efe40b83690b98667614a7392fc60e842c0dd";
1617 1617 };
1618 1618 };
1619 1619 "jsonfile-2.4.0" = {
1620 1620 name = "jsonfile";
1621 1621 packageName = "jsonfile";
1622 1622 version = "2.4.0";
1623 1623 src = fetchurl {
1624 1624 url = "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz";
1625 1625 sha1 = "3736a2b428b87bbda0cc83b53fa3d633a35c2ae8";
1626 1626 };
1627 1627 };
1628 1628 "jsonify-0.0.0" = {
1629 1629 name = "jsonify";
1630 1630 packageName = "jsonify";
1631 1631 version = "0.0.0";
1632 1632 src = fetchurl {
1633 1633 url = "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz";
1634 1634 sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73";
1635 1635 };
1636 1636 };
1637 1637 "jsprim-1.4.1" = {
1638 1638 name = "jsprim";
1639 1639 packageName = "jsprim";
1640 1640 version = "1.4.1";
1641 1641 src = fetchurl {
1642 1642 url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";
1643 1643 sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
1644 1644 };
1645 1645 };
1646 1646 "kew-0.7.0" = {
1647 1647 name = "kew";
1648 1648 packageName = "kew";
1649 1649 version = "0.7.0";
1650 1650 src = fetchurl {
1651 1651 url = "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz";
1652 1652 sha1 = "79d93d2d33363d6fdd2970b335d9141ad591d79b";
1653 1653 };
1654 1654 };
1655 1655 "klaw-1.3.1" = {
1656 1656 name = "klaw";
1657 1657 packageName = "klaw";
1658 1658 version = "1.3.1";
1659 1659 src = fetchurl {
1660 1660 url = "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz";
1661 1661 sha1 = "4088433b46b3b1ba259d78785d8e96f73ba02439";
1662 1662 };
1663 1663 };
1664 1664 "less-2.7.3" = {
1665 1665 name = "less";
1666 1666 packageName = "less";
1667 1667 version = "2.7.3";
1668 1668 src = fetchurl {
1669 1669 url = "https://registry.npmjs.org/less/-/less-2.7.3.tgz";
1670 1670 sha512 = "KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==";
1671 1671 };
1672 1672 };
1673 1673 "levn-0.3.0" = {
1674 1674 name = "levn";
1675 1675 packageName = "levn";
1676 1676 version = "0.3.0";
1677 1677 src = fetchurl {
1678 1678 url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz";
1679 1679 sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
1680 1680 };
1681 1681 };
1682 1682 "lodash-0.9.2" = {
1683 1683 name = "lodash";
1684 1684 packageName = "lodash";
1685 1685 version = "0.9.2";
1686 1686 src = fetchurl {
1687 1687 url = "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz";
1688 1688 sha1 = "8f3499c5245d346d682e5b0d3b40767e09f1a92c";
1689 1689 };
1690 1690 };
1691 1691 "lodash-1.0.2" = {
1692 1692 name = "lodash";
1693 1693 packageName = "lodash";
1694 1694 version = "1.0.2";
1695 1695 src = fetchurl {
1696 1696 url = "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz";
1697 1697 sha1 = "8f57560c83b59fc270bd3d561b690043430e2551";
1698 1698 };
1699 1699 };
1700 1700 "lodash-2.4.2" = {
1701 1701 name = "lodash";
1702 1702 packageName = "lodash";
1703 1703 version = "2.4.2";
1704 1704 src = fetchurl {
1705 1705 url = "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz";
1706 1706 sha1 = "fadd834b9683073da179b3eae6d9c0d15053f73e";
1707 1707 };
1708 1708 };
1709 "lodash-4.17.10" = {
1709 "lodash-4.17.11" = {
1710 1710 name = "lodash";
1711 1711 packageName = "lodash";
1712 version = "4.17.10";
1713 src = fetchurl {
1714 url = "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz";
1715 sha512 = "UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==";
1712 version = "4.17.11";
1713 src = fetchurl {
1714 url = "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz";
1715 sha512 = "cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==";
1716 1716 };
1717 1717 };
1718 1718 "lru-cache-2.7.3" = {
1719 1719 name = "lru-cache";
1720 1720 packageName = "lru-cache";
1721 1721 version = "2.7.3";
1722 1722 src = fetchurl {
1723 1723 url = "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz";
1724 1724 sha1 = "6d4524e8b955f95d4f5b58851ce21dd72fb4e952";
1725 1725 };
1726 1726 };
1727 1727 "mime-1.6.0" = {
1728 1728 name = "mime";
1729 1729 packageName = "mime";
1730 1730 version = "1.6.0";
1731 1731 src = fetchurl {
1732 1732 url = "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz";
1733 1733 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
1734 1734 };
1735 1735 };
1736 "mime-db-1.35.0" = {
1736 "mime-db-1.36.0" = {
1737 1737 name = "mime-db";
1738 1738 packageName = "mime-db";
1739 version = "1.35.0";
1740 src = fetchurl {
1741 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz";
1742 sha512 = "JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==";
1743 };
1744 };
1745 "mime-types-2.1.19" = {
1739 version = "1.36.0";
1740 src = fetchurl {
1741 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz";
1742 sha512 = "L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==";
1743 };
1744 };
1745 "mime-types-2.1.20" = {
1746 1746 name = "mime-types";
1747 1747 packageName = "mime-types";
1748 version = "2.1.19";
1749 src = fetchurl {
1750 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz";
1751 sha512 = "P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==";
1748 version = "2.1.20";
1749 src = fetchurl {
1750 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz";
1751 sha512 = "HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==";
1752 1752 };
1753 1753 };
1754 1754 "minimatch-0.2.14" = {
1755 1755 name = "minimatch";
1756 1756 packageName = "minimatch";
1757 1757 version = "0.2.14";
1758 1758 src = fetchurl {
1759 1759 url = "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz";
1760 1760 sha1 = "c74e780574f63c6f9a090e90efbe6ef53a6a756a";
1761 1761 };
1762 1762 };
1763 1763 "minimatch-0.3.0" = {
1764 1764 name = "minimatch";
1765 1765 packageName = "minimatch";
1766 1766 version = "0.3.0";
1767 1767 src = fetchurl {
1768 1768 url = "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz";
1769 1769 sha1 = "275d8edaac4f1bb3326472089e7949c8394699dd";
1770 1770 };
1771 1771 };
1772 1772 "minimatch-3.0.4" = {
1773 1773 name = "minimatch";
1774 1774 packageName = "minimatch";
1775 1775 version = "3.0.4";
1776 1776 src = fetchurl {
1777 1777 url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
1778 1778 sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
1779 1779 };
1780 1780 };
1781 1781 "minimist-0.0.8" = {
1782 1782 name = "minimist";
1783 1783 packageName = "minimist";
1784 1784 version = "0.0.8";
1785 1785 src = fetchurl {
1786 1786 url = "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";
1787 1787 sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
1788 1788 };
1789 1789 };
1790 "minipass-2.3.3" = {
1790 "minipass-2.3.4" = {
1791 1791 name = "minipass";
1792 1792 packageName = "minipass";
1793 version = "2.3.3";
1794 src = fetchurl {
1795 url = "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz";
1796 sha512 = "/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==";
1797 };
1798 };
1799 "minizlib-1.1.0" = {
1793 version = "2.3.4";
1794 src = fetchurl {
1795 url = "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz";
1796 sha512 = "mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w==";
1797 };
1798 };
1799 "minizlib-1.1.1" = {
1800 1800 name = "minizlib";
1801 1801 packageName = "minizlib";
1802 version = "1.1.0";
1803 src = fetchurl {
1804 url = "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz";
1805 sha512 = "4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==";
1802 version = "1.1.1";
1803 src = fetchurl {
1804 url = "https://registry.npmjs.org/minizlib/-/minizlib-1.1.1.tgz";
1805 sha512 = "TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg==";
1806 1806 };
1807 1807 };
1808 1808 "mkdirp-0.3.5" = {
1809 1809 name = "mkdirp";
1810 1810 packageName = "mkdirp";
1811 1811 version = "0.3.5";
1812 1812 src = fetchurl {
1813 1813 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz";
1814 1814 sha1 = "de3e5f8961c88c787ee1368df849ac4413eca8d7";
1815 1815 };
1816 1816 };
1817 1817 "mkdirp-0.5.1" = {
1818 1818 name = "mkdirp";
1819 1819 packageName = "mkdirp";
1820 1820 version = "0.5.1";
1821 1821 src = fetchurl {
1822 1822 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz";
1823 1823 sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
1824 1824 };
1825 1825 };
1826 1826 "moment-2.22.2" = {
1827 1827 name = "moment";
1828 1828 packageName = "moment";
1829 1829 version = "2.22.2";
1830 1830 src = fetchurl {
1831 1831 url = "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz";
1832 1832 sha1 = "3c257f9839fc0e93ff53149632239eb90783ff66";
1833 1833 };
1834 1834 };
1835 1835 "mousetrap-1.6.2" = {
1836 1836 name = "mousetrap";
1837 1837 packageName = "mousetrap";
1838 1838 version = "1.6.2";
1839 1839 src = fetchurl {
1840 1840 url = "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.2.tgz";
1841 1841 sha512 = "jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA==";
1842 1842 };
1843 1843 };
1844 1844 "ms-2.0.0" = {
1845 1845 name = "ms";
1846 1846 packageName = "ms";
1847 1847 version = "2.0.0";
1848 1848 src = fetchurl {
1849 1849 url = "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz";
1850 1850 sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
1851 1851 };
1852 1852 };
1853 1853 "ncp-0.4.2" = {
1854 1854 name = "ncp";
1855 1855 packageName = "ncp";
1856 1856 version = "0.4.2";
1857 1857 src = fetchurl {
1858 1858 url = "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz";
1859 1859 sha1 = "abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574";
1860 1860 };
1861 1861 };
1862 1862 "nijs-0.0.25" = {
1863 1863 name = "nijs";
1864 1864 packageName = "nijs";
1865 1865 version = "0.0.25";
1866 1866 src = fetchurl {
1867 1867 url = "https://registry.npmjs.org/nijs/-/nijs-0.0.25.tgz";
1868 1868 sha1 = "04b035cb530d46859d1018839a518c029133f676";
1869 1869 };
1870 1870 };
1871 1871 "node2nix-1.6.0" = {
1872 1872 name = "node2nix";
1873 1873 packageName = "node2nix";
1874 1874 version = "1.6.0";
1875 1875 src = fetchurl {
1876 1876 url = "https://registry.npmjs.org/node2nix/-/node2nix-1.6.0.tgz";
1877 1877 sha512 = "MJY6SsQH3pN59R9N3nMz/L8BsbQ0DlvSF38mgg1fwfwgnaJ+y600s3Nd0vZ+cnETUH+4OPETc4QohflccjPUYw==";
1878 1878 };
1879 1879 };
1880 1880 "nopt-1.0.10" = {
1881 1881 name = "nopt";
1882 1882 packageName = "nopt";
1883 1883 version = "1.0.10";
1884 1884 src = fetchurl {
1885 1885 url = "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz";
1886 1886 sha1 = "6ddd21bd2a31417b92727dd585f8a6f37608ebee";
1887 1887 };
1888 1888 };
1889 1889 "nopt-2.0.0" = {
1890 1890 name = "nopt";
1891 1891 packageName = "nopt";
1892 1892 version = "2.0.0";
1893 1893 src = fetchurl {
1894 1894 url = "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz";
1895 1895 sha1 = "ca7416f20a5e3f9c3b86180f96295fa3d0b52e0d";
1896 1896 };
1897 1897 };
1898 1898 "nopt-3.0.6" = {
1899 1899 name = "nopt";
1900 1900 packageName = "nopt";
1901 1901 version = "3.0.6";
1902 1902 src = fetchurl {
1903 1903 url = "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz";
1904 1904 sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
1905 1905 };
1906 1906 };
1907 1907 "noptify-0.0.3" = {
1908 1908 name = "noptify";
1909 1909 packageName = "noptify";
1910 1910 version = "0.0.3";
1911 1911 src = fetchurl {
1912 1912 url = "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz";
1913 1913 sha1 = "58f654a73d9753df0c51d9686dc92104a67f4bbb";
1914 1914 };
1915 1915 };
1916 1916 "normalize-package-data-2.4.0" = {
1917 1917 name = "normalize-package-data";
1918 1918 packageName = "normalize-package-data";
1919 1919 version = "2.4.0";
1920 1920 src = fetchurl {
1921 1921 url = "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz";
1922 1922 sha512 = "9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==";
1923 1923 };
1924 1924 };
1925 1925 "npm-package-arg-6.1.0" = {
1926 1926 name = "npm-package-arg";
1927 1927 packageName = "npm-package-arg";
1928 1928 version = "6.1.0";
1929 1929 src = fetchurl {
1930 1930 url = "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz";
1931 1931 sha512 = "zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==";
1932 1932 };
1933 1933 };
1934 1934 "npm-registry-client-8.5.1" = {
1935 1935 name = "npm-registry-client";
1936 1936 packageName = "npm-registry-client";
1937 1937 version = "8.5.1";
1938 1938 src = fetchurl {
1939 1939 url = "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.5.1.tgz";
1940 1940 sha512 = "7rjGF2eA7hKDidGyEWmHTiKfXkbrcQAsGL/Rh4Rt3x3YNRNHhwaTzVJfW3aNvvlhg4G62VCluif0sLCb/i51Hg==";
1941 1941 };
1942 1942 };
1943 1943 "npmconf-2.1.3" = {
1944 1944 name = "npmconf";
1945 1945 packageName = "npmconf";
1946 1946 version = "2.1.3";
1947 1947 src = fetchurl {
1948 1948 url = "https://registry.npmjs.org/npmconf/-/npmconf-2.1.3.tgz";
1949 1949 sha512 = "iTK+HI68GceCoGOHAQiJ/ik1iDfI7S+cgyG8A+PP18IU3X83kRhQIRhAUNj4Bp2JMx6Zrt5kCiozYa9uGWTjhA==";
1950 1950 };
1951 1951 };
1952 1952 "npmlog-4.1.2" = {
1953 1953 name = "npmlog";
1954 1954 packageName = "npmlog";
1955 1955 version = "4.1.2";
1956 1956 src = fetchurl {
1957 1957 url = "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz";
1958 1958 sha512 = "2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==";
1959 1959 };
1960 1960 };
1961 1961 "number-is-nan-1.0.1" = {
1962 1962 name = "number-is-nan";
1963 1963 packageName = "number-is-nan";
1964 1964 version = "1.0.1";
1965 1965 src = fetchurl {
1966 1966 url = "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";
1967 1967 sha1 = "097b602b53422a522c1afb8790318336941a011d";
1968 1968 };
1969 1969 };
1970 1970 "oauth-sign-0.8.2" = {
1971 1971 name = "oauth-sign";
1972 1972 packageName = "oauth-sign";
1973 1973 version = "0.8.2";
1974 1974 src = fetchurl {
1975 1975 url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz";
1976 1976 sha1 = "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43";
1977 1977 };
1978 1978 };
1979 1979 "object-assign-4.1.1" = {
1980 1980 name = "object-assign";
1981 1981 packageName = "object-assign";
1982 1982 version = "4.1.1";
1983 1983 src = fetchurl {
1984 1984 url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";
1985 1985 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
1986 1986 };
1987 1987 };
1988 1988 "once-1.3.3" = {
1989 1989 name = "once";
1990 1990 packageName = "once";
1991 1991 version = "1.3.3";
1992 1992 src = fetchurl {
1993 1993 url = "https://registry.npmjs.org/once/-/once-1.3.3.tgz";
1994 1994 sha1 = "b2e261557ce4c314ec8304f3fa82663e4297ca20";
1995 1995 };
1996 1996 };
1997 1997 "once-1.4.0" = {
1998 1998 name = "once";
1999 1999 packageName = "once";
2000 2000 version = "1.4.0";
2001 2001 src = fetchurl {
2002 2002 url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
2003 2003 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
2004 2004 };
2005 2005 };
2006 2006 "optionator-0.8.2" = {
2007 2007 name = "optionator";
2008 2008 packageName = "optionator";
2009 2009 version = "0.8.2";
2010 2010 src = fetchurl {
2011 2011 url = "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz";
2012 2012 sha1 = "364c5e409d3f4d6301d6c0b4c05bba50180aeb64";
2013 2013 };
2014 2014 };
2015 2015 "optparse-1.0.5" = {
2016 2016 name = "optparse";
2017 2017 packageName = "optparse";
2018 2018 version = "1.0.5";
2019 2019 src = fetchurl {
2020 2020 url = "https://registry.npmjs.org/optparse/-/optparse-1.0.5.tgz";
2021 2021 sha1 = "75e75a96506611eb1c65ba89018ff08a981e2c16";
2022 2022 };
2023 2023 };
2024 2024 "os-homedir-1.0.2" = {
2025 2025 name = "os-homedir";
2026 2026 packageName = "os-homedir";
2027 2027 version = "1.0.2";
2028 2028 src = fetchurl {
2029 2029 url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";
2030 2030 sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
2031 2031 };
2032 2032 };
2033 2033 "os-tmpdir-1.0.2" = {
2034 2034 name = "os-tmpdir";
2035 2035 packageName = "os-tmpdir";
2036 2036 version = "1.0.2";
2037 2037 src = fetchurl {
2038 2038 url = "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
2039 2039 sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
2040 2040 };
2041 2041 };
2042 2042 "osenv-0.1.5" = {
2043 2043 name = "osenv";
2044 2044 packageName = "osenv";
2045 2045 version = "0.1.5";
2046 2046 src = fetchurl {
2047 2047 url = "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";
2048 2048 sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
2049 2049 };
2050 2050 };
2051 2051 "parse5-1.5.1" = {
2052 2052 name = "parse5";
2053 2053 packageName = "parse5";
2054 2054 version = "1.5.1";
2055 2055 src = fetchurl {
2056 2056 url = "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz";
2057 2057 sha1 = "9b7f3b0de32be78dc2401b17573ccaf0f6f59d94";
2058 2058 };
2059 2059 };
2060 2060 "path-is-absolute-1.0.1" = {
2061 2061 name = "path-is-absolute";
2062 2062 packageName = "path-is-absolute";
2063 2063 version = "1.0.1";
2064 2064 src = fetchurl {
2065 2065 url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
2066 2066 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
2067 2067 };
2068 2068 };
2069 2069 "path-posix-1.0.0" = {
2070 2070 name = "path-posix";
2071 2071 packageName = "path-posix";
2072 2072 version = "1.0.0";
2073 2073 src = fetchurl {
2074 2074 url = "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz";
2075 2075 sha1 = "06b26113f56beab042545a23bfa88003ccac260f";
2076 2076 };
2077 2077 };
2078 2078 "pend-1.2.0" = {
2079 2079 name = "pend";
2080 2080 packageName = "pend";
2081 2081 version = "1.2.0";
2082 2082 src = fetchurl {
2083 2083 url = "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz";
2084 2084 sha1 = "7a57eb550a6783f9115331fcf4663d5c8e007a50";
2085 2085 };
2086 2086 };
2087 2087 "performance-now-0.2.0" = {
2088 2088 name = "performance-now";
2089 2089 packageName = "performance-now";
2090 2090 version = "0.2.0";
2091 2091 src = fetchurl {
2092 2092 url = "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz";
2093 2093 sha1 = "33ef30c5c77d4ea21c5a53869d91b56d8f2555e5";
2094 2094 };
2095 2095 };
2096 2096 "phantom-4.0.12" = {
2097 2097 name = "phantom";
2098 2098 packageName = "phantom";
2099 2099 version = "4.0.12";
2100 2100 src = fetchurl {
2101 2101 url = "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz";
2102 2102 sha512 = "Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==";
2103 2103 };
2104 2104 };
2105 2105 "phantomjs-prebuilt-2.1.16" = {
2106 2106 name = "phantomjs-prebuilt";
2107 2107 packageName = "phantomjs-prebuilt";
2108 2108 version = "2.1.16";
2109 2109 src = fetchurl {
2110 2110 url = "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz";
2111 2111 sha1 = "efd212a4a3966d3647684ea8ba788549be2aefef";
2112 2112 };
2113 2113 };
2114 2114 "pinkie-2.0.4" = {
2115 2115 name = "pinkie";
2116 2116 packageName = "pinkie";
2117 2117 version = "2.0.4";
2118 2118 src = fetchurl {
2119 2119 url = "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz";
2120 2120 sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
2121 2121 };
2122 2122 };
2123 2123 "pinkie-promise-2.0.1" = {
2124 2124 name = "pinkie-promise";
2125 2125 packageName = "pinkie-promise";
2126 2126 version = "2.0.1";
2127 2127 src = fetchurl {
2128 2128 url = "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
2129 2129 sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
2130 2130 };
2131 2131 };
2132 2132 "prelude-ls-1.1.2" = {
2133 2133 name = "prelude-ls";
2134 2134 packageName = "prelude-ls";
2135 2135 version = "1.1.2";
2136 2136 src = fetchurl {
2137 2137 url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz";
2138 2138 sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
2139 2139 };
2140 2140 };
2141 2141 "process-nextick-args-2.0.0" = {
2142 2142 name = "process-nextick-args";
2143 2143 packageName = "process-nextick-args";
2144 2144 version = "2.0.0";
2145 2145 src = fetchurl {
2146 2146 url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz";
2147 2147 sha512 = "MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==";
2148 2148 };
2149 2149 };
2150 2150 "progress-1.1.8" = {
2151 2151 name = "progress";
2152 2152 packageName = "progress";
2153 2153 version = "1.1.8";
2154 2154 src = fetchurl {
2155 2155 url = "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz";
2156 2156 sha1 = "e260c78f6161cdd9b0e56cc3e0a85de17c7a57be";
2157 2157 };
2158 2158 };
2159 2159 "promise-7.3.1" = {
2160 2160 name = "promise";
2161 2161 packageName = "promise";
2162 2162 version = "7.3.1";
2163 2163 src = fetchurl {
2164 2164 url = "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz";
2165 2165 sha512 = "nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==";
2166 2166 };
2167 2167 };
2168 2168 "proto-list-1.2.4" = {
2169 2169 name = "proto-list";
2170 2170 packageName = "proto-list";
2171 2171 version = "1.2.4";
2172 2172 src = fetchurl {
2173 2173 url = "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz";
2174 2174 sha1 = "212d5bfe1318306a420f6402b8e26ff39647a849";
2175 2175 };
2176 2176 };
2177 2177 "prr-1.0.1" = {
2178 2178 name = "prr";
2179 2179 packageName = "prr";
2180 2180 version = "1.0.1";
2181 2181 src = fetchurl {
2182 2182 url = "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz";
2183 2183 sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
2184 2184 };
2185 2185 };
2186 2186 "punycode-1.4.1" = {
2187 2187 name = "punycode";
2188 2188 packageName = "punycode";
2189 2189 version = "1.4.1";
2190 2190 src = fetchurl {
2191 2191 url = "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz";
2192 2192 sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
2193 2193 };
2194 2194 };
2195 2195 "qrious-4.0.2" = {
2196 2196 name = "qrious";
2197 2197 packageName = "qrious";
2198 2198 version = "4.0.2";
2199 2199 src = fetchurl {
2200 2200 url = "https://registry.npmjs.org/qrious/-/qrious-4.0.2.tgz";
2201 2201 sha512 = "xWPJIrK1zu5Ypn898fBp8RHkT/9ibquV2Kv24S/JY9VYEhMBMKur1gHVsOiNUh7PHP9uCgejjpZUHUIXXKoU/g==";
2202 2202 };
2203 2203 };
2204 2204 "qs-0.5.6" = {
2205 2205 name = "qs";
2206 2206 packageName = "qs";
2207 2207 version = "0.5.6";
2208 2208 src = fetchurl {
2209 2209 url = "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz";
2210 2210 sha1 = "31b1ad058567651c526921506b9a8793911a0384";
2211 2211 };
2212 2212 };
2213 2213 "qs-6.4.0" = {
2214 2214 name = "qs";
2215 2215 packageName = "qs";
2216 2216 version = "6.4.0";
2217 2217 src = fetchurl {
2218 2218 url = "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz";
2219 2219 sha1 = "13e26d28ad6b0ffaa91312cd3bf708ed351e7233";
2220 2220 };
2221 2221 };
2222 2222 "readable-stream-1.1.14" = {
2223 2223 name = "readable-stream";
2224 2224 packageName = "readable-stream";
2225 2225 version = "1.1.14";
2226 2226 src = fetchurl {
2227 2227 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz";
2228 2228 sha1 = "7cf4c54ef648e3813084c636dd2079e166c081d9";
2229 2229 };
2230 2230 };
2231 2231 "readable-stream-2.3.6" = {
2232 2232 name = "readable-stream";
2233 2233 packageName = "readable-stream";
2234 2234 version = "2.3.6";
2235 2235 src = fetchurl {
2236 2236 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz";
2237 2237 sha512 = "tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==";
2238 2238 };
2239 2239 };
2240 2240 "reduce-flatten-1.0.1" = {
2241 2241 name = "reduce-flatten";
2242 2242 packageName = "reduce-flatten";
2243 2243 version = "1.0.1";
2244 2244 src = fetchurl {
2245 2245 url = "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz";
2246 2246 sha1 = "258c78efd153ddf93cb561237f61184f3696e327";
2247 2247 };
2248 2248 };
2249 2249 "regenerator-runtime-0.10.5" = {
2250 2250 name = "regenerator-runtime";
2251 2251 packageName = "regenerator-runtime";
2252 2252 version = "0.10.5";
2253 2253 src = fetchurl {
2254 2254 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz";
2255 2255 sha1 = "336c3efc1220adcedda2c9fab67b5a7955a33658";
2256 2256 };
2257 2257 };
2258 2258 "regenerator-runtime-0.11.1" = {
2259 2259 name = "regenerator-runtime";
2260 2260 packageName = "regenerator-runtime";
2261 2261 version = "0.11.1";
2262 2262 src = fetchurl {
2263 2263 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
2264 2264 sha512 = "MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==";
2265 2265 };
2266 2266 };
2267 2267 "request-2.81.0" = {
2268 2268 name = "request";
2269 2269 packageName = "request";
2270 2270 version = "2.81.0";
2271 2271 src = fetchurl {
2272 2272 url = "https://registry.npmjs.org/request/-/request-2.81.0.tgz";
2273 2273 sha1 = "c6928946a0e06c5f8d6f8a9333469ffda46298a0";
2274 2274 };
2275 2275 };
2276 2276 "request-progress-2.0.1" = {
2277 2277 name = "request-progress";
2278 2278 packageName = "request-progress";
2279 2279 version = "2.0.1";
2280 2280 src = fetchurl {
2281 2281 url = "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz";
2282 2282 sha1 = "5d36bb57961c673aa5b788dbc8141fdf23b44e08";
2283 2283 };
2284 2284 };
2285 2285 "retry-0.10.1" = {
2286 2286 name = "retry";
2287 2287 packageName = "retry";
2288 2288 version = "0.10.1";
2289 2289 src = fetchurl {
2290 2290 url = "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz";
2291 2291 sha1 = "e76388d217992c252750241d3d3956fed98d8ff4";
2292 2292 };
2293 2293 };
2294 2294 "rimraf-2.2.8" = {
2295 2295 name = "rimraf";
2296 2296 packageName = "rimraf";
2297 2297 version = "2.2.8";
2298 2298 src = fetchurl {
2299 2299 url = "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz";
2300 2300 sha1 = "e439be2aaee327321952730f99a8929e4fc50582";
2301 2301 };
2302 2302 };
2303 2303 "safe-buffer-5.1.2" = {
2304 2304 name = "safe-buffer";
2305 2305 packageName = "safe-buffer";
2306 2306 version = "5.1.2";
2307 2307 src = fetchurl {
2308 2308 url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";
2309 2309 sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
2310 2310 };
2311 2311 };
2312 2312 "safer-buffer-2.1.2" = {
2313 2313 name = "safer-buffer";
2314 2314 packageName = "safer-buffer";
2315 2315 version = "2.1.2";
2316 2316 src = fetchurl {
2317 2317 url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";
2318 2318 sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
2319 2319 };
2320 2320 };
2321 2321 "select-1.1.2" = {
2322 2322 name = "select";
2323 2323 packageName = "select";
2324 2324 version = "1.1.2";
2325 2325 src = fetchurl {
2326 2326 url = "https://registry.npmjs.org/select/-/select-1.1.2.tgz";
2327 2327 sha1 = "0e7350acdec80b1108528786ec1d4418d11b396d";
2328 2328 };
2329 2329 };
2330 2330 "semver-4.3.6" = {
2331 2331 name = "semver";
2332 2332 packageName = "semver";
2333 2333 version = "4.3.6";
2334 2334 src = fetchurl {
2335 2335 url = "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz";
2336 2336 sha1 = "300bc6e0e86374f7ba61068b5b1ecd57fc6532da";
2337 2337 };
2338 2338 };
2339 "semver-5.5.0" = {
2339 "semver-5.5.1" = {
2340 2340 name = "semver";
2341 2341 packageName = "semver";
2342 version = "5.5.0";
2343 src = fetchurl {
2344 url = "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz";
2345 sha512 = "4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==";
2342 version = "5.5.1";
2343 src = fetchurl {
2344 url = "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz";
2345 sha512 = "PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==";
2346 2346 };
2347 2347 };
2348 2348 "set-blocking-2.0.0" = {
2349 2349 name = "set-blocking";
2350 2350 packageName = "set-blocking";
2351 2351 version = "2.0.0";
2352 2352 src = fetchurl {
2353 2353 url = "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";
2354 2354 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
2355 2355 };
2356 2356 };
2357 2357 "shelljs-0.3.0" = {
2358 2358 name = "shelljs";
2359 2359 packageName = "shelljs";
2360 2360 version = "0.3.0";
2361 2361 src = fetchurl {
2362 2362 url = "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz";
2363 2363 sha1 = "3596e6307a781544f591f37da618360f31db57b1";
2364 2364 };
2365 2365 };
2366 2366 "sigmund-1.0.1" = {
2367 2367 name = "sigmund";
2368 2368 packageName = "sigmund";
2369 2369 version = "1.0.1";
2370 2370 src = fetchurl {
2371 2371 url = "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz";
2372 2372 sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
2373 2373 };
2374 2374 };
2375 2375 "signal-exit-3.0.2" = {
2376 2376 name = "signal-exit";
2377 2377 packageName = "signal-exit";
2378 2378 version = "3.0.2";
2379 2379 src = fetchurl {
2380 2380 url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz";
2381 2381 sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
2382 2382 };
2383 2383 };
2384 2384 "slasp-0.0.4" = {
2385 2385 name = "slasp";
2386 2386 packageName = "slasp";
2387 2387 version = "0.0.4";
2388 2388 src = fetchurl {
2389 2389 url = "https://registry.npmjs.org/slasp/-/slasp-0.0.4.tgz";
2390 2390 sha1 = "9adc26ee729a0f95095851a5489f87a5258d57a9";
2391 2391 };
2392 2392 };
2393 2393 "slide-1.1.6" = {
2394 2394 name = "slide";
2395 2395 packageName = "slide";
2396 2396 version = "1.1.6";
2397 2397 src = fetchurl {
2398 2398 url = "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz";
2399 2399 sha1 = "56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707";
2400 2400 };
2401 2401 };
2402 2402 "sntp-1.0.9" = {
2403 2403 name = "sntp";
2404 2404 packageName = "sntp";
2405 2405 version = "1.0.9";
2406 2406 src = fetchurl {
2407 2407 url = "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz";
2408 2408 sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198";
2409 2409 };
2410 2410 };
2411 2411 "source-map-0.3.0" = {
2412 2412 name = "source-map";
2413 2413 packageName = "source-map";
2414 2414 version = "0.3.0";
2415 2415 src = fetchurl {
2416 2416 url = "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz";
2417 2417 sha1 = "8586fb9a5a005e5b501e21cd18b6f21b457ad1f9";
2418 2418 };
2419 2419 };
2420 2420 "source-map-0.5.7" = {
2421 2421 name = "source-map";
2422 2422 packageName = "source-map";
2423 2423 version = "0.5.7";
2424 2424 src = fetchurl {
2425 2425 url = "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz";
2426 2426 sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
2427 2427 };
2428 2428 };
2429 2429 "source-map-0.6.1" = {
2430 2430 name = "source-map";
2431 2431 packageName = "source-map";
2432 2432 version = "0.6.1";
2433 2433 src = fetchurl {
2434 2434 url = "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz";
2435 2435 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
2436 2436 };
2437 2437 };
2438 "spdx-correct-3.0.0" = {
2438 "spdx-correct-3.0.2" = {
2439 2439 name = "spdx-correct";
2440 2440 packageName = "spdx-correct";
2441 version = "3.0.0";
2442 src = fetchurl {
2443 url = "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz";
2444 sha512 = "N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==";
2445 };
2446 };
2447 "spdx-exceptions-2.1.0" = {
2441 version = "3.0.2";
2442 src = fetchurl {
2443 url = "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz";
2444 sha512 = "q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==";
2445 };
2446 };
2447 "spdx-exceptions-2.2.0" = {
2448 2448 name = "spdx-exceptions";
2449 2449 packageName = "spdx-exceptions";
2450 version = "2.1.0";
2451 src = fetchurl {
2452 url = "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz";
2453 sha512 = "4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==";
2450 version = "2.2.0";
2451 src = fetchurl {
2452 url = "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz";
2453 sha512 = "2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==";
2454 2454 };
2455 2455 };
2456 2456 "spdx-expression-parse-3.0.0" = {
2457 2457 name = "spdx-expression-parse";
2458 2458 packageName = "spdx-expression-parse";
2459 2459 version = "3.0.0";
2460 2460 src = fetchurl {
2461 2461 url = "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz";
2462 2462 sha512 = "Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==";
2463 2463 };
2464 2464 };
2465 "spdx-license-ids-3.0.0" = {
2465 "spdx-license-ids-3.0.1" = {
2466 2466 name = "spdx-license-ids";
2467 2467 packageName = "spdx-license-ids";
2468 version = "3.0.0";
2469 src = fetchurl {
2470 url = "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz";
2471 sha512 = "2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==";
2468 version = "3.0.1";
2469 src = fetchurl {
2470 url = "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz";
2471 sha512 = "TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==";
2472 2472 };
2473 2473 };
2474 2474 "split-1.0.1" = {
2475 2475 name = "split";
2476 2476 packageName = "split";
2477 2477 version = "1.0.1";
2478 2478 src = fetchurl {
2479 2479 url = "https://registry.npmjs.org/split/-/split-1.0.1.tgz";
2480 2480 sha512 = "mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==";
2481 2481 };
2482 2482 };
2483 "sshpk-1.14.2" = {
2483 "sshpk-1.15.1" = {
2484 2484 name = "sshpk";
2485 2485 packageName = "sshpk";
2486 version = "1.14.2";
2487 src = fetchurl {
2488 url = "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz";
2489 sha1 = "c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98";
2486 version = "1.15.1";
2487 src = fetchurl {
2488 url = "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz";
2489 sha512 = "mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==";
2490 2490 };
2491 2491 };
2492 2492 "ssri-5.3.0" = {
2493 2493 name = "ssri";
2494 2494 packageName = "ssri";
2495 2495 version = "5.3.0";
2496 2496 src = fetchurl {
2497 2497 url = "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz";
2498 2498 sha512 = "XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==";
2499 2499 };
2500 2500 };
2501 2501 "stack-trace-0.0.10" = {
2502 2502 name = "stack-trace";
2503 2503 packageName = "stack-trace";
2504 2504 version = "0.0.10";
2505 2505 src = fetchurl {
2506 2506 url = "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz";
2507 2507 sha1 = "547c70b347e8d32b4e108ea1a2a159e5fdde19c0";
2508 2508 };
2509 2509 };
2510 "sticky-sidebar-3.3.1" = {
2511 name = "sticky-sidebar";
2512 packageName = "sticky-sidebar";
2513 version = "3.3.1";
2514 src = fetchurl {
2515 url = "https://registry.npmjs.org/sticky-sidebar/-/sticky-sidebar-3.3.1.tgz";
2516 sha1 = "142bf6b64c2b416e4b707ebf8f09b8b5a5043877";
2517 };
2518 };
2510 2519 "string-width-1.0.2" = {
2511 2520 name = "string-width";
2512 2521 packageName = "string-width";
2513 2522 version = "1.0.2";
2514 2523 src = fetchurl {
2515 2524 url = "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";
2516 2525 sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
2517 2526 };
2518 2527 };
2519 2528 "string_decoder-0.10.31" = {
2520 2529 name = "string_decoder";
2521 2530 packageName = "string_decoder";
2522 2531 version = "0.10.31";
2523 2532 src = fetchurl {
2524 2533 url = "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";
2525 2534 sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
2526 2535 };
2527 2536 };
2528 2537 "string_decoder-1.1.1" = {
2529 2538 name = "string_decoder";
2530 2539 packageName = "string_decoder";
2531 2540 version = "1.1.1";
2532 2541 src = fetchurl {
2533 2542 url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";
2534 2543 sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==";
2535 2544 };
2536 2545 };
2537 2546 "stringstream-0.0.6" = {
2538 2547 name = "stringstream";
2539 2548 packageName = "stringstream";
2540 2549 version = "0.0.6";
2541 2550 src = fetchurl {
2542 2551 url = "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz";
2543 2552 sha512 = "87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==";
2544 2553 };
2545 2554 };
2546 2555 "strip-ansi-0.3.0" = {
2547 2556 name = "strip-ansi";
2548 2557 packageName = "strip-ansi";
2549 2558 version = "0.3.0";
2550 2559 src = fetchurl {
2551 2560 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz";
2552 2561 sha1 = "25f48ea22ca79187f3174a4db8759347bb126220";
2553 2562 };
2554 2563 };
2555 2564 "strip-ansi-3.0.1" = {
2556 2565 name = "strip-ansi";
2557 2566 packageName = "strip-ansi";
2558 2567 version = "3.0.1";
2559 2568 src = fetchurl {
2560 2569 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
2561 2570 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
2562 2571 };
2563 2572 };
2564 2573 "strip-json-comments-1.0.4" = {
2565 2574 name = "strip-json-comments";
2566 2575 packageName = "strip-json-comments";
2567 2576 version = "1.0.4";
2568 2577 src = fetchurl {
2569 2578 url = "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz";
2570 2579 sha1 = "1e15fbcac97d3ee99bf2d73b4c656b082bbafb91";
2571 2580 };
2572 2581 };
2573 2582 "supports-color-0.2.0" = {
2574 2583 name = "supports-color";
2575 2584 packageName = "supports-color";
2576 2585 version = "0.2.0";
2577 2586 src = fetchurl {
2578 2587 url = "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz";
2579 2588 sha1 = "d92de2694eb3f67323973d7ae3d8b55b4c22190a";
2580 2589 };
2581 2590 };
2582 2591 "supports-color-2.0.0" = {
2583 2592 name = "supports-color";
2584 2593 packageName = "supports-color";
2585 2594 version = "2.0.0";
2586 2595 src = fetchurl {
2587 2596 url = "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
2588 2597 sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
2589 2598 };
2590 2599 };
2591 2600 "table-layout-0.3.0" = {
2592 2601 name = "table-layout";
2593 2602 packageName = "table-layout";
2594 2603 version = "0.3.0";
2595 2604 src = fetchurl {
2596 2605 url = "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz";
2597 2606 sha1 = "6ee20dc483db371b3e5c87f704ed2f7c799d2c9a";
2598 2607 };
2599 2608 };
2600 2609 "tar-3.1.15" = {
2601 2610 name = "tar";
2602 2611 packageName = "tar";
2603 2612 version = "3.1.15";
2604 2613 src = fetchurl {
2605 2614 url = "https://registry.npmjs.org/tar/-/tar-3.1.15.tgz";
2606 2615 sha512 = "pQNFsg+Wb6VXsrIPUnuQwrHR4wD5ASBR0jRyiT4/AALFA2Nl+CjhkDX5fTmIwCuULRtyQR3Dae2BBnP2EFHscw==";
2607 2616 };
2608 2617 };
2609 2618 "temp-0.8.3" = {
2610 2619 name = "temp";
2611 2620 packageName = "temp";
2612 2621 version = "0.8.3";
2613 2622 src = fetchurl {
2614 2623 url = "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz";
2615 2624 sha1 = "e0c6bc4d26b903124410e4fed81103014dfc1f59";
2616 2625 };
2617 2626 };
2618 2627 "test-value-2.1.0" = {
2619 2628 name = "test-value";
2620 2629 packageName = "test-value";
2621 2630 version = "2.1.0";
2622 2631 src = fetchurl {
2623 2632 url = "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz";
2624 2633 sha1 = "11da6ff670f3471a73b625ca4f3fdcf7bb748291";
2625 2634 };
2626 2635 };
2627 2636 "throttleit-1.0.0" = {
2628 2637 name = "throttleit";
2629 2638 packageName = "throttleit";
2630 2639 version = "1.0.0";
2631 2640 src = fetchurl {
2632 2641 url = "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz";
2633 2642 sha1 = "9e785836daf46743145a5984b6268d828528ac6c";
2634 2643 };
2635 2644 };
2636 2645 "through-2.3.8" = {
2637 2646 name = "through";
2638 2647 packageName = "through";
2639 2648 version = "2.3.8";
2640 2649 src = fetchurl {
2641 2650 url = "https://registry.npmjs.org/through/-/through-2.3.8.tgz";
2642 2651 sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
2643 2652 };
2644 2653 };
2645 2654 "tiny-emitter-2.0.2" = {
2646 2655 name = "tiny-emitter";
2647 2656 packageName = "tiny-emitter";
2648 2657 version = "2.0.2";
2649 2658 src = fetchurl {
2650 2659 url = "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz";
2651 2660 sha512 = "2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==";
2652 2661 };
2653 2662 };
2654 2663 "tiny-lr-fork-0.0.5" = {
2655 2664 name = "tiny-lr-fork";
2656 2665 packageName = "tiny-lr-fork";
2657 2666 version = "0.0.5";
2658 2667 src = fetchurl {
2659 2668 url = "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz";
2660 2669 sha1 = "1e99e1e2a8469b736ab97d97eefa98c71f76ed0a";
2661 2670 };
2662 2671 };
2663 2672 "tough-cookie-2.3.4" = {
2664 2673 name = "tough-cookie";
2665 2674 packageName = "tough-cookie";
2666 2675 version = "2.3.4";
2667 2676 src = fetchurl {
2668 2677 url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz";
2669 2678 sha512 = "TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==";
2670 2679 };
2671 2680 };
2672 2681 "tunnel-agent-0.6.0" = {
2673 2682 name = "tunnel-agent";
2674 2683 packageName = "tunnel-agent";
2675 2684 version = "0.6.0";
2676 2685 src = fetchurl {
2677 2686 url = "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
2678 2687 sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
2679 2688 };
2680 2689 };
2681 2690 "tweetnacl-0.14.5" = {
2682 2691 name = "tweetnacl";
2683 2692 packageName = "tweetnacl";
2684 2693 version = "0.14.5";
2685 2694 src = fetchurl {
2686 2695 url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";
2687 2696 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
2688 2697 };
2689 2698 };
2690 2699 "type-check-0.3.2" = {
2691 2700 name = "type-check";
2692 2701 packageName = "type-check";
2693 2702 version = "0.3.2";
2694 2703 src = fetchurl {
2695 2704 url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";
2696 2705 sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
2697 2706 };
2698 2707 };
2699 2708 "typedarray-0.0.6" = {
2700 2709 name = "typedarray";
2701 2710 packageName = "typedarray";
2702 2711 version = "0.0.6";
2703 2712 src = fetchurl {
2704 2713 url = "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz";
2705 2714 sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
2706 2715 };
2707 2716 };
2708 2717 "typical-2.6.1" = {
2709 2718 name = "typical";
2710 2719 packageName = "typical";
2711 2720 version = "2.6.1";
2712 2721 src = fetchurl {
2713 2722 url = "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz";
2714 2723 sha1 = "5c080e5d661cbbe38259d2e70a3c7253e873881d";
2715 2724 };
2716 2725 };
2717 2726 "uid-number-0.0.5" = {
2718 2727 name = "uid-number";
2719 2728 packageName = "uid-number";
2720 2729 version = "0.0.5";
2721 2730 src = fetchurl {
2722 2731 url = "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz";
2723 2732 sha1 = "5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e";
2724 2733 };
2725 2734 };
2726 2735 "underscore-1.7.0" = {
2727 2736 name = "underscore";
2728 2737 packageName = "underscore";
2729 2738 version = "1.7.0";
2730 2739 src = fetchurl {
2731 2740 url = "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz";
2732 2741 sha1 = "6bbaf0877500d36be34ecaa584e0db9fef035209";
2733 2742 };
2734 2743 };
2735 2744 "underscore.string-2.2.1" = {
2736 2745 name = "underscore.string";
2737 2746 packageName = "underscore.string";
2738 2747 version = "2.2.1";
2739 2748 src = fetchurl {
2740 2749 url = "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz";
2741 2750 sha1 = "d7c0fa2af5d5a1a67f4253daee98132e733f0f19";
2742 2751 };
2743 2752 };
2744 2753 "underscore.string-2.3.3" = {
2745 2754 name = "underscore.string";
2746 2755 packageName = "underscore.string";
2747 2756 version = "2.3.3";
2748 2757 src = fetchurl {
2749 2758 url = "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz";
2750 2759 sha1 = "71c08bf6b428b1133f37e78fa3a21c82f7329b0d";
2751 2760 };
2752 2761 };
2753 2762 "underscore.string-2.4.0" = {
2754 2763 name = "underscore.string";
2755 2764 packageName = "underscore.string";
2756 2765 version = "2.4.0";
2757 2766 src = fetchurl {
2758 2767 url = "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz";
2759 2768 sha1 = "8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b";
2760 2769 };
2761 2770 };
2762 2771 "unicode-5.2.0-0.7.5" = {
2763 2772 name = "unicode-5.2.0";
2764 2773 packageName = "unicode-5.2.0";
2765 2774 version = "0.7.5";
2766 2775 src = fetchurl {
2767 2776 url = "https://registry.npmjs.org/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz";
2768 2777 sha512 = "KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==";
2769 2778 };
2770 2779 };
2771 2780 "util-deprecate-1.0.2" = {
2772 2781 name = "util-deprecate";
2773 2782 packageName = "util-deprecate";
2774 2783 version = "1.0.2";
2775 2784 src = fetchurl {
2776 2785 url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
2777 2786 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
2778 2787 };
2779 2788 };
2780 2789 "uuid-3.3.2" = {
2781 2790 name = "uuid";
2782 2791 packageName = "uuid";
2783 2792 version = "3.3.2";
2784 2793 src = fetchurl {
2785 2794 url = "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz";
2786 2795 sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==";
2787 2796 };
2788 2797 };
2789 "validate-npm-package-license-3.0.3" = {
2798 "validate-npm-package-license-3.0.4" = {
2790 2799 name = "validate-npm-package-license";
2791 2800 packageName = "validate-npm-package-license";
2792 version = "3.0.3";
2793 src = fetchurl {
2794 url = "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz";
2795 sha512 = "63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==";
2801 version = "3.0.4";
2802 src = fetchurl {
2803 url = "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz";
2804 sha512 = "DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==";
2796 2805 };
2797 2806 };
2798 2807 "validate-npm-package-name-3.0.0" = {
2799 2808 name = "validate-npm-package-name";
2800 2809 packageName = "validate-npm-package-name";
2801 2810 version = "3.0.0";
2802 2811 src = fetchurl {
2803 2812 url = "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz";
2804 2813 sha1 = "5fa912d81eb7d0c74afc140de7317f0ca7df437e";
2805 2814 };
2806 2815 };
2807 2816 "verror-1.10.0" = {
2808 2817 name = "verror";
2809 2818 packageName = "verror";
2810 2819 version = "1.10.0";
2811 2820 src = fetchurl {
2812 2821 url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
2813 2822 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
2814 2823 };
2815 2824 };
2816 2825 "vulcanize-1.16.0" = {
2817 2826 name = "vulcanize";
2818 2827 packageName = "vulcanize";
2819 2828 version = "1.16.0";
2820 2829 src = fetchurl {
2821 2830 url = "https://registry.npmjs.org/vulcanize/-/vulcanize-1.16.0.tgz";
2822 2831 sha512 = "TYlFljSc896b5+0FmMiw0JAMrHNBiHx0IAFC/dQR3Dxdb9Nx43ohm6wMWTlPXQn4sk/0WkqfgoAA6SLxyvPCLQ==";
2823 2832 };
2824 2833 };
2825 2834 "walk-2.3.14" = {
2826 2835 name = "walk";
2827 2836 packageName = "walk";
2828 2837 version = "2.3.14";
2829 2838 src = fetchurl {
2830 2839 url = "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz";
2831 2840 sha512 = "5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==";
2832 2841 };
2833 2842 };
2843 "waypoints-4.0.1" = {
2844 name = "waypoints";
2845 packageName = "waypoints";
2846 version = "4.0.1";
2847 src = fetchurl {
2848 url = "https://registry.npmjs.org/waypoints/-/waypoints-4.0.1.tgz";
2849 sha1 = "09979a0573810b29627cba4366a284a062ec69c8";
2850 };
2851 };
2834 2852 "which-1.0.9" = {
2835 2853 name = "which";
2836 2854 packageName = "which";
2837 2855 version = "1.0.9";
2838 2856 src = fetchurl {
2839 2857 url = "https://registry.npmjs.org/which/-/which-1.0.9.tgz";
2840 2858 sha1 = "460c1da0f810103d0321a9b633af9e575e64486f";
2841 2859 };
2842 2860 };
2843 2861 "which-1.3.1" = {
2844 2862 name = "which";
2845 2863 packageName = "which";
2846 2864 version = "1.3.1";
2847 2865 src = fetchurl {
2848 2866 url = "https://registry.npmjs.org/which/-/which-1.3.1.tgz";
2849 2867 sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==";
2850 2868 };
2851 2869 };
2852 2870 "wide-align-1.1.3" = {
2853 2871 name = "wide-align";
2854 2872 packageName = "wide-align";
2855 2873 version = "1.1.3";
2856 2874 src = fetchurl {
2857 2875 url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz";
2858 2876 sha512 = "QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==";
2859 2877 };
2860 2878 };
2861 "winston-2.4.3" = {
2879 "winston-2.4.4" = {
2862 2880 name = "winston";
2863 2881 packageName = "winston";
2864 version = "2.4.3";
2865 src = fetchurl {
2866 url = "https://registry.npmjs.org/winston/-/winston-2.4.3.tgz";
2867 sha512 = "GYKuysPz2pxYAVJD2NPsDLP5Z79SDEzPm9/j4tCjkF/n89iBNGBMJcR+dMUqxgPNgoSs6fVygPi+Vl2oxIpBuw==";
2882 version = "2.4.4";
2883 src = fetchurl {
2884 url = "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz";
2885 sha512 = "NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==";
2868 2886 };
2869 2887 };
2870 2888 "wordwrap-1.0.0" = {
2871 2889 name = "wordwrap";
2872 2890 packageName = "wordwrap";
2873 2891 version = "1.0.0";
2874 2892 src = fetchurl {
2875 2893 url = "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz";
2876 2894 sha1 = "27584810891456a4171c8d0226441ade90cbcaeb";
2877 2895 };
2878 2896 };
2879 2897 "wordwrapjs-2.0.0" = {
2880 2898 name = "wordwrapjs";
2881 2899 packageName = "wordwrapjs";
2882 2900 version = "2.0.0";
2883 2901 src = fetchurl {
2884 2902 url = "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz";
2885 2903 sha1 = "ab55f695e6118da93858fdd70c053d1c5e01ac20";
2886 2904 };
2887 2905 };
2888 2906 "wrappy-1.0.2" = {
2889 2907 name = "wrappy";
2890 2908 packageName = "wrappy";
2891 2909 version = "1.0.2";
2892 2910 src = fetchurl {
2893 2911 url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
2894 2912 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
2895 2913 };
2896 2914 };
2897 2915 "yallist-3.0.2" = {
2898 2916 name = "yallist";
2899 2917 packageName = "yallist";
2900 2918 version = "3.0.2";
2901 2919 src = fetchurl {
2902 2920 url = "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz";
2903 2921 sha1 = "8452b4bb7e83c7c188d8041c1a837c773d6d8bb9";
2904 2922 };
2905 2923 };
2906 2924 "yauzl-2.4.1" = {
2907 2925 name = "yauzl";
2908 2926 packageName = "yauzl";
2909 2927 version = "2.4.1";
2910 2928 src = fetchurl {
2911 2929 url = "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz";
2912 2930 sha1 = "9528f442dab1b2284e58b4379bb194e22e0c4005";
2913 2931 };
2914 2932 };
2915 2933 };
2916 2934 args = {
2917 2935 name = "rhodecode-enterprise";
2918 2936 packageName = "rhodecode-enterprise";
2919 2937 version = "1.0.0";
2920 2938 src = ./..;
2921 2939 dependencies = [
2922 2940 sources."@types/clone-0.1.30"
2923 sources."@types/node-4.2.23"
2941 sources."@types/node-4.9.0"
2924 2942 (sources."@types/parse5-0.0.31" // {
2925 2943 dependencies = [
2926 sources."@types/node-6.0.114"
2944 sources."@types/node-6.0.118"
2927 2945 ];
2928 2946 })
2929 2947 sources."abbrev-1.1.1"
2930 2948 sources."acorn-3.3.0"
2931 2949 sources."acorn-jsx-3.0.1"
2932 2950 sources."ajv-4.11.8"
2933 2951 sources."amdefine-1.0.1"
2934 2952 sources."ansi-escape-sequences-3.0.0"
2935 2953 sources."ansi-regex-2.1.1"
2936 2954 sources."ansi-styles-2.2.1"
2937 2955 sources."appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
2938 2956 sources."aproba-1.2.0"
2939 2957 sources."are-we-there-yet-1.1.5"
2940 2958 (sources."argparse-0.1.16" // {
2941 2959 dependencies = [
2942 2960 sources."underscore.string-2.4.0"
2943 2961 ];
2944 2962 })
2945 2963 sources."array-back-1.0.4"
2946 2964 sources."asap-2.0.6"
2947 sources."asn1-0.2.3"
2965 sources."asn1-0.2.4"
2948 2966 sources."assert-plus-0.2.0"
2949 2967 sources."async-0.1.22"
2950 2968 sources."asynckit-0.4.0"
2951 2969 sources."aws-sign2-0.6.0"
2952 sources."aws4-1.7.0"
2970 sources."aws4-1.8.0"
2953 2971 sources."babel-polyfill-6.26.0"
2954 2972 (sources."babel-runtime-6.26.0" // {
2955 2973 dependencies = [
2956 2974 sources."regenerator-runtime-0.11.1"
2957 2975 ];
2958 2976 })
2959 2977 sources."balanced-match-1.0.0"
2960 2978 sources."base64-js-1.2.3"
2961 2979 sources."bcrypt-pbkdf-1.0.2"
2962 2980 sources."boom-2.10.1"
2963 2981 sources."bower-1.8.4"
2964 2982 sources."brace-expansion-1.1.11"
2965 2983 sources."buffer-from-1.1.1"
2966 2984 sources."builtin-modules-1.1.1"
2967 2985 sources."builtins-1.0.3"
2968 2986 sources."caseless-0.12.0"
2969 2987 sources."chalk-1.1.3"
2970 2988 (sources."cli-1.0.1" // {
2971 2989 dependencies = [
2972 sources."glob-7.1.2"
2990 sources."glob-7.1.3"
2973 2991 sources."minimatch-3.0.4"
2974 2992 ];
2975 2993 })
2976 2994 sources."clipboard-2.0.1"
2977 2995 sources."clone-1.0.4"
2978 2996 sources."co-4.6.0"
2979 2997 sources."code-point-at-1.1.0"
2980 2998 sources."coffee-script-1.3.3"
2981 2999 sources."colors-0.6.2"
2982 sources."combined-stream-1.0.6"
3000 sources."combined-stream-1.0.7"
2983 3001 sources."command-line-args-3.0.5"
2984 3002 sources."command-line-usage-3.0.8"
2985 3003 sources."concat-map-0.0.1"
2986 3004 sources."concat-stream-1.6.2"
2987 sources."config-chain-1.1.11"
3005 sources."config-chain-1.1.12"
2988 3006 sources."console-browserify-1.1.0"
2989 3007 sources."console-control-strings-1.1.0"
2990 3008 sources."core-js-2.5.7"
2991 3009 sources."core-util-is-1.0.2"
2992 3010 sources."crisper-2.1.1"
2993 3011 sources."cryptiles-2.0.5"
2994 3012 sources."cycle-1.0.3"
2995 3013 (sources."dashdash-1.14.1" // {
2996 3014 dependencies = [
2997 3015 sources."assert-plus-1.0.0"
2998 3016 ];
2999 3017 })
3000 3018 sources."date-now-0.1.4"
3001 3019 sources."dateformat-1.0.2-1.2.3"
3002 3020 sources."debug-0.7.4"
3003 3021 sources."deep-extend-0.4.2"
3004 3022 sources."deep-is-0.1.3"
3005 3023 sources."delayed-stream-1.0.0"
3006 3024 sources."delegate-3.2.0"
3007 3025 sources."delegates-1.0.0"
3008 3026 sources."doctrine-0.7.2"
3009 3027 (sources."dom-serializer-0.1.0" // {
3010 3028 dependencies = [
3011 3029 sources."domelementtype-1.1.3"
3012 3030 sources."entities-1.1.1"
3013 3031 ];
3014 3032 })
3015 3033 sources."dom5-1.3.6"
3016 3034 sources."domelementtype-1.3.0"
3017 3035 sources."domhandler-2.3.0"
3018 3036 sources."domutils-1.5.1"
3019 3037 sources."ecc-jsbn-0.1.2"
3020 3038 sources."entities-1.0.0"
3021 3039 sources."errno-0.1.7"
3022 3040 sources."es6-promise-2.3.0"
3023 3041 sources."escape-string-regexp-1.0.5"
3024 3042 (sources."escodegen-1.11.0" // {
3025 3043 dependencies = [
3026 3044 sources."esprima-3.1.3"
3027 3045 sources."estraverse-4.2.0"
3028 3046 sources."esutils-2.0.2"
3029 3047 sources."source-map-0.6.1"
3030 3048 ];
3031 3049 })
3032 3050 (sources."espree-3.5.4" // {
3033 3051 dependencies = [
3034 sources."acorn-5.7.1"
3052 sources."acorn-5.7.3"
3035 3053 ];
3036 3054 })
3037 3055 sources."esprima-1.0.4"
3038 3056 sources."estraverse-3.1.0"
3039 3057 sources."esutils-1.1.6"
3040 3058 sources."eventemitter2-0.4.14"
3041 3059 sources."exit-0.1.2"
3042 3060 sources."extend-3.0.2"
3043 3061 (sources."extract-zip-1.6.7" // {
3044 3062 dependencies = [
3045 3063 sources."debug-2.6.9"
3046 3064 ];
3047 3065 })
3048 3066 sources."extsprintf-1.3.0"
3049 3067 sources."eyes-0.1.8"
3050 3068 sources."fast-levenshtein-2.0.6"
3051 3069 sources."favico.js-0.3.10"
3052 3070 sources."faye-websocket-0.4.4"
3053 3071 sources."fd-slicer-1.0.1"
3054 3072 sources."feature-detect-es6-1.5.0"
3055 3073 sources."file-sync-cmp-0.1.1"
3056 3074 sources."find-replace-1.0.3"
3057 3075 sources."findit-2.0.0"
3058 3076 (sources."findup-sync-0.1.3" // {
3059 3077 dependencies = [
3060 3078 sources."glob-3.2.11"
3061 3079 sources."lodash-2.4.2"
3062 3080 sources."minimatch-0.3.0"
3063 3081 ];
3064 3082 })
3065 3083 sources."foreachasync-3.0.0"
3066 3084 sources."forever-agent-0.6.1"
3067 3085 sources."form-data-2.1.4"
3068 3086 (sources."fs-extra-0.6.4" // {
3069 3087 dependencies = [
3070 3088 sources."mkdirp-0.3.5"
3071 3089 ];
3072 3090 })
3073 3091 (sources."fs.extra-1.3.2" // {
3074 3092 dependencies = [
3075 3093 sources."mkdirp-0.3.5"
3076 3094 ];
3077 3095 })
3078 3096 sources."fs.realpath-1.0.0"
3079 3097 sources."gauge-2.7.4"
3080 3098 sources."gaze-0.5.2"
3081 3099 sources."getobject-0.1.0"
3082 3100 (sources."getpass-0.1.7" // {
3083 3101 dependencies = [
3084 3102 sources."assert-plus-1.0.0"
3085 3103 ];
3086 3104 })
3087 3105 (sources."glob-3.1.21" // {
3088 3106 dependencies = [
3089 3107 sources."inherits-1.0.2"
3090 3108 ];
3091 3109 })
3092 3110 (sources."globule-0.1.0" // {
3093 3111 dependencies = [
3094 3112 sources."lodash-1.0.2"
3095 3113 ];
3096 3114 })
3097 3115 sources."good-listener-1.2.2"
3098 3116 sources."graceful-fs-1.2.3"
3099 3117 sources."grunt-0.4.5"
3100 3118 (sources."grunt-contrib-concat-0.5.1" // {
3101 3119 dependencies = [
3102 3120 sources."ansi-regex-0.2.1"
3103 3121 sources."ansi-styles-1.1.0"
3104 3122 sources."chalk-0.5.1"
3105 3123 sources."has-ansi-0.1.0"
3106 3124 sources."strip-ansi-0.3.0"
3107 3125 sources."supports-color-0.2.0"
3108 3126 ];
3109 3127 })
3110 3128 sources."grunt-contrib-copy-1.0.0"
3111 3129 sources."grunt-contrib-jshint-0.12.0"
3112 3130 (sources."grunt-contrib-less-1.4.1" // {
3113 3131 dependencies = [
3114 3132 sources."async-2.6.1"
3115 sources."lodash-4.17.10"
3133 sources."lodash-4.17.11"
3116 3134 ];
3117 3135 })
3118 3136 (sources."grunt-contrib-watch-0.6.1" // {
3119 3137 dependencies = [
3120 3138 sources."async-0.2.10"
3121 3139 sources."lodash-2.4.2"
3122 3140 ];
3123 3141 })
3124 3142 sources."grunt-crisper-1.0.1"
3125 3143 (sources."grunt-legacy-log-0.1.3" // {
3126 3144 dependencies = [
3127 3145 sources."lodash-2.4.2"
3128 3146 sources."underscore.string-2.3.3"
3129 3147 ];
3130 3148 })
3131 3149 (sources."grunt-legacy-log-utils-0.1.1" // {
3132 3150 dependencies = [
3133 3151 sources."lodash-2.4.2"
3134 3152 sources."underscore.string-2.3.3"
3135 3153 ];
3136 3154 })
3137 3155 sources."grunt-legacy-util-0.2.0"
3138 3156 (sources."grunt-vulcanize-1.0.0" // {
3139 3157 dependencies = [
3140 3158 sources."crisper-1.2.0"
3141 3159 sources."nopt-3.0.6"
3142 3160 ];
3143 3161 })
3144 3162 sources."har-schema-1.0.5"
3145 3163 sources."har-validator-4.2.1"
3146 3164 sources."has-ansi-2.0.0"
3147 3165 sources."has-unicode-2.0.1"
3148 3166 sources."hasha-2.2.0"
3149 3167 sources."hawk-3.1.3"
3150 3168 sources."hoek-2.16.3"
3151 3169 sources."hooker-0.2.3"
3152 3170 sources."hosted-git-info-2.7.1"
3153 3171 (sources."htmlparser2-3.8.3" // {
3154 3172 dependencies = [
3155 3173 sources."readable-stream-1.1.14"
3156 3174 sources."string_decoder-0.10.31"
3157 3175 ];
3158 3176 })
3159 3177 sources."http-signature-1.1.1"
3160 3178 (sources."hydrolysis-1.25.0" // {
3161 3179 dependencies = [
3162 3180 sources."dom5-1.1.0"
3163 3181 ];
3164 3182 })
3165 3183 sources."iconv-lite-0.2.11"
3166 3184 sources."image-size-0.5.5"
3167 3185 sources."inflight-1.0.6"
3168 3186 sources."inherits-2.0.3"
3169 3187 sources."ini-1.3.5"
3170 3188 sources."is-builtin-module-1.0.0"
3171 3189 sources."is-fullwidth-code-point-1.0.0"
3172 3190 sources."is-stream-1.1.0"
3173 3191 sources."is-typedarray-1.0.0"
3174 3192 sources."isarray-0.0.1"
3175 3193 sources."isexe-2.0.0"
3176 3194 sources."isstream-0.1.2"
3177 3195 sources."jquery-1.11.3"
3178 3196 sources."js-yaml-2.0.5"
3179 3197 sources."jsbn-0.1.1"
3180 3198 (sources."jshint-2.9.6" // {
3181 3199 dependencies = [
3182 sources."lodash-4.17.10"
3200 sources."lodash-4.17.11"
3183 3201 sources."minimatch-3.0.4"
3184 3202 ];
3185 3203 })
3186 3204 sources."json-schema-0.2.3"
3187 3205 sources."json-stable-stringify-1.0.1"
3188 3206 sources."json-stringify-safe-5.0.1"
3189 3207 sources."jsonfile-1.0.1"
3190 3208 sources."jsonify-0.0.0"
3191 3209 (sources."jsprim-1.4.1" // {
3192 3210 dependencies = [
3193 3211 sources."assert-plus-1.0.0"
3194 3212 ];
3195 3213 })
3196 3214 sources."kew-0.7.0"
3197 3215 (sources."klaw-1.3.1" // {
3198 3216 dependencies = [
3199 3217 sources."graceful-fs-4.1.11"
3200 3218 ];
3201 3219 })
3202 3220 (sources."less-2.7.3" // {
3203 3221 dependencies = [
3204 3222 sources."graceful-fs-4.1.11"
3205 3223 sources."source-map-0.5.7"
3206 3224 ];
3207 3225 })
3208 3226 sources."levn-0.3.0"
3209 3227 sources."lodash-0.9.2"
3210 3228 sources."lru-cache-2.7.3"
3211 3229 sources."mime-1.6.0"
3212 sources."mime-db-1.35.0"
3213 sources."mime-types-2.1.19"
3230 sources."mime-db-1.36.0"
3231 sources."mime-types-2.1.20"
3214 3232 sources."minimatch-0.2.14"
3215 3233 sources."minimist-0.0.8"
3216 sources."minipass-2.3.3"
3217 sources."minizlib-1.1.0"
3234 sources."minipass-2.3.4"
3235 sources."minizlib-1.1.1"
3218 3236 sources."mkdirp-0.5.1"
3219 3237 sources."moment-2.22.2"
3220 3238 sources."mousetrap-1.6.2"
3221 3239 sources."ms-2.0.0"
3222 3240 sources."ncp-0.4.2"
3223 3241 sources."nijs-0.0.25"
3224 3242 sources."node2nix-1.6.0"
3225 3243 sources."nopt-1.0.10"
3226 3244 (sources."noptify-0.0.3" // {
3227 3245 dependencies = [
3228 3246 sources."nopt-2.0.0"
3229 3247 ];
3230 3248 })
3231 3249 sources."normalize-package-data-2.4.0"
3232 3250 sources."npm-package-arg-6.1.0"
3233 3251 (sources."npm-registry-client-8.5.1" // {
3234 3252 dependencies = [
3235 3253 sources."graceful-fs-4.1.11"
3236 3254 ];
3237 3255 })
3238 3256 (sources."npmconf-2.1.3" // {
3239 3257 dependencies = [
3240 3258 sources."nopt-3.0.6"
3241 3259 sources."once-1.3.3"
3242 3260 sources."semver-4.3.6"
3243 3261 ];
3244 3262 })
3245 3263 sources."npmlog-4.1.2"
3246 3264 sources."number-is-nan-1.0.1"
3247 3265 sources."oauth-sign-0.8.2"
3248 3266 sources."object-assign-4.1.1"
3249 3267 sources."once-1.4.0"
3250 3268 sources."optionator-0.8.2"
3251 3269 sources."optparse-1.0.5"
3252 3270 sources."os-homedir-1.0.2"
3253 3271 sources."os-tmpdir-1.0.2"
3254 3272 sources."osenv-0.1.5"
3255 3273 sources."parse5-1.5.1"
3256 3274 sources."path-is-absolute-1.0.1"
3257 3275 sources."path-posix-1.0.0"
3258 3276 sources."pend-1.2.0"
3259 3277 sources."performance-now-0.2.0"
3260 3278 sources."phantom-4.0.12"
3261 3279 (sources."phantomjs-prebuilt-2.1.16" // {
3262 3280 dependencies = [
3263 sources."es6-promise-4.2.4"
3281 sources."es6-promise-4.2.5"
3264 3282 sources."fs-extra-1.0.0"
3265 3283 sources."graceful-fs-4.1.11"
3266 3284 sources."jsonfile-2.4.0"
3267 3285 sources."which-1.3.1"
3268 3286 ];
3269 3287 })
3270 3288 sources."pinkie-2.0.4"
3271 3289 sources."pinkie-promise-2.0.1"
3272 3290 sources."prelude-ls-1.1.2"
3273 3291 sources."process-nextick-args-2.0.0"
3274 3292 sources."progress-1.1.8"
3275 3293 sources."promise-7.3.1"
3276 3294 sources."proto-list-1.2.4"
3277 3295 sources."prr-1.0.1"
3278 3296 sources."punycode-1.4.1"
3279 3297 sources."qrious-4.0.2"
3280 3298 sources."qs-6.4.0"
3281 3299 (sources."readable-stream-2.3.6" // {
3282 3300 dependencies = [
3283 3301 sources."isarray-1.0.0"
3284 3302 ];
3285 3303 })
3286 3304 sources."reduce-flatten-1.0.1"
3287 3305 sources."regenerator-runtime-0.10.5"
3288 3306 sources."request-2.81.0"
3289 3307 sources."request-progress-2.0.1"
3290 3308 sources."retry-0.10.1"
3291 3309 sources."rimraf-2.2.8"
3292 3310 sources."safe-buffer-5.1.2"
3293 3311 sources."safer-buffer-2.1.2"
3294 3312 sources."select-1.1.2"
3295 sources."semver-5.5.0"
3313 sources."semver-5.5.1"
3296 3314 sources."set-blocking-2.0.0"
3297 3315 sources."shelljs-0.3.0"
3298 3316 sources."sigmund-1.0.1"
3299 3317 sources."signal-exit-3.0.2"
3300 3318 sources."slasp-0.0.4"
3301 3319 sources."slide-1.1.6"
3302 3320 sources."sntp-1.0.9"
3303 3321 sources."source-map-0.3.0"
3304 sources."spdx-correct-3.0.0"
3305 sources."spdx-exceptions-2.1.0"
3322 sources."spdx-correct-3.0.2"
3323 sources."spdx-exceptions-2.2.0"
3306 3324 sources."spdx-expression-parse-3.0.0"
3307 sources."spdx-license-ids-3.0.0"
3325 sources."spdx-license-ids-3.0.1"
3308 3326 sources."split-1.0.1"
3309 (sources."sshpk-1.14.2" // {
3327 (sources."sshpk-1.15.1" // {
3310 3328 dependencies = [
3311 3329 sources."assert-plus-1.0.0"
3312 3330 ];
3313 3331 })
3314 3332 sources."ssri-5.3.0"
3315 3333 sources."stack-trace-0.0.10"
3334 sources."sticky-sidebar-3.3.1"
3316 3335 sources."string-width-1.0.2"
3317 3336 sources."string_decoder-1.1.1"
3318 3337 sources."stringstream-0.0.6"
3319 3338 sources."strip-ansi-3.0.1"
3320 3339 sources."strip-json-comments-1.0.4"
3321 3340 sources."supports-color-2.0.0"
3322 3341 sources."table-layout-0.3.0"
3323 3342 sources."tar-3.1.15"
3324 3343 sources."temp-0.8.3"
3325 3344 sources."test-value-2.1.0"
3326 3345 sources."throttleit-1.0.0"
3327 3346 sources."through-2.3.8"
3328 3347 sources."tiny-emitter-2.0.2"
3329 3348 (sources."tiny-lr-fork-0.0.5" // {
3330 3349 dependencies = [
3331 3350 sources."qs-0.5.6"
3332 3351 ];
3333 3352 })
3334 3353 sources."tough-cookie-2.3.4"
3335 3354 sources."tunnel-agent-0.6.0"
3336 3355 sources."tweetnacl-0.14.5"
3337 3356 sources."type-check-0.3.2"
3338 3357 sources."typedarray-0.0.6"
3339 3358 sources."typical-2.6.1"
3340 3359 sources."uid-number-0.0.5"
3341 3360 sources."underscore-1.7.0"
3342 3361 sources."underscore.string-2.2.1"
3343 3362 sources."unicode-5.2.0-0.7.5"
3344 3363 sources."util-deprecate-1.0.2"
3345 3364 sources."uuid-3.3.2"
3346 sources."validate-npm-package-license-3.0.3"
3365 sources."validate-npm-package-license-3.0.4"
3347 3366 sources."validate-npm-package-name-3.0.0"
3348 3367 (sources."verror-1.10.0" // {
3349 3368 dependencies = [
3350 3369 sources."assert-plus-1.0.0"
3351 3370 ];
3352 3371 })
3353 3372 (sources."vulcanize-1.16.0" // {
3354 3373 dependencies = [
3355 3374 sources."nopt-3.0.6"
3356 3375 ];
3357 3376 })
3358 3377 sources."walk-2.3.14"
3378 sources."waypoints-4.0.1"
3359 3379 sources."which-1.0.9"
3360 3380 sources."wide-align-1.1.3"
3361 (sources."winston-2.4.3" // {
3381 (sources."winston-2.4.4" // {
3362 3382 dependencies = [
3363 3383 sources."async-1.0.0"
3364 3384 sources."colors-1.0.3"
3365 3385 ];
3366 3386 })
3367 3387 sources."wordwrap-1.0.0"
3368 3388 sources."wordwrapjs-2.0.0"
3369 3389 sources."wrappy-1.0.2"
3370 3390 sources."yallist-3.0.2"
3371 3391 sources."yauzl-2.4.1"
3372 3392 ];
3373 3393 buildInputs = globalBuildInputs;
3374 3394 meta = {
3375 3395 description = "RhodeCode JS packaged";
3376 3396 license = "SEE LICENSE IN LICENSE.txt";
3377 3397 };
3378 3398 production = false;
3379 3399 bypassCache = false;
3380 3400 };
3381 3401 in
3382 3402 {
3383 3403 tarball = nodeEnv.buildNodeSourceDist args;
3384 3404 package = nodeEnv.buildNodePackage args;
3385 3405 shell = nodeEnv.buildNodeShell args;
3386 3406 } No newline at end of file
@@ -1,320 +1,320 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2010-2018 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
7 7 # (only), as published by the Free Software Foundation.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU Affero General Public License
15 15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 16 #
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 import pytest
22 22
23 23 from rhodecode.tests import TestController
24 24
25 25 from rhodecode.model.db import (
26 26 ChangesetComment, Notification, UserNotification)
27 27 from rhodecode.model.meta import Session
28 28 from rhodecode.lib import helpers as h
29 29
30 30
31 31 def route_path(name, params=None, **kwargs):
32 32 import urllib
33 33
34 34 base_url = {
35 35 'repo_commit': '/{repo_name}/changeset/{commit_id}',
36 36 'repo_commit_comment_create': '/{repo_name}/changeset/{commit_id}/comment/create',
37 37 'repo_commit_comment_preview': '/{repo_name}/changeset/{commit_id}/comment/preview',
38 38 'repo_commit_comment_delete': '/{repo_name}/changeset/{commit_id}/comment/{comment_id}/delete',
39 39 }[name].format(**kwargs)
40 40
41 41 if params:
42 42 base_url = '{}?{}'.format(base_url, urllib.urlencode(params))
43 43 return base_url
44 44
45 45
46 46 @pytest.mark.backends("git", "hg", "svn")
47 47 class TestRepoCommitCommentsView(TestController):
48 48
49 49 @pytest.fixture(autouse=True)
50 50 def prepare(self, request, baseapp):
51 51 for x in ChangesetComment.query().all():
52 52 Session().delete(x)
53 53 Session().commit()
54 54
55 55 for x in Notification.query().all():
56 56 Session().delete(x)
57 57 Session().commit()
58 58
59 59 request.addfinalizer(self.cleanup)
60 60
61 61 def cleanup(self):
62 62 for x in ChangesetComment.query().all():
63 63 Session().delete(x)
64 64 Session().commit()
65 65
66 66 for x in Notification.query().all():
67 67 Session().delete(x)
68 68 Session().commit()
69 69
70 70 @pytest.mark.parametrize('comment_type', ChangesetComment.COMMENT_TYPES)
71 71 def test_create(self, comment_type, backend):
72 72 self.log_user()
73 73 commit = backend.repo.get_commit('300')
74 74 commit_id = commit.raw_id
75 75 text = u'CommentOnCommit'
76 76
77 77 params = {'text': text, 'csrf_token': self.csrf_token,
78 78 'comment_type': comment_type}
79 79 self.app.post(
80 80 route_path('repo_commit_comment_create',
81 81 repo_name=backend.repo_name, commit_id=commit_id),
82 82 params=params)
83 83
84 84 response = self.app.get(
85 85 route_path('repo_commit',
86 86 repo_name=backend.repo_name, commit_id=commit_id))
87 87
88 88 # test DB
89 89 assert ChangesetComment.query().count() == 1
90 90 assert_comment_links(response, ChangesetComment.query().count(), 0)
91 91
92 92 assert Notification.query().count() == 1
93 93 assert ChangesetComment.query().count() == 1
94 94
95 95 notification = Notification.query().all()[0]
96 96
97 97 comment_id = ChangesetComment.query().first().comment_id
98 98 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
99 99
100 100 author = notification.created_by_user.username_and_name
101 101 sbj = '{0} left a {1} on commit `{2}` in the {3} repository'.format(
102 102 author, comment_type, h.show_id(commit), backend.repo_name)
103 103 assert sbj == notification.subject
104 104
105 105 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
106 106 backend.repo_name, commit_id, comment_id))
107 107 assert lnk in notification.body
108 108
109 109 @pytest.mark.parametrize('comment_type', ChangesetComment.COMMENT_TYPES)
110 110 def test_create_inline(self, comment_type, backend):
111 111 self.log_user()
112 112 commit = backend.repo.get_commit('300')
113 113 commit_id = commit.raw_id
114 114 text = u'CommentOnCommit'
115 115 f_path = 'vcs/web/simplevcs/views/repository.py'
116 116 line = 'n1'
117 117
118 118 params = {'text': text, 'f_path': f_path, 'line': line,
119 119 'comment_type': comment_type,
120 120 'csrf_token': self.csrf_token}
121 121
122 122 self.app.post(
123 123 route_path('repo_commit_comment_create',
124 124 repo_name=backend.repo_name, commit_id=commit_id),
125 125 params=params)
126 126
127 127 response = self.app.get(
128 128 route_path('repo_commit',
129 129 repo_name=backend.repo_name, commit_id=commit_id))
130 130
131 131 # test DB
132 132 assert ChangesetComment.query().count() == 1
133 133 assert_comment_links(response, 0, ChangesetComment.query().count())
134 134
135 135 if backend.alias == 'svn':
136 136 response.mustcontain(
137 137 '''data-f-path="vcs/commands/summary.py" '''
138 '''id="a_c-300-ad05457a43f8"'''
138 '''data-anchor-id="c-300-ad05457a43f8"'''
139 139 )
140 140 if backend.alias == 'git':
141 141 response.mustcontain(
142 142 '''data-f-path="vcs/backends/hg.py" '''
143 '''id="a_c-883e775e89ea-9c390eb52cd6"'''
143 '''data-anchor-id="c-883e775e89ea-9c390eb52cd6"'''
144 144 )
145 145
146 146 if backend.alias == 'hg':
147 147 response.mustcontain(
148 148 '''data-f-path="vcs/backends/hg.py" '''
149 '''id="a_c-e58d85a3973b-9c390eb52cd6"'''
149 '''data-anchor-id="c-e58d85a3973b-9c390eb52cd6"'''
150 150 )
151 151
152 152 assert Notification.query().count() == 1
153 153 assert ChangesetComment.query().count() == 1
154 154
155 155 notification = Notification.query().all()[0]
156 156 comment = ChangesetComment.query().first()
157 157 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
158 158
159 159 assert comment.revision == commit_id
160 160
161 161 author = notification.created_by_user.username_and_name
162 162 sbj = '{0} left a {1} on file `{2}` in commit `{3}` in the {4} repository'.format(
163 163 author, comment_type, f_path, h.show_id(commit), backend.repo_name)
164 164
165 165 assert sbj == notification.subject
166 166
167 167 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
168 168 backend.repo_name, commit_id, comment.comment_id))
169 169 assert lnk in notification.body
170 170 assert 'on line n1' in notification.body
171 171
172 172 def test_create_with_mention(self, backend):
173 173 self.log_user()
174 174
175 175 commit_id = backend.repo.get_commit('300').raw_id
176 176 text = u'@test_regular check CommentOnCommit'
177 177
178 178 params = {'text': text, 'csrf_token': self.csrf_token}
179 179 self.app.post(
180 180 route_path('repo_commit_comment_create',
181 181 repo_name=backend.repo_name, commit_id=commit_id),
182 182 params=params)
183 183
184 184 response = self.app.get(
185 185 route_path('repo_commit',
186 186 repo_name=backend.repo_name, commit_id=commit_id))
187 187 # test DB
188 188 assert ChangesetComment.query().count() == 1
189 189 assert_comment_links(response, ChangesetComment.query().count(), 0)
190 190
191 191 notification = Notification.query().one()
192 192
193 193 assert len(notification.recipients) == 2
194 194 users = [x.username for x in notification.recipients]
195 195
196 196 # test_regular gets notification by @mention
197 197 assert sorted(users) == [u'test_admin', u'test_regular']
198 198
199 199 def test_create_with_status_change(self, backend):
200 200 self.log_user()
201 201 commit = backend.repo.get_commit('300')
202 202 commit_id = commit.raw_id
203 203 text = u'CommentOnCommit'
204 204 f_path = 'vcs/web/simplevcs/views/repository.py'
205 205 line = 'n1'
206 206
207 207 params = {'text': text, 'changeset_status': 'approved',
208 208 'csrf_token': self.csrf_token}
209 209
210 210 self.app.post(
211 211 route_path(
212 212 'repo_commit_comment_create',
213 213 repo_name=backend.repo_name, commit_id=commit_id),
214 214 params=params)
215 215
216 216 response = self.app.get(
217 217 route_path('repo_commit',
218 218 repo_name=backend.repo_name, commit_id=commit_id))
219 219
220 220 # test DB
221 221 assert ChangesetComment.query().count() == 1
222 222 assert_comment_links(response, ChangesetComment.query().count(), 0)
223 223
224 224 assert Notification.query().count() == 1
225 225 assert ChangesetComment.query().count() == 1
226 226
227 227 notification = Notification.query().all()[0]
228 228
229 229 comment_id = ChangesetComment.query().first().comment_id
230 230 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
231 231
232 232 author = notification.created_by_user.username_and_name
233 233 sbj = '[status: Approved] {0} left a note on commit `{1}` in the {2} repository'.format(
234 234 author, h.show_id(commit), backend.repo_name)
235 235 assert sbj == notification.subject
236 236
237 237 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
238 238 backend.repo_name, commit_id, comment_id))
239 239 assert lnk in notification.body
240 240
241 241 def test_delete(self, backend):
242 242 self.log_user()
243 243 commit_id = backend.repo.get_commit('300').raw_id
244 244 text = u'CommentOnCommit'
245 245
246 246 params = {'text': text, 'csrf_token': self.csrf_token}
247 247 self.app.post(
248 248 route_path(
249 249 'repo_commit_comment_create',
250 250 repo_name=backend.repo_name, commit_id=commit_id),
251 251 params=params)
252 252
253 253 comments = ChangesetComment.query().all()
254 254 assert len(comments) == 1
255 255 comment_id = comments[0].comment_id
256 256
257 257 self.app.post(
258 258 route_path('repo_commit_comment_delete',
259 259 repo_name=backend.repo_name,
260 260 commit_id=commit_id,
261 261 comment_id=comment_id),
262 262 params={'csrf_token': self.csrf_token})
263 263
264 264 comments = ChangesetComment.query().all()
265 265 assert len(comments) == 0
266 266
267 267 response = self.app.get(
268 268 route_path('repo_commit',
269 269 repo_name=backend.repo_name, commit_id=commit_id))
270 270 assert_comment_links(response, 0, 0)
271 271
272 272 @pytest.mark.parametrize('renderer, input, output', [
273 273 ('rst', 'plain text', '<p>plain text</p>'),
274 274 ('rst', 'header\n======', '<h1 class="title">header</h1>'),
275 275 ('rst', '*italics*', '<em>italics</em>'),
276 276 ('rst', '**bold**', '<strong>bold</strong>'),
277 277 ('markdown', 'plain text', '<p>plain text</p>'),
278 278 ('markdown', '# header', '<h1>header</h1>'),
279 279 ('markdown', '*italics*', '<em>italics</em>'),
280 280 ('markdown', '**bold**', '<strong>bold</strong>'),
281 281 ], ids=['rst-plain', 'rst-header', 'rst-italics', 'rst-bold', 'md-plain',
282 282 'md-header', 'md-italics', 'md-bold', ])
283 283 def test_preview(self, renderer, input, output, backend, xhr_header):
284 284 self.log_user()
285 285 params = {
286 286 'renderer': renderer,
287 287 'text': input,
288 288 'csrf_token': self.csrf_token
289 289 }
290 290 commit_id = '0' * 16 # fake this for tests
291 291 response = self.app.post(
292 292 route_path('repo_commit_comment_preview',
293 293 repo_name=backend.repo_name, commit_id=commit_id,),
294 294 params=params,
295 295 extra_environ=xhr_header)
296 296
297 297 response.mustcontain(output)
298 298
299 299
300 300 def assert_comment_links(response, comments, inline_comments):
301 301 if comments == 1:
302 302 comments_text = "%d Commit comment" % comments
303 303 else:
304 304 comments_text = "%d Commit comments" % comments
305 305
306 306 if inline_comments == 1:
307 307 inline_comments_text = "%d Inline Comment" % inline_comments
308 308 else:
309 309 inline_comments_text = "%d Inline Comments" % inline_comments
310 310
311 311 if comments:
312 312 response.mustcontain('<a href="#comments">%s</a>,' % comments_text)
313 313 else:
314 314 response.mustcontain(comments_text)
315 315
316 316 if inline_comments:
317 317 response.mustcontain(
318 318 'id="inline-comments-counter">%s</' % inline_comments_text)
319 319 else:
320 320 response.mustcontain(inline_comments_text)
@@ -1,666 +1,666 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2010-2018 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
7 7 # (only), as published by the Free Software Foundation.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU Affero General Public License
15 15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 16 #
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 import mock
22 22 import pytest
23 23 import lxml.html
24 24
25 25 from rhodecode.lib.vcs.exceptions import RepositoryRequirementError
26 26 from rhodecode.tests import assert_session_flash
27 27 from rhodecode.tests.utils import AssertResponse, commit_change
28 28
29 29
30 30 def route_path(name, params=None, **kwargs):
31 31 import urllib
32 32
33 33 base_url = {
34 34 'repo_compare_select': '/{repo_name}/compare',
35 35 'repo_compare': '/{repo_name}/compare/{source_ref_type}@{source_ref}...{target_ref_type}@{target_ref}',
36 36 }[name].format(**kwargs)
37 37
38 38 if params:
39 39 base_url = '{}?{}'.format(base_url, urllib.urlencode(params))
40 40 return base_url
41 41
42 42
43 43 @pytest.mark.usefixtures("autologin_user", "app")
44 44 class TestCompareView(object):
45 45
46 46 def test_compare_index_is_reached_at_least_once(self, backend):
47 47 repo = backend.repo
48 48 self.app.get(
49 49 route_path('repo_compare_select', repo_name=repo.repo_name))
50 50
51 51 @pytest.mark.xfail_backends("svn", reason="Requires pull")
52 52 def test_compare_remote_with_different_commit_indexes(self, backend):
53 53 # Preparing the following repository structure:
54 54 #
55 55 # Origin repository has two commits:
56 56 #
57 57 # 0 1
58 58 # A -- D
59 59 #
60 60 # The fork of it has a few more commits and "D" has a commit index
61 61 # which does not exist in origin.
62 62 #
63 63 # 0 1 2 3 4
64 64 # A -- -- -- D -- E
65 65 # \- B -- C
66 66 #
67 67
68 68 fork = backend.create_repo()
69 69
70 70 # prepare fork
71 71 commit0 = commit_change(
72 72 fork.repo_name, filename='file1', content='A',
73 73 message='A', vcs_type=backend.alias, parent=None, newfile=True)
74 74
75 75 commit1 = commit_change(
76 76 fork.repo_name, filename='file1', content='B',
77 77 message='B, child of A', vcs_type=backend.alias, parent=commit0)
78 78
79 79 commit_change( # commit 2
80 80 fork.repo_name, filename='file1', content='C',
81 81 message='C, child of B', vcs_type=backend.alias, parent=commit1)
82 82
83 83 commit3 = commit_change(
84 84 fork.repo_name, filename='file1', content='D',
85 85 message='D, child of A', vcs_type=backend.alias, parent=commit0)
86 86
87 87 commit4 = commit_change(
88 88 fork.repo_name, filename='file1', content='E',
89 89 message='E, child of D', vcs_type=backend.alias, parent=commit3)
90 90
91 91 # prepare origin repository, taking just the history up to D
92 92 origin = backend.create_repo()
93 93
94 94 origin_repo = origin.scm_instance(cache=False)
95 95 origin_repo.config.clear_section('hooks')
96 96 origin_repo.pull(fork.repo_full_path, commit_ids=[commit3.raw_id])
97 97
98 98 # Verify test fixture setup
99 99 # This does not work for git
100 100 if backend.alias != 'git':
101 101 assert 5 == len(fork.scm_instance().commit_ids)
102 102 assert 2 == len(origin_repo.commit_ids)
103 103
104 104 # Comparing the revisions
105 105 response = self.app.get(
106 106 route_path('repo_compare',
107 107 repo_name=origin.repo_name,
108 108 source_ref_type="rev", source_ref=commit3.raw_id,
109 109 target_ref_type="rev", target_ref=commit4.raw_id,
110 110 params=dict(merge='1', target_repo=fork.repo_name)
111 111 ))
112 112
113 113 compare_page = ComparePage(response)
114 114 compare_page.contains_commits([commit4])
115 115
116 116 @pytest.mark.xfail_backends("svn", reason="Depends on branch support")
117 117 def test_compare_forks_on_branch_extra_commits(self, backend):
118 118 repo1 = backend.create_repo()
119 119
120 120 # commit something !
121 121 commit0 = commit_change(
122 122 repo1.repo_name, filename='file1', content='line1\n',
123 123 message='commit1', vcs_type=backend.alias, parent=None,
124 124 newfile=True)
125 125
126 126 # fork this repo
127 127 repo2 = backend.create_fork()
128 128
129 129 # add two extra commit into fork
130 130 commit1 = commit_change(
131 131 repo2.repo_name, filename='file1', content='line1\nline2\n',
132 132 message='commit2', vcs_type=backend.alias, parent=commit0)
133 133
134 134 commit2 = commit_change(
135 135 repo2.repo_name, filename='file1', content='line1\nline2\nline3\n',
136 136 message='commit3', vcs_type=backend.alias, parent=commit1)
137 137
138 138 commit_id1 = repo1.scm_instance().DEFAULT_BRANCH_NAME
139 139 commit_id2 = repo2.scm_instance().DEFAULT_BRANCH_NAME
140 140
141 141 response = self.app.get(
142 142 route_path('repo_compare',
143 143 repo_name=repo1.repo_name,
144 144 source_ref_type="branch", source_ref=commit_id2,
145 145 target_ref_type="branch", target_ref=commit_id1,
146 146 params=dict(merge='1', target_repo=repo2.repo_name)
147 147 ))
148 148
149 149 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2))
150 150 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1))
151 151
152 152 compare_page = ComparePage(response)
153 153 compare_page.contains_change_summary(1, 2, 0)
154 154 compare_page.contains_commits([commit1, commit2])
155 155
156 156 anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id)
157 157 compare_page.contains_file_links_and_anchors([('file1', anchor), ])
158 158
159 159 # Swap is removed when comparing branches since it's a PR feature and
160 160 # it is then a preview mode
161 161 compare_page.swap_is_hidden()
162 162 compare_page.target_source_are_disabled()
163 163
164 164 @pytest.mark.xfail_backends("svn", reason="Depends on branch support")
165 165 def test_compare_forks_on_branch_extra_commits_origin_has_incomming(
166 166 self, backend):
167 167 repo1 = backend.create_repo()
168 168
169 169 # commit something !
170 170 commit0 = commit_change(
171 171 repo1.repo_name, filename='file1', content='line1\n',
172 172 message='commit1', vcs_type=backend.alias, parent=None,
173 173 newfile=True)
174 174
175 175 # fork this repo
176 176 repo2 = backend.create_fork()
177 177
178 178 # now commit something to origin repo
179 179 commit_change(
180 180 repo1.repo_name, filename='file2', content='line1file2\n',
181 181 message='commit2', vcs_type=backend.alias, parent=commit0,
182 182 newfile=True)
183 183
184 184 # add two extra commit into fork
185 185 commit1 = commit_change(
186 186 repo2.repo_name, filename='file1', content='line1\nline2\n',
187 187 message='commit2', vcs_type=backend.alias, parent=commit0)
188 188
189 189 commit2 = commit_change(
190 190 repo2.repo_name, filename='file1', content='line1\nline2\nline3\n',
191 191 message='commit3', vcs_type=backend.alias, parent=commit1)
192 192
193 193 commit_id1 = repo1.scm_instance().DEFAULT_BRANCH_NAME
194 194 commit_id2 = repo2.scm_instance().DEFAULT_BRANCH_NAME
195 195
196 196 response = self.app.get(
197 197 route_path('repo_compare',
198 198 repo_name=repo1.repo_name,
199 199 source_ref_type="branch", source_ref=commit_id2,
200 200 target_ref_type="branch", target_ref=commit_id1,
201 201 params=dict(merge='1', target_repo=repo2.repo_name),
202 202 ))
203 203
204 204 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2))
205 205 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1))
206 206
207 207 compare_page = ComparePage(response)
208 208 compare_page.contains_change_summary(1, 2, 0)
209 209 compare_page.contains_commits([commit1, commit2])
210 210 anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id)
211 211 compare_page.contains_file_links_and_anchors([('file1', anchor), ])
212 212
213 213 # Swap is removed when comparing branches since it's a PR feature and
214 214 # it is then a preview mode
215 215 compare_page.swap_is_hidden()
216 216 compare_page.target_source_are_disabled()
217 217
218 218 @pytest.mark.xfail_backends("svn")
219 219 # TODO(marcink): no svn support for compare two seperate repos
220 220 def test_compare_of_unrelated_forks(self, backend):
221 221 orig = backend.create_repo(number_of_commits=1)
222 222 fork = backend.create_repo(number_of_commits=1)
223 223
224 224 response = self.app.get(
225 225 route_path('repo_compare',
226 226 repo_name=orig.repo_name,
227 227 source_ref_type="rev", source_ref="tip",
228 228 target_ref_type="rev", target_ref="tip",
229 229 params=dict(merge='1', target_repo=fork.repo_name),
230 230 ),
231 231 status=302)
232 232 response = response.follow()
233 233 response.mustcontain("Repositories unrelated.")
234 234
235 235 @pytest.mark.xfail_backends("svn")
236 236 def test_compare_cherry_pick_commits_from_bottom(self, backend):
237 237
238 238 # repo1:
239 239 # commit0:
240 240 # commit1:
241 241 # repo1-fork- in which we will cherry pick bottom commits
242 242 # commit0:
243 243 # commit1:
244 244 # commit2: x
245 245 # commit3: x
246 246 # commit4: x
247 247 # commit5:
248 248 # make repo1, and commit1+commit2
249 249
250 250 repo1 = backend.create_repo()
251 251
252 252 # commit something !
253 253 commit0 = commit_change(
254 254 repo1.repo_name, filename='file1', content='line1\n',
255 255 message='commit1', vcs_type=backend.alias, parent=None,
256 256 newfile=True)
257 257 commit1 = commit_change(
258 258 repo1.repo_name, filename='file1', content='line1\nline2\n',
259 259 message='commit2', vcs_type=backend.alias, parent=commit0)
260 260
261 261 # fork this repo
262 262 repo2 = backend.create_fork()
263 263
264 264 # now make commit3-6
265 265 commit2 = commit_change(
266 266 repo1.repo_name, filename='file1', content='line1\nline2\nline3\n',
267 267 message='commit3', vcs_type=backend.alias, parent=commit1)
268 268 commit3 = commit_change(
269 269 repo1.repo_name, filename='file1',
270 270 content='line1\nline2\nline3\nline4\n', message='commit4',
271 271 vcs_type=backend.alias, parent=commit2)
272 272 commit4 = commit_change(
273 273 repo1.repo_name, filename='file1',
274 274 content='line1\nline2\nline3\nline4\nline5\n', message='commit5',
275 275 vcs_type=backend.alias, parent=commit3)
276 276 commit_change( # commit 5
277 277 repo1.repo_name, filename='file1',
278 278 content='line1\nline2\nline3\nline4\nline5\nline6\n',
279 279 message='commit6', vcs_type=backend.alias, parent=commit4)
280 280
281 281 response = self.app.get(
282 282 route_path('repo_compare',
283 283 repo_name=repo2.repo_name,
284 284 # parent of commit2, in target repo2
285 285 source_ref_type="rev", source_ref=commit1.raw_id,
286 286 target_ref_type="rev", target_ref=commit4.raw_id,
287 287 params=dict(merge='1', target_repo=repo1.repo_name),
288 288 ))
289 289 response.mustcontain('%s@%s' % (repo2.repo_name, commit1.short_id))
290 290 response.mustcontain('%s@%s' % (repo1.repo_name, commit4.short_id))
291 291
292 292 # files
293 293 compare_page = ComparePage(response)
294 294 compare_page.contains_change_summary(1, 3, 0)
295 295 compare_page.contains_commits([commit2, commit3, commit4])
296 296 anchor = 'a_c-{}-826e8142e6ba'.format(commit1.short_id)
297 297 compare_page.contains_file_links_and_anchors([('file1', anchor),])
298 298
299 299 @pytest.mark.xfail_backends("svn")
300 300 def test_compare_cherry_pick_commits_from_top(self, backend):
301 301 # repo1:
302 302 # commit0:
303 303 # commit1:
304 304 # repo1-fork- in which we will cherry pick bottom commits
305 305 # commit0:
306 306 # commit1:
307 307 # commit2:
308 308 # commit3: x
309 309 # commit4: x
310 310 # commit5: x
311 311
312 312 # make repo1, and commit1+commit2
313 313 repo1 = backend.create_repo()
314 314
315 315 # commit something !
316 316 commit0 = commit_change(
317 317 repo1.repo_name, filename='file1', content='line1\n',
318 318 message='commit1', vcs_type=backend.alias, parent=None,
319 319 newfile=True)
320 320 commit1 = commit_change(
321 321 repo1.repo_name, filename='file1', content='line1\nline2\n',
322 322 message='commit2', vcs_type=backend.alias, parent=commit0)
323 323
324 324 # fork this repo
325 325 backend.create_fork()
326 326
327 327 # now make commit3-6
328 328 commit2 = commit_change(
329 329 repo1.repo_name, filename='file1', content='line1\nline2\nline3\n',
330 330 message='commit3', vcs_type=backend.alias, parent=commit1)
331 331 commit3 = commit_change(
332 332 repo1.repo_name, filename='file1',
333 333 content='line1\nline2\nline3\nline4\n', message='commit4',
334 334 vcs_type=backend.alias, parent=commit2)
335 335 commit4 = commit_change(
336 336 repo1.repo_name, filename='file1',
337 337 content='line1\nline2\nline3\nline4\nline5\n', message='commit5',
338 338 vcs_type=backend.alias, parent=commit3)
339 339 commit5 = commit_change(
340 340 repo1.repo_name, filename='file1',
341 341 content='line1\nline2\nline3\nline4\nline5\nline6\n',
342 342 message='commit6', vcs_type=backend.alias, parent=commit4)
343 343
344 344 response = self.app.get(
345 345 route_path('repo_compare',
346 346 repo_name=repo1.repo_name,
347 347 # parent of commit3, not in source repo2
348 348 source_ref_type="rev", source_ref=commit2.raw_id,
349 349 target_ref_type="rev", target_ref=commit5.raw_id,
350 350 params=dict(merge='1'),))
351 351
352 352 response.mustcontain('%s@%s' % (repo1.repo_name, commit2.short_id))
353 353 response.mustcontain('%s@%s' % (repo1.repo_name, commit5.short_id))
354 354
355 355 compare_page = ComparePage(response)
356 356 compare_page.contains_change_summary(1, 3, 0)
357 357 compare_page.contains_commits([commit3, commit4, commit5])
358 358
359 359 # files
360 360 anchor = 'a_c-{}-826e8142e6ba'.format(commit2.short_id)
361 361 compare_page.contains_file_links_and_anchors([('file1', anchor),])
362 362
363 363 @pytest.mark.xfail_backends("svn")
364 364 def test_compare_remote_branches(self, backend):
365 365 repo1 = backend.repo
366 366 repo2 = backend.create_fork()
367 367
368 368 commit_id1 = repo1.get_commit(commit_idx=3).raw_id
369 369 commit_id1_short = repo1.get_commit(commit_idx=3).short_id
370 370 commit_id2 = repo1.get_commit(commit_idx=6).raw_id
371 371 commit_id2_short = repo1.get_commit(commit_idx=6).short_id
372 372
373 373 response = self.app.get(
374 374 route_path('repo_compare',
375 375 repo_name=repo1.repo_name,
376 376 source_ref_type="rev", source_ref=commit_id1,
377 377 target_ref_type="rev", target_ref=commit_id2,
378 378 params=dict(merge='1', target_repo=repo2.repo_name),
379 379 ))
380 380
381 381 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id1))
382 382 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id2))
383 383
384 384 compare_page = ComparePage(response)
385 385
386 386 # outgoing commits between those commits
387 387 compare_page.contains_commits(
388 388 [repo2.get_commit(commit_idx=x) for x in [4, 5, 6]])
389 389
390 390 # files
391 391 compare_page.contains_file_links_and_anchors([
392 392 ('vcs/backends/hg.py', 'a_c-{}-9c390eb52cd6'.format(commit_id2_short)),
393 393 ('vcs/backends/__init__.py', 'a_c-{}-41b41c1f2796'.format(commit_id1_short)),
394 394 ('vcs/backends/base.py', 'a_c-{}-2f574d260608'.format(commit_id1_short)),
395 395 ])
396 396
397 397 @pytest.mark.xfail_backends("svn")
398 398 def test_source_repo_new_commits_after_forking_simple_diff(self, backend):
399 399 repo1 = backend.create_repo()
400 400 r1_name = repo1.repo_name
401 401
402 402 commit0 = commit_change(
403 403 repo=r1_name, filename='file1',
404 404 content='line1', message='commit1', vcs_type=backend.alias,
405 405 newfile=True)
406 406 assert repo1.scm_instance().commit_ids == [commit0.raw_id]
407 407
408 408 # fork the repo1
409 409 repo2 = backend.create_fork()
410 410 assert repo2.scm_instance().commit_ids == [commit0.raw_id]
411 411
412 412 self.r2_id = repo2.repo_id
413 413 r2_name = repo2.repo_name
414 414
415 415 commit1 = commit_change(
416 416 repo=r2_name, filename='file1-fork',
417 417 content='file1-line1-from-fork', message='commit1-fork',
418 418 vcs_type=backend.alias, parent=repo2.scm_instance()[-1],
419 419 newfile=True)
420 420
421 421 commit2 = commit_change(
422 422 repo=r2_name, filename='file2-fork',
423 423 content='file2-line1-from-fork', message='commit2-fork',
424 424 vcs_type=backend.alias, parent=commit1,
425 425 newfile=True)
426 426
427 427 commit_change( # commit 3
428 428 repo=r2_name, filename='file3-fork',
429 429 content='file3-line1-from-fork', message='commit3-fork',
430 430 vcs_type=backend.alias, parent=commit2, newfile=True)
431 431
432 432 # compare !
433 433 commit_id1 = repo1.scm_instance().DEFAULT_BRANCH_NAME
434 434 commit_id2 = repo2.scm_instance().DEFAULT_BRANCH_NAME
435 435
436 436 response = self.app.get(
437 437 route_path('repo_compare',
438 438 repo_name=r2_name,
439 439 source_ref_type="branch", source_ref=commit_id1,
440 440 target_ref_type="branch", target_ref=commit_id2,
441 441 params=dict(merge='1', target_repo=r1_name),
442 442 ))
443 443
444 444 response.mustcontain('%s@%s' % (r2_name, commit_id1))
445 445 response.mustcontain('%s@%s' % (r1_name, commit_id2))
446 446 response.mustcontain('No files')
447 447 response.mustcontain('No commits in this compare')
448 448
449 449 commit0 = commit_change(
450 450 repo=r1_name, filename='file2',
451 451 content='line1-added-after-fork', message='commit2-parent',
452 452 vcs_type=backend.alias, parent=None, newfile=True)
453 453
454 454 # compare !
455 455 response = self.app.get(
456 456 route_path('repo_compare',
457 457 repo_name=r2_name,
458 458 source_ref_type="branch", source_ref=commit_id1,
459 459 target_ref_type="branch", target_ref=commit_id2,
460 460 params=dict(merge='1', target_repo=r1_name),
461 461 ))
462 462
463 463 response.mustcontain('%s@%s' % (r2_name, commit_id1))
464 464 response.mustcontain('%s@%s' % (r1_name, commit_id2))
465 465
466 466 response.mustcontain("""commit2-parent""")
467 467 response.mustcontain("""line1-added-after-fork""")
468 468 compare_page = ComparePage(response)
469 469 compare_page.contains_change_summary(1, 1, 0)
470 470
471 471 @pytest.mark.xfail_backends("svn")
472 472 def test_compare_commits(self, backend, xhr_header):
473 473 commit0 = backend.repo.get_commit(commit_idx=0)
474 474 commit1 = backend.repo.get_commit(commit_idx=1)
475 475
476 476 response = self.app.get(
477 477 route_path('repo_compare',
478 478 repo_name=backend.repo_name,
479 479 source_ref_type="rev", source_ref=commit0.raw_id,
480 480 target_ref_type="rev", target_ref=commit1.raw_id,
481 481 params=dict(merge='1')
482 482 ),
483 483 extra_environ=xhr_header, )
484 484
485 485 # outgoing commits between those commits
486 486 compare_page = ComparePage(response)
487 487 compare_page.contains_commits(commits=[commit1], ancestors=[commit0])
488 488
489 489 def test_errors_when_comparing_unknown_source_repo(self, backend):
490 490 repo = backend.repo
491 491 badrepo = 'badrepo'
492 492
493 493 response = self.app.get(
494 494 route_path('repo_compare',
495 495 repo_name=badrepo,
496 496 source_ref_type="rev", source_ref='tip',
497 497 target_ref_type="rev", target_ref='tip',
498 498 params=dict(merge='1', target_repo=repo.repo_name)
499 499 ),
500 500 status=404)
501 501
502 502 def test_errors_when_comparing_unknown_target_repo(self, backend):
503 503 repo = backend.repo
504 504 badrepo = 'badrepo'
505 505
506 506 response = self.app.get(
507 507 route_path('repo_compare',
508 508 repo_name=repo.repo_name,
509 509 source_ref_type="rev", source_ref='tip',
510 510 target_ref_type="rev", target_ref='tip',
511 511 params=dict(merge='1', target_repo=badrepo),
512 512 ),
513 513 status=302)
514 514 redirected = response.follow()
515 515 redirected.mustcontain(
516 516 'Could not find the target repo: `{}`'.format(badrepo))
517 517
518 518 def test_compare_not_in_preview_mode(self, backend_stub):
519 519 commit0 = backend_stub.repo.get_commit(commit_idx=0)
520 520 commit1 = backend_stub.repo.get_commit(commit_idx=1)
521 521
522 522 response = self.app.get(
523 523 route_path('repo_compare',
524 524 repo_name=backend_stub.repo_name,
525 525 source_ref_type="rev", source_ref=commit0.raw_id,
526 526 target_ref_type="rev", target_ref=commit1.raw_id,
527 527 ))
528 528
529 529 # outgoing commits between those commits
530 530 compare_page = ComparePage(response)
531 531 compare_page.swap_is_visible()
532 532 compare_page.target_source_are_enabled()
533 533
534 534 def test_compare_of_fork_with_largefiles(self, backend_hg, settings_util):
535 535 orig = backend_hg.create_repo(number_of_commits=1)
536 536 fork = backend_hg.create_fork()
537 537
538 538 settings_util.create_repo_rhodecode_ui(
539 539 orig, 'extensions', value='', key='largefiles', active=False)
540 540 settings_util.create_repo_rhodecode_ui(
541 541 fork, 'extensions', value='', key='largefiles', active=True)
542 542
543 543 compare_module = ('rhodecode.lib.vcs.backends.hg.repository.'
544 544 'MercurialRepository.compare')
545 545 with mock.patch(compare_module) as compare_mock:
546 546 compare_mock.side_effect = RepositoryRequirementError()
547 547
548 548 response = self.app.get(
549 549 route_path('repo_compare',
550 550 repo_name=orig.repo_name,
551 551 source_ref_type="rev", source_ref="tip",
552 552 target_ref_type="rev", target_ref="tip",
553 553 params=dict(merge='1', target_repo=fork.repo_name),
554 554 ),
555 555 status=302)
556 556
557 557 assert_session_flash(
558 558 response,
559 559 'Could not compare repos with different large file settings')
560 560
561 561
562 562 @pytest.mark.usefixtures("autologin_user")
563 563 class TestCompareControllerSvn(object):
564 564
565 565 def test_supports_references_with_path(self, app, backend_svn):
566 566 repo = backend_svn['svn-simple-layout']
567 567 commit_id = repo.get_commit(commit_idx=-1).raw_id
568 568 response = app.get(
569 569 route_path('repo_compare',
570 570 repo_name=repo.repo_name,
571 571 source_ref_type="tag",
572 572 source_ref="%s@%s" % ('tags/v0.1', commit_id),
573 573 target_ref_type="tag",
574 574 target_ref="%s@%s" % ('tags/v0.2', commit_id),
575 575 params=dict(merge='1'),
576 576 ),
577 577 status=200)
578 578
579 579 # Expecting no commits, since both paths are at the same revision
580 580 response.mustcontain('No commits in this compare')
581 581
582 582 # Should find only one file changed when comparing those two tags
583 583 response.mustcontain('example.py')
584 584 compare_page = ComparePage(response)
585 585 compare_page.contains_change_summary(1, 5, 1)
586 586
587 587 def test_shows_commits_if_different_ids(self, app, backend_svn):
588 588 repo = backend_svn['svn-simple-layout']
589 589 source_id = repo.get_commit(commit_idx=-6).raw_id
590 590 target_id = repo.get_commit(commit_idx=-1).raw_id
591 591 response = app.get(
592 592 route_path('repo_compare',
593 593 repo_name=repo.repo_name,
594 594 source_ref_type="tag",
595 595 source_ref="%s@%s" % ('tags/v0.1', source_id),
596 596 target_ref_type="tag",
597 597 target_ref="%s@%s" % ('tags/v0.2', target_id),
598 598 params=dict(merge='1')
599 599 ),
600 600 status=200)
601 601
602 602 # It should show commits
603 603 assert 'No commits in this compare' not in response.body
604 604
605 605 # Should find only one file changed when comparing those two tags
606 606 response.mustcontain('example.py')
607 607 compare_page = ComparePage(response)
608 608 compare_page.contains_change_summary(1, 5, 1)
609 609
610 610
611 611 class ComparePage(AssertResponse):
612 612 """
613 613 Abstracts the page template from the tests
614 614 """
615 615
616 616 def contains_file_links_and_anchors(self, files):
617 617 doc = lxml.html.fromstring(self.response.body)
618 618 for filename, file_id in files:
619 619 self.contains_one_anchor(file_id)
620 620 diffblock = doc.cssselect('[data-f-path="%s"]' % filename)
621 assert len(diffblock) == 1
621 assert len(diffblock) == 2
622 622 assert len(diffblock[0].cssselect('a[href="#%s"]' % file_id)) == 1
623 623
624 624 def contains_change_summary(self, files_changed, inserted, deleted):
625 625 template = (
626 626 "{files_changed} file{plural} changed: "
627 627 "{inserted} inserted, {deleted} deleted")
628 628 self.response.mustcontain(template.format(
629 629 files_changed=files_changed,
630 630 plural="s" if files_changed > 1 else "",
631 631 inserted=inserted,
632 632 deleted=deleted))
633 633
634 634 def contains_commits(self, commits, ancestors=None):
635 635 response = self.response
636 636
637 637 for commit in commits:
638 638 # Expecting to see the commit message in an element which
639 639 # has the ID "c-{commit.raw_id}"
640 640 self.element_contains('#c-' + commit.raw_id, commit.message)
641 641 self.contains_one_link(
642 642 'r%s:%s' % (commit.idx, commit.short_id),
643 643 self._commit_url(commit))
644 644 if ancestors:
645 645 response.mustcontain('Ancestor')
646 646 for ancestor in ancestors:
647 647 self.contains_one_link(
648 648 ancestor.short_id, self._commit_url(ancestor))
649 649
650 650 def _commit_url(self, commit):
651 651 return '/%s/changeset/%s' % (commit.repository.name, commit.raw_id)
652 652
653 653 def swap_is_hidden(self):
654 654 assert '<a id="btn-swap"' not in self.response.text
655 655
656 656 def swap_is_visible(self):
657 657 assert '<a id="btn-swap"' in self.response.text
658 658
659 659 def target_source_are_disabled(self):
660 660 response = self.response
661 661 response.mustcontain("var enable_fields = false;")
662 662 response.mustcontain('.select2("enable", enable_fields)')
663 663
664 664 def target_source_are_enabled(self):
665 665 response = self.response
666 666 response.mustcontain("var enable_fields = true;")
@@ -1,1228 +1,1228 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2011-2018 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
7 7 # (only), as published by the Free Software Foundation.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU Affero General Public License
15 15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 16 #
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21
22 22 """
23 23 Set of diffing helpers, previously part of vcs
24 24 """
25 25
26 26 import os
27 27 import re
28 28 import bz2
29 29
30 30 import collections
31 31 import difflib
32 32 import logging
33 33 import cPickle as pickle
34 34 from itertools import tee, imap
35 35
36 36 from rhodecode.lib.vcs.exceptions import VCSError
37 37 from rhodecode.lib.vcs.nodes import FileNode, SubModuleNode
38 38 from rhodecode.lib.utils2 import safe_unicode, safe_str
39 39
40 40 log = logging.getLogger(__name__)
41 41
42 42 # define max context, a file with more than this numbers of lines is unusable
43 43 # in browser anyway
44 44 MAX_CONTEXT = 1024 * 1014
45 45
46 46
47 47 class OPS(object):
48 48 ADD = 'A'
49 49 MOD = 'M'
50 50 DEL = 'D'
51 51
52 52
53 53 def get_gitdiff(filenode_old, filenode_new, ignore_whitespace=True, context=3):
54 54 """
55 55 Returns git style diff between given ``filenode_old`` and ``filenode_new``.
56 56
57 57 :param ignore_whitespace: ignore whitespaces in diff
58 58 """
59 59 # make sure we pass in default context
60 60 context = context or 3
61 61 # protect against IntOverflow when passing HUGE context
62 62 if context > MAX_CONTEXT:
63 63 context = MAX_CONTEXT
64 64
65 65 submodules = filter(lambda o: isinstance(o, SubModuleNode),
66 66 [filenode_new, filenode_old])
67 67 if submodules:
68 68 return ''
69 69
70 70 for filenode in (filenode_old, filenode_new):
71 71 if not isinstance(filenode, FileNode):
72 72 raise VCSError(
73 73 "Given object should be FileNode object, not %s"
74 74 % filenode.__class__)
75 75
76 76 repo = filenode_new.commit.repository
77 77 old_commit = filenode_old.commit or repo.EMPTY_COMMIT
78 78 new_commit = filenode_new.commit
79 79
80 80 vcs_gitdiff = repo.get_diff(
81 81 old_commit, new_commit, filenode_new.path,
82 82 ignore_whitespace, context, path1=filenode_old.path)
83 83 return vcs_gitdiff
84 84
85 85 NEW_FILENODE = 1
86 86 DEL_FILENODE = 2
87 87 MOD_FILENODE = 3
88 88 RENAMED_FILENODE = 4
89 89 COPIED_FILENODE = 5
90 90 CHMOD_FILENODE = 6
91 91 BIN_FILENODE = 7
92 92
93 93
94 94 class LimitedDiffContainer(object):
95 95
96 96 def __init__(self, diff_limit, cur_diff_size, diff):
97 97 self.diff = diff
98 98 self.diff_limit = diff_limit
99 99 self.cur_diff_size = cur_diff_size
100 100
101 101 def __getitem__(self, key):
102 102 return self.diff.__getitem__(key)
103 103
104 104 def __iter__(self):
105 105 for l in self.diff:
106 106 yield l
107 107
108 108
109 109 class Action(object):
110 110 """
111 111 Contains constants for the action value of the lines in a parsed diff.
112 112 """
113 113
114 114 ADD = 'add'
115 115 DELETE = 'del'
116 116 UNMODIFIED = 'unmod'
117 117
118 118 CONTEXT = 'context'
119 119 OLD_NO_NL = 'old-no-nl'
120 120 NEW_NO_NL = 'new-no-nl'
121 121
122 122
123 123 class DiffProcessor(object):
124 124 """
125 125 Give it a unified or git diff and it returns a list of the files that were
126 126 mentioned in the diff together with a dict of meta information that
127 127 can be used to render it in a HTML template.
128 128
129 129 .. note:: Unicode handling
130 130
131 131 The original diffs are a byte sequence and can contain filenames
132 132 in mixed encodings. This class generally returns `unicode` objects
133 133 since the result is intended for presentation to the user.
134 134
135 135 """
136 136 _chunk_re = re.compile(r'^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)')
137 137 _newline_marker = re.compile(r'^\\ No newline at end of file')
138 138
139 139 # used for inline highlighter word split
140 140 _token_re = re.compile(r'()(&gt;|&lt;|&amp;|\W+?)')
141 141
142 142 # collapse ranges of commits over given number
143 143 _collapse_commits_over = 5
144 144
145 145 def __init__(self, diff, format='gitdiff', diff_limit=None,
146 146 file_limit=None, show_full_diff=True):
147 147 """
148 148 :param diff: A `Diff` object representing a diff from a vcs backend
149 149 :param format: format of diff passed, `udiff` or `gitdiff`
150 150 :param diff_limit: define the size of diff that is considered "big"
151 151 based on that parameter cut off will be triggered, set to None
152 152 to show full diff
153 153 """
154 154 self._diff = diff
155 155 self._format = format
156 156 self.adds = 0
157 157 self.removes = 0
158 158 # calculate diff size
159 159 self.diff_limit = diff_limit
160 160 self.file_limit = file_limit
161 161 self.show_full_diff = show_full_diff
162 162 self.cur_diff_size = 0
163 163 self.parsed = False
164 164 self.parsed_diff = []
165 165
166 166 log.debug('Initialized DiffProcessor with %s mode', format)
167 167 if format == 'gitdiff':
168 168 self.differ = self._highlight_line_difflib
169 169 self._parser = self._parse_gitdiff
170 170 else:
171 171 self.differ = self._highlight_line_udiff
172 172 self._parser = self._new_parse_gitdiff
173 173
174 174 def _copy_iterator(self):
175 175 """
176 176 make a fresh copy of generator, we should not iterate thru
177 177 an original as it's needed for repeating operations on
178 178 this instance of DiffProcessor
179 179 """
180 180 self.__udiff, iterator_copy = tee(self.__udiff)
181 181 return iterator_copy
182 182
183 183 def _escaper(self, string):
184 184 """
185 185 Escaper for diff escapes special chars and checks the diff limit
186 186
187 187 :param string:
188 188 """
189 189 self.cur_diff_size += len(string)
190 190
191 191 if not self.show_full_diff and (self.cur_diff_size > self.diff_limit):
192 192 raise DiffLimitExceeded('Diff Limit Exceeded')
193 193
194 194 return string \
195 195 .replace('&', '&amp;')\
196 196 .replace('<', '&lt;')\
197 197 .replace('>', '&gt;')
198 198
199 199 def _line_counter(self, l):
200 200 """
201 201 Checks each line and bumps total adds/removes for this diff
202 202
203 203 :param l:
204 204 """
205 205 if l.startswith('+') and not l.startswith('+++'):
206 206 self.adds += 1
207 207 elif l.startswith('-') and not l.startswith('---'):
208 208 self.removes += 1
209 209 return safe_unicode(l)
210 210
211 211 def _highlight_line_difflib(self, line, next_):
212 212 """
213 213 Highlight inline changes in both lines.
214 214 """
215 215
216 216 if line['action'] == Action.DELETE:
217 217 old, new = line, next_
218 218 else:
219 219 old, new = next_, line
220 220
221 221 oldwords = self._token_re.split(old['line'])
222 222 newwords = self._token_re.split(new['line'])
223 223 sequence = difflib.SequenceMatcher(None, oldwords, newwords)
224 224
225 225 oldfragments, newfragments = [], []
226 226 for tag, i1, i2, j1, j2 in sequence.get_opcodes():
227 227 oldfrag = ''.join(oldwords[i1:i2])
228 228 newfrag = ''.join(newwords[j1:j2])
229 229 if tag != 'equal':
230 230 if oldfrag:
231 231 oldfrag = '<del>%s</del>' % oldfrag
232 232 if newfrag:
233 233 newfrag = '<ins>%s</ins>' % newfrag
234 234 oldfragments.append(oldfrag)
235 235 newfragments.append(newfrag)
236 236
237 237 old['line'] = "".join(oldfragments)
238 238 new['line'] = "".join(newfragments)
239 239
240 240 def _highlight_line_udiff(self, line, next_):
241 241 """
242 242 Highlight inline changes in both lines.
243 243 """
244 244 start = 0
245 245 limit = min(len(line['line']), len(next_['line']))
246 246 while start < limit and line['line'][start] == next_['line'][start]:
247 247 start += 1
248 248 end = -1
249 249 limit -= start
250 250 while -end <= limit and line['line'][end] == next_['line'][end]:
251 251 end -= 1
252 252 end += 1
253 253 if start or end:
254 254 def do(l):
255 255 last = end + len(l['line'])
256 256 if l['action'] == Action.ADD:
257 257 tag = 'ins'
258 258 else:
259 259 tag = 'del'
260 260 l['line'] = '%s<%s>%s</%s>%s' % (
261 261 l['line'][:start],
262 262 tag,
263 263 l['line'][start:last],
264 264 tag,
265 265 l['line'][last:]
266 266 )
267 267 do(line)
268 268 do(next_)
269 269
270 270 def _clean_line(self, line, command):
271 271 if command in ['+', '-', ' ']:
272 272 # only modify the line if it's actually a diff thing
273 273 line = line[1:]
274 274 return line
275 275
276 276 def _parse_gitdiff(self, inline_diff=True):
277 277 _files = []
278 278 diff_container = lambda arg: arg
279 279
280 280 for chunk in self._diff.chunks():
281 281 head = chunk.header
282 282
283 283 diff = imap(self._escaper, self.diff_splitter(chunk.diff))
284 284 raw_diff = chunk.raw
285 285 limited_diff = False
286 286 exceeds_limit = False
287 287
288 288 op = None
289 289 stats = {
290 290 'added': 0,
291 291 'deleted': 0,
292 292 'binary': False,
293 293 'ops': {},
294 294 }
295 295
296 296 if head['deleted_file_mode']:
297 297 op = OPS.DEL
298 298 stats['binary'] = True
299 299 stats['ops'][DEL_FILENODE] = 'deleted file'
300 300
301 301 elif head['new_file_mode']:
302 302 op = OPS.ADD
303 303 stats['binary'] = True
304 304 stats['ops'][NEW_FILENODE] = 'new file %s' % head['new_file_mode']
305 305 else: # modify operation, can be copy, rename or chmod
306 306
307 307 # CHMOD
308 308 if head['new_mode'] and head['old_mode']:
309 309 op = OPS.MOD
310 310 stats['binary'] = True
311 311 stats['ops'][CHMOD_FILENODE] = (
312 312 'modified file chmod %s => %s' % (
313 313 head['old_mode'], head['new_mode']))
314 314 # RENAME
315 315 if head['rename_from'] != head['rename_to']:
316 316 op = OPS.MOD
317 317 stats['binary'] = True
318 318 stats['ops'][RENAMED_FILENODE] = (
319 319 'file renamed from %s to %s' % (
320 320 head['rename_from'], head['rename_to']))
321 321 # COPY
322 322 if head.get('copy_from') and head.get('copy_to'):
323 323 op = OPS.MOD
324 324 stats['binary'] = True
325 325 stats['ops'][COPIED_FILENODE] = (
326 326 'file copied from %s to %s' % (
327 327 head['copy_from'], head['copy_to']))
328 328
329 329 # If our new parsed headers didn't match anything fallback to
330 330 # old style detection
331 331 if op is None:
332 332 if not head['a_file'] and head['b_file']:
333 333 op = OPS.ADD
334 334 stats['binary'] = True
335 335 stats['ops'][NEW_FILENODE] = 'new file'
336 336
337 337 elif head['a_file'] and not head['b_file']:
338 338 op = OPS.DEL
339 339 stats['binary'] = True
340 340 stats['ops'][DEL_FILENODE] = 'deleted file'
341 341
342 342 # it's not ADD not DELETE
343 343 if op is None:
344 344 op = OPS.MOD
345 345 stats['binary'] = True
346 346 stats['ops'][MOD_FILENODE] = 'modified file'
347 347
348 348 # a real non-binary diff
349 349 if head['a_file'] or head['b_file']:
350 350 try:
351 351 raw_diff, chunks, _stats = self._parse_lines(diff)
352 352 stats['binary'] = False
353 353 stats['added'] = _stats[0]
354 354 stats['deleted'] = _stats[1]
355 355 # explicit mark that it's a modified file
356 356 if op == OPS.MOD:
357 357 stats['ops'][MOD_FILENODE] = 'modified file'
358 358 exceeds_limit = len(raw_diff) > self.file_limit
359 359
360 360 # changed from _escaper function so we validate size of
361 361 # each file instead of the whole diff
362 362 # diff will hide big files but still show small ones
363 363 # from my tests, big files are fairly safe to be parsed
364 364 # but the browser is the bottleneck
365 365 if not self.show_full_diff and exceeds_limit:
366 366 raise DiffLimitExceeded('File Limit Exceeded')
367 367
368 368 except DiffLimitExceeded:
369 369 diff_container = lambda _diff: \
370 370 LimitedDiffContainer(
371 371 self.diff_limit, self.cur_diff_size, _diff)
372 372
373 373 exceeds_limit = len(raw_diff) > self.file_limit
374 374 limited_diff = True
375 375 chunks = []
376 376
377 377 else: # GIT format binary patch, or possibly empty diff
378 378 if head['bin_patch']:
379 379 # we have operation already extracted, but we mark simply
380 380 # it's a diff we wont show for binary files
381 381 stats['ops'][BIN_FILENODE] = 'binary diff hidden'
382 382 chunks = []
383 383
384 384 if chunks and not self.show_full_diff and op == OPS.DEL:
385 385 # if not full diff mode show deleted file contents
386 386 # TODO: anderson: if the view is not too big, there is no way
387 387 # to see the content of the file
388 388 chunks = []
389 389
390 390 chunks.insert(0, [{
391 391 'old_lineno': '',
392 392 'new_lineno': '',
393 393 'action': Action.CONTEXT,
394 394 'line': msg,
395 395 } for _op, msg in stats['ops'].iteritems()
396 396 if _op not in [MOD_FILENODE]])
397 397
398 398 _files.append({
399 399 'filename': safe_unicode(head['b_path']),
400 400 'old_revision': head['a_blob_id'],
401 401 'new_revision': head['b_blob_id'],
402 402 'chunks': chunks,
403 403 'raw_diff': safe_unicode(raw_diff),
404 404 'operation': op,
405 405 'stats': stats,
406 406 'exceeds_limit': exceeds_limit,
407 407 'is_limited_diff': limited_diff,
408 408 })
409 409
410 410 sorter = lambda info: {OPS.ADD: 0, OPS.MOD: 1,
411 411 OPS.DEL: 2}.get(info['operation'])
412 412
413 413 if not inline_diff:
414 414 return diff_container(sorted(_files, key=sorter))
415 415
416 416 # highlight inline changes
417 417 for diff_data in _files:
418 418 for chunk in diff_data['chunks']:
419 419 lineiter = iter(chunk)
420 420 try:
421 421 while 1:
422 422 line = lineiter.next()
423 423 if line['action'] not in (
424 424 Action.UNMODIFIED, Action.CONTEXT):
425 425 nextline = lineiter.next()
426 426 if nextline['action'] in ['unmod', 'context'] or \
427 427 nextline['action'] == line['action']:
428 428 continue
429 429 self.differ(line, nextline)
430 430 except StopIteration:
431 431 pass
432 432
433 433 return diff_container(sorted(_files, key=sorter))
434 434
435 435 def _check_large_diff(self):
436 436 log.debug('Diff exceeds current diff_limit of %s', self.diff_limit)
437 437 if not self.show_full_diff and (self.cur_diff_size > self.diff_limit):
438 438 raise DiffLimitExceeded('Diff Limit `%s` Exceeded', self.diff_limit)
439 439
440 440 # FIXME: NEWDIFFS: dan: this replaces _parse_gitdiff
441 441 def _new_parse_gitdiff(self, inline_diff=True):
442 442 _files = []
443 443
444 444 # this can be overriden later to a LimitedDiffContainer type
445 445 diff_container = lambda arg: arg
446 446
447 447 for chunk in self._diff.chunks():
448 448 head = chunk.header
449 449 log.debug('parsing diff %r', head)
450 450
451 451 raw_diff = chunk.raw
452 452 limited_diff = False
453 453 exceeds_limit = False
454 454
455 455 op = None
456 456 stats = {
457 457 'added': 0,
458 458 'deleted': 0,
459 459 'binary': False,
460 460 'old_mode': None,
461 461 'new_mode': None,
462 462 'ops': {},
463 463 }
464 464 if head['old_mode']:
465 465 stats['old_mode'] = head['old_mode']
466 466 if head['new_mode']:
467 467 stats['new_mode'] = head['new_mode']
468 468 if head['b_mode']:
469 469 stats['new_mode'] = head['b_mode']
470 470
471 471 # delete file
472 472 if head['deleted_file_mode']:
473 473 op = OPS.DEL
474 474 stats['binary'] = True
475 475 stats['ops'][DEL_FILENODE] = 'deleted file'
476 476
477 477 # new file
478 478 elif head['new_file_mode']:
479 479 op = OPS.ADD
480 480 stats['binary'] = True
481 481 stats['old_mode'] = None
482 482 stats['new_mode'] = head['new_file_mode']
483 483 stats['ops'][NEW_FILENODE] = 'new file %s' % head['new_file_mode']
484 484
485 485 # modify operation, can be copy, rename or chmod
486 486 else:
487 487 # CHMOD
488 488 if head['new_mode'] and head['old_mode']:
489 489 op = OPS.MOD
490 490 stats['binary'] = True
491 491 stats['ops'][CHMOD_FILENODE] = (
492 492 'modified file chmod %s => %s' % (
493 493 head['old_mode'], head['new_mode']))
494 494
495 495 # RENAME
496 496 if head['rename_from'] != head['rename_to']:
497 497 op = OPS.MOD
498 498 stats['binary'] = True
499 499 stats['renamed'] = (head['rename_from'], head['rename_to'])
500 500 stats['ops'][RENAMED_FILENODE] = (
501 501 'file renamed from %s to %s' % (
502 502 head['rename_from'], head['rename_to']))
503 503 # COPY
504 504 if head.get('copy_from') and head.get('copy_to'):
505 505 op = OPS.MOD
506 506 stats['binary'] = True
507 507 stats['copied'] = (head['copy_from'], head['copy_to'])
508 508 stats['ops'][COPIED_FILENODE] = (
509 509 'file copied from %s to %s' % (
510 510 head['copy_from'], head['copy_to']))
511 511
512 512 # If our new parsed headers didn't match anything fallback to
513 513 # old style detection
514 514 if op is None:
515 515 if not head['a_file'] and head['b_file']:
516 516 op = OPS.ADD
517 517 stats['binary'] = True
518 518 stats['new_file'] = True
519 519 stats['ops'][NEW_FILENODE] = 'new file'
520 520
521 521 elif head['a_file'] and not head['b_file']:
522 522 op = OPS.DEL
523 523 stats['binary'] = True
524 524 stats['ops'][DEL_FILENODE] = 'deleted file'
525 525
526 526 # it's not ADD not DELETE
527 527 if op is None:
528 528 op = OPS.MOD
529 529 stats['binary'] = True
530 530 stats['ops'][MOD_FILENODE] = 'modified file'
531 531
532 532 # a real non-binary diff
533 533 if head['a_file'] or head['b_file']:
534 534 # simulate splitlines, so we keep the line end part
535 535 diff = self.diff_splitter(chunk.diff)
536 536
537 537 # append each file to the diff size
538 538 raw_chunk_size = len(raw_diff)
539 539
540 540 exceeds_limit = raw_chunk_size > self.file_limit
541 541 self.cur_diff_size += raw_chunk_size
542 542
543 543 try:
544 544 # Check each file instead of the whole diff.
545 545 # Diff will hide big files but still show small ones.
546 546 # From the tests big files are fairly safe to be parsed
547 547 # but the browser is the bottleneck.
548 548 if not self.show_full_diff and exceeds_limit:
549 549 log.debug('File `%s` exceeds current file_limit of %s',
550 550 safe_unicode(head['b_path']), self.file_limit)
551 551 raise DiffLimitExceeded(
552 552 'File Limit %s Exceeded', self.file_limit)
553 553
554 554 self._check_large_diff()
555 555
556 556 raw_diff, chunks, _stats = self._new_parse_lines(diff)
557 557 stats['binary'] = False
558 558 stats['added'] = _stats[0]
559 559 stats['deleted'] = _stats[1]
560 560 # explicit mark that it's a modified file
561 561 if op == OPS.MOD:
562 562 stats['ops'][MOD_FILENODE] = 'modified file'
563 563
564 564 except DiffLimitExceeded:
565 565 diff_container = lambda _diff: \
566 566 LimitedDiffContainer(
567 567 self.diff_limit, self.cur_diff_size, _diff)
568 568
569 569 limited_diff = True
570 570 chunks = []
571 571
572 572 else: # GIT format binary patch, or possibly empty diff
573 573 if head['bin_patch']:
574 574 # we have operation already extracted, but we mark simply
575 575 # it's a diff we wont show for binary files
576 576 stats['ops'][BIN_FILENODE] = 'binary diff hidden'
577 577 chunks = []
578 578
579 579 # Hide content of deleted node by setting empty chunks
580 580 if chunks and not self.show_full_diff and op == OPS.DEL:
581 581 # if not full diff mode show deleted file contents
582 582 # TODO: anderson: if the view is not too big, there is no way
583 583 # to see the content of the file
584 584 chunks = []
585 585
586 586 chunks.insert(
587 587 0, [{'old_lineno': '',
588 588 'new_lineno': '',
589 589 'action': Action.CONTEXT,
590 590 'line': msg,
591 591 } for _op, msg in stats['ops'].iteritems()
592 592 if _op not in [MOD_FILENODE]])
593 593
594 594 original_filename = safe_unicode(head['a_path'])
595 595 _files.append({
596 596 'original_filename': original_filename,
597 597 'filename': safe_unicode(head['b_path']),
598 598 'old_revision': head['a_blob_id'],
599 599 'new_revision': head['b_blob_id'],
600 600 'chunks': chunks,
601 601 'raw_diff': safe_unicode(raw_diff),
602 602 'operation': op,
603 603 'stats': stats,
604 604 'exceeds_limit': exceeds_limit,
605 605 'is_limited_diff': limited_diff,
606 606 })
607 607
608 608 sorter = lambda info: {OPS.ADD: 0, OPS.MOD: 1,
609 609 OPS.DEL: 2}.get(info['operation'])
610 610
611 611 return diff_container(sorted(_files, key=sorter))
612 612
613 613 # FIXME: NEWDIFFS: dan: this gets replaced by _new_parse_lines
614 614 def _parse_lines(self, diff_iter):
615 615 """
616 616 Parse the diff an return data for the template.
617 617 """
618 618
619 619 stats = [0, 0]
620 620 chunks = []
621 621 raw_diff = []
622 622
623 623 try:
624 624 line = diff_iter.next()
625 625
626 626 while line:
627 627 raw_diff.append(line)
628 628 lines = []
629 629 chunks.append(lines)
630 630
631 631 match = self._chunk_re.match(line)
632 632
633 633 if not match:
634 634 break
635 635
636 636 gr = match.groups()
637 637 (old_line, old_end,
638 638 new_line, new_end) = [int(x or 1) for x in gr[:-1]]
639 639 old_line -= 1
640 640 new_line -= 1
641 641
642 642 context = len(gr) == 5
643 643 old_end += old_line
644 644 new_end += new_line
645 645
646 646 if context:
647 647 # skip context only if it's first line
648 648 if int(gr[0]) > 1:
649 649 lines.append({
650 650 'old_lineno': '...',
651 651 'new_lineno': '...',
652 652 'action': Action.CONTEXT,
653 653 'line': line,
654 654 })
655 655
656 656 line = diff_iter.next()
657 657
658 658 while old_line < old_end or new_line < new_end:
659 659 command = ' '
660 660 if line:
661 661 command = line[0]
662 662
663 663 affects_old = affects_new = False
664 664
665 665 # ignore those if we don't expect them
666 666 if command in '#@':
667 667 continue
668 668 elif command == '+':
669 669 affects_new = True
670 670 action = Action.ADD
671 671 stats[0] += 1
672 672 elif command == '-':
673 673 affects_old = True
674 674 action = Action.DELETE
675 675 stats[1] += 1
676 676 else:
677 677 affects_old = affects_new = True
678 678 action = Action.UNMODIFIED
679 679
680 680 if not self._newline_marker.match(line):
681 681 old_line += affects_old
682 682 new_line += affects_new
683 683 lines.append({
684 684 'old_lineno': affects_old and old_line or '',
685 685 'new_lineno': affects_new and new_line or '',
686 686 'action': action,
687 687 'line': self._clean_line(line, command)
688 688 })
689 689 raw_diff.append(line)
690 690
691 691 line = diff_iter.next()
692 692
693 693 if self._newline_marker.match(line):
694 694 # we need to append to lines, since this is not
695 695 # counted in the line specs of diff
696 696 lines.append({
697 697 'old_lineno': '...',
698 698 'new_lineno': '...',
699 699 'action': Action.CONTEXT,
700 700 'line': self._clean_line(line, command)
701 701 })
702 702
703 703 except StopIteration:
704 704 pass
705 705 return ''.join(raw_diff), chunks, stats
706 706
707 707 # FIXME: NEWDIFFS: dan: this replaces _parse_lines
708 708 def _new_parse_lines(self, diff_iter):
709 709 """
710 710 Parse the diff an return data for the template.
711 711 """
712 712
713 713 stats = [0, 0]
714 714 chunks = []
715 715 raw_diff = []
716 716
717 717 try:
718 718 line = diff_iter.next()
719 719
720 720 while line:
721 721 raw_diff.append(line)
722 722 # match header e.g @@ -0,0 +1 @@\n'
723 723 match = self._chunk_re.match(line)
724 724
725 725 if not match:
726 726 break
727 727
728 728 gr = match.groups()
729 729 (old_line, old_end,
730 730 new_line, new_end) = [int(x or 1) for x in gr[:-1]]
731 731
732 732 lines = []
733 733 hunk = {
734 734 'section_header': gr[-1],
735 735 'source_start': old_line,
736 736 'source_length': old_end,
737 737 'target_start': new_line,
738 738 'target_length': new_end,
739 739 'lines': lines,
740 740 }
741 741 chunks.append(hunk)
742 742
743 743 old_line -= 1
744 744 new_line -= 1
745 745
746 746 context = len(gr) == 5
747 747 old_end += old_line
748 748 new_end += new_line
749 749
750 750 line = diff_iter.next()
751 751
752 752 while old_line < old_end or new_line < new_end:
753 753 command = ' '
754 754 if line:
755 755 command = line[0]
756 756
757 757 affects_old = affects_new = False
758 758
759 759 # ignore those if we don't expect them
760 760 if command in '#@':
761 761 continue
762 762 elif command == '+':
763 763 affects_new = True
764 764 action = Action.ADD
765 765 stats[0] += 1
766 766 elif command == '-':
767 767 affects_old = True
768 768 action = Action.DELETE
769 769 stats[1] += 1
770 770 else:
771 771 affects_old = affects_new = True
772 772 action = Action.UNMODIFIED
773 773
774 774 if not self._newline_marker.match(line):
775 775 old_line += affects_old
776 776 new_line += affects_new
777 777 lines.append({
778 778 'old_lineno': affects_old and old_line or '',
779 779 'new_lineno': affects_new and new_line or '',
780 780 'action': action,
781 781 'line': self._clean_line(line, command)
782 782 })
783 783 raw_diff.append(line)
784 784
785 785 line = diff_iter.next()
786 786
787 787 if self._newline_marker.match(line):
788 788 # we need to append to lines, since this is not
789 789 # counted in the line specs of diff
790 790 if affects_old:
791 791 action = Action.OLD_NO_NL
792 792 elif affects_new:
793 793 action = Action.NEW_NO_NL
794 794 else:
795 795 raise Exception('invalid context for no newline')
796 796
797 797 lines.append({
798 798 'old_lineno': None,
799 799 'new_lineno': None,
800 800 'action': action,
801 801 'line': self._clean_line(line, command)
802 802 })
803 803
804 804 except StopIteration:
805 805 pass
806 806
807 807 return ''.join(raw_diff), chunks, stats
808 808
809 809 def _safe_id(self, idstring):
810 810 """Make a string safe for including in an id attribute.
811 811
812 812 The HTML spec says that id attributes 'must begin with
813 813 a letter ([A-Za-z]) and may be followed by any number
814 814 of letters, digits ([0-9]), hyphens ("-"), underscores
815 815 ("_"), colons (":"), and periods (".")'. These regexps
816 816 are slightly over-zealous, in that they remove colons
817 817 and periods unnecessarily.
818 818
819 819 Whitespace is transformed into underscores, and then
820 820 anything which is not a hyphen or a character that
821 821 matches \w (alphanumerics and underscore) is removed.
822 822
823 823 """
824 824 # Transform all whitespace to underscore
825 825 idstring = re.sub(r'\s', "_", '%s' % idstring)
826 826 # Remove everything that is not a hyphen or a member of \w
827 827 idstring = re.sub(r'(?!-)\W', "", idstring).lower()
828 828 return idstring
829 829
830 830 @classmethod
831 831 def diff_splitter(cls, string):
832 832 """
833 833 Diff split that emulates .splitlines() but works only on \n
834 834 """
835 835 if not string:
836 836 return
837 837 elif string == '\n':
838 838 yield u'\n'
839 839 else:
840 840
841 841 has_newline = string.endswith('\n')
842 842 elements = string.split('\n')
843 843 if has_newline:
844 844 # skip last element as it's empty string from newlines
845 845 elements = elements[:-1]
846 846
847 847 len_elements = len(elements)
848 848
849 849 for cnt, line in enumerate(elements, start=1):
850 850 last_line = cnt == len_elements
851 851 if last_line and not has_newline:
852 852 yield safe_unicode(line)
853 853 else:
854 854 yield safe_unicode(line) + '\n'
855 855
856 856 def prepare(self, inline_diff=True):
857 857 """
858 858 Prepare the passed udiff for HTML rendering.
859 859
860 860 :return: A list of dicts with diff information.
861 861 """
862 862 parsed = self._parser(inline_diff=inline_diff)
863 863 self.parsed = True
864 864 self.parsed_diff = parsed
865 865 return parsed
866 866
867 867 def as_raw(self, diff_lines=None):
868 868 """
869 869 Returns raw diff as a byte string
870 870 """
871 871 return self._diff.raw
872 872
873 873 def as_html(self, table_class='code-difftable', line_class='line',
874 874 old_lineno_class='lineno old', new_lineno_class='lineno new',
875 875 code_class='code', enable_comments=False, parsed_lines=None):
876 876 """
877 877 Return given diff as html table with customized css classes
878 878 """
879 879 # TODO(marcink): not sure how to pass in translator
880 880 # here in an efficient way, leave the _ for proper gettext extraction
881 881 _ = lambda s: s
882 882
883 883 def _link_to_if(condition, label, url):
884 884 """
885 885 Generates a link if condition is meet or just the label if not.
886 886 """
887 887
888 888 if condition:
889 889 return '''<a href="%(url)s" class="tooltip"
890 890 title="%(title)s">%(label)s</a>''' % {
891 891 'title': _('Click to select line'),
892 892 'url': url,
893 893 'label': label
894 894 }
895 895 else:
896 896 return label
897 897 if not self.parsed:
898 898 self.prepare()
899 899
900 900 diff_lines = self.parsed_diff
901 901 if parsed_lines:
902 902 diff_lines = parsed_lines
903 903
904 904 _html_empty = True
905 905 _html = []
906 906 _html.append('''<table class="%(table_class)s">\n''' % {
907 907 'table_class': table_class
908 908 })
909 909
910 910 for diff in diff_lines:
911 911 for line in diff['chunks']:
912 912 _html_empty = False
913 913 for change in line:
914 914 _html.append('''<tr class="%(lc)s %(action)s">\n''' % {
915 915 'lc': line_class,
916 916 'action': change['action']
917 917 })
918 918 anchor_old_id = ''
919 919 anchor_new_id = ''
920 920 anchor_old = "%(filename)s_o%(oldline_no)s" % {
921 921 'filename': self._safe_id(diff['filename']),
922 922 'oldline_no': change['old_lineno']
923 923 }
924 924 anchor_new = "%(filename)s_n%(oldline_no)s" % {
925 925 'filename': self._safe_id(diff['filename']),
926 926 'oldline_no': change['new_lineno']
927 927 }
928 928 cond_old = (change['old_lineno'] != '...' and
929 929 change['old_lineno'])
930 930 cond_new = (change['new_lineno'] != '...' and
931 931 change['new_lineno'])
932 932 if cond_old:
933 933 anchor_old_id = 'id="%s"' % anchor_old
934 934 if cond_new:
935 935 anchor_new_id = 'id="%s"' % anchor_new
936 936
937 937 if change['action'] != Action.CONTEXT:
938 938 anchor_link = True
939 939 else:
940 940 anchor_link = False
941 941
942 942 ###########################################################
943 943 # COMMENT ICONS
944 944 ###########################################################
945 945 _html.append('''\t<td class="add-comment-line"><span class="add-comment-content">''')
946 946
947 947 if enable_comments and change['action'] != Action.CONTEXT:
948 948 _html.append('''<a href="#"><span class="icon-comment-add"></span></a>''')
949 949
950 950 _html.append('''</span></td><td class="comment-toggle tooltip" title="Toggle Comment Thread"><i class="icon-comment"></i></td>\n''')
951 951
952 952 ###########################################################
953 953 # OLD LINE NUMBER
954 954 ###########################################################
955 955 _html.append('''\t<td %(a_id)s class="%(olc)s">''' % {
956 956 'a_id': anchor_old_id,
957 957 'olc': old_lineno_class
958 958 })
959 959
960 960 _html.append('''%(link)s''' % {
961 961 'link': _link_to_if(anchor_link, change['old_lineno'],
962 962 '#%s' % anchor_old)
963 963 })
964 964 _html.append('''</td>\n''')
965 965 ###########################################################
966 966 # NEW LINE NUMBER
967 967 ###########################################################
968 968
969 969 _html.append('''\t<td %(a_id)s class="%(nlc)s">''' % {
970 970 'a_id': anchor_new_id,
971 971 'nlc': new_lineno_class
972 972 })
973 973
974 974 _html.append('''%(link)s''' % {
975 975 'link': _link_to_if(anchor_link, change['new_lineno'],
976 976 '#%s' % anchor_new)
977 977 })
978 978 _html.append('''</td>\n''')
979 979 ###########################################################
980 980 # CODE
981 981 ###########################################################
982 982 code_classes = [code_class]
983 983 if (not enable_comments or
984 984 change['action'] == Action.CONTEXT):
985 985 code_classes.append('no-comment')
986 986 _html.append('\t<td class="%s">' % ' '.join(code_classes))
987 987 _html.append('''\n\t\t<pre>%(code)s</pre>\n''' % {
988 988 'code': change['line']
989 989 })
990 990
991 991 _html.append('''\t</td>''')
992 992 _html.append('''\n</tr>\n''')
993 993 _html.append('''</table>''')
994 994 if _html_empty:
995 995 return None
996 996 return ''.join(_html)
997 997
998 998 def stat(self):
999 999 """
1000 1000 Returns tuple of added, and removed lines for this instance
1001 1001 """
1002 1002 return self.adds, self.removes
1003 1003
1004 1004 def get_context_of_line(
1005 1005 self, path, diff_line=None, context_before=3, context_after=3):
1006 1006 """
1007 1007 Returns the context lines for the specified diff line.
1008 1008
1009 1009 :type diff_line: :class:`DiffLineNumber`
1010 1010 """
1011 1011 assert self.parsed, "DiffProcessor is not initialized."
1012 1012
1013 1013 if None not in diff_line:
1014 1014 raise ValueError(
1015 1015 "Cannot specify both line numbers: {}".format(diff_line))
1016 1016
1017 1017 file_diff = self._get_file_diff(path)
1018 1018 chunk, idx = self._find_chunk_line_index(file_diff, diff_line)
1019 1019
1020 1020 first_line_to_include = max(idx - context_before, 0)
1021 1021 first_line_after_context = idx + context_after + 1
1022 1022 context_lines = chunk[first_line_to_include:first_line_after_context]
1023 1023
1024 1024 line_contents = [
1025 1025 _context_line(line) for line in context_lines
1026 1026 if _is_diff_content(line)]
1027 1027 # TODO: johbo: Interim fixup, the diff chunks drop the final newline.
1028 1028 # Once they are fixed, we can drop this line here.
1029 1029 if line_contents:
1030 1030 line_contents[-1] = (
1031 1031 line_contents[-1][0], line_contents[-1][1].rstrip('\n') + '\n')
1032 1032 return line_contents
1033 1033
1034 1034 def find_context(self, path, context, offset=0):
1035 1035 """
1036 1036 Finds the given `context` inside of the diff.
1037 1037
1038 1038 Use the parameter `offset` to specify which offset the target line has
1039 1039 inside of the given `context`. This way the correct diff line will be
1040 1040 returned.
1041 1041
1042 1042 :param offset: Shall be used to specify the offset of the main line
1043 1043 within the given `context`.
1044 1044 """
1045 1045 if offset < 0 or offset >= len(context):
1046 1046 raise ValueError(
1047 1047 "Only positive values up to the length of the context "
1048 1048 "minus one are allowed.")
1049 1049
1050 1050 matches = []
1051 1051 file_diff = self._get_file_diff(path)
1052 1052
1053 1053 for chunk in file_diff['chunks']:
1054 1054 context_iter = iter(context)
1055 1055 for line_idx, line in enumerate(chunk):
1056 1056 try:
1057 1057 if _context_line(line) == context_iter.next():
1058 1058 continue
1059 1059 except StopIteration:
1060 1060 matches.append((line_idx, chunk))
1061 1061 context_iter = iter(context)
1062 1062
1063 1063 # Increment position and triger StopIteration
1064 1064 # if we had a match at the end
1065 1065 line_idx += 1
1066 1066 try:
1067 1067 context_iter.next()
1068 1068 except StopIteration:
1069 1069 matches.append((line_idx, chunk))
1070 1070
1071 1071 effective_offset = len(context) - offset
1072 1072 found_at_diff_lines = [
1073 1073 _line_to_diff_line_number(chunk[idx - effective_offset])
1074 1074 for idx, chunk in matches]
1075 1075
1076 1076 return found_at_diff_lines
1077 1077
1078 1078 def _get_file_diff(self, path):
1079 1079 for file_diff in self.parsed_diff:
1080 1080 if file_diff['filename'] == path:
1081 1081 break
1082 1082 else:
1083 1083 raise FileNotInDiffException("File {} not in diff".format(path))
1084 1084 return file_diff
1085 1085
1086 1086 def _find_chunk_line_index(self, file_diff, diff_line):
1087 1087 for chunk in file_diff['chunks']:
1088 1088 for idx, line in enumerate(chunk):
1089 1089 if line['old_lineno'] == diff_line.old:
1090 1090 return chunk, idx
1091 1091 if line['new_lineno'] == diff_line.new:
1092 1092 return chunk, idx
1093 1093 raise LineNotInDiffException(
1094 1094 "The line {} is not part of the diff.".format(diff_line))
1095 1095
1096 1096
1097 1097 def _is_diff_content(line):
1098 1098 return line['action'] in (
1099 1099 Action.UNMODIFIED, Action.ADD, Action.DELETE)
1100 1100
1101 1101
1102 1102 def _context_line(line):
1103 1103 return (line['action'], line['line'])
1104 1104
1105 1105
1106 1106 DiffLineNumber = collections.namedtuple('DiffLineNumber', ['old', 'new'])
1107 1107
1108 1108
1109 1109 def _line_to_diff_line_number(line):
1110 1110 new_line_no = line['new_lineno'] or None
1111 1111 old_line_no = line['old_lineno'] or None
1112 1112 return DiffLineNumber(old=old_line_no, new=new_line_no)
1113 1113
1114 1114
1115 1115 class FileNotInDiffException(Exception):
1116 1116 """
1117 1117 Raised when the context for a missing file is requested.
1118 1118
1119 1119 If you request the context for a line in a file which is not part of the
1120 1120 given diff, then this exception is raised.
1121 1121 """
1122 1122
1123 1123
1124 1124 class LineNotInDiffException(Exception):
1125 1125 """
1126 1126 Raised when the context for a missing line is requested.
1127 1127
1128 1128 If you request the context for a line in a file and this line is not
1129 1129 part of the given diff, then this exception is raised.
1130 1130 """
1131 1131
1132 1132
1133 1133 class DiffLimitExceeded(Exception):
1134 1134 pass
1135 1135
1136 1136
1137 1137 # NOTE(marcink): if diffs.mako change, probably this
1138 1138 # needs a bump to next version
1139 CURRENT_DIFF_VERSION = 'v2'
1139 CURRENT_DIFF_VERSION = 'v3'
1140 1140
1141 1141
1142 1142 def _cleanup_cache_file(cached_diff_file):
1143 1143 # cleanup file to not store it "damaged"
1144 1144 try:
1145 1145 os.remove(cached_diff_file)
1146 1146 except Exception:
1147 1147 log.exception('Failed to cleanup path %s', cached_diff_file)
1148 1148
1149 1149
1150 1150 def cache_diff(cached_diff_file, diff, commits):
1151 1151
1152 1152 struct = {
1153 1153 'version': CURRENT_DIFF_VERSION,
1154 1154 'diff': diff,
1155 1155 'commits': commits
1156 1156 }
1157 1157
1158 1158 try:
1159 1159 with bz2.BZ2File(cached_diff_file, 'wb') as f:
1160 1160 pickle.dump(struct, f)
1161 1161 log.debug('Saved diff cache under %s', cached_diff_file)
1162 1162 except Exception:
1163 1163 log.warn('Failed to save cache', exc_info=True)
1164 1164 _cleanup_cache_file(cached_diff_file)
1165 1165
1166 1166
1167 1167 def load_cached_diff(cached_diff_file):
1168 1168
1169 1169 default_struct = {
1170 1170 'version': CURRENT_DIFF_VERSION,
1171 1171 'diff': None,
1172 1172 'commits': None
1173 1173 }
1174 1174
1175 1175 has_cache = os.path.isfile(cached_diff_file)
1176 1176 if not has_cache:
1177 1177 return default_struct
1178 1178
1179 1179 data = None
1180 1180 try:
1181 1181 with bz2.BZ2File(cached_diff_file, 'rb') as f:
1182 1182 data = pickle.load(f)
1183 1183 log.debug('Loaded diff cache from %s', cached_diff_file)
1184 1184 except Exception:
1185 1185 log.warn('Failed to read diff cache file', exc_info=True)
1186 1186
1187 1187 if not data:
1188 1188 data = default_struct
1189 1189
1190 1190 if not isinstance(data, dict):
1191 1191 # old version of data ?
1192 1192 data = default_struct
1193 1193
1194 1194 # check version
1195 1195 if data.get('version') != CURRENT_DIFF_VERSION:
1196 1196 # purge cache
1197 1197 _cleanup_cache_file(cached_diff_file)
1198 1198 return default_struct
1199 1199
1200 1200 return data
1201 1201
1202 1202
1203 1203 def generate_diff_cache_key(*args):
1204 1204 """
1205 1205 Helper to generate a cache key using arguments
1206 1206 """
1207 1207 def arg_mapper(input_param):
1208 1208 input_param = safe_str(input_param)
1209 1209 # we cannot allow '/' in arguments since it would allow
1210 1210 # subdirectory usage
1211 1211 input_param.replace('/', '_')
1212 1212 return input_param or None # prevent empty string arguments
1213 1213
1214 1214 return '_'.join([
1215 1215 '{}' for i in range(len(args))]).format(*map(arg_mapper, args))
1216 1216
1217 1217
1218 1218 def diff_cache_exist(cache_storage, *args):
1219 1219 """
1220 1220 Based on all generated arguments check and return a cache path
1221 1221 """
1222 1222 cache_key = generate_diff_cache_key(*args)
1223 1223 cache_file_path = os.path.join(cache_storage, cache_key)
1224 1224 # prevent path traversal attacks using some param that have e.g '../../'
1225 1225 if not os.path.abspath(cache_file_path).startswith(cache_storage):
1226 1226 raise ValueError('Final path must be within {}'.format(cache_storage))
1227 1227
1228 1228 return cache_file_path
@@ -1,1172 +1,1221 b''
1 1 // Default styles
2 2
3 3 .diff-collapse {
4 4 margin: @padding 0;
5 5 text-align: right;
6 6 }
7 7
8 8 .diff-container {
9 9 margin-bottom: @space;
10 10
11 11 .diffblock {
12 12 margin-bottom: @space;
13 13 }
14 14
15 15 &.hidden {
16 16 display: none;
17 17 overflow: hidden;
18 18 }
19 19 }
20 20
21 21
22 22 div.diffblock .sidebyside {
23 23 background: #ffffff;
24 24 }
25 25
26 26 div.diffblock {
27 27 overflow-x: auto;
28 28 overflow-y: hidden;
29 29 clear: both;
30 30 padding: 0px;
31 31 background: @grey6;
32 32 border: @border-thickness solid @grey5;
33 33 -webkit-border-radius: @border-radius @border-radius 0px 0px;
34 34 border-radius: @border-radius @border-radius 0px 0px;
35 35
36 36
37 37 .comments-number {
38 38 float: right;
39 39 }
40 40
41 41 // BEGIN CODE-HEADER STYLES
42 42
43 43 .code-header {
44 44 background: @grey6;
45 45 padding: 10px 0 10px 0;
46 46 height: auto;
47 47 width: 100%;
48 48
49 49 .hash {
50 50 float: left;
51 51 padding: 2px 0 0 2px;
52 52 }
53 53
54 54 .date {
55 55 float: left;
56 56 text-transform: uppercase;
57 57 padding: 4px 0px 0px 2px;
58 58 }
59 59
60 60 div {
61 61 margin-left: 4px;
62 62 }
63 63
64 64 div.compare_header {
65 65 min-height: 40px;
66 66 margin: 0;
67 67 padding: 0 @padding;
68 68
69 69 .drop-menu {
70 70 float:left;
71 71 display: block;
72 72 margin:0 0 @padding 0;
73 73 }
74 74
75 75 .compare-label {
76 76 float: left;
77 77 clear: both;
78 78 display: inline-block;
79 79 min-width: 5em;
80 80 margin: 0;
81 81 padding: @button-padding @button-padding @button-padding 0;
82 82 font-family: @text-semibold;
83 83 }
84 84
85 85 .compare-buttons {
86 86 float: left;
87 87 margin: 0;
88 88 padding: 0 0 @padding;
89 89
90 90 .btn {
91 91 margin: 0 @padding 0 0;
92 92 }
93 93 }
94 94 }
95 95
96 96 }
97 97
98 98 .parents {
99 99 float: left;
100 100 width: 100px;
101 101 font-weight: 400;
102 102 vertical-align: middle;
103 103 padding: 0px 2px 0px 2px;
104 104 background-color: @grey6;
105 105
106 106 #parent_link {
107 107 margin: 00px 2px;
108 108
109 109 &.double {
110 110 margin: 0px 2px;
111 111 }
112 112
113 113 &.disabled{
114 114 margin-right: @padding;
115 115 }
116 116 }
117 117 }
118 118
119 119 .children {
120 120 float: right;
121 121 width: 100px;
122 122 font-weight: 400;
123 123 vertical-align: middle;
124 124 text-align: right;
125 125 padding: 0px 2px 0px 2px;
126 126 background-color: @grey6;
127 127
128 128 #child_link {
129 129 margin: 0px 2px;
130 130
131 131 &.double {
132 132 margin: 0px 2px;
133 133 }
134 134
135 135 &.disabled{
136 136 margin-right: @padding;
137 137 }
138 138 }
139 139 }
140 140
141 141 .changeset_header {
142 142 height: 16px;
143 143
144 144 & > div{
145 145 margin-right: @padding;
146 146 }
147 147 }
148 148
149 149 .changeset_file {
150 150 text-align: left;
151 151 float: left;
152 152 padding: 0;
153 153
154 154 a{
155 155 display: inline-block;
156 156 margin-right: 0.5em;
157 157 }
158 158
159 159 #selected_mode{
160 160 margin-left: 0;
161 161 }
162 162 }
163 163
164 164 .diff-menu-wrapper {
165 165 float: left;
166 166 }
167 167
168 168 .diff-menu {
169 169 position: absolute;
170 170 background: none repeat scroll 0 0 #FFFFFF;
171 171 border-color: #003367 @grey3 @grey3;
172 172 border-right: 1px solid @grey3;
173 173 border-style: solid solid solid;
174 174 border-width: @border-thickness;
175 175 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
176 176 margin-top: 5px;
177 177 margin-left: 1px;
178 178 }
179 179
180 180 .diff-actions, .editor-actions {
181 181 float: left;
182 182
183 183 input{
184 184 margin: 0 0.5em 0 0;
185 185 }
186 186 }
187 187
188 188 // END CODE-HEADER STYLES
189 189
190 190 // BEGIN CODE-BODY STYLES
191 191
192 192 .code-body {
193 193 padding: 0;
194 194 background-color: #ffffff;
195 195 position: relative;
196 196 max-width: none;
197 197 box-sizing: border-box;
198 198 // TODO: johbo: Parent has overflow: auto, this forces the child here
199 199 // to have the intended size and to scroll. Should be simplified.
200 200 width: 100%;
201 201 overflow-x: auto;
202 202 }
203 203
204 204 pre.raw {
205 205 background: white;
206 206 color: @grey1;
207 207 }
208 208 // END CODE-BODY STYLES
209 209
210 210 }
211 211
212 212
213 213 table.code-difftable {
214 214 border-collapse: collapse;
215 215 width: 99%;
216 216 border-radius: 0px !important;
217 217
218 218 td {
219 219 padding: 0 !important;
220 220 background: none !important;
221 221 border: 0 !important;
222 222 }
223 223
224 224 .context {
225 225 background: none repeat scroll 0 0 #DDE7EF;
226 226 }
227 227
228 228 .add {
229 229 background: none repeat scroll 0 0 #DDFFDD;
230 230
231 231 ins {
232 232 background: none repeat scroll 0 0 #AAFFAA;
233 233 text-decoration: none;
234 234 }
235 235 }
236 236
237 237 .del {
238 238 background: none repeat scroll 0 0 #FFDDDD;
239 239
240 240 del {
241 241 background: none repeat scroll 0 0 #FFAAAA;
242 242 text-decoration: none;
243 243 }
244 244 }
245 245
246 246 /** LINE NUMBERS **/
247 247 .lineno {
248 248 padding-left: 2px !important;
249 249 padding-right: 2px;
250 250 text-align: right;
251 251 width: 32px;
252 252 -moz-user-select: none;
253 253 -webkit-user-select: none;
254 254 border-right: @border-thickness solid @grey5 !important;
255 255 border-left: 0px solid #CCC !important;
256 256 border-top: 0px solid #CCC !important;
257 257 border-bottom: none !important;
258 258
259 259 a {
260 260 &:extend(pre);
261 261 text-align: right;
262 262 padding-right: 2px;
263 263 cursor: pointer;
264 264 display: block;
265 265 width: 32px;
266 266 }
267 267 }
268 268
269 269 .context {
270 270 cursor: auto;
271 271 &:extend(pre);
272 272 }
273 273
274 274 .lineno-inline {
275 275 background: none repeat scroll 0 0 #FFF !important;
276 276 padding-left: 2px;
277 277 padding-right: 2px;
278 278 text-align: right;
279 279 width: 30px;
280 280 -moz-user-select: none;
281 281 -webkit-user-select: none;
282 282 }
283 283
284 284 /** CODE **/
285 285 .code {
286 286 display: block;
287 287 width: 100%;
288 288
289 289 td {
290 290 margin: 0;
291 291 padding: 0;
292 292 }
293 293
294 294 pre {
295 295 margin: 0;
296 296 padding: 0;
297 297 margin-left: .5em;
298 298 }
299 299 }
300 300 }
301 301
302 302
303 303 // Comments
304 304
305 305 div.comment:target {
306 306 border-left: 6px solid @comment-highlight-color !important;
307 307 padding-left: 3px;
308 308 margin-left: -9px;
309 309 }
310 310
311 311 //TODO: anderson: can't get an absolute number out of anything, so had to put the
312 312 //current values that might change. But to make it clear I put as a calculation
313 313 @comment-max-width: 1065px;
314 314 @pr-extra-margin: 34px;
315 315 @pr-border-spacing: 4px;
316 316 @pr-comment-width: @comment-max-width - @pr-extra-margin - @pr-border-spacing;
317 317
318 318 // Pull Request
319 319 .cs_files .code-difftable {
320 320 border: @border-thickness solid @grey5; //borders only on PRs
321 321
322 322 .comment-inline-form,
323 323 div.comment {
324 324 width: @pr-comment-width;
325 325 }
326 326 }
327 327
328 328 // Changeset
329 329 .code-difftable {
330 330 .comment-inline-form,
331 331 div.comment {
332 332 width: @comment-max-width;
333 333 }
334 334 }
335 335
336 336 //Style page
337 337 @style-extra-margin: @sidebar-width + (@sidebarpadding * 3) + @padding;
338 338 #style-page .code-difftable{
339 339 .comment-inline-form,
340 340 div.comment {
341 341 width: @comment-max-width - @style-extra-margin;
342 342 }
343 343 }
344 344
345 345 #context-bar > h2 {
346 346 font-size: 20px;
347 347 }
348 348
349 349 #context-bar > h2> a {
350 350 font-size: 20px;
351 351 }
352 352 // end of defaults
353 353
354 354 .file_diff_buttons {
355 355 padding: 0 0 @padding;
356 356
357 357 .drop-menu {
358 358 float: left;
359 359 margin: 0 @padding 0 0;
360 360 }
361 361 .btn {
362 362 margin: 0 @padding 0 0;
363 363 }
364 364 }
365 365
366 366 .code-body.textarea.editor {
367 367 max-width: none;
368 368 padding: 15px;
369 369 }
370 370
371 371 td.injected_diff{
372 372 max-width: 1178px;
373 373 overflow-x: auto;
374 374 overflow-y: hidden;
375 375
376 376 div.diff-container,
377 377 div.diffblock{
378 378 max-width: 100%;
379 379 }
380 380
381 381 div.code-body {
382 382 max-width: 1124px;
383 383 overflow-x: auto;
384 384 overflow-y: hidden;
385 385 padding: 0;
386 386 }
387 387 div.diffblock {
388 388 border: none;
389 389 }
390 390
391 391 &.inline-form {
392 392 width: 99%
393 393 }
394 394 }
395 395
396 396
397 397 table.code-difftable {
398 398 width: 100%;
399 399 }
400 400
401 401 /** PYGMENTS COLORING **/
402 402 div.codeblock {
403 403
404 404 // TODO: johbo: Added interim to get rid of the margin around
405 405 // Select2 widgets. This needs further cleanup.
406 406 margin-top: @padding;
407 407
408 408 overflow: auto;
409 409 padding: 0px;
410 410 border: @border-thickness solid @grey5;
411 411 background: @grey6;
412 412 .border-radius(@border-radius);
413 413
414 414 #remove_gist {
415 415 float: right;
416 416 }
417 417
418 418 .gist_url {
419 419 padding: 0px 0px 10px 0px;
420 420 }
421 421
422 422 .author {
423 423 clear: both;
424 424 vertical-align: middle;
425 425 font-family: @text-bold;
426 426 }
427 427
428 428 .btn-mini {
429 429 float: left;
430 430 margin: 0 5px 0 0;
431 431 }
432 432
433 433 .code-header {
434 434 padding: @padding;
435 435 border-bottom: @border-thickness solid @grey5;
436 436
437 437 .rc-user {
438 438 min-width: 0;
439 439 margin-right: .5em;
440 440 }
441 441
442 442 .stats {
443 443 clear: both;
444 444 margin: 0 0 @padding 0;
445 445 padding: 0;
446 446 .left {
447 447 float: left;
448 448 clear: left;
449 449 max-width: 75%;
450 450 margin: 0 0 @padding 0;
451 451
452 452 &.item {
453 453 margin-right: @padding;
454 454 &.last { border-right: none; }
455 455 }
456 456 }
457 457 .buttons { float: right; }
458 458 .author {
459 459 height: 25px; margin-left: 15px; font-weight: bold;
460 460 }
461 461 }
462 462
463 463 .commit {
464 464 margin: 5px 0 0 26px;
465 465 font-weight: normal;
466 466 white-space: pre-wrap;
467 467 }
468 468 }
469 469
470 470 .message {
471 471 position: relative;
472 472 margin: @padding;
473 473
474 474 .codeblock-label {
475 475 margin: 0 0 1em 0;
476 476 }
477 477 }
478 478
479 479 .code-body {
480 480 padding: @padding;
481 481 background-color: #ffffff;
482 482 min-width: 100%;
483 483 box-sizing: border-box;
484 484 // TODO: johbo: Parent has overflow: auto, this forces the child here
485 485 // to have the intended size and to scroll. Should be simplified.
486 486 width: 100%;
487 487 overflow-x: auto;
488 488
489 489 img.rendered-binary {
490 490 height: auto;
491 491 width: 100%;
492 492 }
493 493 }
494 494 }
495 495
496 496 .code-highlighttable,
497 497 div.codeblock {
498 498
499 499 &.readme {
500 500 background-color: white;
501 501 }
502 502
503 503 .markdown-block table {
504 504 border-collapse: collapse;
505 505
506 506 th,
507 507 td {
508 508 padding: .5em;
509 509 border: @border-thickness solid @border-default-color;
510 510 }
511 511 }
512 512
513 513 table {
514 514 border: 0px;
515 515 margin: 0;
516 516 letter-spacing: normal;
517 517
518 518
519 519 td {
520 520 border: 0px;
521 521 vertical-align: top;
522 522 }
523 523 }
524 524 }
525 525
526 526 div.codeblock .code-header .search-path { padding: 0 0 0 10px; }
527 527 div.search-code-body {
528 528 background-color: #ffffff; padding: 5px 0 5px 10px;
529 529 pre {
530 530 .match { background-color: #faffa6;}
531 531 .break { display: block; width: 100%; background-color: #DDE7EF; color: #747474; }
532 532 }
533 533 .code-highlighttable {
534 534 border-collapse: collapse;
535 535
536 536 tr:hover {
537 537 background: #fafafa;
538 538 }
539 539 td.code {
540 540 padding-left: 10px;
541 541 }
542 542 td.line {
543 543 border-right: 1px solid #ccc !important;
544 544 padding-right: 10px;
545 545 text-align: right;
546 546 font-family: "Lucida Console",Monaco,monospace;
547 547 span {
548 548 white-space: pre-wrap;
549 549 color: #666666;
550 550 }
551 551 }
552 552 }
553 553 }
554 554
555 555 div.annotatediv { margin-left: 2px; margin-right: 4px; }
556 556 .code-highlight {
557 557 margin: 0; padding: 0; border-left: @border-thickness solid @grey5;
558 558 pre, .linenodiv pre { padding: 0 5px; margin: 0; }
559 559 pre div:target {background-color: @comment-highlight-color !important;}
560 560 }
561 561
562 562 .linenos a { text-decoration: none; }
563 563
564 564 .CodeMirror-selected { background: @rchighlightblue; }
565 565 .CodeMirror-focused .CodeMirror-selected { background: @rchighlightblue; }
566 566 .CodeMirror ::selection { background: @rchighlightblue; }
567 567 .CodeMirror ::-moz-selection { background: @rchighlightblue; }
568 568
569 569 .code { display: block; border:0px !important; }
570 570 .code-highlight, /* TODO: dan: merge codehilite into code-highlight */
571 571 .codehilite {
572 572 .hll { background-color: #ffffcc }
573 573 .c { color: #408080; font-style: italic } /* Comment */
574 574 .err, .codehilite .err { border: none } /* Error */
575 575 .k { color: #008000; font-weight: bold } /* Keyword */
576 576 .o { color: #666666 } /* Operator */
577 577 .cm { color: #408080; font-style: italic } /* Comment.Multiline */
578 578 .cp { color: #BC7A00 } /* Comment.Preproc */
579 579 .c1 { color: #408080; font-style: italic } /* Comment.Single */
580 580 .cs { color: #408080; font-style: italic } /* Comment.Special */
581 581 .gd { color: #A00000 } /* Generic.Deleted */
582 582 .ge { font-style: italic } /* Generic.Emph */
583 583 .gr { color: #FF0000 } /* Generic.Error */
584 584 .gh { color: #000080; font-weight: bold } /* Generic.Heading */
585 585 .gi { color: #00A000 } /* Generic.Inserted */
586 586 .go { color: #808080 } /* Generic.Output */
587 587 .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
588 588 .gs { font-weight: bold } /* Generic.Strong */
589 589 .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
590 590 .gt { color: #0040D0 } /* Generic.Traceback */
591 591 .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
592 592 .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
593 593 .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
594 594 .kp { color: #008000 } /* Keyword.Pseudo */
595 595 .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
596 596 .kt { color: #B00040 } /* Keyword.Type */
597 597 .m { color: #666666 } /* Literal.Number */
598 598 .s { color: #BA2121 } /* Literal.String */
599 599 .na { color: #7D9029 } /* Name.Attribute */
600 600 .nb { color: #008000 } /* Name.Builtin */
601 601 .nc { color: #0000FF; font-weight: bold } /* Name.Class */
602 602 .no { color: #880000 } /* Name.Constant */
603 603 .nd { color: #AA22FF } /* Name.Decorator */
604 604 .ni { color: #999999; font-weight: bold } /* Name.Entity */
605 605 .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
606 606 .nf { color: #0000FF } /* Name.Function */
607 607 .nl { color: #A0A000 } /* Name.Label */
608 608 .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
609 609 .nt { color: #008000; font-weight: bold } /* Name.Tag */
610 610 .nv { color: #19177C } /* Name.Variable */
611 611 .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
612 612 .w { color: #bbbbbb } /* Text.Whitespace */
613 613 .mf { color: #666666 } /* Literal.Number.Float */
614 614 .mh { color: #666666 } /* Literal.Number.Hex */
615 615 .mi { color: #666666 } /* Literal.Number.Integer */
616 616 .mo { color: #666666 } /* Literal.Number.Oct */
617 617 .sb { color: #BA2121 } /* Literal.String.Backtick */
618 618 .sc { color: #BA2121 } /* Literal.String.Char */
619 619 .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
620 620 .s2 { color: #BA2121 } /* Literal.String.Double */
621 621 .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
622 622 .sh { color: #BA2121 } /* Literal.String.Heredoc */
623 623 .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
624 624 .sx { color: #008000 } /* Literal.String.Other */
625 625 .sr { color: #BB6688 } /* Literal.String.Regex */
626 626 .s1 { color: #BA2121 } /* Literal.String.Single */
627 627 .ss { color: #19177C } /* Literal.String.Symbol */
628 628 .bp { color: #008000 } /* Name.Builtin.Pseudo */
629 629 .vc { color: #19177C } /* Name.Variable.Class */
630 630 .vg { color: #19177C } /* Name.Variable.Global */
631 631 .vi { color: #19177C } /* Name.Variable.Instance */
632 632 .il { color: #666666 } /* Literal.Number.Integer.Long */
633 633 }
634 634
635 635 /* customized pre blocks for markdown/rst */
636 636 pre.literal-block, .codehilite pre{
637 637 padding: @padding;
638 638 border: 1px solid @grey6;
639 639 .border-radius(@border-radius);
640 640 background-color: @grey7;
641 641 }
642 642
643 643
644 644 /* START NEW CODE BLOCK CSS */
645 645
646 646 @cb-line-height: 18px;
647 647 @cb-line-code-padding: 10px;
648 648 @cb-text-padding: 5px;
649 649
650 650 @pill-padding: 2px 7px;
651 651 @pill-padding-small: 2px 2px 1px 2px;
652 652
653 653 input.filediff-collapse-state {
654 654 display: none;
655 655
656 656 &:checked + .filediff { /* file diff is collapsed */
657 657 .cb {
658 658 display: none
659 659 }
660 660 .filediff-collapse-indicator {
661 661 width: 0;
662 662 height: 0;
663 663 border-style: solid;
664 664 border-width: 4.5px 0 4.5px 9.3px;
665 665 border-color: transparent transparent transparent #aaa;
666 666 margin: 6px 0px;
667 667 }
668 668 .filediff-menu {
669 669 display: none;
670 670 }
671 margin: 10px 0 0 0;
671
672 672 }
673 673
674 674 &+ .filediff { /* file diff is expanded */
675 675 .filediff-collapse-indicator {
676 676 width: 0;
677 677 height: 0;
678 678 border-style: solid;
679 679 border-width: 9.3px 4.5px 0 4.5px;
680 680 border-color: #aaa transparent transparent transparent;
681 681 margin: 6px 0px;
682 682
683 683 }
684 684 .filediff-menu {
685 685 display: block;
686 686 }
687 687 margin: 10px 0;
688 688 &:nth-child(2) {
689 689 margin: 0;
690 690 }
691 691 }
692 692 }
693
694 .filediffs .anchor {
695 display: block;
696 height: 40px;
697 margin-top: -40px;
698 visibility: hidden;
699 }
700
701 .filediffs .anchor:nth-of-type(1) {
702 display: block;
703 height: 80px;
704 margin-top: -80px;
705 visibility: hidden;
706 }
707
693 708 .cs_files {
694 709 clear: both;
695 710 }
696 711
712 #diff-file-sticky{
713 will-change: min-height;
714 }
715
716 .sidebar__inner{
717 transform: translate(0, 0); /* For browsers don't support translate3d. */
718 transform: translate3d(0, 0, 0);
719 will-change: position, transform;
720 height: 60px;
721 }
722
723 .fpath-placeholder {
724 clear: both;
725 visibility: hidden
726 }
727
728 .is-affixed {
729 .sidebar_inner_shadow {
730 position: fixed;
731 top: 43px;
732 right: 0;
733 left: 0;
734 z-index: 28;
735 display: block;
736 height: 5px;
737 content: "";
738 background: linear-gradient(rgba(0, 0, 0, 0.075), rgba(0, 0, 0, 0.001)) repeat-x 0 0;
739 border-top: 1px solid rgba(0, 0, 0, 0.15);
740 }
741 .fpath-placeholder {
742 visibility: visible !important;
743 }
744 }
745
697 746 .diffset-menu {
698 747 margin-bottom: 20px;
699 748 }
700 749 .diffset {
701 750 margin: 20px auto;
702 751 .diffset-heading {
703 752 border: 1px solid @grey5;
704 753 margin-bottom: -1px;
705 754 // margin-top: 20px;
706 755 h2 {
707 756 margin: 0;
708 757 line-height: 38px;
709 758 padding-left: 10px;
710 759 }
711 760 .btn {
712 761 margin: 0;
713 762 }
714 763 background: @grey6;
715 764 display: block;
716 765 padding: 5px;
717 766 }
718 767 .diffset-heading-warning {
719 768 background: @alert3-inner;
720 769 border: 1px solid @alert3;
721 770 }
722 771 &.diffset-comments-disabled {
723 772 .cb-comment-box-opener, .comment-inline-form, .cb-comment-add-button {
724 773 display: none !important;
725 774 }
726 775 }
727 776 }
728 777
729 778 .filelist {
730 779 .pill {
731 780 display: block;
732 781 float: left;
733 782 padding: @pill-padding-small;
734 783 }
735 784 }
736 785
737 786 .pill {
738 787 display: block;
739 788 float: left;
740 789 padding: @pill-padding;
741 790 }
742 791
743 792 .pill-group {
744 793 .pill {
745 794 opacity: .8;
746 795 margin-right: 3px;
747 796
748 797 &:first-child {
749 798 border-radius: @border-radius 0 0 @border-radius;
750 799 }
751 800 &:last-child {
752 801 border-radius: 0 @border-radius @border-radius 0;
753 802 }
754 803 &:only-child {
755 804 border-radius: @border-radius;
756 805 margin-right: 0;
757 806 }
758 807 }
759 808 }
760 809
761 810 /* Main comments*/
762 811 #comments {
763 812 .comment-selected {
764 813 border-left: 6px solid @comment-highlight-color;
765 814 padding-left: 3px;
766 815 margin-left: -9px;
767 816 }
768 817 }
769 818
770 819 .filediff {
771 820 border: 1px solid @grey5;
772 821
773 822 /* START OVERRIDES */
774 823 .code-highlight {
775 824 border: none; // TODO: remove this border from the global
776 825 // .code-highlight, it doesn't belong there
777 826 }
778 827 label {
779 828 margin: 0; // TODO: remove this margin definition from global label
780 829 // it doesn't belong there - if margin on labels
781 830 // are needed for a form they should be defined
782 831 // in the form's class
783 832 }
784 833 /* END OVERRIDES */
785 834
786 835 * {
787 836 box-sizing: border-box;
788 837 }
789 838 .filediff-anchor {
790 839 visibility: hidden;
791 840 }
792 841 &:hover {
793 842 .filediff-anchor {
794 843 visibility: visible;
795 844 }
796 845 }
797 846
798 847 .filediff-collapse-indicator {
799 848 border-style: solid;
800 849 float: left;
801 850 margin: 4px 0px 0 0;
802 851 cursor: pointer;
803 852 }
804 853
805 854 .filediff-heading {
806 855 background: @grey7;
807 856 cursor: pointer;
808 857 display: block;
809 858 padding: 5px 10px;
810 859 }
811 860 .filediff-heading:after {
812 861 content: "";
813 862 display: table;
814 863 clear: both;
815 864 }
816 865 .filediff-heading:hover {
817 866 background: #e1e9f4 !important;
818 867 }
819 868
820 869 .filediff-menu {
821 870 float: right;
822 871 text-align: right;
823 872 padding: 5px 5px 5px 0px;
824 873
825 874 &> a,
826 875 &> span {
827 876 padding: 1px;
828 877 }
829 878 }
830 879
831 880 .filediff-collapse-button, .filediff-expand-button {
832 881 cursor: pointer;
833 882 }
834 883 .filediff-collapse-button {
835 884 display: inline;
836 885 }
837 886 .filediff-expand-button {
838 887 display: none;
839 888 }
840 889 .filediff-collapsed .filediff-collapse-button {
841 890 display: none;
842 891 }
843 892 .filediff-collapsed .filediff-expand-button {
844 893 display: inline;
845 894 }
846 895
847 896 /**** COMMENTS ****/
848 897
849 898 .filediff-menu {
850 899 .show-comment-button {
851 900 display: none;
852 901 }
853 902 }
854 903 &.hide-comments {
855 904 .inline-comments {
856 905 display: none;
857 906 }
858 907 .filediff-menu {
859 908 .show-comment-button {
860 909 display: inline;
861 910 }
862 911 .hide-comment-button {
863 912 display: none;
864 913 }
865 914 }
866 915 }
867 916
868 917 .hide-line-comments {
869 918 .inline-comments {
870 919 display: none;
871 920 }
872 921 }
873 922
874 923 /**** END COMMENTS ****/
875 924
876 925 }
877 926
878 927
879 928
880 929 .filediff, .filelist {
881 930 .pill {
882 931 &[op="name"] {
883 932 background: none;
884 933 opacity: 1;
885 934 color: white;
886 935 }
887 936 &[op="limited"] {
888 937 background: @grey2;
889 938 color: white;
890 939 }
891 940 &[op="binary"] {
892 941 background: @color7;
893 942 color: white;
894 943 }
895 944 &[op="modified"] {
896 945 background: @alert1;
897 946 color: white;
898 947 }
899 948 &[op="renamed"] {
900 949 background: @color4;
901 950 color: white;
902 951 }
903 952 &[op="copied"] {
904 953 background: @color4;
905 954 color: white;
906 955 }
907 956 &[op="mode"] {
908 957 background: @grey3;
909 958 color: white;
910 959 }
911 960 &[op="symlink"] {
912 961 background: @color8;
913 962 color: white;
914 963 }
915 964
916 965 &[op="added"] { /* added lines */
917 966 background: @alert1;
918 967 color: white;
919 968 }
920 969 &[op="deleted"] { /* deleted lines */
921 970 background: @alert2;
922 971 color: white;
923 972 }
924 973
925 974 &[op="created"] { /* created file */
926 975 background: @alert1;
927 976 color: white;
928 977 }
929 978 &[op="removed"] { /* deleted file */
930 979 background: @color5;
931 980 color: white;
932 981 }
933 982 }
934 983 }
935 984
936 985
937 986 .filediff-outdated {
938 987 padding: 8px 0;
939 988
940 989 .filediff-heading {
941 990 opacity: .5;
942 991 }
943 992 }
944 993
945 994 table.cb {
946 995 width: 100%;
947 996 border-collapse: collapse;
948 997
949 998 .cb-text {
950 999 padding: @cb-text-padding;
951 1000 }
952 1001 .cb-hunk {
953 1002 padding: @cb-text-padding;
954 1003 }
955 1004 .cb-expand {
956 1005 display: none;
957 1006 }
958 1007 .cb-collapse {
959 1008 display: inline;
960 1009 }
961 1010 &.cb-collapsed {
962 1011 .cb-line {
963 1012 display: none;
964 1013 }
965 1014 .cb-expand {
966 1015 display: inline;
967 1016 }
968 1017 .cb-collapse {
969 1018 display: none;
970 1019 }
971 1020 }
972 1021
973 1022 /* intentionally general selector since .cb-line-selected must override it
974 1023 and they both use !important since the td itself may have a random color
975 1024 generated by annotation blocks. TLDR: if you change it, make sure
976 1025 annotated block selection and line selection in file view still work */
977 1026 .cb-line-fresh .cb-content {
978 1027 background: white !important;
979 1028 }
980 1029 .cb-warning {
981 1030 background: #fff4dd;
982 1031 }
983 1032
984 1033 &.cb-diff-sideside {
985 1034 td {
986 1035 &.cb-content {
987 1036 width: 50%;
988 1037 }
989 1038 }
990 1039 }
991 1040
992 1041 tr {
993 1042 &.cb-annotate {
994 1043 border-top: 1px solid #eee;
995 1044 }
996 1045
997 1046 &.cb-comment-info {
998 1047 border-top: 1px solid #eee;
999 1048 color: rgba(0, 0, 0, 0.3);
1000 1049 background: #edf2f9;
1001 1050
1002 1051 td {
1003 1052
1004 1053 }
1005 1054 }
1006 1055
1007 1056 &.cb-hunk {
1008 1057 font-family: @font-family-monospace;
1009 1058 color: rgba(0, 0, 0, 0.3);
1010 1059
1011 1060 td {
1012 1061 &:first-child {
1013 1062 background: #edf2f9;
1014 1063 }
1015 1064 &:last-child {
1016 1065 background: #f4f7fb;
1017 1066 }
1018 1067 }
1019 1068 }
1020 1069 }
1021 1070
1022 1071
1023 1072 td {
1024 1073 vertical-align: top;
1025 1074 padding: 0;
1026 1075
1027 1076 &.cb-content {
1028 1077 font-size: 12.35px;
1029 1078
1030 1079 &.cb-line-selected .cb-code {
1031 1080 background: @comment-highlight-color !important;
1032 1081 }
1033 1082
1034 1083 span.cb-code {
1035 1084 line-height: @cb-line-height;
1036 1085 padding-left: @cb-line-code-padding;
1037 1086 padding-right: @cb-line-code-padding;
1038 1087 display: block;
1039 1088 white-space: pre-wrap;
1040 1089 font-family: @font-family-monospace;
1041 1090 word-break: break-all;
1042 1091 .nonl {
1043 1092 color: @color5;
1044 1093 }
1045 1094 }
1046 1095
1047 1096 &> button.cb-comment-box-opener {
1048 1097
1049 1098 padding: 2px 2px 1px 3px;
1050 1099 margin-left: -6px;
1051 1100 margin-top: -1px;
1052 1101
1053 1102 border-radius: @border-radius;
1054 1103 position: absolute;
1055 1104 display: none;
1056 1105 }
1057 1106 .cb-comment {
1058 1107 margin-top: 10px;
1059 1108 white-space: normal;
1060 1109 }
1061 1110 }
1062 1111 &:hover {
1063 1112 button.cb-comment-box-opener {
1064 1113 display: block;
1065 1114 }
1066 1115 &+ td button.cb-comment-box-opener {
1067 1116 display: block
1068 1117 }
1069 1118 }
1070 1119
1071 1120 &.cb-data {
1072 1121 text-align: right;
1073 1122 width: 30px;
1074 1123 font-family: @font-family-monospace;
1075 1124
1076 1125 .icon-comment {
1077 1126 cursor: pointer;
1078 1127 }
1079 1128 &.cb-line-selected > div {
1080 1129 display: block;
1081 1130 background: @comment-highlight-color !important;
1082 1131 line-height: @cb-line-height;
1083 1132 color: rgba(0, 0, 0, 0.3);
1084 1133 }
1085 1134 }
1086 1135
1087 1136 &.cb-lineno {
1088 1137 padding: 0;
1089 1138 width: 50px;
1090 1139 color: rgba(0, 0, 0, 0.3);
1091 1140 text-align: right;
1092 1141 border-right: 1px solid #eee;
1093 1142 font-family: @font-family-monospace;
1094 1143 -webkit-user-select: none;
1095 1144 -moz-user-select: none;
1096 1145 user-select: none;
1097 1146
1098 1147 a::before {
1099 1148 content: attr(data-line-no);
1100 1149 }
1101 1150 &.cb-line-selected a {
1102 1151 background: @comment-highlight-color !important;
1103 1152 }
1104 1153
1105 1154 a {
1106 1155 display: block;
1107 1156 padding-right: @cb-line-code-padding;
1108 1157 padding-left: @cb-line-code-padding;
1109 1158 line-height: @cb-line-height;
1110 1159 color: rgba(0, 0, 0, 0.3);
1111 1160 }
1112 1161 }
1113 1162
1114 1163 &.cb-empty {
1115 1164 background: @grey7;
1116 1165 }
1117 1166
1118 1167 ins {
1119 1168 color: black;
1120 1169 background: #a6f3a6;
1121 1170 text-decoration: none;
1122 1171 }
1123 1172 del {
1124 1173 color: black;
1125 1174 background: #f8cbcb;
1126 1175 text-decoration: none;
1127 1176 }
1128 1177 &.cb-addition {
1129 1178 background: #ecffec;
1130 1179
1131 1180 &.blob-lineno {
1132 1181 background: #ddffdd;
1133 1182 }
1134 1183 }
1135 1184 &.cb-deletion {
1136 1185 background: #ffecec;
1137 1186
1138 1187 &.blob-lineno {
1139 1188 background: #ffdddd;
1140 1189 }
1141 1190 }
1142 1191 &.cb-annotate-message-spacer {
1143 1192 width:8px;
1144 1193 padding: 1px 0px 0px 3px;
1145 1194 }
1146 1195 &.cb-annotate-info {
1147 1196 width: 320px;
1148 1197 min-width: 320px;
1149 1198 max-width: 320px;
1150 1199 padding: 5px 2px;
1151 1200 font-size: 13px;
1152 1201
1153 1202 .cb-annotate-message {
1154 1203 padding: 2px 0px 0px 0px;
1155 1204 white-space: pre-line;
1156 1205 overflow: hidden;
1157 1206 }
1158 1207 .rc-user {
1159 1208 float: none;
1160 1209 padding: 0 6px 0 17px;
1161 1210 min-width: unset;
1162 1211 min-height: unset;
1163 1212 }
1164 1213 }
1165 1214
1166 1215 &.cb-annotate-revision {
1167 1216 cursor: pointer;
1168 1217 text-align: right;
1169 1218 padding: 1px 3px 0px 3px;
1170 1219 }
1171 1220 }
1172 1221 }
@@ -1,829 +1,836 b''
1 1 // # Copyright (C) 2010-2018 RhodeCode GmbH
2 2 // #
3 3 // # This program is free software: you can redistribute it and/or modify
4 4 // # it under the terms of the GNU Affero General Public License, version 3
5 5 // # (only), as published by the Free Software Foundation.
6 6 // #
7 7 // # This program is distributed in the hope that it will be useful,
8 8 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 9 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 10 // # GNU General Public License for more details.
11 11 // #
12 12 // # You should have received a copy of the GNU Affero General Public License
13 13 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 14 // #
15 15 // # This program is dual-licensed. If you wish to learn more about the
16 16 // # RhodeCode Enterprise Edition, including its added features, Support services,
17 17 // # and proprietary license terms, please see https://rhodecode.com/licenses/
18 18
19 19 var firefoxAnchorFix = function() {
20 20 // hack to make anchor links behave properly on firefox, in our inline
21 21 // comments generation when comments are injected firefox is misbehaving
22 22 // when jumping to anchor links
23 23 if (location.href.indexOf('#') > -1) {
24 24 location.href += '';
25 25 }
26 26 };
27 27
28 28 var linkifyComments = function(comments) {
29 29 var firstCommentId = null;
30 30 if (comments) {
31 31 firstCommentId = $(comments[0]).data('comment-id');
32 32 }
33 33
34 34 if (firstCommentId){
35 35 $('#inline-comments-counter').attr('href', '#comment-' + firstCommentId);
36 36 }
37 37 };
38 38
39 39 var bindToggleButtons = function() {
40 40 $('.comment-toggle').on('click', function() {
41 41 $(this).parent().nextUntil('tr.line').toggle('inline-comments');
42 42 });
43 43 };
44 44
45 45
46 46
47 47 var _submitAjaxPOST = function(url, postData, successHandler, failHandler) {
48 48 failHandler = failHandler || function() {};
49 49 postData = toQueryString(postData);
50 50 var request = $.ajax({
51 51 url: url,
52 52 type: 'POST',
53 53 data: postData,
54 54 headers: {'X-PARTIAL-XHR': true}
55 55 })
56 56 .done(function (data) {
57 57 successHandler(data);
58 58 })
59 59 .fail(function (data, textStatus, errorThrown) {
60 60 failHandler(data, textStatus, errorThrown)
61 61 });
62 62 return request;
63 63 };
64 64
65 65
66 66
67 67
68 68 /* Comment form for main and inline comments */
69 69 (function(mod) {
70 70
71 71 if (typeof exports == "object" && typeof module == "object") {
72 72 // CommonJS
73 73 module.exports = mod();
74 74 }
75 75 else {
76 76 // Plain browser env
77 77 (this || window).CommentForm = mod();
78 78 }
79 79
80 80 })(function() {
81 81 "use strict";
82 82
83 83 function CommentForm(formElement, commitId, pullRequestId, lineNo, initAutocompleteActions, resolvesCommentId) {
84 84 if (!(this instanceof CommentForm)) {
85 85 return new CommentForm(formElement, commitId, pullRequestId, lineNo, initAutocompleteActions, resolvesCommentId);
86 86 }
87 87
88 88 // bind the element instance to our Form
89 89 $(formElement).get(0).CommentForm = this;
90 90
91 91 this.withLineNo = function(selector) {
92 92 var lineNo = this.lineNo;
93 93 if (lineNo === undefined) {
94 94 return selector
95 95 } else {
96 96 return selector + '_' + lineNo;
97 97 }
98 98 };
99 99
100 100 this.commitId = commitId;
101 101 this.pullRequestId = pullRequestId;
102 102 this.lineNo = lineNo;
103 103 this.initAutocompleteActions = initAutocompleteActions;
104 104
105 105 this.previewButton = this.withLineNo('#preview-btn');
106 106 this.previewContainer = this.withLineNo('#preview-container');
107 107
108 108 this.previewBoxSelector = this.withLineNo('#preview-box');
109 109
110 110 this.editButton = this.withLineNo('#edit-btn');
111 111 this.editContainer = this.withLineNo('#edit-container');
112 112 this.cancelButton = this.withLineNo('#cancel-btn');
113 113 this.commentType = this.withLineNo('#comment_type');
114 114
115 115 this.resolvesId = null;
116 116 this.resolvesActionId = null;
117 117
118 118 this.closesPr = '#close_pull_request';
119 119
120 120 this.cmBox = this.withLineNo('#text');
121 121 this.cm = initCommentBoxCodeMirror(this, this.cmBox, this.initAutocompleteActions);
122 122
123 123 this.statusChange = this.withLineNo('#change_status');
124 124
125 125 this.submitForm = formElement;
126 126 this.submitButton = $(this.submitForm).find('input[type="submit"]');
127 127 this.submitButtonText = this.submitButton.val();
128 128
129 129 this.previewUrl = pyroutes.url('repo_commit_comment_preview',
130 130 {'repo_name': templateContext.repo_name,
131 131 'commit_id': templateContext.commit_data.commit_id});
132 132
133 133 if (resolvesCommentId){
134 134 this.resolvesId = '#resolve_comment_{0}'.format(resolvesCommentId);
135 135 this.resolvesActionId = '#resolve_comment_action_{0}'.format(resolvesCommentId);
136 136 $(this.commentType).prop('disabled', true);
137 137 $(this.commentType).addClass('disabled');
138 138
139 139 // disable select
140 140 setTimeout(function() {
141 141 $(self.statusChange).select2('readonly', true);
142 142 }, 10);
143 143
144 144 var resolvedInfo = (
145 145 '<li class="resolve-action">' +
146 146 '<input type="hidden" id="resolve_comment_{0}" name="resolve_comment_{0}" value="{0}">' +
147 147 '<button id="resolve_comment_action_{0}" class="resolve-text btn btn-sm" onclick="return Rhodecode.comments.submitResolution({0})">{1} #{0}</button>' +
148 148 '</li>'
149 149 ).format(resolvesCommentId, _gettext('resolve comment'));
150 150 $(resolvedInfo).insertAfter($(this.commentType).parent());
151 151 }
152 152
153 153 // based on commitId, or pullRequestId decide where do we submit
154 154 // out data
155 155 if (this.commitId){
156 156 this.submitUrl = pyroutes.url('repo_commit_comment_create',
157 157 {'repo_name': templateContext.repo_name,
158 158 'commit_id': this.commitId});
159 159 this.selfUrl = pyroutes.url('repo_commit',
160 160 {'repo_name': templateContext.repo_name,
161 161 'commit_id': this.commitId});
162 162
163 163 } else if (this.pullRequestId) {
164 164 this.submitUrl = pyroutes.url('pullrequest_comment_create',
165 165 {'repo_name': templateContext.repo_name,
166 166 'pull_request_id': this.pullRequestId});
167 167 this.selfUrl = pyroutes.url('pullrequest_show',
168 168 {'repo_name': templateContext.repo_name,
169 169 'pull_request_id': this.pullRequestId});
170 170
171 171 } else {
172 172 throw new Error(
173 173 'CommentForm requires pullRequestId, or commitId to be specified.')
174 174 }
175 175
176 176 // FUNCTIONS and helpers
177 177 var self = this;
178 178
179 179 this.isInline = function(){
180 180 return this.lineNo && this.lineNo != 'general';
181 181 };
182 182
183 183 this.getCmInstance = function(){
184 184 return this.cm
185 185 };
186 186
187 187 this.setPlaceholder = function(placeholder) {
188 188 var cm = this.getCmInstance();
189 189 if (cm){
190 190 cm.setOption('placeholder', placeholder);
191 191 }
192 192 };
193 193
194 194 this.getCommentStatus = function() {
195 195 return $(this.submitForm).find(this.statusChange).val();
196 196 };
197 197 this.getCommentType = function() {
198 198 return $(this.submitForm).find(this.commentType).val();
199 199 };
200 200
201 201 this.getResolvesId = function() {
202 202 return $(this.submitForm).find(this.resolvesId).val() || null;
203 203 };
204 204
205 205 this.getClosePr = function() {
206 206 return $(this.submitForm).find(this.closesPr).val() || null;
207 207 };
208 208
209 209 this.markCommentResolved = function(resolvedCommentId){
210 210 $('#comment-label-{0}'.format(resolvedCommentId)).find('.resolved').show();
211 211 $('#comment-label-{0}'.format(resolvedCommentId)).find('.resolve').hide();
212 212 };
213 213
214 214 this.isAllowedToSubmit = function() {
215 215 return !$(this.submitButton).prop('disabled');
216 216 };
217 217
218 218 this.initStatusChangeSelector = function(){
219 219 var formatChangeStatus = function(state, escapeMarkup) {
220 220 var originalOption = state.element;
221 221 return '<div class="flag_status ' + $(originalOption).data('status') + ' pull-left"></div>' +
222 222 '<span>' + escapeMarkup(state.text) + '</span>';
223 223 };
224 224 var formatResult = function(result, container, query, escapeMarkup) {
225 225 return formatChangeStatus(result, escapeMarkup);
226 226 };
227 227
228 228 var formatSelection = function(data, container, escapeMarkup) {
229 229 return formatChangeStatus(data, escapeMarkup);
230 230 };
231 231
232 232 $(this.submitForm).find(this.statusChange).select2({
233 233 placeholder: _gettext('Status Review'),
234 234 formatResult: formatResult,
235 235 formatSelection: formatSelection,
236 236 containerCssClass: "drop-menu status_box_menu",
237 237 dropdownCssClass: "drop-menu-dropdown",
238 238 dropdownAutoWidth: true,
239 239 minimumResultsForSearch: -1
240 240 });
241 241 $(this.submitForm).find(this.statusChange).on('change', function() {
242 242 var status = self.getCommentStatus();
243 243
244 244 if (status && !self.isInline()) {
245 245 $(self.submitButton).prop('disabled', false);
246 246 }
247 247
248 248 var placeholderText = _gettext('Comment text will be set automatically based on currently selected status ({0}) ...').format(status);
249 249 self.setPlaceholder(placeholderText)
250 250 })
251 251 };
252 252
253 253 // reset the comment form into it's original state
254 254 this.resetCommentFormState = function(content) {
255 255 content = content || '';
256 256
257 257 $(this.editContainer).show();
258 258 $(this.editButton).parent().addClass('active');
259 259
260 260 $(this.previewContainer).hide();
261 261 $(this.previewButton).parent().removeClass('active');
262 262
263 263 this.setActionButtonsDisabled(true);
264 264 self.cm.setValue(content);
265 265 self.cm.setOption("readOnly", false);
266 266
267 267 if (this.resolvesId) {
268 268 // destroy the resolve action
269 269 $(this.resolvesId).parent().remove();
270 270 }
271 271 // reset closingPR flag
272 272 $('.close-pr-input').remove();
273 273
274 274 $(this.statusChange).select2('readonly', false);
275 275 };
276 276
277 277 this.globalSubmitSuccessCallback = function(){
278 278 // default behaviour is to call GLOBAL hook, if it's registered.
279 279 if (window.commentFormGlobalSubmitSuccessCallback !== undefined){
280 280 commentFormGlobalSubmitSuccessCallback()
281 281 }
282 282 };
283 283
284 284 this.submitAjaxPOST = function(url, postData, successHandler, failHandler) {
285 285 return _submitAjaxPOST(url, postData, successHandler, failHandler);
286 286 };
287 287
288 288 // overwrite a submitHandler, we need to do it for inline comments
289 289 this.setHandleFormSubmit = function(callback) {
290 290 this.handleFormSubmit = callback;
291 291 };
292 292
293 293 // overwrite a submitSuccessHandler
294 294 this.setGlobalSubmitSuccessCallback = function(callback) {
295 295 this.globalSubmitSuccessCallback = callback;
296 296 };
297 297
298 298 // default handler for for submit for main comments
299 299 this.handleFormSubmit = function() {
300 300 var text = self.cm.getValue();
301 301 var status = self.getCommentStatus();
302 302 var commentType = self.getCommentType();
303 303 var resolvesCommentId = self.getResolvesId();
304 304 var closePullRequest = self.getClosePr();
305 305
306 306 if (text === "" && !status) {
307 307 return;
308 308 }
309 309
310 310 var excludeCancelBtn = false;
311 311 var submitEvent = true;
312 312 self.setActionButtonsDisabled(true, excludeCancelBtn, submitEvent);
313 313 self.cm.setOption("readOnly", true);
314 314
315 315 var postData = {
316 316 'text': text,
317 317 'changeset_status': status,
318 318 'comment_type': commentType,
319 319 'csrf_token': CSRF_TOKEN
320 320 };
321 321
322 322 if (resolvesCommentId) {
323 323 postData['resolves_comment_id'] = resolvesCommentId;
324 324 }
325 325
326 326 if (closePullRequest) {
327 327 postData['close_pull_request'] = true;
328 328 }
329 329
330 330 var submitSuccessCallback = function(o) {
331 331 // reload page if we change status for single commit.
332 332 if (status && self.commitId) {
333 333 location.reload(true);
334 334 } else {
335 335 $('#injected_page_comments').append(o.rendered_text);
336 336 self.resetCommentFormState();
337 337 timeagoActivate();
338 338
339 339 // mark visually which comment was resolved
340 340 if (resolvesCommentId) {
341 341 self.markCommentResolved(resolvesCommentId);
342 342 }
343 343 }
344 344
345 345 // run global callback on submit
346 346 self.globalSubmitSuccessCallback();
347 347
348 348 };
349 349 var submitFailCallback = function(data) {
350 350 alert(
351 351 "Error while submitting comment.\n" +
352 352 "Error code {0} ({1}).".format(data.status, data.statusText)
353 353 );
354 354 self.resetCommentFormState(text);
355 355 };
356 356 self.submitAjaxPOST(
357 357 self.submitUrl, postData, submitSuccessCallback, submitFailCallback);
358 358 };
359 359
360 360 this.previewSuccessCallback = function(o) {
361 361 $(self.previewBoxSelector).html(o);
362 362 $(self.previewBoxSelector).removeClass('unloaded');
363 363
364 364 // swap buttons, making preview active
365 365 $(self.previewButton).parent().addClass('active');
366 366 $(self.editButton).parent().removeClass('active');
367 367
368 368 // unlock buttons
369 369 self.setActionButtonsDisabled(false);
370 370 };
371 371
372 372 this.setActionButtonsDisabled = function(state, excludeCancelBtn, submitEvent) {
373 373 excludeCancelBtn = excludeCancelBtn || false;
374 374 submitEvent = submitEvent || false;
375 375
376 376 $(this.editButton).prop('disabled', state);
377 377 $(this.previewButton).prop('disabled', state);
378 378
379 379 if (!excludeCancelBtn) {
380 380 $(this.cancelButton).prop('disabled', state);
381 381 }
382 382
383 383 var submitState = state;
384 384 if (!submitEvent && this.getCommentStatus() && !self.isInline()) {
385 385 // if the value of commit review status is set, we allow
386 386 // submit button, but only on Main form, isInline means inline
387 387 submitState = false
388 388 }
389 389
390 390 $(this.submitButton).prop('disabled', submitState);
391 391 if (submitEvent) {
392 392 $(this.submitButton).val(_gettext('Submitting...'));
393 393 } else {
394 394 $(this.submitButton).val(this.submitButtonText);
395 395 }
396 396
397 397 };
398 398
399 399 // lock preview/edit/submit buttons on load, but exclude cancel button
400 400 var excludeCancelBtn = true;
401 401 this.setActionButtonsDisabled(true, excludeCancelBtn);
402 402
403 403 // anonymous users don't have access to initialized CM instance
404 404 if (this.cm !== undefined){
405 405 this.cm.on('change', function(cMirror) {
406 406 if (cMirror.getValue() === "") {
407 407 self.setActionButtonsDisabled(true, excludeCancelBtn)
408 408 } else {
409 409 self.setActionButtonsDisabled(false, excludeCancelBtn)
410 410 }
411 411 });
412 412 }
413 413
414 414 $(this.editButton).on('click', function(e) {
415 415 e.preventDefault();
416 416
417 417 $(self.previewButton).parent().removeClass('active');
418 418 $(self.previewContainer).hide();
419 419
420 420 $(self.editButton).parent().addClass('active');
421 421 $(self.editContainer).show();
422 422
423 423 });
424 424
425 425 $(this.previewButton).on('click', function(e) {
426 426 e.preventDefault();
427 427 var text = self.cm.getValue();
428 428
429 429 if (text === "") {
430 430 return;
431 431 }
432 432
433 433 var postData = {
434 434 'text': text,
435 435 'renderer': templateContext.visual.default_renderer,
436 436 'csrf_token': CSRF_TOKEN
437 437 };
438 438
439 439 // lock ALL buttons on preview
440 440 self.setActionButtonsDisabled(true);
441 441
442 442 $(self.previewBoxSelector).addClass('unloaded');
443 443 $(self.previewBoxSelector).html(_gettext('Loading ...'));
444 444
445 445 $(self.editContainer).hide();
446 446 $(self.previewContainer).show();
447 447
448 448 // by default we reset state of comment preserving the text
449 449 var previewFailCallback = function(data){
450 450 alert(
451 451 "Error while preview of comment.\n" +
452 452 "Error code {0} ({1}).".format(data.status, data.statusText)
453 453 );
454 454 self.resetCommentFormState(text)
455 455 };
456 456 self.submitAjaxPOST(
457 457 self.previewUrl, postData, self.previewSuccessCallback,
458 458 previewFailCallback);
459 459
460 460 $(self.previewButton).parent().addClass('active');
461 461 $(self.editButton).parent().removeClass('active');
462 462 });
463 463
464 464 $(this.submitForm).submit(function(e) {
465 465 e.preventDefault();
466 466 var allowedToSubmit = self.isAllowedToSubmit();
467 467 if (!allowedToSubmit){
468 468 return false;
469 469 }
470 470 self.handleFormSubmit();
471 471 });
472 472
473 473 }
474 474
475 475 return CommentForm;
476 476 });
477 477
478 478 /* comments controller */
479 479 var CommentsController = function() {
480 480 var mainComment = '#text';
481 481 var self = this;
482 482
483 483 this.cancelComment = function(node) {
484 484 var $node = $(node);
485 485 var $td = $node.closest('td');
486 486 $node.closest('.comment-inline-form').remove();
487 487 return false;
488 488 };
489 489
490 490 this.getLineNumber = function(node) {
491 491 var $node = $(node);
492 492 var lineNo = $node.closest('td').attr('data-line-no');
493 493 if (lineNo === undefined && $node.data('commentInline')){
494 494 lineNo = $node.data('commentLineNo')
495 495 }
496 496
497 497 return lineNo
498 498 };
499 499
500 500 this.scrollToComment = function(node, offset, outdated) {
501 501 if (offset === undefined) {
502 502 offset = 0;
503 503 }
504 504 var outdated = outdated || false;
505 505 var klass = outdated ? 'div.comment-outdated' : 'div.comment-current';
506 506
507 507 if (!node) {
508 508 node = $('.comment-selected');
509 509 if (!node.length) {
510 510 node = $('comment-current')
511 511 }
512 512 }
513 513 $wrapper = $(node).closest('div.comment');
514 514 $comment = $(node).closest(klass);
515 515 $comments = $(klass);
516 516
517 517 // show hidden comment when referenced.
518 518 if (!$wrapper.is(':visible')){
519 519 $wrapper.show();
520 520 }
521 521
522 522 $('.comment-selected').removeClass('comment-selected');
523 523
524 524 var nextIdx = $(klass).index($comment) + offset;
525 525 if (nextIdx >= $comments.length) {
526 526 nextIdx = 0;
527 527 }
528 528 var $next = $(klass).eq(nextIdx);
529 529
530 530 var $cb = $next.closest('.cb');
531 531 $cb.removeClass('cb-collapsed');
532 532
533 533 var $filediffCollapseState = $cb.closest('.filediff').prev();
534 534 $filediffCollapseState.prop('checked', false);
535 535 $next.addClass('comment-selected');
536 536 scrollToElement($next);
537 537 return false;
538 538 };
539 539
540 540 this.nextComment = function(node) {
541 541 return self.scrollToComment(node, 1);
542 542 };
543 543
544 544 this.prevComment = function(node) {
545 545 return self.scrollToComment(node, -1);
546 546 };
547 547
548 548 this.nextOutdatedComment = function(node) {
549 549 return self.scrollToComment(node, 1, true);
550 550 };
551 551
552 552 this.prevOutdatedComment = function(node) {
553 553 return self.scrollToComment(node, -1, true);
554 554 };
555 555
556 556 this.deleteComment = function(node) {
557 557 if (!confirm(_gettext('Delete this comment?'))) {
558 558 return false;
559 559 }
560 560 var $node = $(node);
561 561 var $td = $node.closest('td');
562 562 var $comment = $node.closest('.comment');
563 563 var comment_id = $comment.attr('data-comment-id');
564 564 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__', comment_id);
565 565 var postData = {
566 566 'csrf_token': CSRF_TOKEN
567 567 };
568 568
569 569 $comment.addClass('comment-deleting');
570 570 $comment.hide('fast');
571 571
572 572 var success = function(response) {
573 573 $comment.remove();
574 574 return false;
575 575 };
576 576 var failure = function(data, textStatus, xhr) {
577 577 alert("error processing request: " + textStatus);
578 578 $comment.show('fast');
579 579 $comment.removeClass('comment-deleting');
580 580 return false;
581 581 };
582 582 ajaxPOST(url, postData, success, failure);
583 583 };
584 584
585 585 this.toggleWideMode = function (node) {
586 586 if ($('#content').hasClass('wrapper')) {
587 587 $('#content').removeClass("wrapper");
588 588 $('#content').addClass("wide-mode-wrapper");
589 589 $(node).addClass('btn-success');
590 590 } else {
591 591 $('#content').removeClass("wide-mode-wrapper");
592 592 $('#content').addClass("wrapper");
593 593 $(node).removeClass('btn-success');
594 594 }
595 595 return false;
596 596 };
597 597
598 598 this.toggleComments = function(node, show) {
599 599 var $filediff = $(node).closest('.filediff');
600 600 if (show === true) {
601 601 $filediff.removeClass('hide-comments');
602 602 } else if (show === false) {
603 603 $filediff.find('.hide-line-comments').removeClass('hide-line-comments');
604 604 $filediff.addClass('hide-comments');
605 605 } else {
606 606 $filediff.find('.hide-line-comments').removeClass('hide-line-comments');
607 607 $filediff.toggleClass('hide-comments');
608 608 }
609 609 return false;
610 610 };
611 611
612 612 this.toggleLineComments = function(node) {
613 613 self.toggleComments(node, true);
614 614 var $node = $(node);
615 615 // mark outdated comments as visible before the toggle;
616 616 $(node.closest('tr')).find('.comment-outdated').show();
617 617 $node.closest('tr').toggleClass('hide-line-comments');
618 618 };
619 619
620 620 this.createCommentForm = function(formElement, lineno, placeholderText, initAutocompleteActions, resolvesCommentId){
621 621 var pullRequestId = templateContext.pull_request_data.pull_request_id;
622 622 var commitId = templateContext.commit_data.commit_id;
623 623
624 624 var commentForm = new CommentForm(
625 625 formElement, commitId, pullRequestId, lineno, initAutocompleteActions, resolvesCommentId);
626 626 var cm = commentForm.getCmInstance();
627 627
628 628 if (resolvesCommentId){
629 629 var placeholderText = _gettext('Leave a comment, or click resolve button to resolve TODO comment #{0}').format(resolvesCommentId);
630 630 }
631 631
632 632 setTimeout(function() {
633 633 // callbacks
634 634 if (cm !== undefined) {
635 635 commentForm.setPlaceholder(placeholderText);
636 636 if (commentForm.isInline()) {
637 637 cm.focus();
638 638 cm.refresh();
639 639 }
640 640 }
641 641 }, 10);
642 642
643 643 // trigger scrolldown to the resolve comment, since it might be away
644 644 // from the clicked
645 645 if (resolvesCommentId){
646 646 var actionNode = $(commentForm.resolvesActionId).offset();
647 647
648 648 setTimeout(function() {
649 649 if (actionNode) {
650 650 $('body, html').animate({scrollTop: actionNode.top}, 10);
651 651 }
652 652 }, 100);
653 653 }
654 654
655 655 return commentForm;
656 656 };
657 657
658 658 this.createGeneralComment = function (lineNo, placeholderText, resolvesCommentId) {
659 659
660 660 var tmpl = $('#cb-comment-general-form-template').html();
661 661 tmpl = tmpl.format(null, 'general');
662 662 var $form = $(tmpl);
663 663
664 664 var $formPlaceholder = $('#cb-comment-general-form-placeholder');
665 665 var curForm = $formPlaceholder.find('form');
666 666 if (curForm){
667 667 curForm.remove();
668 668 }
669 669 $formPlaceholder.append($form);
670 670
671 671 var _form = $($form[0]);
672 672 var autocompleteActions = ['approve', 'reject', 'as_note', 'as_todo'];
673 673 var commentForm = this.createCommentForm(
674 674 _form, lineNo, placeholderText, autocompleteActions, resolvesCommentId);
675 675 commentForm.initStatusChangeSelector();
676 676
677 677 return commentForm;
678 678 };
679 679
680 680 this.createComment = function(node, resolutionComment) {
681 681 var resolvesCommentId = resolutionComment || null;
682 682 var $node = $(node);
683 683 var $td = $node.closest('td');
684 684 var $form = $td.find('.comment-inline-form');
685 685
686 686 if (!$form.length) {
687 687
688 688 var $filediff = $node.closest('.filediff');
689 689 $filediff.removeClass('hide-comments');
690 690 var f_path = $filediff.attr('data-f-path');
691 691 var lineno = self.getLineNumber(node);
692 692 // create a new HTML from template
693 693 var tmpl = $('#cb-comment-inline-form-template').html();
694 694 tmpl = tmpl.format(escapeHtml(f_path), lineno);
695 695 $form = $(tmpl);
696 696
697 697 var $comments = $td.find('.inline-comments');
698 698 if (!$comments.length) {
699 699 $comments = $(
700 700 $('#cb-comments-inline-container-template').html());
701 701 $td.append($comments);
702 702 }
703 703
704 704 $td.find('.cb-comment-add-button').before($form);
705 705
706 706 var placeholderText = _gettext('Leave a comment on line {0}.').format(lineno);
707 707 var _form = $($form[0]).find('form');
708 708 var autocompleteActions = ['as_note', 'as_todo'];
709 709 var commentForm = this.createCommentForm(
710 710 _form, lineno, placeholderText, autocompleteActions, resolvesCommentId);
711 711
712 712 $.Topic('/ui/plugins/code/comment_form_built').prepareOrPublish({
713 713 form: _form,
714 714 parent: $td[0],
715 715 lineno: lineno,
716 716 f_path: f_path}
717 717 );
718 718
719 719 // set a CUSTOM submit handler for inline comments.
720 720 commentForm.setHandleFormSubmit(function(o) {
721 721 var text = commentForm.cm.getValue();
722 722 var commentType = commentForm.getCommentType();
723 723 var resolvesCommentId = commentForm.getResolvesId();
724 724
725 725 if (text === "") {
726 726 return;
727 727 }
728 728
729 729 if (lineno === undefined) {
730 730 alert('missing line !');
731 731 return;
732 732 }
733 733 if (f_path === undefined) {
734 734 alert('missing file path !');
735 735 return;
736 736 }
737 737
738 738 var excludeCancelBtn = false;
739 739 var submitEvent = true;
740 740 commentForm.setActionButtonsDisabled(true, excludeCancelBtn, submitEvent);
741 741 commentForm.cm.setOption("readOnly", true);
742 742 var postData = {
743 743 'text': text,
744 744 'f_path': f_path,
745 745 'line': lineno,
746 746 'comment_type': commentType,
747 747 'csrf_token': CSRF_TOKEN
748 748 };
749 749 if (resolvesCommentId){
750 750 postData['resolves_comment_id'] = resolvesCommentId;
751 751 }
752 752
753 753 var submitSuccessCallback = function(json_data) {
754 754 $form.remove();
755 755 try {
756 756 var html = json_data.rendered_text;
757 757 var lineno = json_data.line_no;
758 758 var target_id = json_data.target_id;
759 759
760 760 $comments.find('.cb-comment-add-button').before(html);
761 761
762 762 //mark visually which comment was resolved
763 763 if (resolvesCommentId) {
764 764 commentForm.markCommentResolved(resolvesCommentId);
765 765 }
766 766
767 767 // run global callback on submit
768 768 commentForm.globalSubmitSuccessCallback();
769 769
770 770 } catch (e) {
771 771 console.error(e);
772 772 }
773 773
774 774 // re trigger the linkification of next/prev navigation
775 775 linkifyComments($('.inline-comment-injected'));
776 776 timeagoActivate();
777
778 if (window.Waypoint !== undefined) {
779 // potentially our comments change the active window size, so we
780 // notify waypint to re-paint
781 Waypoint.refreshAll()
782 }
783
777 784 commentForm.setActionButtonsDisabled(false);
778 785
779 786 };
780 787 var submitFailCallback = function(data){
781 788 alert(
782 789 "Error while submitting comment.\n" +
783 790 "Error code {0} ({1}).".format(data.status, data.statusText)
784 791 );
785 792 commentForm.resetCommentFormState(text)
786 793 };
787 794 commentForm.submitAjaxPOST(
788 795 commentForm.submitUrl, postData, submitSuccessCallback, submitFailCallback);
789 796 });
790 797 }
791 798
792 799 $form.addClass('comment-inline-form-open');
793 800 };
794 801
795 802 this.createResolutionComment = function(commentId){
796 803 // hide the trigger text
797 804 $('#resolve-comment-{0}'.format(commentId)).hide();
798 805
799 806 var comment = $('#comment-'+commentId);
800 807 var commentData = comment.data();
801 808 if (commentData.commentInline) {
802 809 this.createComment(comment, commentId)
803 810 } else {
804 811 Rhodecode.comments.createGeneralComment('general', "$placeholder", commentId)
805 812 }
806 813
807 814 return false;
808 815 };
809 816
810 817 this.submitResolution = function(commentId){
811 818 var form = $('#resolve_comment_{0}'.format(commentId)).closest('form');
812 819 var commentForm = form.get(0).CommentForm;
813 820
814 821 var cm = commentForm.getCmInstance();
815 822 var renderer = templateContext.visual.default_renderer;
816 823 if (renderer == 'rst'){
817 824 var commentUrl = '`#{0} <{1}#comment-{0}>`_'.format(commentId, commentForm.selfUrl);
818 825 } else if (renderer == 'markdown') {
819 826 var commentUrl = '[#{0}]({1}#comment-{0})'.format(commentId, commentForm.selfUrl);
820 827 } else {
821 828 var commentUrl = '{1}#comment-{0}'.format(commentId, commentForm.selfUrl);
822 829 }
823 830
824 831 cm.setValue(_gettext('TODO from comment {0} was fixed.').format(commentUrl));
825 832 form.submit();
826 833 return false;
827 834 };
828 835
829 836 };
@@ -1,230 +1,235 b''
1 1 /**
2 2 @license @nocompile
3 3 Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
4 4 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5 5 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6 6 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7 7 Code distributed by Google as part of the polymer project is also
8 8 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9 9 */
10 10 (function(){/*
11 11
12 12 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
13 13 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
14 14 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
15 15 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
16 16 Code distributed by Google as part of the polymer project is also
17 17 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
18 18 */
19 'use strict';var p,aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)},ea="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this;function ha(){ha=function(){};ea.Symbol||(ea.Symbol=ia)}var ia=function(){var a=0;return function(b){return"jscomp_symbol_"+(b||"")+a++}}();
20 function ja(){ha();var a=ea.Symbol.iterator;a||(a=ea.Symbol.iterator=ea.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&aa(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return ka(this)}});ja=function(){}}function ka(a){var b=0;return la(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})}function la(a){ja();a={next:a};a[ea.Symbol.iterator]=function(){return this};return a}function ma(a){ja();var b=a[Symbol.iterator];return b?b.call(a):ka(a)}
21 function na(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}
19 'use strict';var n,ca="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)},q="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this;function da(){da=function(){};q.Symbol||(q.Symbol=ea)}var ea=function(){var a=0;return function(b){return"jscomp_symbol_"+(b||"")+a++}}();
20 function fa(){da();var a=q.Symbol.iterator;a||(a=q.Symbol.iterator=q.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&ca(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return ha(this)}});fa=function(){}}function ha(a){var b=0;return ia(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})}function ia(a){fa();a={next:a};a[q.Symbol.iterator]=function(){return this};return a}function ja(a){fa();var b=a[Symbol.iterator];return b?b.call(a):ha(a)}
21 function ka(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}
22 22 (function(){if(!function(){var a=document.createEvent("Event");a.initEvent("foo",!0,!0);a.preventDefault();return a.defaultPrevented}()){var a=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(a.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var b=/Trident/.test(navigator.userAgent);if(!window.CustomEvent||b&&"function"!==typeof window.CustomEvent)window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");
23 23 c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c},window.CustomEvent.prototype=window.Event.prototype;if(!window.Event||b&&"function"!==typeof window.Event){var c=window.Event;window.Event=function(a,b){b=b||{};var c=document.createEvent("Event");c.initEvent(a,!!b.bubbles,!!b.cancelable);return c};if(c)for(var d in c)window.Event[d]=c[d];window.Event.prototype=c.prototype}if(!window.MouseEvent||b&&"function"!==typeof window.MouseEvent){b=window.MouseEvent;window.MouseEvent=function(a,
24 24 b){b=b||{};var c=document.createEvent("MouseEvent");c.initMouseEvent(a,!!b.bubbles,!!b.cancelable,b.view||window,b.detail,b.screenX,b.screenY,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,b.relatedTarget);return c};if(b)for(d in b)window.MouseEvent[d]=b[d];window.MouseEvent.prototype=b.prototype}Array.from||(Array.from=function(a){return[].slice.call(a)});Object.assign||(Object.assign=function(a,b){for(var c=[].slice.call(arguments,1),d=0,e;d<c.length;d++)if(e=c[d])for(var f=
25 a,m=e,n=Object.getOwnPropertyNames(m),t=0;t<n.length;t++)e=n[t],f[e]=m[e];return a})})(window.WebComponents);(function(){function a(){}function b(a,b){if(!a.childNodes.length)return[];switch(a.nodeType){case Node.DOCUMENT_NODE:return ya.call(a,b);case Node.DOCUMENT_FRAGMENT_NODE:return qb.call(a,b);default:return ba.call(a,b)}}var c="undefined"===typeof HTMLTemplateElement,d=!(document.createDocumentFragment().cloneNode()instanceof DocumentFragment),e=!1;/Trident/.test(navigator.userAgent)&&function(){function a(a,b){if(a instanceof DocumentFragment)for(var d;d=a.firstChild;)c.call(this,d,b);else c.call(this,
25 a,m=e,p=Object.getOwnPropertyNames(m),x=0;x<p.length;x++)e=p[x],f[e]=m[e];return a})})(window.WebComponents);(function(){function a(){}function b(a,b){if(!a.childNodes.length)return[];switch(a.nodeType){case Node.DOCUMENT_NODE:return va.call(a,b);case Node.DOCUMENT_FRAGMENT_NODE:return jb.call(a,b);default:return Y.call(a,b)}}var c="undefined"===typeof HTMLTemplateElement,d=!(document.createDocumentFragment().cloneNode()instanceof DocumentFragment),e=!1;/Trident/.test(navigator.userAgent)&&function(){function a(a,b){if(a instanceof DocumentFragment)for(var d;d=a.firstChild;)c.call(this,d,b);else c.call(this,
26 26 a,b);return a}e=!0;var b=Node.prototype.cloneNode;Node.prototype.cloneNode=function(a){a=b.call(this,a);this instanceof DocumentFragment&&(a.__proto__=DocumentFragment.prototype);return a};DocumentFragment.prototype.querySelectorAll=HTMLElement.prototype.querySelectorAll;DocumentFragment.prototype.querySelector=HTMLElement.prototype.querySelector;Object.defineProperties(DocumentFragment.prototype,{nodeType:{get:function(){return Node.DOCUMENT_FRAGMENT_NODE},configurable:!0},localName:{get:function(){},
27 27 configurable:!0},nodeName:{get:function(){return"#document-fragment"},configurable:!0}});var c=Node.prototype.insertBefore;Node.prototype.insertBefore=a;var d=Node.prototype.appendChild;Node.prototype.appendChild=function(b){b instanceof DocumentFragment?a.call(this,b,null):d.call(this,b);return b};var f=Node.prototype.removeChild,h=Node.prototype.replaceChild;Node.prototype.replaceChild=function(b,c){b instanceof DocumentFragment?(a.call(this,b,c),f.call(this,c)):h.call(this,b,c);return c};Document.prototype.createDocumentFragment=
28 function(){var a=this.createElement("df");a.__proto__=DocumentFragment.prototype;return a};var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){b=g.call(this,a,b||!1);a instanceof DocumentFragment&&(b.__proto__=DocumentFragment.prototype);return b}}();var f=Node.prototype.cloneNode,h=Document.prototype.createElement,g=Document.prototype.importNode,k=Node.prototype.removeChild,l=Node.prototype.appendChild,m=Node.prototype.replaceChild,n=DOMParser.prototype.parseFromString,
29 t=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),C=Object.getOwnPropertyDescriptor(window.Node.prototype,"childNodes"),ba=Element.prototype.querySelectorAll,ya=Document.prototype.querySelectorAll,qb=DocumentFragment.prototype.querySelectorAll,rb=function(){if(!c){var a=document.createElement("template"),b=document.createElement("template");b.content.appendChild(document.createElement("div"));a.content.appendChild(b);a=a.cloneNode(!0);return 0===a.content.childNodes.length||
30 0===a.content.firstChild.content.childNodes.length||d}}();if(c){var V=document.implementation.createHTMLDocument("template"),D=!0,ca=document.createElement("style");ca.textContent="template{display:none;}";var oa=document.head;oa.insertBefore(ca,oa.firstElementChild);a.prototype=Object.create(HTMLElement.prototype);var za=!document.createElement("div").hasOwnProperty("innerHTML");a.I=function(b){if(!b.content&&b.namespaceURI===document.documentElement.namespaceURI){b.content=V.createDocumentFragment();
31 for(var c;c=b.firstChild;)l.call(b.content,c);if(za)b.__proto__=a.prototype;else if(b.cloneNode=function(b){return a.a(this,b)},D)try{T(b),da(b)}catch(Gh){D=!1}a.C(b.content)}};var fa={option:["select"],thead:["table"],col:["colgroup","table"],tr:["tbody","table"],th:["tr","tbody","table"],td:["tr","tbody","table"]},T=function(b){Object.defineProperty(b,"innerHTML",{get:function(){return sb(this)},set:function(b){var c=fa[(/<([a-z][^/\0>\x20\t\r\n\f]+)/i.exec(b)||["",""])[1].toLowerCase()];if(c)for(var d=
32 0;d<c.length;d++)b="<"+c[d]+">"+b+"</"+c[d]+">";V.body.innerHTML=b;for(a.C(V);this.content.firstChild;)k.call(this.content,this.content.firstChild);b=V.body;if(c)for(d=0;d<c.length;d++)b=b.lastChild;for(;b.firstChild;)l.call(this.content,b.firstChild)},configurable:!0})},da=function(a){Object.defineProperty(a,"outerHTML",{get:function(){return"<template>"+this.innerHTML+"</template>"},set:function(a){if(this.parentNode){V.body.innerHTML=a;for(a=this.ownerDocument.createDocumentFragment();V.body.firstChild;)l.call(a,
33 V.body.firstChild);m.call(this.parentNode,a,this)}else throw Error("Failed to set the 'outerHTML' property on 'Element': This element has no parent node.");},configurable:!0})};T(a.prototype);da(a.prototype);a.C=function(c){c=b(c,"template");for(var d=0,e=c.length,f;d<e&&(f=c[d]);d++)a.I(f)};document.addEventListener("DOMContentLoaded",function(){a.C(document)});Document.prototype.createElement=function(){var b=h.apply(this,arguments);"template"===b.localName&&a.I(b);return b};DOMParser.prototype.parseFromString=
34 function(){var b=n.apply(this,arguments);a.C(b);return b};Object.defineProperty(HTMLElement.prototype,"innerHTML",{get:function(){return sb(this)},set:function(b){t.set.call(this,b);a.C(this)},configurable:!0,enumerable:!0});var sf=/[&\u00A0"]/g,Kc=/[&\u00A0<>]/g,Lc=function(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}};ca=function(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b};var tf=ca("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),
35 uf=ca("style script xmp iframe noembed noframes plaintext noscript".split(" ")),sb=function(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):C.get.call(a),e=0,f=d.length,h;e<f&&(h=d[e]);e++){a:{var g=h;var k=a;var l=b;switch(g.nodeType){case Node.ELEMENT_NODE:for(var T=g.localName,m="<"+T,da=g.attributes,n=0;k=da[n];n++)m+=" "+k.name+'="'+k.value.replace(sf,Lc)+'"';m+=">";g=tf[T]?m:m+sb(g,l)+"</"+T+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&uf[k.localName]?g:g.replace(Kc,Lc);
36 break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),Error("not implemented");}}c+=g}return c}}if(c||rb){a.a=function(a,b){var c=f.call(a,!1);this.I&&this.I(c);b&&(l.call(c.content,f.call(a.content,!0)),tb(c.content,a.content));return c};var tb=function(c,d){if(d.querySelectorAll&&(d=b(d,"template"),0!==d.length)){c=b(c,"template");for(var e=0,f=c.length,h,g;e<f;e++)g=d[e],h=c[e],a&&a.I&&a.I(g),m.call(h.parentNode,vf.call(g,!0),h)}},vf=Node.prototype.cloneNode=
37 function(b){if(!e&&d&&this instanceof DocumentFragment)if(b)var c=wf.call(this.ownerDocument,this,!0);else return this.ownerDocument.createDocumentFragment();else this.nodeType===Node.ELEMENT_NODE&&"template"===this.localName&&this.namespaceURI==document.documentElement.namespaceURI?c=a.a(this,b):c=f.call(this,b);b&&tb(c,this);return c},wf=Document.prototype.importNode=function(c,d){d=d||!1;if("template"===c.localName)return a.a(c,d);var e=g.call(this,c,d);if(d){tb(e,c);c=b(e,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"]');
38 for(var f,k=0;k<c.length;k++){f=c[k];d=h.call(document,"script");d.textContent=f.textContent;for(var l=f.attributes,T=0,da;T<l.length;T++)da=l[T],d.setAttribute(da.name,da.value);m.call(f.parentNode,d,f)}}return e}}c&&(window.HTMLTemplateElement=a)})();var pa;Array.isArray?pa=Array.isArray:pa=function(a){return"[object Array]"===Object.prototype.toString.call(a)};var qa=pa;var ra=0,sa,ta="undefined"!==typeof window?window:void 0,ua=ta||{},va=ua.MutationObserver||ua.WebKitMutationObserver,wa="undefined"!==typeof Uint8ClampedArray&&"undefined"!==typeof importScripts&&"undefined"!==typeof MessageChannel;function xa(){return"undefined"!==typeof sa?function(){sa(Aa)}:Ba()}function Ca(){var a=0,b=new va(Aa),c=document.createTextNode("");b.observe(c,{characterData:!0});return function(){c.data=a=++a%2}}
39 function Da(){var a=new MessageChannel;a.port1.onmessage=Aa;return function(){return a.port2.postMessage(0)}}function Ba(){var a=setTimeout;return function(){return a(Aa,1)}}var Ea=Array(1E3);function Aa(){for(var a=0;a<ra;a+=2)(0,Ea[a])(Ea[a+1]),Ea[a]=void 0,Ea[a+1]=void 0;ra=0}var Fa,Ga;
40 if("undefined"===typeof self&&"undefined"!==typeof process&&"[object process]"==={}.toString.call(process))Ga=function(){return process.vb(Aa)};else{var Ha;if(va)Ha=Ca();else{var Ia;if(wa)Ia=Da();else{var Ja;if(void 0===ta&&"function"===typeof require)try{var Ka=require("vertx");sa=Ka.xb||Ka.wb;Ja=xa()}catch(a){Ja=Ba()}else Ja=Ba();Ia=Ja}Ha=Ia}Ga=Ha}Fa=Ga;function La(a,b){Ea[ra]=a;Ea[ra+1]=b;ra+=2;2===ra&&Fa()};function Ma(a,b){var c=this,d=new this.constructor(Na);void 0===d[Oa]&&Pa(d);var e=c.h;if(e){var f=arguments[e-1];La(function(){return Qa(e,d,f,c.f)})}else Ra(c,d,a,b);return d};function Sa(a){if(a&&"object"===typeof a&&a.constructor===this)return a;var b=new this(Na);Ta(b,a);return b};var Oa=Math.random().toString(36).substring(16);function Na(){}var Va=new Ua;function Wa(a){try{return a.then}catch(b){return Va.error=b,Va}}function Xa(a,b,c,d){try{a.call(b,c,d)}catch(e){return e}}function Ya(a,b,c){La(function(a){var d=!1,f=Xa(c,b,function(c){d||(d=!0,b!==c?Ta(a,c):q(a,c))},function(b){d||(d=!0,r(a,b))});!d&&f&&(d=!0,r(a,f))},a)}function Za(a,b){1===b.h?q(a,b.f):2===b.h?r(a,b.f):Ra(b,void 0,function(b){return Ta(a,b)},function(b){return r(a,b)})}
41 function $a(a,b,c){b.constructor===a.constructor&&c===Ma&&b.constructor.resolve===Sa?Za(a,b):c===Va?(r(a,Va.error),Va.error=null):void 0===c?q(a,b):"function"===typeof c?Ya(a,b,c):q(a,b)}function Ta(a,b){if(a===b)r(a,new TypeError("You cannot resolve a promise with itself"));else{var c=typeof b;null===b||"object"!==c&&"function"!==c?q(a,b):$a(a,b,Wa(b))}}function ab(a){a.va&&a.va(a.f);bb(a)}function q(a,b){void 0===a.h&&(a.f=b,a.h=1,0!==a.M.length&&La(bb,a))}
42 function r(a,b){void 0===a.h&&(a.h=2,a.f=b,La(ab,a))}function Ra(a,b,c,d){var e=a.M,f=e.length;a.va=null;e[f]=b;e[f+1]=c;e[f+2]=d;0===f&&a.h&&La(bb,a)}function bb(a){var b=a.M,c=a.h;if(0!==b.length){for(var d,e,f=a.f,h=0;h<b.length;h+=3)d=b[h],e=b[h+c],d?Qa(c,d,e,f):e(f);a.M.length=0}}function Ua(){this.error=null}var cb=new Ua;
43 function Qa(a,b,c,d){var e="function"===typeof c;if(e){try{var f=c(d)}catch(l){cb.error=l,f=cb}if(f===cb){var h=!0;var g=f.error;f.error=null}else var k=!0;if(b===f){r(b,new TypeError("A promises callback cannot return that same promise."));return}}else f=d,k=!0;void 0===b.h&&(e&&k?Ta(b,f):h?r(b,g):1===a?q(b,f):2===a&&r(b,f))}function db(a,b){try{b(function(b){Ta(a,b)},function(b){r(a,b)})}catch(c){r(a,c)}}var eb=0;function Pa(a){a[Oa]=eb++;a.h=void 0;a.f=void 0;a.M=[]};function fb(a,b){this.Ka=a;this.F=new a(Na);this.F[Oa]||Pa(this.F);if(qa(b))if(this.V=this.length=b.length,this.f=Array(this.length),0===this.length)q(this.F,this.f);else{this.length=this.length||0;for(a=0;void 0===this.h&&a<b.length;a++)gb(this,b[a],a);0===this.V&&q(this.F,this.f)}else r(this.F,Error("Array Methods must be provided an Array"))}
44 function gb(a,b,c){var d=a.Ka,e=d.resolve;e===Sa?(e=Wa(b),e===Ma&&void 0!==b.h?hb(a,b.h,c,b.f):"function"!==typeof e?(a.V--,a.f[c]=b):d===u?(d=new d(Na),$a(d,b,e),ib(a,d,c)):ib(a,new d(function(a){return a(b)}),c)):ib(a,e(b),c)}function hb(a,b,c,d){var e=a.F;void 0===e.h&&(a.V--,2===b?r(e,d):a.f[c]=d);0===a.V&&q(e,a.f)}function ib(a,b,c){Ra(b,void 0,function(b){return hb(a,1,c,b)},function(b){return hb(a,2,c,b)})};function jb(a){return(new fb(this,a)).F};function kb(a){var b=this;return qa(a)?new b(function(c,d){for(var e=a.length,f=0;f<e;f++)b.resolve(a[f]).then(c,d)}):new b(function(a,b){return b(new TypeError("You must pass an array to race."))})};function lb(a){var b=new this(Na);r(b,a);return b};function u(a){this[Oa]=eb++;this.f=this.h=void 0;this.M=[];if(Na!==a){if("function"!==typeof a)throw new TypeError("You must pass a resolver function as the first argument to the promise constructor");if(this instanceof u)db(this,a);else throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");}}u.prototype={constructor:u,then:Ma,a:function(a){return this.then(null,a)}};/*
28 function(){var a=this.createElement("df");a.__proto__=DocumentFragment.prototype;return a};var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){b=g.call(this,a,b||!1);a instanceof DocumentFragment&&(b.__proto__=DocumentFragment.prototype);return b}}();var f=Node.prototype.cloneNode,h=Document.prototype.createElement,g=Document.prototype.importNode,k=Node.prototype.removeChild,l=Node.prototype.appendChild,m=Node.prototype.replaceChild,p=DOMParser.prototype.parseFromString,
29 x=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML")||{get:function(){return this.innerHTML},set:function(a){this.innerHTML=a}},N=Object.getOwnPropertyDescriptor(window.Node.prototype,"childNodes")||{get:function(){return this.childNodes}},Y=Element.prototype.querySelectorAll,va=Document.prototype.querySelectorAll,jb=DocumentFragment.prototype.querySelectorAll,kb=function(){if(!c){var a=document.createElement("template"),b=document.createElement("template");b.content.appendChild(document.createElement("div"));
30 a.content.appendChild(b);a=a.cloneNode(!0);return 0===a.content.childNodes.length||0===a.content.firstChild.content.childNodes.length||d}}();if(c){var T=document.implementation.createHTMLDocument("template"),C=!0,Z=document.createElement("style");Z.textContent="template{display:none;}";var oa=document.head;oa.insertBefore(Z,oa.firstElementChild);a.prototype=Object.create(HTMLElement.prototype);var wa=!document.createElement("div").hasOwnProperty("innerHTML");a.H=function(b){if(!b.content&&b.namespaceURI===
31 document.documentElement.namespaceURI){b.content=T.createDocumentFragment();for(var c;c=b.firstChild;)l.call(b.content,c);if(wa)b.__proto__=a.prototype;else if(b.cloneNode=function(b){return a.a(this,b)},C)try{Q(b),aa(b)}catch(rh){C=!1}a.C(b.content)}};var ba={option:["select"],thead:["table"],col:["colgroup","table"],tr:["tbody","table"],th:["tr","tbody","table"],td:["tr","tbody","table"]},Q=function(b){Object.defineProperty(b,"innerHTML",{get:function(){return lb(this)},set:function(b){var c=ba[(/<([a-z][^/\0>\x20\t\r\n\f]+)/i.exec(b)||
32 ["",""])[1].toLowerCase()];if(c)for(var d=0;d<c.length;d++)b="<"+c[d]+">"+b+"</"+c[d]+">";T.body.innerHTML=b;for(a.C(T);this.content.firstChild;)k.call(this.content,this.content.firstChild);b=T.body;if(c)for(d=0;d<c.length;d++)b=b.lastChild;for(;b.firstChild;)l.call(this.content,b.firstChild)},configurable:!0})},aa=function(a){Object.defineProperty(a,"outerHTML",{get:function(){return"<template>"+this.innerHTML+"</template>"},set:function(a){if(this.parentNode){T.body.innerHTML=a;for(a=this.ownerDocument.createDocumentFragment();T.body.firstChild;)l.call(a,
33 T.body.firstChild);m.call(this.parentNode,a,this)}else throw Error("Failed to set the 'outerHTML' property on 'Element': This element has no parent node.");},configurable:!0})};Q(a.prototype);aa(a.prototype);a.C=function(c){c=b(c,"template");for(var d=0,e=c.length,f;d<e&&(f=c[d]);d++)a.H(f)};document.addEventListener("DOMContentLoaded",function(){a.C(document)});Document.prototype.createElement=function(){var b=h.apply(this,arguments);"template"===b.localName&&a.H(b);return b};DOMParser.prototype.parseFromString=
34 function(){var b=p.apply(this,arguments);a.C(b);return b};Object.defineProperty(HTMLElement.prototype,"innerHTML",{get:function(){return lb(this)},set:function(b){x.set.call(this,b);a.C(this)},configurable:!0,enumerable:!0});var bf=/[&\u00A0"]/g,yc=/[&\u00A0<>]/g,zc=function(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}};Z=function(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b};var cf=Z("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),
35 df=Z("style script xmp iframe noembed noframes plaintext noscript".split(" ")),lb=function(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):N.get.call(a),e=0,f=d.length,h;e<f&&(h=d[e]);e++){a:{var g=h;var k=a;var l=b;switch(g.nodeType){case Node.ELEMENT_NODE:for(var Q=g.localName,m="<"+Q,aa=g.attributes,p=0;k=aa[p];p++)m+=" "+k.name+'="'+k.value.replace(bf,zc)+'"';m+=">";g=cf[Q]?m:m+lb(g,l)+"</"+Q+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&df[k.localName]?g:g.replace(yc,zc);break a;
36 case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),Error("not implemented");}}c+=g}return c}}if(c||kb){a.a=function(a,b){var c=f.call(a,!1);this.H&&this.H(c);b&&(l.call(c.content,f.call(a.content,!0)),mb(c.content,a.content));return c};var mb=function(c,d){if(d.querySelectorAll&&(d=b(d,"template"),0!==d.length)){c=b(c,"template");for(var e=0,f=c.length,h,g;e<f;e++)g=d[e],h=c[e],a&&a.H&&a.H(g),m.call(h.parentNode,ef.call(g,!0),h)}},ef=Node.prototype.cloneNode=
37 function(b){if(!e&&d&&this instanceof DocumentFragment)if(b)var c=ff.call(this.ownerDocument,this,!0);else return this.ownerDocument.createDocumentFragment();else this.nodeType===Node.ELEMENT_NODE&&"template"===this.localName&&this.namespaceURI==document.documentElement.namespaceURI?c=a.a(this,b):c=f.call(this,b);b&&mb(c,this);return c},ff=Document.prototype.importNode=function(c,d){d=d||!1;if("template"===c.localName)return a.a(c,d);var e=g.call(this,c,d);if(d){mb(e,c);c=b(e,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"]');
38 for(var f,k=0;k<c.length;k++){f=c[k];d=h.call(document,"script");d.textContent=f.textContent;for(var l=f.attributes,Q=0,aa;Q<l.length;Q++)aa=l[Q],d.setAttribute(aa.name,aa.value);m.call(f.parentNode,d,f)}}return e}}c&&(window.HTMLTemplateElement=a)})();var la=setTimeout;function ma(){}function na(a,b){return function(){a.apply(b,arguments)}}function r(a){if(!(this instanceof r))throw new TypeError("Promises must be constructed via new");if("function"!==typeof a)throw new TypeError("not a function");this.v=0;this.qa=!1;this.j=void 0;this.K=[];pa(a,this)}
39 function qa(a,b){for(;3===a.v;)a=a.j;0===a.v?a.K.push(b):(a.qa=!0,ra(function(){var c=1===a.v?b.Ua:b.Va;if(null===c)(1===a.v?sa:ta)(b.ja,a.j);else{try{var d=c(a.j)}catch(e){ta(b.ja,e);return}sa(b.ja,d)}}))}function sa(a,b){try{if(b===a)throw new TypeError("A promise cannot be resolved with itself.");if(b&&("object"===typeof b||"function"===typeof b)){var c=b.then;if(b instanceof r){a.v=3;a.j=b;ua(a);return}if("function"===typeof c){pa(na(c,b),a);return}}a.v=1;a.j=b;ua(a)}catch(d){ta(a,d)}}
40 function ta(a,b){a.v=2;a.j=b;ua(a)}function ua(a){2===a.v&&0===a.K.length&&ra(function(){a.qa||"undefined"!==typeof console&&console&&console.warn("Possible Unhandled Promise Rejection:",a.j)});for(var b=0,c=a.K.length;b<c;b++)qa(a,a.K[b]);a.K=null}function xa(a,b,c){this.Ua="function"===typeof a?a:null;this.Va="function"===typeof b?b:null;this.ja=c}function pa(a,b){var c=!1;try{a(function(a){c||(c=!0,sa(b,a))},function(a){c||(c=!0,ta(b,a))})}catch(d){c||(c=!0,ta(b,d))}}
41 r.prototype["catch"]=function(a){return this.then(null,a)};r.prototype.then=function(a,b){var c=new this.constructor(ma);qa(this,new xa(a,b,c));return c};r.prototype["finally"]=function(a){var b=this.constructor;return this.then(function(c){return b.resolve(a()).then(function(){return c})},function(c){return b.resolve(a()).then(function(){return b.reject(c)})})};
42 function ya(a){return new r(function(b,c){function d(a,h){try{if(h&&("object"===typeof h||"function"===typeof h)){var g=h.then;if("function"===typeof g){g.call(h,function(b){d(a,b)},c);return}}e[a]=h;0===--f&&b(e)}catch(m){c(m)}}if(!a||"undefined"===typeof a.length)throw new TypeError("Promise.all accepts an array");var e=Array.prototype.slice.call(a);if(0===e.length)return b([]);for(var f=e.length,h=0;h<e.length;h++)d(h,e[h])})}
43 function za(a){return a&&"object"===typeof a&&a.constructor===r?a:new r(function(b){b(a)})}function Aa(a){return new r(function(b,c){c(a)})}function Ba(a){return new r(function(b,c){for(var d=0,e=a.length;d<e;d++)a[d].then(b,c)})}var ra="function"===typeof setImmediate&&function(a){setImmediate(a)}||function(a){la(a,0)};/*
45 44
46 45 Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
47 46 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
48 47 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
49 48 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
50 49 Code distributed by Google as part of the polymer project is also
51 50 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
52 51 */
53 window.Promise||(window.Promise=u,u.prototype["catch"]=u.prototype.a,u.prototype.then=u.prototype.then,u.all=jb,u.race=kb,u.resolve=Sa,u.reject=lb);(function(a){function b(a,b){if("function"===typeof window.CustomEvent)return new CustomEvent(a,b);var c=document.createEvent("CustomEvent");c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c}function c(a){if(C)return a.ownerDocument!==document?a.ownerDocument:null;var b=a.__importDoc;if(!b&&a.parentNode){b=a.parentNode;if("function"===typeof b.closest)b=b.closest("link[rel=import]");else for(;!g(b)&&(b=b.parentNode););a.__importDoc=b}return b}function d(a){var b=m(document,"link[rel=import]:not([import-dependency])"),
54 c=b.length;c?n(b,function(b){return h(b,function(){0===--c&&a()})}):a()}function e(a){function b(){"loading"!==document.readyState&&document.body&&(document.removeEventListener("readystatechange",b),a())}document.addEventListener("readystatechange",b);b()}function f(a){e(function(){return d(function(){return a&&a()})})}function h(a,b){if(a.__loaded)b&&b();else if("script"===a.localName&&!a.src||"style"===a.localName&&!a.firstChild)a.__loaded=!0,b&&b();else{var c=function(d){a.removeEventListener(d.type,
55 c);a.__loaded=!0;b&&b()};a.addEventListener("load",c);oa&&"style"===a.localName||a.addEventListener("error",c)}}function g(a){return a.nodeType===Node.ELEMENT_NODE&&"link"===a.localName&&"import"===a.rel}function k(){var a=this;this.a={};this.b=0;this.c=new MutationObserver(function(b){return a.Va(b)});this.c.observe(document.head,{childList:!0,subtree:!0});this.loadImports(document)}function l(a){n(m(a,"template"),function(a){n(m(a.content,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"],script[type="module"]'),
56 function(a){var b=document.createElement("script");n(a.attributes,function(a){return b.setAttribute(a.name,a.value)});b.textContent=a.textContent;a.parentNode.replaceChild(b,a)});l(a.content)})}function m(a,b){return a.childNodes.length?a.querySelectorAll(b):ba}function n(a,b,c){var d=a?a.length:0,e=c?-1:1;for(c=c?d-1:0;c<d&&0<=c;c+=e)b(a[c],c)}var t=document.createElement("link"),C="import"in t,ba=t.querySelectorAll("*"),ya=null;!1==="currentScript"in document&&Object.defineProperty(document,"currentScript",
57 {get:function(){return ya||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null)},configurable:!0});var qb=/(url\()([^)]*)(\))/g,rb=/(@import[\s]+(?!url\())([^;]*)(;)/g,V=/(<link[^>]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,D={Pa:function(a,b){a.href&&a.setAttribute("href",D.ba(a.getAttribute("href"),b));a.src&&a.setAttribute("src",D.ba(a.getAttribute("src"),b));if("style"===a.localName){var c=D.za(a.textContent,b,qb);a.textContent=D.za(c,b,rb)}},za:function(a,b,c){return a.replace(c,
58 function(a,c,d,e){a=d.replace(/["']/g,"");b&&(a=D.ba(a,b));return c+"'"+a+"'"+e})},ba:function(a,b){if(void 0===D.ha){D.ha=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";D.ha="http://a/c%20d"===c.href}catch(Kc){}}if(D.ha)return(new URL(a,b)).href;c=D.Ha;c||(c=document.implementation.createHTMLDocument("temp"),D.Ha=c,c.ra=c.createElement("base"),c.head.appendChild(c.ra),c.qa=c.createElement("a"));c.ra.href=b;c.qa.href=a;return c.qa.href||a}},ca={async:!0,load:function(a,b,c){if(a)if(a.match(/^data:/)){a=
59 a.split(",");var d=a[1];d=-1<a[0].indexOf(";base64")?atob(d):decodeURIComponent(d);b(d)}else{var e=new XMLHttpRequest;e.open("GET",a,ca.async);e.onload=function(){var a=e.responseURL||e.getResponseHeader("Location");a&&0===a.indexOf("/")&&(a=(location.origin||location.protocol+"//"+location.host)+a);var d=e.response||e.responseText;304===e.status||0===e.status||200<=e.status&&300>e.status?b(d,a):c(d)};e.send()}else c("error: href must be specified")}},oa=/Trident/.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent);
60 k.prototype.loadImports=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){return b.o(a)})};k.prototype.o=function(a){var b=this,c=a.href;if(void 0!==this.a[c]){var d=this.a[c];d&&d.__loaded&&(a.__import=d,this.i(a))}else this.b++,this.a[c]="pending",ca.load(c,function(a,d){a=b.Wa(a,d||c);b.a[c]=a;b.b--;b.loadImports(a);b.J()},function(){b.a[c]=null;b.b--;b.J()})};k.prototype.Wa=function(a,b){if(!a)return document.createDocumentFragment();oa&&(a=a.replace(V,function(a,b,c){return-1===
61 a.indexOf("type=")?b+" type=import-disable "+c:a}));var c=document.createElement("template");c.innerHTML=a;if(c.content)a=c.content,l(a);else for(a=document.createDocumentFragment();c.firstChild;)a.appendChild(c.firstChild);if(c=a.querySelector("base"))b=D.ba(c.getAttribute("href"),b),c.removeAttribute("href");c=m(a,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"],script[type="module"]');
62 var d=0;n(c,function(a){h(a);D.Pa(a,b);a.setAttribute("import-dependency","");if("script"===a.localName&&!a.src&&a.textContent){if("module"===a.type)throw Error("Inline module scripts are not supported in HTML Imports.");a.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(a.textContent+("\n//# sourceURL="+b+(d?"-"+d:"")+".js\n")));a.textContent="";d++}});return a};k.prototype.J=function(){var a=this;if(!this.b){this.c.disconnect();this.flatten(document);var b=!1,c=!1,d=function(){c&&
63 b&&(a.loadImports(document),a.b||(a.c.observe(document.head,{childList:!0,subtree:!0}),a.Ta()))};this.Ya(function(){c=!0;d()});this.Xa(function(){b=!0;d()})}};k.prototype.flatten=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){var c=b.a[a.href];(a.__import=c)&&c.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(b.a[a.href]=a,a.readyState="loading",a.__import=a,b.flatten(c),a.appendChild(c))})};k.prototype.Xa=function(a){function b(e){if(e<d){var f=c[e],g=document.createElement("script");f.removeAttribute("import-dependency");
64 n(f.attributes,function(a){return g.setAttribute(a.name,a.value)});ya=g;f.parentNode.replaceChild(g,f);h(g,function(){ya=null;b(e+1)})}else a()}var c=m(document,"script[import-dependency]"),d=c.length;b(0)};k.prototype.Ya=function(a){var b=m(document,"style[import-dependency],link[rel=stylesheet][import-dependency]"),d=b.length;if(d){var e=oa&&!!document.querySelector("link[rel=stylesheet][href][type=import-disable]");n(b,function(b){h(b,function(){b.removeAttribute("import-dependency");0===--d&&
65 a()});if(e&&b.parentNode!==document.head){var f=document.createElement(b.localName);f.__appliedElement=b;f.setAttribute("type","import-placeholder");b.parentNode.insertBefore(f,b.nextSibling);for(f=c(b);f&&c(f);)f=c(f);f.parentNode!==document.head&&(f=null);document.head.insertBefore(b,f);b.removeAttribute("type")}})}else a()};k.prototype.Ta=function(){var a=this,b=m(document,"link[rel=import]");n(b,function(b){return a.i(b)},!0)};k.prototype.i=function(a){a.__loaded||(a.__loaded=!0,a.import&&(a.import.readyState=
66 "complete"),a.dispatchEvent(b(a.import?"load":"error",{bubbles:!1,cancelable:!1,detail:void 0})))};k.prototype.Va=function(a){var b=this;n(a,function(a){return n(a.addedNodes,function(a){a&&a.nodeType===Node.ELEMENT_NODE&&(g(a)?b.o(a):b.loadImports(a))})})};var za=null;if(C)t=m(document,"link[rel=import]"),n(t,function(a){a.import&&"loading"===a.import.readyState||(a.__loaded=!0)}),t=function(a){a=a.target;g(a)&&(a.__loaded=!0)},document.addEventListener("load",t,!0),document.addEventListener("error",
67 t,!0);else{var fa=Object.getOwnPropertyDescriptor(Node.prototype,"baseURI");Object.defineProperty((!fa||fa.configurable?Node:Element).prototype,"baseURI",{get:function(){var a=g(this)?this:c(this);return a?a.href:fa&&fa.get?fa.get.call(this):(document.querySelector("base")||window.location).href},configurable:!0,enumerable:!0});Object.defineProperty(HTMLLinkElement.prototype,"import",{get:function(){return this.__import||null},configurable:!0,enumerable:!0});e(function(){za=new k})}f(function(){return document.dispatchEvent(b("HTMLImportsLoaded",
68 {cancelable:!0,bubbles:!0,detail:void 0}))});a.useNative=C;a.whenReady=f;a.importForElement=c;a.loadImports=function(a){za&&za.loadImports(a)}})(window.HTMLImports=window.HTMLImports||{});/*
52 if(!window.Promise){window.Promise=r;r.prototype.then=r.prototype.then;r.all=ya;r.race=Ba;r.resolve=za;r.reject=Aa;var Ca=document.createTextNode(""),Da=[];(new MutationObserver(function(){for(var a=Da.length,b=0;b<a;b++)Da[b]();Da.splice(0,a)})).observe(Ca,{characterData:!0});ra=function(a){Da.push(a);Ca.textContent=0<Ca.textContent.length?"":"a"}};(function(a){function b(a,b){if("function"===typeof window.CustomEvent)return new CustomEvent(a,b);var c=document.createEvent("CustomEvent");c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c}function c(a){if(N)return a.ownerDocument!==document?a.ownerDocument:null;var b=a.__importDoc;if(!b&&a.parentNode){b=a.parentNode;if("function"===typeof b.closest)b=b.closest("link[rel=import]");else for(;!g(b)&&(b=b.parentNode););a.__importDoc=b}return b}function d(a){var b=m(document,"link[rel=import]:not([import-dependency])"),
53 c=b.length;c?p(b,function(b){return h(b,function(){0===--c&&a()})}):a()}function e(a){function b(){"loading"!==document.readyState&&document.body&&(document.removeEventListener("readystatechange",b),a())}document.addEventListener("readystatechange",b);b()}function f(a){e(function(){return d(function(){return a&&a()})})}function h(a,b){if(a.__loaded)b&&b();else if("script"===a.localName&&!a.src||"style"===a.localName&&!a.firstChild)a.__loaded=!0,b&&b();else{var c=function(d){a.removeEventListener(d.type,
54 c);a.__loaded=!0;b&&b()};a.addEventListener("load",c);oa&&"style"===a.localName||a.addEventListener("error",c)}}function g(a){return a.nodeType===Node.ELEMENT_NODE&&"link"===a.localName&&"import"===a.rel}function k(){var a=this;this.a={};this.b=0;this.c=new MutationObserver(function(b){return a.Qa(b)});this.c.observe(document.head,{childList:!0,subtree:!0});this.loadImports(document)}function l(a){p(m(a,"template"),function(a){p(m(a.content,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"],script[type="module"]'),
55 function(a){var b=document.createElement("script");p(a.attributes,function(a){return b.setAttribute(a.name,a.value)});b.textContent=a.textContent;a.parentNode.replaceChild(b,a)});l(a.content)})}function m(a,b){return a.childNodes.length?a.querySelectorAll(b):Y}function p(a,b,c){var d=a?a.length:0,e=c?-1:1;for(c=c?d-1:0;c<d&&0<=c;c+=e)b(a[c],c)}var x=document.createElement("link"),N="import"in x,Y=x.querySelectorAll("*"),va=null;!1==="currentScript"in document&&Object.defineProperty(document,"currentScript",
56 {get:function(){return va||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null)},configurable:!0});var jb=/(url\()([^)]*)(\))/g,kb=/(@import[\s]+(?!url\())([^;]*)(;)/g,T=/(<link[^>]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,C={La:function(a,b){a.href&&a.setAttribute("href",C.Z(a.getAttribute("href"),b));a.src&&a.setAttribute("src",C.Z(a.getAttribute("src"),b));if("style"===a.localName){var c=C.ua(a.textContent,b,jb);a.textContent=C.ua(c,b,kb)}},ua:function(a,b,c){return a.replace(c,
57 function(a,c,d,e){a=d.replace(/["']/g,"");b&&(a=C.Z(a,b));return c+"'"+a+"'"+e})},Z:function(a,b){if(void 0===C.fa){C.fa=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";C.fa="http://a/c%20d"===c.href}catch(yc){}}if(C.fa)return(new URL(a,b)).href;c=C.Ea;c||(c=document.implementation.createHTMLDocument("temp"),C.Ea=c,c.ma=c.createElement("base"),c.head.appendChild(c.ma),c.la=c.createElement("a"));c.ma.href=b;c.la.href=a;return c.la.href||a}},Z={async:!0,load:function(a,b,c){if(a)if(a.match(/^data:/)){a=
58 a.split(",");var d=a[1];d=-1<a[0].indexOf(";base64")?atob(d):decodeURIComponent(d);b(d)}else{var e=new XMLHttpRequest;e.open("GET",a,Z.async);e.onload=function(){var a=e.responseURL||e.getResponseHeader("Location");a&&0===a.indexOf("/")&&(a=(location.origin||location.protocol+"//"+location.host)+a);var d=e.response||e.responseText;304===e.status||0===e.status||200<=e.status&&300>e.status?b(d,a):c(d)};e.send()}else c("error: href must be specified")}},oa=/Trident/.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent);
59 k.prototype.loadImports=function(a){var b=this;a=m(a,"link[rel=import]");p(a,function(a){return b.h(a)})};k.prototype.h=function(a){var b=this,c=a.href;if(void 0!==this.a[c]){var d=this.a[c];d&&d.__loaded&&(a.__import=d,this.f(a))}else this.b++,this.a[c]="pending",Z.load(c,function(a,d){a=b.Ra(a,d||c);b.a[c]=a;b.b--;b.loadImports(a);b.o()},function(){b.a[c]=null;b.b--;b.o()})};k.prototype.Ra=function(a,b){if(!a)return document.createDocumentFragment();oa&&(a=a.replace(T,function(a,b,c){return-1===
60 a.indexOf("type=")?b+" type=import-disable "+c:a}));var c=document.createElement("template");c.innerHTML=a;if(c.content)a=c.content,l(a);else for(a=document.createDocumentFragment();c.firstChild;)a.appendChild(c.firstChild);if(c=a.querySelector("base"))b=C.Z(c.getAttribute("href"),b),c.removeAttribute("href");c=m(a,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"],script[type="module"]');
61 var d=0;p(c,function(a){h(a);C.La(a,b);a.setAttribute("import-dependency","");if("script"===a.localName&&!a.src&&a.textContent){if("module"===a.type)throw Error("Inline module scripts are not supported in HTML Imports.");a.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(a.textContent+("\n//# sourceURL="+b+(d?"-"+d:"")+".js\n")));a.textContent="";d++}});return a};k.prototype.o=function(){var a=this;if(!this.b){this.c.disconnect();this.flatten(document);var b=!1,c=!1,d=function(){c&&
62 b&&(a.loadImports(document),a.b||(a.c.observe(document.head,{childList:!0,subtree:!0}),a.ha()))};this.Ta(function(){c=!0;d()});this.Sa(function(){b=!0;d()})}};k.prototype.flatten=function(a){var b=this;a=m(a,"link[rel=import]");p(a,function(a){var c=b.a[a.href];(a.__import=c)&&c.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(b.a[a.href]=a,a.readyState="loading",a.__import=a,b.flatten(c),a.appendChild(c))})};k.prototype.Sa=function(a){function b(e){if(e<d){var f=c[e],g=document.createElement("script");f.removeAttribute("import-dependency");
63 p(f.attributes,function(a){return g.setAttribute(a.name,a.value)});va=g;f.parentNode.replaceChild(g,f);h(g,function(){va=null;b(e+1)})}else a()}var c=m(document,"script[import-dependency]"),d=c.length;b(0)};k.prototype.Ta=function(a){var b=m(document,"style[import-dependency],link[rel=stylesheet][import-dependency]"),d=b.length;if(d){var e=oa&&!!document.querySelector("link[rel=stylesheet][href][type=import-disable]");p(b,function(b){h(b,function(){b.removeAttribute("import-dependency");0===--d&&
64 a()});if(e&&b.parentNode!==document.head){var f=document.createElement(b.localName);f.__appliedElement=b;f.setAttribute("type","import-placeholder");b.parentNode.insertBefore(f,b.nextSibling);for(f=c(b);f&&c(f);)f=c(f);f.parentNode!==document.head&&(f=null);document.head.insertBefore(b,f);b.removeAttribute("type")}})}else a()};k.prototype.ha=function(){var a=this,b=m(document,"link[rel=import]");p(b,function(b){return a.f(b)},!0)};k.prototype.f=function(a){a.__loaded||(a.__loaded=!0,a.import&&(a.import.readyState=
65 "complete"),a.dispatchEvent(b(a.import?"load":"error",{bubbles:!1,cancelable:!1,detail:void 0})))};k.prototype.Qa=function(a){var b=this;p(a,function(a){return p(a.addedNodes,function(a){a&&a.nodeType===Node.ELEMENT_NODE&&(g(a)?b.h(a):b.loadImports(a))})})};var wa=null;if(N)x=m(document,"link[rel=import]"),p(x,function(a){a.import&&"loading"===a.import.readyState||(a.__loaded=!0)}),x=function(a){a=a.target;g(a)&&(a.__loaded=!0)},document.addEventListener("load",x,!0),document.addEventListener("error",
66 x,!0);else{var ba=Object.getOwnPropertyDescriptor(Node.prototype,"baseURI");Object.defineProperty((!ba||ba.configurable?Node:Element).prototype,"baseURI",{get:function(){var a=g(this)?this:c(this);return a?a.href:ba&&ba.get?ba.get.call(this):(document.querySelector("base")||window.location).href},configurable:!0,enumerable:!0});Object.defineProperty(HTMLLinkElement.prototype,"import",{get:function(){return this.__import||null},configurable:!0,enumerable:!0});e(function(){wa=new k})}f(function(){return document.dispatchEvent(b("HTMLImportsLoaded",
67 {cancelable:!0,bubbles:!0,detail:void 0}))});a.useNative=N;a.whenReady=f;a.importForElement=c;a.loadImports=function(a){wa&&wa.loadImports(a)}})(window.HTMLImports=window.HTMLImports||{});/*
69 68
70 69 Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
71 70 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
72 71 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
73 72 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
74 73 Code distributed by Google as part of the polymer project is also
75 74 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
76 75 */
77 window.WebComponents=window.WebComponents||{flags:{}};var mb=document.querySelector('script[src*="webcomponents-lite.js"]'),nb=/wc-(.+)/,v={};if(!v.noOpts){location.search.slice(1).split("&").forEach(function(a){a=a.split("=");var b;a[0]&&(b=a[0].match(nb))&&(v[b[1]]=a[1]||!0)});if(mb)for(var ob=0,pb;pb=mb.attributes[ob];ob++)"src"!==pb.name&&(v[pb.name]=pb.value||!0);if(v.log&&v.log.split){var ub=v.log.split(",");v.log={};ub.forEach(function(a){v.log[a]=!0})}else v.log={}}
78 window.WebComponents.flags=v;var vb=v.shadydom;vb&&(window.ShadyDOM=window.ShadyDOM||{},window.ShadyDOM.force=vb);var wb=v.register||v.ce;wb&&window.customElements&&(window.customElements.forcePolyfill=wb);/*
76 window.WebComponents=window.WebComponents||{flags:{}};var Ea=document.querySelector('script[src*="webcomponents-lite.js"]'),Fa=/wc-(.+)/,t={};if(!t.noOpts){location.search.slice(1).split("&").forEach(function(a){a=a.split("=");var b;a[0]&&(b=a[0].match(Fa))&&(t[b[1]]=a[1]||!0)});if(Ea)for(var Ga=0,Ha=void 0;Ha=Ea.attributes[Ga];Ga++)"src"!==Ha.name&&(t[Ha.name]=Ha.value||!0);if(t.log&&t.log.split){var Ia=t.log.split(",");t.log={};Ia.forEach(function(a){t.log[a]=!0})}else t.log={}}
77 window.WebComponents.flags=t;var Ja=t.shadydom;Ja&&(window.ShadyDOM=window.ShadyDOM||{},window.ShadyDOM.force=Ja);var Ka=t.register||t.ce;Ka&&window.customElements&&(window.customElements.forcePolyfill=Ka);/*
79 78
80 79 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
81 80 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
82 81 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
83 82 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
84 83 Code distributed by Google as part of the polymer project is also
85 84 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
86 85 */
87 function xb(){this.ya=this.root=null;this.Z=!1;this.D=this.U=this.la=this.assignedSlot=this.assignedNodes=this.K=null;this.childNodes=this.nextSibling=this.previousSibling=this.lastChild=this.firstChild=this.parentNode=this.N=void 0;this.Da=this.ta=!1;this.S={}}xb.prototype.toJSON=function(){return{}};function w(a){a.fa||(a.fa=new xb);return a.fa}function x(a){return a&&a.fa};var y=window.ShadyDOM||{};y.Ra=!(!Element.prototype.attachShadow||!Node.prototype.getRootNode);var yb=Object.getOwnPropertyDescriptor(Node.prototype,"firstChild");y.w=!!(yb&&yb.configurable&&yb.get);y.na=y.force||!y.Ra;var zb=navigator.userAgent.match("Trident"),Ab=navigator.userAgent.match("Edge");void 0===y.Ba&&(y.Ba=y.w&&(zb||Ab));function Bb(a){return(a=x(a))&&void 0!==a.firstChild}function z(a){return"ShadyRoot"===a.La}function Cb(a){a=a.getRootNode();if(z(a))return a}
88 var Db=Element.prototype,Eb=Db.matches||Db.matchesSelector||Db.mozMatchesSelector||Db.msMatchesSelector||Db.oMatchesSelector||Db.webkitMatchesSelector;function Fb(a,b){if(a&&b)for(var c=Object.getOwnPropertyNames(b),d=0,e;d<c.length&&(e=c[d]);d++){var f=Object.getOwnPropertyDescriptor(b,e);f&&Object.defineProperty(a,e,f)}}function Gb(a,b){for(var c=[],d=1;d<arguments.length;++d)c[d-1]=arguments[d];for(d=0;d<c.length;d++)Fb(a,c[d]);return a}function Hb(a,b){for(var c in b)a[c]=b[c]}
89 var Ib=document.createTextNode(""),Jb=0,Kb=[];(new MutationObserver(function(){for(;Kb.length;)try{Kb.shift()()}catch(a){throw Ib.textContent=Jb++,a;}})).observe(Ib,{characterData:!0});function Lb(a){Kb.push(a);Ib.textContent=Jb++}var Mb=!!document.contains;function Nb(a,b){for(;b;){if(b==a)return!0;b=b.parentNode}return!1}
90 function Ob(a){for(var b=a.length-1;0<=b;b--){var c=a[b],d=c.getAttribute("id")||c.getAttribute("name");d&&"length"!==d&&isNaN(d)&&(a[d]=c)}a.item=function(b){return a[b]};a.namedItem=function(b){if("length"!==b&&isNaN(b)&&a[b])return a[b];for(var c=ma(a),d=c.next();!d.done;d=c.next())if(d=d.value,(d.getAttribute("id")||d.getAttribute("name"))==b)return d;return null};return a};var Pb=[],Qb;function Rb(a){Qb||(Qb=!0,Lb(Sb));Pb.push(a)}function Sb(){Qb=!1;for(var a=!!Pb.length;Pb.length;)Pb.shift()();return a}Sb.list=Pb;function Tb(){this.a=!1;this.addedNodes=[];this.removedNodes=[];this.Y=new Set}function Ub(a){a.a||(a.a=!0,Lb(function(){Vb(a)}))}function Vb(a){if(a.a){a.a=!1;var b=a.takeRecords();b.length&&a.Y.forEach(function(a){a(b)})}}Tb.prototype.takeRecords=function(){if(this.addedNodes.length||this.removedNodes.length){var a=[{addedNodes:this.addedNodes,removedNodes:this.removedNodes}];this.addedNodes=[];this.removedNodes=[];return a}return[]};
91 function Wb(a,b){var c=w(a);c.K||(c.K=new Tb);c.K.Y.add(b);var d=c.K;return{Ia:b,H:d,Ma:a,takeRecords:function(){return d.takeRecords()}}}function Xb(a){var b=a&&a.H;b&&(b.Y.delete(a.Ia),b.Y.size||(w(a.Ma).K=null))}
92 function Yb(a,b){var c=b.getRootNode();return a.map(function(a){var b=c===a.target.getRootNode();if(b&&a.addedNodes){if(b=Array.from(a.addedNodes).filter(function(a){return c===a.getRootNode()}),b.length)return a=Object.create(a),Object.defineProperty(a,"addedNodes",{value:b,configurable:!0}),a}else if(b)return a}).filter(function(a){return a})};var A={},Zb=Element.prototype.insertBefore,$b=Element.prototype.replaceChild,ac=Element.prototype.removeChild,bc=Element.prototype.setAttribute,cc=Element.prototype.removeAttribute,dc=Element.prototype.cloneNode,ec=Document.prototype.importNode,fc=Element.prototype.addEventListener,gc=Element.prototype.removeEventListener,hc=Window.prototype.addEventListener,ic=Window.prototype.removeEventListener,jc=Element.prototype.dispatchEvent,kc=Node.prototype.contains||HTMLElement.prototype.contains,lc=Document.prototype.getElementById,
93 mc=Element.prototype.querySelector,nc=DocumentFragment.prototype.querySelector,oc=Document.prototype.querySelector,pc=Element.prototype.querySelectorAll,qc=DocumentFragment.prototype.querySelectorAll,rc=Document.prototype.querySelectorAll;A.appendChild=Element.prototype.appendChild;A.insertBefore=Zb;A.replaceChild=$b;A.removeChild=ac;A.setAttribute=bc;A.removeAttribute=cc;A.cloneNode=dc;A.importNode=ec;A.addEventListener=fc;A.removeEventListener=gc;A.fb=hc;A.gb=ic;A.dispatchEvent=jc;A.contains=kc;
94 A.getElementById=lc;A.pb=mc;A.sb=nc;A.nb=oc;A.querySelector=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return mc.call(this,a);case Node.DOCUMENT_NODE:return oc.call(this,a);default:return nc.call(this,a)}};A.qb=pc;A.tb=qc;A.ob=rc;A.querySelectorAll=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return pc.call(this,a);case Node.DOCUMENT_NODE:return rc.call(this,a);default:return qc.call(this,a)}};var sc=/[&\u00A0"]/g,tc=/[&\u00A0<>]/g;function uc(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}}function vc(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}var wc=vc("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),xc=vc("style script xmp iframe noembed noframes plaintext noscript".split(" "));
95 function yc(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):a.childNodes,e=0,f=d.length,h;e<f&&(h=d[e]);e++){a:{var g=h;var k=a;var l=b;switch(g.nodeType){case Node.ELEMENT_NODE:for(var m=g.localName,n="<"+m,t=g.attributes,C=0;k=t[C];C++)n+=" "+k.name+'="'+k.value.replace(sc,uc)+'"';n+=">";g=wc[m]?n:n+yc(g,l)+"</"+m+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&xc[k.localName]?g:g.replace(tc,uc);break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),
96 Error("not implemented");}}c+=g}return c};var B={},E=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),F=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1);function zc(a){var b=[];E.currentNode=a;for(a=E.firstChild();a;)b.push(a),a=E.nextSibling();return b}B.parentNode=function(a){E.currentNode=a;return E.parentNode()};B.firstChild=function(a){E.currentNode=a;return E.firstChild()};B.lastChild=function(a){E.currentNode=a;return E.lastChild()};B.previousSibling=function(a){E.currentNode=a;return E.previousSibling()};
97 B.nextSibling=function(a){E.currentNode=a;return E.nextSibling()};B.childNodes=zc;B.parentElement=function(a){F.currentNode=a;return F.parentNode()};B.firstElementChild=function(a){F.currentNode=a;return F.firstChild()};B.lastElementChild=function(a){F.currentNode=a;return F.lastChild()};B.previousElementSibling=function(a){F.currentNode=a;return F.previousSibling()};B.nextElementSibling=function(a){F.currentNode=a;return F.nextSibling()};
98 B.children=function(a){var b=[];F.currentNode=a;for(a=F.firstChild();a;)b.push(a),a=F.nextSibling();return Ob(b)};B.innerHTML=function(a){return yc(a,function(a){return zc(a)})};B.textContent=function(a){switch(a.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:a=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);for(var b="",c;c=a.nextNode();)b+=c.nodeValue;return b;default:return a.nodeValue}};var G={},Ac=y.w,Bc=[Node.prototype,Element.prototype,HTMLElement.prototype];function H(a){var b;a:{for(b=0;b<Bc.length;b++){var c=Bc[b];if(c.hasOwnProperty(a)){b=c;break a}}b=void 0}if(!b)throw Error("Could not find descriptor for "+a);return Object.getOwnPropertyDescriptor(b,a)}
99 var I=Ac?{parentNode:H("parentNode"),firstChild:H("firstChild"),lastChild:H("lastChild"),previousSibling:H("previousSibling"),nextSibling:H("nextSibling"),childNodes:H("childNodes"),parentElement:H("parentElement"),previousElementSibling:H("previousElementSibling"),nextElementSibling:H("nextElementSibling"),innerHTML:H("innerHTML"),textContent:H("textContent"),firstElementChild:H("firstElementChild"),lastElementChild:H("lastElementChild"),children:H("children")}:{},Cc=Ac?{firstElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,
100 "firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"children")}:{},Dc=Ac?{firstElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(Document.prototype,"children")}:{};G.xa=I;G.rb=Cc;G.mb=Dc;G.parentNode=function(a){return I.parentNode.get.call(a)};
101 G.firstChild=function(a){return I.firstChild.get.call(a)};G.lastChild=function(a){return I.lastChild.get.call(a)};G.previousSibling=function(a){return I.previousSibling.get.call(a)};G.nextSibling=function(a){return I.nextSibling.get.call(a)};G.childNodes=function(a){return Array.prototype.slice.call(I.childNodes.get.call(a))};G.parentElement=function(a){return I.parentElement.get.call(a)};G.previousElementSibling=function(a){return I.previousElementSibling.get.call(a)};G.nextElementSibling=function(a){return I.nextElementSibling.get.call(a)};
102 G.innerHTML=function(a){return I.innerHTML.get.call(a)};G.textContent=function(a){return I.textContent.get.call(a)};G.children=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Cc.children.get.call(a);case Node.DOCUMENT_NODE:return Dc.children.get.call(a);default:return I.children.get.call(a)}};
103 G.firstElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Cc.firstElementChild.get.call(a);case Node.DOCUMENT_NODE:return Dc.firstElementChild.get.call(a);default:return I.firstElementChild.get.call(a)}};G.lastElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Cc.lastElementChild.get.call(a);case Node.DOCUMENT_NODE:return Dc.lastElementChild.get.call(a);default:return I.lastElementChild.get.call(a)}};var J=y.Ba?G:B;function Ec(a){for(;a.firstChild;)a.removeChild(a.firstChild)}
104 var Fc=y.w,Gc=document.implementation.createHTMLDocument("inert"),Hc=Object.getOwnPropertyDescriptor(Node.prototype,"isConnected"),Ic=Hc&&Hc.get,Jc=Object.getOwnPropertyDescriptor(Document.prototype,"activeElement"),Mc={parentElement:{get:function(){var a=x(this);(a=a&&a.parentNode)&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:J.parentElement(this)},configurable:!0},parentNode:{get:function(){var a=x(this);a=a&&a.parentNode;return void 0!==a?a:J.parentNode(this)},configurable:!0},
105 nextSibling:{get:function(){var a=x(this);a=a&&a.nextSibling;return void 0!==a?a:J.nextSibling(this)},configurable:!0},previousSibling:{get:function(){var a=x(this);a=a&&a.previousSibling;return void 0!==a?a:J.previousSibling(this)},configurable:!0},nextElementSibling:{get:function(){var a=x(this);if(a&&void 0!==a.nextSibling){for(a=this.nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return J.nextElementSibling(this)},configurable:!0},previousElementSibling:{get:function(){var a=
106 x(this);if(a&&void 0!==a.previousSibling){for(a=this.previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return J.previousElementSibling(this)},configurable:!0}},Nc={className:{get:function(){return this.getAttribute("class")||""},set:function(a){this.setAttribute("class",a)},configurable:!0}},Oc={childNodes:{get:function(){if(Bb(this)){var a=x(this);if(!a.childNodes){a.childNodes=[];for(var b=this.firstChild;b;b=b.nextSibling)a.childNodes.push(b)}var c=a.childNodes}else c=
107 J.childNodes(this);c.item=function(a){return c[a]};return c},configurable:!0},childElementCount:{get:function(){return this.children.length},configurable:!0},firstChild:{get:function(){var a=x(this);a=a&&a.firstChild;return void 0!==a?a:J.firstChild(this)},configurable:!0},lastChild:{get:function(){var a=x(this);a=a&&a.lastChild;return void 0!==a?a:J.lastChild(this)},configurable:!0},textContent:{get:function(){if(Bb(this)){for(var a=[],b=0,c=this.childNodes,d;d=c[b];b++)d.nodeType!==Node.COMMENT_NODE&&
108 a.push(d.textContent);return a.join("")}return J.textContent(this)},set:function(a){if("undefined"===typeof a||null===a)a="";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:if(!Bb(this)&&Fc){var b=this.firstChild;(b!=this.lastChild||b&&b.nodeType!=Node.TEXT_NODE)&&Ec(this);G.xa.textContent.set.call(this,a)}else Ec(this),(0<a.length||this.nodeType===Node.ELEMENT_NODE)&&this.appendChild(document.createTextNode(a));break;default:this.nodeValue=a}},configurable:!0},firstElementChild:{get:function(){var a=
109 x(this);if(a&&void 0!==a.firstChild){for(a=this.firstChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return J.firstElementChild(this)},configurable:!0},lastElementChild:{get:function(){var a=x(this);if(a&&void 0!==a.lastChild){for(a=this.lastChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return J.lastElementChild(this)},configurable:!0},children:{get:function(){return Bb(this)?Ob(Array.prototype.filter.call(this.childNodes,function(a){return a.nodeType===Node.ELEMENT_NODE})):
110 J.children(this)},configurable:!0},innerHTML:{get:function(){return Bb(this)?yc("template"===this.localName?this.content:this):J.innerHTML(this)},set:function(a){var b="template"===this.localName?this.content:this;Ec(b);var c=this.localName||"div";c=this.namespaceURI&&this.namespaceURI!==Gc.namespaceURI?Gc.createElementNS(this.namespaceURI,c):Gc.createElement(c);Fc?G.xa.innerHTML.set.call(c,a):c.innerHTML=a;for(a="template"===this.localName?c.content:c;a.firstChild;)b.appendChild(a.firstChild)},configurable:!0}},
111 Pc={shadowRoot:{get:function(){var a=x(this);return a&&a.ya||null},configurable:!0}},Qc={activeElement:{get:function(){var a=Jc&&Jc.get?Jc.get.call(document):y.w?void 0:document.activeElement;if(a&&a.nodeType){var b=!!z(this);if(this===document||b&&this.host!==a&&A.contains.call(this.host,a)){for(b=Cb(a);b&&b!==this;)a=b.host,b=Cb(a);a=this===document?b?null:a:b===this?a:null}else a=null}else a=null;return a},set:function(){},configurable:!0}};
112 function K(a,b,c){for(var d in b){var e=Object.getOwnPropertyDescriptor(a,d);e&&e.configurable||!e&&c?Object.defineProperty(a,d,b[d]):c&&console.warn("Could not define",d,"on",a)}}function Rc(a){K(a,Mc);K(a,Nc);K(a,Oc);K(a,Qc)}
113 function Sc(){var a=Tc.prototype;a.__proto__=DocumentFragment.prototype;K(a,Mc,!0);K(a,Oc,!0);K(a,Qc,!0);Object.defineProperties(a,{nodeType:{value:Node.DOCUMENT_FRAGMENT_NODE,configurable:!0},nodeName:{value:"#document-fragment",configurable:!0},nodeValue:{value:null,configurable:!0}});["localName","namespaceURI","prefix"].forEach(function(b){Object.defineProperty(a,b,{value:void 0,configurable:!0})});["ownerDocument","baseURI","isConnected"].forEach(function(b){Object.defineProperty(a,b,{get:function(){return this.host[b]},
114 configurable:!0})})}var Uc=y.w?function(){}:function(a){var b=w(a);b.ta||(b.ta=!0,K(a,Mc,!0),K(a,Nc,!0))},Vc=y.w?function(){}:function(a){w(a).Da||(K(a,Oc,!0),K(a,Pc,!0))};var Wc=J.childNodes;function Xc(a,b,c){Uc(a);c=c||null;var d=w(a),e=w(b),f=c?w(c):null;d.previousSibling=c?f.previousSibling:b.lastChild;if(f=x(d.previousSibling))f.nextSibling=a;if(f=x(d.nextSibling=c))f.previousSibling=a;d.parentNode=b;c?c===e.firstChild&&(e.firstChild=a):(e.lastChild=a,e.firstChild||(e.firstChild=a));e.childNodes=null}
115 function Yc(a){var b=w(a);if(void 0===b.firstChild){b.childNodes=null;var c=Wc(a);b.firstChild=c[0]||null;b.lastChild=c[c.length-1]||null;Vc(a);for(b=0;b<c.length;b++){var d=c[b],e=w(d);e.parentNode=a;e.nextSibling=c[b+1]||null;e.previousSibling=c[b-1]||null;Uc(d)}}};var Zc=J.parentNode;
116 function $c(a,b,c){if(b===a)throw Error("Failed to execute 'appendChild' on 'Node': The new child element contains the parent.");if(c){var d=x(c);d=d&&d.parentNode;if(void 0!==d&&d!==a||void 0===d&&Zc(c)!==a)throw Error("Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.");}if(c===b)return b;b.parentNode&&ad(b.parentNode,b);var e,f;if(!b.__noInsertionPoint){if(f=e=Cb(a)){var h;"slot"===b.localName?h=[b]:b.querySelectorAll&&
117 (h=b.querySelectorAll("slot"));f=h&&h.length?h:void 0}f&&(h=e,d=f,h.a=h.a||[],h.g=h.g||[],h.j=h.j||{},h.a.push.apply(h.a,[].concat(d instanceof Array?d:na(ma(d)))))}("slot"===a.localName||f)&&(e=e||Cb(a))&&bd(e);if(Bb(a)){e=c;Vc(a);f=w(a);void 0!==f.firstChild&&(f.childNodes=null);if(b.nodeType===Node.DOCUMENT_FRAGMENT_NODE){f=b.childNodes;for(h=0;h<f.length;h++)Xc(f[h],a,e);e=w(b);f=void 0!==e.firstChild?null:void 0;e.firstChild=e.lastChild=f;e.childNodes=f}else Xc(b,a,e);e=x(a);if(cd(a)){bd(e.root);
118 var g=!0}else e.root&&(g=!0)}g||(g=z(a)?a.host:a,c?(c=dd(c),A.insertBefore.call(g,b,c)):A.appendChild.call(g,b));ed(a,b);return b}
119 function ad(a,b){if(b.parentNode!==a)throw Error("The node to be removed is not a child of this node: "+b);var c=Cb(b),d=x(a);if(Bb(a)){var e=w(b),f=w(a);b===f.firstChild&&(f.firstChild=e.nextSibling);b===f.lastChild&&(f.lastChild=e.previousSibling);var h=e.previousSibling,g=e.nextSibling;h&&(w(h).nextSibling=g);g&&(w(g).previousSibling=h);e.parentNode=e.previousSibling=e.nextSibling=void 0;void 0!==f.childNodes&&(f.childNodes=null);if(cd(a)){bd(d.root);var k=!0}}fd(b);if(c){(e=a&&"slot"===a.localName)&&
120 (k=!0);if(c.g){gd(c);f=c.j;for(ba in f)for(h=f[ba],g=0;g<h.length;g++){var l=h[g];if(Nb(b,l)){h.splice(g,1);var m=c.g.indexOf(l);0<=m&&c.g.splice(m,1);g--;m=x(l);if(l=m.D)for(var n=0;n<l.length;n++){var t=l[n],C=hd(t);C&&A.removeChild.call(C,t)}m.D=[];m.assignedNodes=[];m=!0}}var ba=m}else ba=void 0;(ba||e)&&bd(c)}k||(k=z(a)?a.host:a,(!d.root&&"slot"!==b.localName||k===Zc(b))&&A.removeChild.call(k,b));ed(a,null,b);return b}
121 function fd(a){var b=x(a);if(b&&void 0!==b.N){b=a.childNodes;for(var c=0,d=b.length,e;c<d&&(e=b[c]);c++)fd(e)}if(a=x(a))a.N=void 0}function dd(a){var b=a;a&&"slot"===a.localName&&(b=(b=(b=x(a))&&b.D)&&b.length?b[0]:dd(a.nextSibling));return b}function cd(a){return(a=(a=x(a))&&a.root)&&id(a)}
122 function jd(a,b){if("slot"===b)a=a.parentNode,cd(a)&&bd(x(a).root);else if("slot"===a.localName&&"name"===b&&(b=Cb(a))){if(b.g){gd(b);var c=a.Ga,d=kd(a);if(d!==c){c=b.j[c];var e=c.indexOf(a);0<=e&&c.splice(e,1);c=b.j[d]||(b.j[d]=[]);c.push(a);1<c.length&&(b.j[d]=ld(c))}}bd(b)}}function ed(a,b,c){if(a=(a=x(a))&&a.K)b&&a.addedNodes.push(b),c&&a.removedNodes.push(c),Ub(a)}
123 function md(a){if(a&&a.nodeType){var b=w(a),c=b.N;void 0===c&&(z(a)?(c=a,b.N=c):(c=(c=a.parentNode)?md(c):a,A.contains.call(document.documentElement,a)&&(b.N=c)));return c}}function nd(a,b,c){var d=[];od(a.childNodes,b,c,d);return d}function od(a,b,c,d){for(var e=0,f=a.length,h;e<f&&(h=a[e]);e++){var g;if(g=h.nodeType===Node.ELEMENT_NODE){g=h;var k=b,l=c,m=d,n=k(g);n&&m.push(g);l&&l(n)?g=n:(od(g.childNodes,k,l,m),g=void 0)}if(g)break}}var pd=null;
124 function qd(a,b,c){pd||(pd=window.ShadyCSS&&window.ShadyCSS.ScopingShim);pd&&"class"===b?pd.setElementClass(a,c):(A.setAttribute.call(a,b,c),jd(a,b))}function rd(a,b){if(a.ownerDocument!==document||"template"===a.localName)return A.importNode.call(document,a,b);var c=A.importNode.call(document,a,!1);if(b){a=a.childNodes;b=0;for(var d;b<a.length;b++)d=rd(a[b],!0),c.appendChild(d)}return c};var sd="__eventWrappers"+Date.now(),td=function(){var a=Object.getOwnPropertyDescriptor(Event.prototype,"composed");return a?function(b){return a.get.call(b)}:null}(),ud={blur:!0,focus:!0,focusin:!0,focusout:!0,click:!0,dblclick:!0,mousedown:!0,mouseenter:!0,mouseleave:!0,mousemove:!0,mouseout:!0,mouseover:!0,mouseup:!0,wheel:!0,beforeinput:!0,input:!0,keydown:!0,keyup:!0,compositionstart:!0,compositionupdate:!0,compositionend:!0,touchstart:!0,touchend:!0,touchmove:!0,touchcancel:!0,pointerover:!0,
125 pointerenter:!0,pointerdown:!0,pointermove:!0,pointerup:!0,pointercancel:!0,pointerout:!0,pointerleave:!0,gotpointercapture:!0,lostpointercapture:!0,dragstart:!0,drag:!0,dragenter:!0,dragleave:!0,dragover:!0,drop:!0,dragend:!0,DOMActivate:!0,DOMFocusIn:!0,DOMFocusOut:!0,keypress:!0},vd={DOMAttrModified:!0,DOMAttributeNameChanged:!0,DOMCharacterDataModified:!0,DOMElementNameChanged:!0,DOMNodeInserted:!0,DOMNodeInsertedIntoDocument:!0,DOMNodeRemoved:!0,DOMNodeRemovedFromDocument:!0,DOMSubtreeModified:!0};
126 function wd(a,b){var c=[],d=a;for(a=a===window?window:a.getRootNode();d;)c.push(d),d=d.assignedSlot?d.assignedSlot:d.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&d.host&&(b||d!==a)?d.host:d.parentNode;c[c.length-1]===document&&c.push(window);return c}function xd(a,b){if(!z)return a;a=wd(a,!0);for(var c=0,d,e,f,h;c<b.length;c++)if(d=b[c],f=d===window?window:d.getRootNode(),f!==e&&(h=a.indexOf(f),e=f),!z(f)||-1<h)return d}
127 var yd={get composed(){void 0===this.R&&(td?this.R=td(this):!1!==this.isTrusted&&(this.R=ud[this.type]));return this.R||!1},composedPath:function(){this.sa||(this.sa=wd(this.__target,this.composed));return this.sa},get target(){return xd(this.currentTarget||this.__previousCurrentTarget,this.composedPath())},get relatedTarget(){if(!this.ea)return null;this.ua||(this.ua=wd(this.ea,!0));return xd(this.currentTarget,this.ua)},stopPropagation:function(){Event.prototype.stopPropagation.call(this);this.da=
128 !0},stopImmediatePropagation:function(){Event.prototype.stopImmediatePropagation.call(this);this.da=this.Ca=!0}};function zd(a){function b(b,d){b=new a(b,d);b.R=d&&!!d.composed;return b}Hb(b,a);b.prototype=a.prototype;return b}var Ad={focus:!0,blur:!0};function Bd(a){return a.__target!==a.target||a.ea!==a.relatedTarget}function Cd(a,b,c){if(c=b.__handlers&&b.__handlers[a.type]&&b.__handlers[a.type][c])for(var d=0,e;(e=c[d])&&(!Bd(a)||a.target!==a.relatedTarget)&&(e.call(b,a),!a.Ca);d++);}
129 function Dd(a){var b=a.composedPath();Object.defineProperty(a,"currentTarget",{get:function(){return d},configurable:!0});for(var c=b.length-1;0<=c;c--){var d=b[c];Cd(a,d,"capture");if(a.da)return}Object.defineProperty(a,"eventPhase",{get:function(){return Event.AT_TARGET}});var e;for(c=0;c<b.length;c++){d=b[c];var f=x(d);f=f&&f.root;if(0===c||f&&f===e)if(Cd(a,d,"bubble"),d!==window&&(e=d.getRootNode()),a.da)break}}
130 function Ed(a,b,c,d,e,f){for(var h=0;h<a.length;h++){var g=a[h],k=g.type,l=g.capture,m=g.once,n=g.passive;if(b===g.node&&c===k&&d===l&&e===m&&f===n)return h}return-1}
131 function Fd(a,b,c){if(b){var d=typeof b;if("function"===d||"object"===d)if("object"!==d||b.handleEvent&&"function"===typeof b.handleEvent){var e=this instanceof Window?A.fb:A.addEventListener;if(vd[a])return e.call(this,a,b,c);if(c&&"object"===typeof c){var f=!!c.capture;var h=!!c.once;var g=!!c.passive}else f=!!c,g=h=!1;var k=c&&c.ga||this,l=b[sd];if(l){if(-1<Ed(l,k,a,f,h,g))return}else b[sd]=[];l=function(e){h&&this.removeEventListener(a,b,c);e.__target||Gd(e);if(k!==this){var f=Object.getOwnPropertyDescriptor(e,
132 "currentTarget");Object.defineProperty(e,"currentTarget",{get:function(){return k},configurable:!0})}e.__previousCurrentTarget=e.currentTarget;if(!z(k)||-1!=e.composedPath().indexOf(k))if(e.composed||-1<e.composedPath().indexOf(k))if(Bd(e)&&e.target===e.relatedTarget)e.eventPhase===Event.BUBBLING_PHASE&&e.stopImmediatePropagation();else if(e.eventPhase===Event.CAPTURING_PHASE||e.bubbles||e.target===k||k instanceof Window){var g="function"===d?b.call(k,e):b.handleEvent&&b.handleEvent(e);k!==this&&
133 (f?(Object.defineProperty(e,"currentTarget",f),f=null):delete e.currentTarget);return g}};b[sd].push({node:k,type:a,capture:f,once:h,passive:g,hb:l});Ad[a]?(this.__handlers=this.__handlers||{},this.__handlers[a]=this.__handlers[a]||{capture:[],bubble:[]},this.__handlers[a][f?"capture":"bubble"].push(l)):e.call(this,a,l,c)}}}
134 function Hd(a,b,c){if(b){var d=this instanceof Window?A.gb:A.removeEventListener;if(vd[a])return d.call(this,a,b,c);if(c&&"object"===typeof c){var e=!!c.capture;var f=!!c.once;var h=!!c.passive}else e=!!c,h=f=!1;var g=c&&c.ga||this,k=void 0;var l=null;try{l=b[sd]}catch(m){}l&&(f=Ed(l,g,a,e,f,h),-1<f&&(k=l.splice(f,1)[0].hb,l.length||(b[sd]=void 0)));d.call(this,a,k||b,c);k&&Ad[a]&&this.__handlers&&this.__handlers[a]&&(a=this.__handlers[a][e?"capture":"bubble"],k=a.indexOf(k),-1<k&&a.splice(k,1))}}
135 function Id(){for(var a in Ad)window.addEventListener(a,function(a){a.__target||(Gd(a),Dd(a))},!0)}function Gd(a){a.__target=a.target;a.ea=a.relatedTarget;if(y.w){var b=Object.getPrototypeOf(a);if(!b.hasOwnProperty("__patchProto")){var c=Object.create(b);c.jb=b;Fb(c,yd);b.__patchProto=c}a.__proto__=b.__patchProto}else Fb(a,yd)}var Jd=zd(window.Event),Kd=zd(window.CustomEvent),Ld=zd(window.MouseEvent);
136 function Md(){window.Event=Jd;window.CustomEvent=Kd;window.MouseEvent=Ld;Id();if(!td&&Object.getOwnPropertyDescriptor(Event.prototype,"isTrusted")){var a=function(){var a=new MouseEvent("click",{bubbles:!0,cancelable:!0,composed:!0});this.dispatchEvent(a)};Element.prototype.click?Element.prototype.click=a:HTMLElement.prototype.click&&(HTMLElement.prototype.click=a)}};function Nd(a,b){return{index:a,O:[],X:b}}
137 function Od(a,b,c,d){var e=0,f=0,h=0,g=0,k=Math.min(b-e,d-f);if(0==e&&0==f)a:{for(h=0;h<k;h++)if(a[h]!==c[h])break a;h=k}if(b==a.length&&d==c.length){g=a.length;for(var l=c.length,m=0;m<k-h&&Pd(a[--g],c[--l]);)m++;g=m}e+=h;f+=h;b-=g;d-=g;if(0==b-e&&0==d-f)return[];if(e==b){for(b=Nd(e,0);f<d;)b.O.push(c[f++]);return[b]}if(f==d)return[Nd(e,b-e)];k=e;h=f;d=d-h+1;g=b-k+1;b=Array(d);for(l=0;l<d;l++)b[l]=Array(g),b[l][0]=l;for(l=0;l<g;l++)b[0][l]=l;for(l=1;l<d;l++)for(m=1;m<g;m++)if(a[k+m-1]===c[h+l-1])b[l][m]=
138 b[l-1][m-1];else{var n=b[l-1][m]+1,t=b[l][m-1]+1;b[l][m]=n<t?n:t}k=b.length-1;h=b[0].length-1;d=b[k][h];for(a=[];0<k||0<h;)0==k?(a.push(2),h--):0==h?(a.push(3),k--):(g=b[k-1][h-1],l=b[k-1][h],m=b[k][h-1],n=l<m?l<g?l:g:m<g?m:g,n==g?(g==d?a.push(0):(a.push(1),d=g),k--,h--):n==l?(a.push(3),k--,d=l):(a.push(2),h--,d=m));a.reverse();b=void 0;k=[];for(h=0;h<a.length;h++)switch(a[h]){case 0:b&&(k.push(b),b=void 0);e++;f++;break;case 1:b||(b=Nd(e,0));b.X++;e++;b.O.push(c[f]);f++;break;case 2:b||(b=Nd(e,0));
139 b.X++;e++;break;case 3:b||(b=Nd(e,0)),b.O.push(c[f]),f++}b&&k.push(b);return k}function Pd(a,b){return a===b};var hd=J.parentNode,Qd=J.childNodes,Rd={},Sd=y.deferConnectionCallbacks&&"loading"===document.readyState,Td;function Ud(a){var b=[];do b.unshift(a);while(a=a.parentNode);return b}
140 function Tc(a,b,c){if(a!==Rd)throw new TypeError("Illegal constructor");this.La="ShadyRoot";this.host=b;this.c=c&&c.mode;Yc(b);a=w(b);a.root=this;a.ya="closed"!==this.c?this:null;a=w(this);a.firstChild=a.lastChild=a.parentNode=a.nextSibling=a.previousSibling=null;a.childNodes=[];this.b=this.W=!1;this.a=this.j=this.g=null;bd(this)}function bd(a){a.W||(a.W=!0,Rb(function(){return Vd(a)}))}
141 function Vd(a){for(var b;a;){a.W&&(b=a);a:{var c=a;a=c.host.getRootNode();if(z(a))for(var d=c.host.childNodes,e=0;e<d.length;e++)if(c=d[e],"slot"==c.localName)break a;a=void 0}}b&&b._renderRoot()}
142 Tc.prototype._renderRoot=function(){var a=Sd;Sd=!0;this.W=!1;if(this.g){gd(this);for(var b=0,c;b<this.g.length;b++){c=this.g[b];var d=x(c),e=d.assignedNodes;d.assignedNodes=[];d.D=[];if(d.la=e)for(d=0;d<e.length;d++){var f=x(e[d]);f.U=f.assignedSlot;f.assignedSlot===c&&(f.assignedSlot=null)}}for(c=this.host.firstChild;c;c=c.nextSibling)Wd(this,c);for(b=0;b<this.g.length;b++){c=this.g[b];e=x(c);if(!e.assignedNodes.length)for(d=c.firstChild;d;d=d.nextSibling)Wd(this,d,c);(d=(d=x(c.parentNode))&&d.root)&&
143 id(d)&&d._renderRoot();Xd(this,e.D,e.assignedNodes);if(d=e.la){for(f=0;f<d.length;f++)x(d[f]).U=null;e.la=null;d.length>e.assignedNodes.length&&(e.Z=!0)}e.Z&&(e.Z=!1,Yd(this,c))}b=this.g;c=[];for(e=0;e<b.length;e++)d=b[e].parentNode,(f=x(d))&&f.root||!(0>c.indexOf(d))||c.push(d);for(b=0;b<c.length;b++){e=c[b];d=e===this?this.host:e;f=[];e=e.childNodes;for(var h=0;h<e.length;h++){var g=e[h];if("slot"==g.localName){g=x(g).D;for(var k=0;k<g.length;k++)f.push(g[k])}else f.push(g)}e=void 0;h=Qd(d);g=Od(f,
144 f.length,h,h.length);for(var l=k=0;k<g.length&&(e=g[k]);k++){for(var m=0,n;m<e.O.length&&(n=e.O[m]);m++)hd(n)===d&&A.removeChild.call(d,n),h.splice(e.index+l,1);l-=e.X}for(l=0;l<g.length&&(e=g[l]);l++)for(k=h[e.index],m=e.index;m<e.index+e.X;m++)n=f[m],A.insertBefore.call(d,n,k),h.splice(m,0,n)}}if(!this.b)for(n=this.host.childNodes,c=0,b=n.length;c<b;c++)e=n[c],d=x(e),hd(e)!==this.host||"slot"!==e.localName&&d.assignedSlot||A.removeChild.call(this.host,e);this.b=!0;Sd=a;Td&&Td()};
145 function Wd(a,b,c){var d=w(b),e=d.U;d.U=null;c||(c=(a=a.j[b.slot||"__catchall"])&&a[0]);c?(w(c).assignedNodes.push(b),d.assignedSlot=c):d.assignedSlot=void 0;e!==d.assignedSlot&&d.assignedSlot&&(w(d.assignedSlot).Z=!0)}function Xd(a,b,c){for(var d=0,e;d<c.length&&(e=c[d]);d++)if("slot"==e.localName){var f=x(e).assignedNodes;f&&f.length&&Xd(a,b,f)}else b.push(c[d])}function Yd(a,b){A.dispatchEvent.call(b,new Event("slotchange"));b=x(b);b.assignedSlot&&Yd(a,b.assignedSlot)}
146 function gd(a){if(a.a&&a.a.length){for(var b=a.a,c,d=0;d<b.length;d++){var e=b[d];Yc(e);Yc(e.parentNode);var f=kd(e);a.j[f]?(c=c||{},c[f]=!0,a.j[f].push(e)):a.j[f]=[e];a.g.push(e)}if(c)for(var h in c)a.j[h]=ld(a.j[h]);a.a=[]}}function kd(a){var b=a.name||a.getAttribute("name")||"__catchall";return a.Ga=b}function ld(a){return a.sort(function(a,c){a=Ud(a);for(var b=Ud(c),e=0;e<a.length;e++){c=a[e];var f=b[e];if(c!==f)return a=Array.from(c.parentNode.childNodes),a.indexOf(c)-a.indexOf(f)}})}
147 function id(a){gd(a);return!(!a.g||!a.g.length)}
148 if(window.customElements&&y.na){var Zd=new Map;Td=function(){var a=Array.from(Zd);Zd.clear();a=ma(a);for(var b=a.next();!b.done;b=a.next()){b=ma(b.value);var c=b.next().value;b.next().value?c.Ea():c.Fa()}};Sd&&document.addEventListener("readystatechange",function(){Sd=!1;Td()},{once:!0});var $d=function(a,b,c){var d=0,e="__isConnected"+d++;if(b||c)a.prototype.connectedCallback=a.prototype.Ea=function(){Sd?Zd.set(this,!0):this[e]||(this[e]=!0,b&&b.call(this))},a.prototype.disconnectedCallback=a.prototype.Fa=
149 function(){Sd?this.isConnected||Zd.set(this,!1):this[e]&&(this[e]=!1,c&&c.call(this))};return a},define=window.customElements.define;Object.defineProperty(window.CustomElementRegistry.prototype,"define",{value:function(a,b){var c=b.prototype.connectedCallback,d=b.prototype.disconnectedCallback;define.call(window.customElements,a,$d(b,c,d));b.prototype.connectedCallback=c;b.prototype.disconnectedCallback=d}})};function ae(a){var b=a.getRootNode();z(b)&&Vd(b);return(a=x(a))&&a.assignedSlot||null}
150 var be={addEventListener:Fd.bind(window),removeEventListener:Hd.bind(window)},ce={addEventListener:Fd,removeEventListener:Hd,appendChild:function(a){return $c(this,a)},insertBefore:function(a,b){return $c(this,a,b)},removeChild:function(a){return ad(this,a)},replaceChild:function(a,b){$c(this,a,b);ad(this,b);return a},cloneNode:function(a){if("template"==this.localName)var b=A.cloneNode.call(this,a);else if(b=A.cloneNode.call(this,!1),a&&b.nodeType!==Node.ATTRIBUTE_NODE){a=this.childNodes;for(var c=
151 0,d;c<a.length;c++)d=a[c].cloneNode(!0),b.appendChild(d)}return b},getRootNode:function(){return md(this)},contains:function(a){return Nb(this,a)},dispatchEvent:function(a){Sb();return A.dispatchEvent.call(this,a)}};
152 Object.defineProperties(ce,{isConnected:{get:function(){if(Ic&&Ic.call(this))return!0;if(this.nodeType==Node.DOCUMENT_FRAGMENT_NODE)return!1;var a=this.ownerDocument;if(Mb){if(A.contains.call(a,this))return!0}else if(a.documentElement&&A.contains.call(a.documentElement,this))return!0;for(a=this;a&&!(a instanceof Document);)a=a.parentNode||(z(a)?a.host:void 0);return!!(a&&a instanceof Document)},configurable:!0}});
153 var de={get assignedSlot(){return ae(this)}},ee={querySelector:function(a){return nd(this,function(b){return Eb.call(b,a)},function(a){return!!a})[0]||null},querySelectorAll:function(a,b){if(b){b=Array.prototype.slice.call(A.querySelectorAll.call(this,a));var c=this.getRootNode();return b.filter(function(a){return a.getRootNode()==c})}return nd(this,function(b){return Eb.call(b,a)})}},fe={assignedNodes:function(a){if("slot"===this.localName){var b=this.getRootNode();z(b)&&Vd(b);return(b=x(this))?
154 (a&&a.flatten?b.D:b.assignedNodes)||[]:[]}}},ge=Gb({setAttribute:function(a,b){qd(this,a,b)},removeAttribute:function(a){A.removeAttribute.call(this,a);jd(this,a)},attachShadow:function(a){if(!this)throw"Must provide a host.";if(!a)throw"Not enough arguments.";return new Tc(Rd,this,a)},get slot(){return this.getAttribute("slot")},set slot(a){qd(this,"slot",a)},get assignedSlot(){return ae(this)}},ee,fe);Object.defineProperties(ge,Pc);
155 var he=Gb({importNode:function(a,b){return rd(a,b)},getElementById:function(a){return nd(this,function(b){return b.id==a},function(a){return!!a})[0]||null}},ee);Object.defineProperties(he,{_activeElement:Qc.activeElement});
156 for(var ie=HTMLElement.prototype.blur,je={blur:function(){var a=x(this);(a=(a=a&&a.root)&&a.activeElement)?a.blur():ie.call(this)}},ke={},le=ma(Object.getOwnPropertyNames(Document.prototype)),me=le.next();!me.done;ke={u:ke.u},me=le.next())ke.u=me.value,"on"===ke.u.substring(0,2)&&Object.defineProperty(je,ke.u,{set:function(a){return function(b){var c=w(this),d=a.u.substring(2);c.S[a.u]&&this.removeEventListener(d,c.S[a.u]);this.addEventListener(d,b,{});c.S[a.u]=b}}(ke),get:function(a){return function(){var b=
157 x(this);return b&&b.S[a.u]}}(ke),configurable:!0});var ne={addEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.ga=this;this.host.addEventListener(a,b,c)},removeEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.ga=this;this.host.removeEventListener(a,b,c)},getElementById:function(a){return nd(this,function(b){return b.id==a},function(a){return!!a})[0]||null}};
158 function L(a,b){for(var c=Object.getOwnPropertyNames(b),d=0;d<c.length;d++){var e=c[d],f=Object.getOwnPropertyDescriptor(b,e);f.value?a[e]=f.value:Object.defineProperty(a,e,f)}};if(y.na){var ShadyDOM={inUse:y.na,patch:function(a){Vc(a);Uc(a);return a},isShadyRoot:z,enqueue:Rb,flush:Sb,settings:y,filterMutations:Yb,observeChildren:Wb,unobserveChildren:Xb,nativeMethods:A,nativeTree:J,deferConnectionCallbacks:y.deferConnectionCallbacks};window.ShadyDOM=ShadyDOM;Md();var oe=window.customElements&&window.customElements.nativeHTMLElement||HTMLElement;L(Tc.prototype,ne);L(window.Node.prototype,ce);L(window.Window.prototype,be);L(window.Text.prototype,de);L(window.DocumentFragment.prototype,
159 ee);L(window.Element.prototype,ge);L(window.Document.prototype,he);window.HTMLSlotElement&&L(window.HTMLSlotElement.prototype,fe);L(oe.prototype,je);y.w&&(Rc(window.Node.prototype),Rc(window.Text.prototype),Rc(window.DocumentFragment.prototype),Rc(window.Element.prototype),Rc(oe.prototype),Rc(window.Document.prototype),window.HTMLSlotElement&&Rc(window.HTMLSlotElement.prototype));Sc();window.ShadowRoot=Tc};var pe=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function qe(a){var b=pe.has(a);a=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(a);return!b&&a}function M(a){var b=a.isConnected;if(void 0!==b)return b;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}
160 function re(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
161 function se(a,b,c){c=void 0===c?new Set:c;for(var d=a;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;b(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){d=e.import;if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)se(d,b,c);d=re(a,e);continue}else if("template"===f){d=re(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)se(e,b,c)}d=d.firstChild?d.firstChild:re(a,d)}}function N(a,b,c){a[b]=c};function te(){this.a=new Map;this.o=new Map;this.i=[];this.c=!1}function ue(a,b,c){a.a.set(b,c);a.o.set(c.constructor,c)}function ve(a,b){a.c=!0;a.i.push(b)}function we(a,b){a.c&&se(b,function(b){return a.b(b)})}te.prototype.b=function(a){if(this.c&&!a.__CE_patched){a.__CE_patched=!0;for(var b=0;b<this.i.length;b++)this.i[b](a)}};function O(a,b){var c=[];se(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state?a.connectedCallback(d):xe(a,d)}}
162 function P(a,b){var c=[];se(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state&&a.disconnectedCallback(d)}}
163 function Q(a,b,c){c=void 0===c?{}:c;var d=c.eb||new Set,e=c.ca||function(b){return xe(a,b)},f=[];se(b,function(b){if("link"===b.localName&&"import"===b.getAttribute("rel")){var c=b.import;c instanceof Node&&(c.__CE_isImportDocument=!0,c.__CE_hasRegistry=!0);c&&"complete"===c.readyState?c.__CE_documentLoadHandled=!0:b.addEventListener("load",function(){var c=b.import;if(!c.__CE_documentLoadHandled){c.__CE_documentLoadHandled=!0;var f=new Set(d);f.delete(c);Q(a,c,{eb:f,ca:e})}})}else f.push(b)},d);
164 if(a.c)for(b=0;b<f.length;b++)a.b(f[b]);for(b=0;b<f.length;b++)e(f[b])}
165 function xe(a,b){if(void 0===b.__CE_state){var c=b.ownerDocument;if(c.defaultView||c.__CE_isImportDocument&&c.__CE_hasRegistry)if(c=a.a.get(b.localName)){c.constructionStack.push(b);var d=c.constructor;try{try{if(new d!==b)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{c.constructionStack.pop()}}catch(h){throw b.__CE_state=2,h;}b.__CE_state=1;b.__CE_definition=c;if(c.attributeChangedCallback)for(c=c.observedAttributes,d=0;d<c.length;d++){var e=c[d],
166 f=b.getAttribute(e);null!==f&&a.attributeChangedCallback(b,e,null,f,null)}M(b)&&a.connectedCallback(b)}}}te.prototype.connectedCallback=function(a){var b=a.__CE_definition;b.connectedCallback&&b.connectedCallback.call(a)};te.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;b.disconnectedCallback&&b.disconnectedCallback.call(a)};
167 te.prototype.attributeChangedCallback=function(a,b,c,d,e){var f=a.__CE_definition;f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b)&&f.attributeChangedCallback.call(a,b,c,d,e)};function ye(a){var b=document;this.l=a;this.a=b;this.H=void 0;Q(this.l,this.a);"loading"===this.a.readyState&&(this.H=new MutationObserver(this.b.bind(this)),this.H.observe(this.a,{childList:!0,subtree:!0}))}function ze(a){a.H&&a.H.disconnect()}ye.prototype.b=function(a){var b=this.a.readyState;"interactive"!==b&&"complete"!==b||ze(this);for(b=0;b<a.length;b++)for(var c=a[b].addedNodes,d=0;d<c.length;d++)Q(this.l,c[d])};function Ae(){var a=this;this.b=this.a=void 0;this.c=new Promise(function(b){a.b=b;a.a&&b(a.a)})}Ae.prototype.resolve=function(a){if(this.a)throw Error("Already resolved.");this.a=a;this.b&&this.b(a)};function R(a){this.ia=!1;this.l=a;this.ma=new Map;this.ja=function(a){return a()};this.T=!1;this.ka=[];this.Ja=new ye(a)}p=R.prototype;
168 p.define=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!qe(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this.l.a.get(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this.ia)throw Error("A custom element is already being defined.");this.ia=!0;try{var d=function(a){var b=e[a];if(void 0!==b&&!(b instanceof Function))throw Error("The '"+a+"' callback must be a function.");
169 return b},e=b.prototype;if(!(e instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");var f=d("connectedCallback");var h=d("disconnectedCallback");var g=d("adoptedCallback");var k=d("attributeChangedCallback");var l=b.observedAttributes||[]}catch(m){return}finally{this.ia=!1}b={localName:a,constructor:b,connectedCallback:f,disconnectedCallback:h,adoptedCallback:g,attributeChangedCallback:k,observedAttributes:l,constructionStack:[]};ue(this.l,a,b);this.ka.push(b);
170 this.T||(this.T=!0,this.ja(function(){return Be(c)}))};p.ca=function(a){Q(this.l,a)};
171 function Be(a){if(!1!==a.T){a.T=!1;for(var b=a.ka,c=[],d=new Map,e=0;e<b.length;e++)d.set(b[e].localName,[]);Q(a.l,document,{ca:function(b){if(void 0===b.__CE_state){var e=b.localName,f=d.get(e);f?f.push(b):a.l.a.get(e)&&c.push(b)}}});for(e=0;e<c.length;e++)xe(a.l,c[e]);for(;0<b.length;){var f=b.shift();e=f.localName;f=d.get(f.localName);for(var h=0;h<f.length;h++)xe(a.l,f[h]);(e=a.ma.get(e))&&e.resolve(void 0)}}}p.get=function(a){if(a=this.l.a.get(a))return a.constructor};
172 p.whenDefined=function(a){if(!qe(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.ma.get(a);if(b)return b.c;b=new Ae;this.ma.set(a,b);this.l.a.get(a)&&!this.ka.some(function(b){return b.localName===a})&&b.resolve(void 0);return b.c};p.Za=function(a){ze(this.Ja);var b=this.ja;this.ja=function(c){return a(function(){return b(c)})}};window.CustomElementRegistry=R;R.prototype.define=R.prototype.define;R.prototype.upgrade=R.prototype.ca;
173 R.prototype.get=R.prototype.get;R.prototype.whenDefined=R.prototype.whenDefined;R.prototype.polyfillWrapFlushCallback=R.prototype.Za;var Ce=window.Document.prototype.createElement,De=window.Document.prototype.createElementNS,Ee=window.Document.prototype.importNode,Fe=window.Document.prototype.prepend,Ge=window.Document.prototype.append,He=window.DocumentFragment.prototype.prepend,Ie=window.DocumentFragment.prototype.append,Je=window.Node.prototype.cloneNode,Ke=window.Node.prototype.appendChild,Le=window.Node.prototype.insertBefore,Me=window.Node.prototype.removeChild,Ne=window.Node.prototype.replaceChild,Oe=Object.getOwnPropertyDescriptor(window.Node.prototype,
174 "textContent"),Pe=window.Element.prototype.attachShadow,Qe=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),Re=window.Element.prototype.getAttribute,Se=window.Element.prototype.setAttribute,Te=window.Element.prototype.removeAttribute,Ue=window.Element.prototype.getAttributeNS,Ve=window.Element.prototype.setAttributeNS,We=window.Element.prototype.removeAttributeNS,Xe=window.Element.prototype.insertAdjacentElement,Ye=window.Element.prototype.insertAdjacentHTML,Ze=window.Element.prototype.prepend,
175 $e=window.Element.prototype.append,af=window.Element.prototype.before,bf=window.Element.prototype.after,cf=window.Element.prototype.replaceWith,df=window.Element.prototype.remove,ef=window.HTMLElement,ff=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),gf=window.HTMLElement.prototype.insertAdjacentElement,hf=window.HTMLElement.prototype.insertAdjacentHTML;var jf=new function(){};function kf(){var a=lf;window.HTMLElement=function(){function b(){var b=this.constructor,d=a.o.get(b);if(!d)throw Error("The custom element being constructed was not registered with `customElements`.");var e=d.constructionStack;if(0===e.length)return e=Ce.call(document,d.localName),Object.setPrototypeOf(e,b.prototype),e.__CE_state=1,e.__CE_definition=d,a.b(e),e;d=e.length-1;var f=e[d];if(f===jf)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
176 e[d]=jf;Object.setPrototypeOf(f,b.prototype);a.b(f);return f}b.prototype=ef.prototype;Object.defineProperty(b.prototype,"constructor",{writable:!0,configurable:!0,enumerable:!1,value:b});return b}()};function mf(a,b,c){function d(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];e=[];for(var f=[],l=0;l<d.length;l++){var m=d[l];m instanceof Element&&M(m)&&f.push(m);if(m instanceof DocumentFragment)for(m=m.firstChild;m;m=m.nextSibling)e.push(m);else e.push(m)}b.apply(this,d);for(d=0;d<f.length;d++)P(a,f[d]);if(M(this))for(d=0;d<e.length;d++)f=e[d],f instanceof Element&&O(a,f)}}void 0!==c.aa&&(b.prepend=d(c.aa));void 0!==c.append&&(b.append=d(c.append))};function nf(){var a=lf;N(Document.prototype,"createElement",function(b){if(this.__CE_hasRegistry){var c=a.a.get(b);if(c)return new c.constructor}b=Ce.call(this,b);a.b(b);return b});N(Document.prototype,"importNode",function(b,c){b=Ee.call(this,b,c);this.__CE_hasRegistry?Q(a,b):we(a,b);return b});N(Document.prototype,"createElementNS",function(b,c){if(this.__CE_hasRegistry&&(null===b||"http://www.w3.org/1999/xhtml"===b)){var d=a.a.get(c);if(d)return new d.constructor}b=De.call(this,b,c);a.b(b);return b});
177 mf(a,Document.prototype,{aa:Fe,append:Ge})};function of(){var a=lf;function b(b,d){Object.defineProperty(b,"textContent",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(b){if(this.nodeType===Node.TEXT_NODE)d.set.call(this,b);else{var c=void 0;if(this.firstChild){var e=this.childNodes,g=e.length;if(0<g&&M(this)){c=Array(g);for(var k=0;k<g;k++)c[k]=e[k]}}d.set.call(this,b);if(c)for(b=0;b<c.length;b++)P(a,c[b])}}})}N(Node.prototype,"insertBefore",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);
178 b=Le.call(this,b,d);if(M(this))for(d=0;d<c.length;d++)O(a,c[d]);return b}c=M(b);d=Le.call(this,b,d);c&&P(a,b);M(this)&&O(a,b);return d});N(Node.prototype,"appendChild",function(b){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=Ke.call(this,b);if(M(this))for(var e=0;e<c.length;e++)O(a,c[e]);return b}c=M(b);e=Ke.call(this,b);c&&P(a,b);M(this)&&O(a,b);return e});N(Node.prototype,"cloneNode",function(b){b=Je.call(this,b);this.ownerDocument.__CE_hasRegistry?Q(a,b):
179 we(a,b);return b});N(Node.prototype,"removeChild",function(b){var c=M(b),e=Me.call(this,b);c&&P(a,b);return e});N(Node.prototype,"replaceChild",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=Ne.call(this,b,d);if(M(this))for(P(a,d),d=0;d<c.length;d++)O(a,c[d]);return b}c=M(b);var f=Ne.call(this,b,d),h=M(this);h&&P(a,d);c&&P(a,b);h&&O(a,b);return f});Oe&&Oe.get?b(Node.prototype,Oe):ve(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){for(var a=
180 [],b=0;b<this.childNodes.length;b++)a.push(this.childNodes[b].textContent);return a.join("")},set:function(a){for(;this.firstChild;)Me.call(this,this.firstChild);Ke.call(this,document.createTextNode(a))}})})};function pf(a){var b=Element.prototype;function c(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];e=[];for(var g=[],k=0;k<d.length;k++){var l=d[k];l instanceof Element&&M(l)&&g.push(l);if(l instanceof DocumentFragment)for(l=l.firstChild;l;l=l.nextSibling)e.push(l);else e.push(l)}b.apply(this,d);for(d=0;d<g.length;d++)P(a,g[d]);if(M(this))for(d=0;d<e.length;d++)g=e[d],g instanceof Element&&O(a,g)}}void 0!==af&&(b.before=c(af));void 0!==af&&(b.after=c(bf));void 0!==
181 cf&&N(b,"replaceWith",function(b){for(var c=[],d=0;d<arguments.length;++d)c[d-0]=arguments[d];d=[];for(var h=[],g=0;g<c.length;g++){var k=c[g];k instanceof Element&&M(k)&&h.push(k);if(k instanceof DocumentFragment)for(k=k.firstChild;k;k=k.nextSibling)d.push(k);else d.push(k)}g=M(this);cf.apply(this,c);for(c=0;c<h.length;c++)P(a,h[c]);if(g)for(P(a,this),c=0;c<d.length;c++)h=d[c],h instanceof Element&&O(a,h)});void 0!==df&&N(b,"remove",function(){var b=M(this);df.call(this);b&&P(a,this)})};function qf(){var a=lf;function b(b,c){Object.defineProperty(b,"innerHTML",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(b){var d=this,e=void 0;M(this)&&(e=[],se(this,function(a){a!==d&&e.push(a)}));c.set.call(this,b);if(e)for(var f=0;f<e.length;f++){var h=e[f];1===h.__CE_state&&a.disconnectedCallback(h)}this.ownerDocument.__CE_hasRegistry?Q(a,this):we(a,this);return b}})}function c(b,c){N(b,"insertAdjacentElement",function(b,d){var e=M(d);b=c.call(this,b,d);e&&P(a,d);M(b)&&O(a,
182 d);return b})}function d(b,c){function d(b,c){for(var d=[];b!==c;b=b.nextSibling)d.push(b);for(c=0;c<d.length;c++)Q(a,d[c])}N(b,"insertAdjacentHTML",function(a,b){a=a.toLowerCase();if("beforebegin"===a){var e=this.previousSibling;c.call(this,a,b);d(e||this.parentNode.firstChild,this)}else if("afterbegin"===a)e=this.firstChild,c.call(this,a,b),d(this.firstChild,e);else if("beforeend"===a)e=this.lastChild,c.call(this,a,b),d(e||this.firstChild,null);else if("afterend"===a)e=this.nextSibling,c.call(this,
183 a,b),d(this.nextSibling,e);else throw new SyntaxError("The value provided ("+String(a)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");})}Pe&&N(Element.prototype,"attachShadow",function(a){return this.__CE_shadowRoot=a=Pe.call(this,a)});Qe&&Qe.get?b(Element.prototype,Qe):ff&&ff.get?b(HTMLElement.prototype,ff):ve(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){return Je.call(this,!0).innerHTML},set:function(a){var b="template"===this.localName,c=b?this.content:
184 this,d=De.call(document,this.namespaceURI,this.localName);for(d.innerHTML=a;0<c.childNodes.length;)Me.call(c,c.childNodes[0]);for(a=b?d.content:d;0<a.childNodes.length;)Ke.call(c,a.childNodes[0])}})});N(Element.prototype,"setAttribute",function(b,c){if(1!==this.__CE_state)return Se.call(this,b,c);var d=Re.call(this,b);Se.call(this,b,c);c=Re.call(this,b);a.attributeChangedCallback(this,b,d,c,null)});N(Element.prototype,"setAttributeNS",function(b,c,d){if(1!==this.__CE_state)return Ve.call(this,b,c,
185 d);var e=Ue.call(this,b,c);Ve.call(this,b,c,d);d=Ue.call(this,b,c);a.attributeChangedCallback(this,c,e,d,b)});N(Element.prototype,"removeAttribute",function(b){if(1!==this.__CE_state)return Te.call(this,b);var c=Re.call(this,b);Te.call(this,b);null!==c&&a.attributeChangedCallback(this,b,c,null,null)});N(Element.prototype,"removeAttributeNS",function(b,c){if(1!==this.__CE_state)return We.call(this,b,c);var d=Ue.call(this,b,c);We.call(this,b,c);var e=Ue.call(this,b,c);d!==e&&a.attributeChangedCallback(this,
186 c,d,e,b)});gf?c(HTMLElement.prototype,gf):Xe?c(Element.prototype,Xe):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");hf?d(HTMLElement.prototype,hf):Ye?d(Element.prototype,Ye):console.warn("Custom Elements: `Element#insertAdjacentHTML` was not patched.");mf(a,Element.prototype,{aa:Ze,append:$e});pf(a)};var rf=window.customElements;if(!rf||rf.forcePolyfill||"function"!=typeof rf.define||"function"!=typeof rf.get){var lf=new te;kf();nf();mf(lf,DocumentFragment.prototype,{aa:He,append:Ie});of();qf();document.__CE_hasRegistry=!0;var customElements=new R(lf);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};function xf(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
187 function yf(a){a=a.replace(zf,"").replace(Af,"");var b=Bf,c=a,d=new xf;d.start=0;d.end=c.length;for(var e=d,f=0,h=c.length;f<h;f++)if("{"===c[f]){e.rules||(e.rules=[]);var g=e,k=g.rules[g.rules.length-1]||null;e=new xf;e.start=f+1;e.parent=g;e.previous=k;g.rules.push(e)}else"}"===c[f]&&(e.end=f+1,e=e.parent||d);return b(d,a)}
188 function Bf(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=Cf(c),c=c.replace(Df," "),c=c.substring(c.lastIndexOf(";")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf("@"),a.atRule?0===c.indexOf("@media")?a.type=Ef:c.match(Ff)&&(a.type=Gf,a.keyframesName=a.selector.split(Df).pop()):a.type=0===c.indexOf("--")?Hf:If);if(c=a.rules)for(var d=0,e=c.length,f;d<e&&(f=c[d]);d++)Bf(f,
189 b);return a}function Cf(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(a,c){a=c;for(c=6-a.length;c--;)a="0"+a;return"\\"+a})}
190 function Jf(a,b,c){c=void 0===c?"":c;var d="";if(a.cssText||a.rules){var e=a.rules,f;if(f=e)f=e[0],f=!(f&&f.selector&&0===f.selector.indexOf("--"));if(f){f=0;for(var h=e.length,g;f<h&&(g=e[f]);f++)d=Jf(g,b,d)}else b?b=a.cssText:(b=a.cssText,b=b.replace(Kf,"").replace(Lf,""),b=b.replace(Mf,"").replace(Nf,"")),(d=b.trim())&&(d=" "+d+"\n")}d&&(a.selector&&(c+=a.selector+" {\n"),c+=d,a.selector&&(c+="}\n\n"));return c}
191 var If=1,Gf=7,Ef=4,Hf=1E3,zf=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,Af=/@import[^;]*;/gim,Kf=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,Lf=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,Mf=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,Nf=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,Ff=/^@[^\s]*keyframes/,Df=/\s+/g;var S=!(window.ShadyDOM&&window.ShadyDOM.inUse),Of;function Pf(a){Of=a&&a.shimcssproperties?!1:S||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?Of=window.ShadyCSS.nativeCss:window.ShadyCSS?(Pf(window.ShadyCSS),window.ShadyCSS=void 0):Pf(window.WebComponents&&window.WebComponents.flags);var U=Of;var Qf=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,Rf=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,Sf=/(--[\w-]+)\s*([:,;)]|$)/gi,Tf=/(animation\s*:)|(animation-name\s*:)/,Uf=/@media\s(.*)/,Vf=/\{[^}]*\}/g;var Wf=new Set;function Xf(a,b){if(!a)return"";"string"===typeof a&&(a=yf(a));b&&Yf(a,b);return Jf(a,U)}function Zf(a){!a.__cssRules&&a.textContent&&(a.__cssRules=yf(a.textContent));return a.__cssRules||null}function $f(a){return!!a.parent&&a.parent.type===Gf}function Yf(a,b,c,d){if(a){var e=!1,f=a.type;if(d&&f===Ef){var h=a.selector.match(Uf);h&&(window.matchMedia(h[1]).matches||(e=!0))}f===If?b(a):c&&f===Gf?c(a):f===Hf&&(e=!0);if((a=a.rules)&&!e){e=0;f=a.length;for(var g;e<f&&(g=a[e]);e++)Yf(g,b,c,d)}}}
192 function ag(a,b,c,d){var e=document.createElement("style");b&&e.setAttribute("scope",b);e.textContent=a;bg(e,c,d);return e}var cg=null;function bg(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);cg?a.compareDocumentPosition(cg)===Node.DOCUMENT_POSITION_PRECEDING&&(cg=a):cg=a}
193 function dg(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");a:{var d=0;var e=c+3;for(var f=a.length;e<f;e++)if("("===a[e])d++;else if(")"===a[e]&&0===--d)break a;e=-1}d=a.substring(c+4,e);c=a.substring(0,c);a=dg(a.substring(e+1),b);e=d.indexOf(",");return-1===e?b(c,d.trim(),"",a):b(c,d.substring(0,e).trim(),d.substring(e+1).trim(),a)}function eg(a,b){S?a.setAttribute("class",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,"class",b)}
194 function fg(a){var b=a.localName,c="";b?-1<b.indexOf("-")||(c=b,b=a.getAttribute&&a.getAttribute("is")||""):(b=a.is,c=a.extends);return{is:b,P:c}};function gg(){}function hg(a,b){var c=W;a.__styleScoped?a.__styleScoped=null:ig(c,a,function(a){jg(a,b||"")})}function ig(a,b,c){b.nodeType===Node.ELEMENT_NODE&&c(b);if(b="template"===b.localName?(b.content||b.kb||b).childNodes:b.children||b.childNodes)for(var d=0;d<b.length;d++)ig(a,b[d],c)}
195 function jg(a,b,c){if(b)if(a.classList)c?(a.classList.remove("style-scope"),a.classList.remove(b)):(a.classList.add("style-scope"),a.classList.add(b));else if(a.getAttribute){var d=a.getAttribute(kg);c?d&&(b=d.replace("style-scope","").replace(b,""),eg(a,b)):eg(a,(d?d+" ":"")+"style-scope "+b)}}function lg(a,b,c){var d=W;a.__styleScoped?a.__styleScoped=null:ig(d,a,function(a){jg(a,b,!0);jg(a,c)})}function mg(a,b){var c=W;a.__styleScoped?a.__styleScoped=null:ig(c,a,function(a){jg(a,b||"",!0)})}
196 function ng(a,b,c){var d=W,e=a.__cssBuild;S||"shady"===e?b=Xf(b,c):(a=fg(a),b=og(d,b,a.is,a.P,c)+"\n\n");return b.trim()}function og(a,b,c,d,e){var f=pg(c,d);c=c?qg+c:"";return Xf(b,function(b){b.c||(b.selector=b.s=rg(a,b,a.b,c,f),b.c=!0);e&&e(b,c,f)})}function pg(a,b){return b?"[is="+a+"]":a}function rg(a,b,c,d,e){var f=b.selector.split(sg);if(!$f(b)){b=0;for(var h=f.length,g;b<h&&(g=f[b]);b++)f[b]=c.call(a,g,d,e)}return f.join(sg)}
197 function tg(a){return a.replace(ug,function(a,c,d){-1<d.indexOf("+")?d=d.replace(/\+/g,"___"):-1<d.indexOf("___")&&(d=d.replace(/___/g,"+"));return":"+c+"("+d+")"})}gg.prototype.b=function(a,b,c){var d=!1;a=a.trim();var e=ug.test(a);e&&(a=a.replace(ug,function(a,b,c){return":"+b+"("+c.replace(/\s/g,"")+")"}),a=tg(a));a=a.replace(vg,wg+" $1");a=a.replace(xg,function(a,e,g){d||(a=yg(g,e,b,c),d=d||a.stop,e=a.Oa,g=a.value);return e+g});e&&(a=tg(a));return a};
198 function yg(a,b,c,d){var e=a.indexOf(zg);0<=a.indexOf(wg)?a=Ag(a,d):0!==e&&(a=c?Bg(a,c):a);c=!1;0<=e&&(b="",c=!0);if(c){var f=!0;c&&(a=a.replace(Cg,function(a,b){return" > "+b}))}a=a.replace(Dg,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,Oa:b,stop:f}}function Bg(a,b){a=a.split(Eg);a[0]+=b;return a.join(Eg)}
199 function Ag(a,b){var c=a.match(Fg);return(c=c&&c[2].trim()||"")?c[0].match(Gg)?a.replace(Fg,function(a,c,f){return b+f}):c.split(Gg)[0]===b?c:Hg:a.replace(wg,b)}function Ig(a){a.selector===Jg&&(a.selector="html")}gg.prototype.c=function(a){return a.match(zg)?this.b(a,Kg):Bg(a.trim(),Kg)};ea.Object.defineProperties(gg.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}});
200 var ug=/:(nth[-\w]+)\(([^)]+)\)/,Kg=":not(.style-scope)",sg=",",xg=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,Gg=/[[.:#*]/,wg=":host",Jg=":root",zg="::slotted",vg=new RegExp("^("+zg+")"),Fg=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Cg=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Dg=/(.*):dir\((?:(ltr|rtl))\)/,qg=".",Eg=":",kg="class",Hg="should_not_match",W=new gg;function Lg(a,b,c,d){this.B=a||null;this.b=b||null;this.oa=c||[];this.L=null;this.P=d||"";this.a=this.v=this.G=null}function X(a){return a?a.__styleInfo:null}function Mg(a,b){return a.__styleInfo=b}Lg.prototype.c=function(){return this.B};Lg.prototype._getStyleRules=Lg.prototype.c;function Ng(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var Og=navigator.userAgent.match("Trident");function Pg(){}function Qg(a){var b={},c=[],d=0;Yf(a,function(a){Rg(a);a.index=d++;a=a.m.cssText;for(var c;c=Sf.exec(a);){var e=c[1];":"!==c[2]&&(b[e]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var e in b)a.push(e);return a}
201 function Rg(a){if(!a.m){var b={},c={};Sg(a,c)&&(b.A=c,a.rules=null);b.cssText=a.parsedCssText.replace(Vf,"").replace(Qf,"");a.m=b}}function Sg(a,b){var c=a.m;if(c){if(c.A)return Object.assign(b,c.A),!0}else{c=a.parsedCssText;for(var d;a=Qf.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}}
202 function Tg(a,b,c){b&&(b=0<=b.indexOf(";")?Ug(a,b,c):dg(b,function(b,e,f,h){if(!e)return b+h;(e=Tg(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=Tg(a,c[f]||f,c)||f;return b+(e||"")+h}));return b&&b.trim()||""}
203 function Ug(a,b,c){b=b.split(";");for(var d=0,e,f;d<b.length;d++)if(e=b[d]){Rf.lastIndex=0;if(f=Rf.exec(e))e=Tg(a,c[f[1]],c);else if(f=e.indexOf(":"),-1!==f){var h=e.substring(f);h=h.trim();h=Tg(a,h,c)||h;e=e.substring(0,f)+h}b[d]=e&&e.lastIndexOf(";")===e.length-1?e.slice(0,-1):e||""}return b.join(";")}
204 function Vg(a,b){var c={},d=[];Yf(a,function(a){a.m||Rg(a);var e=a.s||a.parsedSelector;b&&a.m.A&&e&&Ng.call(b,e)&&(Sg(a,c),a=a.index,e=parseInt(a/32,10),d[e]=(d[e]||0)|1<<a%32)},null,!0);return{A:c,key:d}}
205 function Wg(a,b,c,d){b.m||Rg(b);if(b.m.A){var e=fg(a);a=e.is;e=e.P;e=a?pg(a,e):"html";var f=b.parsedSelector,h=":host > *"===f||"html"===f,g=0===f.indexOf(":host")&&!h;"shady"===c&&(h=f===e+" > *."+e||-1!==f.indexOf("html"),g=!h&&0===f.indexOf(e));"shadow"===c&&(h=":host > *"===f||"html"===f,g=g&&!h);if(h||g)c=e,g&&(b.s||(b.s=rg(W,b,W.b,a?qg+a:"",e)),c=b.s||e),d({ab:c,Ua:g,ub:h})}}
206 function Xg(a,b){var c={},d={},e=b&&b.__cssBuild;Yf(b,function(b){Wg(a,b,e,function(e){Ng.call(a.lb||a,e.ab)&&(e.Ua?Sg(b,c):Sg(b,d))})},null,!0);return{$a:d,Sa:c}}
207 function Yg(a,b,c,d){var e=fg(b),f=pg(e.is,e.P),h=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])");e=X(b).B;var g=Zg(e,d);return ng(b,e,function(b){var e="";b.m||Rg(b);b.m.cssText&&(e=Ug(a,b.m.cssText,c));b.cssText=e;if(!S&&!$f(b)&&b.cssText){var k=e=b.cssText;null==b.wa&&(b.wa=Tf.test(e));if(b.wa)if(null==b.$){b.$=[];for(var n in g)k=g[n],k=k(e),e!==k&&(e=k,b.$.push(n))}else{for(n=0;n<b.$.length;++n)k=g[b.$[n]],e=k(e);k=e}b.cssText=k;b.s=b.s||b.selector;e="."+
208 d;n=b.s.split(",");k=0;for(var t=n.length,C;k<t&&(C=n[k]);k++)n[k]=C.match(h)?C.replace(f,e):e+" "+C;b.selector=n.join(",")}})}function Zg(a,b){a=a.b;var c={};if(!S&&a)for(var d=0,e=a[d];d<a.length;e=a[++d]){var f=e,h=b;f.i=new RegExp("\\b"+f.keyframesName+"(?!\\B|-)","g");f.a=f.keyframesName+"-"+h;f.s=f.s||f.selector;f.selector=f.s.replace(f.keyframesName,f.a);c[e.keyframesName]=$g(e)}return c}function $g(a){return function(b){return b.replace(a.i,a.a)}}
209 function ah(a,b){var c=bh,d=Zf(a);a.textContent=Xf(d,function(a){var d=a.cssText=a.parsedCssText;a.m&&a.m.cssText&&(d=d.replace(Kf,"").replace(Lf,""),a.cssText=Ug(c,d,b))})}ea.Object.defineProperties(Pg.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"x-scope"}}});var bh=new Pg;var ch={},dh=window.customElements;if(dh&&!S){var eh=dh.define;dh.define=function(a,b,c){var d=document.createComment(" Shady DOM styles for "+a+" "),e=document.head;e.insertBefore(d,(cg?cg.nextSibling:null)||e.firstChild);cg=d;ch[a]=d;eh.call(dh,a,b,c)}};function fh(){this.cache={}}fh.prototype.store=function(a,b,c,d){var e=this.cache[a]||[];e.push({A:b,styleElement:c,v:d});100<e.length&&e.shift();this.cache[a]=e};fh.prototype.fetch=function(a,b,c){if(a=this.cache[a])for(var d=a.length-1;0<=d;d--){var e=a[d],f;a:{for(f=0;f<c.length;f++){var h=c[f];if(e.A[h]!==b[h]){f=!1;break a}}f=!0}if(f)return e}};function gh(){}
210 function hh(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.target!==document.documentElement&&c.target!==document.head)for(var d=0;d<c.addedNodes.length;d++){var e=c.addedNodes[d];if(e.nodeType===Node.ELEMENT_NODE){var f=e.getRootNode();var h=e;var g=[];h.classList?g=Array.from(h.classList):h instanceof window.SVGElement&&h.hasAttribute("class")&&(g=h.getAttribute("class").split(/\s+/));h=g;g=h.indexOf(W.a);if((h=-1<g?h[g+1]:"")&&f===e.ownerDocument)mg(e,h);else if(f.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(f=
211 f.host))for(f=fg(f).is,f!==h&&lg(e,h,f),e=window.ShadyDOM.nativeMethods.querySelectorAll.call(e,":not(."+W.a+")"),f=0;f<e.length;f++)if(h=e[f],g=h.getRootNode().host)g=fg(g).is,jg(h,g)}}}}
212 if(!S){var ih=new MutationObserver(hh),jh=function(a){ih.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)jh(document);else{var kh=function(){jh(document.body)};window.HTMLImports?window.HTMLImports.whenReady(kh):requestAnimationFrame(function(){if("loading"===document.readyState){var a=function(){kh();document.removeEventListener("readystatechange",a)};document.addEventListener("readystatechange",a)}else kh()})}gh=function(){hh(ih.takeRecords())}}
213 var lh=gh;var mh={};var nh=Promise.resolve();function oh(a){if(a=mh[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function ph(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function qh(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a.b||(a.b=!0,nh.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a.b=!1}))};var rh=new fh;function Y(){this.J={};this.c=document.documentElement;var a=new xf;a.rules=[];this.i=Mg(this.c,new Lg(a));this.o=!1;this.b=this.a=null}p=Y.prototype;p.pa=function(){lh()};p.Qa=function(a){return Zf(a)};p.cb=function(a){return Xf(a)};p.prepareTemplate=function(a,b,c){this.prepareTemplateDom(a,b);this.prepareTemplateStyles(a,b,c)};
214 p.prepareTemplateStyles=function(a,b,c){if(!a.o){a.o=!0;a.name=b;a.extends=c;mh[b]=a;var d=(d=a.content.querySelector("style"))?d.getAttribute("css-build")||"":"";var e=[];for(var f=a.content.querySelectorAll("style"),h=0;h<f.length;h++){var g=f[h];if(g.hasAttribute("shady-unscoped")){if(!S){var k=g.textContent;Wf.has(k)||(Wf.add(k),k=g.cloneNode(!0),document.head.appendChild(k));g.parentNode.removeChild(g)}}else e.push(g.textContent),g.parentNode.removeChild(g)}e=e.join("").trim();c={is:b,extends:c,
215 ib:d};sh(this);f=Rf.test(e)||Qf.test(e);Rf.lastIndex=0;Qf.lastIndex=0;e=yf(e);f&&U&&this.a&&this.a.transformRules(e,b);a._styleAst=e;a.J=d;d=[];U||(d=Qg(a._styleAst));if(!d.length||U)e=S?a.content:null,b=ch[b],f=ng(c,a._styleAst),b=f.length?ag(f,c.is,e,b):void 0,a.a=b;a.i=d}};p.prepareTemplateDom=function(a,b){S||a.c||(a.c=!0,hg(a.content,b))};
216 function th(a){!a.b&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(a.b=window.ShadyCSS.CustomStyleInterface,a.b.transformCallback=function(b){a.Aa(b)},a.b.validateCallback=function(){requestAnimationFrame(function(){(a.b.enqueued||a.o)&&a.flushCustomStyles()})})}function sh(a){!a.a&&window.ShadyCSS&&window.ShadyCSS.ApplyShim&&(a.a=window.ShadyCSS.ApplyShim,a.a.invalidCallback=oh);th(a)}
217 p.flushCustomStyles=function(){sh(this);if(this.b){var a=this.b.processStyles();if(this.b.enqueued){if(U)for(var b=0;b<a.length;b++){var c=this.b.getStyleForCustomStyle(a[b]);if(c&&U&&this.a){var d=Zf(c);sh(this);this.a.transformRules(d);c.textContent=Xf(d)}}else for(uh(this,this.c,this.i),b=0;b<a.length;b++)(c=this.b.getStyleForCustomStyle(a[b]))&&ah(c,this.i.G);this.b.enqueued=!1;this.o&&!U&&this.styleDocument()}}};
218 p.styleElement=function(a,b){var c=fg(a).is,d=X(a);if(!d){var e=fg(a);d=e.is;e=e.P;var f=ch[d];d=mh[d];if(d){var h=d._styleAst;var g=d.i}d=Mg(a,new Lg(h,f,g,e))}a!==this.c&&(this.o=!0);b&&(d.L=d.L||{},Object.assign(d.L,b));if(U){if(d.L){b=d.L;for(var k in b)null===k?a.style.removeProperty(k):a.style.setProperty(k,b[k])}if(((k=mh[c])||a===this.c)&&k&&k.a&&!ph(k)){if(ph(k)||k._applyShimValidatingVersion!==k._applyShimNextVersion)sh(this),this.a&&this.a.transformRules(k._styleAst,c),k.a.textContent=
219 ng(a,d.B),qh(k);S&&(c=a.shadowRoot)&&(c.querySelector("style").textContent=ng(a,d.B));d.B=k._styleAst}}else if(this.pa(),uh(this,a,d),d.oa&&d.oa.length){c=d;k=fg(a).is;d=(b=rh.fetch(k,c.G,c.oa))?b.styleElement:null;h=c.v;(g=b&&b.v)||(g=this.J[k]=(this.J[k]||0)+1,g=k+"-"+g);c.v=g;g=c.v;e=bh;e=d?d.textContent||"":Yg(e,a,c.G,g);f=X(a);var l=f.a;l&&!S&&l!==d&&(l._useCount--,0>=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));S?f.a?(f.a.textContent=e,d=f.a):e&&(d=ag(e,g,a.shadowRoot,f.b)):d?d.parentNode||
220 (Og&&-1<e.indexOf("@media")&&(d.textContent=e),bg(d,null,f.b)):e&&(d=ag(e,g,null,f.b));d&&(d._useCount=d._useCount||0,f.a!=d&&d._useCount++,f.a=d);g=d;S||(d=c.v,f=e=a.getAttribute("class")||"",h&&(f=e.replace(new RegExp("\\s*x-scope\\s*"+h+"\\s*","g")," ")),f+=(f?" ":"")+"x-scope "+d,e!==f&&eg(a,f));b||rh.store(k,c.G,g,c.v)}};function vh(a,b){return(b=b.getRootNode().host)?X(b)?b:vh(a,b):a.c}
221 function uh(a,b,c){a=vh(a,b);var d=X(a);a=Object.create(d.G||null);var e=Xg(b,c.B);b=Vg(d.B,b).A;Object.assign(a,e.Sa,b,e.$a);b=c.L;for(var f in b)if((e=b[f])||0===e)a[f]=e;f=bh;b=Object.getOwnPropertyNames(a);for(e=0;e<b.length;e++)d=b[e],a[d]=Tg(f,a[d],a);c.G=a}p.styleDocument=function(a){this.styleSubtree(this.c,a)};
222 p.styleSubtree=function(a,b){var c=a.shadowRoot;(c||a===this.c)&&this.styleElement(a,b);if(b=c&&(c.children||c.childNodes))for(a=0;a<b.length;a++)this.styleSubtree(b[a]);else if(a=a.children||a.childNodes)for(b=0;b<a.length;b++)this.styleSubtree(a[b])};p.Aa=function(a){var b=this,c=Zf(a);Yf(c,function(a){if(S)Ig(a);else{var c=W;a.selector=a.parsedSelector;Ig(a);a.selector=a.s=rg(c,a,c.c,void 0,void 0)}U&&(sh(b),b.a&&b.a.transformRule(a))});U?a.textContent=Xf(c):this.i.B.rules.push(c)};
223 p.getComputedStyleValue=function(a,b){var c;U||(c=(X(a)||X(vh(this,a))).G[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():""};p.bb=function(a,b){var c=a.getRootNode();b=b?b.split(/\s/):[];c=c.host&&c.host.localName;if(!c){var d=a.getAttribute("class");if(d){d=d.split(/\s/);for(var e=0;e<d.length;e++)if(d[e]===W.a){c=d[e+1];break}}}c&&b.push(W.a,c);U||(c=X(a))&&c.v&&b.push(bh.a,c.v);eg(a,b.join(" "))};p.Na=function(a){return X(a)};Y.prototype.flush=Y.prototype.pa;
224 Y.prototype.prepareTemplate=Y.prototype.prepareTemplate;Y.prototype.styleElement=Y.prototype.styleElement;Y.prototype.styleDocument=Y.prototype.styleDocument;Y.prototype.styleSubtree=Y.prototype.styleSubtree;Y.prototype.getComputedStyleValue=Y.prototype.getComputedStyleValue;Y.prototype.setElementClass=Y.prototype.bb;Y.prototype._styleInfoForNode=Y.prototype.Na;Y.prototype.transformCustomStyleForDocument=Y.prototype.Aa;Y.prototype.getStyleAst=Y.prototype.Qa;Y.prototype.styleAstToString=Y.prototype.cb;
225 Y.prototype.flushCustomStyles=Y.prototype.flushCustomStyles;Object.defineProperties(Y.prototype,{nativeShadow:{get:function(){return S}},nativeCss:{get:function(){return U}}});var Z=new Y,wh,xh;window.ShadyCSS&&(wh=window.ShadyCSS.ApplyShim,xh=window.ShadyCSS.CustomStyleInterface);
226 window.ShadyCSS={ScopingShim:Z,prepareTemplate:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplate(a,b,c)},prepareTemplateDom:function(a,b){Z.prepareTemplateDom(a,b)},prepareTemplateStyles:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplateStyles(a,b,c)},styleSubtree:function(a,b){Z.flushCustomStyles();Z.styleSubtree(a,b)},styleElement:function(a){Z.flushCustomStyles();Z.styleElement(a)},styleDocument:function(a){Z.flushCustomStyles();Z.styleDocument(a)},flushCustomStyles:function(){Z.flushCustomStyles()},
227 getComputedStyleValue:function(a,b){return Z.getComputedStyleValue(a,b)},nativeCss:U,nativeShadow:S};wh&&(window.ShadyCSS.ApplyShim=wh);xh&&(window.ShadyCSS.CustomStyleInterface=xh);var yh=window.customElements,zh=window.HTMLImports,Ah=window.HTMLTemplateElement;window.WebComponents=window.WebComponents||{};if(yh&&yh.polyfillWrapFlushCallback){var Bh,Ch=function(){if(Bh){Ah.C&&Ah.C(window.document);var a=Bh;Bh=null;a();return!0}},Dh=zh.whenReady;yh.polyfillWrapFlushCallback(function(a){Bh=a;Dh(Ch)});zh.whenReady=function(a){Dh(function(){Ch()?zh.whenReady(a):a()})}}
228 zh.whenReady(function(){requestAnimationFrame(function(){window.WebComponents.ready=!0;document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})});var Eh=document.createElement("style");Eh.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var Fh=document.querySelector("head");Fh.insertBefore(Eh,Fh.firstChild);}).call(this);
86 function La(){this.ta=this.root=null;this.W=!1;this.D=this.R=this.ga=this.assignedSlot=this.assignedNodes=this.I=null;this.childNodes=this.nextSibling=this.previousSibling=this.lastChild=this.firstChild=this.parentNode=this.L=void 0;this.Aa=this.oa=!1;this.P={}}La.prototype.toJSON=function(){return{}};function u(a){a.da||(a.da=new La);return a.da}function v(a){return a&&a.da};var w=window.ShadyDOM||{};w.Na=!(!Element.prototype.attachShadow||!Node.prototype.getRootNode);var Ma=Object.getOwnPropertyDescriptor(Node.prototype,"firstChild");w.w=!!(Ma&&Ma.configurable&&Ma.get);w.ia=w.force||!w.Na;var Na=navigator.userAgent.match("Trident"),Oa=navigator.userAgent.match("Edge");void 0===w.wa&&(w.wa=w.w&&(Na||Oa));function Pa(a){return(a=v(a))&&void 0!==a.firstChild}function y(a){return"ShadyRoot"===a.Ga}function Qa(a){a=a.getRootNode();if(y(a))return a}
87 var Ra=Element.prototype,Sa=Ra.matches||Ra.matchesSelector||Ra.mozMatchesSelector||Ra.msMatchesSelector||Ra.oMatchesSelector||Ra.webkitMatchesSelector;function Ta(a,b){if(a&&b)for(var c=Object.getOwnPropertyNames(b),d=0,e=void 0;d<c.length&&(e=c[d]);d++){var f=e,h=a,g=Object.getOwnPropertyDescriptor(b,f);g&&Object.defineProperty(h,f,g)}}function Ua(a,b){for(var c=[],d=1;d<arguments.length;++d)c[d-1]=arguments[d];for(d=0;d<c.length;d++)Ta(a,c[d]);return a}
88 function Va(a,b){for(var c in b)a[c]=b[c]}var Wa=document.createTextNode(""),Xa=0,Ya=[];(new MutationObserver(function(){for(;Ya.length;)try{Ya.shift()()}catch(a){throw Wa.textContent=Xa++,a;}})).observe(Wa,{characterData:!0});function Za(a){Ya.push(a);Wa.textContent=Xa++}var $a=!!document.contains;function ab(a,b){for(;b;){if(b==a)return!0;b=b.parentNode}return!1}
89 function bb(a){for(var b=a.length-1;0<=b;b--){var c=a[b],d=c.getAttribute("id")||c.getAttribute("name");d&&"length"!==d&&isNaN(d)&&(a[d]=c)}a.item=function(b){return a[b]};a.namedItem=function(b){if("length"!==b&&isNaN(b)&&a[b])return a[b];for(var c=ja(a),d=c.next();!d.done;d=c.next())if(d=d.value,(d.getAttribute("id")||d.getAttribute("name"))==b)return d;return null};return a};var cb=[],db;function eb(a){db||(db=!0,Za(fb));cb.push(a)}function fb(){db=!1;for(var a=!!cb.length;cb.length;)cb.shift()();return a}fb.list=cb;function gb(){this.a=!1;this.addedNodes=[];this.removedNodes=[];this.U=new Set}function hb(a){a.a||(a.a=!0,Za(function(){a.flush()}))}gb.prototype.flush=function(){if(this.a){this.a=!1;var a=this.takeRecords();a.length&&this.U.forEach(function(b){b(a)})}};gb.prototype.takeRecords=function(){if(this.addedNodes.length||this.removedNodes.length){var a=[{addedNodes:this.addedNodes,removedNodes:this.removedNodes}];this.addedNodes=[];this.removedNodes=[];return a}return[]};
90 function ib(a,b){var c=u(a);c.I||(c.I=new gb);c.I.U.add(b);var d=c.I;return{Fa:b,G:d,Ha:a,takeRecords:function(){return d.takeRecords()}}}function nb(a){var b=a&&a.G;b&&(b.U.delete(a.Fa),b.U.size||(u(a.Ha).I=null))}
91 function ob(a,b){var c=b.getRootNode();return a.map(function(a){var b=c===a.target.getRootNode();if(b&&a.addedNodes){if(b=Array.from(a.addedNodes).filter(function(a){return c===a.getRootNode()}),b.length)return a=Object.create(a),Object.defineProperty(a,"addedNodes",{value:b,configurable:!0}),a}else if(b)return a}).filter(function(a){return a})};var pb=Element.prototype.insertBefore,qb=Element.prototype.replaceChild,rb=Element.prototype.removeChild,sb=Element.prototype.setAttribute,tb=Element.prototype.removeAttribute,ub=Element.prototype.cloneNode,vb=Document.prototype.importNode,wb=Element.prototype.addEventListener,xb=Element.prototype.removeEventListener,yb=Window.prototype.addEventListener,zb=Window.prototype.removeEventListener,Ab=Element.prototype.dispatchEvent,Bb=Node.prototype.contains||HTMLElement.prototype.contains,Cb=Document.prototype.getElementById,
92 Db=Element.prototype.querySelector,Eb=DocumentFragment.prototype.querySelector,Fb=Document.prototype.querySelector,Gb=Element.prototype.querySelectorAll,Hb=DocumentFragment.prototype.querySelectorAll,Ib=Document.prototype.querySelectorAll,z={};z.appendChild=Element.prototype.appendChild;z.insertBefore=pb;z.replaceChild=qb;z.removeChild=rb;z.setAttribute=sb;z.removeAttribute=tb;z.cloneNode=ub;z.importNode=vb;z.addEventListener=wb;z.removeEventListener=xb;z.eb=yb;z.fb=zb;z.dispatchEvent=Ab;
93 z.contains=Bb;z.getElementById=Cb;z.nb=Db;z.qb=Eb;z.lb=Fb;z.querySelector=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return Db.call(this,a);case Node.DOCUMENT_NODE:return Fb.call(this,a);default:return Eb.call(this,a)}};z.ob=Gb;z.rb=Hb;z.mb=Ib;z.querySelectorAll=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return Gb.call(this,a);case Node.DOCUMENT_NODE:return Ib.call(this,a);default:return Hb.call(this,a)}};var Jb=/[&\u00A0"]/g,Kb=/[&\u00A0<>]/g;function Lb(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}}function Mb(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}var Nb=Mb("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),Ob=Mb("style script xmp iframe noembed noframes plaintext noscript".split(" "));
94 function Pb(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):a.childNodes,e=0,f=d.length,h=void 0;e<f&&(h=d[e]);e++){a:{var g=h;var k=a,l=b;switch(g.nodeType){case Node.ELEMENT_NODE:k=g.localName;for(var m="<"+k,p=g.attributes,x=0,N;N=p[x];x++)m+=" "+N.name+'="'+N.value.replace(Jb,Lb)+'"';m+=">";g=Nb[k]?m:m+Pb(g,l)+"</"+k+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&Ob[k.localName]?g:g.replace(Kb,Lb);break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),
95 Error("not implemented");}}c+=g}return c};var A=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),B=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1);function Qb(a){var b=[];A.currentNode=a;for(a=A.firstChild();a;)b.push(a),a=A.nextSibling();return b}
96 var D={parentNode:function(a){A.currentNode=a;return A.parentNode()},firstChild:function(a){A.currentNode=a;return A.firstChild()},lastChild:function(a){A.currentNode=a;return A.lastChild()},previousSibling:function(a){A.currentNode=a;return A.previousSibling()},nextSibling:function(a){A.currentNode=a;return A.nextSibling()}};D.childNodes=Qb;D.parentElement=function(a){B.currentNode=a;return B.parentNode()};D.firstElementChild=function(a){B.currentNode=a;return B.firstChild()};
97 D.lastElementChild=function(a){B.currentNode=a;return B.lastChild()};D.previousElementSibling=function(a){B.currentNode=a;return B.previousSibling()};D.nextElementSibling=function(a){B.currentNode=a;return B.nextSibling()};D.children=function(a){var b=[];B.currentNode=a;for(a=B.firstChild();a;)b.push(a),a=B.nextSibling();return bb(b)};D.innerHTML=function(a){return Pb(a,function(a){return Qb(a)})};
98 D.textContent=function(a){switch(a.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:a=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);for(var b="",c;c=a.nextNode();)b+=c.nodeValue;return b;default:return a.nodeValue}};var Rb=w.w,Sb=[Node.prototype,Element.prototype,HTMLElement.prototype];function E(a){var b;a:{for(b=0;b<Sb.length;b++){var c=Sb[b];if(c.hasOwnProperty(a)){b=c;break a}}b=void 0}if(!b)throw Error("Could not find descriptor for "+a);return Object.getOwnPropertyDescriptor(b,a)}
99 var F=Rb?{parentNode:E("parentNode"),firstChild:E("firstChild"),lastChild:E("lastChild"),previousSibling:E("previousSibling"),nextSibling:E("nextSibling"),childNodes:E("childNodes"),parentElement:E("parentElement"),previousElementSibling:E("previousElementSibling"),nextElementSibling:E("nextElementSibling"),innerHTML:E("innerHTML"),textContent:E("textContent"),firstElementChild:E("firstElementChild"),lastElementChild:E("lastElementChild"),children:E("children")}:{},Tb=Rb?{firstElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,
100 "firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"children")}:{},Ub=Rb?{firstElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(Document.prototype,"children")}:{},Vb={sa:F,pb:Tb,kb:Ub,parentNode:function(a){return F.parentNode.get.call(a)},
101 firstChild:function(a){return F.firstChild.get.call(a)},lastChild:function(a){return F.lastChild.get.call(a)},previousSibling:function(a){return F.previousSibling.get.call(a)},nextSibling:function(a){return F.nextSibling.get.call(a)},childNodes:function(a){return Array.prototype.slice.call(F.childNodes.get.call(a))},parentElement:function(a){return F.parentElement.get.call(a)},previousElementSibling:function(a){return F.previousElementSibling.get.call(a)},nextElementSibling:function(a){return F.nextElementSibling.get.call(a)},
102 innerHTML:function(a){return F.innerHTML.get.call(a)},textContent:function(a){return F.textContent.get.call(a)},children:function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Tb.children.get.call(a);case Node.DOCUMENT_NODE:return Ub.children.get.call(a);default:return F.children.get.call(a)}},firstElementChild:function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Tb.firstElementChild.get.call(a);case Node.DOCUMENT_NODE:return Ub.firstElementChild.get.call(a);default:return F.firstElementChild.get.call(a)}},
103 lastElementChild:function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Tb.lastElementChild.get.call(a);case Node.DOCUMENT_NODE:return Ub.lastElementChild.get.call(a);default:return F.lastElementChild.get.call(a)}}};var G=w.wa?Vb:D;function Wb(a){for(;a.firstChild;)a.removeChild(a.firstChild)}
104 var Xb=w.w,Yb=document.implementation.createHTMLDocument("inert"),Zb=Object.getOwnPropertyDescriptor(Node.prototype,"isConnected"),$b=Zb&&Zb.get,ac=Object.getOwnPropertyDescriptor(Document.prototype,"activeElement"),bc={parentElement:{get:function(){var a=v(this);(a=a&&a.parentNode)&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:G.parentElement(this)},configurable:!0},parentNode:{get:function(){var a=v(this);a=a&&a.parentNode;return void 0!==a?a:G.parentNode(this)},configurable:!0},
105 nextSibling:{get:function(){var a=v(this);a=a&&a.nextSibling;return void 0!==a?a:G.nextSibling(this)},configurable:!0},previousSibling:{get:function(){var a=v(this);a=a&&a.previousSibling;return void 0!==a?a:G.previousSibling(this)},configurable:!0},nextElementSibling:{get:function(){var a=v(this);if(a&&void 0!==a.nextSibling){for(a=this.nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return G.nextElementSibling(this)},configurable:!0},previousElementSibling:{get:function(){var a=
106 v(this);if(a&&void 0!==a.previousSibling){for(a=this.previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return G.previousElementSibling(this)},configurable:!0}},cc={className:{get:function(){return this.getAttribute("class")||""},set:function(a){this.setAttribute("class",a)},configurable:!0}},dc={childNodes:{get:function(){if(Pa(this)){var a=v(this);if(!a.childNodes){a.childNodes=[];for(var b=this.firstChild;b;b=b.nextSibling)a.childNodes.push(b)}var c=a.childNodes}else c=
107 G.childNodes(this);c.item=function(a){return c[a]};return c},configurable:!0},childElementCount:{get:function(){return this.children.length},configurable:!0},firstChild:{get:function(){var a=v(this);a=a&&a.firstChild;return void 0!==a?a:G.firstChild(this)},configurable:!0},lastChild:{get:function(){var a=v(this);a=a&&a.lastChild;return void 0!==a?a:G.lastChild(this)},configurable:!0},textContent:{get:function(){if(Pa(this)){for(var a=[],b=0,c=this.childNodes,d;d=c[b];b++)d.nodeType!==Node.COMMENT_NODE&&
108 a.push(d.textContent);return a.join("")}return G.textContent(this)},set:function(a){if("undefined"===typeof a||null===a)a="";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:if(!Pa(this)&&Xb){var b=this.firstChild;(b!=this.lastChild||b&&b.nodeType!=Node.TEXT_NODE)&&Wb(this);Vb.sa.textContent.set.call(this,a)}else Wb(this),(0<a.length||this.nodeType===Node.ELEMENT_NODE)&&this.appendChild(document.createTextNode(a));break;default:this.nodeValue=a}},configurable:!0},firstElementChild:{get:function(){var a=
109 v(this);if(a&&void 0!==a.firstChild){for(a=this.firstChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return G.firstElementChild(this)},configurable:!0},lastElementChild:{get:function(){var a=v(this);if(a&&void 0!==a.lastChild){for(a=this.lastChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return G.lastElementChild(this)},configurable:!0},children:{get:function(){return Pa(this)?bb(Array.prototype.filter.call(this.childNodes,function(a){return a.nodeType===Node.ELEMENT_NODE})):
110 G.children(this)},configurable:!0},innerHTML:{get:function(){return Pa(this)?Pb("template"===this.localName?this.content:this):G.innerHTML(this)},set:function(a){var b="template"===this.localName?this.content:this;Wb(b);var c=this.localName||"div";c=this.namespaceURI&&this.namespaceURI!==Yb.namespaceURI?Yb.createElementNS(this.namespaceURI,c):Yb.createElement(c);Xb?Vb.sa.innerHTML.set.call(c,a):c.innerHTML=a;for(a="template"===this.localName?c.content:c;a.firstChild;)b.appendChild(a.firstChild)},
111 configurable:!0}},ec={shadowRoot:{get:function(){var a=v(this);return a&&a.ta||null},configurable:!0}},fc={activeElement:{get:function(){var a=ac&&ac.get?ac.get.call(document):w.w?void 0:document.activeElement;if(a&&a.nodeType){var b=!!y(this);if(this===document||b&&this.host!==a&&z.contains.call(this.host,a)){for(b=Qa(a);b&&b!==this;)a=b.host,b=Qa(a);a=this===document?b?null:a:b===this?a:null}else a=null}else a=null;return a},set:function(){},configurable:!0}};
112 function H(a,b,c){for(var d in b){var e=Object.getOwnPropertyDescriptor(a,d);e&&e.configurable||!e&&c?Object.defineProperty(a,d,b[d]):c&&console.warn("Could not define",d,"on",a)}}function gc(a){H(a,bc);H(a,cc);H(a,dc);H(a,fc)}
113 function hc(){var a=ic.prototype;a.__proto__=DocumentFragment.prototype;H(a,bc,!0);H(a,dc,!0);H(a,fc,!0);Object.defineProperties(a,{nodeType:{value:Node.DOCUMENT_FRAGMENT_NODE,configurable:!0},nodeName:{value:"#document-fragment",configurable:!0},nodeValue:{value:null,configurable:!0}});["localName","namespaceURI","prefix"].forEach(function(b){Object.defineProperty(a,b,{value:void 0,configurable:!0})});["ownerDocument","baseURI","isConnected"].forEach(function(b){Object.defineProperty(a,b,{get:function(){return this.host[b]},
114 configurable:!0})})}var jc=w.w?function(){}:function(a){var b=u(a);b.oa||(b.oa=!0,H(a,bc,!0),H(a,cc,!0))},kc=w.w?function(){}:function(a){u(a).Aa||(H(a,dc,!0),H(a,ec,!0))};var lc=G.childNodes;function mc(a,b,c){kc(b);var d=u(b);void 0!==d.firstChild&&(d.childNodes=null);if(a.nodeType===Node.DOCUMENT_FRAGMENT_NODE){d=a.childNodes;for(var e=0;e<d.length;e++)nc(d[e],b,c);a=u(a);b=void 0!==a.firstChild?null:void 0;a.firstChild=a.lastChild=b;a.childNodes=b}else nc(a,b,c)}
115 function nc(a,b,c){jc(a);c=c||null;var d=u(a),e=u(b),f=c?u(c):null;d.previousSibling=c?f.previousSibling:b.lastChild;if(f=v(d.previousSibling))f.nextSibling=a;if(f=v(d.nextSibling=c))f.previousSibling=a;d.parentNode=b;c?c===e.firstChild&&(e.firstChild=a):(e.lastChild=a,e.firstChild||(e.firstChild=a));e.childNodes=null}
116 function oc(a,b){var c=u(a);b=u(b);a===b.firstChild&&(b.firstChild=c.nextSibling);a===b.lastChild&&(b.lastChild=c.previousSibling);a=c.previousSibling;var d=c.nextSibling;a&&(u(a).nextSibling=d);d&&(u(d).previousSibling=a);c.parentNode=c.previousSibling=c.nextSibling=void 0;void 0!==b.childNodes&&(b.childNodes=null)}
117 function pc(a){var b=u(a);if(void 0===b.firstChild){b.childNodes=null;var c=lc(a);b.firstChild=c[0]||null;b.lastChild=c[c.length-1]||null;kc(a);for(b=0;b<c.length;b++){var d=c[b],e=u(d);e.parentNode=a;e.nextSibling=c[b+1]||null;e.previousSibling=c[b-1]||null;jc(d)}}};var qc=G.parentNode;
118 function rc(a,b,c){if(b===a)throw Error("Failed to execute 'appendChild' on 'Node': The new child element contains the parent.");if(c){var d=v(c);d=d&&d.parentNode;if(void 0!==d&&d!==a||void 0===d&&qc(c)!==a)throw Error("Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.");}if(c===b)return b;var e=[],f=sc,h=Qa(a),g=h?h.host.localName:"";if(b.parentNode){var k=tc(b);uc(b.parentNode,b,!!h||!(b.getRootNode()instanceof ShadowRoot));
119 f=function(a,b){vc()&&(wc(a,k),sc(a,b))}}d=!0;var l=!xc(b,g);!h||b.__noInsertionPoint&&!l||Ac(b,function(a){"slot"===a.localName&&e.push(a);l&&f(a,g)});e.length&&Bc(h,e);("slot"===a.localName||e.length)&&h&&Cc(h);Pa(a)&&(mc(b,a,c),h=v(a),Dc(a)?(Cc(h.root),d=!1):h.root&&(d=!1));d?(d=y(a)?a.host:a,c?(c=Ec(c),z.insertBefore.call(d,b,c)):z.appendChild.call(d,b)):b.ownerDocument!==a.ownerDocument&&a.ownerDocument.adoptNode(b);Fc(a,b);return b}
120 function uc(a,b,c){c=void 0===c?!1:c;if(b.parentNode!==a)throw Error("The node to be removed is not a child of this node: "+b);var d=Qa(b),e=v(a);if(Pa(a)&&(oc(b,a),Dc(a))){Cc(e.root);var f=!0}if(vc()&&!c&&d){var h=tc(b);Ac(b,function(a){wc(a,h)})}Gc(b);if(d){var g=a&&"slot"===a.localName;g&&(f=!0);((c=Hc(d,b))||g)&&Cc(d)}f||(f=y(a)?a.host:a,(!e.root&&"slot"!==b.localName||f===qc(b))&&z.removeChild.call(f,b));Fc(a,null,b);return b}
121 function Gc(a){var b=v(a);if(b&&void 0!==b.L){b=a.childNodes;for(var c=0,d=b.length,e=void 0;c<d&&(e=b[c]);c++)Gc(e)}if(a=v(a))a.L=void 0}function Ec(a){var b=a;a&&"slot"===a.localName&&(b=(b=(b=v(a))&&b.D)&&b.length?b[0]:Ec(a.nextSibling));return b}function Dc(a){return(a=(a=v(a))&&a.root)&&Ic(a)}
122 function Jc(a,b){if("slot"===b)a=a.parentNode,Dc(a)&&Cc(v(a).root);else if("slot"===a.localName&&"name"===b&&(b=Qa(a))){if(b.g){Kc(b);var c=a.Da,d=Lc(a);if(d!==c){c=b.i[c];var e=c.indexOf(a);0<=e&&c.splice(e,1);c=b.i[d]||(b.i[d]=[]);c.push(a);1<c.length&&(b.i[d]=Mc(c))}}Cc(b)}}function Fc(a,b,c){if(a=(a=v(a))&&a.I)b&&a.addedNodes.push(b),c&&a.removedNodes.push(c),hb(a)}
123 function Nc(a){if(a&&a.nodeType){var b=u(a),c=b.L;void 0===c&&(y(a)?(c=a,b.L=c):(c=(c=a.parentNode)?Nc(c):a,z.contains.call(document.documentElement,a)&&(b.L=c)));return c}}function Oc(a,b,c){var d=[];Pc(a.childNodes,b,c,d);return d}function Pc(a,b,c,d){for(var e=0,f=a.length,h=void 0;e<f&&(h=a[e]);e++){var g;if(g=h.nodeType===Node.ELEMENT_NODE){g=h;var k=b,l=c,m=d,p=k(g);p&&m.push(g);l&&l(p)?g=p:(Pc(g.childNodes,k,l,m),g=void 0)}if(g)break}}var Qc=null;
124 function vc(){Qc||(Qc=window.ShadyCSS&&window.ShadyCSS.ScopingShim);return Qc||null}function Rc(a,b,c){var d=vc();d&&"class"===b?d.setElementClass(a,c):(z.setAttribute.call(a,b,c),Jc(a,b))}function Sc(a,b){if(a.ownerDocument!==document||"template"===a.localName)return z.importNode.call(document,a,b);var c=z.importNode.call(document,a,!1);if(b){a=a.childNodes;b=0;for(var d;b<a.length;b++)d=Sc(a[b],!0),c.appendChild(d)}return c}function sc(a,b){var c=vc();c&&c.scopeNode(a,b)}
125 function wc(a,b){var c=vc();c&&c.unscopeNode(a,b)}function xc(a,b){var c=vc();if(!c)return!0;if(a.nodeType===Node.DOCUMENT_FRAGMENT_NODE){c=!0;for(var d=0;c&&d<a.childNodes.length;d++)c=c&&xc(a.childNodes[d],b);return c}return a.nodeType!==Node.ELEMENT_NODE?!0:c.currentScopeForNode(a)===b}function tc(a){if(a.nodeType!==Node.ELEMENT_NODE)return"";var b=vc();return b?b.currentScopeForNode(a):""}
126 function Ac(a,b){if(a){a.nodeType===Node.ELEMENT_NODE&&b(a);for(var c=0,d;c<a.childNodes.length;c++)d=a.childNodes[c],d.nodeType===Node.ELEMENT_NODE&&Ac(d,b)}};var Tc="__eventWrappers"+Date.now(),Uc=function(){var a=Object.getOwnPropertyDescriptor(Event.prototype,"composed");return a?function(b){return a.get.call(b)}:null}(),Vc={blur:!0,focus:!0,focusin:!0,focusout:!0,click:!0,dblclick:!0,mousedown:!0,mouseenter:!0,mouseleave:!0,mousemove:!0,mouseout:!0,mouseover:!0,mouseup:!0,wheel:!0,beforeinput:!0,input:!0,keydown:!0,keyup:!0,compositionstart:!0,compositionupdate:!0,compositionend:!0,touchstart:!0,touchend:!0,touchmove:!0,touchcancel:!0,pointerover:!0,
127 pointerenter:!0,pointerdown:!0,pointermove:!0,pointerup:!0,pointercancel:!0,pointerout:!0,pointerleave:!0,gotpointercapture:!0,lostpointercapture:!0,dragstart:!0,drag:!0,dragenter:!0,dragleave:!0,dragover:!0,drop:!0,dragend:!0,DOMActivate:!0,DOMFocusIn:!0,DOMFocusOut:!0,keypress:!0},Wc={DOMAttrModified:!0,DOMAttributeNameChanged:!0,DOMCharacterDataModified:!0,DOMElementNameChanged:!0,DOMNodeInserted:!0,DOMNodeInsertedIntoDocument:!0,DOMNodeRemoved:!0,DOMNodeRemovedFromDocument:!0,DOMSubtreeModified:!0};
128 function Xc(a,b){var c=[],d=a;for(a=a===window?window:a.getRootNode();d;)c.push(d),d=d.assignedSlot?d.assignedSlot:d.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&d.host&&(b||d!==a)?d.host:d.parentNode;c[c.length-1]===document&&c.push(window);return c}function Yc(a,b){if(!y)return a;a=Xc(a,!0);for(var c=0,d,e=void 0,f,h=void 0;c<b.length;c++)if(d=b[c],f=d===window?window:d.getRootNode(),f!==e&&(h=a.indexOf(f),e=f),!y(f)||-1<h)return d}
129 var Zc={get composed(){void 0===this.O&&(Uc?this.O="focusin"===this.type||"focusout"===this.type||Uc(this):!1!==this.isTrusted&&(this.O=Vc[this.type]));return this.O||!1},composedPath:function(){this.na||(this.na=Xc(this.__target,this.composed));return this.na},get target(){return Yc(this.currentTarget||this.__previousCurrentTarget,this.composedPath())},get relatedTarget(){if(!this.ca)return null;this.pa||(this.pa=Xc(this.ca,!0));return Yc(this.currentTarget||this.__previousCurrentTarget,this.pa)},
130 stopPropagation:function(){Event.prototype.stopPropagation.call(this);this.ba=!0},stopImmediatePropagation:function(){Event.prototype.stopImmediatePropagation.call(this);this.ba=this.za=!0}};function $c(a){function b(b,d){b=new a(b,d);b.O=d&&!!d.composed;return b}Va(b,a);b.prototype=a.prototype;return b}var ad={focus:!0,blur:!0};function bd(a){return a.__target!==a.target||a.ca!==a.relatedTarget}
131 function cd(a,b,c){if(c=b.__handlers&&b.__handlers[a.type]&&b.__handlers[a.type][c])for(var d=0,e;(e=c[d])&&(!bd(a)||a.target!==a.relatedTarget)&&(e.call(b,a),!a.za);d++);}
132 function dd(a){var b=a.composedPath();Object.defineProperty(a,"currentTarget",{get:function(){return d},configurable:!0});for(var c=b.length-1;0<=c;c--){var d=b[c];cd(a,d,"capture");if(a.ba)return}Object.defineProperty(a,"eventPhase",{get:function(){return Event.AT_TARGET}});var e;for(c=0;c<b.length;c++){d=b[c];var f=v(d);f=f&&f.root;if(0===c||f&&f===e)if(cd(a,d,"bubble"),d!==window&&(e=d.getRootNode()),a.ba)break}}
133 function ed(a,b,c,d,e,f){for(var h=0;h<a.length;h++){var g=a[h],k=g.type,l=g.capture,m=g.once,p=g.passive;if(b===g.node&&c===k&&d===l&&e===m&&f===p)return h}return-1}
134 function fd(a,b,c){if(b){var d=typeof b;if("function"===d||"object"===d)if("object"!==d||b.handleEvent&&"function"===typeof b.handleEvent){var e=this instanceof Window?z.eb:z.addEventListener;if(Wc[a])return e.call(this,a,b,c);if(c&&"object"===typeof c){var f=!!c.capture;var h=!!c.once;var g=!!c.passive}else f=!!c,g=h=!1;var k=c&&c.ea||this,l=b[Tc];if(l){if(-1<ed(l,k,a,f,h,g))return}else b[Tc]=[];l=function(e){h&&this.removeEventListener(a,b,c);e.__target||gd(e);if(k!==this){var f=Object.getOwnPropertyDescriptor(e,
135 "currentTarget");Object.defineProperty(e,"currentTarget",{get:function(){return k},configurable:!0})}e.__previousCurrentTarget=e.currentTarget;if(!y(k)||-1!=e.composedPath().indexOf(k))if(e.composed||-1<e.composedPath().indexOf(k))if(bd(e)&&e.target===e.relatedTarget)e.eventPhase===Event.BUBBLING_PHASE&&e.stopImmediatePropagation();else if(e.eventPhase===Event.CAPTURING_PHASE||e.bubbles||e.target===k||k instanceof Window){var g="function"===d?b.call(k,e):b.handleEvent&&b.handleEvent(e);k!==this&&
136 (f?(Object.defineProperty(e,"currentTarget",f),f=null):delete e.currentTarget);return g}};b[Tc].push({node:k,type:a,capture:f,once:h,passive:g,gb:l});ad[a]?(this.__handlers=this.__handlers||{},this.__handlers[a]=this.__handlers[a]||{capture:[],bubble:[]},this.__handlers[a][f?"capture":"bubble"].push(l)):e.call(this,a,l,c)}}}
137 function hd(a,b,c){if(b){var d=this instanceof Window?z.fb:z.removeEventListener;if(Wc[a])return d.call(this,a,b,c);if(c&&"object"===typeof c){var e=!!c.capture;var f=!!c.once;var h=!!c.passive}else e=!!c,h=f=!1;var g=c&&c.ea||this,k=void 0;var l=null;try{l=b[Tc]}catch(m){}l&&(f=ed(l,g,a,e,f,h),-1<f&&(k=l.splice(f,1)[0].gb,l.length||(b[Tc]=void 0)));d.call(this,a,k||b,c);k&&ad[a]&&this.__handlers&&this.__handlers[a]&&(a=this.__handlers[a][e?"capture":"bubble"],k=a.indexOf(k),-1<k&&a.splice(k,1))}}
138 function id(){for(var a in ad)window.addEventListener(a,function(a){a.__target||(gd(a),dd(a))},!0)}function gd(a){a.__target=a.target;a.ca=a.relatedTarget;if(w.w){var b=Object.getPrototypeOf(a);if(!b.hasOwnProperty("__patchProto")){var c=Object.create(b);c.hb=b;Ta(c,Zc);b.__patchProto=c}a.__proto__=b.__patchProto}else Ta(a,Zc)}var jd=$c(window.Event),kd=$c(window.CustomEvent),ld=$c(window.MouseEvent);
139 function md(){window.Event=jd;window.CustomEvent=kd;window.MouseEvent=ld;id();if(!Uc&&Object.getOwnPropertyDescriptor(Event.prototype,"isTrusted")){var a=function(){var a=new MouseEvent("click",{bubbles:!0,cancelable:!0,composed:!0});this.dispatchEvent(a)};Element.prototype.click?Element.prototype.click=a:HTMLElement.prototype.click&&(HTMLElement.prototype.click=a)}};function nd(a,b){return{index:a,M:[],T:b}}
140 function od(a,b,c,d){var e=0,f=0,h=0,g=0,k=Math.min(b-e,d-f);if(0==e&&0==f)a:{for(h=0;h<k;h++)if(a[h]!==c[h])break a;h=k}if(b==a.length&&d==c.length){g=a.length;for(var l=c.length,m=0;m<k-h&&pd(a[--g],c[--l]);)m++;g=m}e+=h;f+=h;b-=g;d-=g;if(0==b-e&&0==d-f)return[];if(e==b){for(b=nd(e,0);f<d;)b.M.push(c[f++]);return[b]}if(f==d)return[nd(e,b-e)];k=e;h=f;d=d-h+1;g=b-k+1;b=Array(d);for(l=0;l<d;l++)b[l]=Array(g),b[l][0]=l;for(l=0;l<g;l++)b[0][l]=l;for(l=1;l<d;l++)for(m=1;m<g;m++)if(a[k+m-1]===c[h+l-1])b[l][m]=
141 b[l-1][m-1];else{var p=b[l-1][m]+1,x=b[l][m-1]+1;b[l][m]=p<x?p:x}k=b.length-1;h=b[0].length-1;d=b[k][h];for(a=[];0<k||0<h;)0==k?(a.push(2),h--):0==h?(a.push(3),k--):(g=b[k-1][h-1],l=b[k-1][h],m=b[k][h-1],p=l<m?l<g?l:g:m<g?m:g,p==g?(g==d?a.push(0):(a.push(1),d=g),k--,h--):p==l?(a.push(3),k--,d=l):(a.push(2),h--,d=m));a.reverse();b=void 0;k=[];for(h=0;h<a.length;h++)switch(a[h]){case 0:b&&(k.push(b),b=void 0);e++;f++;break;case 1:b||(b=nd(e,0));b.T++;e++;b.M.push(c[f]);f++;break;case 2:b||(b=nd(e,0));
142 b.T++;e++;break;case 3:b||(b=nd(e,0)),b.M.push(c[f]),f++}b&&k.push(b);return k}function pd(a,b){return a===b};var qd=G.parentNode,rd=G.childNodes,sd={},td=w.deferConnectionCallbacks&&"loading"===document.readyState,ud;function vd(a){var b=[];do b.unshift(a);while(a=a.parentNode);return b}
143 function ic(a,b,c){if(a!==sd)throw new TypeError("Illegal constructor");this.Ga="ShadyRoot";this.host=b;this.c=c&&c.mode;pc(b);a=u(b);a.root=this;a.ta="closed"!==this.c?this:null;a=u(this);a.firstChild=a.lastChild=a.parentNode=a.nextSibling=a.previousSibling=null;a.childNodes=[];this.b=this.S=!1;this.a=this.i=this.g=null;Cc(this)}function Cc(a){a.S||(a.S=!0,eb(function(){return wd(a)}))}
144 function wd(a){for(var b;a;){a.S&&(b=a);a:{var c=a;a=c.host.getRootNode();if(y(a))for(var d=c.host.childNodes,e=0;e<d.length;e++)if(c=d[e],"slot"==c.localName)break a;a=void 0}}b&&b._renderRoot()}
145 ic.prototype._renderRoot=function(){var a=td;td=!0;this.S=!1;if(this.g){Kc(this);for(var b=0,c;b<this.g.length;b++){c=this.g[b];var d=v(c),e=d.assignedNodes;d.assignedNodes=[];d.D=[];if(d.ga=e)for(d=0;d<e.length;d++){var f=v(e[d]);f.R=f.assignedSlot;f.assignedSlot===c&&(f.assignedSlot=null)}}for(b=this.host.firstChild;b;b=b.nextSibling)xd(this,b);for(b=0;b<this.g.length;b++){c=this.g[b];e=v(c);if(!e.assignedNodes.length)for(d=c.firstChild;d;d=d.nextSibling)xd(this,d,c);(d=(d=v(c.parentNode))&&d.root)&&
146 Ic(d)&&d._renderRoot();yd(this,e.D,e.assignedNodes);if(d=e.ga){for(f=0;f<d.length;f++)v(d[f]).R=null;e.ga=null;d.length>e.assignedNodes.length&&(e.W=!0)}e.W&&(e.W=!1,zd(this,c))}c=this.g;b=[];for(e=0;e<c.length;e++)d=c[e].parentNode,(f=v(d))&&f.root||!(0>b.indexOf(d))||b.push(d);for(c=0;c<b.length;c++){f=b[c];e=f===this?this.host:f;d=[];f=f.childNodes;for(var h=0;h<f.length;h++){var g=f[h];if("slot"==g.localName){g=v(g).D;for(var k=0;k<g.length;k++)d.push(g[k])}else d.push(g)}f=rd(e);h=od(d,d.length,
147 f,f.length);k=g=0;for(var l=void 0;g<h.length&&(l=h[g]);g++){for(var m=0,p=void 0;m<l.M.length&&(p=l.M[m]);m++)qd(p)===e&&z.removeChild.call(e,p),f.splice(l.index+k,1);k-=l.T}k=0;for(l=void 0;k<h.length&&(l=h[k]);k++)for(g=f[l.index],m=l.index;m<l.index+l.T;m++)p=d[m],z.insertBefore.call(e,p,g),f.splice(m,0,p)}}if(!this.b)for(b=this.host.childNodes,c=0,e=b.length;c<e;c++)d=b[c],f=v(d),qd(d)!==this.host||"slot"!==d.localName&&f.assignedSlot||z.removeChild.call(this.host,d);this.b=!0;td=a;ud&&ud()};
148 function xd(a,b,c){var d=u(b),e=d.R;d.R=null;c||(c=(a=a.i[b.slot||"__catchall"])&&a[0]);c?(u(c).assignedNodes.push(b),d.assignedSlot=c):d.assignedSlot=void 0;e!==d.assignedSlot&&d.assignedSlot&&(u(d.assignedSlot).W=!0)}function yd(a,b,c){for(var d=0,e=void 0;d<c.length&&(e=c[d]);d++)if("slot"==e.localName){var f=v(e).assignedNodes;f&&f.length&&yd(a,b,f)}else b.push(c[d])}function zd(a,b){z.dispatchEvent.call(b,new Event("slotchange"));b=v(b);b.assignedSlot&&zd(a,b.assignedSlot)}
149 function Bc(a,b){a.a=a.a||[];a.g=a.g||[];a.i=a.i||{};a.a.push.apply(a.a,b instanceof Array?b:ka(ja(b)))}function Kc(a){if(a.a&&a.a.length){for(var b=a.a,c,d=0;d<b.length;d++){var e=b[d];pc(e);pc(e.parentNode);var f=Lc(e);a.i[f]?(c=c||{},c[f]=!0,a.i[f].push(e)):a.i[f]=[e];a.g.push(e)}if(c)for(var h in c)a.i[h]=Mc(a.i[h]);a.a=[]}}function Lc(a){var b=a.name||a.getAttribute("name")||"__catchall";return a.Da=b}
150 function Mc(a){return a.sort(function(a,c){a=vd(a);for(var b=vd(c),e=0;e<a.length;e++){c=a[e];var f=b[e];if(c!==f)return a=Array.from(c.parentNode.childNodes),a.indexOf(c)-a.indexOf(f)}})}function Hc(a,b){if(a.g){Kc(a);var c=a.i,d;for(d in c)for(var e=c[d],f=0;f<e.length;f++){var h=e[f];if(ab(b,h)){e.splice(f,1);var g=a.g.indexOf(h);0<=g&&a.g.splice(g,1);f--;h=v(h);if(g=h.D)for(var k=0;k<g.length;k++){var l=g[k],m=qd(l);m&&z.removeChild.call(m,l)}h.D=[];h.assignedNodes=[];g=!0}}return g}}
151 function Ic(a){Kc(a);return!(!a.g||!a.g.length)}
152 if(window.customElements&&w.ia){var Ad=new Map;ud=function(){var a=Array.from(Ad);Ad.clear();a=ja(a);for(var b=a.next();!b.done;b=a.next()){b=ja(b.value);var c=b.next().value;b.next().value?c.Ba():c.Ca()}};td&&document.addEventListener("readystatechange",function(){td=!1;ud()},{once:!0});var Bd=function(a,b,c){var d=0,e="__isConnected"+d++;if(b||c)a.prototype.connectedCallback=a.prototype.Ba=function(){td?Ad.set(this,!0):this[e]||(this[e]=!0,b&&b.call(this))},a.prototype.disconnectedCallback=a.prototype.Ca=
153 function(){td?this.isConnected||Ad.set(this,!1):this[e]&&(this[e]=!1,c&&c.call(this))};return a},Cd=window.customElements.define;Object.defineProperty(window.CustomElementRegistry.prototype,"define",{value:function(a,b){var c=b.prototype.connectedCallback,d=b.prototype.disconnectedCallback;Cd.call(window.customElements,a,Bd(b,c,d));b.prototype.connectedCallback=c;b.prototype.disconnectedCallback=d}})};function Dd(a){var b=a.getRootNode();y(b)&&wd(b);return(a=v(a))&&a.assignedSlot||null}
154 var Ed={addEventListener:fd.bind(window),removeEventListener:hd.bind(window)},Fd={addEventListener:fd,removeEventListener:hd,appendChild:function(a){return rc(this,a)},insertBefore:function(a,b){return rc(this,a,b)},removeChild:function(a){return uc(this,a)},replaceChild:function(a,b){rc(this,a,b);uc(this,b);return a},cloneNode:function(a){if("template"==this.localName)var b=z.cloneNode.call(this,a);else if(b=z.cloneNode.call(this,!1),a&&b.nodeType!==Node.ATTRIBUTE_NODE){a=this.childNodes;for(var c=
155 0,d;c<a.length;c++)d=a[c].cloneNode(!0),b.appendChild(d)}return b},getRootNode:function(){return Nc(this)},contains:function(a){return ab(this,a)},dispatchEvent:function(a){fb();return z.dispatchEvent.call(this,a)}};
156 Object.defineProperties(Fd,{isConnected:{get:function(){if($b&&$b.call(this))return!0;if(this.nodeType==Node.DOCUMENT_FRAGMENT_NODE)return!1;var a=this.ownerDocument;if($a){if(z.contains.call(a,this))return!0}else if(a.documentElement&&z.contains.call(a.documentElement,this))return!0;for(a=this;a&&!(a instanceof Document);)a=a.parentNode||(y(a)?a.host:void 0);return!!(a&&a instanceof Document)},configurable:!0}});
157 var Gd={get assignedSlot(){return Dd(this)}},Hd={querySelector:function(a){return Oc(this,function(b){return Sa.call(b,a)},function(a){return!!a})[0]||null},querySelectorAll:function(a,b){if(b){b=Array.prototype.slice.call(z.querySelectorAll.call(this,a));var c=this.getRootNode();return b.filter(function(a){return a.getRootNode()==c})}return Oc(this,function(b){return Sa.call(b,a)})}},Id={assignedNodes:function(a){if("slot"===this.localName){var b=this.getRootNode();y(b)&&wd(b);return(b=v(this))?
158 (a&&a.flatten?b.D:b.assignedNodes)||[]:[]}}},Jd=Ua({setAttribute:function(a,b){Rc(this,a,b)},removeAttribute:function(a){z.removeAttribute.call(this,a);Jc(this,a)},attachShadow:function(a){if(!this)throw"Must provide a host.";if(!a)throw"Not enough arguments.";return new ic(sd,this,a)},get slot(){return this.getAttribute("slot")},set slot(a){Rc(this,"slot",a)},get assignedSlot(){return Dd(this)}},Hd,Id);Object.defineProperties(Jd,ec);
159 var Kd=Ua({importNode:function(a,b){return Sc(a,b)},getElementById:function(a){return Oc(this,function(b){return b.id==a},function(a){return!!a})[0]||null}},Hd);Object.defineProperties(Kd,{_activeElement:fc.activeElement});
160 for(var Ld=HTMLElement.prototype.blur,Md={blur:function(){var a=v(this);(a=(a=a&&a.root)&&a.activeElement)?a.blur():Ld.call(this)}},Nd={},Od=ja(Object.getOwnPropertyNames(Document.prototype)),Pd=Od.next();!Pd.done;Nd={s:Nd.s},Pd=Od.next())Nd.s=Pd.value,"on"===Nd.s.substring(0,2)&&Object.defineProperty(Md,Nd.s,{set:function(a){return function(b){var c=u(this),d=a.s.substring(2);c.P[a.s]&&this.removeEventListener(d,c.P[a.s]);this.addEventListener(d,b,{});c.P[a.s]=b}}(Nd),get:function(a){return function(){var b=
161 v(this);return b&&b.P[a.s]}}(Nd),configurable:!0});var Qd={addEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.ea=this;this.host.addEventListener(a,b,c)},removeEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.ea=this;this.host.removeEventListener(a,b,c)},getElementById:function(a){return Oc(this,function(b){return b.id==a},function(a){return!!a})[0]||null}};
162 function I(a,b){for(var c=Object.getOwnPropertyNames(b),d=0;d<c.length;d++){var e=c[d],f=Object.getOwnPropertyDescriptor(b,e);f.value?a[e]=f.value:Object.defineProperty(a,e,f)}};if(w.ia){var ShadyDOM={inUse:w.ia,patch:function(a){kc(a);jc(a);return a},isShadyRoot:y,enqueue:eb,flush:fb,settings:w,filterMutations:ob,observeChildren:ib,unobserveChildren:nb,nativeMethods:z,nativeTree:G,deferConnectionCallbacks:w.deferConnectionCallbacks,handlesDynamicScoping:!0};window.ShadyDOM=ShadyDOM;md();var Rd=window.customElements&&window.customElements.nativeHTMLElement||HTMLElement;I(ic.prototype,Qd);I(window.Node.prototype,Fd);I(window.Window.prototype,Ed);I(window.Text.prototype,Gd);
163 I(window.DocumentFragment.prototype,Hd);I(window.Element.prototype,Jd);I(window.Document.prototype,Kd);window.HTMLSlotElement&&I(window.HTMLSlotElement.prototype,Id);I(Rd.prototype,Md);w.w&&(gc(window.Node.prototype),gc(window.Text.prototype),gc(window.DocumentFragment.prototype),gc(window.Element.prototype),gc(Rd.prototype),gc(window.Document.prototype),window.HTMLSlotElement&&gc(window.HTMLSlotElement.prototype));hc();window.ShadowRoot=ic};var Sd=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function Td(a){var b=Sd.has(a);a=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(a);return!b&&a}function J(a){var b=a.isConnected;if(void 0!==b)return b;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}
164 function Ud(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
165 function Vd(a,b,c){c=void 0===c?new Set:c;for(var d=a;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;b(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){d=e.import;if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)Vd(d,b,c);d=Ud(a,e);continue}else if("template"===f){d=Ud(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)Vd(e,b,c)}d=d.firstChild?d.firstChild:Ud(a,d)}}function K(a,b,c){a[b]=c};function Wd(){this.a=new Map;this.h=new Map;this.f=[];this.c=!1}function Xd(a,b,c){a.a.set(b,c);a.h.set(c.constructor,c)}function Yd(a,b){a.c=!0;a.f.push(b)}function Zd(a,b){a.c&&Vd(b,function(b){return a.b(b)})}Wd.prototype.b=function(a){if(this.c&&!a.__CE_patched){a.__CE_patched=!0;for(var b=0;b<this.f.length;b++)this.f[b](a)}};function L(a,b){var c=[];Vd(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state?a.connectedCallback(d):$d(a,d)}}
166 function M(a,b){var c=[];Vd(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state&&a.disconnectedCallback(d)}}
167 function O(a,b,c){c=void 0===c?{}:c;var d=c.cb||new Set,e=c.$||function(b){return $d(a,b)},f=[];Vd(b,function(b){if("link"===b.localName&&"import"===b.getAttribute("rel")){var c=b.import;c instanceof Node&&(c.__CE_isImportDocument=!0,c.__CE_hasRegistry=!0);c&&"complete"===c.readyState?c.__CE_documentLoadHandled=!0:b.addEventListener("load",function(){var c=b.import;if(!c.__CE_documentLoadHandled){c.__CE_documentLoadHandled=!0;var f=new Set(d);f.delete(c);O(a,c,{cb:f,$:e})}})}else f.push(b)},d);if(a.c)for(b=
168 0;b<f.length;b++)a.b(f[b]);for(b=0;b<f.length;b++)e(f[b])}
169 function $d(a,b){if(void 0===b.__CE_state){var c=b.ownerDocument;if(c.defaultView||c.__CE_isImportDocument&&c.__CE_hasRegistry)if(c=a.a.get(b.localName)){c.constructionStack.push(b);var d=c.constructor;try{try{if(new d!==b)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{c.constructionStack.pop()}}catch(h){throw b.__CE_state=2,h;}b.__CE_state=1;b.__CE_definition=c;if(c.attributeChangedCallback)for(c=c.observedAttributes,d=0;d<c.length;d++){var e=c[d],
170 f=b.getAttribute(e);null!==f&&a.attributeChangedCallback(b,e,null,f,null)}J(b)&&a.connectedCallback(b)}}}Wd.prototype.connectedCallback=function(a){var b=a.__CE_definition;b.connectedCallback&&b.connectedCallback.call(a)};Wd.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;b.disconnectedCallback&&b.disconnectedCallback.call(a)};
171 Wd.prototype.attributeChangedCallback=function(a,b,c,d,e){var f=a.__CE_definition;f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b)&&f.attributeChangedCallback.call(a,b,c,d,e)};function ae(a){var b=document;this.b=a;this.a=b;this.G=void 0;O(this.b,this.a);"loading"===this.a.readyState&&(this.G=new MutationObserver(this.c.bind(this)),this.G.observe(this.a,{childList:!0,subtree:!0}))}function be(a){a.G&&a.G.disconnect()}ae.prototype.c=function(a){var b=this.a.readyState;"interactive"!==b&&"complete"!==b||be(this);for(b=0;b<a.length;b++)for(var c=a[b].addedNodes,d=0;d<c.length;d++)O(this.b,c[d])};function ce(){var a=this;this.a=this.j=void 0;this.b=new Promise(function(b){a.a=b;a.j&&b(a.j)})}ce.prototype.resolve=function(a){if(this.j)throw Error("Already resolved.");this.j=a;this.a&&this.a(a)};function P(a){this.c=!1;this.a=a;this.o=new Map;this.f=function(a){return a()};this.b=!1;this.h=[];this.ha=new ae(a)}n=P.prototype;
172 n.xa=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!Td(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this.a.a.get(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this.c)throw Error("A custom element is already being defined.");this.c=!0;try{var d=function(a){var b=e[a];if(void 0!==b&&!(b instanceof Function))throw Error("The '"+a+"' callback must be a function.");
173 return b},e=b.prototype;if(!(e instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");var f=d("connectedCallback");var h=d("disconnectedCallback");var g=d("adoptedCallback");var k=d("attributeChangedCallback");var l=b.observedAttributes||[]}catch(m){return}finally{this.c=!1}b={localName:a,constructor:b,connectedCallback:f,disconnectedCallback:h,adoptedCallback:g,attributeChangedCallback:k,observedAttributes:l,constructionStack:[]};Xd(this.a,a,b);this.h.push(b);
174 this.b||(this.b=!0,this.f(function(){return de(c)}))};n.$=function(a){O(this.a,a)};function de(a){if(!1!==a.b){a.b=!1;for(var b=a.h,c=[],d=new Map,e=0;e<b.length;e++)d.set(b[e].localName,[]);O(a.a,document,{$:function(b){if(void 0===b.__CE_state){var e=b.localName,f=d.get(e);f?f.push(b):a.a.a.get(e)&&c.push(b)}}});for(e=0;e<c.length;e++)$d(a.a,c[e]);for(;0<b.length;){var f=b.shift();e=f.localName;f=d.get(f.localName);for(var h=0;h<f.length;h++)$d(a.a,f[h]);(e=a.o.get(e))&&e.resolve(void 0)}}}
175 n.get=function(a){if(a=this.a.a.get(a))return a.constructor};n.ya=function(a){if(!Td(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.o.get(a);if(b)return b.b;b=new ce;this.o.set(a,b);this.a.a.get(a)&&!this.h.some(function(b){return b.localName===a})&&b.resolve(void 0);return b.b};n.Wa=function(a){be(this.ha);var b=this.f;this.f=function(c){return a(function(){return b(c)})}};window.CustomElementRegistry=P;P.prototype.define=P.prototype.xa;
176 P.prototype.upgrade=P.prototype.$;P.prototype.get=P.prototype.get;P.prototype.whenDefined=P.prototype.ya;P.prototype.polyfillWrapFlushCallback=P.prototype.Wa;var ee=window.Document.prototype.createElement,fe=window.Document.prototype.createElementNS,ge=window.Document.prototype.importNode,he=window.Document.prototype.prepend,ie=window.Document.prototype.append,je=window.DocumentFragment.prototype.prepend,ke=window.DocumentFragment.prototype.append,le=window.Node.prototype.cloneNode,me=window.Node.prototype.appendChild,ne=window.Node.prototype.insertBefore,oe=window.Node.prototype.removeChild,pe=window.Node.prototype.replaceChild,qe=Object.getOwnPropertyDescriptor(window.Node.prototype,
177 "textContent"),re=window.Element.prototype.attachShadow,se=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),te=window.Element.prototype.getAttribute,ue=window.Element.prototype.setAttribute,ve=window.Element.prototype.removeAttribute,we=window.Element.prototype.getAttributeNS,xe=window.Element.prototype.setAttributeNS,ye=window.Element.prototype.removeAttributeNS,ze=window.Element.prototype.insertAdjacentElement,Ae=window.Element.prototype.insertAdjacentHTML,Be=window.Element.prototype.prepend,
178 Ce=window.Element.prototype.append,De=window.Element.prototype.before,Ee=window.Element.prototype.after,Fe=window.Element.prototype.replaceWith,Ge=window.Element.prototype.remove,He=window.HTMLElement,Ie=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),Je=window.HTMLElement.prototype.insertAdjacentElement,Ke=window.HTMLElement.prototype.insertAdjacentHTML;var Le=new function(){};function Me(){var a=Ne;window.HTMLElement=function(){function b(){var b=this.constructor,d=a.h.get(b);if(!d)throw Error("The custom element being constructed was not registered with `customElements`.");var e=d.constructionStack;if(0===e.length)return e=ee.call(document,d.localName),Object.setPrototypeOf(e,b.prototype),e.__CE_state=1,e.__CE_definition=d,a.b(e),e;d=e.length-1;var f=e[d];if(f===Le)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
179 e[d]=Le;Object.setPrototypeOf(f,b.prototype);a.b(f);return f}b.prototype=He.prototype;Object.defineProperty(b.prototype,"constructor",{writable:!0,configurable:!0,enumerable:!1,value:b});return b}()};function Oe(a,b,c){function d(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e]=arguments[e];e=[];for(var f=[],l=0;l<d.length;l++){var m=d[l];m instanceof Element&&J(m)&&f.push(m);if(m instanceof DocumentFragment)for(m=m.firstChild;m;m=m.nextSibling)e.push(m);else e.push(m)}b.apply(this,d);for(d=0;d<f.length;d++)M(a,f[d]);if(J(this))for(d=0;d<e.length;d++)f=e[d],f instanceof Element&&L(a,f)}}void 0!==c.Y&&(b.prepend=d(c.Y));void 0!==c.append&&(b.append=d(c.append))};function Pe(){var a=Ne;K(Document.prototype,"createElement",function(b){if(this.__CE_hasRegistry){var c=a.a.get(b);if(c)return new c.constructor}b=ee.call(this,b);a.b(b);return b});K(Document.prototype,"importNode",function(b,c){b=ge.call(this,b,c);this.__CE_hasRegistry?O(a,b):Zd(a,b);return b});K(Document.prototype,"createElementNS",function(b,c){if(this.__CE_hasRegistry&&(null===b||"http://www.w3.org/1999/xhtml"===b)){var d=a.a.get(c);if(d)return new d.constructor}b=fe.call(this,b,c);a.b(b);return b});
180 Oe(a,Document.prototype,{Y:he,append:ie})};function Qe(){function a(a,d){Object.defineProperty(a,"textContent",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(a){if(this.nodeType===Node.TEXT_NODE)d.set.call(this,a);else{var c=void 0;if(this.firstChild){var e=this.childNodes,g=e.length;if(0<g&&J(this)){c=Array(g);for(var k=0;k<g;k++)c[k]=e[k]}}d.set.call(this,a);if(c)for(a=0;a<c.length;a++)M(b,c[a])}}})}var b=Ne;K(Node.prototype,"insertBefore",function(a,d){if(a instanceof DocumentFragment){var c=Array.prototype.slice.apply(a.childNodes);
181 a=ne.call(this,a,d);if(J(this))for(d=0;d<c.length;d++)L(b,c[d]);return a}c=J(a);d=ne.call(this,a,d);c&&M(b,a);J(this)&&L(b,a);return d});K(Node.prototype,"appendChild",function(a){if(a instanceof DocumentFragment){var c=Array.prototype.slice.apply(a.childNodes);a=me.call(this,a);if(J(this))for(var e=0;e<c.length;e++)L(b,c[e]);return a}c=J(a);e=me.call(this,a);c&&M(b,a);J(this)&&L(b,a);return e});K(Node.prototype,"cloneNode",function(a){a=le.call(this,a);this.ownerDocument.__CE_hasRegistry?O(b,a):
182 Zd(b,a);return a});K(Node.prototype,"removeChild",function(a){var c=J(a),e=oe.call(this,a);c&&M(b,a);return e});K(Node.prototype,"replaceChild",function(a,d){if(a instanceof DocumentFragment){var c=Array.prototype.slice.apply(a.childNodes);a=pe.call(this,a,d);if(J(this))for(M(b,d),d=0;d<c.length;d++)L(b,c[d]);return a}c=J(a);var f=pe.call(this,a,d),h=J(this);h&&M(b,d);c&&M(b,a);h&&L(b,a);return f});qe&&qe.get?a(Node.prototype,qe):Yd(b,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){for(var a=
183 [],b=0;b<this.childNodes.length;b++)a.push(this.childNodes[b].textContent);return a.join("")},set:function(a){for(;this.firstChild;)oe.call(this,this.firstChild);me.call(this,document.createTextNode(a))}})})};function Re(a){function b(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e]=arguments[e];e=[];for(var g=[],k=0;k<d.length;k++){var l=d[k];l instanceof Element&&J(l)&&g.push(l);if(l instanceof DocumentFragment)for(l=l.firstChild;l;l=l.nextSibling)e.push(l);else e.push(l)}b.apply(this,d);for(d=0;d<g.length;d++)M(a,g[d]);if(J(this))for(d=0;d<e.length;d++)g=e[d],g instanceof Element&&L(a,g)}}var c=Element.prototype;void 0!==De&&(c.before=b(De));void 0!==De&&(c.after=b(Ee));void 0!==Fe&&
184 K(c,"replaceWith",function(b){for(var c=[],d=0;d<arguments.length;++d)c[d]=arguments[d];d=[];for(var h=[],g=0;g<c.length;g++){var k=c[g];k instanceof Element&&J(k)&&h.push(k);if(k instanceof DocumentFragment)for(k=k.firstChild;k;k=k.nextSibling)d.push(k);else d.push(k)}g=J(this);Fe.apply(this,c);for(c=0;c<h.length;c++)M(a,h[c]);if(g)for(M(a,this),c=0;c<d.length;c++)h=d[c],h instanceof Element&&L(a,h)});void 0!==Ge&&K(c,"remove",function(){var b=J(this);Ge.call(this);b&&M(a,this)})};function Se(){function a(a,b){Object.defineProperty(a,"innerHTML",{enumerable:b.enumerable,configurable:!0,get:b.get,set:function(a){var c=this,e=void 0;J(this)&&(e=[],Vd(this,function(a){a!==c&&e.push(a)}));b.set.call(this,a);if(e)for(var f=0;f<e.length;f++){var h=e[f];1===h.__CE_state&&d.disconnectedCallback(h)}this.ownerDocument.__CE_hasRegistry?O(d,this):Zd(d,this);return a}})}function b(a,b){K(a,"insertAdjacentElement",function(a,c){var e=J(c);a=b.call(this,a,c);e&&M(d,c);J(a)&&L(d,c);return a})}
185 function c(a,b){function c(a,b){for(var c=[];a!==b;a=a.nextSibling)c.push(a);for(b=0;b<c.length;b++)O(d,c[b])}K(a,"insertAdjacentHTML",function(a,d){a=a.toLowerCase();if("beforebegin"===a){var e=this.previousSibling;b.call(this,a,d);c(e||this.parentNode.firstChild,this)}else if("afterbegin"===a)e=this.firstChild,b.call(this,a,d),c(this.firstChild,e);else if("beforeend"===a)e=this.lastChild,b.call(this,a,d),c(e||this.firstChild,null);else if("afterend"===a)e=this.nextSibling,b.call(this,a,d),c(this.nextSibling,
186 e);else throw new SyntaxError("The value provided ("+String(a)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");})}var d=Ne;re&&K(Element.prototype,"attachShadow",function(a){return this.__CE_shadowRoot=a=re.call(this,a)});se&&se.get?a(Element.prototype,se):Ie&&Ie.get?a(HTMLElement.prototype,Ie):Yd(d,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){return le.call(this,!0).innerHTML},set:function(a){var b="template"===this.localName,c=b?this.content:this,d=fe.call(document,
187 this.namespaceURI,this.localName);for(d.innerHTML=a;0<c.childNodes.length;)oe.call(c,c.childNodes[0]);for(a=b?d.content:d;0<a.childNodes.length;)me.call(c,a.childNodes[0])}})});K(Element.prototype,"setAttribute",function(a,b){if(1!==this.__CE_state)return ue.call(this,a,b);var c=te.call(this,a);ue.call(this,a,b);b=te.call(this,a);d.attributeChangedCallback(this,a,c,b,null)});K(Element.prototype,"setAttributeNS",function(a,b,c){if(1!==this.__CE_state)return xe.call(this,a,b,c);var e=we.call(this,a,
188 b);xe.call(this,a,b,c);c=we.call(this,a,b);d.attributeChangedCallback(this,b,e,c,a)});K(Element.prototype,"removeAttribute",function(a){if(1!==this.__CE_state)return ve.call(this,a);var b=te.call(this,a);ve.call(this,a);null!==b&&d.attributeChangedCallback(this,a,b,null,null)});K(Element.prototype,"removeAttributeNS",function(a,b){if(1!==this.__CE_state)return ye.call(this,a,b);var c=we.call(this,a,b);ye.call(this,a,b);var e=we.call(this,a,b);c!==e&&d.attributeChangedCallback(this,b,c,e,a)});Je?b(HTMLElement.prototype,
189 Je):ze?b(Element.prototype,ze):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");Ke?c(HTMLElement.prototype,Ke):Ae?c(Element.prototype,Ae):console.warn("Custom Elements: `Element#insertAdjacentHTML` was not patched.");Oe(d,Element.prototype,{Y:Be,append:Ce});Re(d)};var Te=window.customElements;if(!Te||Te.forcePolyfill||"function"!=typeof Te.define||"function"!=typeof Te.get){var Ne=new Wd;Me();Pe();Oe(Ne,DocumentFragment.prototype,{Y:je,append:ke});Qe();Se();document.__CE_hasRegistry=!0;var customElements=new P(Ne);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};function Ue(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
190 function Ve(a){a=a.replace(We,"").replace(Xe,"");var b=Ye,c=a,d=new Ue;d.start=0;d.end=c.length;for(var e=d,f=0,h=c.length;f<h;f++)if("{"===c[f]){e.rules||(e.rules=[]);var g=e,k=g.rules[g.rules.length-1]||null;e=new Ue;e.start=f+1;e.parent=g;e.previous=k;g.rules.push(e)}else"}"===c[f]&&(e.end=f+1,e=e.parent||d);return b(d,a)}
191 function Ye(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=Ze(c),c=c.replace($e," "),c=c.substring(c.lastIndexOf(";")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf("@"),a.atRule?0===c.indexOf("@media")?a.type=af:c.match(gf)&&(a.type=hf,a.keyframesName=a.selector.split($e).pop()):a.type=0===c.indexOf("--")?jf:kf);if(c=a.rules)for(var d=0,e=c.length,f=void 0;d<e&&(f=c[d]);d++)Ye(f,
192 b);return a}function Ze(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(a,c){a=c;for(c=6-a.length;c--;)a="0"+a;return"\\"+a})}
193 function lf(a,b,c){c=void 0===c?"":c;var d="";if(a.cssText||a.rules){var e=a.rules,f;if(f=e)f=e[0],f=!(f&&f.selector&&0===f.selector.indexOf("--"));if(f){f=0;for(var h=e.length,g=void 0;f<h&&(g=e[f]);f++)d=lf(g,b,d)}else b?b=a.cssText:(b=a.cssText,b=b.replace(mf,"").replace(nf,""),b=b.replace(of,"").replace(pf,"")),(d=b.trim())&&(d=" "+d+"\n")}d&&(a.selector&&(c+=a.selector+" {\n"),c+=d,a.selector&&(c+="}\n\n"));return c}
194 var kf=1,hf=7,af=4,jf=1E3,We=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,Xe=/@import[^;]*;/gim,mf=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,nf=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,of=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,pf=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,gf=/^@[^\s]*keyframes/,$e=/\s+/g;var R=!(window.ShadyDOM&&window.ShadyDOM.inUse),qf;function rf(a){qf=a&&a.shimcssproperties?!1:R||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?qf=window.ShadyCSS.nativeCss:window.ShadyCSS?(rf(window.ShadyCSS),window.ShadyCSS=void 0):rf(window.WebComponents&&window.WebComponents.flags);var S=qf;var sf=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,tf=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,uf=/(--[\w-]+)\s*([:,;)]|$)/gi,vf=/(animation\s*:)|(animation-name\s*:)/,wf=/@media\s(.*)/,xf=/\{[^}]*\}/g;var yf=new Set;function zf(a,b){if(!a)return"";"string"===typeof a&&(a=Ve(a));b&&Af(a,b);return lf(a,S)}function Bf(a){!a.__cssRules&&a.textContent&&(a.__cssRules=Ve(a.textContent));return a.__cssRules||null}function Cf(a){return!!a.parent&&a.parent.type===hf}function Af(a,b,c,d){if(a){var e=!1,f=a.type;if(d&&f===af){var h=a.selector.match(wf);h&&(window.matchMedia(h[1]).matches||(e=!0))}f===kf?b(a):c&&f===hf?c(a):f===jf&&(e=!0);if((a=a.rules)&&!e)for(e=0,f=a.length,h=void 0;e<f&&(h=a[e]);e++)Af(h,b,c,d)}}
195 function Df(a,b,c,d){var e=document.createElement("style");b&&e.setAttribute("scope",b);e.textContent=a;Ef(e,c,d);return e}var Ff=null;function Gf(a){a=document.createComment(" Shady DOM styles for "+a+" ");var b=document.head;b.insertBefore(a,(Ff?Ff.nextSibling:null)||b.firstChild);return Ff=a}function Ef(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);Ff?a.compareDocumentPosition(Ff)===Node.DOCUMENT_POSITION_PRECEDING&&(Ff=a):Ff=a}
196 function Hf(a,b){for(var c=0,d=a.length;b<d;b++)if("("===a[b])c++;else if(")"===a[b]&&0===--c)return b;return-1}function If(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");var d=Hf(a,c+3),e=a.substring(c+4,d);c=a.substring(0,c);a=If(a.substring(d+1),b);d=e.indexOf(",");return-1===d?b(c,e.trim(),"",a):b(c,e.substring(0,d).trim(),e.substring(d+1).trim(),a)}function Jf(a,b){R?a.setAttribute("class",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,"class",b)}
197 function Kf(a){var b=a.localName,c="";b?-1<b.indexOf("-")||(c=b,b=a.getAttribute&&a.getAttribute("is")||""):(b=a.is,c=a.extends);return{is:b,N:c}}function Lf(a){for(var b=[],c="",d=0;0<=d&&d<a.length;d++)if("("===a[d]){var e=Hf(a,d);c+=a.slice(d,e+1);d=e}else","===a[d]?(b.push(c),c=""):c+=a[d];c&&b.push(c);return b}
198 function Mf(a){if(void 0===a.aa){var b=a.getAttribute("css-build");if(b)a.aa=b;else{a:{b="template"===a.localName?a.content.firstChild:a.firstChild;if(b instanceof Comment&&(b=b.textContent.trim().split(":"),"css-build"===b[0])){b=b[1];break a}b=""}if(""!==b){var c="template"===a.localName?a.content.firstChild:a.firstChild;c.parentNode.removeChild(c)}a.aa=b}}return a.aa||""};function Nf(){}function Of(a,b){Pf(U,a,function(a){Qf(a,b||"")})}function Pf(a,b,c){b.nodeType===Node.ELEMENT_NODE&&c(b);if(b="template"===b.localName?(b.content||b.ib||b).childNodes:b.children||b.childNodes)for(var d=0;d<b.length;d++)Pf(a,b[d],c)}
199 function Qf(a,b,c){if(b)if(a.classList)c?(a.classList.remove("style-scope"),a.classList.remove(b)):(a.classList.add("style-scope"),a.classList.add(b));else if(a.getAttribute){var d=a.getAttribute(Rf);c?d&&(b=d.replace("style-scope","").replace(b,""),Jf(a,b)):Jf(a,(d?d+" ":"")+"style-scope "+b)}}function Sf(a,b,c){Pf(U,a,function(a){Qf(a,b,!0);Qf(a,c)})}function Tf(a,b){Pf(U,a,function(a){Qf(a,b||"",!0)})}
200 function Uf(a,b,c,d){var e=U;R||"shady"===(void 0===d?"":d)?b=zf(b,c):(a=Kf(a),b=Vf(e,b,a.is,a.N,c)+"\n\n");return b.trim()}function Vf(a,b,c,d,e){var f=Wf(c,d);c=c?Xf+c:"";return zf(b,function(b){b.c||(b.selector=b.m=Yf(a,b,a.b,c,f),b.c=!0);e&&e(b,c,f)})}function Wf(a,b){return b?"[is="+a+"]":a}function Yf(a,b,c,d,e){var f=Lf(b.selector);if(!Cf(b)){b=0;for(var h=f.length,g=void 0;b<h&&(g=f[b]);b++)f[b]=c.call(a,g,d,e)}return f.filter(function(a){return!!a}).join(Zf)}
201 function $f(a){return a.replace(ag,function(a,c,d){-1<d.indexOf("+")?d=d.replace(/\+/g,"___"):-1<d.indexOf("___")&&(d=d.replace(/___/g,"+"));return":"+c+"("+d+")"})}function bg(a){for(var b=[],c;c=a.match(cg);){var d=c.index,e=Hf(a,d);if(-1===e)throw Error(c.input+" selector missing ')'");c=a.slice(d,e+1);a=a.replace(c,"\ue000");b.push(c)}return{ka:a,matches:b}}function dg(a,b){var c=a.split("\ue000");return b.reduce(function(a,b,f){return a+b+c[f+1]},c[0])}
202 Nf.prototype.b=function(a,b,c){var d=!1;a=a.trim();var e=ag.test(a);e&&(a=a.replace(ag,function(a,b,c){return":"+b+"("+c.replace(/\s/g,"")+")"}),a=$f(a));var f=cg.test(a);if(f){var h=bg(a);a=h.ka;h=h.matches}a=a.replace(eg,fg+" $1");a=a.replace(gg,function(a,e,f){d||(a=hg(f,e,b,c),d=d||a.stop,e=a.Ja,f=a.value);return e+f});f&&(a=dg(a,h));e&&(a=$f(a));return a};
203 function hg(a,b,c,d){var e=a.indexOf(ig);0<=a.indexOf(fg)?a=jg(a,d):0!==e&&(a=c?kg(a,c):a);c=!1;0<=e&&(b="",c=!0);if(c){var f=!0;c&&(a=a.replace(lg,function(a,b){return" > "+b}))}a=a.replace(mg,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,Ja:b,stop:f}}function kg(a,b){a=a.split(ng);a[0]+=b;return a.join(ng)}
204 function jg(a,b){var c=a.match(og);return(c=c&&c[2].trim()||"")?c[0].match(pg)?a.replace(og,function(a,c,f){return b+f}):c.split(pg)[0]===b?c:qg:a.replace(fg,b)}function rg(a){a.selector===sg&&(a.selector="html")}Nf.prototype.c=function(a){return a.match(fg)?"":a.match(ig)?this.b(a,tg):kg(a.trim(),tg)};q.Object.defineProperties(Nf.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}});
205 var ag=/:(nth[-\w]+)\(([^)]+)\)/,tg=":not(.style-scope)",Zf=",",gg=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,pg=/[[.:#*]/,fg=":host",sg=":root",ig="::slotted",eg=new RegExp("^("+ig+")"),og=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,lg=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,mg=/(.*):dir\((?:(ltr|rtl))\)/,Xf=".",ng=":",Rf="class",qg="should_not_match",cg=/:(?:matches|any|-(?:webkit|moz)-any)/,U=new Nf;function ug(a,b,c,d,e){this.B=a||null;this.b=b||null;this.c=c||[];this.J=null;this.V=e||"";this.N=d||"";this.a=this.u=this.F=null}function V(a){return a?a.__styleInfo:null}function vg(a,b){return a.__styleInfo=b}ug.prototype.f=function(){return this.B};ug.prototype._getStyleRules=ug.prototype.f;function wg(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var xg=navigator.userAgent.match("Trident");function yg(){}function zg(a){var b={},c=[],d=0;Af(a,function(a){Ag(a);a.index=d++;a=a.l.cssText;for(var c;c=uf.exec(a);){var e=c[1];":"!==c[2]&&(b[e]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var e in b)a.push(e);return a}
206 function Ag(a){if(!a.l){var b={},c={};Bg(a,c)&&(b.A=c,a.rules=null);b.cssText=a.parsedCssText.replace(xf,"").replace(sf,"");a.l=b}}function Bg(a,b){var c=a.l;if(c){if(c.A)return Object.assign(b,c.A),!0}else{c=a.parsedCssText;for(var d;a=sf.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}}
207 function Cg(a,b,c){b&&(b=0<=b.indexOf(";")?Dg(a,b,c):If(b,function(b,e,f,h){if(!e)return b+h;(e=Cg(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=Cg(a,c[f]||f,c)||f;return b+(e||"")+h}));return b&&b.trim()||""}
208 function Dg(a,b,c){b=b.split(";");for(var d=0,e,f;d<b.length;d++)if(e=b[d]){tf.lastIndex=0;if(f=tf.exec(e))e=Cg(a,c[f[1]],c);else if(f=e.indexOf(":"),-1!==f){var h=e.substring(f);h=h.trim();h=Cg(a,h,c)||h;e=e.substring(0,f)+h}b[d]=e&&e.lastIndexOf(";")===e.length-1?e.slice(0,-1):e||""}return b.join(";")}
209 function Eg(a,b){var c={},d=[];Af(a,function(a){a.l||Ag(a);var e=a.m||a.parsedSelector;b&&a.l.A&&e&&wg.call(b,e)&&(Bg(a,c),a=a.index,e=parseInt(a/32,10),d[e]=(d[e]||0)|1<<a%32)},null,!0);return{A:c,key:d}}
210 function Fg(a,b,c,d){b.l||Ag(b);if(b.l.A){var e=Kf(a);a=e.is;e=e.N;e=a?Wf(a,e):"html";var f=b.parsedSelector,h=":host > *"===f||"html"===f,g=0===f.indexOf(":host")&&!h;"shady"===c&&(h=f===e+" > *."+e||-1!==f.indexOf("html"),g=!h&&0===f.indexOf(e));if(h||g)c=e,g&&(b.m||(b.m=Yf(U,b,U.b,a?Xf+a:"",e)),c=b.m||e),d({ka:c,Pa:g,sb:h})}}function Gg(a,b,c){var d={},e={};Af(b,function(b){Fg(a,b,c,function(c){wg.call(a.jb||a,c.ka)&&(c.Pa?Bg(b,d):Bg(b,e))})},null,!0);return{Xa:e,Oa:d}}
211 function Hg(a,b,c,d){var e=Kf(b),f=Wf(e.is,e.N),h=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])"),g=V(b);e=g.B;g=g.V;var k=Ig(e,d);return Uf(b,e,function(b){var e="";b.l||Ag(b);b.l.cssText&&(e=Dg(a,b.l.cssText,c));b.cssText=e;if(!R&&!Cf(b)&&b.cssText){var g=e=b.cssText;null==b.ra&&(b.ra=vf.test(e));if(b.ra)if(null==b.X){b.X=[];for(var l in k)g=k[l],g=g(e),e!==g&&(e=g,b.X.push(l))}else{for(l=0;l<b.X.length;++l)g=k[b.X[l]],e=g(e);g=e}b.cssText=g;b.m=b.m||b.selector;
212 e="."+d;l=Lf(b.m);g=0;for(var N=l.length,Y=void 0;g<N&&(Y=l[g]);g++)l[g]=Y.match(h)?Y.replace(f,e):e+" "+Y;b.selector=l.join(",")}},g)}function Ig(a,b){a=a.b;var c={};if(!R&&a)for(var d=0,e=a[d];d<a.length;e=a[++d]){var f=e,h=b;f.f=new RegExp("\\b"+f.keyframesName+"(?!\\B|-)","g");f.a=f.keyframesName+"-"+h;f.m=f.m||f.selector;f.selector=f.m.replace(f.keyframesName,f.a);c[e.keyframesName]=Jg(e)}return c}function Jg(a){return function(b){return b.replace(a.f,a.a)}}
213 function Kg(a,b){var c=Lg,d=Bf(a);a.textContent=zf(d,function(a){var d=a.cssText=a.parsedCssText;a.l&&a.l.cssText&&(d=d.replace(mf,"").replace(nf,""),a.cssText=Dg(c,d,b))})}q.Object.defineProperties(yg.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"x-scope"}}});var Lg=new yg;var Mg={},Ng=window.customElements;if(Ng&&!R){var Og=Ng.define;Ng.define=function(a,b,c){Mg[a]||(Mg[a]=Gf(a));Og.call(Ng,a,b,c)}};function Pg(){this.cache={}}Pg.prototype.store=function(a,b,c,d){var e=this.cache[a]||[];e.push({A:b,styleElement:c,u:d});100<e.length&&e.shift();this.cache[a]=e};Pg.prototype.fetch=function(a,b,c){if(a=this.cache[a])for(var d=a.length-1;0<=d;d--){var e=a[d],f;a:{for(f=0;f<c.length;f++){var h=c[f];if(e.A[h]!==b[h]){f=!1;break a}}f=!0}if(f)return e}};function Qg(){}function Rg(a){var b=[];a.classList?b=Array.from(a.classList):a instanceof window.SVGElement&&a.hasAttribute("class")&&(b=a.getAttribute("class").split(/\s+/));a=b;b=a.indexOf(U.a);return-1<b?a[b+1]:""}function Sg(a){var b=a.getRootNode();return b===a||b===a.ownerDocument?"":(a=b.host)?Kf(a).is:""}
214 function Tg(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.target!==document.documentElement&&c.target!==document.head)for(var d=0;d<c.addedNodes.length;d++){var e=c.addedNodes[d];if(e.nodeType===Node.ELEMENT_NODE){var f=e.getRootNode(),h=Rg(e);if(h&&f===e.ownerDocument&&("style"!==e.localName&&"template"!==e.localName||""===Mf(e)))Tf(e,h);else if(f instanceof ShadowRoot)for(f=Sg(e),f!==h&&Sf(e,h,f),e=window.ShadyDOM.nativeMethods.querySelectorAll.call(e,":not(."+U.a+")"),h=0;h<e.length;h++){f=e[h];
215 var g=Sg(f);g&&Qf(f,g)}}}}}
216 if(!(R||window.ShadyDOM&&window.ShadyDOM.handlesDynamicScoping)){var Ug=new MutationObserver(Tg),Vg=function(a){Ug.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)Vg(document);else{var Wg=function(){Vg(document.body)};window.HTMLImports?window.HTMLImports.whenReady(Wg):requestAnimationFrame(function(){if("loading"===document.readyState){var a=function(){Wg();document.removeEventListener("readystatechange",a)};document.addEventListener("readystatechange",
217 a)}else Wg()})}Qg=function(){Tg(Ug.takeRecords())}}var Xg=Qg;var Yg={};var Zg=Promise.resolve();function $g(a){if(a=Yg[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function ah(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function bh(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a.b||(a.b=!0,Zg.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a.b=!1}))};var ch=new Pg;function W(){this.o={};this.c=document.documentElement;var a=new Ue;a.rules=[];this.f=vg(this.c,new ug(a));this.h=!1;this.b=this.a=null}n=W.prototype;n.flush=function(){Xg()};n.Ma=function(a){return Bf(a)};n.ab=function(a){return zf(a)};n.prepareTemplate=function(a,b,c){this.prepareTemplateDom(a,b);this.prepareTemplateStyles(a,b,c)};
218 n.prepareTemplateStyles=function(a,b,c){if(!a.h){R||Mg[b]||(Mg[b]=Gf(b));a.h=!0;a.name=b;a.extends=c;Yg[b]=a;var d=Mf(a);var e=[];for(var f=a.content.querySelectorAll("style"),h=0;h<f.length;h++){var g=f[h];if(g.hasAttribute("shady-unscoped")){if(!R){var k=g.textContent;yf.has(k)||(yf.add(k),k=g.cloneNode(!0),document.head.appendChild(k));g.parentNode.removeChild(g)}}else e.push(g.textContent),g.parentNode.removeChild(g)}e=e.join("").trim();c={is:b,extends:c};dh(this);if(f=""===Mf(a))f=tf.test(e)||
219 sf.test(e),tf.lastIndex=0,sf.lastIndex=0;e=Ve(e);f&&S&&this.a&&this.a.transformRules(e,b);a._styleAst=e;e=[];S||(e=zg(a._styleAst));if(!e.length||S)f=R?a.content:null,b=Mg[b]||null,d=Uf(c,a._styleAst,null,d),d=d.length?Df(d,c.is,f,b):void 0,a.a=d;a.f=e}};n.prepareTemplateDom=function(a,b){var c=Mf(a);R||"shady"===c||a.c||(a.c=!0,Of(a.content,b))};
220 function eh(a){!a.b&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(a.b=window.ShadyCSS.CustomStyleInterface,a.b.transformCallback=function(b){a.va(b)},a.b.validateCallback=function(){requestAnimationFrame(function(){(a.b.enqueued||a.h)&&a.flushCustomStyles()})})}function dh(a){!a.a&&window.ShadyCSS&&window.ShadyCSS.ApplyShim&&(a.a=window.ShadyCSS.ApplyShim,a.a.invalidCallback=$g);eh(a)}
221 n.flushCustomStyles=function(){dh(this);if(this.b){var a=this.b.processStyles();if(this.b.enqueued){if(S)for(var b=0;b<a.length;b++){var c=this.b.getStyleForCustomStyle(a[b]);if(c&&S&&this.a){var d=Bf(c);dh(this);this.a.transformRules(d);c.textContent=zf(d)}}else for(fh(this,this.c,this.f),b=0;b<a.length;b++)(c=this.b.getStyleForCustomStyle(a[b]))&&Kg(c,this.f.F);this.b.enqueued=!1;this.h&&!S&&this.styleDocument()}}};
222 n.styleElement=function(a,b){var c=V(a);if(!c){var d=Kf(a);c=d.is;d=d.N;var e=Mg[c]||null;c=Yg[c];if(c){var f=c._styleAst;var h=c.f;var g=Mf(c)}f=new ug(f,e,h,d,g);c&&vg(a,f);c=f}a!==this.c&&(this.h=!0);b&&(c.J=c.J||{},Object.assign(c.J,b));if(S){b=c;f=Kf(a).is;if(b.J){h=b.J;for(var k in h)null===k?a.style.removeProperty(k):a.style.setProperty(k,h[k])}if(!(!(k=Yg[f])&&a!==this.c||k&&""!==Mf(k))&&k&&k.a&&!ah(k)){if(ah(k)||k._applyShimValidatingVersion!==k._applyShimNextVersion)dh(this),this.a&&this.a.transformRules(k._styleAst,
223 f),k.a.textContent=Uf(a,b.B),bh(k);R&&(f=a.shadowRoot)&&(f=f.querySelector("style"))&&(f.textContent=Uf(a,b.B));b.B=k._styleAst}}else if(k=c,this.flush(),fh(this,a,k),k.c&&k.c.length){b=Kf(a).is;c=(f=ch.fetch(b,k.F,k.c))?f.styleElement:null;h=k.u;(g=f&&f.u)||(g=this.o[b]=(this.o[b]||0)+1,g=b+"-"+g);k.u=g;g=k.u;d=Lg;d=c?c.textContent||"":Hg(d,a,k.F,g);e=V(a);var l=e.a;l&&!R&&l!==c&&(l._useCount--,0>=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));R?e.a?(e.a.textContent=d,c=e.a):d&&(c=Df(d,
224 g,a.shadowRoot,e.b)):c?c.parentNode||(xg&&-1<d.indexOf("@media")&&(c.textContent=d),Ef(c,null,e.b)):d&&(c=Df(d,g,null,e.b));c&&(c._useCount=c._useCount||0,e.a!=c&&c._useCount++,e.a=c);g=c;R||(c=k.u,e=d=a.getAttribute("class")||"",h&&(e=d.replace(new RegExp("\\s*x-scope\\s*"+h+"\\s*","g")," ")),e+=(e?" ":"")+"x-scope "+c,d!==e&&Jf(a,e));f||ch.store(b,k.F,g,k.u)}};function gh(a,b){return(b=b.getRootNode().host)?V(b)?b:gh(a,b):a.c}
225 function fh(a,b,c){a=gh(a,b);var d=V(a);a=Object.create(d.F||null);var e=Gg(b,c.B,c.V);b=Eg(d.B,b).A;Object.assign(a,e.Oa,b,e.Xa);b=c.J;for(var f in b)if((e=b[f])||0===e)a[f]=e;f=Lg;b=Object.getOwnPropertyNames(a);for(e=0;e<b.length;e++)d=b[e],a[d]=Cg(f,a[d],a);c.F=a}n.styleDocument=function(a){this.styleSubtree(this.c,a)};
226 n.styleSubtree=function(a,b){var c=a.shadowRoot;(c||a===this.c)&&this.styleElement(a,b);if(b=c&&(c.children||c.childNodes))for(a=0;a<b.length;a++)this.styleSubtree(b[a]);else if(a=a.children||a.childNodes)for(b=0;b<a.length;b++)this.styleSubtree(a[b])};
227 n.va=function(a){var b=this,c=Bf(a),d=Mf(a);d!==this.f.V&&(this.f.V=d);Af(c,function(a){if(R)rg(a);else{var c=U;a.selector=a.parsedSelector;rg(a);a.selector=a.m=Yf(c,a,c.c,void 0,void 0)}S&&""===d&&(dh(b),b.a&&b.a.transformRule(a))});S?a.textContent=zf(c):this.f.B.rules.push(c)};n.getComputedStyleValue=function(a,b){var c;S||(c=(V(a)||V(gh(this,a))).F[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():""};
228 n.$a=function(a,b){var c=a.getRootNode();b=b?b.split(/\s/):[];c=c.host&&c.host.localName;if(!c){var d=a.getAttribute("class");if(d){d=d.split(/\s/);for(var e=0;e<d.length;e++)if(d[e]===U.a){c=d[e+1];break}}}c&&b.push(U.a,c);S||(c=V(a))&&c.u&&b.push(Lg.a,c.u);Jf(a,b.join(" "))};n.Ia=function(a){return V(a)};n.Za=function(a,b){Qf(a,b)};n.bb=function(a,b){Qf(a,b,!0)};n.Ya=function(a){return Sg(a)};n.Ka=function(a){return Rg(a)};W.prototype.flush=W.prototype.flush;W.prototype.prepareTemplate=W.prototype.prepareTemplate;
229 W.prototype.styleElement=W.prototype.styleElement;W.prototype.styleDocument=W.prototype.styleDocument;W.prototype.styleSubtree=W.prototype.styleSubtree;W.prototype.getComputedStyleValue=W.prototype.getComputedStyleValue;W.prototype.setElementClass=W.prototype.$a;W.prototype._styleInfoForNode=W.prototype.Ia;W.prototype.transformCustomStyleForDocument=W.prototype.va;W.prototype.getStyleAst=W.prototype.Ma;W.prototype.styleAstToString=W.prototype.ab;W.prototype.flushCustomStyles=W.prototype.flushCustomStyles;
230 W.prototype.scopeNode=W.prototype.Za;W.prototype.unscopeNode=W.prototype.bb;W.prototype.scopeForNode=W.prototype.Ya;W.prototype.currentScopeForNode=W.prototype.Ka;Object.defineProperties(W.prototype,{nativeShadow:{get:function(){return R}},nativeCss:{get:function(){return S}}});var X=new W,hh,ih;window.ShadyCSS&&(hh=window.ShadyCSS.ApplyShim,ih=window.ShadyCSS.CustomStyleInterface);
231 window.ShadyCSS={ScopingShim:X,prepareTemplate:function(a,b,c){X.flushCustomStyles();X.prepareTemplate(a,b,c)},prepareTemplateDom:function(a,b){X.prepareTemplateDom(a,b)},prepareTemplateStyles:function(a,b,c){X.flushCustomStyles();X.prepareTemplateStyles(a,b,c)},styleSubtree:function(a,b){X.flushCustomStyles();X.styleSubtree(a,b)},styleElement:function(a){X.flushCustomStyles();X.styleElement(a)},styleDocument:function(a){X.flushCustomStyles();X.styleDocument(a)},flushCustomStyles:function(){X.flushCustomStyles()},
232 getComputedStyleValue:function(a,b){return X.getComputedStyleValue(a,b)},nativeCss:S,nativeShadow:R};hh&&(window.ShadyCSS.ApplyShim=hh);ih&&(window.ShadyCSS.CustomStyleInterface=ih);var jh=window.customElements,kh=window.HTMLImports,lh=window.HTMLTemplateElement;window.WebComponents=window.WebComponents||{};if(jh&&jh.polyfillWrapFlushCallback){var mh,nh=function(){if(mh){lh.C&&lh.C(window.document);var a=mh;mh=null;a();return!0}},oh=kh.whenReady;jh.polyfillWrapFlushCallback(function(a){mh=a;oh(nh)});kh.whenReady=function(a){oh(function(){nh()?kh.whenReady(a):a()})}}
233 kh.whenReady(function(){requestAnimationFrame(function(){window.WebComponents.ready=!0;document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})});var ph=document.createElement("style");ph.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var qh=document.querySelector("head");qh.insertBefore(ph,qh.firstChild);}).call(this);
229 234
230 235 //# sourceMappingURL=webcomponents-lite.js.map
@@ -1,884 +1,967 b''
1 1 <%namespace name="commentblock" file="/changeset/changeset_file_comment.mako"/>
2 2
3 3 <%def name="diff_line_anchor(filename, line, type)"><%
4 4 return '%s_%s_%i' % (h.safeid(filename), type, line)
5 5 %></%def>
6 6
7 7 <%def name="action_class(action)">
8 8 <%
9 9 return {
10 10 '-': 'cb-deletion',
11 11 '+': 'cb-addition',
12 12 ' ': 'cb-context',
13 13 }.get(action, 'cb-empty')
14 14 %>
15 15 </%def>
16 16
17 17 <%def name="op_class(op_id)">
18 18 <%
19 19 return {
20 20 DEL_FILENODE: 'deletion', # file deleted
21 21 BIN_FILENODE: 'warning' # binary diff hidden
22 22 }.get(op_id, 'addition')
23 23 %>
24 24 </%def>
25 25
26 26
27 27
28 28 <%def name="render_diffset(diffset, commit=None,
29 29
30 30 # collapse all file diff entries when there are more than this amount of files in the diff
31 31 collapse_when_files_over=20,
32 32
33 33 # collapse lines in the diff when more than this amount of lines changed in the file diff
34 34 lines_changed_limit=500,
35 35
36 36 # add a ruler at to the output
37 37 ruler_at_chars=0,
38 38
39 39 # show inline comments
40 40 use_comments=False,
41 41
42 42 # disable new comments
43 43 disable_new_comments=False,
44 44
45 45 # special file-comments that were deleted in previous versions
46 46 # it's used for showing outdated comments for deleted files in a PR
47 47 deleted_files_comments=None,
48 48
49 49 # for cache purpose
50 50 inline_comments=None,
51 51
52 52 )">
53 53 %if use_comments:
54 54 <div id="cb-comments-inline-container-template" class="js-template">
55 55 ${inline_comments_container([], inline_comments)}
56 56 </div>
57 57 <div class="js-template" id="cb-comment-inline-form-template">
58 58 <div class="comment-inline-form ac">
59 59
60 60 %if c.rhodecode_user.username != h.DEFAULT_USER:
61 61 ## render template for inline comments
62 62 ${commentblock.comment_form(form_type='inline')}
63 63 %else:
64 64 ${h.form('', class_='inline-form comment-form-login', method='get')}
65 65 <div class="pull-left">
66 66 <div class="comment-help pull-right">
67 67 ${_('You need to be logged in to leave comments.')} <a href="${h.route_path('login', _query={'came_from': h.current_route_path(request)})}">${_('Login now')}</a>
68 68 </div>
69 69 </div>
70 70 <div class="comment-button pull-right">
71 71 <button type="button" class="cb-comment-cancel" onclick="return Rhodecode.comments.cancelComment(this);">
72 72 ${_('Cancel')}
73 73 </button>
74 74 </div>
75 75 <div class="clearfix"></div>
76 76 ${h.end_form()}
77 77 %endif
78 78 </div>
79 79 </div>
80 80
81 81 %endif
82 82 <%
83 83 collapse_all = len(diffset.files) > collapse_when_files_over
84 84 %>
85 85
86 86 %if c.user_session_attrs["diffmode"] == 'sideside':
87 87 <style>
88 88 .wrapper {
89 89 max-width: 1600px !important;
90 90 }
91 91 </style>
92 92 %endif
93 93
94 94 %if ruler_at_chars:
95 95 <style>
96 96 .diff table.cb .cb-content:after {
97 97 content: "";
98 98 border-left: 1px solid blue;
99 99 position: absolute;
100 100 top: 0;
101 101 height: 18px;
102 102 opacity: .2;
103 103 z-index: 10;
104 104 //## +5 to account for diff action (+/-)
105 105 left: ${ruler_at_chars + 5}ch;
106 106 </style>
107 107 %endif
108 108
109 109 <div class="diffset ${disable_new_comments and 'diffset-comments-disabled'}">
110 110 <div class="diffset-heading ${diffset.limited_diff and 'diffset-heading-warning' or ''}">
111 111 %if commit:
112 112 <div class="pull-right">
113 113 <a class="btn tooltip" title="${h.tooltip(_('Browse Files at revision {}').format(commit.raw_id))}" href="${h.route_path('repo_files',repo_name=diffset.repo_name, commit_id=commit.raw_id, f_path='')}">
114 114 ${_('Browse Files')}
115 115 </a>
116 116 </div>
117 117 %endif
118 118 <h2 class="clearinner">
119 119 ## invidual commit
120 120 % if commit:
121 121 <a class="tooltip revision" title="${h.tooltip(commit.message)}" href="${h.route_path('repo_commit',repo_name=diffset.repo_name,commit_id=commit.raw_id)}">${('r%s:%s' % (commit.idx,h.short_id(commit.raw_id)))}</a> -
122 122 ${h.age_component(commit.date)}
123 123 % if diffset.limited_diff:
124 124 - ${_('The requested commit is too big and content was truncated.')}
125 125 ${_ungettext('%(num)s file changed.', '%(num)s files changed.', diffset.changed_files) % {'num': diffset.changed_files}}
126 126 <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
127 127 % elif hasattr(c, 'commit_ranges') and len(c.commit_ranges) > 1:
128 128 ## compare diff, has no file-selector and we want to show stats anyway
129 129 ${_ungettext('{num} file changed: {linesadd} inserted, ''{linesdel} deleted',
130 130 '{num} files changed: {linesadd} inserted, {linesdel} deleted', diffset.changed_files) \
131 131 .format(num=diffset.changed_files, linesadd=diffset.lines_added, linesdel=diffset.lines_deleted)}
132 132 % endif
133 133 % else:
134 134 ## pull requests/compare
135 135 ${_('File Changes')}
136 136 % endif
137 137
138 138 </h2>
139 139 </div>
140 140
141 141 %if diffset.has_hidden_changes:
142 142 <p class="empty_data">${_('Some changes may be hidden')}</p>
143 143 %elif not diffset.files:
144 144 <p class="empty_data">${_('No files')}</p>
145 145 %endif
146 146
147 147 <div class="filediffs">
148
148 149 ## initial value could be marked as False later on
149 150 <% over_lines_changed_limit = False %>
150 151 %for i, filediff in enumerate(diffset.files):
151 152
152 153 <%
153 154 lines_changed = filediff.patch['stats']['added'] + filediff.patch['stats']['deleted']
154 155 over_lines_changed_limit = lines_changed > lines_changed_limit
155 156 %>
157 ## anchor with support of sticky header
158 <div class="anchor" id="a_${h.FID(filediff.raw_id, filediff.patch['filename'])}"></div>
156 159
157 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filediff)}" type="checkbox">
160 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filediff)}" type="checkbox" onchange="Waypoint.refreshAll();">
158 161 <div
159 162 class="filediff"
160 163 data-f-path="${filediff.patch['filename']}"
161 id="a_${h.FID(filediff.raw_id, filediff.patch['filename'])}"
164 data-anchor-id="${h.FID(filediff.raw_id, filediff.patch['filename'])}"
162 165 >
163
164 166 <label for="filediff-collapse-${id(filediff)}" class="filediff-heading">
165 167 <div class="filediff-collapse-indicator"></div>
166 168 ${diff_ops(filediff)}
167 169 </label>
170
168 171 ${diff_menu(filediff, use_comments=use_comments)}
169 <table class="cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${(over_lines_changed_limit and 'cb-collapsed' or '')}">
172 <table data-f-path="${filediff.patch['filename']}" data-anchor-id="${h.FID(filediff.raw_id, filediff.patch['filename'])}" class="code-visible-block cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${(over_lines_changed_limit and 'cb-collapsed' or '')}">
170 173
171 174 ## new/deleted/empty content case
172 175 % if not filediff.hunks:
173 176 ## Comment container, on "fakes" hunk that contains all data to render comments
174 177 ${render_hunk_lines(c.user_session_attrs["diffmode"], filediff.hunk_ops, use_comments=use_comments, inline_comments=inline_comments)}
175 178 % endif
176 179
177 180 %if filediff.limited_diff:
178 181 <tr class="cb-warning cb-collapser">
179 182 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
180 183 ${_('The requested commit is too big and content was truncated.')} <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
181 184 </td>
182 185 </tr>
183 186 %else:
184 187 %if over_lines_changed_limit:
185 188 <tr class="cb-warning cb-collapser">
186 189 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
187 190 ${_('This diff has been collapsed as it changes many lines, (%i lines changed)' % lines_changed)}
188 191 <a href="#" class="cb-expand"
189 192 onclick="$(this).closest('table').removeClass('cb-collapsed'); return false;">${_('Show them')}
190 193 </a>
191 194 <a href="#" class="cb-collapse"
192 195 onclick="$(this).closest('table').addClass('cb-collapsed'); return false;">${_('Hide them')}
193 196 </a>
194 197 </td>
195 198 </tr>
196 199 %endif
197 200 %endif
198 201
199 202 % for hunk in filediff.hunks:
200 203 <tr class="cb-hunk">
201 204 <td ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=3' or '')}>
202 205 ## TODO: dan: add ajax loading of more context here
203 206 ## <a href="#">
204 207 <i class="icon-more"></i>
205 208 ## </a>
206 209 </td>
207 210 <td ${(c.user_session_attrs["diffmode"] == 'sideside' and 'colspan=5' or '')}>
208 211 @@
209 212 -${hunk.source_start},${hunk.source_length}
210 213 +${hunk.target_start},${hunk.target_length}
211 214 ${hunk.section_header}
212 215 </td>
213 216 </tr>
214 217 ${render_hunk_lines(c.user_session_attrs["diffmode"], hunk, use_comments=use_comments, inline_comments=inline_comments)}
215 218 % endfor
216 219
217 220 <% unmatched_comments = (inline_comments or {}).get(filediff.patch['filename'], {}) %>
218 221
219 222 ## outdated comments that do not fit into currently displayed lines
220 223 % for lineno, comments in unmatched_comments.items():
221 224
222 225 %if c.user_session_attrs["diffmode"] == 'unified':
223 226 % if loop.index == 0:
224 227 <tr class="cb-hunk">
225 228 <td colspan="3"></td>
226 229 <td>
227 230 <div>
228 231 ${_('Unmatched inline comments below')}
229 232 </div>
230 233 </td>
231 234 </tr>
232 235 % endif
233 236 <tr class="cb-line">
234 237 <td class="cb-data cb-context"></td>
235 238 <td class="cb-lineno cb-context"></td>
236 239 <td class="cb-lineno cb-context"></td>
237 240 <td class="cb-content cb-context">
238 241 ${inline_comments_container(comments, inline_comments)}
239 242 </td>
240 243 </tr>
241 244 %elif c.user_session_attrs["diffmode"] == 'sideside':
242 245 % if loop.index == 0:
243 246 <tr class="cb-comment-info">
244 247 <td colspan="2"></td>
245 248 <td class="cb-line">
246 249 <div>
247 250 ${_('Unmatched inline comments below')}
248 251 </div>
249 252 </td>
250 253 <td colspan="2"></td>
251 254 <td class="cb-line">
252 255 <div>
253 256 ${_('Unmatched comments below')}
254 257 </div>
255 258 </td>
256 259 </tr>
257 260 % endif
258 261 <tr class="cb-line">
259 262 <td class="cb-data cb-context"></td>
260 263 <td class="cb-lineno cb-context"></td>
261 264 <td class="cb-content cb-context">
262 265 % if lineno.startswith('o'):
263 266 ${inline_comments_container(comments, inline_comments)}
264 267 % endif
265 268 </td>
266 269
267 270 <td class="cb-data cb-context"></td>
268 271 <td class="cb-lineno cb-context"></td>
269 272 <td class="cb-content cb-context">
270 273 % if lineno.startswith('n'):
271 274 ${inline_comments_container(comments, inline_comments)}
272 275 % endif
273 276 </td>
274 277 </tr>
275 278 %endif
276 279
277 280 % endfor
278 281
279 282 </table>
280 283 </div>
281 284 %endfor
282 285
283 286 ## outdated comments that are made for a file that has been deleted
284 287 % for filename, comments_dict in (deleted_files_comments or {}).items():
285 288 <%
286 289 display_state = 'display: none'
287 290 open_comments_in_file = [x for x in comments_dict['comments'] if x.outdated is False]
288 291 if open_comments_in_file:
289 292 display_state = ''
290 293 %>
291 294 <div class="filediffs filediff-outdated" style="${display_state}">
292 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filename)}" type="checkbox">
295 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filename)}" type="checkbox" onchange="Waypoint.refreshAll();">
293 296 <div class="filediff" data-f-path="${filename}" id="a_${h.FID(filediff.raw_id, filename)}">
294 297 <label for="filediff-collapse-${id(filename)}" class="filediff-heading">
295 298 <div class="filediff-collapse-indicator"></div>
296 299 <span class="pill">
297 300 ## file was deleted
298 301 <strong>${filename}</strong>
299 302 </span>
300 303 <span class="pill-group" style="float: left">
301 304 ## file op, doesn't need translation
302 305 <span class="pill" op="removed">removed in this version</span>
303 306 </span>
304 307 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filename)}">ΒΆ</a>
305 308 <span class="pill-group" style="float: right">
306 309 <span class="pill" op="deleted">-${comments_dict['stats']}</span>
307 310 </span>
308 311 </label>
309 312
310 313 <table class="cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${over_lines_changed_limit and 'cb-collapsed' or ''}">
311 314 <tr>
312 315 % if c.user_session_attrs["diffmode"] == 'unified':
313 316 <td></td>
314 317 %endif
315 318
316 319 <td></td>
317 320 <td class="cb-text cb-${op_class(BIN_FILENODE)}" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=5')}>
318 321 ${_('File was deleted in this version. There are still outdated/unresolved comments attached to it.')}
319 322 </td>
320 323 </tr>
321 324 %if c.user_session_attrs["diffmode"] == 'unified':
322 325 <tr class="cb-line">
323 326 <td class="cb-data cb-context"></td>
324 327 <td class="cb-lineno cb-context"></td>
325 328 <td class="cb-lineno cb-context"></td>
326 329 <td class="cb-content cb-context">
327 330 ${inline_comments_container(comments_dict['comments'], inline_comments)}
328 331 </td>
329 332 </tr>
330 333 %elif c.user_session_attrs["diffmode"] == 'sideside':
331 334 <tr class="cb-line">
332 335 <td class="cb-data cb-context"></td>
333 336 <td class="cb-lineno cb-context"></td>
334 337 <td class="cb-content cb-context"></td>
335 338
336 339 <td class="cb-data cb-context"></td>
337 340 <td class="cb-lineno cb-context"></td>
338 341 <td class="cb-content cb-context">
339 342 ${inline_comments_container(comments_dict['comments'], inline_comments)}
340 343 </td>
341 344 </tr>
342 345 %endif
343 346 </table>
344 347 </div>
345 348 </div>
346 349 % endfor
347 350
348 351 </div>
349 352 </div>
350 353 </%def>
351 354
352 355 <%def name="diff_ops(filediff)">
353 356 <%
354 357 from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
355 358 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE, COPIED_FILENODE
356 359 %>
357 360 <span class="pill">
358 361 %if filediff.source_file_path and filediff.target_file_path:
359 362 %if filediff.source_file_path != filediff.target_file_path:
360 363 ## file was renamed, or copied
361 364 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
362 365 <strong>${filediff.target_file_path}</strong> β¬… <del>${filediff.source_file_path}</del>
363 366 <% final_path = filediff.target_file_path %>
364 367 %elif COPIED_FILENODE in filediff.patch['stats']['ops']:
365 368 <strong>${filediff.target_file_path}</strong> β¬… ${filediff.source_file_path}
366 369 <% final_path = filediff.target_file_path %>
367 370 %endif
368 371 %else:
369 372 ## file was modified
370 373 <strong>${filediff.source_file_path}</strong>
371 374 <% final_path = filediff.source_file_path %>
372 375 %endif
373 376 %else:
374 377 %if filediff.source_file_path:
375 378 ## file was deleted
376 379 <strong>${filediff.source_file_path}</strong>
377 380 <% final_path = filediff.source_file_path %>
378 381 %else:
379 382 ## file was added
380 383 <strong>${filediff.target_file_path}</strong>
381 384 <% final_path = filediff.target_file_path %>
382 385 %endif
383 386 %endif
384 387 <i style="color: #aaa" class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${final_path}" title="${_('Copy the full path')}" onclick="return false;"></i>
385 388 </span>
386 389 ## anchor link
387 390 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filediff.patch['filename'])}">ΒΆ</a>
388 391
389 392 <span class="pill-group" style="float: right">
390 393
391 394 ## ops pills
392 395 %if filediff.limited_diff:
393 396 <span class="pill tooltip" op="limited" title="The stats for this diff are not complete">limited diff</span>
394 397 %endif
395 398
396 399 %if NEW_FILENODE in filediff.patch['stats']['ops']:
397 400 <span class="pill" op="created">created</span>
398 401 %if filediff['target_mode'].startswith('120'):
399 402 <span class="pill" op="symlink">symlink</span>
400 403 %else:
401 404 <span class="pill" op="mode">${nice_mode(filediff['target_mode'])}</span>
402 405 %endif
403 406 %endif
404 407
405 408 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
406 409 <span class="pill" op="renamed">renamed</span>
407 410 %endif
408 411
409 412 %if COPIED_FILENODE in filediff.patch['stats']['ops']:
410 413 <span class="pill" op="copied">copied</span>
411 414 %endif
412 415
413 416 %if DEL_FILENODE in filediff.patch['stats']['ops']:
414 417 <span class="pill" op="removed">removed</span>
415 418 %endif
416 419
417 420 %if CHMOD_FILENODE in filediff.patch['stats']['ops']:
418 421 <span class="pill" op="mode">
419 422 ${nice_mode(filediff['source_mode'])} ➑ ${nice_mode(filediff['target_mode'])}
420 423 </span>
421 424 %endif
422 425
423 426 %if BIN_FILENODE in filediff.patch['stats']['ops']:
424 427 <span class="pill" op="binary">binary</span>
425 428 %if MOD_FILENODE in filediff.patch['stats']['ops']:
426 429 <span class="pill" op="modified">modified</span>
427 430 %endif
428 431 %endif
429 432
430 433 <span class="pill" op="added">${('+' if filediff.patch['stats']['added'] else '')}${filediff.patch['stats']['added']}</span>
431 434 <span class="pill" op="deleted">${((h.safe_int(filediff.patch['stats']['deleted']) or 0) * -1)}</span>
432 435
433 436 </span>
434 437
435 438 </%def>
436 439
437 440 <%def name="nice_mode(filemode)">
438 441 ${(filemode.startswith('100') and filemode[3:] or filemode)}
439 442 </%def>
440 443
441 444 <%def name="diff_menu(filediff, use_comments=False)">
442 445 <div class="filediff-menu">
443 446 %if filediff.diffset.source_ref:
444 447 %if filediff.operation in ['D', 'M']:
445 448 <a
446 449 class="tooltip"
447 450 href="${h.route_path('repo_files',repo_name=filediff.diffset.repo_name,commit_id=filediff.diffset.source_ref,f_path=filediff.source_file_path)}"
448 451 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
449 452 >
450 453 ${_('Show file before')}
451 454 </a> |
452 455 %else:
453 456 <span
454 457 class="tooltip"
455 458 title="${h.tooltip(_('File no longer present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
456 459 >
457 460 ${_('Show file before')}
458 461 </span> |
459 462 %endif
460 463 %if filediff.operation in ['A', 'M']:
461 464 <a
462 465 class="tooltip"
463 466 href="${h.route_path('repo_files',repo_name=filediff.diffset.source_repo_name,commit_id=filediff.diffset.target_ref,f_path=filediff.target_file_path)}"
464 467 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
465 468 >
466 469 ${_('Show file after')}
467 470 </a> |
468 471 %else:
469 472 <span
470 473 class="tooltip"
471 474 title="${h.tooltip(_('File no longer present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
472 475 >
473 476 ${_('Show file after')}
474 477 </span> |
475 478 %endif
476 479 <a
477 480 class="tooltip"
478 481 title="${h.tooltip(_('Raw diff'))}"
479 482 href="${h.route_path('repo_files_diff',repo_name=filediff.diffset.repo_name,f_path=filediff.target_file_path, _query=dict(diff2=filediff.diffset.target_ref,diff1=filediff.diffset.source_ref,diff='raw'))}"
480 483 >
481 484 ${_('Raw diff')}
482 485 </a> |
483 486 <a
484 487 class="tooltip"
485 488 title="${h.tooltip(_('Download diff'))}"
486 489 href="${h.route_path('repo_files_diff',repo_name=filediff.diffset.repo_name,f_path=filediff.target_file_path, _query=dict(diff2=filediff.diffset.target_ref,diff1=filediff.diffset.source_ref,diff='download'))}"
487 490 >
488 491 ${_('Download diff')}
489 492 </a>
490 493 % if use_comments:
491 494 |
492 495 % endif
493 496
494 497 ## TODO: dan: refactor ignorews_url and context_url into the diff renderer same as diffmode=unified/sideside. Also use ajax to load more context (by clicking hunks)
495 498 %if hasattr(c, 'ignorews_url'):
496 499 ${c.ignorews_url(request, h.FID(filediff.raw_id, filediff.patch['filename']))}
497 500 %endif
498 501 %if hasattr(c, 'context_url'):
499 502 ${c.context_url(request, h.FID(filediff.raw_id, filediff.patch['filename']))}
500 503 %endif
501 504
502 505 %if use_comments:
503 506 <a href="#" onclick="return Rhodecode.comments.toggleComments(this);">
504 507 <span class="show-comment-button">${_('Show comments')}</span><span class="hide-comment-button">${_('Hide comments')}</span>
505 508 </a>
506 509 %endif
507 510 %endif
508 511 </div>
509 512 </%def>
510 513
511 514
512 515 <%def name="inline_comments_container(comments, inline_comments)">
513 516 <div class="inline-comments">
514 517 %for comment in comments:
515 518 ${commentblock.comment_block(comment, inline=True)}
516 519 %endfor
517 520 % if comments and comments[-1].outdated:
518 521 <span class="btn btn-secondary cb-comment-add-button comment-outdated}"
519 522 style="display: none;}">
520 523 ${_('Add another comment')}
521 524 </span>
522 525 % else:
523 526 <span onclick="return Rhodecode.comments.createComment(this)"
524 527 class="btn btn-secondary cb-comment-add-button">
525 528 ${_('Add another comment')}
526 529 </span>
527 530 % endif
528 531
529 532 </div>
530 533 </%def>
531 534
532 535 <%!
533 536 def get_comments_for(diff_type, comments, filename, line_version, line_number):
534 537 if hasattr(filename, 'unicode_path'):
535 538 filename = filename.unicode_path
536 539
537 540 if not isinstance(filename, basestring):
538 541 return None
539 542
540 543 line_key = '{}{}'.format(line_version, line_number) ## e.g o37, n12
541 544
542 545 if comments and filename in comments:
543 546 file_comments = comments[filename]
544 547 if line_key in file_comments:
545 548 data = file_comments.pop(line_key)
546 549 return data
547 550 %>
548 551
549 552 <%def name="render_hunk_lines_sideside(hunk, use_comments=False, inline_comments=None)">
550 553
551 554 %for i, line in enumerate(hunk.sideside):
552 555 <%
553 556 old_line_anchor, new_line_anchor = None, None
554 557 if line.original.lineno:
555 558 old_line_anchor = diff_line_anchor(hunk.source_file_path, line.original.lineno, 'o')
556 559 if line.modified.lineno:
557 560 new_line_anchor = diff_line_anchor(hunk.target_file_path, line.modified.lineno, 'n')
558 561 %>
559 562
560 563 <tr class="cb-line">
561 564 <td class="cb-data ${action_class(line.original.action)}"
562 565 data-line-no="${line.original.lineno}"
563 566 >
564 567 <div>
565 568
566 569 <% line_old_comments = None %>
567 570 %if line.original.get_comment_args:
568 571 <% line_old_comments = get_comments_for('side-by-side', inline_comments, *line.original.get_comment_args) %>
569 572 %endif
570 573 %if line_old_comments:
571 574 <% has_outdated = any([x.outdated for x in line_old_comments]) %>
572 575 % if has_outdated:
573 576 <i title="${_('comments including outdated')}:${len(line_old_comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
574 577 % else:
575 578 <i title="${_('comments')}: ${len(line_old_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
576 579 % endif
577 580 %endif
578 581 </div>
579 582 </td>
580 583 <td class="cb-lineno ${action_class(line.original.action)}"
581 584 data-line-no="${line.original.lineno}"
582 585 %if old_line_anchor:
583 586 id="${old_line_anchor}"
584 587 %endif
585 588 >
586 589 %if line.original.lineno:
587 590 <a name="${old_line_anchor}" href="#${old_line_anchor}">${line.original.lineno}</a>
588 591 %endif
589 592 </td>
590 593 <td class="cb-content ${action_class(line.original.action)}"
591 594 data-line-no="o${line.original.lineno}"
592 595 >
593 596 %if use_comments and line.original.lineno:
594 597 ${render_add_comment_button()}
595 598 %endif
596 599 <span class="cb-code">${line.original.action} ${line.original.content or '' | n}</span>
597 600
598 601 %if use_comments and line.original.lineno and line_old_comments:
599 602 ${inline_comments_container(line_old_comments, inline_comments)}
600 603 %endif
601 604
602 605 </td>
603 606 <td class="cb-data ${action_class(line.modified.action)}"
604 607 data-line-no="${line.modified.lineno}"
605 608 >
606 609 <div>
607 610
608 611 %if line.modified.get_comment_args:
609 612 <% line_new_comments = get_comments_for('side-by-side', inline_comments, *line.modified.get_comment_args) %>
610 613 %else:
611 614 <% line_new_comments = None%>
612 615 %endif
613 616 %if line_new_comments:
614 617 <% has_outdated = any([x.outdated for x in line_new_comments]) %>
615 618 % if has_outdated:
616 619 <i title="${_('comments including outdated')}:${len(line_new_comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
617 620 % else:
618 621 <i title="${_('comments')}: ${len(line_new_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
619 622 % endif
620 623 %endif
621 624 </div>
622 625 </td>
623 626 <td class="cb-lineno ${action_class(line.modified.action)}"
624 627 data-line-no="${line.modified.lineno}"
625 628 %if new_line_anchor:
626 629 id="${new_line_anchor}"
627 630 %endif
628 631 >
629 632 %if line.modified.lineno:
630 633 <a name="${new_line_anchor}" href="#${new_line_anchor}">${line.modified.lineno}</a>
631 634 %endif
632 635 </td>
633 636 <td class="cb-content ${action_class(line.modified.action)}"
634 637 data-line-no="n${line.modified.lineno}"
635 638 >
636 639 %if use_comments and line.modified.lineno:
637 640 ${render_add_comment_button()}
638 641 %endif
639 642 <span class="cb-code">${line.modified.action} ${line.modified.content or '' | n}</span>
640 643 %if use_comments and line.modified.lineno and line_new_comments:
641 644 ${inline_comments_container(line_new_comments, inline_comments)}
642 645 %endif
643 646 </td>
644 647 </tr>
645 648 %endfor
646 649 </%def>
647 650
648 651
649 652 <%def name="render_hunk_lines_unified(hunk, use_comments=False, inline_comments=None)">
650 653 %for old_line_no, new_line_no, action, content, comments_args in hunk.unified:
651 654 <%
652 655 old_line_anchor, new_line_anchor = None, None
653 656 if old_line_no:
654 657 old_line_anchor = diff_line_anchor(hunk.source_file_path, old_line_no, 'o')
655 658 if new_line_no:
656 659 new_line_anchor = diff_line_anchor(hunk.target_file_path, new_line_no, 'n')
657 660 %>
658 661 <tr class="cb-line">
659 662 <td class="cb-data ${action_class(action)}">
660 663 <div>
661 664
662 665 %if comments_args:
663 666 <% comments = get_comments_for('unified', inline_comments, *comments_args) %>
664 667 %else:
665 668 <% comments = None %>
666 669 %endif
667 670
668 671 % if comments:
669 672 <% has_outdated = any([x.outdated for x in comments]) %>
670 673 % if has_outdated:
671 674 <i title="${_('comments including outdated')}:${len(comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
672 675 % else:
673 676 <i title="${_('comments')}: ${len(comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
674 677 % endif
675 678 % endif
676 679 </div>
677 680 </td>
678 681 <td class="cb-lineno ${action_class(action)}"
679 682 data-line-no="${old_line_no}"
680 683 %if old_line_anchor:
681 684 id="${old_line_anchor}"
682 685 %endif
683 686 >
684 687 %if old_line_anchor:
685 688 <a name="${old_line_anchor}" href="#${old_line_anchor}">${old_line_no}</a>
686 689 %endif
687 690 </td>
688 691 <td class="cb-lineno ${action_class(action)}"
689 692 data-line-no="${new_line_no}"
690 693 %if new_line_anchor:
691 694 id="${new_line_anchor}"
692 695 %endif
693 696 >
694 697 %if new_line_anchor:
695 698 <a name="${new_line_anchor}" href="#${new_line_anchor}">${new_line_no}</a>
696 699 %endif
697 700 </td>
698 701 <td class="cb-content ${action_class(action)}"
699 702 data-line-no="${(new_line_no and 'n' or 'o')}${(new_line_no or old_line_no)}"
700 703 >
701 704 %if use_comments:
702 705 ${render_add_comment_button()}
703 706 %endif
704 707 <span class="cb-code">${action} ${content or '' | n}</span>
705 708 %if use_comments and comments:
706 709 ${inline_comments_container(comments, inline_comments)}
707 710 %endif
708 711 </td>
709 712 </tr>
710 713 %endfor
711 714 </%def>
712 715
713 716
714 717 <%def name="render_hunk_lines(diff_mode, hunk, use_comments, inline_comments)">
715 718 % if diff_mode == 'unified':
716 719 ${render_hunk_lines_unified(hunk, use_comments=use_comments, inline_comments=inline_comments)}
717 720 % elif diff_mode == 'sideside':
718 721 ${render_hunk_lines_sideside(hunk, use_comments=use_comments, inline_comments=inline_comments)}
719 722 % else:
720 723 <tr class="cb-line">
721 724 <td>unknown diff mode</td>
722 725 </tr>
723 726 % endif
724 727 </%def>file changes
725 728
726 729
727 730 <%def name="render_add_comment_button()">
728 731 <button class="btn btn-small btn-primary cb-comment-box-opener" onclick="return Rhodecode.comments.createComment(this)">
729 732 <span><i class="icon-comment"></i></span>
730 733 </button>
731 734 </%def>
732 735
733 736 <%def name="render_diffset_menu(diffset=None, range_diff_on=None)">
734 737
735 <div class="diffset-menu clearinner">
738 <div id="diff-file-sticky" class="diffset-menu clearinner">
739 ## auto adjustable
740 <div class="sidebar__inner" style="z-index: 30;background-color: #fff; padding: 5px 0px;">
736 741 <div class="pull-right">
737 742 <div class="btn-group">
738 743
739 744 <a
740 745 class="btn ${(c.user_session_attrs["diffmode"] == 'sideside' and 'btn-primary')} tooltip"
741 746 title="${h.tooltip(_('View side by side'))}"
742 747 href="${h.current_route_path(request, diffmode='sideside')}">
743 748 <span>${_('Side by Side')}</span>
744 749 </a>
745 750 <a
746 751 class="btn ${(c.user_session_attrs["diffmode"] == 'unified' and 'btn-primary')} tooltip"
747 752 title="${h.tooltip(_('View unified'))}" href="${h.current_route_path(request, diffmode='unified')}">
748 753 <span>${_('Unified')}</span>
749 754 </a>
750 755 % if range_diff_on is True:
751 756 <a
752 757 title="${_('Turn off: Show the diff as commit range')}"
753 758 class="btn btn-primary"
754 759 href="${h.current_route_path(request, **{"range-diff":"0"})}">
755 760 <span>${_('Range Diff')}</span>
756 761 </a>
757 762 % elif range_diff_on is False:
758 763 <a
759 764 title="${_('Show the diff as commit range')}"
760 765 class="btn"
761 766 href="${h.current_route_path(request, **{"range-diff":"1"})}">
762 767 <span>${_('Range Diff')}</span>
763 768 </a>
764 769 % endif
765 770 </div>
766 771 </div>
767
768 772 <div class="pull-left">
769 773 <div class="btn-group">
770 774 <div class="pull-left">
771 775 ${h.hidden('file_filter')}
772 776 </div>
773 777 <a
774 778 class="btn"
775 779 href="#"
776 onclick="$('input[class=filediff-collapse-state]').prop('checked', false); return false">${_('Expand All Files')}</a>
780 onclick="$('input[class=filediff-collapse-state]').prop('checked', false); Waypoint.refreshAll(); return false">${_('Expand All Files')}</a>
781 <a
782 class="btn"
783 href="#"
784 onclick="$('input[class=filediff-collapse-state]').prop('checked', true); Waypoint.refreshAll(); return false">${_('Collapse All Files')}</a>
777 785 <a
778 786 class="btn"
779 787 href="#"
780 onclick="$('input[class=filediff-collapse-state]').prop('checked', true); return false">${_('Collapse All Files')}</a>
781 <a
782 class="btn"
783 href="#"
784 onclick="return Rhodecode.comments.toggleWideMode(this)">${_('Wide Mode Diff')}</a>
788 onclick="updateSticky();return Rhodecode.comments.toggleWideMode(this)">${_('Wide Mode Diff')}</a>
785 789
786 790 </div>
787 791 </div>
792 <div class="fpath-placeholder">
793 <i class="icon-file-text"></i>
794 <strong class="fpath-placeholder-text">
795
796 </strong>
797 </div>
798 <div class="sidebar_inner_shadow"></div>
799 </div>
788 800 </div>
789 801
790 802 % if diffset:
791 803
792 804 %if diffset.limited_diff:
793 805 <% file_placeholder = _ungettext('%(num)s file changed', '%(num)s files changed', diffset.changed_files) % {'num': diffset.changed_files}%>
794 806 %else:
795 807 <% file_placeholder = _ungettext('%(num)s file changed: %(linesadd)s inserted, ''%(linesdel)s deleted', '%(num)s files changed: %(linesadd)s inserted, %(linesdel)s deleted', diffset.changed_files) % {'num': diffset.changed_files, 'linesadd': diffset.lines_added, 'linesdel': diffset.lines_deleted}%>
796 808 %endif
809 ## case on range-diff placeholder needs to be updated
810 % if range_diff_on is True:
811 <% file_placeholder = _('Disabled on range diff') %>
812 % endif
797 813
798 814 <script>
799 815
800 816 var feedFilesOptions = function (query, initialData) {
801 817 var data = {results: []};
802 818 var isQuery = typeof query.term !== 'undefined';
803 819
804 820 var section = _gettext('Changed files');
805 821 var filteredData = [];
806 822
807 823 //filter results
808 824 $.each(initialData.results, function (idx, value) {
809 825
810 826 if (!isQuery || query.term.length === 0 || value.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) {
811 827 filteredData.push({
812 828 'id': this.id,
813 829 'text': this.text,
814 830 "ops": this.ops,
815 831 })
816 832 }
817 833
818 834 });
819 835
820 836 data.results = filteredData;
821 837
822 838 query.callback(data);
823 839 };
824 840
825 841 var formatFileResult = function(result, container, query, escapeMarkup) {
826 842 return function(data, escapeMarkup) {
827 843 var container = '<div class="filelist" style="padding-right:100px">{0}</div>';
828 844 var tmpl = '<span style="margin-right:-50px"><strong>{0}</strong></span>'.format(escapeMarkup(data['text']));
829 845 var pill = '<span class="pill-group" style="float: right;margin-right: -100px">' +
830 846 '<span class="pill" op="added">{0}</span>' +
831 847 '<span class="pill" op="deleted">{1}</span>' +
832 848 '</span>'
833 849 ;
834 850 var added = data['ops']['added'];
835 851 if (added === 0) {
836 852 // don't show +0
837 853 added = 0;
838 854 } else {
839 855 added = '+' + added;
840 856 }
841 857
842 858 var deleted = -1*data['ops']['deleted'];
843 859
844 860 tmpl += pill.format(added, deleted);
845 861 return container.format(tmpl);
846 862
847 863 }(result, escapeMarkup);
848 864 };
849 865 var preloadData = {
850 866 results: [
851 867 % for filediff in diffset.files:
852 868 {id:"a_${h.FID(filediff.raw_id, filediff.patch['filename'])}",
853 869 text:"${filediff.patch['filename']}",
854 870 ops:${h.json.dumps(filediff.patch['stats'])|n}}${('' if loop.last else ',')}
855 871 % endfor
856 872 ]
857 873 };
858 874
859 $("#file_filter").select2({
875 $(document).ready(function () {
876
877 var fileFilter = $("#file_filter").select2({
860 878 'dropdownAutoWidth': true,
861 879 'width': 'auto',
862 880 'placeholder': "${file_placeholder}",
863 881 containerCssClass: "drop-menu",
864 882 dropdownCssClass: "drop-menu-dropdown",
865 883 data: preloadData,
866 884 query: function(query) {
867 885 feedFilesOptions(query, preloadData);
868 886 },
869 887 formatResult: formatFileResult
870 888 });
889 % if range_diff_on is True:
890 fileFilter.select2("enable", false);
891
892 % endif
871 893
872 894 $("#file_filter").on('click', function (e) {
873 895 e.preventDefault();
874 896 var selected = $('#file_filter').select2('data');
875 897 var idSelector = "#"+selected.id;
876 898 window.location.hash = idSelector;
877 899 // expand the container if we quick-select the field
878 $(idSelector).prev().prop('checked', false);
879 })
900 $(idSelector).next().prop('checked', false);
901 Waypoint.refreshAll()
902 });
903
904 var contextPrefix = _gettext('Context file: ');
905 ## sticky sidebar
906 var sidebarElement = document.getElementById('diff-file-sticky');
907 sidebar = new StickySidebar(sidebarElement, {
908 topSpacing: 0,
909 bottomSpacing: 0,
910 innerWrapperSelector: '.sidebar__inner'
911 });
912 sidebarElement.addEventListener('affixed.static.stickySidebar', function () {
913 // reset our file so it's not holding new value
914 $('.fpath-placeholder-text').html(contextPrefix)
915 });
916
917 updateSticky = function () {
918 sidebar.updateSticky()
919 };
920
921 var animateText = $.debounce(100, function(fPath, anchorId) {
922 // animate setting the text
923 var callback = function () {
924 $('.fpath-placeholder-text').animate({'opacity': 1.00}, 200)
925 $('.fpath-placeholder-text').html(contextPrefix + '<a href="#a_' + anchorId + '">' + fPath + '</a>')
926 };
927 $('.fpath-placeholder-text').animate({'opacity': 0.15}, 200, callback);
928 });
929
930 ## dynamic file waypoints
931 var setFPathInfo = function(fPath, anchorId){
932 animateText(fPath, anchorId)
933 };
934
935 var codeBlock = $('.filediff');
936 // forward waypoint
937 codeBlock.waypoint(
938 function(direction) {
939 if (direction === "down"){
940 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
941 }
942 }, {
943 offset: 60,
944 context: '.fpath-placeholder'
945 }
946 );
947
948 // backward waypoint
949 codeBlock.waypoint(
950 function(direction) {
951 if (direction === "up"){
952 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
953 }
954 }, {
955 offset: function () {
956 return -this.element.clientHeight + 80
957 },
958 context: '.fpath-placeholder'
959 }
960 );
961
962 });
880 963
881 964 </script>
882 965 % endif
883 966
884 </%def>
967 </%def> No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now