8bf first comm 2 vuotta sitten css-sel3.js 77628cf8bf first comm 2 vuotta sitten css-selection.js 77628cf8bf first comm 2 vuotta sitten css-shapes.js 77628cf8bf first comm 2 vuotta sitten css-snappoints.js 77628cf8bf first comm 2 vuotta sitten css-sticky.js 77628cf8bf first comm 2 vuotta sitten css-subgrid.js 77628cf8bf first comm 2 vuotta sitten css-supports-api.js 77628cf8bf first comm 2 vuotta sitten css-table.js 77628cf8bf first comm 2 vuotta sitten css-text-align-last.js 77628cf8bf first comm 2 vuotta sitten css-text-box-trim.js 77628cf8bf first comm 2 vuotta sitten css-text-indent.js 77628cf8bf first comm 2 vuotta sitten css-text-justify.js 77628cf8bf first comm 2 vuotta sitten css-text-orientation.js 77628cf8bf first comm 2 vuotta sitten css-text-spacing.js 77628cf8bf first comm 2 vuotta sitten css-textshadow.js 77628cf8bf first comm 2 vuotta sitten css-touch-action.js 77628cf8bf first comm 2 vuotta sitten css-transitions.js 77628cf8bf first comm 2 vuotta sitten css-unicode-bidi.js 77628cf8bf first comm 2 vuotta sitten css-unset-value.js 77628cf8bf first comm 2 vuotta sitten css-variables.js 77628cf8bf first comm 2 vuotta sitten css-when-else.js 77628cf8bf first comm 2 vuotta sitten css-widows-orphans.js 77628cf8bf first comm 2 vuotta sitten css-width-stretch.js 77628cf8bf first comm 2 vuotta sitten css-writing-mode.js 77628cf8bf first comm 2 vuotta sitten css-zoom.js 77628cf8bf first comm 2 vuotta sitten css3-attr.js 77628cf8bf first comm 2 vuotta sitten css3-boxsizing.js 77628cf8bf first comm 2 vuotta sitten css3-colors.js 77628cf8bf first comm 2 vuotta sitten css3-cursors-grab.js 77628cf8bf first comm 2 vuotta sitten css3-cursors-newer.js 77628cf8bf first comm 2 vuotta sitten css3-cursors.js 77628cf8bf first comm 2 vuotta sitten css3-tabsize.js 77628cf8bf first comm 2 vuotta sitten currentcolor.js 77628cf8bf first comm 2 vuotta sitten custom-elements.js 77628cf8bf first comm 2 vuotta sitten custom-elementsv1.js 77628cf8bf first comm 2 vuotta sitten customevent.js 77628cf8bf first comm 2 vuotta sitten datalist.js 77628cf8bf first comm 2 vuotta sitten dataset.js 77628cf8bf first comm 2 vuotta sitten datauri.js 77628cf8bf first comm 2 vuotta sitten date-tolocaledatestring.js 77628cf8bf first comm 2 vuotta sitten declarative-shadow-dom.js 77628cf8bf first comm 2 vuotta sitten decorators.js 77628cf8bf first comm 2 vuotta sitten details.js 77628cf8bf first comm 2 vuotta sitten deviceorientation.js 77628cf8bf first comm 2 vuotta sitten devicepixelratio.js 77628cf8bf first comm 2 vuotta sitten dialog.js 77628cf8bf first comm 2 vuotta sitten dispatchevent.js 77628cf8bf first comm 2 vuotta sitten dnssec.js 77628cf8bf first comm 2 vuotta sitten do-not-track.js 77628cf8bf first comm 2 vuotta sitten document-currentscript.js 77628cf8bf first comm 2 vuotta sitten document-evaluate-xpath.js 77628cf8bf first comm 2 vuotta sitten document-execcommand.js 77628cf8bf first comm 2 vuotta sitten document-policy.js 77628cf8bf first comm 2 vuotta sitten document-scrollingelement.js 77628cf8bf first comm 2 vuotta sitten documenthead.js 77628cf8bf first comm 2 vuotta sitten dom-manip-convenience.js 77628cf8bf first comm 2 vuotta sitten dom-range.js 77628cf8bf first comm 2 vuotta sitten domcontentloaded.js 77628cf8bf first comm 2 vuotta sitten dommatrix.js 77628cf8bf first comm 2 vuotta sitten download.js 77628cf8bf first comm 2 vuotta sitten dragndrop.js 77628cf8bf first comm 2 vuotta sitten element-closest.js 77628cf8bf first comm 2 vuotta sitten element-from-point.js 77628cf8bf first comm 2 vuotta sitten element-scroll-methods.js 77628cf8bf first comm 2 vuotta sitten eme.js 77628cf8bf first comm 2 vuotta sitten eot.js 77628cf8bf first comm 2 vuotta sitten es5.js 77628cf8bf first comm 2 vuotta sitten es6-class.js 77628cf8bf first comm 2 vuotta sitten es6-generators.js 77628cf8bf first comm 2 vuotta sitten es6-module-dynamic-import.js 77628cf8bf first comm 2 vuotta sitten es6-module.js 77628cf8bf first comm 2 vuotta sitten es6-number.js 77628cf8bf first comm 2 vuotta sitten es6-string-includes.js 77628cf8bf first comm 2 vuotta sitten es6.js 77628cf8bf first comm 2 vuotta sitten eventsource.js 77628cf8bf first comm 2 vuotta sitten extended-system-fonts.js 77628cf8bf first comm 2 vuotta sitten feature-policy.js 77628cf8bf first comm 2 vuotta sitten fetch.js 77628cf8bf first comm 2 vuotta sitten fieldset-disabled.js 77628cf8bf first comm 2 vuotta sitten fileapi.js 77628cf8bf first comm 2 vuotta sitten filereader.js 77628cf8bf first comm 2 vuotta sitten filereadersync.js 77628cf8bf first comm 2 vuotta sitten filesystem.js 77628cf8bf first comm 2 vuotta sitten flac.js 77628cf8bf first comm 2 vuotta sitten flexbox-gap.js 77628cf8bf first comm 2 vuotta sitten flexbox.js 77628cf8bf first comm 2 vuotta sitten flow-root.js 77628cf8bf first comm 2 vuotta sitten focusin-focusout-events.js 77628cf8bf first comm 2 vuotta sitten font-family-system-ui.js 77628cf8bf first comm 2 vuotta sitten font-feature.js 77628cf8bf first comm 2 vuotta sitten font-kerning.js 77628cf8bf first comm 2 vuotta sitten font-loading.js 77628cf8bf first comm 2 vuotta sitten font-size-adjust.js 77628cf8bf first comm 2 vuotta sitten font-smooth.js 77628cf8bf first comm 2 vuotta sitten font-unicode-range.js 77628cf8bf first comm 2 vuotta sitten font-variant-alternates.js 77628cf8bf first comm 2 vuotta sitten font-variant-numeric.js 77628cf8bf first comm 2 vuotta sitten fontface.js 77628cf8bf first comm 2 vuotta sitten form-attribute.js 77628cf8bf first comm 2 vuotta sitten form-submit-attributes.js 77628cf8bf first comm 2 vuotta sitten form-validation.js 77628cf8bf first comm 2 vuotta sitten forms.js 77628cf8bf first comm 2 vuotta sitten fullscreen.js 77628cf8bf first comm 2 vuotta sitten gamepad.js 77628cf8bf first comm 2 vuotta sitten geolocation.js 77628cf8bf first comm 2 vuotta sitten getboundingclientrect.js 77628cf8bf first comm 2 vuotta sitten getcomputedstyle.js 77628cf8bf first comm 2 vuotta sitten getelementsbyclassname.js 77628cf8bf first comm 2 vuotta sitten getrandomvalues.js 77628cf8bf first comm 2 vuotta sitten gyroscope.js 77628cf8bf first comm 2 vuotta sitten hardwareconcurrency.js 77628cf8bf first comm 2 vuotta sitten hashchange.js 77628cf8bf first comm 2 vuotta sitten heif.js 77628cf8bf first comm 2 vuotta sitten hevc.js 77628cf8bf first comm 2 vuotta sitten hidden.js 77628cf8bf first comm 2 vuotta sitten high-resolution-time.js 77628cf8bf first comm 2 vuotta sitten history.js 77628cf8bf first comm 2 vuotta sitten html-media-capture.js 77628cf8bf first comm 2 vuotta sitten html5semantic.js 77628cf8bf first comm 2 vuotta sitten http-live-streaming.js 77628cf8bf first comm 2 vuotta sitten http2.js 77628cf8bf first comm 2 vuotta sitten http3.js 77628cf8bf first comm 2 vuotta sitten iframe-sandbox.js 77628cf8bf first comm 2 vuotta sitten iframe-seamless.js 77628cf8bf first comm 2 vuotta sitten iframe-srcdoc.js 77628cf8bf first comm 2 vuotta sitten imagecapture.js 77628cf8bf first comm 2 vuotta sitten ime.js 77628cf8bf first comm 2 vuotta sitten img-naturalwidth-naturalheight.js 77628cf8bf first comm 2 vuotta sitten import-maps.js 77628cf8bf first comm 2 vuotta sitten imports.js 77628cf8bf first comm 2 vuotta sitten indeterminate-checkbox.js 77628cf8bf first comm 2 vuotta sitten indexeddb.js 77628cf8bf first comm 2 vuotta sitten indexeddb2.js 77628cf8bf first comm 2 vuotta sitten inline-block.js 77628cf8bf first comm 2 vuotta sitten innertext.js 77628cf8bf first comm 2 vuotta sitten input-autocomplete-onoff.js 77628cf8bf first comm 2 vuotta sitten input-color.js 77628cf8bf first comm 2 vuotta sitten input-datetime.js 77628cf8bf first comm 2 vuotta sitten input-email-tel-url.js 77628cf8bf first comm 2 vuotta sitten input-event.js 77628cf8bf first comm 2 vuotta sitten input-file-accept.js 77628cf8bf first comm 2 vuotta sitten input-file-directory.js 77628cf8bf first comm 2 vuotta sitten input-file-multiple.js 77628cf8bf first comm 2 vuotta sitten input-inputmode.js 77628cf8bf first comm 2 vuotta sitten input-minlength.js 77628cf8bf first comm 2 vuotta sitten input-number.js 77628cf8bf first comm 2 vuotta sitten input-pattern.js 77628cf8bf first comm 2 vuotta sitten input-placeholder.js 77628cf8bf first comm 2 vuotta sitten input-range.js 77628cf8bf first comm 2 vuotta sitten input-search.js 77628cf8bf first comm 2 vuotta sitten input-selection.js 77628cf8bf first comm 2 vuotta sitten insert-adjacent.js 77628cf8bf first comm 2 vuotta sitten insertadjacenthtml.js 77628cf8bf first comm 2 vuotta sitten internationalization.js 77628cf8bf first comm 2 vuotta sitten intersectionobserver-v2.js 77628cf8bf first comm 2 vuotta sitten intersectionobserver.js 77628cf8bf first comm 2 vuotta sitten intl-pluralrules.js 77628cf8bf first comm 2 vuotta sitten intrinsic-width.js 77628cf8bf first comm 2 vuotta sitten jpeg2000.js 77628cf8bf first comm 2 vuotta sitten jpegxl.js 77628cf8bf first comm 2 vuotta sitten jpegxr.js 77628cf8bf first comm 2 vuotta sitten js-regexp-lookbehind.js 77628cf8bf first comm 2 vuotta sitten json.js 77628cf8bf first comm 2 vuotta sitten justify-content-space-evenly.js 77628cf8bf first comm 2 vuotta sitten kerning-pairs-ligatures.js 77628cf8bf first comm 2 vuotta sitten keyboardevent-charcode.js 77628cf8bf first comm 2 vuotta sitten keyboardevent-code.js 77628cf8bf first comm 2 vuotta sitten keyboardevent-getmodifierstate.js 77628cf8bf first comm 2 vuotta sitten keyboardevent-key.js 77628cf8bf first comm 2 vuotta sitten keyboardevent-location.js 77628cf8bf first comm 2 vuotta sitten keyboardevent-which.js 77628cf8bf first comm 2 vuotta sitten lazyload.js 77628cf8bf first comm 2 vuotta sitten let.js 77628cf8bf first comm 2 vuotta sitten link-icon-png.js 77628cf8bf first comm 2 vuotta sitten link-icon-svg.js 77628cf8bf first comm 2 vuotta sitten link-rel-dns-prefetch.js 77628cf8bf first comm 2 vuotta sitten link-rel-modulepreload.js 77628cf8bf first comm 2 vuotta sitten link-rel-preconnect.js 77628cf8bf first comm 2 vuotta sitten link-rel-prefetch.js 77628cf8bf first comm 2 vuotta sitten link-rel-preload.js 77628cf8bf first comm 2 vuotta sitten link-rel-prerender.js 77628cf8bf first comm 2 vuotta sitten loading-lazy-attr.js 77628cf8bf first comm 2 vuotta sitten localecompare.js 77628cf8bf first comm 2 vuotta sitten magnetometer.js 77628cf8bf first comm 2 vuotta sitten matchesselector.js 77628cf8bf first comm 2 vuotta sitten matchmedia.js 77628cf8bf first comm 2 vuotta sitten mathml.js 77628cf8bf first comm 2 vuotta sitten maxlength.js 77628cf8bf first comm 2 vuotta sitten mdn-css-unicode-bidi-isolate-override.js 77628cf8bf first comm 2 vuotta sitten mdn-css-unicode-bidi-isolate.js 77628cf8bf first comm 2 vuotta sitten mdn-css-unicode-bidi-plaintext.js 77628cf8bf first comm 2 vuotta sitten mdn-text-decoration-color.js 77628cf8bf first comm 2 vuotta sitten mdn-text-decoration-line.js 77628cf8bf first comm 2 vuotta sitten mdn-text-decoration-shorthand.js 77628cf8bf first comm 2 vuotta sitten mdn-text-decoration-style.js 77628cf8bf first comm 2 vuotta sitten media-fragments.js 77628cf8bf first comm 2 vuotta sitten mediacapture-fromelement.js 77628cf8bf first comm 2 vuotta sitten mediarecorder.js 77628cf8bf first comm 2 vuotta sitten mediasource.js 77628cf8bf first comm 2 vuotta sitten menu.js 77628cf8bf first comm 2 vuotta sitten meta-theme-color.js 77628cf8bf first comm 2 vuotta sitten meter.js 77628cf8bf first comm 2 vuotta sitten midi.js 77628cf8bf first comm 2 vuotta sitten minmaxwh.js 77628cf8bf first comm 2 vuotta sitten mp3.js 77628cf8bf first comm 2 vuotta sitten mpeg-dash.js 77628cf8bf first comm 2 vuotta sitten mpeg4.js 77628cf8bf first comm 2 vuotta sitten multibackgrounds.js 77628cf8bf first comm 2 vuotta sitten multicolumn.js 77628cf8bf first comm 2 vuotta sitten mutation-events.js 77628cf8bf first comm 2 vuotta sitten mutationobserver.js 77628cf8bf first comm 2 vuotta sitten namevalue-storage.js 77628cf8bf first comm 2 vuotta sitten native-filesystem-api.js 77628cf8bf first comm 2 vuotta sitten nav-timing.js 77628cf8bf first comm 2 vuotta sitten netinfo.js 77628cf8bf first comm 2 vuotta sitten notifications.js 77628cf8bf first comm 2 vuotta sitten object-entries.js 77628cf8bf first comm 2 vuotta sitten object-fit.js 77628cf8bf first comm 2 vuotta sitten object-observe.js 77628cf8bf first comm 2 vuotta sitten object-values.js 77628cf8bf first comm 2 vuotta sitten objectrtc.js 77628cf8bf first comm 2 vuotta sitten offline-apps.js 77628cf8bf first comm 2 vuotta sitten offscreencanvas.js 77628cf8bf first comm 2 vuotta sitten ogg-vorbis.js 77628cf8bf first comm 2 vuotta sitten ogv.js 77628cf8bf first comm 2 vuotta sitten ol-reversed.js 77628cf8bf first comm 2 vuotta sitten once-event-listener.js 77628cf8bf first comm 2 vuotta sitten online-status.js 77628cf8bf first comm 2 vuotta sitten opus.js 77628cf8bf first comm 2 vuotta sitten orientation-sensor.js 77628cf8bf first comm 2 vuotta sitten outline.js 77628cf8bf first comm 2 vuotta sitten pad-start-end.js 77628cf8bf first comm 2 vuotta sitten page-transition-events.js 77628cf8bf first comm 2 vuotta sitten pagevisibility.js 77628cf8bf first comm 2 vuotta sitten passive-event-listener.js 77628cf8bf first comm 2 vuotta sitten passwordrules.js 77628cf8bf first comm 2 vuotta sitten path2d.js 77628cf8bf first comm 2 vuotta sitten payment-request.js 77628cf8bf first comm 2 vuotta sitten pdf-viewer.js 77628cf8bf first comm 2 vuotta sitten permissions-api.js 77628cf8bf first comm 2 vuotta sitten permissions-policy.js 77628cf8bf first comm 2 vuotta sitten picture-in-picture.js 77628cf8bf first comm 2 vuotta sitten picture.js 77628cf8bf first comm 2 vuotta sitten ping.js 77628cf8bf first comm 2 vuotta sitten png-alpha.js 77628cf8bf first comm 2 vuotta sitten pointer-events.js 77628cf8bf first comm 2 vuotta sitten pointer.js 77628cf8bf first comm 2 vuotta sitten pointerlock.js 77628cf8bf first comm 2 vuotta sitten portals.js 77628cf8bf first comm 2 vuotta sitten prefers-color-scheme.js 77628cf8bf first comm 2 vuotta sitten prefers-reduced-motion.js 77628cf8bf first comm 2 vuotta sitten progress.js 77628cf8bf first comm 2 vuotta sitten promise-finally.js 77628cf8bf first comm 2 vuotta sitten promises.js 77628cf8bf first comm 2 vuotta sitten proximity.js 77628cf8bf first comm 2 vuotta sitten proxy.js 77628cf8bf first comm 2 vuotta sitten publickeypinning.js 77628cf8bf first comm 2 vuotta sitten push-api.js 77628cf8bf first comm 2 vuotta sitten queryselector.js 77628cf8bf first comm 2 vuotta sitten readonly-attr.js 77628cf8bf first comm 2 vuotta sitten referrer-policy.js 77628cf8bf first comm 2 vuotta sitten registerprotocolhandler.js 77628cf8bf first comm 2 vuotta sitten rel-noopener.js 77628cf8bf first comm 2 vuotta sitten rel-noreferrer.js 77628cf8bf first comm 2 vuotta sitten rellist.js 77628cf8bf first comm 2 vuotta sitten rem.js 77628cf8bf first comm 2 vuotta sitten requestanimationframe.js 77628cf8bf first comm 2 vuotta sitten requestidlecallback.js 77628cf8bf first comm 2 vuotta sitten resizeobserver.js 77628cf8bf first comm 2 vuotta sitten resource-timing.js 77628cf8bf first comm 2 vuotta sitten rest-parameters.js 77628cf8bf first comm 2 vuotta sitten rtcpeerconnection.js 77628cf8bf first comm 2 vuotta sitten ruby.js 77628cf8bf first comm 2 vuotta sitten run-in.js 77628cf8bf first comm 2 vuotta sitten same-site-cookie-attribute.js 77628cf8bf first comm 2 vuotta sitten screen-orientation.js 77628cf8bf first comm 2 vuotta sitten script-async.js 77628cf8bf first comm 2 vuotta sitten script-defer.js 77628cf8bf first comm 2 vuotta sitten scrollintoview.js 77628cf8bf first comm 2 vuotta sitten scrollintoviewifneeded.js 77628cf8bf first comm 2 vuotta sitten sdch.js 77628cf8bf first comm 2 vuotta sitten selection-api.js 77628cf8bf first comm 2 vuotta sitten server-timing.js 77628cf8bf first comm 2 vuotta sitten serviceworkers.js 77628cf8bf first comm 2 vuotta sitten setimmediate.js 77628cf8bf first comm 2 vuotta sitten shadowdom.js 77628cf8bf first comm 2 vuotta sitten shadowdomv1.js 77628cf8bf first comm 2 vuotta sitten sharedarraybuffer.js 77628cf8bf first comm 2 vuotta sitten sharedworkers.js 77628cf8bf first comm 2 vuotta sitten sni.js 77628cf8bf first comm 2 vuotta sitten spdy.js 77628cf8bf first comm 2 vuotta sitten speech-recognition.js 77628cf8bf first comm 2 vuotta sitten speech-synthesis.js 77628cf8bf first comm 2 vuotta sitten spellcheck-attribute.js 77628cf8bf first comm 2 vuotta sitten sql-storage.js 77628cf8bf first comm 2 vuotta sitten srcset.js 77628cf8bf first comm 2 vuotta sitten stream.js 77628cf8bf first comm 2 vuotta sitten streams.js 77628cf8bf first comm 2 vuotta sitten stricttransportsecurity.js 77628cf8bf first comm 2 vuotta sitten style-scoped.js 77628cf8bf first comm 2 vuotta sitten subresource-bundling.js 77628cf8bf first comm 2 vuotta sitten subresource-integrity.js 77628cf8bf first comm 2 vuotta sitten svg-css.js 77628cf8bf first comm 2 vuotta sitten svg-filters.js 77628cf8bf first comm 2 vuotta sitten svg-fonts.js 77628cf8bf first comm 2 vuotta sitten svg-fragment.js 77628cf8bf first comm 2 vuotta sitten svg-html.js 77628cf8bf first comm 2 vuotta sitten svg-html5.js 77628cf8bf first comm 2 vuotta sitten svg-img.js 77628cf8bf first comm 2 vuotta sitten svg-smil.js 77628cf8bf first comm 2 vuotta sitten svg.js 77628cf8bf first comm 2 vuotta sitten sxg.js 77628cf8bf first comm 2 vuotta sitten tabindex-attr.js 77628cf8bf first comm 2 vuotta sitten template-literals.js 77628cf8bf first comm 2 vuotta sitten template.js 77628cf8bf first comm 2 vuotta sitten temporal.js 77628cf8bf first comm 2 vuotta sitten testfeat.js 77628cf8bf first comm 2 vuotta sitten text-decoration.js 77628cf8bf first comm 2 vuotta sitten text-emphasis.js 77628cf8bf first comm 2 vuotta sitten text-overflow.js 77628cf8bf first comm 2 vuotta sitten text-size-adjust.js 77628cf8bf first comm 2 vuotta sitten text-stroke.js 77628cf8bf first comm 2 vuotta sitten textcontent.js 77628cf8bf first comm 2 vuotta sitten textencoder.js 77628cf8bf first comm 2 vuotta sitten tls1-1.js 77628cf8bf first comm 2 vuotta sitten tls1-2.js 77628cf8bf first comm 2 vuotta sitten tls1-3.js 77628cf8bf first comm 2 vuotta sitten touch.js 77628cf8bf first comm 2 vuotta sitten transforms2d.js 77628cf8bf first comm 2 vuotta sitten transforms3d.js 77628cf8bf first comm 2 vuotta sitten trusted-types.js 77628cf8bf first comm 2 vuotta sitten ttf.js 77628cf8bf first comm 2 vuotta sitten typedarrays.js 77628cf8bf first comm 2 vuotta sitten u2f.js 77628cf8bf first comm 2 vuotta sitten unhandledrejection.js 77628cf8bf first comm 2 vuotta sitten upgradeinsecurerequests.js 77628cf8bf first comm 2 vuotta sitten url-scroll-to-text-fragment.js 77628cf8bf first comm 2 vuotta sitten url.js 77628cf8bf first comm 2 vuotta sitten urlsearchparams.js 77628cf8bf first comm 2 vuotta sitten use-strict.js 77628cf8bf first comm 2 vuotta sitten user-select-none.js 77628cf8bf first comm 2 vuotta sitten user-timing.js 77628cf8bf first comm 2 vuotta sitten variable-fonts.js 77628cf8bf first comm 2 vuotta sitten vector-effect.js 77628cf8bf first comm 2 vuotta sitten vibration.js 77628cf8bf first comm 2 vuotta sitten video.js 77628cf8bf first comm 2 vuotta sitten videotracks.js 77628cf8bf first comm 2 vuotta sitten viewport-unit-variants.js 77628cf8bf first comm 2 vuotta sitten viewport-units.js 77628cf8bf first comm 2 vuotta sitten wai-aria.js 77628cf8bf first comm 2 vuotta sitten wake-lock.js 77628cf8bf first comm 2 vuotta sitten wasm.js 77628cf8bf first comm 2 vuotta sitten wav.js 77628cf8bf first comm 2 vuotta sitten wbr-element.js 77628cf8bf first comm 2 vuotta sitten web-animation.js 77628cf8bf first comm 2 vuotta sitten web-app-manifest.js 77628cf8bf first comm 2 vuotta sitten web-bluetooth.js 77628cf8bf first comm 2 vuotta sitten web-serial.js 77628cf8bf first comm 2 vuotta sitten web-share.js 77628cf8bf first comm 2 vuotta sitten webauthn.js 77628cf8bf first comm 2 vuotta sitten webcodecs.js 77628cf8bf first comm 2 vuotta sitten webgl.js 77628cf8bf first comm 2 vuotta sitten webgl2.js 77628cf8bf first comm 2 vuotta sitten webgpu.js 77628cf8bf first comm 2 vuotta sitten webhid.js 77628cf8bf first comm 2 vuotta sitten webkit-user-drag.js 77628cf8bf first comm 2 vuotta sitten webm.js 77628cf8bf first comm 2 vuotta sitten webnfc.js 77628cf8bf first comm 2 vuotta sitten webp.js 77628cf8bf first comm 2 vuotta sitten websockets.js 77628cf8bf first comm 2 vuotta sitten webtransport.js 77628cf8bf first comm 2 vuotta sitten webusb.js 77628cf8bf first comm 2 vuotta sitten webvr.js 77628cf8bf first comm 2 vuotta sitten webvtt.js 77628cf8bf first comm 2 vuotta sitten webworkers.js 77628cf8bf first comm 2 vuotta sitten webxr.js 77628cf8bf first comm 2 vuotta sitten will-change.js 77628cf8bf first comm 2 vuotta sitten woff.js 77628cf8bf first comm 2 vuotta sitten woff2.js 77628cf8bf first comm 2 vuotta sitten word-break.js 77628cf8bf first comm 2 vuotta sitten wordwrap.js 77628cf8bf first comm 2 vuotta sitten x-doc-messaging.js 77628cf8bf first comm 2 vuotta sitten x-frame-options.js 77628cf8bf first comm 2 vuotta sitten xhr2.js 77628cf8bf first comm 2 vuotta sitten xhtml.js 77628cf8bf first comm 2 vuotta sitten xhtmlsmil.js 77628cf8bf first comm 2 vuotta sitten xml-serializer.js 77628cf8bf first comm 2 vuotta sitten tum/coi - Gogs: Simplico Git Service

Keine Beschreibung

dailyreport.py 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. from openpyxl import load_workbook
  2. import pyodbc
  3. import time
  4. import sys
  5. from pprint import pprint
  6. import datetime
  7. from openpyxl.styles import NamedStyle, Font
  8. from copy import deepcopy
  9. from openpyxl.chart import LineChart, Reference, Series
  10. from openpyxl.chart.text import RichText
  11. from openpyxl.drawing.text import RichTextProperties,Paragraph,ParagraphProperties, CharacterProperties
  12. # Specifying the ODBC driver, server name, database, etc. directly
  13. #cnxn = None
  14. #cursor = None
  15. '''cursor.execute('select * from data_wb')
  16. rows = cursor.fetchall()
  17. for row in rows:
  18. print(row)'''
  19. wb = load_workbook(filename = './dctemplate2.xlsx')
  20. #wb.save(filename = './createfrompy.xlsx');
  21. def findCustomer(code):
  22. global cursor
  23. global env
  24. tempResult = []
  25. views = []
  26. if env == "prod":
  27. views = ["bel_master_view", "e_master_view", "mg_master_view", "v_master_view"]
  28. else:
  29. views = ["bel_master_view_dev", "e_master_view_dev", "mg_master_view_dev", "v_master_view_dev"]
  30. ts = []
  31. select = "distinct MI24 as unbStd, PRO1C as customer, cast(PRO8 as varchar) + ' ' + cast(PRO9 as varchar) + cast(PRO10 as varchar) + 'x' + cast(PRO11 as varchar ) + 'x' + cast(PRO12 as varchar) as sizestring, cast(PRO13 as varchar) + ' ' + cast(PRO14 as varchar) + ' ' + cast(PRO15 as varchar) + ' ' + cast(PRO16 as varchar) + ' ' + cast(PRO17 as varchar) + ' ' + cast(PRO18 as varchar) as spec"
  32. where = "PRO1 = '{0}'".format(code)
  33. for v in views:
  34. sqlQuery = "select {0} from {1} where {2}".format(select, v, where)
  35. ts.append(sqlQuery)
  36. merged = []
  37. for t in ts:
  38. merged += cursor.execute(t)
  39. return merged
  40. def findInMasterView(select, where):
  41. global cursor
  42. global env
  43. tempResult = []
  44. views = []
  45. if env == "prod":
  46. views = ["bel_master_view", "e_master_view", "mg_master_view", "v_master_view"]
  47. else:
  48. views = ["bel_master_view_dev", "e_master_view_dev", "mg_master_view_dev", "v_master_view_dev"]
  49. ts = []
  50. for v in views:
  51. sqlQuery = "select {0} from {1} where {2}".format(select, v, where)
  52. ts.append(sqlQuery);
  53. qj = ';'.join(ts)
  54. #print(qj)
  55. merged = []
  56. for t in ts:
  57. merged += cursor.execute(t)
  58. return merged
  59. def updateLength(lotno):
  60. global cursor
  61. global wb
  62. q = "select * from data_wb where lot_no = '{0}' and judgement='OK' order by row_no asc".format(lotno)
  63. #print(q);
  64. return cursor.execute(q)
  65. def updateUb(lotno):
  66. global cursor
  67. global wb
  68. q = "select * from data_wb where lot_no = '{0}' and judgement='NG' order by row_no asc".format(lotno)
  69. #print(q);
  70. return cursor.execute(q)
  71. def getMachineName(machineId):
  72. global cursor
  73. q = "select * from machines_wb where id = {0}".format(machineId)
  74. #print(q)
  75. cursor.execute(q)
  76. rs = cursor.fetchall()
  77. return rs[0].name
  78. def getMachineDetail(machineId):
  79. global cursor
  80. q = "select * from machines_wb where id = {0}".format(machineId)
  81. #print(q)
  82. cursor.execute(q)
  83. rs = cursor.fetchall()
  84. return rs[0]
  85. def createDayChart(chartTitle):
  86. global wb
  87. ws = wb['Chart']
  88. wsd = wb['Daily Check']
  89. c1 = LineChart()
  90. c1.legend.position = "t";
  91. c1.title = chartTitle
  92. c1.title.font = Font(underline=Font.UNDERLINE_SINGLE)
  93. c1.y_axis.title = "Std. Weight(g)"
  94. c1.y_axis.number_format = "#,##0.00"
  95. c1.x_axis.title = "Date"
  96. c1.width = 30
  97. c1.height = 10
  98. #print(len(values))
  99. MINDATACOL = 2
  100. MAXDATACOL = 2 + 31
  101. lt = Reference(wsd, min_col=3, max_col=33, min_row=5, max_row=5)
  102. std = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=6, max_row=6)
  103. data = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=10, max_row=10)
  104. maxUB = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=15, max_row=15)
  105. minUB = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=21, max_row=21)
  106. avgUB = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=26, max_row=26)
  107. vsStd = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=32, max_row=32)
  108. vsStd2 = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=37, max_row=37)
  109. c1.add_data(data, from_rows=True, titles_from_data=True)
  110. c1.add_data(maxUB, from_rows=True, titles_from_data=True)
  111. c1.add_data(minUB, from_rows=True, titles_from_data=True)
  112. c1.add_data(avgUB, from_rows=True, titles_from_data=True)
  113. c1.add_data(vsStd, from_rows=True, titles_from_data=True)
  114. c1.add_data(vsStd2, from_rows=True, titles_from_data=True)
  115. c1.add_data(std, from_rows=True, titles_from_data=True)
  116. s1 = c1.series[0]
  117. s1.marker.symbol = "triangle"
  118. s1.graphicalProperties.line.noFill = True
  119. s1 = c1.series[1]
  120. s1.marker.symbol = "circle"
  121. s1.graphicalProperties.line.noFill = True
  122. s1 = c1.series[2]
  123. s1.marker.symbol = "square"
  124. s1.graphicalProperties.line.noFill = True
  125. s1 = c1.series[3]
  126. s1.marker.symbol = "auto"
  127. s1.graphicalProperties.line.noFill = True
  128. s1 = c1.series[4]
  129. s1.marker.symbol = "diamond"
  130. s1.graphicalProperties.line.noFill = True
  131. s1 = c1.series[5]
  132. s1.marker.symbol = "auto"
  133. s1.graphicalProperties.line.noFill = True
  134. s1 = c1.series[6]
  135. #s1.marker.symbol = "diamond"
  136. #s1.graphicalProperties.line.noFill = True
  137. c1.set_categories(lt)
  138. '''c1.x_axis.txPr = RichText(bodyPr=RichTextProperties(anchor="ctr",anchorCtr="1",rot="-2700000",
  139. spcFirstLastPara="1",vertOverflow="ellipsis",wrap="square"),
  140. p=[Paragraph(pPr=ParagraphProperties(defRPr=CharacterProperties()), endParaRPr=CharacterProperties())])'''
  141. ws.add_chart(c1, "b3")
  142. #pass
  143. def createNightChart(chartTitle):
  144. global wb
  145. ws = wb['Chart']
  146. wsd = wb['Daily Check']
  147. c1 = LineChart()
  148. c1.legend.position = "t";
  149. c1.title = chartTitle
  150. c1.title.font = Font(underline=Font.UNDERLINE_SINGLE)
  151. c1.y_axis.title = "Std. Weight(g)"
  152. c1.y_axis.number_format = "#,##0.00"
  153. c1.x_axis.title = "Date"
  154. c1.width = 30
  155. c1.height = 10
  156. #print(len(values))
  157. MINDATACOL = 2
  158. MAXDATACOL = 2 + 31
  159. lt = Reference(wsd, min_col=3, max_col=33, min_row=5, max_row=5)
  160. std = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=6, max_row=6)
  161. #begin data
  162. data = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=51, max_row=51)
  163. maxUB = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=56, max_row=56)
  164. minUB = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=62, max_row=62)
  165. avgUB = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=67, max_row=67)
  166. vsStd = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=73, max_row=73)
  167. vsStd2 = Reference(wsd, min_col=MINDATACOL, max_col=MAXDATACOL, min_row=78, max_row=78)
  168. c1.add_data(data, from_rows=True, titles_from_data=True)
  169. c1.add_data(maxUB, from_rows=True, titles_from_data=True)
  170. c1.add_data(minUB, from_rows=True, titles_from_data=True)
  171. c1.add_data(avgUB, from_rows=True, titles_from_data=True)
  172. c1.add_data(vsStd, from_rows=True, titles_from_data=True)
  173. c1.add_data(vsStd2, from_rows=True, titles_from_data=True)
  174. c1.add_data(std, from_rows=True, titles_from_data=True)
  175. s1 = c1.series[0]
  176. s1.marker.symbol = "triangle"
  177. s1.graphicalProperties.line.noFill = True
  178. s1 = c1.series[1]
  179. s1.marker.symbol = "circle"
  180. s1.graphicalProperties.line.noFill = True
  181. s1 = c1.series[2]
  182. s1.marker.symbol = "square"
  183. s1.graphicalProperties.line.noFill = True
  184. s1 = c1.series[3]
  185. s1.marker.symbol = "auto"
  186. s1.graphicalProperties.line.noFill = True
  187. s1 = c1.series[4]
  188. s1.marker.symbol = "diamond"
  189. s1.graphicalProperties.line.noFill = True
  190. s1 = c1.series[5]
  191. s1.marker.symbol = "auto"
  192. s1.graphicalProperties.line.noFill = True
  193. s1 = c1.series[6]
  194. #s1.marker.symbol = "diamond"
  195. #s1.graphicalProperties.line.noFill = True
  196. c1.set_categories(lt)
  197. '''c1.x_axis.txPr = RichText(bodyPr=RichTextProperties(anchor="ctr",anchorCtr="1",rot="-2700000",
  198. spcFirstLastPara="1",vertOverflow="ellipsis",wrap="square"),
  199. p=[Paragraph(pPr=ParagraphProperties(defRPr=CharacterProperties()), endParaRPr=CharacterProperties())])'''
  200. ws.add_chart(c1, "b22")
  201. def createExcel(codeno, filters):
  202. global cursor
  203. global wb
  204. ws = wb["Daily Check"]
  205. machineName = getMachineName(codeno)
  206. machineDetail = getMachineDetail(codeno)
  207. ws["C2"].value = machineName
  208. ws["C3"].value = filters.replace("created_at between", "").replace("and", "to").replace("'", "")
  209. ws["C43"].value = machineName
  210. ws["C44"].value = filters.replace("created_at between", "").replace("and", "to").replace("'", "")
  211. ws["C4"].value = machineDetail.machineStd;
  212. if filters is not None:
  213. q = "select * from daily_checks_wb where machine_id = '{0}' and {1}".format(codeno, filters)
  214. else:
  215. q = "select * from daily_checks_wb where machine_id = '{0}'".format(codeno)
  216. #print(q)
  217. cursor.execute(q)
  218. rows = cursor.fetchall()
  219. #print(rows)
  220. a0740 = [];
  221. a1230 = []
  222. a1700 = []
  223. a0030 = []
  224. a1940 = []
  225. a0500 = []
  226. for i in range(31):
  227. a0740.append([])
  228. a1230.append([])
  229. a1700.append([])
  230. a0030.append([])
  231. a1940.append([])
  232. a0500.append([])
  233. for r in rows:
  234. i = r.created_at.day
  235. if r.shift == "07.40":
  236. a0740[i-1].append(r)
  237. if r.shift == "12.30":
  238. a1230[i-1].append(r)
  239. if r.shift == "17.00":
  240. #a1700.append(r)
  241. a1700[i-1].append(r)
  242. if r.shift == "00.30":
  243. a0030[i-1].append(r)
  244. if r.shift == "19.40":
  245. a1940[i-1].append(r)
  246. if r.shift == "05.00":
  247. a0500[i-1].append(r)
  248. #print(a0740)
  249. for idx, val in enumerate(a0740):
  250. j = 7
  251. k = 12
  252. users = []
  253. #print(val)
  254. ok = 0
  255. ng = 0
  256. for v in val:
  257. #print(j , idx + )
  258. #print(v.judgment)
  259. if v.judgement == "OK":
  260. ok += 1
  261. if ok > 3:
  262. continue
  263. ws.cell(row = j , column = idx + 3 , value = v.weight)
  264. j += 1
  265. if v.judgement == "NG":
  266. ng += 1
  267. if ng > 3:
  268. continue
  269. ws.cell(row = k , column = idx + 3 , value = v.weight)
  270. k += 1
  271. #print(v.empid)
  272. if v.empid not in users:
  273. #print("insert in users")
  274. users.append(v.empid)
  275. #print(val)
  276. if len(val) > 0:
  277. q = "select * from users where empid in ({0})".format(",".join("'{0}'".format(w) for w in users))
  278. #print(q)
  279. cursor.execute(q)
  280. us = cursor.fetchall()
  281. names = [x.fname + " " + x.lname for x in us]
  282. ws.cell(row = 17, column = idx + 3, value = ",".join(names))
  283. for idx, val in enumerate(a1230):
  284. j = 18
  285. k = 23
  286. users = []
  287. ok = ng = 0
  288. for v in val:
  289. #print(j , idx)
  290. if v.judgement == "OK":
  291. ok += 1
  292. if ok > 3:
  293. continue
  294. ws.cell(row = j , column = idx + 3 , value = v.weight)
  295. j += 1
  296. if v.judgement == "NG":
  297. ng += 1
  298. if ng > 3:
  299. continue
  300. ws.cell(row = k , column = idx + 3 , value = v.weight)
  301. k += 1
  302. if v.empid not in users:
  303. users.append(v.empid)
  304. if len(val) > 0:
  305. q = "select * from users where empid in ({0})".format(",".join("'{0}'".format(w) for w in users))
  306. #print(q)
  307. cursor.execute(q)
  308. us = cursor.fetchall()
  309. names = [x.fname + " " + x.lname for x in us]
  310. ws.cell(row = 28, column = idx + 3, value = ",".join(names))
  311. for idx, val in enumerate(a1700):
  312. j = 29
  313. k = 34
  314. users = []
  315. ok = ng = 0
  316. for v in val:
  317. #print(j , idx)
  318. if v.judgement == "OK":
  319. ok += 1
  320. if ok > 3:
  321. continue
  322. ws.cell(row = j , column = idx + 3 , value = v.weight)
  323. j += 1
  324. if v.judgement == "NG":
  325. ng += 1
  326. if ng > 3:
  327. continue
  328. ws.cell(row = k , column = idx + 3 , value = v.weight)
  329. k += 1
  330. if v.empid not in users:
  331. users.append(v.empid)
  332. if len(val) > 0:
  333. q = "select * from users where empid in ({0})".format(",".join("'{0}'".format(w) for w in users))
  334. #print(q)
  335. cursor.execute(q)
  336. us = cursor.fetchall()
  337. names = [x.fname + " " + x.lname for x in us]
  338. ws.cell(row = 39, column = idx + 3, value = ",".join(names))
  339. for idx, val in enumerate(a1940):
  340. j = 47
  341. k = 53
  342. users = []
  343. ok = ng = 0
  344. for v in val:
  345. #print(j , idx)
  346. if v.judgement == "OK":
  347. ok += 1
  348. if ok > 3:
  349. continue
  350. ws.cell(row = j , column = idx + 3 , value = v.weight)
  351. j += 1
  352. if v.judgement == "NG":
  353. ng += 1
  354. if ng > 3:
  355. continue
  356. ws.cell(row = k , column = idx + 3 , value = v.weight)
  357. k += 1
  358. if v.empid not in users:
  359. users.append(v.empid)
  360. if len(val) > 0:
  361. q = "select * from users where empid in ({0})".format(",".join("'{0}'".format(w) for w in users))
  362. #print(q)
  363. cursor.execute(q)
  364. us = cursor.fetchall()
  365. names = [x.fname + " " + x.lname for x in us]
  366. ws.cell(row = 58, column = idx + 3, value = ",".join(names))
  367. for idx, val in enumerate(a0030):
  368. j = 59
  369. k = 64
  370. users = []
  371. ok = ng = 0
  372. for v in val:
  373. #print(j , idx)
  374. if v.judgement == "OK":
  375. ok += 1
  376. if ok > 3:
  377. continue
  378. ws.cell(row = j , column = idx + 3 , value = v.weight)
  379. j += 1
  380. if v.judgement == "NG":
  381. ng += 1
  382. if ng > 3:
  383. continue
  384. ws.cell(row = k , column = idx + 3 , value = v.weight)
  385. k += 1
  386. if v.empid not in users:
  387. users.append(v.empid)
  388. if len(val) > 0:
  389. q = "select * from users where empid in ({0})".format(",".join("'{0}'".format(w) for w in users))
  390. #print(q)
  391. cursor.execute(q)
  392. us = cursor.fetchall()
  393. names = [x.fname + " " + x.lname for x in us]
  394. ws.cell(row = 69, column = idx + 3, value = ",".join(names))
  395. for idx, val in enumerate(a0500):
  396. j = 70
  397. k = 75
  398. users = []
  399. ok = ng = 0
  400. for v in val:
  401. #print(j , idx)
  402. if v.judgement == "OK":
  403. ok += 1
  404. if ok > 3:
  405. continue
  406. ws.cell(row = j , column = idx + 3 , value = v.weight)
  407. j += 1
  408. if v.judgement == "NG":
  409. ng += 1
  410. if ng > 3:
  411. continue
  412. ws.cell(row = k , column = idx + 3 , value = v.weight)
  413. k += 1
  414. if v.empid not in users:
  415. users.append(v.empid)
  416. if len(val) > 0:
  417. q = "select * from users where empid in ({0})".format(",".join("'{0}'".format(w) for w in users))
  418. #print(q)
  419. cursor.execute(q)
  420. us = cursor.fetchall()
  421. names = [x.fname + " " + x.lname for x in us]
  422. ws.cell(row = 80, column = idx + 3, value = ",".join(names))
  423. createDayChart("Daily Check of Day Shift ({0})".format(machineName))
  424. createNightChart("Daily Check of Night Shift ({0})".format(machineName))
  425. ut = int(time.time())
  426. filename = "dc{0}.xlsx".format(str(ut))
  427. outfile = './public/excel/'+filename
  428. wb.save(filename = outfile)
  429. print(filename)
  430. if __name__ == "__main__":
  431. env = sys.argv[1]
  432. machine = sys.argv[2]
  433. #print(len(sys.argv))
  434. df = None
  435. if len(sys.argv) == 4:
  436. filter = sys.argv[3]
  437. #import ast
  438. #df = ast.literal_eval(filter)
  439. #print(df['date'])
  440. df = filter
  441. global cnxn
  442. global cursor
  443. if env == "prod":
  444. cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=192.168.0.253;DATABASE=OB2011DB;UID=user1;PWD=1234')
  445. cursor = cnxn.cursor()
  446. else:
  447. cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;DATABASE=OB2011DB;UID=admin;PWD=1234')
  448. cursor = cnxn.cursor()
  449. #print("code is "+code)
  450. createExcel(machine, df)