{ this.container = c; }}
309 | />
310 | );
311 | }
312 | }
313 |
314 | export default Molecule3d;
315 |
--------------------------------------------------------------------------------
/example/js/bipyridine_model_data.js:
--------------------------------------------------------------------------------
1 | export default {
2 | "atoms": [
3 | {
4 | "elem": "n",
5 | "mass_magnitude": 14.003074,
6 | "momenta": [
7 | 0,
8 | 0,
9 | 0
10 | ],
11 | "name": "n",
12 | "positions": [
13 | -0.7015,
14 | -1.2104,
15 | 0.0598
16 | ],
17 | "residue_index": 0,
18 | "serial": 0
19 | },
20 | {
21 | "elem": "c",
22 | "mass_magnitude": 12,
23 | "momenta": [
24 | 0,
25 | 0,
26 | 0
27 | ],
28 | "name": "c",
29 | "positions": [
30 | -1.4095,
31 | -0.0497,
32 | 0.0357
33 | ],
34 | "residue_index": 0,
35 | "serial": 1
36 | },
37 | {
38 | "elem": "c",
39 | "mass_magnitude": 12,
40 | "momenta": [
41 | 0,
42 | 0,
43 | 0
44 | ],
45 | "name": "c3",
46 | "positions": [
47 | -0.7311,
48 | 1.1783,
49 | 0.0646
50 | ],
51 | "residue_index": 0,
52 | "serial": 2
53 | },
54 | {
55 | "elem": "c",
56 | "mass_magnitude": 12,
57 | "momenta": [
58 | 0,
59 | 0,
60 | 0
61 | ],
62 | "name": "c4",
63 | "positions": [
64 | 0.6605,
65 | 1.2269,
66 | -0.0027
67 | ],
68 | "residue_index": 0,
69 | "serial": 3
70 | },
71 | {
72 | "elem": "c",
73 | "mass_magnitude": 12,
74 | "momenta": [
75 | 0,
76 | 0,
77 | 0
78 | ],
79 | "name": "c5",
80 | "positions": [
81 | 1.3724,
82 | 0.0469,
83 | -0.0163
84 | ],
85 | "residue_index": 0,
86 | "serial": 4
87 | },
88 | {
89 | "elem": "c",
90 | "mass_magnitude": 12,
91 | "momenta": [
92 | 0,
93 | 0,
94 | 0
95 | ],
96 | "name": "c6",
97 | "positions": [
98 | 0.6575,
99 | -1.1366,
100 | 0.0579
101 | ],
102 | "residue_index": 0,
103 | "serial": 5
104 | },
105 | {
106 | "elem": "c",
107 | "mass_magnitude": 12,
108 | "momenta": [
109 | 0,
110 | 0,
111 | 0
112 | ],
113 | "name": "c7",
114 | "positions": [
115 | -2.9039,
116 | -0.1126,
117 | -0.1283
118 | ],
119 | "residue_index": 0,
120 | "serial": 6
121 | },
122 | {
123 | "elem": "n",
124 | "mass_magnitude": 14.003074,
125 | "momenta": [
126 | 0,
127 | 0,
128 | 0
129 | ],
130 | "name": "n8",
131 | "positions": [
132 | -3.5029,
133 | -1.3283,
134 | -0.2388
135 | ],
136 | "residue_index": 0,
137 | "serial": 7
138 | },
139 | {
140 | "elem": "c",
141 | "mass_magnitude": 12,
142 | "momenta": [
143 | 0,
144 | 0,
145 | 0
146 | ],
147 | "name": "c9",
148 | "positions": [
149 | -4.8314,
150 | -1.3682,
151 | -0.5322
152 | ],
153 | "residue_index": 0,
154 | "serial": 8
155 | },
156 | {
157 | "elem": "c",
158 | "mass_magnitude": 12,
159 | "momenta": [
160 | 0,
161 | 0,
162 | 0
163 | ],
164 | "name": "c10",
165 | "positions": [
166 | -5.6084,
167 | -0.2481,
168 | -0.7751
169 | ],
170 | "residue_index": 0,
171 | "serial": 9
172 | },
173 | {
174 | "elem": "c",
175 | "mass_magnitude": 12,
176 | "momenta": [
177 | 0,
178 | 0,
179 | 0
180 | ],
181 | "name": "c11",
182 | "positions": [
183 | -5.0146,
184 | 0.987,
185 | -0.6303
186 | ],
187 | "residue_index": 0,
188 | "serial": 10
189 | },
190 | {
191 | "elem": "c",
192 | "mass_magnitude": 12,
193 | "momenta": [
194 | 0,
195 | 0,
196 | 0
197 | ],
198 | "name": "c12",
199 | "positions": [
200 | -3.6706,
201 | 1.0545,
202 | -0.2661
203 | ],
204 | "residue_index": 0,
205 | "serial": 11
206 | },
207 | {
208 | "elem": "h",
209 | "mass_magnitude": 1.007825,
210 | "momenta": [
211 | 0,
212 | 0,
213 | 0
214 | ],
215 | "name": "h",
216 | "positions": [
217 | -1.2549,
218 | 2.1214,
219 | 0.1109
220 | ],
221 | "residue_index": 0,
222 | "serial": 12
223 | },
224 | {
225 | "elem": "h",
226 | "mass_magnitude": 1.007825,
227 | "momenta": [
228 | 0,
229 | 0,
230 | 0
231 | ],
232 | "name": "h14",
233 | "positions": [
234 | 1.1641,
235 | 2.1886,
236 | -0.0484
237 | ],
238 | "residue_index": 0,
239 | "serial": 13
240 | },
241 | {
242 | "elem": "h",
243 | "mass_magnitude": 1.007825,
244 | "momenta": [
245 | 0,
246 | 0,
247 | 0
248 | ],
249 | "name": "h15",
250 | "positions": [
251 | 2.4567,
252 | 0.0509,
253 | -0.0673
254 | ],
255 | "residue_index": 0,
256 | "serial": 14
257 | },
258 | {
259 | "elem": "h",
260 | "mass_magnitude": 1.007825,
261 | "momenta": [
262 | 0,
263 | 0,
264 | 0
265 | ],
266 | "name": "h16",
267 | "positions": [
268 | 1.1771,
269 | -2.0879,
270 | 0.1185
271 | ],
272 | "residue_index": 0,
273 | "serial": 15
274 | },
275 | {
276 | "elem": "h",
277 | "mass_magnitude": 1.007825,
278 | "momenta": [
279 | 0,
280 | 0,
281 | 0
282 | ],
283 | "name": "h17",
284 | "positions": [
285 | -5.2721,
286 | -2.3596,
287 | -0.5697
288 | ],
289 | "residue_index": 0,
290 | "serial": 16
291 | },
292 | {
293 | "elem": "h",
294 | "mass_magnitude": 1.007825,
295 | "momenta": [
296 | 0,
297 | 0,
298 | 0
299 | ],
300 | "name": "h18",
301 | "positions": [
302 | -6.6538,
303 | -0.3342,
304 | -1.0547
305 | ],
306 | "residue_index": 0,
307 | "serial": 17
308 | },
309 | {
310 | "elem": "h",
311 | "mass_magnitude": 1.007825,
312 | "momenta": [
313 | 0,
314 | 0,
315 | 0
316 | ],
317 | "name": "h19",
318 | "positions": [
319 | -5.573,
320 | 1.9036,
321 | -0.7995
322 | ],
323 | "residue_index": 0,
324 | "serial": 18
325 | },
326 | {
327 | "elem": "h",
328 | "mass_magnitude": 1.007825,
329 | "momenta": [
330 | 0,
331 | 0,
332 | 0
333 | ],
334 | "name": "h20",
335 | "positions": [
336 | -3.2478,
337 | 2.0379,
338 | -0.125
339 | ],
340 | "residue_index": 0,
341 | "serial": 19
342 | }
343 | ],
344 | "bonds": [
345 | {
346 | "atom1_index": 1,
347 | "atom2_index": 6,
348 | "bond_order": 1
349 | },
350 | {
351 | "atom1_index": 1,
352 | "atom2_index": 2,
353 | "bond_order": 1
354 | },
355 | {
356 | "atom1_index": 4,
357 | "atom2_index": 5,
358 | "bond_order": 2
359 | },
360 | {
361 | "atom1_index": 4,
362 | "atom2_index": 14,
363 | "bond_order": 1
364 | },
365 | {
366 | "atom1_index": 7,
367 | "atom2_index": 8,
368 | "bond_order": 1
369 | },
370 | {
371 | "atom1_index": 9,
372 | "atom2_index": 17,
373 | "bond_order": 1
374 | },
375 | {
376 | "atom1_index": 9,
377 | "atom2_index": 10,
378 | "bond_order": 1
379 | },
380 | {
381 | "atom1_index": 8,
382 | "atom2_index": 9,
383 | "bond_order": 2
384 | },
385 | {
386 | "atom1_index": 8,
387 | "atom2_index": 16,
388 | "bond_order": 1
389 | },
390 | {
391 | "atom1_index": 6,
392 | "atom2_index": 7,
393 | "bond_order": 2
394 | },
395 | {
396 | "atom1_index": 6,
397 | "atom2_index": 11,
398 | "bond_order": 1
399 | },
400 | {
401 | "atom1_index": 0,
402 | "atom2_index": 5,
403 | "bond_order": 1
404 | },
405 | {
406 | "atom1_index": 0,
407 | "atom2_index": 1,
408 | "bond_order": 2
409 | },
410 | {
411 | "atom1_index": 11,
412 | "atom2_index": 19,
413 | "bond_order": 1
414 | },
415 | {
416 | "atom1_index": 3,
417 | "atom2_index": 13,
418 | "bond_order": 1
419 | },
420 | {
421 | "atom1_index": 3,
422 | "atom2_index": 4,
423 | "bond_order": 1
424 | },
425 | {
426 | "atom1_index": 5,
427 | "atom2_index": 15,
428 | "bond_order": 1
429 | },
430 | {
431 | "atom1_index": 2,
432 | "atom2_index": 3,
433 | "bond_order": 2
434 | },
435 | {
436 | "atom1_index": 2,
437 | "atom2_index": 12,
438 | "bond_order": 1
439 | },
440 | {
441 | "atom1_index": 10,
442 | "atom2_index": 18,
443 | "bond_order": 1
444 | },
445 | {
446 | "atom1_index": 10,
447 | "atom2_index": 11,
448 | "bond_order": 2
449 | }
450 | ],
451 | "chains": [
452 | {
453 | "description": "",
454 | "name": " "
455 | }
456 | ],
457 | "residues": [
458 | {
459 | "chain_index": 0,
460 | "name": "LIG1",
461 | "sequence_number": 1
462 | }
463 | ]
464 | };
465 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/example/js/vendor/modernizr-2.8.3.min.js:
--------------------------------------------------------------------------------
1 | /* Modernizr 2.8.3 (Custom Build) | MIT & BSD
2 | * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
3 | */
4 | ;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d',a,""].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b)&&c(b).matches||!1;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function l(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function m(){var a=s.elements;return typeof a=="string"?a.split(" "):a}function n(a){var b=j[a[h]];return b||(b={},i++,a[h]=i,j[i]=b),b}function o(a,c,d){c||(c=b);if(k)return c.createElement(a);d||(d=n(c));var g;return d.cache[a]?g=d.cache[a].cloneNode():f.test(a)?g=(d.cache[a]=d.createElem(a)).cloneNode():g=d.createElem(a),g.canHaveChildren&&!e.test(a)&&!g.tagUrn?d.frag.appendChild(g):g}function p(a,c){a||(a=b);if(k)return a.createDocumentFragment();c=c||n(a);var d=c.frag.cloneNode(),e=0,f=m(),g=f.length;for(;e",g="hidden"in a,k=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){g=!0,k=!0}})();var s={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:c,shivCSS:d.shivCSS!==!1,supportsUnknownElements:k,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:r,createElement:o,createDocumentFragment:p};a.html5=s,r(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f
25 | # Header set Access-Control-Allow-Origin "*"
26 | #
27 |
28 | # ----------------------------------------------------------------------
29 | # | Cross-origin images |
30 | # ----------------------------------------------------------------------
31 |
32 | # Send the CORS header for images when browsers request it.
33 | #
34 | # https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image
35 | # https://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html
36 |
37 |
38 |
39 |
40 | SetEnvIf Origin ":" IS_CORS
41 | Header set Access-Control-Allow-Origin "*" env=IS_CORS
42 |
43 |
44 |
45 |
46 | # ----------------------------------------------------------------------
47 | # | Cross-origin web fonts |
48 | # ----------------------------------------------------------------------
49 |
50 | # Allow cross-origin access to web fonts.
51 |
52 |
53 |
54 | Header set Access-Control-Allow-Origin "*"
55 |
56 |
57 |
58 | # ----------------------------------------------------------------------
59 | # | Cross-origin resource timing |
60 | # ----------------------------------------------------------------------
61 |
62 | # Allow cross-origin access to the timing information for all resources.
63 | #
64 | # If a resource isn't served with a `Timing-Allow-Origin` header that
65 | # would allow its timing information to be shared with the document,
66 | # some of the attributes of the `PerformanceResourceTiming` object will
67 | # be set to zero.
68 | #
69 | # http://www.w3.org/TR/resource-timing/
70 | # http://www.stevesouders.com/blog/2014/08/21/resource-timing-practical-tips/
71 |
72 | #
73 | # Header set Timing-Allow-Origin: "*"
74 | #
75 |
76 |
77 | # ######################################################################
78 | # # ERRORS #
79 | # ######################################################################
80 |
81 | # ----------------------------------------------------------------------
82 | # | Custom error messages/pages |
83 | # ----------------------------------------------------------------------
84 |
85 | # Customize what Apache returns to the client in case of an error.
86 | # https://httpd.apache.org/docs/current/mod/core.html#errordocument
87 |
88 | ErrorDocument 404 /404.html
89 |
90 | # ----------------------------------------------------------------------
91 | # | Error prevention |
92 | # ----------------------------------------------------------------------
93 |
94 | # Disable the pattern matching based on filenames.
95 | #
96 | # This setting prevents Apache from returning a 404 error as the result
97 | # of a rewrite when the directory with the same name does not exist.
98 | #
99 | # https://httpd.apache.org/docs/current/content-negotiation.html#multiviews
100 |
101 | Options -MultiViews
102 |
103 |
104 | # ######################################################################
105 | # # INTERNET EXPLORER #
106 | # ######################################################################
107 |
108 | # ----------------------------------------------------------------------
109 | # | Document modes |
110 | # ----------------------------------------------------------------------
111 |
112 | # Force Internet Explorer 8/9/10 to render pages in the highest mode
113 | # available in the various cases when it may not.
114 | #
115 | # https://hsivonen.fi/doctype/#ie8
116 | #
117 | # (!) Starting with Internet Explorer 11, document modes are deprecated.
118 | # If your business still relies on older web apps and services that were
119 | # designed for older versions of Internet Explorer, you might want to
120 | # consider enabling `Enterprise Mode` throughout your company.
121 | #
122 | # https://msdn.microsoft.com/en-us/library/ie/bg182625.aspx#docmode
123 | # http://blogs.msdn.com/b/ie/archive/2014/04/02/stay-up-to-date-with-enterprise-mode-for-internet-explorer-11.aspx
124 |
125 |
126 |
127 | Header set X-UA-Compatible "IE=edge"
128 |
129 | # `mod_headers` cannot match based on the content-type, however,
130 | # the `X-UA-Compatible` response header should be send only for
131 | # HTML documents and not for the other resources.
132 |
133 |
134 | Header unset X-UA-Compatible
135 |
136 |
137 |
138 |
139 | # ----------------------------------------------------------------------
140 | # | Iframes cookies |
141 | # ----------------------------------------------------------------------
142 |
143 | # Allow cookies to be set from iframes in Internet Explorer.
144 | #
145 | # https://msdn.microsoft.com/en-us/library/ms537343.aspx
146 | # http://www.w3.org/TR/2000/CR-P3P-20001215/
147 |
148 | #
149 | # Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
150 | #
151 |
152 |
153 | # ######################################################################
154 | # # MEDIA TYPES AND CHARACTER ENCODINGS #
155 | # ######################################################################
156 |
157 | # ----------------------------------------------------------------------
158 | # | Media types |
159 | # ----------------------------------------------------------------------
160 |
161 | # Serve resources with the proper media types (f.k.a. MIME types).
162 | #
163 | # https://www.iana.org/assignments/media-types/media-types.xhtml
164 | # https://httpd.apache.org/docs/current/mod/mod_mime.html#addtype
165 |
166 |
167 |
168 | # Data interchange
169 |
170 | AddType application/atom+xml atom
171 | AddType application/json json map topojson
172 | AddType application/ld+json jsonld
173 | AddType application/rss+xml rss
174 | AddType application/vnd.geo+json geojson
175 | AddType application/xml rdf xml
176 |
177 |
178 | # JavaScript
179 |
180 | # Normalize to standard type.
181 | # https://tools.ietf.org/html/rfc4329#section-7.2
182 |
183 | AddType application/javascript js
184 |
185 |
186 | # Manifest files
187 |
188 | AddType application/manifest+json webmanifest
189 | AddType application/x-web-app-manifest+json webapp
190 | AddType text/cache-manifest appcache
191 |
192 |
193 | # Media files
194 |
195 | AddType audio/mp4 f4a f4b m4a
196 | AddType audio/ogg oga ogg opus
197 | AddType image/bmp bmp
198 | AddType image/svg+xml svg svgz
199 | AddType image/webp webp
200 | AddType video/mp4 f4v f4p m4v mp4
201 | AddType video/ogg ogv
202 | AddType video/webm webm
203 | AddType video/x-flv flv
204 |
205 | # Serving `.ico` image files with a different media type
206 | # prevents Internet Explorer from displaying then as images:
207 | # https://github.com/h5bp/html5-boilerplate/commit/37b5fec090d00f38de64b591bcddcb205aadf8ee
208 |
209 | AddType image/x-icon cur ico
210 |
211 |
212 | # Web fonts
213 |
214 | AddType application/font-woff woff
215 | AddType application/font-woff2 woff2
216 | AddType application/vnd.ms-fontobject eot
217 |
218 | # Browsers usually ignore the font media types and simply sniff
219 | # the bytes to figure out the font type.
220 | # https://mimesniff.spec.whatwg.org/#matching-a-font-type-pattern
221 | #
222 | # However, Blink and WebKit based browsers will show a warning
223 | # in the console if the following font types are served with any
224 | # other media types.
225 |
226 | AddType application/x-font-ttf ttc ttf
227 | AddType font/opentype otf
228 |
229 |
230 | # Other
231 |
232 | AddType application/octet-stream safariextz
233 | AddType application/x-bb-appworld bbaw
234 | AddType application/x-chrome-extension crx
235 | AddType application/x-opera-extension oex
236 | AddType application/x-xpinstall xpi
237 | AddType text/vcard vcard vcf
238 | AddType text/vnd.rim.location.xloc xloc
239 | AddType text/vtt vtt
240 | AddType text/x-component htc
241 |
242 |
243 |
244 | # ----------------------------------------------------------------------
245 | # | Character encodings |
246 | # ----------------------------------------------------------------------
247 |
248 | # Serve all resources labeled as `text/html` or `text/plain`
249 | # with the media type `charset` parameter set to `UTF-8`.
250 | #
251 | # https://httpd.apache.org/docs/current/mod/core.html#adddefaultcharset
252 |
253 | AddDefaultCharset utf-8
254 |
255 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
256 |
257 | # Serve the following file types with the media type `charset`
258 | # parameter set to `UTF-8`.
259 | #
260 | # https://httpd.apache.org/docs/current/mod/mod_mime.html#addcharset
261 |
262 |
263 | AddCharset utf-8 .atom \
264 | .bbaw \
265 | .css \
266 | .geojson \
267 | .js \
268 | .json \
269 | .jsonld \
270 | .manifest \
271 | .rdf \
272 | .rss \
273 | .topojson \
274 | .vtt \
275 | .webapp \
276 | .webmanifest \
277 | .xloc \
278 | .xml
279 |
280 |
281 |
282 | # ######################################################################
283 | # # REWRITES #
284 | # ######################################################################
285 |
286 | # ----------------------------------------------------------------------
287 | # | Rewrite engine |
288 | # ----------------------------------------------------------------------
289 |
290 | # (1) Turn on the rewrite engine (this is necessary in order for
291 | # the `RewriteRule` directives to work).
292 | #
293 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteEngine
294 | #
295 | # (2) Enable the `FollowSymLinks` option if it isn't already.
296 | #
297 | # https://httpd.apache.org/docs/current/mod/core.html#options
298 | #
299 | # (3) If your web host doesn't allow the `FollowSymlinks` option,
300 | # you need to comment it out or remove it, and then uncomment
301 | # the `Options +SymLinksIfOwnerMatch` line (4), but be aware
302 | # of the performance impact.
303 | #
304 | # https://httpd.apache.org/docs/current/misc/perf-tuning.html#symlinks
305 | #
306 | # (4) Some cloud hosting services will require you set `RewriteBase`.
307 | #
308 | # https://www.rackspace.com/knowledge_center/frequently-asked-question/why-is-modrewrite-not-working-on-my-site
309 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
310 | #
311 | # (5) Depending on how your server is set up, you may also need to
312 | # use the `RewriteOptions` directive to enable some options for
313 | # the rewrite engine.
314 | #
315 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions
316 | #
317 | # (6) Set %{ENV:PROTO} variable, to allow rewrites to redirect with the
318 | # appropriate schema automatically (http or https).
319 |
320 |
321 |
322 | # (1)
323 | RewriteEngine On
324 |
325 | # (2)
326 | Options +FollowSymlinks
327 |
328 | # (3)
329 | # Options +SymLinksIfOwnerMatch
330 |
331 | # (4)
332 | # RewriteBase /
333 |
334 | # (5)
335 | # RewriteOptions
336 |
337 | # (6)
338 | RewriteCond %{HTTPS} =on
339 | RewriteRule ^ - [env=proto:https]
340 | RewriteCond %{HTTPS} !=on
341 | RewriteRule ^ - [env=proto:http]
342 |
343 |
344 |
345 | # ----------------------------------------------------------------------
346 | # | Forcing `https://` |
347 | # ----------------------------------------------------------------------
348 |
349 | # Redirect from the `http://` to the `https://` version of the URL.
350 | # https://wiki.apache.org/httpd/RewriteHTTPToHTTPS
351 |
352 | #
353 | # RewriteEngine On
354 | # RewriteCond %{HTTPS} !=on
355 | # RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
356 | #
357 |
358 | # ----------------------------------------------------------------------
359 | # | Suppressing / Forcing the `www.` at the beginning of URLs |
360 | # ----------------------------------------------------------------------
361 |
362 | # The same content should never be available under two different
363 | # URLs, especially not with and without `www.` at the beginning.
364 | # This can cause SEO problems (duplicate content), and therefore,
365 | # you should choose one of the alternatives and redirect the other
366 | # one.
367 | #
368 | # By default `Option 1` (no `www.`) is activated.
369 | # http://no-www.org/faq.php?q=class_b
370 | #
371 | # If you would prefer to use `Option 2`, just comment out all the
372 | # lines from `Option 1` and uncomment the ones from `Option 2`.
373 | #
374 | # (!) NEVER USE BOTH RULES AT THE SAME TIME!
375 |
376 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
377 |
378 | # Option 1: rewrite www.example.com → example.com
379 |
380 |
381 | RewriteEngine On
382 | RewriteCond %{HTTPS} !=on
383 | RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
384 | RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]
385 |
386 |
387 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
388 |
389 | # Option 2: rewrite example.com → www.example.com
390 | #
391 | # Be aware that the following might not be a good idea if you use "real"
392 | # subdomains for certain parts of your website.
393 |
394 | #
395 | # RewriteEngine On
396 | # RewriteCond %{HTTPS} !=on
397 | # RewriteCond %{HTTP_HOST} !^www\. [NC]
398 | # RewriteCond %{SERVER_ADDR} !=127.0.0.1
399 | # RewriteCond %{SERVER_ADDR} !=::1
400 | # RewriteRule ^ %{ENV:PROTO}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
401 | #
402 |
403 |
404 | # ######################################################################
405 | # # SECURITY #
406 | # ######################################################################
407 |
408 | # ----------------------------------------------------------------------
409 | # | Clickjacking |
410 | # ----------------------------------------------------------------------
411 |
412 | # Protect website against clickjacking.
413 | #
414 | # The example below sends the `X-Frame-Options` response header with
415 | # the value `DENY`, informing browsers not to display the content of
416 | # the web page in any frame.
417 | #
418 | # This might not be the best setting for everyone. You should read
419 | # about the other two possible values the `X-Frame-Options` header
420 | # field can have: `SAMEORIGIN` and `ALLOW-FROM`.
421 | # https://tools.ietf.org/html/rfc7034#section-2.1.
422 | #
423 | # Keep in mind that while you could send the `X-Frame-Options` header
424 | # for all of your website’s pages, this has the potential downside that
425 | # it forbids even non-malicious framing of your content (e.g.: when
426 | # users visit your website using a Google Image Search results page).
427 | #
428 | # Nonetheless, you should ensure that you send the `X-Frame-Options`
429 | # header for all pages that allow a user to make a state changing
430 | # operation (e.g: pages that contain one-click purchase links, checkout
431 | # or bank-transfer confirmation pages, pages that make permanent
432 | # configuration changes, etc.).
433 | #
434 | # Sending the `X-Frame-Options` header can also protect your website
435 | # against more than just clickjacking attacks:
436 | # https://cure53.de/xfo-clickjacking.pdf.
437 | #
438 | # https://tools.ietf.org/html/rfc7034
439 | # http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx
440 | # https://www.owasp.org/index.php/Clickjacking
441 |
442 | #
443 |
444 | # Header set X-Frame-Options "DENY"
445 |
446 | # # `mod_headers` cannot match based on the content-type, however,
447 | # # the `X-Frame-Options` response header should be send only for
448 | # # HTML documents and not for the other resources.
449 |
450 | #
451 | # Header unset X-Frame-Options
452 | #
453 |
454 | #
455 |
456 | # ----------------------------------------------------------------------
457 | # | Content Security Policy (CSP) |
458 | # ----------------------------------------------------------------------
459 |
460 | # Mitigate the risk of cross-site scripting and other content-injection
461 | # attacks.
462 | #
463 | # This can be done by setting a `Content Security Policy` which
464 | # whitelists trusted sources of content for your website.
465 | #
466 | # The example header below allows ONLY scripts that are loaded from
467 | # the current website's origin (no inline scripts, no CDN, etc).
468 | # That almost certainly won't work as-is for your website!
469 | #
470 | # To make things easier, you can use an online CSP header generator
471 | # such as: http://cspisawesome.com/.
472 | #
473 | # http://content-security-policy.com/
474 | # http://www.html5rocks.com/en/tutorials/security/content-security-policy/
475 | # http://www.w3.org/TR/CSP11/).
476 |
477 | #
478 |
479 | # Header set Content-Security-Policy "script-src 'self'; object-src 'self'"
480 |
481 | # # `mod_headers` cannot match based on the content-type, however,
482 | # # the `Content-Security-Policy` response header should be send
483 | # # only for HTML documents and not for the other resources.
484 |
485 | #
486 | # Header unset Content-Security-Policy
487 | #
488 |
489 | #
490 |
491 | # ----------------------------------------------------------------------
492 | # | File access |
493 | # ----------------------------------------------------------------------
494 |
495 | # Block access to directories without a default document.
496 | #
497 | # You should leave the following uncommented, as you shouldn't allow
498 | # anyone to surf through every directory on your server (which may
499 | # includes rather private places such as the CMS's directories).
500 |
501 |
502 | Options -Indexes
503 |
504 |
505 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
506 |
507 | # Block access to all hidden files and directories with the exception of
508 | # the visible content from within the `/.well-known/` hidden directory.
509 | #
510 | # These types of files usually contain user preferences or the preserved
511 | # state of an utility, and can include rather private places like, for
512 | # example, the `.git` or `.svn` directories.
513 | #
514 | # The `/.well-known/` directory represents the standard (RFC 5785) path
515 | # prefix for "well-known locations" (e.g.: `/.well-known/manifest.json`,
516 | # `/.well-known/keybase.txt`), and therefore, access to its visible
517 | # content should not be blocked.
518 | #
519 | # https://www.mnot.net/blog/2010/04/07/well-known
520 | # https://tools.ietf.org/html/rfc5785
521 |
522 |
523 | RewriteEngine On
524 | RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC]
525 | RewriteCond %{SCRIPT_FILENAME} -d [OR]
526 | RewriteCond %{SCRIPT_FILENAME} -f
527 | RewriteRule "(^|/)\." - [F]
528 |
529 |
530 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
531 |
532 | # Block access to files that can expose sensitive information.
533 | #
534 | # By default, block access to backup and source files that may be
535 | # left by some text editors and can pose a security risk when anyone
536 | # has access to them.
537 | #
538 | # http://feross.org/cmsploit/
539 | #
540 | # (!) Update the `` regular expression from below to
541 | # include any files that might end up on your production server and
542 | # can expose sensitive information about your website. These files may
543 | # include: configuration files, files that contain metadata about the
544 | # project (e.g.: project dependencies), build scripts, etc..
545 |
546 |
547 |
548 | # Apache < 2.3
549 |
550 | Order allow,deny
551 | Deny from all
552 | Satisfy All
553 |
554 |
555 | # Apache ≥ 2.3
556 |
557 | Require all denied
558 |
559 |
560 |
561 |
562 | # ----------------------------------------------------------------------
563 | # | HTTP Strict Transport Security (HSTS) |
564 | # ----------------------------------------------------------------------
565 |
566 | # Force client-side SSL redirection.
567 | #
568 | # If a user types `example.com` in their browser, even if the server
569 | # redirects them to the secure version of the website, that still leaves
570 | # a window of opportunity (the initial HTTP connection) for an attacker
571 | # to downgrade or redirect the request.
572 | #
573 | # The following header ensures that browser will ONLY connect to your
574 | # server via HTTPS, regardless of what the users type in the browser's
575 | # address bar.
576 | #
577 | # (!) Remove the `includeSubDomains` optional directive if the website's
578 | # subdomains are not using HTTPS.
579 | #
580 | # http://www.html5rocks.com/en/tutorials/security/transport-layer-security/
581 | # https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14#section-6.1
582 | # http://blogs.msdn.com/b/ieinternals/archive/2014/08/18/hsts-strict-transport-security-attacks-mitigations-deployment-https.aspx
583 |
584 | #
585 | # Header always set Strict-Transport-Security "max-age=16070400; includeSubDomains"
586 | #
587 |
588 | # ----------------------------------------------------------------------
589 | # | Reducing MIME type security risks |
590 | # ----------------------------------------------------------------------
591 |
592 | # Prevent some browsers from MIME-sniffing the response.
593 | #
594 | # This reduces exposure to drive-by download attacks and cross-origin
595 | # data leaks, and should be left uncommented, especially if the server
596 | # is serving user-uploaded content or content that could potentially be
597 | # treated as executable by the browser.
598 | #
599 | # http://www.slideshare.net/hasegawayosuke/owasp-hasegawa
600 | # http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx
601 | # https://msdn.microsoft.com/en-us/library/ie/gg622941.aspx
602 | # https://mimesniff.spec.whatwg.org/
603 |
604 |
605 | Header set X-Content-Type-Options "nosniff"
606 |
607 |
608 | # ----------------------------------------------------------------------
609 | # | Reflected Cross-Site Scripting (XSS) attacks |
610 | # ----------------------------------------------------------------------
611 |
612 | # (1) Try to re-enable the cross-site scripting (XSS) filter built
613 | # into most web browsers.
614 | #
615 | # The filter is usually enabled by default, but in some cases it
616 | # may be disabled by the user. However, in Internet Explorer for
617 | # example, it can be re-enabled just by sending the
618 | # `X-XSS-Protection` header with the value of `1`.
619 | #
620 | # (2) Prevent web browsers from rendering the web page if a potential
621 | # reflected (a.k.a non-persistent) XSS attack is detected by the
622 | # filter.
623 | #
624 | # By default, if the filter is enabled and browsers detect a
625 | # reflected XSS attack, they will attempt to block the attack
626 | # by making the smallest possible modifications to the returned
627 | # web page.
628 | #
629 | # Unfortunately, in some browsers (e.g.: Internet Explorer),
630 | # this default behavior may allow the XSS filter to be exploited,
631 | # thereby, it's better to inform browsers to prevent the rendering
632 | # of the page altogether, instead of attempting to modify it.
633 | #
634 | # https://hackademix.net/2009/11/21/ies-xss-filter-creates-xss-vulnerabilities
635 | #
636 | # (!) Do not rely on the XSS filter to prevent XSS attacks! Ensure that
637 | # you are taking all possible measures to prevent XSS attacks, the
638 | # most obvious being: validating and sanitizing your website's inputs.
639 | #
640 | # http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-iv-the-xss-filter.aspx
641 | # http://blogs.msdn.com/b/ieinternals/archive/2011/01/31/controlling-the-internet-explorer-xss-filter-with-the-x-xss-protection-http-header.aspx
642 | # https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29
643 |
644 | #
645 |
646 | # # (1) (2)
647 | # Header set X-XSS-Protection "1; mode=block"
648 |
649 | # # `mod_headers` cannot match based on the content-type, however,
650 | # # the `X-XSS-Protection` response header should be send only for
651 | # # HTML documents and not for the other resources.
652 |
653 | #
654 | # Header unset X-XSS-Protection
655 | #
656 |
657 | #
658 |
659 | # ----------------------------------------------------------------------
660 | # | Server-side technology information |
661 | # ----------------------------------------------------------------------
662 |
663 | # Remove the `X-Powered-By` response header that:
664 | #
665 | # * is set by some frameworks and server-side languages
666 | # (e.g.: ASP.NET, PHP), and its value contains information
667 | # about them (e.g.: their name, version number)
668 | #
669 | # * doesn't provide any value as far as users are concern,
670 | # and in some cases, the information provided by it can
671 | # be used by attackers
672 | #
673 | # (!) If you can, you should disable the `X-Powered-By` header from the
674 | # language / framework level (e.g.: for PHP, you can do that by setting
675 | # `expose_php = off` in `php.ini`)
676 | #
677 | # https://php.net/manual/en/ini.core.php#ini.expose-php
678 |
679 |
680 | Header unset X-Powered-By
681 |
682 |
683 | # ----------------------------------------------------------------------
684 | # | Server software information |
685 | # ----------------------------------------------------------------------
686 |
687 | # Prevent Apache from adding a trailing footer line containing
688 | # information about the server to the server-generated documents
689 | # (e.g.: error messages, directory listings, etc.)
690 | #
691 | # https://httpd.apache.org/docs/current/mod/core.html#serversignature
692 |
693 | ServerSignature Off
694 |
695 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
696 |
697 | # Prevent Apache from sending in the `Server` response header its
698 | # exact version number, the description of the generic OS-type or
699 | # information about its compiled-in modules.
700 | #
701 | # (!) The `ServerTokens` directive will only work in the main server
702 | # configuration file, so don't try to enable it in the `.htaccess` file!
703 | #
704 | # https://httpd.apache.org/docs/current/mod/core.html#servertokens
705 |
706 | #ServerTokens Prod
707 |
708 |
709 | # ######################################################################
710 | # # WEB PERFORMANCE #
711 | # ######################################################################
712 |
713 | # ----------------------------------------------------------------------
714 | # | Compression |
715 | # ----------------------------------------------------------------------
716 |
717 |
718 |
719 | # Force compression for mangled `Accept-Encoding` request headers
720 | # https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html
721 |
722 |
723 |
724 | SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
725 | RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
726 |
727 |
728 |
729 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
730 |
731 | # Compress all output labeled with one of the following media types.
732 | #
733 | # (!) For Apache versions below version 2.3.7 you don't need to
734 | # enable `mod_filter` and can remove the ``
735 | # and `` lines as `AddOutputFilterByType` is still in
736 | # the core directives.
737 | #
738 | # https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype
739 |
740 |
741 | AddOutputFilterByType DEFLATE "application/atom+xml" \
742 | "application/javascript" \
743 | "application/json" \
744 | "application/ld+json" \
745 | "application/manifest+json" \
746 | "application/rdf+xml" \
747 | "application/rss+xml" \
748 | "application/schema+json" \
749 | "application/vnd.geo+json" \
750 | "application/vnd.ms-fontobject" \
751 | "application/x-font-ttf" \
752 | "application/x-javascript" \
753 | "application/x-web-app-manifest+json" \
754 | "application/xhtml+xml" \
755 | "application/xml" \
756 | "font/eot" \
757 | "font/opentype" \
758 | "image/bmp" \
759 | "image/svg+xml" \
760 | "image/vnd.microsoft.icon" \
761 | "image/x-icon" \
762 | "text/cache-manifest" \
763 | "text/css" \
764 | "text/html" \
765 | "text/javascript" \
766 | "text/plain" \
767 | "text/vcard" \
768 | "text/vnd.rim.location.xloc" \
769 | "text/vtt" \
770 | "text/x-component" \
771 | "text/x-cross-domain-policy" \
772 | "text/xml"
773 |
774 |
775 |
776 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
777 |
778 | # Map the following filename extensions to the specified
779 | # encoding type in order to make Apache serve the file types
780 | # with the appropriate `Content-Encoding` response header
781 | # (do note that this will NOT make Apache compress them!).
782 | #
783 | # If these files types would be served without an appropriate
784 | # `Content-Enable` response header, client applications (e.g.:
785 | # browsers) wouldn't know that they first need to uncompress
786 | # the response, and thus, wouldn't be able to understand the
787 | # content.
788 | #
789 | # https://httpd.apache.org/docs/current/mod/mod_mime.html#addencoding
790 |
791 |
792 | AddEncoding gzip svgz
793 |
794 |
795 |
796 |
797 | # ----------------------------------------------------------------------
798 | # | Content transformation |
799 | # ----------------------------------------------------------------------
800 |
801 | # Prevent intermediate caches or proxies (e.g.: such as the ones
802 | # used by mobile network providers) from modifying the website's
803 | # content.
804 | #
805 | # https://tools.ietf.org/html/rfc2616#section-14.9.5
806 | #
807 | # (!) If you are using `mod_pagespeed`, please note that setting
808 | # the `Cache-Control: no-transform` response header will prevent
809 | # `PageSpeed` from rewriting `HTML` files, and, if the
810 | # `ModPagespeedDisableRewriteOnNoTransform` directive isn't set
811 | # to `off`, also from rewriting other resources.
812 | #
813 | # https://developers.google.com/speed/pagespeed/module/configuration#notransform
814 |
815 | #
816 | # Header merge Cache-Control "no-transform"
817 | #
818 |
819 | # ----------------------------------------------------------------------
820 | # | ETags |
821 | # ----------------------------------------------------------------------
822 |
823 | # Remove `ETags` as resources are sent with far-future expires headers.
824 | #
825 | # https://developer.yahoo.com/performance/rules.html#etags
826 | # https://tools.ietf.org/html/rfc7232#section-2.3
827 |
828 | # `FileETag None` doesn't work in all cases.
829 |
830 | Header unset ETag
831 |
832 |
833 | FileETag None
834 |
835 | # ----------------------------------------------------------------------
836 | # | Expires headers |
837 | # ----------------------------------------------------------------------
838 |
839 | # Serve resources with far-future expires headers.
840 | #
841 | # (!) If you don't control versioning with filename-based
842 | # cache busting, you should consider lowering the cache times
843 | # to something like one week.
844 | #
845 | # https://httpd.apache.org/docs/current/mod/mod_expires.html
846 |
847 |
848 |
849 | ExpiresActive on
850 | ExpiresDefault "access plus 1 month"
851 |
852 | # CSS
853 |
854 | ExpiresByType text/css "access plus 1 year"
855 |
856 |
857 | # Data interchange
858 |
859 | ExpiresByType application/atom+xml "access plus 1 hour"
860 | ExpiresByType application/rdf+xml "access plus 1 hour"
861 | ExpiresByType application/rss+xml "access plus 1 hour"
862 |
863 | ExpiresByType application/json "access plus 0 seconds"
864 | ExpiresByType application/ld+json "access plus 0 seconds"
865 | ExpiresByType application/schema+json "access plus 0 seconds"
866 | ExpiresByType application/vnd.geo+json "access plus 0 seconds"
867 | ExpiresByType application/xml "access plus 0 seconds"
868 | ExpiresByType text/xml "access plus 0 seconds"
869 |
870 |
871 | # Favicon (cannot be renamed!) and cursor images
872 |
873 | ExpiresByType image/vnd.microsoft.icon "access plus 1 week"
874 | ExpiresByType image/x-icon "access plus 1 week"
875 |
876 | # HTML
877 |
878 | ExpiresByType text/html "access plus 0 seconds"
879 |
880 |
881 | # JavaScript
882 |
883 | ExpiresByType application/javascript "access plus 1 year"
884 | ExpiresByType application/x-javascript "access plus 1 year"
885 | ExpiresByType text/javascript "access plus 1 year"
886 |
887 |
888 | # Manifest files
889 |
890 | ExpiresByType application/manifest+json "access plus 1 week"
891 | ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
892 | ExpiresByType text/cache-manifest "access plus 0 seconds"
893 |
894 |
895 | # Media files
896 |
897 | ExpiresByType audio/ogg "access plus 1 month"
898 | ExpiresByType image/bmp "access plus 1 month"
899 | ExpiresByType image/gif "access plus 1 month"
900 | ExpiresByType image/jpeg "access plus 1 month"
901 | ExpiresByType image/png "access plus 1 month"
902 | ExpiresByType image/svg+xml "access plus 1 month"
903 | ExpiresByType image/webp "access plus 1 month"
904 | ExpiresByType video/mp4 "access plus 1 month"
905 | ExpiresByType video/ogg "access plus 1 month"
906 | ExpiresByType video/webm "access plus 1 month"
907 |
908 |
909 | # Web fonts
910 |
911 | # Embedded OpenType (EOT)
912 | ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
913 | ExpiresByType font/eot "access plus 1 month"
914 |
915 | # OpenType
916 | ExpiresByType font/opentype "access plus 1 month"
917 |
918 | # TrueType
919 | ExpiresByType application/x-font-ttf "access plus 1 month"
920 |
921 | # Web Open Font Format (WOFF) 1.0
922 | ExpiresByType application/font-woff "access plus 1 month"
923 | ExpiresByType application/x-font-woff "access plus 1 month"
924 | ExpiresByType font/woff "access plus 1 month"
925 |
926 | # Web Open Font Format (WOFF) 2.0
927 | ExpiresByType application/font-woff2 "access plus 1 month"
928 |
929 |
930 | # Other
931 |
932 | ExpiresByType text/x-cross-domain-policy "access plus 1 week"
933 |
934 |
935 |
936 | # ----------------------------------------------------------------------
937 | # | File concatenation |
938 | # ----------------------------------------------------------------------
939 |
940 | # Allow concatenation from within specific files.
941 | #
942 | # e.g.:
943 | #
944 | # If you have the following lines in a file called, for
945 | # example, `main.combined.js`:
946 | #
947 | #
948 | #
949 | #
950 | # Apache will replace those lines with the content of the
951 | # specified files.
952 |
953 | #
954 | #
955 | # Options +Includes
956 | # AddOutputFilterByType INCLUDES application/javascript \
957 | # application/x-javascript \
958 | # text/javascript
959 | # SetOutputFilter INCLUDES
960 | #
961 | #
962 | # Options +Includes
963 | # AddOutputFilterByType INCLUDES text/css
964 | # SetOutputFilter INCLUDES
965 | #
966 | #
967 |
968 | # ----------------------------------------------------------------------
969 | # | Filename-based cache busting |
970 | # ----------------------------------------------------------------------
971 |
972 | # If you're not using a build process to manage your filename version
973 | # revving, you might want to consider enabling the following directives
974 | # to route all requests such as `/style.12345.css` to `/style.css`.
975 | #
976 | # To understand why this is important and even a better solution than
977 | # using something like `*.css?v231`, please see:
978 | # http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/
979 |
980 | #
981 | # RewriteEngine On
982 | # RewriteCond %{REQUEST_FILENAME} !-f
983 | # RewriteRule ^(.+)\.(\d+)\.(bmp|css|cur|gif|ico|jpe?g|js|png|svgz?|webp|webmanifest)$ $1.$3 [L]
984 | #
985 |
--------------------------------------------------------------------------------